<!--

var Ts = '';
var Map_script   = '/cgi-bin/map.pl?';
var XML_script   = '/cgi-bin/map_xml_data.pl?';
var p_XML_script = '/cgi-bin/pnt_xml_data.pl?';
var TSt_script   = '/cgi-bin/ts_table.pl?';
var XY_pnt_script= '/cgi-bin/gdal_xypoint.pl?';
var sym_script   = '/cgi-bin/check_sym.pl?sym=';
var ref_map_src  = '/images/explorer/world_elev_index_map.png';
var search_pass  = false;
var m_Data1,mapExtent;
var mx,my,wx,wy,bx,by;
var drop_margin  = 10;
var maskValue    = 0;
var stn_points   = new Array;
var pix_info,symObj;
var dateObj;

/////////////////////////////////////////////////////////////////
/*
*
*	Mouse Events Block
*
*/
/////////////////////////////////////////////////////////////////

var Map_coord,Map_size;

var Agent = navigator.userAgent.toLowerCase();
var Aname = navigator.appName.toLowerCase();
var Os = navigator.platform.toLowerCase();
var isWin = (Os.indexOf("win")!=-1);
var isMac = (Os.indexOf("mac")!=-1);
var isGec = (Agent.indexOf("gecko")!=-1);
var isExplorer = (Aname.indexOf("explorer")!=-1);
var Win = [0,0];
var Mac = (isMac && isExplorer) ? [9,14] : [0,0];
var isMacGec = (isMac && isGec);

/////////////////////////////////////////////////////////////////

function init()
{
  img_bg= document.images['map_bg'];
  img_wt= document.images['map_wait'];
  img_0 = document.images['map'];
  img_1 = document.images['reference_map'];

  div_0 = document.getElementById('map_layer');
  div_1 = document.getElementById('map_wait_layer');

  c_lon = document.getElementById('lon');
  c_lat = document.getElementById('lat');

  div_2 = document.getElementById('map_square_layer');
  if (isExplorer) div_2.style.filter="alpha(opacity=40)";
//  if (Aname == "konqueror") div_2.style.KhtmlOpacity='0.5';

  div_3 = document.getElementById('map_coords');

  m_Data1  = new dataObj('map_data1');			// Data object
  symObj   = new symbolObj('div_symbol_input');		// Calculator Symbol Input Object
  dateObj  = new tsNavObj();				// Map Dates Object

  for (var i=0; i<stn_set.length; i++) {
    stn_points[stn_set[i]] = new pointsObj(stn_set[i]);	// Point data object
  }

  var div_4 = document.getElementById('pix_cout_layer');
  pix_info = new pixInfoObj('pix_info_layer','pix_cout_layer',document.images['callout'],calloutImg);	// Pixel info object

  mapExtent= new extentObj(Map_extent_full,[img_0.width,img_0.height],Map_proj);
  Map_size = [img_0.width-1,img_0.height-1];

  Map_coord = find_xy(img_bg);
  Set_Map();

  img_0.onload     =map_loaded;
  div_2.onmousemove=Map_onmousemove;
  div_3.onmousemove=Map_onmousemove;
  div_4.onmousemove=Map_onmousemove;
  div_4.onmouseup  =Map_onclick;
  div_4.onmousedown=img_Down;
  div_0.onmouseover= function() {if (document.navigation.float_box.checked) div_3.style.visibility = "visible";};
  div_0.onmousemove=Map_onmousemove;
  div_0.onmouseout =Map_onmouseout;
  div_0.onmouseup  =Map_onclick;
  div_0.onmousedown=img_Down;
  document.body.onmousemove=no_Map;
  window.onresize=Map_onresize;

  for (var i=0; i<MapInfoLayers.length; i++) {
    eval("document.info_layers."+MapInfoLayers[i]+".checked = true");
  }

  var Args = parseArgs(document.URL);
  var mSize= new Array();
  for (var i=0; i<document.map_size.size.length; i++) {
    mSize[document.map_size.size.options[i].text.replace(/ /g,'')]=i;
  }

  if (Args['type']) Type = Args['type'];
  if (Args['date']) date = Args['date'];
  if (Args['extent']) mapExtent.extent = Args['extent'].split('_');
  if (Args['size']) document.map_size.size.selectedIndex = mSize[Args['size']];
  if (Args['towns']) document.info_layers.towns.checked = Number(Args['towns']) ? true : false;
  if (Args['roads']) document.info_layers.roads.checked = Number(Args['roads']) ? true : false;
  if (Args['lakes']) document.info_layers.lakes.checked = Number(Args['lakes']) ? true : false;
  if (Args['countries']) document.info_layers.countries.checked = Number(Args['countries']) ? true : false;
  if (Args['mask']) maskValue = Args['mask'];

  Loading = true;
  if (Args['resample']) document.navigation.resample.selectedIndex = Number(Args['resample']);
  if (Args['shade']) document.navigation.shade.selectedIndex = Number(Args['shade']);
  Loading = false;

  map_resize(document.map_size.size,true);
  select_data(Type,(Args['resample'])?true:false);

/*  var Str = "Arguments-\n";
  for (var i=0; i<Args.length; i+=2)
  {
    Str += 'Key= '+Args[i]+'   Value= '+Args[i+1]+"\n";
  }
  alert(Str);*/
// http://nasademo.sr.unh.edu/maps/?type=airphoto_3f&extent=-71.11702331245651_42.927083333333364_-70.66469206680584_43.266331767571366&size=640x480&date=3000-01-01&towns=0&roads=0&countries=1&lakes=0&resample=0&shade=0
}

/////////////////////////////////////////////////////////////////

function find_xy(Img) {
  var Img_coord = new Array(2);
  Img_coord = [Img.offsetLeft+Mac[0]+Win[0], Img.offsetTop+Mac[1]+Win[1]];
  var tempElm = Img.offsetParent;

  while (tempElm != null) {
    Img_coord[0] += tempElm.offsetLeft;
    Img_coord[1] += tempElm.offsetTop;
    tempElm = tempElm.offsetParent || null;
  }

  return Img_coord;
}

/////////////////////////////////////////////////////////////////

function Set_Map() {
  div_0.style.left = Map_coord[0]+"px";
  div_0.style.top  = Map_coord[1]+"px";
  div_0.style.visibility = "visible";

  div_1.style.left = Map_coord[0]+"px";
  div_1.style.top  = Map_coord[1]+"px";
}

/////////////////////////////////////////////////////////////////

