/*****************************************************************
	Data Calculator Functions

	Written by Alex Prusevich - alex.proussevitch@unh.edu

	Updated October, 2007
******************************************************************/

	/* Global Variables */

var Clc_script = '/cgi-bin/calculations.pl?';
var Calculator_script = '/cgi-bin/calc_graph.pl?';
var Calc_signal_script = '/cgi-bin/calc_signal.pl?sid=';
var Update_Img = new Image(1050,480);
    Update_Img.src = '/images/explorer/wait_calc.gif';
var Not_requested  = '/images/explorer/not_requested.gif';
var calc_map,calc_img,ancor_img,calcMapOptElem,calcMapOptTD,calcMapOptImg;
var calc_status = false;
var calc_progress = false;
var sid = 0;

	/* Calculator Functions */

function calculator_expand(swtch) {
  calc_status = swtch;
  var html = calc_status ? Clc_script + mapExtent.to_String(true) + map_options() : "calculator_out.htm";

  DownloadUrl(html, false, function(htmlDoc,responseCode) {
    $("data_calculator").innerHTML = htmlDoc;
    if (calc_status) calc_init();
    window.location.href = "#calculator_bookmark";
  });
}

function calc_init() {
  calc_map = document.getElementById('calc_map');
  calc_img = document.images['calc_map_img'];
  ancor_img= document.images['calc_map_background'];
  PROGRESS = document.getElementById('progress_bar');
  elem_td  = $('td_opt');
  calcMapOptElem = $('map_options','data_options','color_options');
  calcMapOptTD = $('td_map_opt','td_data_opt','td_color_opt');
  calcMapOptImg= [document.images['img_map_opt'],document.images['img_data_opt'],document.images['img_color_opt']];

  calc_img.onload = function() { calc_progress = false; progBarStop(); };

  set_table(0);
}

function Set_Calc_Img_Position() {
  var img_coord = find_xy(ancor_img);
  var td_coord  = find_xy(elem_td);

  calc_map.style.left = img_coord[0]+"px";
  calc_map.style.top  = img_coord[1]+"px";
  calc_map.style.visibility = "visible";

  PROGRESS.style.left = img_coord[0]+160+"px";
  PROGRESS.style.top  = img_coord[1]+200+"px";

  for (var i=0; i<calcMapOptElem.length; i++) {
    calcMapOptElem[i].style.left = td_coord[0]+"px";
    calcMapOptElem[i].style.top  = td_coord[1]+"px";
  }
}

function Update(img) {
  img.src = Update_Img.src;
}

function calc_img_reset(butn) {
  butn.form.reset();
  calc_cancel();
  calc_img.src = Not_requested;
}

function Calculate(calc_form) {
  var Equation   = calc_form.equation.value;
  var Equation_i = calc_form.equation_i.value;
  var Min = calc_form.min.value;
  var Max = calc_form.max.value;
  var Index = 0; while (calc_form.legend[Index].checked == false) {Index++}
  var Legend = calc_form.legend[Index].value;
  var Replace = Number((calc_form.replace.checked) ? 1 : 0).toString();
  var Data = Number((calc_form.to_data.checked) ? 1 : 0).toString();
  var Log_scale = Number((calc_form.log_scale.checked) ? 1 : 0).toString();
  var High_res = (calc_form.high_res.checked) ? "640_480" : "320_240";
  sid = Math.random().toString().substr(2,9);
  var RegExp = /\+/g;
  Equation   = escape(Equation.replace(RegExp,'PLUS'));
  Equation_i = escape(Equation_i.replace(RegExp,'PLUS'));
  var url = Calculator_script +  mapExtent.to_String(true) + map_options() +
	"&proj="		+ Map_proj +
	"&equation="		+ Equation +
	"&equation_i="		+ Equation_i +
	"&replace="		+ Replace +
	"&data="		+ Data +
	"&min="			+ Min +
	"&max="			+ Max +
	"&legend="		+ Legend +
	"&log_scale="		+ Log_scale +
	"&data_dims="		+ High_res +
	"&sid="			+ sid;
  Update(calc_img);
  if (calc_form.to_data.checked) {
    window.open(url);
//    window.location = url;
    calc_img.src = Not_requested;
  }
  else {
    calc_img.src = url;
  }
  DownloadUrl(url+'&progress=1', true, function(xmlDoc,responseCode) {
    if (responseCode == 200) {
      progStart = new Date();
      var att_data = xmlDoc.getElementsByTagName('prog_data')[0];
      progBar($('progress_bar_progress'),$('progress_percent'),$('progress_bar_text'),
	Number(att_data.getAttribute('time')),
	xmlDoc.getElementsByTagName('prog_txt')[0].childNodes[0].nodeValue);
      calc_progress = true;
    }
  });
}

function calc_cancel() {
  DownloadUrl(Calc_signal_script+sid, false, function(htmlDoc,responseCode) {
    calc_progress = false; progBarStop();
//    alert(htmlDoc);
  });
}

function set_table(num) {
  var html = Clc_script + 'data_table=' + num;

  DownloadUrl(html, false, function(htmlDoc,responseCode) {
    $('calc_data_table').innerHTML = htmlDoc;
    Set_Calc_Img_Position();
  });
}

/////////////////////////////////////////////////////////
///////////////   Paste-in section   ////////////////////

var eqInput;	// = document.calc.equation;

function set_input(inpt) {
  eqInput = inpt;
}

function paste_function(selct) {
  if (!eqInput) eqInput = document.calc.equation;
  insertAtCaret(eqInput,selct.options[selct.selectedIndex].value);
  selct.selectedIndex = 0;
  eqInput.focus();
}

