
function hideAll() { }

function showHide(link, elementid)
{
  var e = document.getElementById(elementid);

  e.style.display = e.style.display == 'none' ? 'block' : 'none';
  ToggleSession(link, elementid, e.style.display);
}

function expandAll(link)
{

  var x = document.getElementsByClassName('node');
  var len = x.length;

  for(i = 0; i < len; i++)
  {
    x[i].style.display = 'block';
    ToggleSession(link, x[i].id, x[i].style.display);
  }
}

function colapseAll(link)
{
  var x = document.getElementsByClassName('node');
  var len = x.length;

  for(i = 0; i < len; i++)
  {
    x[i].style.display = 'none';
    ToggleSession(link, x[i].id, x[i].style.display);
  }
}


function ToggleSession(link, id, display)
{
  var pieces = id.split('_');
  new Ajax.Request(link,
    {
      method: 'post',
      parameters: {
        'category_id': pieces[1],
        'attribute': display == 'none' ? 'off' : 'on'
      }
    }
  );
}


function setPerPage(usersPerPage){
  usersPerPage = usersPerPage.value;
  var strHref = window.location.href;

  if(strHref.match(/perPage/g)){
    newPerPage = "perPage=" + usersPerPage
    newUrl = strHref.replace(/perPage=[0-9al]+/g, newPerPage)
  }
  else{
    if(window.location.search){
      newUrl = strHref + "&perPage=" + usersPerPage
    }
    else{
      newUrl = strHref + "?perPage=" + usersPerPage
    }
  }

  newUrl = newUrl.replace(/page=[0-9]+/, "page=0")
  
  window.location = newUrl;

  return unescape(strHref);
}

function groupFilter(combobox){
  var usersPerPage = combobox.value;
  var strHref = window.location.href;

  if(strHref.match(/grupo_id/g)){
    newPerPage = "grupo_id=" + usersPerPage
    newUrl = strHref.replace(/grupo_id=[0-9al]+/g, newPerPage)
  }
  else{
    if(window.location.search){
      newUrl = strHref + "&grupo_id=" + usersPerPage
    }
    else{
      newUrl = strHref + "?grupo_id=" + usersPerPage
    }
  }

  newUrl = newUrl.replace(/page=[0-9]+/, "page=0")
  
  window.location = newUrl;

  return unescape(strHref);
}

function Point(_x, _y)
{
	this.x = _x;
	this.y = _y;
}

function orientation(a, b, c)
{
	  var v = (b.x -a.x)*(c.y-b.y) - (b.y-a.y)*(c.x-b.x);
	  if (v == 0) return 0;
	  return v < 0 ? -1 : 1;
}

function is_inside(points, middle, test, o)
{
        var n = points.length;
        return orientation(points[(middle-1+n)%n], points[middle], points[test]) == o &&
                orientation(points[middle], points[(middle+1)%n], points[test]) == o &&
                orientation(points[(middle+1)%n], points[(middle-1+n)%n], points[test]) == o;
}

/* array of (x,y) pairs */

function triangulate(points)
{
        var n = points.length;

        if (n == 3)
                return [[points[0], points[1], points[2]]];

        var start = 0;
        for (var i = 0; i < n; i++)
                if (points[i].x < points[start].x || (points[i].x == points[start].x && points[i].y < points[start].y))
                        start = i;

        var inside = orientation(points[(start-1+n)%n], points[start], points[(start+1+n)%n]);

        for (var i = 0; i < n; i++)
        {
                var curr = (start+i+n)%n;
                var o = orientation(points[(curr-1+n)%n], points[curr], points[(curr+1)%n]);
                if (o == inside)
                {
                        var valid = true;
                        for (var j = 0; j < n && valid; j++)
                                if (is_inside(points, curr, j, o))
                                        valid = false;
                        if (valid)
                        {
                                var t = [[points[(curr-1+n)%n], points[curr], points[(curr+1)%n]]];
                                points.splice(curr, 1);
                                return triangulate(points).concat(t);
                        }
                }
        }

        return new Array();
}

/*var p = [
new Point(121, 246),
new Point(143, 70),
new Point(487, 85),
new Point(445, 294),
new Point(277, 290),
new Point(286, 235),
new Point(397, 247),
new Point(424, 118),
new Point(191, 116),
new Point(159, 269)
];

var m = triangulate(p);

for (var i = 0; i < m.length; i++)
	printPoints(m[i]);
*/