function no_Map (ev) {
  if (!Mouse_down) return false;

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

  bx = ev.pageX ? ev.pageX : ev.clientX + document.documentElement.scrollLeft;
  by = ev.pageY ? ev.pageY : ev.clientY + document.documentElement.scrollTop;

  bx -= Map_coord[0];
  by -= Map_coord[1];

	////////////////////

  if (Mouse_down) {
	// if outside the map
    if (bx<-drop_margin || by<-drop_margin || bx>Map_size[0]+drop_margin || by>Map_size[1]+drop_margin) {
      Mouse_down = false;
      if (Zoomin || Zoomout) { div_2.style.visibility = "hidden"; }
      if (Pan) {
	wx=zx; wy=zy; drawPan(Map_size,Map_coord);

	for (var i=0; i<stn_set.length; i++) {
	  if (stn_points[stn_set[i]].chkBox) {
	    stn_points[stn_set[i]].display(true);
	  }
	}

	if (pix_info.loaded) pix_info.display(true);
      }
    }
  }
  return false;
}

/////////////////////////////////////////////////////////////////

function Map_onmousemove(ev)
{
  if (Loading) return false;
  if (!ev) var ev = window.event;

  wx = ev.pageX ? ev.pageX : ev.clientX + document.documentElement.scrollLeft;
  wy = ev.pageY ? ev.pageY : ev.clientY + document.documentElement.scrollTop;

  mx = wx - Map_coord[0];
  my = wy - Map_coord[1];

	////////////////////

  var Coords = mapExtent.coords(mx,my,100);
  c_lon.innerHTML = Coords[0];
  c_lat.innerHTML = Coords[1];

  var dataStr = '';
  if (m_Data1.loaded) {
    var mc = Math.floor(my/Map_size[1]*m_Data1.nrows)*m_Data1.ncols+Math.floor(mx/Map_size[0]*m_Data1.ncols);
    dataStr = "&nbsp;" + ((mc<0 || mc>=m_Data1.data.length) ? '' : (m_Data1.data[mc]!=m_Data1.nodata) ?  (m_Data1.data[mc]+"&nbsp;"+m_Data1.units) : 'No Data');
    m_Data1.target.innerHTML = dataStr;
    dataStr = "<br />&nbsp;Data: " + dataStr + "&nbsp;";
  }

  if (document.navigation.float_box.checked) {
    div_3.innerHTML = "&nbsp;Lon: " + Coords[0] + "&nbsp;<br />&nbsp;Lat: " + Coords[1] + "&nbsp;" + dataStr;
    div_3.style.left = (wx + 5)  + "px";
    div_3.style.top  = (wy - 35) + "px";
  }

	////////////////////

  if (Mouse_down) {
	// if inside the map
    if ((Zoomin || Zoomout) && (Math.abs(zx-mx)>10 || Math.abs(zy-my)>10))
	drawZoom(div_2,Map_size,Map_coord);
    if (Pan) drawPan(Map_size,Map_coord);
  }
  return false;
}

/////////////////////////////////////////////////////////////////

function Map_onmouseout() {
  c_lon.innerHTML = "&nbsp;";
  c_lat.innerHTML = "&nbsp;";
  if (m_Data1.loaded) m_Data1.target.innerHTML = "&nbsp;";

  div_3.style.visibility = "hidden";
  return false;
}

/////////////////////////////////////////////////////////////////

function Map_onclick() {
  if (Loading || !Mouse_down) return false;
  Mouse_down = false;
  var zoom = Zoom_factor;

  if (Zoomin || Zoomout) {
    if (Rect_zm[2]>10 || Rect_zm[3]>10) {
      if (!document.navigation.confirm.checked || confirm("Do you want zooming to the selected area?")) {
	mx = Rect_zm[0]-Map_coord[0]+Rect_zm[2]/2;
	my = Rect_zm[1]-Map_coord[1]+Rect_zm[3]/2;
	zoom = Math.min(Map_size[0]/Rect_zm[2],Map_size[1]/Rect_zm[3]);
      }
      else { div_2.style.visibility = "hidden"; return false; }
    }
    div_2.style.visibility = "hidden";
  }
  if (Pan) {
    if (Math.abs(wx-zx)>5 || Math.abs(wy-zy)>5) {
      mx = Map_size[0]/2 - (wx-zx);
      my = Map_size[1]/2 - (wy-zy);
    }
    wx = zx; wy = zy; drawPan(Map_size,Map_coord);
  }
  if (Pixel_Info) {
    pix_info.load();
    return false;
  }

  mapExtent.makeExtent([mx,my],zoom);
  load_map();

  return false;
}

/////////////////////////////////////////////////////////////////

function Map_onresize() {
  if (calc_status) Set_Calc_Img_Position();
}

//////////////////////////////////////////////////////////////////
//			Selection Tool				//
//////////////////////////////////////////////////////////////////
var zx,zy;
var Mouse_down=false;
var Rect_zm=Rect_pn=[0,0,0,0];

function img_Down(ev)
{
  if (Loading || Mouse_down) return false;
  Mouse_down = true;

  if (Zoomin || Zoomout) {
    zx = mx; zy = my;
    Rect_zm = [mx,my,1,1];
    drawZoom(div_2,Map_size,Map_coord);
  }
  else if (Pan) {
    zx = wx; zy = wy;

    for (var i=0; i<stn_set.length; i++) {
      if (stn_points[stn_set[i]].visible) {
	stn_points[stn_set[i]].display(false);
      }
    }
    pix_info.display(false);
  }

  return false;
}

/////////////////////////////////////////////////////////////////

function drawZoom(sel_rect,M_size,M_coord) {
  if (mx<2 || my<2 || mx>M_size[0] || my>M_size[1]) return false;

  if (mx>zx) { Rect_zm[0] = M_coord[0]+zx-3; Rect_zm[2] = mx-zx-2; }
  else { Rect_zm[0] = M_coord[0]+mx+2; Rect_zm[2] = zx-mx-2; }
  if (my>zy) { Rect_zm[1] = M_coord[1]+zy-3; Rect_zm[3] = my-zy-2; }
  else { Rect_zm[1] = M_coord[1]+my+2; Rect_zm[3] = zy-my-2; }

  if (Rect_zm[2]>10 || Rect_zm[3]>10) {
    div_2.style.visibility = "visible";

    sel_rect.style.width   = Math.max(2,Rect_zm[2])+"px";
    sel_rect.style.height  = Math.max(2,Rect_zm[3])+"px";

    sel_rect.style.left = Rect_zm[0]+"px";
    sel_rect.style.top  = Rect_zm[1]+"px";
  }
  else {div_2.style.visibility = "hidden"; }

  return false;
}

