//======================================================================================
// utility.js
//   14-JUL-2005 Mark Carson
//--------------------------------------------------------------------------------------
// 
// centerWindow()
// clearCookie(name)
// clearCookiesByPrefix(prefix)
// getCookie(name)
// getEventElement (event) 
// getEventX (event)
// getEventY (event) 
// getParam(url, param)
// getParams(url, param)
// getWindowHeight()
// getWindowWidth()
// isIE()
// paramReplace (url, attr, value)
// popup(url, windowName, width, height, center) 
// relativeURL (url)
// removeSuffix (str, suffix)
// setCookie(name, value)
// showCookiesByPrefix(prefix)
// submitOnEnter(e)
// trim (source)
// urlGetServer (url)
// 
//======================================================================================

function extractNumber(source) { // useful for getting values from DOM style attrs
  var target = "";
  for (var i = 0; i < source.length; i++) {
     switch (source.charAt(i)) {
	   case '0': case '1': case '2': case '3': case '4': case '5':
	   case '6': case '7': case '8': case '9':
	   case '-': case '.':
	     target += source.charAt(i);
		 break;
	 } // end switch
  } // end for
  var value = 0;
  if (target != "") {
    try { value =  new Number (target); }
	catch (err) { value = 0; }
  }
  return value;	
}	
//--------------------------------------------------------------------------------------

function isBlank(id) {
  var obj = document.getElementById(id);
  if (!obj)
    return true;
  obj.value = trim(obj.value);
  if (obj.value == "")
    return true;
  else
    return false;
}			
//======================================================================================
 
function setCheckboxValue (obj, value) {
  if (!obj || !value || value == "")
    return;
  var valueArray = value.split(",");
  for (var v = 0; v < valueArray.length; v++) {
    for (var i = 0; i < obj.length; i++) {
      if (valueArray[v] == obj[i].value) {
	    obj[i].checked = true;
		break;
	  }
	}  
  }
}
//======================================================================================
 
function getCheckboxValue (obj) {
  //alert("checkboxValue(" + obj + ")\nobj.length=" + obj.length);
  var target = "";
  for (var i = 0; obj && i < obj.length; i++) {
    if (obj[i].checked) {
	  if (target != "")
	    target +=",";
	  target += obj[i].value;	
	}  
  }
  return target;	
}
//======================================================================================

function x_floaterShow (e, text) {
  if (!isIE()) {
    document.captureEvents(Event.MOUSEMOVE);
  }	
  var floaterDiv = document.getElementById("floaterDiv");
  if (!floaterDiv) {
    floaterDiv = document.createElement("DIV");
    floaterDiv.id = "floaterDiv";
	floaterDiv.className = "floater";
    floaterDiv.onmouseout = floaterHide;
	document.body.appendChild(floaterDiv);
  }	
  if (isIE()) {
    left = event.clientX + 2;
    top = event.clientY - 2;
  }
  else {
    document.captureEvents(Event.MOUSEMOVE);
     left = e.pageX + 2;
     top = e.pageY - 2;	  
  }
  floaterDiv.innerHTML = text; // + "<p>left=" + left + "<br/>top=" + top + "<br/>screen.height=" + screen.height + "<br/>getWindowHeight=" + getWindowHeight();
  floaterDiv.style.left = left;
  floaterDiv.style.top = top;
  //floaterDiv.style.width = width;
  //floaterDiv.style.height = height;
  floaterDiv.style.zIndex = 1000;
  floaterDiv.style.display = "";
}  	
//------------------------------------------------------------------------------

function x_floaterHide () {
  var floaterDiv = document.getElementById("floaterDiv");
  if (!floaterDiv) 
    return;
  floaterDiv.style.display = "none";
}
//------------------------------------------------------------------------------
 
function popup(url, windowName, width, height, center) {
  var left = "";
  var top  = "";
  if (center) {
    left = ",left=" + ((screen.width - width) / 2);
    top  = ",top=" + ((screen.height - height) / 2);
  }
  var win = window.open (url, windowName, "width=" + width + ",height=" + height + left + top + ",resizable=yes, scrollbars=yes");
  win.focus();
}
//======================================================================================

function setSelected (id, value) {
  //alert("setSelected('" + id + "','" + value + "');");
  var obj = document.getElementById(id);
  if (!obj || !obj.options) {
    //alert("setSelected('" + id + "','" + value + "')\nobject not found.");
    return;
  }	
  for (var i = 0; i < obj.options.length; i++) {
    if (obj.options[i].value == value) {
	  obj.options[i].selected = true;
      //alert("setSelected('" + id + "','" + value + "');\nset item #" + i);
	  return;
	}  
  }	
  //alert("setSelected('" + id + "','" + value + "');\nNothing set");
}
//======================================================================================

