//Syntax: x$(ele) || x$(ele, parent)
function x$(e, p)
{
  p = p || document;
  if(typeof(e)=='string') {
    if(p.getElementById) e=p.getElementById(e);
    else if(p.all) e=p.all[e];
    else if (p.layers){
      for (var iLayer = 1; iLayer < p.layers.length; iLayer++) { 
         if(p.layers[iLayer].id == objID) 
            return p.layers[iLayer]; 
      }    
    }else e=null;
  }
  return e;
}


//Syntax: xTag$(tagName[, parentEle])
// xTag$ r4, Copyright 2002-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xTag$(t,p)
{
  var list = null;
  t = t || '*';
  p = p || document;
  if (typeof p.getElementsByTagName != 'undefined') { // DOM1
    list = p.getElementsByTagName(t);
    if (t=='*' && (!list || !list.length)) list = p.all; // IE5 '*' bug
  } else if (p.tags){
    if (t=='*') list = p.tags;
    else list = eval('p.tags.' + t);
  }else { // IE4 object model
    if (t=='*') list = p.all;
    else if (p.all && p.all.tags) list = p.all.tags(t);
  }
  return list || new Array();
}



//Syntax: xClass$(sClsName, oParentEle, sTagName, fnCallback)
// xClass$ r5, Copyright 2002-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xClass$(c, p, t, f)
{
  var r = new Array();
  var re = new RegExp("(^|\\s)"+c+"(\\s|$)");
  var e = xTag$(t,p); // See xml comments.
  for (var i = 0; i < e.length; ++i) {
    var sCName = xGetAttr(e[i], 'class');
    if (re.test(sCName)) {
      r[r.length] = e[i];
      if (f) f(e[i]);
    }
  }
  return r;
}



//Syntax: xHasClass(e, c)
//Returns true if an element has a specified class name
// xHasClass r3, Copyright 2005-2007 Daniel Frechette - modified by Mike Foster
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xHasClass(e, c)
{
  e = x$(e);
  var re = new RegExp("(^|\\s)"+c+"(\\s|$)");
  var sCName = xGetAttr(e, 'class');
  if (!e || sCName=='') return false;
  return re.test(sCName);
}


//Syntax: xAddClass(e, c)
//Adds a class name to an element.
// xAddClass r3, Copyright 2005-2007 Daniel Frechette - modified by Mike Foster
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xAddClass(e, c)
{
  if ((e=x$(e))!=null) {
    var s = '';
    var sCName = xGetAttr(e, 'class');
    if (sCName.length && sCName.charAt(sCName.length - 1) != ' ') {
      s = ' ';
    }
    
    if (!xHasClass(e, c)) {
      sCName += s + c;
      xSetAttr(e, 'class', sCName);
      return true;
    }
  }
  return false;
}


//Syntax:xRemoveClass(e, c)
//Removes a class name from an element
// xRemoveClass r3, Copyright 2005-2007 Daniel Frechette - modified by Mike Foster
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xRemoveClass(e, c)
{ 
  if(!(e=x$(e))) return false;
  
  var sCName = xGetAttr(e, 'class');
  
  sCName = sCName.replace(new RegExp("(^|\\s)"+c+"(\\s|$)",'g'),
    function(str, p1, p2) { return (p1 == ' ' && p2 == ' ') ? ' ' : ''; }
  );
  
  xSetAttr(e, 'class', sCName);
  return true;
}


//Syntax:xAddEventListener(ele, sEventType, fnEventListener, bCapture)
//eleID string or object reference.
//sEventTypeString event type: 'mousemove', 'click', 'resize', etc.
//fnEventListenerReference to the listener function.
//bCaptureBoolean capture event flag.
// xAddEventListener r8, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xAddEventListener(e,eT,eL,cap)
{
  if(!(e=x$(e)))return;
  eT=eT.toLowerCase();
  if(e.addEventListener){
    e.addEventListener(eT,eL,cap||false);
    EventCache.add(e, eT, eL);
  }else if(e.attachEvent){
    e.attachEvent('on'+eT,eL);
    EventCache.add(e, eT, eL);
  }else {
    var o=e['on'+eT];
    e['on'+eT]=typeof o=='function' ? function(v){o(v);eL(v);} : eL;
  }
}



//Syntax: xRemoveEventListener(ele, sEventType, fnEventListener[, bCapture])
//Unregister an event listener previously registered with xAddEventListener.
//eleid string or object reference
//sEventTypestring event type ('mousemove', 'click', 'resize', etc.)
//fnEventListenerreference to the listener function
//bCaptureboolean capture event flag
// xRemoveEventListener r6, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xRemoveEventListener(e,eT,eL,cap)
{
  if(!(e=x$(e)))return;
  eT=eT.toLowerCase();
  if(e.removeEventListener)e.removeEventListener(eT,eL,cap||false);
  else if(e.detachEvent)e.detachEvent('on'+eT,eL);
  else e['on'+eT]=null;
}


/*Cache maintained in order to unhook the event listeners when the window unloads*/
var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();
xAddEventListener(window,'unload',EventCache.flush);


//generic method to stop an event from being propagated or bubbled to the background
function xStopEvent(evt){
    if (!evt) evt = window.event;
    if (evt.stopPropagation) {
        evt.stopPropagation();
    } else {
        evt.cancelBubble = true;
    }
}