/////////////////////////////////////////////////////////////////

function drawPan(M_size,M_coord) {
	// top right bottom left - css clip order
  Rect_pn[0] = wy>=zy?0:(zy-wy);
  Rect_pn[1] = wx>=zx?(M_size[0]+1-wx+zx):M_size[0]+3;
  Rect_pn[2] = wy>=zy?(M_size[1]+1-wy+zy):M_size[1]+3;
  Rect_pn[3] = wx>=zx?0:(zx-wx);

  div_0.style.clip = "rect("+Rect_pn[0]+"px,"+Rect_pn[1]+"px,"+Rect_pn[2]+"px,"+Rect_pn[3]+"px)";
  div_0.style.left = (M_coord[0]+M_size[0]+1-Rect_pn[1]-Rect_pn[3])+"px";
  div_0.style.top  = (M_coord[1]+M_size[1]+1-Rect_pn[2]-Rect_pn[0])+"px";

  return false;
}

//////////////////////////////////////////////////////////////////
/*
*
*	On image (map) load Block
*
*/
/////////////////////////////////////////////////////////////////
var Loading = false;

function map_loaded() {
  div_0.style.visibility = "visible";
  div_1.style.visibility = "hidden";
  Loading = false;

  document.images['reference_map'].src = ref_map_src;

  for (var i=0; i<stn_set.length; i++) {
    if (stn_points[stn_set[i]].chkBox) {
      stn_points[stn_set[i]].load(img_0.src.replace(Map_script,p_XML_script).replace(/&date=.+/,"").replace(/type=\w+/,"type="+stn_points[stn_set[i]].code)+"&proj="+Map_proj);
    }
  }

  if (pix_info.loaded && pix_info.type == Type && pix_info.date == get_map_date()) pix_info.move();

  return false;
}

//////////////////////////////////////////////////////////////////
/*
*
*	Page Block
*
*/
/////////////////////////////////////////////////////////////////

function map_resize(sel,l) {
  var lm   = l ? false : true;
  var Size = sel.options[sel.selectedIndex].text.replace(/ /g,'').split('x');
//  var Size = [[640,480],[960,720],[1280,960]][sel.selectedIndex];
  var Divs = [div_0,div_1];
  var Imgs = [img_bg,img_0,img_wt];

  $('map_content').style.width = 1065+Number(Size[0])-650+"px";

  for (var n=0; n<Divs.length; n++)
  {
    Divs[n].style.width = Size[0]+"px";
    Divs[n].style.height= Size[1]+"px";
  }
  for (var n=0; n<Imgs.length; n++)
  {
    Imgs[n].width = Size[0];
    Imgs[n].height= Size[1];
  }

  m_url_history = [];				/// Clear history
  m_history = -1;
  div_0.style.clip = "rect(0px,"+Number(img_0.width+3).toString()+"px,"+Number(img_0.height+3).toString()+"px,0px)";
  Map_size = [img_0.width-1,img_0.height-1];	/// Set map size
  mapExtent.setSize(img_0.width,img_0.height);
  if (lm) load_map();
}

/////////////////////////////////////////////////////////////////

function map_options() {
  var map_options_param =
	"&towns=" + (document.info_layers.towns.checked ? 1 : 0) +
	"&roads=" + (document.info_layers.roads.checked ? 1 : 0) +
	"&countries=" + (document.info_layers.countries.checked ? 1 : 0) +
	"&lakes=" + (document.info_layers.lakes.checked ? 1 : 0) +
	"&mask="  + maskValue;
  return map_options_param;
}

/////////////////////////////////////////////////////////////////

function load_map() {
  if (Loading) return false;
  map_loading();
  date = get_map_date();

  if (!document.navigation.resample.selectedIndex) document.navigation.shade.selectedIndex = 0;
  var data_opt = "&resample=" + document.navigation.resample.selectedIndex + "&shade=" + document.navigation.shade.selectedIndex;

  img_0.src = Map_script + "type=" + Type + mapExtent.to_String(true) + "&date=" + date + map_options() + data_opt;
  ref_map_src = "/images/spool/ref_map_" + mapExtent.to_String(false) + ".png";
//  alert(img_0.src);

	/*	Update Map History	*/
  m_url_history = m_url_history.slice(0,++m_history);
  push_history();

	/*	Update calculator map	*/
  if (calc_status) {
    document.images['calc_map_background'].src = Map_script + "type=none" + mapExtent.to_String(true).replace(/&size=\S+/,'') + map_options();
    Set_Calc_Img_Position();
  }
}

/////////////////////////////////////////////////////////////////

function get_map_date() {
  var Date;

  switch (Ts) {
    case 'daily':
      Date = document.date.year.options[document.date.year.selectedIndex].value + "-" + document.date.month.options[document.date.month.selectedIndex].value + "-" + document.date.day.options[document.date.day.selectedIndex].value; break;

    case 'daily_clim':
      Date = "0000-" + document.date.month.options[document.date.month.selectedIndex].value + "-" + document.date.day.options[document.date.day.selectedIndex].value; break;

    case 'monthly':
      Date = document.date.year.options[document.date.year.selectedIndex].value + "-" + document.date.month.options[document.date.month.selectedIndex].value + "-00"; break;

    case 'monthly_clim':
      Date = "0000-" + document.date.month.options[document.date.month.selectedIndex].value + "-00"; break;

    case 'yearly':
      Date = document.date.year.options[document.date.year.selectedIndex].value + "-00-00"; break;

    case 'decadal':
      Date = document.date.year.options[document.date.year.selectedIndex].value + "-00-00"; break;

    default:
      Date = '3000-01-01';
      break;
  }

  return Date;
}

/////////////////////////////////////////////////////////////////

function map_loading() {
  div_1.style.visibility = "visible";
  div_0.style.visibility = "hidden";
  Loading = true;
  m_Data1.clear();
  dateObj.stop_anim();

  for (var i=0; i<stn_set.length; i++) {
    stn_points[stn_set[i]].clear();
  }

  pix_info.display(false);

  return false;
}

function clear_pix_info() { pix_info.clear(); }

/////////////////////////////////////////////////////////////////

function navigate(b0,b1,b2,b3) {
  if (Loading) return false;

  mapExtent.setExtent([b0,b1,b2,b3]);
  load_map();
}

