function GetXmlHttpObject() {
  var xmlhttp = null;
  if(window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  return xmlhttp;
}

function ajax_request(url) {
  var xmlhttp = GetXmlHttpObject();
  xmlhttp.open("GET", url, false);
  xmlhttp.setRequestHeader('User-Agent', navigator.userAgent);
  xmlhttp.send(null);
  var response = xmlhttp.responseText == null ? '' : xmlhttp.responseText;
  if(response.substr(0, 1) == "\n") {
    response = response.substr(1);
  }
  return response;
}

function ajax_request_post(url, value) {
  var xmlhttp = GetXmlHttpObject();
  xmlhttp.open("POST", url, false);
  xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xmlhttp.setRequestHeader('User-Agent', navigator.userAgent);
  xmlhttp.send(value);
  var response = xmlhttp.responseText == null ? '' : xmlhttp.responseText;
  if(response.substr(0, 1) == "\n") {
    response = response.substr(1);
  }
  return response;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

var $ = MM_findObj;

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function format_number(num, precision) {
  return Number(num).toFixed(precision);
}

function set_field_value(field, val) {
  var obj = MM_findObj(field);
  if(obj) {
    if(obj.type == null) {
      obj.innerHTML = val;
    } else if(obj.type == "text" || obj.type == "hidden" || obj.type == "textarea") {
      obj.value = val;
    } else if(obj.type.substr(0, 6) == "select") {
      for(var i=0;i<obj.options.length;i++) {
        if(obj.options[i].value == val) {
          obj.options[i].selected = true;
          break;
        }
      }
    }
  }
}

function get_field_value(field) {
  var obj = $(field);
  if(obj) {
    if(obj.type == null) {
      return obj.innerHTML;
    } else if(obj.type == "text" || obj.type == "hidden" || obj.type == "textarea" || obj.type == "password") {
      return obj.value;
    } else if(obj.type.substr(0, 6) == "select") {
      if(obj.options.length) {
        return obj.options[obj.selectedIndex].value;
      }
    }
  }
  return null;
}

function myvoid() {
  return;
}

/*
function draw_table(divname, tableattr, headertype, columns, tabledata, whichones, rowattr_field) {
  var div = MM_findObj(divname);
  while(div.firstChild) {
    div.removeChild(div.firstChild);
  }
  var table = document.createElement('table');
  for(var i=0;i<tableattr.length;i++) {
    table.setAttribute(tableattr[i][0], tableattr[i][1]);
  }
  div.appendChild(table);
  if(headertype) {
    var tr = document.createElement('tr');
    if(headertype == 1) {
      tr.setAttribute('bgcolor', '#59186F');
    }
    table.appendChild(tr);
    for(var i=0;i<columns.length;i++) {
      var parts = columns[i];
      var td = document.createElement('td');
      if(headertype == 1) {
        td.setAttribute('class', 'FieldSetHeader');
      } else if(headertype == 2) {
        td.setAttribute('class', 'BodyCopyBold');
        td.setAttribute('style', 'text-decoration: underline;');
      } else {
        td.setAttribute('class', 'BodyCopyBold');
      }
      if(parts[1]) {
        td.setAttribute('width', parts[1]);
      }
      if(parts[2]) {
        td.setAttribute('align', parts[2]);
      }
      var tdtext = document.createTextNode(parts[0]);
      td.appendChild(tdtext);
      tr.appendChild(td);
    }
  }
  var alternate = 0;
  if(whichones == null) {
    whichones = Array();
    for(var i=0;i<tabledata[0].length;i++) {
      whichones.push(i);
    }
  }
  for(var i=0;i<tabledata.length;i++) {
    var parts = tabledata[i];
    if(parts.length < whichones.length) continue;
    tr = document.createElement('tr');
//    tr.setAttribute('height', '31');
    if(alternate) {
      tr.setAttribute('class', 'AlternateField');
    }
    if(rowattr_field != null && parts[rowattr_field]) {
      for(var j=0;j<parts[rowattr_field].length;j++) {
        tr.setAttribute(parts[rowattr_field][j][0], parts[rowattr_field][j][1]);
      }
    }
    table.appendChild(tr);
    for(var j=0;j<whichones.length;j++) {
      td = document.createElement('td')
      td.setAttribute('width', columns[j][1]);
      td.setAttribute('style', 'vertical-align: top;');
      if(columns[j][2]) {
        td.setAttribute('align', columns[j][2]);
      }
      if(columns[j][3]) {
        td.setAttribute('class', columns[j][3]);
      }
      if(parts[whichones[j]].substr) { // Is this a string?
        if(columns[j][4]) {
          var newtext = Number(parts[whichones[j]]).toFixed(columns[j][4]);
        } else {
          var newtext = parts[whichones[j]];
        }
        tdtext = document.createTextNode(newtext);
        td.appendChild(tdtext);
      } else {
        td.appendChild(parts[whichones[j]]);
      }
      tr.appendChild(td);
    }
    alternate = !alternate;
  }
}

function create_element(etype, attr, childtext) {
  var element = document.createElement(etype);
  for(var i=0;i<attr.length;i++) {
    element.setAttribute(attr[i][0], attr[i][1]);
  }
  if(childtext) {
    element.appendChild(document.createTextNode(childtext));
  }
  return element;
}

function create_link(attr, linktext) {
  return create_element('a', attr, linktext);
}

function format_phone_number(phonenumber) {
  var phone = phonenumber.replace(/-/, "");
  if(phone.length == 10) {
    phone = phone.substr(0, 3) + "-" + phone.substr(3, 3) + "-" + phone.substr(6);
    return phone;
  } else {
    return phonenumber;
  }
}

function format_date(date) {
  var dash_re = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
  var slash_re = /^(\d{1,2})\/(\d{1,2})\/(\d{1,2})$/;
  var newdate;
  var results = date.match(slash_re);
  if(results != null) {
    newdate = '20' + results[3] + '-' + (results[1].length == 1 ? '0' : '') + results[1] + '-' + (results[2].length == 1 ? '0' : '') + results[2];
  } else {
    results = date.match(dash_re);
    if(results == null) {
      return null;
    }
    newdate = results[1] + '-' + (results[2].length == 1 ? '0' : '') + results[2] + '-' + (results[3].length == 1 ? '0' : '') + results[3];
  }
  return newdate;
}

function object_type(object) {
    var s = typeof object;
    if(s === 'object') {
      if(object) {
        if(object instanceof Array) {
          s = 'array';
        }
      } else {
        s = 'null';
      }
    }
    return s;
}

function dump_variable(name, val, indent) {
  if(indent == null) indent = 0;
  var indent_str = '';
  for(var i=0;i<indent;i++) {
    indent_str += ' ';
  }
  var objtype = object_type(val);
  switch(objtype) {
    case "string":
    case "number":
    case "boolean":
      return indent_str + '[' + name + '] = ' + val + '\n';
//    case "object":
//      return indent_str + '[' + name + '] = ' + val.toString() + '\n';
    case "null":
    case "undefined":
      return indent_str + '[' + name + '] = ' + objtype + '\n';
    case "array":
      var array_dump = indent_str + '[' + name + '] = Array(\n';
      for(var i=0;i<val.length;i++) {
        array_dump += dump_variable(i, val[i], indent + 8);
      }
      if(!val.length) {
        array_dump = array_dump.substr(0, array_dump.length - 1) + ')\n';
      } else {
        array_dump += indent_str + ')\n';
      }
      return array_dump;
    default:
      return indent_str + '[' + name + '] = [' + objtype + ']\n';
//      return '';
  }
}

function dump_variables() {
  var dump = '';
  for(x in window) {
    dump += dump_variable(x, window[x]);
  }
  return dump;
}

function handle_error(msg, url, linenumber) {
  var doclines = document.body.innerHTML.split("\n");
  var errcode = "";
  for(var i=16;i>2;i--) {
    errcode += (linenumber - i + 9) + "\t" + doclines[linenumber-i] + "\n";
  }
  ajax_request_post("/common/error_ajax.php", "msg=" + escape(msg) + "&url=" + escape(url) + "&href=" + escape(location.href) + "&linenumber=" + linenumber + "&errcode=" + escape(errcode) + "&useragent=" + escape(navigator.userAgent) + "&variables=" + dump_variables());
  alert("An error has occured with this application that may prevent you from continuing. Andrew has been notified about the details of the error. If you cannot continue in this program, please call Andrew and let him know. Thanks.");
}

window.onerror = handle_error

function default_help(param1, param2) {
  alert(param1 + ", " + param2);
  return false;
}

var key_all = -1;
var key_f1 = 112;
var key_f2 = 113;
var key_f3 = 114;
var key_f4 = 115;
var key_f5 = 116;
var key_f6 = 117;
var key_f7 = 118;
var key_f8 = 119;
var key_f9 = 120;
var key_tab = 9;
var key_enter = 13;
var key_esc = 27;
var key_up = 38;
var key_down = 40;
var key_pgup = 33;
var key_pgdown = 34;

var global_key_bindings = Array(
  Array(
//    Array(key_f1, default_help, Array('param1', 'param2'))
  )
);

function add_key_binding(key, handler, userargs) {
  if(userargs == null) userargs = Array();
  global_key_bindings[global_key_bindings.length-1].push(Array(key, handler, userargs));
}

function add_key_bindings_set() {
  global_key_bindings.push(Array());
}

function remove_key_bindings_set() {
  global_key_bindings.pop();
}

function global_keypress_handler(e) {
  var keycode = e.keyCode || String.fromCharCode(e.charCode).toUpperCase();
  var bindings = global_key_bindings[global_key_bindings.length-1];
  for(var i=0;i<bindings.length;i++) {
    var key = bindings[i][0];
    if(key == keycode || key == key_all) {
      var func = bindings[i][1];
      var userargs = bindings[i][2];
      if(key == key_all) userargs.unshift(keycode);
      var returnval = func.apply(this, userargs);
      if(returnval == false || returnval == null) return false;
      break;
    }
  }
  return true;
}

document.onkeypress = global_keypress_handler;
*/