//generic method to cancel an event
function xCancelEvent(evt) {
    if (!evt) evt = window.event;
    if (evt.preventDefault) {
        evt.preventDefault();
    } else {
        evt.returnValue = false;
    }
}


//Syntax: xEach(c, f, s)
// xEach r1, Copyright 2006-2007 Daniel Frechette
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

/**
 * Access each element of a collection sequentially (by its numeric index)
 * and do something with it.
 *  c - Array/Obj - A collection of elements
 *  f - Func      - Function to execute for each element.
 *                        Arguments: item, index, number of items
 *  s - Int       - Start index. A number between 0 and collection size - 1. (optional)
 *  return Nothing
 */
function xEach(c, f, s) {
  if (!(isArray(c)))  c = cArray(c);
  
  var l = c.length;
  for (var i=(s || 0); i < l; i++) {
    f(c[i], i, l);
  }
};


//Syntax: xEachUntilReturn(c, f, s) 
// xEachUntilReturn r1, Copyright 2006-2007 Daniel Frechette
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
/**
 * Access each element of a collection sequentially (by its numeric index)
 * and do something with it. Stop when the called function returns a value.
 *   c - Array/Obj - A collection of elements
 *   f - Func      - Function to execute for each element
 *                        Arguments: item, index, number of items
 *   s - Int       - Start index. A number between 0 and collection size - 1. (optional)
 * return Any
 */
function xEachUntilReturn(c, f, s) {
  if (!(isArray(c)))  c = cArray(c);
  
  var r, l = c.length;
  for (var i=(s || 0); i < l; i++) {
    r = f(c[i], i, l);
    if (r !== undefined)
      break;
  }
  return r;
};


/*isArray: accepts an object as parameter and returns boolean indicating whether the input object is an array*/
function isArray(obj) {
   if (!(obj)) return false;
   if (obj.constructor && obj.constructor.toString().indexOf("Array") > -1)
      return true;
   else if ((typeof obj == 'object') && (typeof obj.length != 'undefined'))
      return true;
   else
      return false;
}


/*returns the element as part of the array*/
function cArray(ele){
  var oArr = new Array();
  if (ele)  oArr.push(ele);
  return oArr;
}

/*matches value in array: returns integer indicating the position of the element */
function inArr$(arrayObj, value) {
	var i;
	for (i=0; i < arrayObj.length; i++) {
		if (arrayObj[i] === value) {
			return i;
		}
	}
	return -1;
};


//Syntax: xStyle(sProp, sVal, e1, e2, e3, etc)
//Set any style property for any number of elements.
function xStyle(sProp, sVal)
{
  var i, e;
  for (i = 2; i < arguments.length; ++i) {
    e = x$(arguments[i]);
    if (e.style) {
      try { e.style[sProp] = sVal; }
      catch (err) { e.style[sProp] = ''; } // ???
    }
  }
}



//Syntax: xFirstChild(ele[, tag])
// xFirstChild r4, Copyright 2004-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
function xFirstChild(e,t)
{
  e = x$(e);
  var c = e ? e.firstChild : null;
  while (c) { 
    if (c.nodeType == 1 && (!t || c.nodeName.toLowerCase() == t.toLowerCase())){break;}
    c = c.nextSibling;
  }
   
  return c;
}



//function to get the parent element/tag node at level n
function xParent(e, n, t)
{
  var i = -1;
  var tEle;
  
  if (n < 0)  return;
  
  e = x$(e);
  var c = e ? e.parentNode : null;
  while (c) { 
    if (i == n) break;
    if (c.nodeType == 1 && (!t || c.nodeName.toLowerCase() == t.toLowerCase())){
        i++;
        tEle = c;
    }
    c = c.parentNode;
  }
  
  if (tEle && i==n) return tEle;
   
  return;
}



//function to get the child element/tag node with index n
function xChildAt(e, n, t)
{
  var i = -1;
  var tEle;
  
  if (n < 0)  return;
  
  e = x$(e);
  var c = e ? e.firstChild : null;
  while (c) { 
    if (i == n) break;
    if (c.nodeType == 1 && (!t || c.nodeName.toLowerCase() == t.toLowerCase())){
        i++;
        tEle = c;
    }
    c = c.nextSibling;
  }
  
  if (tEle && i==n) return tEle;
   
  return;
}


//function to get the child elements (with give tag if specified) with index greater than [n]
function xChildAfterN(e, n, t)
{
  var i = -1;
  var tEle = [];
  
  if (n < -1)  return;
  
  e = x$(e);
  var c = e ? e.firstChild : null;
  while (c) { 
    if (c.nodeType == 1){
        i++;
        if ((i > n) && (!t || c.nodeName.toLowerCase() == t.toLowerCase())) tEle.push(c);
    }
    c = c.nextSibling;
  }
  
  return tEle;
}


//function to get the child elements (with give tag if specified) with index lesser than [n]
function xChildBeforeN(e, n, t)
{
  var i = -1;
  var tEle = [];
  
  if (n <= 0)  return;
  
  e = x$(e);
  var c = e ? e.firstChild : null;
  while (c) { 
    if ((i+1) == n) break;
    if (c.nodeType == 1 ){
        i++;
        if (!t || c.nodeName.toLowerCase() == t.toLowerCase()) tEle.push(c);
    }
    c = c.nextSibling;
  }
  
  return tEle;
}