function setChecked (id, valueArray) {
  //alert("setChecked('" + id + "',valueArray);");
  var obj = eval("document.forms[0]." + id);
  if (!obj) {
    //alert("setChecked('" + id + "',valueArray)\nobject not found.");
    return;
  }	
  //alert("setChecked('" + id + "',valueArray)\nobj.length=" + obj.length);
  for (var i = 0; i < obj.length; i++) {
    for (var v = 0; v < valueArray.length; v++) {
      //alert("setChecked()\nobj[" + i + "].value=" + obj[i].value + "\nvalueArray[" + v + "]=" + valueArray[v]);
      if (obj[i].value == valueArray[v]) {
	    obj[i].checked = true;
        //alert("setChecked('" + id + "','" + valueArray[v] + "');\nset item #" + i + " with value #" + v);
	  }	
	}  
  }	
}
//------------------------------------------------------------------------------
 
function submitOnEnter(e) {  // Submits the first form ([0]) on Enter/Return keypress.
                             // e is event object passed from function invocation.
  var characterCode;
  if (e && e.which)            // Netscape 4 test
    characterCode = e.which;   // character code is contained in NN4's which property
  else 
    characterCode = e.keyCode; //character code is contained in IE's keyCode property
  switch (characterCode) {
    case 13: //if generated character code is equal to ascii 13 (Carriage Return key)
      if (submitChecks(document.forms[0])) 
        document.forms[0].submit(); //submit the first form
      return false;
    default:
      return true;
  }
} 
//------------------------------------------------------------------------------
 
function clearCookiesByPrefix(prefix) { 
  if (isIE()) {
    alert("Cookie clearing is not supported in Internet Explorer.");
    return;
  }
  if (!confirm("Confirm you want to clear your browser cookies?"))
    return;
  //alert("clearCookiesByPrefix('" + prefix +")");
  var cookies;
  if (document.cookie.indexOf("&") >= 0)
    cookies = document.cookie.split("&");
  else
    cookies = document.cookie.split(";");
  //alert("document.cookie=" + document.cookie + "\n\ncookies.length=" + cookies.length);
  if (!cookies) {
    var attrValue = document.cookie.split("=");
    //alert("Sole cookie=" + document.cookie);
    if (trim(attrValue[0]).indexOf(prefix) == 0) {
      //alert("Clearing sole cookie: " + attrValue[0]);
      clearCookie(attrValue[0]);
    }
    return;
  }
  var arrayPrefix = prefix.split(",");
  for (var i = 0 ; i < cookies.length; i++) {
   // alert("cookies[" + i + "]=" + cookies[i]);
    var attrValue = cookies[i].split("=");
    for (var p = 0 ; p < arrayPrefix.length; p++) {
      //alert("arrayPrefix[" + p + "]=" + arrayPrefix[p]);
      if (trim(attrValue[0]).indexOf(arrayPrefix[p]) == 0) {
        //alert("Clearing cookie: ]" + trim(attrValue[0]) + "[");
        clearCookie(trim(attrValue[0]));
      }
    }
  }
}
//--------------------------------------------------------------------------------------
 
function showCookiesByPrefix(prefix) { 
  var allCookies = "";
  var arrayPrefix = prefix.split(",");
  for (var i = 0 ; i < arrayPrefix.length; i++) {
    var theseCookies = getCookiesByPrefix(arrayPrefix[i]);
    //alert("showCookiesByPrefix('" + prefix + "')\narrayPrefix[" + i + "]=" + arrayPrefix[i] + "\n\ntheseCookies=" + theseCookies);
    if (theseCookies && theseCookies != "") {
      if (allCookies!= "")
        allCookies += ", ";
      allCookies += theseCookies;
    }
  }
  alert("Document Cookies:" + allCookies);
}
//--------------------------------------------------------------------------------------
 
function getCookiesByPrefix(prefix) { 
  //alert("document.cookie=" + document.cookie);
  var cookies;
  if (document.cookie.indexOf("&") >= 0)
    cookies = document.cookie.split("&");
  else
    cookies = document.cookie.split(";");
  if (!cookies) {
    //alert(document.cookie);
    return "";
  }
  var str = ""; // (" + cookies.length + ") for '" + prefix + "'"; 
  //alert("getCookiesByPrefix('" + prefix + "')");
  for (var i = 0 ; i < cookies.length; i++) {
    var attrValue = cookies[i].split("=");
    if (trim(attrValue[0]).indexOf(prefix) == 0) {
      str += "\n" + trim(cookies[i]); 
    }
  }
  return str;
}
//--------------------------------------------------------------------------------------
 
