/****************************************************************************
 * @file          layer.js
 *
 * @project       YAMI (Yet Another Mapping Interface)
 * @contributors  Rose Jackson, William Garrick, Eric Hanson, Morgan Harvey,
 *                Cristopher Holm, David Percy       
 * 
 * Copyright (c) 2006, Academic & Research Computing, Portland State 
 *                University, Portland Oregon.
 * 
 ***************************************************************************/
 
// layer object to hold the state of a given layer
function MapLayer() {
  this.name="";
  this.id="";
  this.isOn=true;
  this.isVisible=true;
  this.canToggleOnOff=true;
  this.group="";
  
  this.asHTML=function() {
    var html="";
    if (this.isVisible) {
      html+="<div id=\""+this.id+"\" style=\"display:block;\">\n";
      html+="<table class=\"layer\" border=\"0\"><tr>\n";
      html+="<td class=\"layer_input\">";
      if (this.canToggleOnOff) {
        html+="<input type=\"checkbox\"";
        if (this.isOn)
          html+=" checked=\"checked\"";
        html+=" id=\""+this.id+"_input\" onclick=\"panels.onLayerClick('"+this.id+"');\" />";
        html+="</td>\n<td>"
        html+="<label for=\""+this.id+"_input\">"+this.name+"</label>";
      } else {
        html+="&nbsp;</td>\n<td>"+this.name;
      }
      html+="</td></tr></table></div>\n";
    }
    return html;
  }
}

/*******************************************************************
* LayerState object
* keeps track of a groups / layers state, whether the groups are
* expanded, whether layers are turned on, whether their being turned
* on even matters (cause if their group is off it doesn't), etc.
* 
* the app uses two instances of this object, one for the current
* state, aka the state that generated the map on the screen, and 
* one for what layers have been turned off / on, pending a refresh.
* currentState gets over-written with pendingLayerState on a 
* map.redraw().
*
* layerGroups keeps track of what a layer's parent group id is:
* layerGroups[layer_id] = group_id
*******************************************************************/ 

function LayerState() {
  this.groups=new Array();
  this.group_layers=new Array();
  this.nongroup_layers=new Array();
  this.layersOn=new Array();
  this.layersVisible=new Array();
  this.layersTogglable=new Array();
  this.isInitialized=false;
  this.refreshLayers=false;
  
  this.init=function() {
    this.layerdiv=document.getElementById("groups");
  }
  
  this.addGroup=function(name) {
    this.groups.push(name);
    this.group_layers.push(new Array()); 
    return this.groups.length-1;
  }
  
  this.addLayer=function(name,group,on,visible,togglable) {
    if (group && group.length>0) {
      // find the group this layer is to be added to
      var gindex=this.group_index(group);
      if (gindex>=0) {
        if (!this.layerExists(name,this.group_layers[gindex])) {
          // layer doesn't exist yet
          lindex=this.group_layers[gindex].length;
          var layerObj=new MapLayer();
          layerObj.name=name;
          layerObj.id="layer_"+gindex+"_"+lindex;
          layerObj.group=group;
          layerObj.isOn=on;
          layerObj.isVisible=visible;
          layerObj.canToggleOnOff=togglable;
          this.group_layers[gindex].push(layerObj);
        }
      } else {
        // group doesn't exist yet
        var gindex=this.addGroup(group);
        lindex=0;
        var layerObj=new MapLayer();
        layerObj.name=name;
        layerObj.id="layer_"+gindex+"_"+lindex;
        layerObj.group=group;
        layerObj.isOn=on;
        layerObj.isVisible=visible;
        layerObj.canToggleOnOff=togglable;
        this.group_layers[gindex].push(layerObj);
      }
    } else {
      // no group, so add to nongroup layers
      if (!this.layerExists(name,this.nongroup_layers)) {
        lindex=this.nongroup_layers.length;
        var layerObj=new MapLayer();
        layerObj.name=name;
        layerObj.id="layer__"+lindex;
        layerObj.isOn=on;
        layerObj.isVisible=visible;
        layerObj.canToggleOnOff=togglable;
        this.nongroup_layers.push(layerObj);
      }
    }
  }
  
  this.getLayer=function(layer_id) {
    var temp=layer_id.split("_");
    var gindex=temp[1];
    var lindex=temp[2];
    if (gindex.length>0)
      var layerObj=this.group_layers[gindex][lindex];
    else
      var layerObj=this.nongroup_layers[lindex];
    return layerObj;
  }
  
  this.group_index=function(name) {
    for (var i=0;i<this.groups.length;++i) {
      if (name==this.groups[i]) return i;
    }
    return -1;
  }
  
  this.layerExists=function(name,in_array) {
    var layerObj;
    for (var i=0;i<in_array.length;++i) {
      layerObj=in_array[i];
      if (name==layerObj.name) return true;
    }
    return false;
  }
  
  this.layerName=function(layer_id) {
    var layerObj=this.getLayer(layer_id);
    return layerObj.name;
  }

  this.isOn=function(layer_id) {
    var layerObj=this.getLayer(layer_id);
    return layerObj.isOn;
  }

  this.isVisible=function(layer_id) {
    var layerObj=this.getLayer(layer_id);
    return layerObj.isVisible;
  }
  
  this.canToggleOnOff=function(layer_id) {
    var layerObj=this.getLayer(layer_id);
    return layerObj.canToggleOnOff;
  }

  this.queryString=function() {
    var layerQuery=new Array();
    var layerObj;
    var k=0;
    for (var i=0;i<this.group_layers.length;++i) {
      for (var j=0;j<this.group_layers[i].length;++j) {
        layerObj=this.group_layers[i][j];
        if (layerObj.isOn) {
          layerQuery.push("layers["+k+"]="+escape(layerObj.name));
          ++k;
        }
      }
    }
    for (i=0;i<this.nongroup_layers.length;++i) {
      layerObj=this.nongroup_layers[i];
      layerQuery.push("layers["+k+"]="+escape(layerObj.name));
      ++k;
    }
    return layerQuery.join("&");
  }
  
  this.drawLayers=function() {
    var html="";
    var this_group,layerObj,gid;
    for (var i=0;i<this.groups.length;++i) {
      gid="group_"+i;
      this_group="<fieldset><legend>";
      switch (this.groups[i].toLowerCase()) {
      case "overlays":
      this_group+="ADD <a class=\"light\" href=\"javascript:openpopup('p-overlay.html')\">" + this.groups[i].toUpperCase()+"</a> (optional)\n</legend>\n";
            break;
      case "basemaps":
      this_group+="ADD <a class=\"light\" href=\"javascript:openpopup('p-basemap.html')\">" + this.groups[i].toUpperCase()+"</a> (optional)\n</legend>\n";
      break;
      default:
      this_group+=this.groups[i]+"\n</legend>\n";
      }
      for (var j=0;j<this.group_layers[i].length;++j) {
        layerObj=this.group_layers[i][j];
        this_group+=layerObj.asHTML();
      }
      html+=this_group+"</fieldset><br/>";
    
    }
    this.layerdiv.innerHTML+=html;
  }
  
  this.removeLayers=function() {
    
  }
}