//Syntax: xToggleClass(e, c)
//Toggles a class name on or off for an element
// xToggleClass r2, Copyright 2005-2007 Daniel Frechette
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
/* Added by DF, 2005-10-11
 * Toggles a class name on or off for an element
 */
function xToggleClass(e, c) {
  if (!(e = x$(e)))
    return null;  
  
  if (xHasClass(e, c)) {
    if (!xRemoveClass(e, c)) return false;
  }else{
    if (!xAddClass(e, c)) return false;
  }
  
  return true;
}


/*generic function for browser sniffing*/
function browSniff( ) {
   if (browSniff.sniffed)  return;
    var n = navigator.userAgent.toLowerCase();
   
    // Figure out what browser is being used.
    // Since Opera often identifies itself as IE,
    // eliminate it from the match.
    if (/msie/.test(n) && !/opera/.test(n)) {
        browSniff.browser = "IE";
    // Single out Safari.
    } else if (/safari/.test(n)) {
        browSniff.browser = "Safari";
    // Test for Firefox.
    } else if (/firefox/.test(n)) {
        browSniff.browser = "Firefox";
    // Test for Mozilla.
    // Since Safari identifies itself as Mozilla,
    // eliminate it from the match.
    } else if (/!webkit|firefox/.test(n) && /mozilla/.test(n)) {
        browSniff.browser = "Mozilla";
    // Identify Netscape Navigator.
    } else if (/netscape/.test(n)) {
        browSniff.browser = "Netscape";
    // Single out Opera.
    } else if (/opera/.test(n)) {
        browSniff.browser = "Opera";
    // Single out KHTML.
    } else if (/khtml/.test(n)) {
        browSniff.browser = "KHTML";
    }

//////////////////////////////////////////////////////////
    //
    // Determine which operating system is being used:
    //
    //////////////////////////////////////////////////////////
    var p = navigator.platform.toLowerCase();
    if (/bsd/.test(p)) {
        browSniff.os = "BSD";
    } else if (/linux/.test(p)) {
        browSniff.os = "Linux";
    } else if (/mac/.test(p)) {
        browSniff.os = "Mac";
    } else if (/sunos/.test(p)) {
        browSniff.os = "Solaris";
    } else if (/win/.test(p)) {
        browSniff.os = "Windows";
    }

    //////////////////////////////////////////////////////////
    //
    // Determine the browser version.
    // This was tricky because browser vendors differ
    // in where they put key information in the user
    // agent string. Since we already have the browser
    // identified above in the browSniff.browser property,
    // we use that to check how to determine the
    // browser version.
    //
    //////////////////////////////////////////////////////////
    browSniff.bv = navigator.appVersion;
    browSniff.ba = navigator.userAgent;
    browSniff.bName = "";
    browSniff.bNamePos = 0;
    if (browSniff.browser == "IE") {
        browSniff.vPos = browSniff.ba.indexOf("MSIE");
        browSniff.browserVersion = parseFloat(browSniff.ba.substring(browSniff.vPos+5));
    } else if (browSniff.browser == "Opera") {
        browSniff.vPos = browSniff.ba.indexOf("Opera");
        browSniff.browserVersion = parseFloat(browSniff.ba.substring(browSniff.vPos+6));
    // Since Safari doesn't carry browser information in
    // its userAgent string, but instead present the
    // build version, I test the build version to
    // determine the browser version.
    } else if (browSniff.browser == "Safari") {
        browSniff.bNamePos = browSniff.ba.lastIndexOf(' ') + 1;
        browSniff.vPos = browSniff.ba.lastIndexOf('/');
        browSniff.tempBv = parseFloat(browSniff.ba.substring(browSniff.vPos + 1));
        if(browSniff.tempBv < 86) {
            browSniff.browserVersion = 1;
        } else if (browSniff.tempBv > 99 && browSniff.tempBv < 100.1) {
            browSniff.browserVersion = 1.1;
        } else if (browSniff.tempBv > 124 && browSniff.tempBv < 126) {
            browSniff.browserVersion = 1.2;
        } else if (browSniff.tempBv > 311 && browSniff.tempBv < 313) {
            browSniff.browserVersion = 1.3;
        } else if (browSniff.tempBv > 412) {
            browSniff.browserVersion = 2;
        }
    // For all other browsers:
    } else if ((browSniff.bNamePos = browSniff.ba.lastIndexOf(' ') + 1) < (browSniff.vPos = browSniff.ba.lastIndexOf('/'))) {
        browSniff.browser = browSniff.ba.substring(browSniff.bNamePos,browSniff.vPos);
        browSniff.browserVersion = parseFloat(browSniff.ba.substring(browSniff.vPos + 1));
    }
    
     //////////////////////////////////////////////////////////
    //
    // Check for box model compliance.
    // Usually IE or browsers using IE's rendering engine
    // use quirks mode, though Mozilla browsers also
    // have their own version of quirks mode for
    // Netscape 4 (yuck!) compatibility.
    //
    //////////////////////////////////////////////////////////
    browSniff.browser != "IE" || document.compatMode == "CSS1Compat" ? browSniff.boxModel = true : browSniff.boxModel = false;

    browSniff.sniffed = true;
}