/////////////////////////////////////////////////////////////////

function select_data(tpy,l) {
  var lm   = l ? false : true;
  if (Loading) return void(0);
  pix_info.clear();
//  date = get_map_date();

  DownloadUrl(TSt_script+"type="+tpy+"&date="+date, true, function(xmlDoc,responseCode) {
    if (responseCode == 200) {
      var att_data = xmlDoc.getElementsByTagName('ts_table')[0];
	Ts = att_data.getAttribute('time_series').replace(/decadal/,'yearly');

      $("resample").style.visibility = att_data.getAttribute('rs_visibility');
      $("var_name_top").innerHTML = att_data.getAttribute('var');
      $("var_name").innerHTML = att_data.getAttribute('var');
      $("ts_table").innerHTML = xmlDoc.getElementsByTagName('t_html')[0].childNodes[0].nodeValue;
      $("metadata").innerHTML = "<a href=\""+att_data.getAttribute('metadata')+"\" target=\"_blank\"><b>Explanation about this dataset</b></a>";

      $("calc_sym").innerHTML = (att_data.getAttribute('calc_sym') != 'Not Available') ? '<a href="" onclick="paste_symbol(this); return false">'+att_data.getAttribute('calc_sym')+'</a>' : att_data.getAttribute('calc_sym')+' (<a href="javascript:inputTool(\'div_symbol_input\')"> Add </a>)';

      if (lm) document.navigation.resample.selectedIndex = att_data.getAttribute('resample');
      if (lm) document.navigation.shade.selectedIndex = att_data.getAttribute('shade');
		// Date Object update
      var d_list = xmlDoc.getElementsByTagName('dates')[0].childNodes[0].nodeValue;
      var d_date = att_data.getAttribute('date_idx').split(':');
      dateObj  = new tsNavObj();
      eval(d_list);		// dateObj.dates
      dateObj.date = (d_date.length==3)?{'year':parseInt(d_date[0]),'month':parseInt(d_date[1]),'day':parseInt(d_date[2])}:false;
      dateObj.load(Ts);
			/// Finilize loading new dataset
      Type = tpy;
      load_map();
    }
    else {
      alert('Undefined Dataset <'+tpy+'>');
    }
  });
}

/////////////////////////////////////////////////////////////////

function showLink(t) {
  var URL_div = $('url_link');

  if (URL_div.style.visibility == "visible") {
    URL_div.style.visibility = "hidden";
  }
  else {
    var link_val = '';
    switch (t) {
      case 0:
	link_val = document.URL.substr(0,(document.URL.indexOf('?')!=-1)?document.URL.indexOf('?'):document.URL.length)
	+ m_url_history[m_history][1].substr(m_url_history[m_history][1].indexOf('?'));
	break;

      case 1:
	link_val = 'http://'+document.domain+'/cgi-bin/map.pl'
	+ m_url_history[m_history][1].substr(m_url_history[m_history][1].indexOf('?'));
	break;

      case 2:
	link_val = Type;
	break;
    }
    document.lnk.lnk.value = link_val;

    URL_div.style.left = Number(Map_coord[0]+Map_size[0]-URL_div.offsetWidth).toString() +"px";
    URL_div.style.top  = Number(Map_coord[1]+Map_size[1]-URL_div.offsetHeight).toString()+"px";
    URL_div.style.visibility = "visible";
    document.lnk.lnk.focus();
    document.lnk.lnk.select();
  }
}

function printMap() {
  var src  = img_0.src;
  var link = "about:blank";

  // We break the closing script tag in half to prevent
  // the HTML parser from seeing it as a part of
  // the *main* page.
  var html = "<html>\n" +
    "<head>\n" +
    "<title>Temporary Printing Window</title>\n" +
    "<script>\n" +
    "function step1() {\n" +
    "  setTimeout('step2()', 10);\n" +
    "}\n" +
    "function step2() {\n" +
    "  window.print();\n" +
    "  window.close();\n" +
    "}\n" +
    "</scr" + "ipt>\n" +
    "</head>\n" +
    "<body onLoad='step1()'>\n" +
    "<img src='" + src + "'/>\n" +
    "</body>\n" +
    "</html>\n";
  var pw = window.open(link, "_new");

  pw.document.open();
  pw.document.write(html);
  pw.document.close();
}

/////////////////////////////////////////////////////////////////
/*
*
*	Page History Block
*
*/
/////////////////////////////////////////////////////////////////

var m_url_history = new Array;
var m_history = -1;

function map_history(page) {
  if (page==-1 && !m_history) return false;
  if (page== 1 &&  m_history==(m_url_history.length-1)) return false;

  if (Loading) return false;
  map_loading();

  m_history = Math.max(m_history+page,0);
  m_history = Math.min(m_history,m_url_history.length-1);

	///////////////////////////
	///	Restore Page	///
	///////////////////////////

  var t_change  = (Type != m_url_history[m_history][0]) ? true : false;
  Type = m_url_history[m_history][0];

  img_0.src	= m_url_history[m_history][1];
  img_1.src	= m_url_history[m_history][2];
  ref_map_src	= m_url_history[m_history][2];

  mapExtent.setExtent(
	[m_url_history[m_history][3],m_url_history[m_history][4],m_url_history[m_history][5],m_url_history[m_history][6]]
  );

  Ts 			= m_url_history[m_history][7];
  var dObjDates		= m_url_history[m_history][8];
  var dObjDate		= m_url_history[m_history][9];

  $("resample").style.visibility		= m_url_history[m_history][10];
  $("var_name_top").innerHTML			= m_url_history[m_history][11];
  $("var_name").innerHTML			= m_url_history[m_history][12];
  if (t_change)
	$("ts_table").innerHTML			= m_url_history[m_history][13];
  $("metadata").innerHTML			= m_url_history[m_history][14];
  $("calc_sym").innerHTML			= m_url_history[m_history][15];
  document.navigation.resample.selectedIndex	= m_url_history[m_history][16];
  document.navigation.shade.selectedIndex	= m_url_history[m_history][17];

  if (t_change) {
    dateObj = new tsNavObj();
    dateObj.dates = dObjDates;
    dateObj.date  = dObjDate;
    dateObj.load(Ts);
  }
  else {
    dateObj.date = dObjDate;
    if (Ts) dateObj.setDates(dateObj.group[0],dObjDate,true);
  }
}

/////////////////////////////////////////////////////////////////