var drag;
var click;
var map;
var marker;
var points = [];
var point = null;
var polyline = null;
var polygon = null;
var canDraw = true;


function setHiddenField()
{
  var str_points = '';
  for (var i=0; i<points.length; i++)
  {
    str_points = str_points + points[i].x.toString() + ',' + points[i].y.toString();
    if (i != points.length - 1)
     str_points = str_points + ';';
  }
  document.getElementById('projectos_projecto_polygon').value=str_points;
}

function goToMap(lat_, lon_)
{
  var lat = lat_ != undefined ? lat_ : 41.178;
  var lon = lon_ != undefined ? lon_ : -8.596;
  try
  { 
    var georef = document.getElementById('projectos_projecto_coordenadas').value;
    var splitters = [" , ", ", ", " ,", ","];
    var coordenadas;
    for (var i=0; i<splitters.length; i++)
    {
      coordenadas=georef.split(splitters[i]);
      if (coordenadas.length == 2)
        break;
    }
    var lat = parseFloat(coordenadas[0])? parseFloat(coordenadas[0]) : 41.178;
    var lon = parseFloat(coordenadas[1])? parseFloat(coordenadas[1]) : -8.596;
  }
  catch (e) { }

 
  var center = new GLatLng(lat, lon);
  map.setCenter(center);
  marker.setPoint(center);
  map.addOverlay(marker);
}

function setPoints(poly)
{
  var _point;
  var _points = poly.split(";");
  for (var i=0; i<_points.length; i++)
  {
    _point = _points[i].split(",");
    points.push(new GPoint(parseFloat(_point[0]), parseFloat(_point[1])));
  }
  drawPolygon();
}

function drawPoint()
{
  var blueIcon = new GIcon(G_DEFAULT_ICON);
  blueIcon.image = "http://ni.fe.up.pt/~ccre/img/blue-dot.png";
  blueIcon.iconSize = new GSize(10, 10);
  blueIcon.shadowSize = new GSize(0, 0);
  blueIcon.iconAnchor = new GPoint(5, 5);

  markerOptions = { icon:blueIcon };

  point = new GMarker(points[points.length-1], markerOptions);
  map.addOverlay(point);
}

function segments_intersect(a, b, c, d) /* a->b vs c->d */
{
  var x = orientation(a, b, c) * orientation(a, b, d);
  var y = orientation(c, d, a) * orientation(c, d, b);
  return x < 0 && y < 0;
}

function intersect(p)
{
  for (var i = 1; i < points.length; i++)
    if (segments_intersect(points[i-1], points[i], points[points.length-1], p))
      return true;
  
  return false;
}

function drawPolyline()
{
  if (points.length == 1)
    drawPoint();
  else
  {
    if (point != null)
      map.removeOverlay(point);
    if (polyline != null)
      map.removeOverlay(polyline);
    polyline = new GPolyline(points, "#0392af", 5);
    map.addOverlay(polyline);
  }
}

function dist(a, b)
{
	return Math.sqrt(Math.pow(a.x-b.x, 2)+Math.pow(a.y-b.y, 2));
}


function PixeruToRatRng(p)
{
  var b = map.getBounds();
  var geoHeight = Math.abs(b.getSouthWest().lat() - b.getNorthEast().lat());
  var geoWidth  = Math.abs(b.getSouthWest().lng() - b.getNorthEast().lng());

  var pixHeight = document.getElementById('map').offsetHeight;
  var pixWidth  = document.getElementById('map').offsetWidth;

  var ratHeight = p.y * geoHeight / pixHeight + b.getSouthWest().lat();
  var ratWidth  = p.x *  geoWidth /  pixWidth + b.getSouthWest().lng();
  return new GPoint(ratWidth, ratHeight);
}

function RatRngToPixeru(p)
{
  var b = map.getBounds();
  var geoHeight = Math.abs(b.getSouthWest().lat() - b.getNorthEast().lat());
  var geoWidth  = Math.abs(b.getSouthWest().lng() - b.getNorthEast().lng());

  var pixHeight = document.getElementById('map').offsetHeight;
  var pixWidth  = document.getElementById('map').offsetWidth;

  var ratHeight = (p.y - b.getSouthWest().lat()) * pixHeight / geoHeight;
  var ratWidth = (p.x - b.getSouthWest().lng()) * pixWidth / geoWidth;
  return new GPoint(ratWidth, ratHeight);
}