//Depends on browSniff and x$ methods
// Determine if an element has a particular attribute.
// Returns true is successful, otherwise false.
function xHasAttr(elem, name ) {
   // Add in conditional checking for alternate names used by IE.
   // If the attribute is of type "class", check for className.
   browSniff();
   if (!(elem = x$(elem)))  return;
   if (name == "class" && (browSniff.browser == "IE" && browSniff.os == "Windows")) {
      if (elem.getAttribute("className")) return true;
   // If the attribute is of type "for", check for htmlFor.
   } else if (name == "for" && (browSniff.browser == "IE" && browSniff.os == "Windows")) {
      if (elem.getAttribute("htmlFor")) return true;
   // Otherwise return the result of attribute check.
   } else {
      if (elem.getAttribute(name)) return true;
   }
   return false;
}
      
//Depends on browSniff, xHasAttr and x$ methods
//Gets the given attribute of an element
function xGetAttr( elem, name ) {
   browSniff();
   if (!(elem = x$(elem)))  return;
   if (name == "class" && (browSniff.browser == "IE" && browSniff.os == "Windows")) {
      if (xHasAttr(elem, "className"))  return elem.getAttribute("className");
   } else if (name == "for" && (browSniff.browser == "IE" && browSniff.os == "Windows")) {
      if (xHasAttr(elem, "htmlFor"))  return elem.getAttribute("htmlFor");
   } else {
      if (xHasAttr(elem, name))  return elem.getAttribute(name);
   }
   return '';
}

//Depends on browSniff and x$ methods
//Sets the given attribute of an element
function xSetAttr(elem, name, value ) {
   browSniff();
   if (!(elem = x$(elem)))  return;
   if (name == "class" && (browSniff.browser == "IE" && browSniff.os == "Windows")) {
      elem.setAttribute("className", value);
   } else if (name == "for" && (browSniff.browser == "IE" && browSniff.os == "Windows")) {
      elem.setAttribute("htmlFor", value);
   } else {
      elem.setAttribute(name, value);
   }
   return;
}

//Depends on browSniff and x$ methods
//Removes the given attribute of an element
function xRemoveAttr( elem, name ) {
   browSniff();
   if (!(elem = x$(elem)))  return;
   if (name == "class" && (browSniff.browser == "IE" && browSniff.os == "Windows")) {
      elem.removeAttribute("className");
   } else if (name == "for" && (browSniff.browser == "IE" && browSniff.os == "Windows")) {
      elem.removeAttribute("htmlFor");
   } else {
      elem.removeAttribute(name);
   }
}




// Name: javascript cross browser xpath 
//     function
// Description:For use with AJAX web app
//     lications, allows xpath expressions on X
//     ML data objects.
// By: Charles Toepfer
// Inputs:XML DOM element, xPath string
// Returns:resulting XML DOM
function xPath(oNodes, sXPath)
{/*
    xPath function by Charles Toepfer: toepfer_c@hotmail.com 
    use: 'resulting xml dom' = xPath('xml dom object', 'xpath string');
 */
  if(oNodes)
  {
    if(window.XMLHttpRequest)
    { 
      try{
          var oXpe = new XPathEvaluator();
          var oNsResolver = oXpe.createNSResolver(oNodes.ownerDocument == null ? oNodes.documentElement : oNodes.ownerDocument.documentElement);
          var oResult = oXpe.evaluate(sXPath, oNodes, oNsResolver, 0, null);
          var arNodes = [];
          var oRes;
          while (oRes = oResult.iterateNext())
          {
              arNodes.push(oRes);
          }
          return arNodes;
      }
      catch (e) {
      }
    }
    else{
      try{
          oNodes.documentElement.setProperty('SelectionLanguage', 'XPath'); //necessary for IE to work
          var oSelectedNodes = oNodes.documentElement.selectNodes(sXPath);
          return oSelectedNodes;
      }
      catch (e){
      }
    }
  }
  return;
}


//generic function to load the xml from a string variable and return an xml document
function xLoadXML(xmlText){
  var doc;
  // code for IE
  if (window.ActiveXObject){
    doc=new ActiveXObject("Microsoft.XMLDOM");
    doc.async="false";
    doc.loadXML(xmlText);
  }
  // code for Mozilla, Firefox, Opera, etc.
  else{
    var parser=new DOMParser();
    doc=parser.parseFromString(xmlText,"text/xml");
  }
  return doc;
}


//generic function to trim leading and trailing spaces in a string
function xTrim(s){
		return s.replace(/^\s+|\s+$/g, '');
}


//generic function to get all the elements whose attribute 'sAtt' matches value 'sRe'
function xGetElementsByAtt(sTag, sAtt, sRE, fn)
{
  var a, list, found = new Array();//, re = new RegExp(sRE, 'i');
  list = xTag$(sTag);
  for (var i = 0; i < list.length; i++) {
    a = xGetAttr(list[i], sAtt);
    //if (typeof(a)=='string' && a.search(re) != -1) {
    if (typeof(a)=='string' && a.toLowerCase() == sRE.toLowerCase()) {
      found[found.length] = list[i];
      if (fn) fn(list[i]);
    }
  }
  return found;
}