function push_history() {
  m_url_history.push([
	Type,
	img_0.src,ref_map_src,
	mapExtent.extent[0],mapExtent.extent[1],mapExtent.extent[2],mapExtent.extent[3],
	Ts,dateObj.dates,
	{'year':dateObj.date.year,'month':dateObj.date.month,'day':dateObj.date.day},
	$("resample").style.visibility,
	$("var_name_top").innerHTML,
	$("var_name").innerHTML,
	$("ts_table").innerHTML,
	$("metadata").innerHTML,
	$("calc_sym").innerHTML,
	document.navigation.resample.selectedIndex,
	document.navigation.shade.selectedIndex
  ]);
}

/////////////////////////////////////////////////////////////////
/*
*
*	Data Download Block
*
*/
/////////////////////////////////////////////////////////////////

function Load_Data(dObj,checkBox) {
  if (checkBox.checked == false) {
    checkBox.checked = true;
    return false;
  }
  else if (Loading) {
    checkBox.checked = false;
    return false;
  }
  else { Loading = true; }

  var dataDims = '320_' + Number(320/mapExtent.cols*mapExtent.rows).toString();

  dObj.checkBox = checkBox;
  dObj.load(img_0.src.replace(Map_script,XML_script).replace(/&towns=.+/,"")+"&data_dims="+dataDims+"&proj="+Map_proj);
}

/////////////////////////////////////////////////////////////////
/*
*
*	Points Download Block
*
*/
/////////////////////////////////////////////////////////////////

function Load_Points(p_set,checkBox) {
  var pObj    = stn_points[p_set];
  pObj.chkBox = checkBox.checked;

  if (!pObj.chkBox) {
    pObj.display(false);
  }
  else if (pObj.loaded) {
    pObj.display(true);
  }
  else {
   pObj.load(img_0.src.replace(Map_script,p_XML_script).replace(/&date=.+/,"").replace(/type=\w+/,"type="+pObj.code)+"&proj="+Map_proj);
//       alert(img_0.src.replace(Map_script,p_XML_script).replace(/&date=.+/,"").replace(/type=\w+/,"type="+pObj.code)+"&proj="+Map_proj);
  }

  return false;
}

/*****************************************************************
		Dataset Search Functions
******************************************************************/
var srch_win = 0;
var srch_windowName,srch_params,srch_url;

function dataSearchWin() {  		// Open a window for Dataset search

  srch_windowName   = "DS_Search";
  srch_params = "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width=640,height=640";
  srch_url = "/cgi-bin/search_page.pl";

  if ((srch_win) && (!srch_win.closed)) {
	srch_win.focus();
  }
  else {
	setTimeout("srch_win = window.open(srch_url, srch_windowName , srch_params);",200);
  }
}

//////////////////////////////////////////////////////////////////
///////////////////////   Map Extent Object   ////////////////////

function extentObj(full_extent,map_size,proj) {
  if (Math.abs((full_extent[2]-full_extent[0])/(full_extent[3]-full_extent[1]) - map_size[0]/map_size[1]) > 0.001) alert ("Missmatch in map extent and map size proportions...");

  this.full_extent= full_extent;	/// Reference to map coords array [xmin,ymin,xmax,ymax]
  this.cols	= map_size[0];		/// Map img width
  this.rows	= map_size[1];		/// Map img height
  this.extent	= full_extent.slice(0);	/// Current map extent
  this.px_scale	= (full_extent[2]-full_extent[0])/map_size[0];	/// Pixel Scale
  this.proj	= proj;			/// epsg projection string
  this.rotation	= this.getRotation();			/// Map rotation
}

extentObj.prototype.setSize = function(width,height) {
  this.cols = width;
  this.rows = height;
  this.px_scale = (this.extent[2]-this.extent[0])/width;
};

extentObj.prototype.setExtent = function(new_extent) {
  if (Math.abs((new_extent[2]-new_extent[0])/(new_extent[3]-new_extent[1]) - this.cols/this.rows) > 0.001 && !confirm("Missmatch in map extent and map size proportions.\nDo you want to use wrong extents?")) return false;

  this.extent = new_extent.slice(0);		// makes copy
  this.px_scale = (this.extent[2]-this.extent[0])/this.cols;
  this.rotation = this.getRotation();
};

extentObj.prototype.makeExtent = function(center,zoom) {
  center = this.translate(center);
  var Map_span = new Array(this.extent[2]-this.extent[0],this.extent[3]-this.extent[1]);

  Map_span[0] /= zoom; Map_span[1] /= zoom;

  if (Map_span[0] >= this.full_extent[2]-this.full_extent[0])
  {
    this.extent = this.full_extent.slice(0);	// makes copy
  }
  else
  {
    var c_lon = this.extent[0]+center[0]*this.px_scale;
    var c_lat = this.extent[3]-center[1]*this.px_scale;

    if ((c_lon-Map_span[0]/2)<this.full_extent[0]) c_lon = this.full_extent[0] + Map_span[0]/2;
    if ((c_lon+Map_span[0]/2)>this.full_extent[2]) c_lon = this.full_extent[2] - Map_span[0]/2;
    if ((c_lat-Map_span[1]/2)<this.full_extent[1]) c_lat = this.full_extent[1] + Map_span[1]/2;
    if ((c_lat+Map_span[1]/2)>this.full_extent[3]) c_lat = this.full_extent[3] - Map_span[1]/2;

    this.extent[0] = c_lon - Map_span[0]/2;
    this.extent[2] = c_lon + Map_span[0]/2;
    this.extent[1] = c_lat - Map_span[1]/2;
    this.extent[3] = c_lat + Map_span[1]/2;
  }

  this.px_scale = (this.extent[2]-this.extent[0])/this.cols;
  this.rotation = this.getRotation();
};

extentObj.prototype.translate = function(coordPix) {
  if (this.proj == 'epsg:4326') return coordPix;
  if (this.proj == 'epsg:3408') {
				// Change pixel coord origin to map center
    coordPix[0] -= this.cols/2;
    coordPix[1]  = this.rows - coordPix[1] - this.rows/2;
				// Convert Cartesian to Polar coord system
    var dist  = Math.sqrt(coordPix[0]*coordPix[0] + coordPix[1]*coordPix[1]);
    var angle = Math.atan2(coordPix[1],coordPix[0]) + this.rotation;
				// Rotate and convert back to map pixel coords
    coordPix[0] = dist * Math.cos(angle) + this.cols/2;
    coordPix[1] = this.rows - (dist * Math.sin(angle) + this.rows/2);
    return coordPix;
  }
  else {
    alert("Unknown projection: "+this.proj+"\nSwitching to \"epsg:4326\".");
    this.proj = 'epsg:4326';
    return coordPix;
  }
};