function paste_symbol(a_sym) {
  if (!calc_status) return false;
  if (!eqInput) eqInput = document.calc.equation;
  insertAtCaret(eqInput,a_sym.innerHTML);
  eqInput.focus();
}

function insertAtCaret(obj, text) {
  if(document.selection) {			// IE part
    obj.focus();
    var orig = obj.value.replace(/\r\n/g, "\n");
    var range = document.selection.createRange();

    if(range.parentElement() != obj) return false;

    range.text = text;

    var actual = tmp = obj.value.replace(/\r\n/g, "\n");

    for(var diff = 0; diff < orig.length; diff++) {
      if(orig.charAt(diff) != actual.charAt(diff)) break;
    }

    for(var index=0,start=0; tmp.match(text) && (tmp=tmp.replace(text, "")) && index<=diff; index=start+text.length) {
      start = actual.indexOf(text, index);
    }
  }
  else if(obj.selectionStart) {			// Firefox/Mozilla part
    var start = obj.selectionStart;
    var end   = obj.selectionEnd;

    obj.value = obj.value.substr(0, start) + text + obj.value.substr(end, obj.value.length);
  }

  if(start == null) {
    var start = 0;
    obj.value = obj.value.substr(0, start) + text + obj.value.substr(end, obj.value.length);
  }

  setCaretTo(obj, start + text.length);
}

function setCaretTo(obj, pos) {
  if(obj.createTextRange) {
    var range = obj.createTextRange();
    range.move('character', pos);
    range.select();
  }
  else if(obj.selectionStart) {
    obj.focus();
    obj.setSelectionRange(pos, pos);
  }
}

/////////////////////////////////////////////////////////
///////////////   Progress Bar Section   ////////////////

var progStart,progTime,progTimeout,progCount = 0;
var progNote = '';
var PROGRESS,PROGRESS_BAR,PROGRESS_PCNT,PROGRESS_TEXT;

function progBar(elem_bar,elem_pcnt,elem_text,runTime,note) {
  PROGRESS_BAR	= elem_bar;
  PROGRESS_PCNT	= elem_pcnt;
  PROGRESS_TEXT	= elem_text;
  progTime	= runTime*1000;		// milliseconds
  progNote	= note;

  PROGRESS_TEXT.innerHTML="&nbsp;";
  PROGRESS_PCNT.innerHTML="&nbsp;";
  PROGRESS_BAR.style.width=0;
  PROGRESS.style.visibility = "visible";
  progBarRun();
}

function progBarRun() {
  var prog_step = 200;

  if (++progCount >= 5000/prog_step) {
    progCount = 0;
    DownloadUrl(Calc_signal_script+sid+'&update=1', false, function(htmlDoc,responseCode) {
      if (responseCode == 200) {
	var array = htmlDoc.split("\t");
	progNote = array[0];
	progTime = Number(array[1])*1000;
      }
    });
  }
  var progress = ((new Date)-progStart)/progTime;

  if (progress <= 1.0) {
    clearTimeout(progTimeout);

    if (PROGRESS_BAR.style.width > 40) { PROGRESS_PCNT.innerHTML = parseInt(progress*100)+"%"; }
    var waitTime = parseInt((1-progress)*progTime/1000);
    var waitMin  = parseInt(waitTime/60);
    var waitSec  = parseInt(waitTime-waitMin*60);
    waitTime = ' '+(waitMin?waitMin+' min ':'')+waitSec+' sec';

    PROGRESS_TEXT.innerHTML = progNote + waitTime;
    PROGRESS_BAR.style.width = (PROGRESS.style.width.replace(/px/,'')-20)*progress+"px";

    progTimeout = setTimeout("progBarRun();", prog_step);
  }
  else { progBarStop(); }
}

function progBarStop() {
  if (Aname == "netscape" || document.calc.to_data.checked) {calc_progress = false; progTime = true; }	// This is for Safari and data requests

  if (progTime) {
    PROGRESS.style.visibility = "hidden";
    clearTimeout(progTimeout);
    progTime,progCount = 0;
  }

  if (calc_progress == true) {
    var msg = 'Seems more time needed... Wait few seconds';
    progStart = new Date();
    progBar(PROGRESS_BAR,PROGRESS_PCNT,PROGRESS_TEXT,10,msg)
  }
}

/////////////////////////////////////////////////////////
///////////////   Map Options Section   ////////////////
var calcMapOptStatus = [false,false,false];
var calcMapOptColor  = ["#FFF0F0","pink"];
var expandImg = [new Image(14,14),new Image(14,14)];
expandImg[0].src = "/images/icons/category_collapsed.gif";
expandImg[1].src = "/images/icons/category_expanded.gif";

function calcMapOptions(ind) {
  for (var i=0; i<calcMapOptElem.length; i++) {
    if (i != ind) {
      calcMapOptElem[i].style.visibility = "hidden";
      calcMapOptStatus[i] = false;
      calcMapOptTD[i].style.backgroundColor = calcMapOptColor[0];
      calcMapOptImg[i].src = expandImg[0].src;
    }
  }

  if (calcMapOptStatus[ind]) {
    calcMapOptStatus[ind] = false;
    elem_td.style.width = "1px";
    calcMapOptElem[ind].style.visibility = "hidden";
    calcMapOptTD[ind].style.backgroundColor = calcMapOptColor[0];
    calcMapOptImg[ind].src = expandImg[0].src;
  }
  else {
    calcMapOptStatus[ind] = true;
    elem_td.style.width = "260px";
    calcMapOptElem[ind].style.visibility = "visible";
    calcMapOptTD[ind].style.backgroundColor = calcMapOptColor[1];
    calcMapOptImg[ind].src = expandImg[1].src;
  }
}