function closedPolygon()
{
  var n = points.length-1;
  var d = dist(RatRngToPixeru(points[0]), RatRngToPixeru(points[n]));
  return d < 10;
}

function drawPolygon()
{
  var pixPoints = new Array();
  for (var i = 0; i < points.length; i++)
    pixPoints.push(new RatRngToPixeru(points[i]));

  var triangles = triangulate(pixPoints);
  map.clearOverlays();
  for (var i = 0; i < triangles.length; i++)
  {
    for (var j = 0; j < triangles[i].length; j++)
      triangles[i][j] = PixeruToRatRng(triangles[i][j]);

    var polygon = new GPolygon(triangles[i], "#000000", 0, 0, "#0392af", 0.5);
    map.addOverlay(polygon);
  }
  /* map.clearOverlays(); */

  /* var polygon = XPolygon(points); */
  /* map.addOverlay(polygon); */
  map.addOverlay(marker);

  setHiddenField();
  canDraw = false;
}



function load(lat, lon, l_id, tipo, zoom)
{
  if (GBrowserIsCompatible())
  {
    function Limpar() { }
    Limpar.prototype = new GControl();

    Limpar.prototype.initialize = function(map) {
      var container = document.createElement("div");

      var limparDiv = document.createElement("div");
      this.setButtonStyle_(limparDiv);
      container.appendChild(limparDiv);
      limparDiv.appendChild(document.createTextNode("Limpar"));
      GEvent.addDomListener(limparDiv, "click", function() {
        points.length = 0;
        map.clearOverlays();
        map.addOverlay(marker);
        canDraw = true;
      });

      map.getContainer().appendChild(container);
      return container;
    }

    Limpar.prototype.getDefaultPosition = function() {
      return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(280, 7));
    }

    Limpar.prototype.setButtonStyle_ = function(button) {
      button.style.textDecoration = "none";
      button.style.color = "#0392af";
      button.style.backgroundColor = "#fff";
      button.style.font = "small Arial";
      button.style.borderStyle = "inset";
      button.style.borderWidth = "1px";
      button.style.borderColor = "black";
      button.style.padding = "0px 0px 3px 0px";
      button.style.textAlign = "center";
      button.style.width = "4em";
      button.style.height = "13px";
      button.style.cursor = "pointer";
    }

    map = new GMap2(document.getElementById("map"));
    if (tipo == 'create' || tipo == 'edit')
      map.addControl(new Limpar());

    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.addMapType(G_PHYSICAL_MAP);

    var center = new GLatLng(lat, lon);
    map.setCenter(center, zoom);
    
    if (tipo == 'show')
    {
      drag = false;
      poly = document.getElementById('projectos_projecto_polygon').innerHTML;
      map.setMapType(G_SATELLITE_MAP);
    }
    else
    {
      drag = true;
      poly = document.getElementById('projectos_projecto_polygon').value;
    }

    marker = new GMarker(center, {draggable: drag});
    goToMap(lat, lon);

    if (poly!='' && !points.length)
    {
      setPoints(poly);
    }


    GEvent.addListener(marker, "dragstart",
      function()
      {
        /* map.closeInfoWindow(); */
      }
    );

    GEvent.addListener(marker, "dragend",
      function()
      {
        var latitude = marker.getPoint().lat().toString();
        var lat_start = latitude.indexOf('.');
        latitude = latitude.substr(0, lat_start+7);
        alert(latitude);
        var longitude = marker.getPoint().lng().toString();
        var lon_start = longitude.indexOf('.');
        longitude = longitude.substr(0, lon_start+7);
        document.getElementById("projectos_projecto_coordenadas").value = latitude+', '+longitude;

      }
    );

    GEvent.addListener(map, 'zoomend', function (oldLevel, newLevel) {
      document.getElementById('projectos_projecto_zoom').value = newLevel;
    });

    GEvent.addListener(map, 'click', function(overlay,point) {
      if (!drag || !point || !canDraw)
        return;
      if (!intersect(point))
      {
        points.push(new GPoint(point.x, point.y));
        drawPolyline();
      }
      if (points.length > 2 && closedPolygon())
      {
        points.pop();
        drawPolygon();
      }
    });
    /* map.addOverlay(marker); */
  }
}
function hover(what)
{
  what.setAttribute('src', what.src.replace(/.gif/, '_hover.gif'));
}