extentObj.prototype.getRotation = function() {
  var angle = 0.0;
  if (this.proj == 'epsg:3408') {
    var mapCenter = new Array((this.extent[2]+this.extent[0])/2, (this.extent[3]+this.extent[1])/2);
    if (!mapCenter[1]) mapCenter[1] = -1e-24;
    angle = Math.atan2(mapCenter[1],mapCenter[0])+Math.PI/2;
  }
  return angle;
};

extentObj.prototype.coords = function(x,y,round_factor) {
  pixCoord = this.translate([x,y]);
  var Lon = this.extent[0]+pixCoord[0]*this.px_scale;
  var Lat = this.extent[3]-pixCoord[1]*this.px_scale;

  if (this.proj == 'epsg:3408') {
    var Lng = Lon;
    Lon = Math.PI - Math.atan2(Lng,Lat);
    Lat = Math.asin(Lng/2/6410000/Math.sin(Lon));
//    Lat = Math.asin(Lng/2/6371228/Math.sin(Lon));
    Lon = ((Lon>Math.PI?Lon-2*Math.PI:Lon)*180/Math.PI);
    Lat = ((Math.PI/4 - Lat)*360/Math.PI);
  }
				// Round and serve
  if (round_factor) {
    Lon = Math.floor(Lon*round_factor)/round_factor;
    Lat = Math.floor(Lat*round_factor)/round_factor;
    Lon = (Lon<0?"&nbsp;":"&nbsp;&nbsp;") + Lon;
    Lat = (Lat<0?"&nbsp;":"&nbsp;&nbsp;") + Lat;
  }

  return [Lon,Lat];
};


extentObj.prototype.pixel = function(coord) {
  var Lon = coord[0]; var Lat = coord[1]; var x,y;

  if (this.proj == 'epsg:4326') {
    x = (Lon - this.extent[0])/this.px_scale;
    y = (this.extent[3] - Lat)/this.px_scale;
  }
  else if (this.proj == 'epsg:3408') {
    Lon = Lon/180*Math.PI;		// Convert to radians
    Lat = Lat/180*Math.PI;
				// Convert to meters
    x = 2*6410000 * Math.sin(Lon) * Math.sin(Math.PI/4 - Lat/2);
    y = 2*6410000 * Math.cos(Lon) * Math.sin(Math.PI/4 - Lat/2);
				// Convert to pixel coord relative to map center
    x = (x - this.extent[0])/this.px_scale - this.cols/2;
    y = this.rows/2 - (y + this.extent[3])/this.px_scale;
				// Convert Cartesian to Polar coord system
    var dist  = Math.sqrt(x*x + y*y);
    var angle = this.rotation - Math.atan2(y,x);
				// Rotate and convert back to map pixel coords
    x = dist * Math.cos(angle) + this.cols/2;
    y = dist * Math.sin(angle) + this.rows/2;
  }
  else {
    alert("Unknown projection: "+this.proj);
    x = y = -100;
  }

  return [x,y];
};

extentObj.prototype.to_String = function(sel) {
  var Str = this.extent[0]+"_"+this.extent[1]+"_"+this.extent[2]+"_"+this.extent[3];

  if (sel) Str = "&extent="+Str+"&size="+this.cols+"x"+this.rows;

  return Str;
};

//////////////////////////////////////////////////////////////////
///////////////////////   Data Object   //////////////////////////

function dataObj(target_name) {
  this.loaded = false;
  this.target = document.getElementById(target_name);
  this.checkBox = null;
  this.var_name = "&nbsp;";
  this.units = "&nbsp;";
  this.ncols = 0;
  this.nrows = 0;
  this.nodata= 0;
  this.data = new Array();
}

dataObj.prototype.load = function(url) {
  var dObj = this;
  dObj.target.innerHTML = "Loading...";
  DownloadUrl(url, true, function(xmlDoc,responseCode) {
    if (responseCode == 200) {
      var att_data = xmlDoc.getElementsByTagName('js_data')[0];
	dObj.units =        att_data.getAttribute('units');
	dObj.ncols = Number(att_data.getAttribute('ncols'));
	dObj.nrows = Number(att_data.getAttribute('nrows'));
	dObj.nodata= Number(att_data.getAttribute('nodata'));
//      var nodataReg = new RegExp(dObj.nodata,"g"); // replace(nodataReg,"No Data").

      var array = xmlDoc.getElementsByTagName('numbers')[0].firstChild.nodeValue.replace(/,,/g,",1,").split(",");

      for (var i=0; i<array.length/2; i++) {
	for (j=0; j<array[i*2+1]; j++) {
	  dObj.data.push(array[i*2]);
	}
      }
			// Populate Classes Legend
      if (xmlDoc.getElementsByTagName('legend')[0]) {
	var Pairs = xmlDoc.getElementsByTagName('legend')[0].firstChild.nodeValue.split(",");
	var Str_data = new Array();
	for (var k=0; k<Pairs.length/2; k++) {
	  Str_data[Number(Pairs[k*2])] = Pairs[k*2+1];
	}
	for (var k=0; k<dObj.data.length; k++) {
	  dObj.data[k] = (dObj.data[k]==dObj.nodata)?'No Data':Str_data[parseInt(dObj.data[k])];
	}
      }

      dObj.loaded = true;
      dObj.target.innerHTML = "&nbsp;";
    }
    else {
		dObj.checkBox.checked = false;
		dObj.target.innerHTML = "Failed to Load...";
    }

    Loading = false;
  });
};

dataObj.prototype.clear = function() {
  this.loaded = false;
  this.target.innerHTML = "Check to Load";
  if (this.checkBox) this.checkBox.checked = false;
  this.data = new Array();
};

//////////////////////////////////////////////////////////////////
///////////////////////   Points Object   ////////////////////////

function pointsObj(code) {
  this.code    = code;
  this.chkBox  = false;
  this.loaded  = false;
  this.visible = false;
  this.n_points= 0;
  this.ids     = new Array();
}