function getCookie(name) { 
  var cookie = document.cookie;
  var index = cookie.indexOf(name + "=");
  if (index < 0)
    return null;
  index = cookie.indexOf ("=", index) + 1;
  var endStr = cookie.indexOf(";", index);
  if (endStr < 0)
    endStr = cookie.length;
  return unescape (cookie.substring(index, endStr));
}
//--------------------------------------------------------------------------------------
 
function setCookie(name, value) { 
  if (!name || name == "")
    return;
  var zero = 0;
  if (value == zero) 
    value = "0";
  var now = new Date();
  var expires = new Date(now.getTime() + (90 * 24 * 60 * 60 * 1000)); // expires in 90 days
  if (value != null && value != "")
    document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() + " path=/";
}
//--------------------------------------------------------------------------------------
 
function clearCookie(name) { 
  var cookieDate = new Date();
  cookieDate.setTime (cookieDate.getTime() - 1);
  document.cookie = name += "=; expires=" + cookieDate.toGMTString();
}
//--------------------------------------------------------------------------------------
 
function urlGetServer (url) {
  var server;
  var idx = url.indexOf("://");
  if (idx >= 0)  // protocol (such as "http://" or "https://") detected, server name implied
    server = url.substring(idx + 3);
  else
    server = url;
  idx = server.indexOf("/");
  if (idx == 0)
    return "";
  if (idx > 0)
    server = server.substring (0,idx);
  return server;
}
//--------------------------------------------------------------------------------------
 
function relativeURL (url) {
  var urlServer = urlGetServer(url);
  if (urlServer == "") 
    return url;
  var docServer = urlGetServer(document.location.href);
  var relURL = url;
  if (docServer.toUpperCase() == urlServer.toUpperCase()) 
    relURL = url.substring(url.indexOf(urlServer) + urlServer.length);
  /*
  alert("relativeURL()\nurl=" + url + 
       "\ndocument.location.href=" + document.location.href + 
       "\nurlServer=" + urlServer + 
       "\ndocServer=" + docServer +
       "\nrelURL=" + relURL);
  */
  return relURL;
}
//--------------------------------------------------------------------------------------
// paramReplace()  Replaces existing query string attribute's value with a specified
//                 value, or adds the attribute/value to the query string if the 
//                 attribute is not part of the existing query string.
//   Inputs: url - typically document.location.href
//           attr - attribute name
//           value - replacement value
//   Return: string (url with replaced/appended new query string value)
//--------------------------------------------------------------------------------------
 
function paramReplace (url, attr, value) {
  //alert("paramReplace()\nurl=" + url + "\nattr=" + attr + "\nvalue=" + value);
  var qm = url.indexOf("?");                //document.location.href.indexOf("?");
  var eq;
  if (qm >= 0) {
    queryString = url.substring(qm + 1);    //document.location.href.substring(qm + 1);
    resource = url.substring(0, qm);        //document.location.href.substring(0, qm);
  }
  else {
    queryString = "";
    resource = document.location.href;
  }
  //alert("paramReplace(" + attr + ", " + value + ") - Before\n\nresource = " + resource + "\n\nqueryString = " + queryString);
 
  var newQueryString = "";
  var replaced = false;
  var paramArray = queryString.split("&");
  var attrArray  = new Array();
  var valueArray = new Array();
 
  //--- Parsing pass ---
  for (var i = 0 ; i < paramArray.length; i++) {
    eq = paramArray[i].indexOf("=");
    if (eq > 0) {
      attrArray[i]  = paramArray[i].substring(0,eq);
      valueArray[i] = paramArray[i].substring(eq + 1);
    }
    else {
      attrArray[i]  = paramArray[i];
      valueArray[i] = "";
    }
  }
 
  //--- Rebuilding pass ---
  var qmAmp;
  var replaced = false;
  for (var i = 0 ; i < paramArray.length; i++) {
    if (i == 0)
      qmAmp = "?";
    else
      qmAmp = "&";
    if (attrArray[i].toLowerCase() == attr.toLowerCase()) {
      newQueryString += qmAmp + attr;
      if (value && value != "")
        newQueryString += "=" + value;
	  else	
        newQueryString += "=";
      replaced = true;
    }
    else {
      newQueryString += qmAmp + attrArray[i];
      if (valueArray[i] != "")
        newQueryString += "=" + valueArray[i];
    }
  }
    
  if (!replaced) {
    if (newQueryString == "" || newQueryString == "?")
      newQueryString = "?" + attr;
    else
      newQueryString += "&" + attr;
    if (value && value != "")
      newQueryString += "=" + value;
  }
  var returnValue = resource + newQueryString;
  //alert("paramReplace()\nreturnValue=[" + returnValue + "]");
  return returnValue;
}
//-----------------------------------------------------------------------------
 
