function elm(id){return document.getElementById(id);}
function gecko(){return navigator.userAgent.match(/gecko/i);}
function hide(o){o.style.display="none";}
function unhide(o){o.style.display="";}
function getTimeStamp(t){var dt = new Date();return dt.getTime();}
// Cookie functions
function getCookieVal (offset) { 
	var endstr = document.cookie.indexOf (";", offset); 
	if (endstr == -1) 
	endstr = document.cookie.length; 
	return unescape(document.cookie.substring(offset, endstr));
}

function GetCookie (name) { 
	var arg = name + "="; 
	var alen = arg.length; 
	var clen = document.cookie.length; 
	var i = 0; 
	while (i < clen) { 
		var j = i + alen; 
		if (document.cookie.substring(i, j) == arg) 
		return getCookieVal (j); 
		i = document.cookie.indexOf(" ", i) + 1; 
		if (i == 0) break; 
	} 
	return null;
}

function SetCookie (name, value) { 
	var argv = SetCookie.arguments; 
	var argc = SetCookie.arguments.length; 
	var expires = (argc > 2) ? argv[2] : null; 
	var path = (argc > 3) ? argv[3] : null; 
	var domain = (argc > 4) ? argv[4] : null; 
	var secure = (argc > 5) ? argv[5] : false; 
	document.cookie = name + "=" + escape (value) + 
		((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
		((path == null) ? "" : ("; path=" + path)) + 
		((domain == null) ? "" : ("; domain=" + domain)) +
		((secure == true) ? "; secure" : "");
}

function DeleteCookie (name) { 
	var exp = new Date(); 
	exp.setTime (exp.getTime() - 1); 
	// This cookie is history 
	var cval = GetCookie (name); 
	document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}

function getElemFromEvent(e){                                                   
//	if (typeof(e.srcElement)!="undefined") return e.srcElement;             
//	if (typeof(e.target)!="undefined") return e.target;                     
return(e.srcElement)?e.srcElement:e.target;
}

function getControlPrefix() {
   if (getControlPrefix.prefix)
      return getControlPrefix.prefix;
   
   var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
   var o, o2;
   for (var i = 0; i < prefixes.length; i++) {
      try {
         // try to create the objects
         o2 = new ActiveXObject(prefixes[i] + ".DOMDocument");
         return getControlPrefix.prefix = prefixes[i];
      }
      catch (ex) {};
   }
   
   throw new Error("Could not find an installed XML parser");
}

function GetXmlHttp()
{
	var ObjXmlHttp = null ;
	if ( gecko() ) {
		ObjXmlHttp = new XMLHttpRequest() ;
	}
	else{
		ObjXmlHttp = new ActiveXObject(getControlPrefix() + ".XmlHttp") ;
	}
	
	return ObjXmlHttp ;
}



/*
 * evals any scripts inside the "elem" element
 */

function evalScripts(elem){
	var scriptElems = elem.getElementsByTagName("script");
	var length = scriptElems.length;
	if(length > 0)
		for(i=0;i<length;i++)
		{
			var scrptItem = scriptElems.item(i);
			eval(scrptItem.innerHTML)
		}
}



/*
 * gets all those children unto leaf level that have the particular attribute and value
 */
function getChildrenWithAttVal(obj,att,val){
	var oItem = getAllChildNodesWithTag(obj,"a;span;img;td;tr;input;select;table;nobr;textarea;div;");
	if(oItem==null)
		return null;
	var indx = 0;
	var items = new Array();
	for(var i=0;i<oItem.length;i++){
		var item = oItem[i];
		if (item.nodeName=="#text") continue;
		if (item.getAttribute(att)==val) {
			items[indx++]=item;
		}
	}
	if(items.length>0)
		return items;
	else
		return null;
}


/*
 * gets all those children unto leaf level that have the particular attribute
 */
function getChildrenWithAtt(obj,att){
	var oItem = getAllChildNodesWithTag(obj,"a;span;img;td;tr;input;select;table;nobr;textarea;div;");
	if(oItem==null)
		return null;
	var indx = 0;
	var items = new Array();
	for(var i=0;i<oItem.length;i++){
		var item = oItem[i];
		if (item.nodeName=="#text") continue;
		if (item.getAttribute(att)) {
			items[indx++]=item;
		}
	}
	if(items.length>0)
		return items;
	else
		return null;
}

/*
 * gets all children upto leaf level 
 */
function getAllChildNodesWithTag(p,taglist)
{
	var j = taglist.split(";");
	var nodes = new Array();
	var idx = 0;
	for( var i=0; i<j.length; i++)
	{
		var child = p.getElementsByTagName(j[i]);
		var count = child.length;
		for(var l=0;l<count;l++)
			nodes[idx++] = child[l];
	}
	if(nodes.length>0)
		return nodes;
	else
		return null;
}

/*
 * returns all children of node "p" that have the tagname as "tag"
 */

function getChildwithTag(p,tag){
	var oItem = p.childNodes;
	var item;
	for(i=oItem.length-1;i>=0;i--){
		item = oItem.item(i);
		if (item.nodeName==tag)
			return item;
	}
	return null;
}

function getElementWithId(p,id){
	var oItem = p.childNodes;
	var item;
	for(i=oItem.length-1;i>=0;i--){
		item = oItem.item(i);
		if (item.id ==id)
			return item;
	}
	return null;
}



function cancelEvent(event){
	event.cancelBubble=true;
	event.returnValue=false;
	if(event.cancelable)
		event.preventDefault();
	return event;
}

// returns parent (starting with elem) having attribute "attr" having value "value"
// if only presence of attribute is required pass empty string in value
function getParentWithAttribute(elem, attr, value, bStartsWith)
{
	try
	{
		value = value.toLowerCase();
		var eP = elem;
		while (eP != null)
		{
			if (eP.nodeType != 3)
				if (eP.getAttribute(attr) != null) {
					if (value == "") break;
					else {
						if (bStartsWith) {
							if (eP.getAttribute(attr).toLowerCase().indexOf(value) == 0) break;
						}
						else
							if (eP.getAttribute(attr).toLowerCase() == value) break;
					}
				}
			eP = eP.parentNode;
		}
	}
	catch (e)
	{
		eP = null;
	}
	return eP;
}

// returns parent (starting with elem) having the tag
function getParentWithTag(elem, tag)
{
	var t = tag.toUpperCase();
	var eP = elem;
	while (eP != null)
	{
		if (eP.tagName == t)
			return eP;
		eP = eP.parentNode;
	}
	return null;
}

function aonclick(event)
{
	var el = getElemFromEvent(event);
	if(!el) return;
	var stateid = el.getAttribute("stateid");
	var strHref = el.href.toString();
	if (strHref.indexOf("?") >=0)
		el.href = el.href + "&stateid=" + stateid;
	else
		el.href = el.href + "?stateid=" + stateid;
	cancelEvent(event);
	top.location = el.href;
}

function checkValidEmail(strEmail) 
{
	var atIndex=strEmail.indexOf("@");
	// check for @ being present and not at the start or end.
	if (atIndex==-1 || atIndex==0 || atIndex==strEmail.length){
	   return false;
	}

	var dotIndex=strEmail.indexOf(".");
	// check for . being present and not at the start or end.
	if (dotIndex==-1 || dotIndex==0 || dotIndex==(strEmail.length-1)){
	    return false;
	}
	// not more than one @ or  a space in between
	if (strEmail.indexOf("@",(atIndex+1))!=-1 || strEmail.indexOf(" ")!=-1){
		return false;
	}
	// @ and . should not be together.
	if (strEmail.substring(atIndex-1,atIndex)=="." || strEmail.substring(atIndex+1,atIndex+2)=="."){
		return false;
	}
	// there should be a . after the @
	if (strEmail.indexOf(".",(atIndex+2))==-1 ){
		return false;
	}
	return true;
}

function unescapeHTML(sStr)
{
	sStr = sStr + "";
	sStr = sStr.replace(/&nbsp;/gi, " ");
	sStr = sStr.replace(/&lt;/gi, "<");
	sStr = sStr.replace(/&gt;/gi, ">");
	sStr = sStr.replace(/&quot;/gi, "\"");
	sStr = sStr.replace(/&amp;/gi, "&");
	return sStr;
}

function escapeHTML(sHTML)
{
	sHTML = sHTML + "";
	sHTML = sHTML.replace(/&/gi, "&amp;");
	sHTML = sHTML.replace(/"/gi, "&quot;");
	sHTML = sHTML.replace(/</gi, "&lt;");
	sHTML = sHTML.replace(/>/gi, "&gt;");
	sHTML = sHTML.replace(/\n{2,}/g, "\n");
	return sHTML;
}

function trim(s)
{
	var i=0;
	while (i<s.length)
		if (s.charAt(i) == " ") i++;
		else break;

	var j=s.length;
	while (j>0)
		if (s.charAt(j - 1) == " ") j--;
		else break;
	return s.substr(i, j-i); 
}

function click(obj,ctrlK,shiftK)
{
	if (gecko()) {
		if (!ctrlK) ctrlK =false;
		if (!shiftK) shiftK =false;
		var evt = document.createEvent("MouseEvents");
		evt.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, ctrlK, false, shiftK, false, 0, null);
		obj.dispatchEvent(evt);
	}
	else obj.click();
}


function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}


// tree search algorithm to find by tag 
// start with o, first look at siblings, then for each sibling recurse on first child
function findbytag(o,tag,attr,value) { if (!o) return o;
  var s, o2;
  var t = tag.toUpperCase();
  for (s=o; s; s=s.nextSibling) 
  { 
	if (s.nodeName == t && (attr && s.getAttribute(attr)))
	{
		if( value && (s.getAttribute(attr)).toLowerCase() == value.toLowerCase())
			return s
	}
  }
  for (s=o; s; s=s.nextSibling) { o2 = findbytag(s.firstChild,tag,attr,value); if (o2) return o2; }
  return null;
}


function dateCheck(num)
{
	if((isInteger(num[0]) && isInteger(num[1]) && isInteger(num[2])) &&(num[0]>0 && num[0]<=12))
			{
			if(num[0]==1||num[0]==3||num[0]==5||num[0]==7||num[0]==8||num[0]==10||num[0]==12)
				{
				if(num[1]>0 && num[1]<=31)
					return 1;
				}
			else
				if(num[0]==4||num[0]==6||num[0]==9||num[0]==11)
				{
				if(num[1]>0 && num[1]<=30)
					return 1;
				}
				else
					if(num[0]==2)
					{
					if(((num[2]%100!=0 && num[2]%4==0) || (num[2]%400==0)) && (num[1]>0 && num[1]<=29))
						return 1;
					else
						if(num[1]>0 && num[1]<=28)
						return 1;
					}
			}

			return 0;
}

function isInteger(text)
{
	if(parseInt(text)==text)
		return 1;
	else
		return 0;
}

function isDate(date)
{

var num=date.split("/");
if(num.length==3)
	{
	if((num[2].length!=4) || (num[0].length!=2) ||(num[1].length!=2))
		return 0;
	num[0] = num[0] - 0;
	num[1] = num[1] - 0;
	num[2] = num[2] - 0;
	return dateCheck(num);
	}

else if(num.length==1)
	{
		num=date.split("-");
		if(num.length==3)
		{
			if((num[2].length!=4) || (num[0].length!=2) ||(num[1].length!=2))
				return 0;
				//need to clean this up
				num[0] = num[0] - 0;
				num[1] = num[1] - 0;
				num[2] = num[2] - 0;
				return dateCheck(num);
		}
	}
else
	return 0;

}


function supportedMethods(el){
			for(k in el)
				x += k + "<br>";
			elm("debug").innerHTML = x;
 
}