pointsObj.prototype.load = function(url) {
  var pObj = this;
  DownloadUrl(url, true, function(xmlDoc,responseCode) {
    if (responseCode == 200) {

	////	Get Point Data
      var pnt_data    = xmlDoc.getElementsByTagName('pnt_data')[0];
	pObj.n_points = Number(pnt_data.getAttribute('n_points'));
	pObj.ids      = new Array(pObj.n_points);
      var pnt_html    = xmlDoc.getElementsByTagName('pnt_html')[0].childNodes[0].nodeValue;

	////	Set Point Data
      $(pObj.code).innerHTML = pnt_html;
      for (var i=0; i<pObj.n_points; i++) {
	pObj.ids[i] = pObj.code + '_' + i.toString();
	var point_div = $(pObj.ids[i]);
	var point_x   = Number(point_div.style.left.replace(/px/,""))+Map_coord[0];
	var point_y   = Number(point_div.style.top.replace(/px/,"")) +Map_coord[1];

	point_div.style.left = point_x+"px";
	point_div.style.top  = point_y+"px";
      }

      pObj.loaded = true;
      pObj.display(true);
    }
    else {
		alert("Points ("+pObj.code+") failed to Load...");
	 }
  });
};

pointsObj.prototype.display = function(swtch) {
  this.visible = swtch;
  var visibility_status = swtch ? "visible" : "hidden";

  for (var i=0; i<this.n_points; i++) {
    $(this.ids[i]).style.visibility = visibility_status;
  }
};

pointsObj.prototype.clear = function() {
  $(this.code).innerHTML = '&nbsp;';

  this.loaded = false;
  this.visible = false;
  this.n_points= 0;
  this.ids = new Array();
};

//////////////////////////////////////////////////////////////////
//////////////////   Pixel Information Object   //////////////////

function pixInfoObj(InfoLyr,CoutLyr,CoutImgObj,CoutImg) {
  this.infoBox = $(InfoLyr);
  this.coutBox = $(CoutLyr);
  this.cImgObj = CoutImgObj;
  this.coutImg = new Array(new Array(2),new Array(2));	// Preload callout images
  for (var i=0; i<2; i++) {
    for (var j=0; j<2; j++) {
      this.coutImg[i][j] = new Image();
      this.coutImg[i][j].src = CoutImg[i][j];
    }
  }

  var div = $("info_cntry");
  this.fontWidth = div.offsetWidth/div.innerHTML.length - 0.25;

  this.type    = null;
  this.date    = null;
  this.coord   = new Array(2);
  this.polygon = null;
  this.loaded  = false;
}

pixInfoObj.prototype.load = function() {
  this.type   = Type;
  this.date   = get_map_date();
  this.coord  = mapExtent.coords(mx,my,0);

  var Lon = Math.floor(this.coord[0]*100)/100;
  var Lat = Math.floor(this.coord[1]*100)/100;
  $("info_coord").innerHTML = Lon + " " + Lat;

  this.infoBox.style.width    = "180px";
  this.infoBox.style.height   = (Ts && Ts!='yearly_clim') ? "110px" : "100px";
  $("info_TS_link").innerHTML = (Ts && Ts!='yearly_clim') ? "<a title=\"TS graph\" href=\"javascript: void(0)\" onclick=\"dateObj.Get_TS_Graph('" + this.type + "','" + this.coord.join("_") + "')\"><span style=\"font-style:italic;\">Link to TS data graph for this pixel</span></a>" : "";

  this.getPoint($("info_cntry"),"country_6min",true);
  this.getPoint($("info_basin"),"riverbasinmask_207",true);
  this.getPoint($("info_pdata"),this.type,false);
  if (!(Ts && Ts!='yearly_clim')) this.getPolyg();

  this.move();
  this.loaded = true;
};

pixInfoObj.prototype.getPoint = function(div,code_name,trim) {
  var pObj = this;
  div.innerHTML = "Loading...";

  var scale = (mapExtent.proj == 'epsg:3408') ? Math.abs(mapExtent.extent[2]-mapExtent.extent[1])*3.2 :
	111119*39.37*(mapExtent.extent[2]-mapExtent.extent[0])/(640/72);
  var url = XY_pnt_script + "frmt=txt&type=" + code_name + "&point=" + this.coord.join("_") + "&date=" + this.date + "&scale=" + scale;

  DownloadUrl(url, false, function(txtDoc,responseCode) {
    if (responseCode == 200) {
      if (trim) txtDoc=txtDoc.replace(/ \(\d+\)/,'');
      div.innerHTML = (txtDoc.indexOf("GHAASBasin")==-1)?txtDoc:"N/A";
      var wdth = pObj.infoBox.style.width.replace(/px/,'');
      wdth = Math.max(wdth,(wdth,(11+div.innerHTML.length)*pObj.fontWidth));
      pObj.infoBox.style.width    = wdth+"px";
    }
    else { alert("Pixel for ("+code_name+") failed to Load..."); }});
};

pixInfoObj.prototype.getPolyg = function() {
  var pObj = this;
  var div  = $("info_TS_link");

  div.innerHTML = "Checking for Polygons...";
  var url = "/cgi-bin/check_pol.pl?type=" + this.type + "&point=" + this.coord.join("_");

  DownloadUrl(url, false, function(txtDoc,responseCode) {
    if (responseCode == 200) {
      pObj.polygon = eval(txtDoc);
      if (pObj.polygon[0][0]) {
	pObj.move();
	div.innerHTML = "<a title=\"Polygon Data\" href=\"javascript: pix_info.showPol()\"><span style=\"font-style:italic;\">Polygon Data</span></a>";
      }
      else { div.innerHTML = ""; }
    }
    else { alert("Pixel polygon check failed to Load..."); }});
};

pixInfoObj.prototype.showPol = function() {
  var htm  = '<span style="font-style:italic; color:green;">Polygon averages-</span><br />';
  var wdth = this.infoBox.style.width.replace(/px/,'');
  for (var i=0; i<this.polygon.length; i++) {
    wdth = Math.max(wdth,String(this.polygon[i].join('  ')).length*this.fontWidth*1.05);
    htm += this.polygon[i][0]+'- <b>'+this.polygon[i][1]+'= <span style="color:red;">'+this.polygon[i][2]+' '+this.polygon[i][3]+'</span></b><br />';
  }

  $("info_TS_link").innerHTML = htm;
  this.infoBox.style.width    = wdth+"px";
  this.infoBox.style.height   = (110+this.polygon.length*11)+"px";
  this.move();
};