function trim (source) {
  if (!source || source == "")
    return source;
  var target = "";
  var first = -1 ;
  var last  = -1;
  for (var i = 0; i < source.length; i++) {
    switch (source.charCodeAt(i)) {
      case   7: // Tab
      case  10: // Line Feed
      case  13: // Carriage Return
      case  32: // Space
        break;
      default:
        if (first < 0)
          first = i;
        last = i;
    }
  }
  if (first >= 0)
    target = source.substring(first, last + 1);
  //alert("trim(" + source + ")\nfirst=" + first + "\nlast=" + last + "\nsource.length=" + source.length + "\ntarget=[" + target + "]\ntarget.length=" + target.length);
  return target;
}
//-----------------------------------------------------------------------------
 
function removeSuffix (str, suffix) {
  var pos = str.lastIndexOf(suffix);
  if (pos < 0)
    return str;
  else
    return str.substring(0,pos);
}
//-----------------------------------------------------------------------------
 
function getWindowWidth() {
  if (parseInt(navigator.appVersion) > 3) {
    if (navigator.appName=="Netscape") 
      return window.innerWidth;
  }
  if (navigator.appName.indexOf("Microsoft")!= -1) {
    return document.body.offsetWidth;
  }
}
//-----------------------------------------------------------------------------
 
function getWindowHeight() {
  if (parseInt(navigator.appVersion) > 3) {
    if (navigator.appName=="Netscape") 
      return window.innerHeight;
  }
  if (navigator.appName.indexOf("Microsoft")!= -1) {
    return document.body.offsetHeight;
  }
}
//--------------------------------------------------------------------------------------
// getParam(url, param) 
//   Generic attribute/value query string decoder
//   Returns a string value of the first/only named attribute
//--------------------------------------------------------------------------------------
 
function getParam(url, param) { //--- Generic attribute/value query string decoder
  urlArray = url.split("?")
  if (urlArray.length > 1) {
    var queryString = urlArray[1]; 
    var qsArray = queryString.split("&");
    for (var i = 0 ; i < qsArray.length; i++) {
      attrValue = qsArray[i];
      avArray = attrValue.split("=");
      if (avArray[0].toLowerCase() == param.toLowerCase()) {       
        if (avArray.length < 2)
		  return "";
		else
          return avArray[1];
      }  
    }
  }
  return "";
}  
//--------------------------------------------------------------------------------------
// getParams(url, param)
//   Multiple attribute/value query string decoder
//   Returns an array of values of the named attribute
//   Eaxmple "fubar?snafu=big&snafu=total" would return an array of 2 values for "snafu"
//--------------------------------------------------------------------------------------
 
function getParams(url, param) { 
  var valueArray = new Array();
  urlArray = url.split("?")
  if (urlArray.length > 1) {
    var queryString = urlArray[1]; 
    var qsArray = queryString.split("&");
    for (var i = 0 ; i < qsArray.length; i++) {
      attrValue = qsArray[i];
      avArray = attrValue.split("=");
      if (avArray[0].toLowerCase() == param.toLowerCase()) {       
        valueArray[valueArray.length] = avArray[1];
      }  
    }
  }
  return valueArray;
}  
//-----------------------------------------------------------------------------
 
function getEventX (event) {
  if (isIE())
    return window.event.x;
  else
    return event.clientX;
}     
//-----------------------------------------------------------------------------
 
function getEventY (event) {
  if (isIE())
    return window.event.y;
  else
    return event.clientY;
}     
//-----------------------------------------------------------------------------
 
function getEventElement (event) {
  if (isIE())
    return window.event.srcElement;
  else
    return (event.target.tagName ? event.target : event.target.parentNode);
}     
//------------------------------------------------------------------------------
 
var _browser = null;
 
function isIE() {
  if (!_browser) {
    if (document.all)
      _browser = "IE";
    else
      _browser = "W3C";
  }      
  if (_browser == "IE")
    return true;
  else
    return false;
}        
//-----------------------------------------------------------------------------
 
function centerWindow() {
  var left = (screen.width - getWindowWidth()) / 2;
  if (left < 0)
    left = 0;
  var top  = (screen.height - getWindowHeight()) / 2;
  if (top < 0)
    top = 0;
  window.moveTo(left, top);
}
//-----------------------------------------------------------------------------
 
