// NBER self-made Ajax script
// 2007 July Version

var HTTP_OK = 200;
var READY_STATUS_COMPLETE = 4;

var agt=navigator.userAgent.toLowerCase();
var is_ie=(agt.indexOf("msie")!=-1 && document.all);
var is_ie5=(agt.indexOf("msie 5")!=-1 && document.all);
var is_ie6=(agt.indexOf("msie 6")!=-1 && document.all);
var is_ie7=(agt.indexOf("msie 7")!=-1 && document.all);
var is_safari=(agt.indexOf("safari")!=-1);
var is_nav=!is_ie && !is_safari && (agt.indexOf("mozilla")!=-1);
var IE = is_ie;
var NS5pl = is_nav;

function XmlHttpCreate(){
  var xmlhttp=null;
  if(is_ie){
    var control=(is_ie5)?"Microsoft.XMLHTTP":"Msxml2.XMLHTTP";
    try{
      xmlhttp=new ActiveXObject(control);
    }
    catch(e){
      alert("You need to enable active scripting and activeX controls.");
    }
  }
  else {  // Firefox, Safari
    xmlhttp=new XMLHttpRequest();
    if(!xmlhttp){
      alert("XMLHttpRequest is not supported on this browser.");
    }
    if (xmlhttp.overrideMimeType) {
      xmlhttp.overrideMimeType('text/plain');
       //necessary to send non-xml data back to firefox
    }

  }
  return xmlhttp;
}


function GetElement(win, id){  return win.document.getElementById(id); }

function SetInnerHTML(win, id, html){
  try{
    var el = GetElement(win,id);
    el.innerHTML=html;
  }
  catch(ex){
    alert("Cannot set inner HTML: "+id+" Exception: "+ex.description);
  }
}

function GetInnerHTML(win, id){
  try{
    return GetElement(win,id).innerHTML;
  }
  catch(ex){
    alert("Cannot get inner HTML: "+id+" Exception: "+ex.description);
  }
}

function XmlSend(xmlhttp, url, handler, async, method, data) {
  if(async) {
    xmlhttp.onreadystatechange=handler;
  }
  if (!method) { method = "GET" }
  xmlhttp.open(method,url,async);
  if (method == "POST") {
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send(data);
  } else {
    xmlhttp.send(null);
  }
  if(!async) {
    handler();
  }
}


function XmlHttpGET(xmlhttp, url, handler)
  { XmlSend(xmlhttp, url, handler, true, "GET", null) }

function XmlHttpGETWait(xmlhttp, url, handler) // wait for results for server to return
  { XmlSend(xmlhttp, url, handler, false, "GET", null) }

function XmlHttpPOST(xmlhttp, url, data, handler)
  { XmlSend(xmlhttp, url, handler, true, "POST", data) }

function XmlHttpPOSTWait(xmlhttp, url, data, handler)  
  { XmlSend(xmlhttp, url, handler, false, "POST", data) }

function ValidResponse(xmlhttp) {
  if (xmlhttp.readyState==READY_STATUS_COMPLETE && xmlhttp.status==HTTP_OK) {
     return 1;
  } else {
     return 0;
  }
}

function changeHandler(xmlhttp, win, id) {
  var handler = function() {
    try{
      if(ValidResponse(xmlhttp)) {
        var replaceText = xmlhttp.responseText;
        SetInnerHTML(win,id,replaceText);
       }
    } catch (ex) {
      alert("Error in changeHandler: "+ex);
    }
  }
  return handler;
}

function evalHandler(xmlhttp) {
  var handler = function() {
    try{
      if(ValidResponse(xmlhttp)) {
        var evalText = xmlhttp.responseText;
        eval(evalText);
      }
    } catch (ex) {
      alert("Error in evalHandler: "+ex);
    }
  }
  return handler;
}

function SendChange(win,id,url) {
  var xmlhttp = XmlHttpCreate();
  var handler = changeHandler(xmlhttp, win,id);
  XmlHttpGET(xmlhttp,url,handler);
}

function SendEval(url) {
  var xmlhttp = XmlHttpCreate();
  var handler = evalHandler(xmlhttp);
  XmlHttpGET(xmlhttp,url,handler);
}

function SendEvalWait(url) {
  var xmlhttp = XmlHttpCreate();
  var handler = evalHandler(xmlhttp);
  XmlHttpGETWait(xmlhttp,url,handler);
}

function SendEvalPOSTWait(url, data) {
  var xmlhttp = XmlHttpCreate();
  var handler = evalHandler(xmlhttp);
  XmlHttpPOSTWait(xmlhttp,url,data,handler);
}

function SendEvalPOST(url, data) {
  var xmlhttp = XmlHttpCreate();
  var handler = evalHandler(xmlhttp);
  XmlHttpPOST(xmlhttp,url,data,handler);
}

var lastValue = "";
var lastChange;
var lastBackground = "";
var errorText = "";

function justActivated(el) {
  setLastValue(el.value);
//  alert(el.value);
}

function setLastValue(newval) {
//  alert(newval);
  lastValue = newval;
}

function EvalElement(callUrl,element) {
//  alert(element.value);
  if (element.value != lastValue) {
    EvalElementChanged(callUrl,element);
  }
}

function EvalElementChanged(callUrl, element) {
    if (lastChange) lastChange.style.backgroundColor = lastBackground 
    lastChange = element;
    lastBackground = element.style.backgroundColor;
    errorText = "";
    if (element.value.length < 1000) {
      var URL = callUrl + "?" + element.id + "=" + encodeURIComponent(element.value);
      SendEval(URL);
    } else {
      var URL = callUrl;
      var data = element.id + "=" + encodeURIComponent(element.value);
      SendEvalPOST(URL,data);
    } 
    ErrorBGChange(element);
    setLastValue(element.value);
}

function ErrorBGChange(element) {
  if (errorText) {
      element.style.backgroundColor = "#ff9900";
  } else {
      element.style.backgroundColor = "#f6ee99";
  }
}

function setErrorText(newText) {
    errorText = newText;
}

function ArrayEval(goUrl, argV) {
  var URL = URLFromArray(goUrl, argV);
  SendEval(URL);
}

function ArrayReplace(goUrl, id, argV) {
  var URL = URLFromArrayOrString(goUrl, argV);
  SendChange(window,id,URL);
}

  
function URLFromArrayOrString(goUrl, argV) {
  var callUrl = "";
  if (argV != null){
    if (typeof(argV) == "string"){
      // single parameter
      callUrl += "?param=" + encodeURIComponent(argV+'') + "";
    } else {
      // assume argV is array of strings
      for( var i=0; i < argV.length; i = i+2 ) {
        callUrl += (callUrl=='') ? '?' : '&';
        callUrl +=  argV[i] + "=" + encodeURIComponent( argV[i+1]+'' );
      }
    }
  } // argV

  var URL = goUrl + callUrl;
  return URL;
}