//function to unscape an html string into valid html
function msdnHtmlDecode(s)
{
      var out = "";
      if (s==null) return;

      var l = s.length;
      for (var i=0; i<l; i++)
      {
            var ch = s.charAt(i);
            if (ch == '&')
            {
                var semicolonIndex = s.indexOf(';', i+1);
                if (semicolonIndex > 0)
                {
                    var entity = s.substring(i + 1, semicolonIndex);
                    if (entity.length > 1 && (entity.indexOf("&") > -1 || entity.indexOf(" ") > -1)){
                          var breakIndex = entity.indexOf("&");
                          var spaceIndex = entity.indexOf(" ");
                          breakIndex = (spaceIndex < breakIndex || breakIndex==-1) ? spaceIndex : breakIndex;
                          
                          ch += entity.substring(0, breakIndex)
                          i += breakIndex;
                          
                    }else if (entity.length > 1 && entity.charAt(0) == '#'){
                          if (entity.charAt(1) == 'x' || entity.charAt(1) == 'X')
                                ch = String.fromCharCode(eval('0'+entity.substring(1)));
                          else
                                ch = String.fromCharCode(eval(entity.substring(1)));
                                
                          i = semicolonIndex;
                    }
                    else{
                              switch (entity)
                              {
                                    case 'quot': ch = String.fromCharCode(0x0022); break;
                                    case 'amp': ch = String.fromCharCode(0x0026); break;
                                    case 'lt': ch = String.fromCharCode(0x003c); break;
                                    case 'gt': ch = String.fromCharCode(0x003e); break;
                                    case 'nbsp': ch = String.fromCharCode(0x00a0); break;
                                    case 'iexcl': ch = String.fromCharCode(0x00a1); break;
                                    case 'cent': ch = String.fromCharCode(0x00a2); break;
                                    case 'pound': ch = String.fromCharCode(0x00a3); break;
                                    case 'curren': ch = String.fromCharCode(0x00a4); break;
                                    case 'yen': ch = String.fromCharCode(0x00a5); break;
                                    case 'brvbar': ch = String.fromCharCode(0x00a6); break;
                                    case 'sect': ch = String.fromCharCode(0x00a7); break;
                                    case 'uml': ch = String.fromCharCode(0x00a8); break;
                                    case 'copy': ch = String.fromCharCode(0x00a9); break;
                                    case 'ordf': ch = String.fromCharCode(0x00aa); break;
                                    case 'laquo': ch = String.fromCharCode(0x00ab); break;
                                    case 'not': ch = String.fromCharCode(0x00ac); break;
                                    case 'shy': ch = String.fromCharCode(0x00ad); break;
                                    case 'reg': ch = String.fromCharCode(0x00ae); break;
                                    case 'macr': ch = String.fromCharCode(0x00af); break;
                                    case 'deg': ch = String.fromCharCode(0x00b0); break;
                                    case 'plusmn': ch = String.fromCharCode(0x00b1); break;
                                    case 'sup2': ch = String.fromCharCode(0x00b2); break;
                                    case 'sup3': ch = String.fromCharCode(0x00b3); break;
                                    case 'acute': ch = String.fromCharCode(0x00b4); break;
                                    case 'micro': ch = String.fromCharCode(0x00b5); break;
                                    case 'para': ch = String.fromCharCode(0x00b6); break;
                                    case 'middot': ch = String.fromCharCode(0x00b7); break;
                                    case 'cedil': ch = String.fromCharCode(0x00b8); break;
                                    case 'sup1': ch = String.fromCharCode(0x00b9); break;
                                    case 'ordm': ch = String.fromCharCode(0x00ba); break;
                                    case 'raquo': ch = String.fromCharCode(0x00bb); break;
                                    case 'frac14': ch = String.fromCharCode(0x00bc); break;
                                    case 'frac12': ch = String.fromCharCode(0x00bd); break;
                                    case 'frac34': ch = String.fromCharCode(0x00be); break;
                                    case 'iquest': ch = String.fromCharCode(0x00bf); break;
                                    case 'Agrave': ch = String.fromCharCode(0x00c0); break;
                                    case 'Aacute': ch = String.fromCharCode(0x00c1); break;
                                    case 'Acirc': ch = String.fromCharCode(0x00c2); break;
                                    case 'Atilde': ch = String.fromCharCode(0x00c3); break;
                                    case 'Auml': ch = String.fromCharCode(0x00c4); break;
                                    case 'Aring': ch = String.fromCharCode(0x00c5); break;
                                    case 'AElig': ch = String.fromCharCode(0x00c6); break;
                                    case 'Ccedil': ch = String.fromCharCode(0x00c7); break;
                                    case 'Egrave': ch = String.fromCharCode(0x00c8); break;
                                    case 'Eacute': ch = String.fromCharCode(0x00c9); break;
                                    case 'Ecirc': ch = String.fromCharCode(0x00ca); break;
                                    case 'Euml': ch = String.fromCharCode(0x00cb); break;
                                    case 'Igrave': ch = String.fromCharCode(0x00cc); break;
                                    case 'Iacute': ch = String.fromCharCode(0x00cd); break;
                                    case 'Icirc': ch = String.fromCharCode(0x00ce ); break;
                                    case 'Iuml': ch = String.fromCharCode(0x00cf); break;
                                    case 'ETH': ch = String.fromCharCode(0x00d0); break;
                                    case 'Ntilde': ch = String.fromCharCode(0x00d1); break;
                                    case 'Ograve': ch = String.fromCharCode(0x00d2); break;
                                    case 'Oacute': ch = String.fromCharCode(0x00d3); break;
                                    case 'Ocirc': ch = String.fromCharCode(0x00d4); break;
                                    case 'Otilde': ch = String.fromCharCode(0x00d5); break;
                                    case 'Ouml': ch = String.fromCharCode(0x00d6); break;
                                    case 'times': ch = String.fromCharCode(0x00d7); break;
                                    case 'Oslash': ch = String.fromCharCode(0x00d8); break;
                                    case 'Ugrave': ch = String.fromCharCode(0x00d9); break;
                                    case 'Uacute': ch = String.fromCharCode(0x00da); break;
                                    case 'Ucirc': ch = String.fromCharCode(0x00db); break;
                                    case 'Uuml': ch = String.fromCharCode(0x00dc); break;
                                    case 'Yacute': ch = String.fromCharCode(0x00dd); break;
                                    case 'THORN': ch = String.fromCharCode(0x00de); break;
                                    case 'szlig': ch = String.fromCharCode(0x00df); break;
                                    case 'agrave': ch = String.fromCharCode(0x00e0); break;
                                    case 'aacute': ch = String.fromCharCode(0x00e1); break;
                                    case 'acirc': ch = String.fromCharCode(0x00e2); break;
                                    case 'atilde': ch = String.fromCharCode(0x00e3); break;
                                    case 'auml': ch = String.fromCharCode(0x00e4); break;
                                    case 'aring': ch = String.fromCharCode(0x00e5); break;
                                    case 'aelig': ch = String.fromCharCode(0x00e6); break;
                                    case 'ccedil': ch = String.fromCharCode(0x00e7); break;
                                    case 'egrave': ch = String.fromCharCode(0x00e8); break;
                                    case 'eacute': ch = String.fromCharCode(0x00e9); break;
                                    case 'ecirc': ch = String.fromCharCode(0x00ea); break;
                                    case 'euml': ch = String.fromCharCode(0x00eb); break;
                                    case 'igrave': ch = String.fromCharCode(0x00ec); break;
                                    case 'iacute': ch = String.fromCharCode(0x00ed); break;
                                    case 'icirc': ch = String.fromCharCode(0x00ee); break;
                                    case 'iuml': ch = String.fromCharCode(0x00ef); break;
                                    case 'eth': ch = String.fromCharCode(0x00f0); break;
                                    case 'ntilde': ch = String.fromCharCode(0x00f1); break;
                                    case 'ograve': ch = String.fromCharCode(0x00f2); break;
                                    case 'oacute': ch = String.fromCharCode(0x00f3); break;
                                    case 'ocirc': ch = String.fromCharCode(0x00f4); break;
                                    case 'otilde': ch = String.fromCharCode(0x00f5); break;
                                    case 'ouml': ch = String.fromCharCode(0x00f6); break;
                                    case 'divide': ch = String.fromCharCode(0x00f7); break;
                                    case 'oslash': ch = String.fromCharCode(0x00f8); break;
                                    case 'ugrave': ch = String.fromCharCode(0x00f9); break;
                                    case 'uacute': ch = String.fromCharCode(0x00fa); break;
                                    case 'ucirc': ch = String.fromCharCode(0x00fb); break;
                                    case 'uuml': ch = String.fromCharCode(0x00fc); break;
                                    case 'yacute': ch = String.fromCharCode(0x00fd); break;
                                    case 'thorn': ch = String.fromCharCode(0x00fe); break;
                                    case 'yuml': ch = String.fromCharCode(0x00ff); break;
                                    case 'OElig': ch = String.fromCharCode(0x0152); break;
                                    case 'oelig': ch = String.fromCharCode(0x0153); break;
                                    case 'Scaron': ch = String.fromCharCode(0x0160); break;
                                    case 'scaron': ch = String.fromCharCode(0x0161); break;
                                    case 'Yuml': ch = String.fromCharCode(0x0178); break;
                                    case 'fnof': ch = String.fromCharCode(0x0192); break;
                                    case 'circ': ch = String.fromCharCode(0x02c6); break;
                                    case 'tilde': ch = String.fromCharCode(0x02dc); break;
                                    case 'Alpha': ch = String.fromCharCode(0x0391); break;
                                    case 'Beta': ch = String.fromCharCode(0x0392); break;
                                    case 'Gamma': ch = String.fromCharCode(0x0393); break;
                                    case 'Delta': ch = String.fromCharCode(0x0394); break;
                                    case 'Epsilon': ch = String.fromCharCode(0x0395); break;
                                    case 'Zeta': ch = String.fromCharCode(0x0396); break;
                                    case 'Eta': ch = String.fromCharCode(0x0397); break;
                                    case 'Theta': ch = String.fromCharCode(0x0398); break;
                                    case 'Iota': ch = String.fromCharCode(0x0399); break;
                                    case 'Kappa': ch = String.fromCharCode(0x039a); break;
                                    case 'Lambda': ch = String.fromCharCode(0x039b); break;
                                    case 'Mu': ch = String.fromCharCode(0x039c); break;
                                    case 'Nu': ch = String.fromCharCode(0x039d); break;
                                    case 'Xi': ch = String.fromCharCode(0x039e); break;
                                    case 'Omicron': ch = String.fromCharCode(0x039f); break;
                                    case 'Pi': ch = String.fromCharCode(0x03a0); break;
                                    case ' Rho ': ch = String.fromCharCode(0x03a1); break;
                                    case 'Sigma': ch = String.fromCharCode(0x03a3); break;
                                    case 'Tau': ch = String.fromCharCode(0x03a4); break;
                                    case 'Upsilon': ch = String.fromCharCode(0x03a5); break;
                                    case 'Phi': ch = String.fromCharCode(0x03a6); break;
                                    case 'Chi': ch = String.fromCharCode(0x03a7); break;
                                    case 'Psi': ch = String.fromCharCode(0x03a8); break;
                                    case 'Omega': ch = String.fromCharCode(0x03a9); break;
                                    case 'alpha': ch = String.fromCharCode(0x03b1); break;
                                    case 'beta': ch = String.fromCharCode(0x03b2); break;
                                    case 'gamma': ch = String.fromCharCode(0x03b3); break;
                                    case 'delta': ch = String.fromCharCode(0x03b4); break;
                                    case 'epsilon': ch = String.fromCharCode(0x03b5); break;
                                    case 'zeta': ch = String.fromCharCode(0x03b6); break;
                                    case 'eta': ch = String.fromCharCode(0x03b7); break;
                                    case 'theta': ch = String.fromCharCode(0x03b8); break;
                                    case 'iota': ch = String.fromCharCode(0x03b9); break;
                                    case 'kappa': ch = String.fromCharCode(0x03ba); break;
                                    case 'lambda': ch = String.fromCharCode(0x03bb); break;
                                    case 'mu': ch = String.fromCharCode(0x03bc); break;
                                    case 'nu': ch = String.fromCharCode(0x03bd); break;
                                    case 'xi': ch = String.fromCharCode(0x03be); break;
                                    case 'omicron': ch = String.fromCharCode(0x03bf); break;
                                    case 'pi': ch = String.fromCharCode(0x03c0); break;
                                    case 'rho': ch = String.fromCharCode(0x03c1); break;
                                    case 'sigmaf': ch = String.fromCharCode(0x03c2); break;
                                    case 'sigma': ch = String.fromCharCode(0x03c3); break;
                                    case 'tau': ch = String.fromCharCode(0x03c4); break;
                                    case 'upsilon': ch = String.fromCharCode(0x03c5); break;
                                    case 'phi': ch = String.fromCharCode(0x03c6); break;
                                    case 'chi': ch = String.fromCharCode(0x03c7); break;
                                    case 'psi': ch = String.fromCharCode(0x03c8); break;
                                    case 'omega': ch = String.fromCharCode(0x03c9); break;
                                    case 'thetasym': ch = String.fromCharCode(0x03d1); break;
                                    case 'upsih': ch = String.fromCharCode(0x03d2); break;
                                    case 'piv': ch = String.fromCharCode(0x03d6); break;
                                    case 'ensp': ch = String.fromCharCode(0x2002); break;
                                    case 'emsp': ch = String.fromCharCode(0x2003); break;
                                    case 'thinsp': ch = String.fromCharCode(0x2009); break;
                                    case 'zwnj': ch = String.fromCharCode(0x200c); break;
                                    case 'zwj': ch = String.fromCharCode(0x200d); break;
                                    case 'lrm': ch = String.fromCharCode(0x200e); break;
                                    case 'rlm': ch = String.fromCharCode(0x200f); break;
                                    case 'ndash': ch = String.fromCharCode(0x2013); break;
                                    case 'mdash': ch = String.fromCharCode(0x2014); break;
                                    case 'lsquo': ch = String.fromCharCode(0x2018); break;
                                    case 'rsquo': ch = String.fromCharCode(0x2019); break;
                                    case 'sbquo': ch = String.fromCharCode(0x201a); break;
                                    case 'ldquo': ch = String.fromCharCode(0x201c); break;
                                    case 'rdquo': ch = String.fromCharCode(0x201d); break;
                                    case 'bdquo': ch = String.fromCharCode(0x201e); break;
                                    case 'dagger': ch = String.fromCharCode(0x2020); break;
                                    case 'Dagger': ch = String.fromCharCode(0x2021); break;
                                    case 'bull': ch = String.fromCharCode(0x2022); break;
                                    case 'hellip': ch = String.fromCharCode(0x2026); break;
                                    case 'permil': ch = String.fromCharCode(0x2030); break;
                                    case 'prime': ch = String.fromCharCode(0x2032); break;
                                    case 'Prime': ch = String.fromCharCode(0x2033); break;
                                    case 'lsaquo': ch = String.fromCharCode(0x2039); break;
                                    case 'rsaquo': ch = String.fromCharCode(0x203a); break;
                                    case 'oline': ch = String.fromCharCode(0x203e); break;
                                    case 'frasl': ch = String.fromCharCode(0x2044); break;
                                    case 'euro': ch = String.fromCharCode(0x20ac); break;
                                    case 'image': ch = String.fromCharCode(0x2111); break;
                                    case 'weierp': ch = String.fromCharCode(0x2118); break;
                                    case 'real': ch = String.fromCharCode(0x211c); break;
                                    case 'trade': ch = String.fromCharCode(0x2122); break;
                                    case 'alefsym': ch = String.fromCharCode(0x2135); break;
                                    case 'larr': ch = String.fromCharCode(0x2190); break;
                                    case 'uarr': ch = String.fromCharCode(0x2191); break;
                                    case 'rarr': ch = String.fromCharCode(0x2192); break;
                                    case 'darr': ch = String.fromCharCode(0x2193); break;
                                    case 'harr': ch = String.fromCharCode(0x2194); break;
                                    case 'crarr': ch = String.fromCharCode(0x21b5); break;
                                    case 'lArr': ch = String.fromCharCode(0x21d0); break;
                                    case 'uArr': ch = String.fromCharCode(0x21d1); break;
                                    case 'rArr': ch = String.fromCharCode(0x21d2); break;
                                    case 'dArr': ch = String.fromCharCode(0x21d3); break;
                                    case 'hArr': ch = String.fromCharCode(0x21d4); break;
                                    case 'forall': ch = String.fromCharCode(0x2200); break;
                                    case 'part': ch = String.fromCharCode(0x2202); break;
                                    case 'exist': ch = String.fromCharCode(0x2203); break;
                                    case 'empty': ch = String.fromCharCode(0x2205); break;
                                    case 'nabla': ch = String.fromCharCode(0x2207); break;
                                    case 'isin': ch = String.fromCharCode(0x2208); break;
                                    case 'notin': ch = String.fromCharCode(0x2209); break;
                                    case 'ni': ch = String.fromCharCode(0x220b); break;
                                    case 'prod': ch = String.fromCharCode(0x220f); break;
                                    case 'sum': ch = String.fromCharCode(0x2211); break;
                                    case 'minus': ch = String.fromCharCode(0x2212); break;
                                    case 'lowast': ch = String.fromCharCode(0x2217); break;
                                    case 'radic': ch = String.fromCharCode(0x221a); break;
                                    case 'prop': ch = String.fromCharCode(0x221d); break;
                                    case 'infin': ch = String.fromCharCode(0x221e); break;
                                    case 'ang': ch = String.fromCharCode(0x2220); break;
                                    case 'and': ch = String.fromCharCode(0x2227); break;
                                    case 'or': ch = String.fromCharCode(0x2228); break;
                                    case 'cap': ch = String.fromCharCode(0x2229); break;
                                    case 'cup': ch = String.fromCharCode(0x222a); break;
                                    case 'int': ch = String.fromCharCode(0x222b); break;
                                    case 'there4': ch = String.fromCharCode(0x2234); break;
                                    case 'sim': ch = String.fromCharCode(0x223c); break;
                                    case 'cong': ch = String.fromCharCode(0x2245); break;
                                    case 'asymp': ch = String.fromCharCode(0x2248); break;
                                    case 'ne': ch = String.fromCharCode(0x2260); break;
                                    case 'equiv': ch = String.fromCharCode(0x2261); break;
                                    case 'le': ch = String.fromCharCode(0x2264); break;
                                    case 'ge': ch = String.fromCharCode(0x2265); break;
                                    case 'sub': ch = String.fromCharCode(0x2282); break;
                                    case 'sup': ch = String.fromCharCode(0x2283); break;
                                    case 'nsub': ch = String.fromCharCode(0x2284); break;
                                    case 'sube': ch = String.fromCharCode(0x2286); break;
                                    case 'supe': ch = String.fromCharCode(0x2287); break;
                                    case 'oplus': ch = String.fromCharCode(0x2295); break;
                                    case 'otimes': ch = String.fromCharCode(0x2297); break;
                                    case 'perp': ch = String.fromCharCode(0x22a5); break;
                                    case 'sdot': ch = String.fromCharCode(0x22c5); break;
                                    case 'lceil': ch = String.fromCharCode(0x2308); break;
                                    case 'rceil': ch = String.fromCharCode(0x2309); break;
                                    case 'lfloor': ch = String.fromCharCode(0x230a); break;
                                    case 'rfloor': ch = String.fromCharCode(0x230b); break;
                                    case 'lang': ch = String.fromCharCode(0x2329); break;
                                    case 'rang': ch = String.fromCharCode(0x232a); break;
                                    case 'loz': ch = String.fromCharCode(0x25ca); break;
                                    case 'spades': ch = String.fromCharCode(0x2660); break;
                                    case 'clubs': ch = String.fromCharCode(0x2663); break;
                                    case 'hearts': ch = String.fromCharCode(0x2665); break;
                                    case 'diams': ch = String.fromCharCode(0x2666); break;
                                    default: ch = ''; break;
                              }
                              i = semicolonIndex;
                        }
                        
                  }
            }
            out += ch;
      }
      return out;
}



//generic function to shift the cursor to the next text field, if the first one's length has reached "len"
function autoTab( item, next, len )
{
	if ( item.value.length == len ){
			next.focus( );
	}
	return true;
}

function isBrowser(b,v) 
{
	browserOk = false;
	versionOk = false;
	browserOk = (navigator.appName.indexOf(b) != -1);
	if (v == 0) versionOk = true;
	else  versionOk = (v <= parseInt(navigator.appVersion));
	return browserOk && versionOk;
}