function unhover(what)
{
  what.setAttribute('src', what.src.replace(/_hover.gif/, '.gif'));
}

function removeDefaultMsg(field)
{
  if (field.value == '(máximo 400 carácteres)')
    field.value = '';
  if (field.value == '(entre 1 e 4 carácteres)')
    field.value = '';
}
function textLimit(field, maxlen)
{
  if (field.value.length > maxlen)
  {
    field.value = field.value.substring(0, maxlen);
    alert('O seu texto foi cortado para respeitar o limite de '+maxlen+' carácteres.');
  }
}
var counter = 0;
function popup(that, size, external)
{
  if (size == 'small')
    var wsize = 'height=600,width=800';
  else if (size == 'big')
    var wsize = 'height=600,width=900';
  else
  {
    var w = screen.width;
    var h = screen.height;
    var wsize = 'height='+h+',width='+w;
  }


  if(!e)
    var e = window.event;

  if (external == true)
    window.open(that.href, 'x' + counter);
  else
    window.open(that.href, 'x' + counter, wsize).moveTo(screen.width/2-400, screen.height/2-400);

  counter++;
  return false;
}

function popipo(that, width, height)
{
  window.open(that.href, 'x' + counter, 'height='+Math.min(height, 700)+',width='+Math.min(width, 950)+',scrollbars='+(height>700 || width>950)*1);
  counter++;
  return false;
}

function isFormField(element)
{
  return element.tagName == 'INPUT' ||
    element.tagName == 'SELECT' ||
    element.tagName == 'TEXTAREA';
}

function appendTabIndexes()
{
  allElements = document.getElementsByTagName('*');
  toAppend = [];
  for (var i = 0, index = 1; i<allElements.length; i++)
    if (isFormField(allElements[i]))
      allElements[i].tabIndex = index++;
 
  if (document.getElementById('Noticia_container'))
    document.getElementById('Noticia_container').style.overflow = 'hidden';

  if (document.getElementById('Main_news_list'))
    window.setTimeout("slide('Main_news_list');", 2000);

}

function ShowFields(element)
{
  var paragraph = document.getElementById('searchFields');

  var parts = element.id.split('_');
  document.getElementById('pesquisa_campos_' + parts[2]).style.display = element.checked == true ? 'inline' : 'none';

  var visible = 0;
  for (var i = 0; i < paragraph.childNodes.length; i++)
    if (paragraph.childNodes[i].tagName != undefined)
      if (paragraph.childNodes[i].tagName.toLowerCase() == 'span')
        if (paragraph.childNodes[i].style.display != 'none')
          visible++;

  paragraph.style.display = visible == 0 ? 'none' : 'block';
}


var evt = 0;
function moveId(id, dx, dy, recurring, delta, duration)
{
  if (typeof(recurring) == 'undefined') recurring = false;
  if (typeof(delta) == 'undefined') delta = 1.0;
  if (typeof(duration) == 'undefined') duration = 1.0;

  var p = document.getElementById(id).parentNode;
  var ph = Element.getHeight(p);

  var x = dx*delta;
  var y = dy*delta;

  e = document.getElementById(id);
  p = e.parentNode;

  evt = new Effect.Move(id, {
    x: x,
    y: y,
    transition: Effect.Transitions.linear,
    duration: duration,
    afterFinish: recurring ? function(e) { slide(id, delta == 1 ? -1 : 1); } : null
  });
}

function slide(id, delta)
{
  if (typeof(delta) == 'undefined') delta = -1;

  e = document.getElementById(id);
  if (e == null)
    return;

  w = Element.getWidth(e) - Element.getWidth(e.parentNode);
  moveId(id, w, 0, true, delta, 3.0*w/180);
}

function slideStart()
{
      if (evt)
        evt.unpause();
}

function slideStop()
{
  if (evt)
    evt.pause();
}

function galleryshow(id)
{
  if (e = document.getElementById('memoria')) e.style.display = 'none';
  if (e = document.getElementById('sinopse')) e.style.display = 'none';
  if (e = document.getElementById('curadoria')) e.style.display = 'none';
  if (e = document.getElementById('cover')) e.style.display = 'none';

  document.getElementById(id).style.display = 'block';
}

function blogExpand(id)
{
  element = document.getElementById(id);
  element.style.display = element.style.display == 'none' ? 'block' : 'none';
}