pixInfoObj.prototype.move = function() {
  var xy     = mapExtent.pixel(this.coord);
  if (xy[0] < 0 || xy[0] > Map_size[0] || xy[1] < 0 || xy[1] > Map_size[1]) {
    return false;
  }

  var flip_h = (xy[0] < Map_size[0]/2) ? 0 : 1;
  var flip_v = (xy[1] < Map_size[1]/2) ? 0 : 1;
  this.cImgObj.src = this.coutImg[flip_h][flip_v].src;

  var callout_x  = xy[0] + Map_coord[0] - (flip_h ? this.coutBox.offsetWidth  : 0);
  var callout_y  = xy[1] + Map_coord[1] - (flip_v ? this.coutBox.offsetHeight : 0);
  var pix_info_x = xy[0] + Map_coord[0] - (flip_h ? this.infoBox.offsetWidth  : 0);
  var pix_info_y = xy[1] + Map_coord[1] + (flip_v ? (2 - this.infoBox.offsetHeight - this.coutBox.offsetHeight) : (this.coutBox.offsetHeight - 2));

  this.coutBox.style.left = callout_x  + "px";
  this.coutBox.style.top  = callout_y  + "px";
  this.infoBox.style.left = pix_info_x + "px";
  this.infoBox.style.top  = pix_info_y + "px";

  this.display(true);
};

pixInfoObj.prototype.display = function(swtch) {
  var visibility_status = swtch ? "visible" : "hidden";

  this.coutBox.style.visibility = visibility_status;
  this.infoBox.style.visibility = visibility_status;
};

pixInfoObj.prototype.clear = function() {
  this.type   = null;
  this.date   = null;
  this.loaded = false;
  this.display(false);
};

//////////////////////////////////////////////////////////////////
//////////////////   Dataset Symbol Object   /////////////////////

function symbolObj(symInput) {
  this.inputDiv	= symInput;
  this.table	= false;
  this.symbol	= new Array();
}

symbolObj.prototype.add = function() {
  var symbol = getInput(this.inputDiv);
  for (var i=0; i<this.symbol.length; i++) {
    if (symbol == this.symbol[i][0]) {
      alert("This symbol is already used...\nPlease, choose another one.");
      return;
    }
  }
  var sObj   = this;

  if (symbol.match(/^\w+$/)) {
    DownloadUrl(sym_script+symbol, false, function(txtDoc,responseCode) {
      if (responseCode == 200) {
	if (txtDoc.match(/OK/)) {
	  var lnk = '<a href="" onclick="paste_symbol(this); return false">'+symbol+'</a>';
	  $("calc_sym").innerHTML	= lnk;
	  m_url_history[m_history][19]	= lnk;
	  sObj.symbol.push([symbol,Type]);
	  closeInput(sObj.inputDiv);
	  if (sObj.table) set_table('U');
	}
	else { alert("This symbol is already used...\nPlease, choose another one."); }
      }
      else { alert("Symbol check failed..."); }});
  }
  else {
    alert("Please, use alphanumeric characters for the dataset calculator symbol");
  }
};

symbolObj.prototype.str = function() {
  var sym_pair = new Array(this.symbol.length);
  for (var i=0; i<this.symbol.length; i++) {
    sym_pair[i] = this.symbol[i].join(':');
  }
  return sym_pair.join('::');
};

//////////////////////////////////////////////////////////////////
/*
*
*	XML Block
*
*/
///////////////////////////////////////////////////////////////////////

function DownloadUrl(url,xml,func) {
  var req,responseData,responseCode;

  // branch for native XMLHttpRequest object
  if (window.XMLHttpRequest) {
	req = new XMLHttpRequest();
  // branch for IE/Windows ActiveX version
  } else if (window.ActiveXObject) {
	req = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else {
    alert("This browser does not support AJAX -\nAsynchronous JavaScript and XML...");
    return false;
  }

  if (req) {
	req.open("GET", url, true);
	req.onreadystatechange = function() {
	  if (req.readyState == 4) {
	    responseCode = req.status;
		// only if "OK"
	    if (responseCode == 200) {
		responseData = xml ? req.responseXML : req.responseText;
	    }
//	    else { alert("There was a problem retrieving XML data:\n" + req.statusText); }

	    func(responseData,responseCode);
	  }
	}
	req.send(null);
  }
  else {
    alert("This browser does not support AJAX -\nAsynchronous JavaScript and XML...");
    return false;
  }
}

/////////////////////////////////////////////////////////////////

function loadXMLstring(text) {
  // code for IE
  if (window.ActiveXObject)
  {
	var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
	xmlDoc.async="false";
	xmlDoc.loadXML(text);
  }
  // code for Mozilla, Firefox, Opera, etc.
  else if (window.DOMParser)
  {
	var parser=new DOMParser();
	var xmlDoc=parser.parseFromString(text,"text/xml");
  }
  else {
    alert("This browser does not support XML...");
    return false;
  }
  return xmlDoc;
}

/*****************************************************************
		Drag ID Input Tool
******************************************************************/

function inputTool(div_id) {
  var inputDiv = $(div_id);
  inputDiv.style.left = document.documentElement.scrollLeft+document.documentElement.clientWidth/2-inputDiv.offsetWidth/2+"px";
  inputDiv.style.top = document.documentElement.scrollTop+document.documentElement.clientHeight/2-inputDiv.offsetHeight/2+"px";
  inputDiv.style.visibility = "visible";
  inputDiv.getElementsByTagName('input')[0].focus();
}

function closeInput(div_id) {
  var inputDiv = $(div_id);
  inputDiv.getElementsByTagName('input')[0].value = '';
  inputDiv.style.visibility = "hidden";
}

function getInput(div_id) {
  return $(div_id).getElementsByTagName('input')[0].value;
}

/*****************************************************************/

function getDataByCode(div_id) {
  var code = getInput(div_id);
  code.replace(/^\s+/,'');			// Remove leading  spaces
  code.replace(/\s+$/,'');			// Remove trailing spaces

  select_data(code);
  closeInput(div_id);
}

//////////////////////////////////////////////////////////////////
/*
*
*	Helper functions
*
*/
///////////////////////////////////////////////////////////////////////

function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}

/////////////////////////////////////////////////////////////////

function parseArgs(url) {
  var Args = new Array();
  var argString = (url.indexOf('?')!=-1)?url.substr(url.indexOf('?')+1):'';
  while (argString) {
    var midPos = argString.indexOf('=');
    if (midPos != -1) {
      var len = (argString.indexOf('&')!=-1) ? argString.indexOf('&') : argString.length;
      var key = argString.substr(0,midPos);
      var val = argString.substr(midPos+1,len-midPos-1);
      Args[key] = val;
      argString = argString.substr(len+1);
    }
    else {argString = '';}
  }
  return Args;
}

// -->
