// Safari global vars
var _cb=null;
var _dialogArguments=null;
var _extraArgs=null;

function Util()
{
	// Determine if IE is the browser
	this.isie = (window.navigator.userAgent.indexOf("MSIE")>0);
	this.issafari = (window.navigator.userAgent.indexOf("Safari")>0 && window.navigator.userAgent.indexOf("Chrome")<0);
	this.ismac = (window.navigator.userAgent.indexOf("Mac")>0);

	// Trims whitespace from beginning and end of string
	this.trim = function(s)
	{
	    if (s==null)
		   return "";
    
	    return s.replace(/(^\s+)|(\s+$)/g, "");
	}

	this.getEvtSrc=function(event)
	{
		if (isie)
		   return event.srcElement;
		else
		   return event.target;
	}

	// Returns the top left absolute coordinates of the event source element
	this.getMouseXY=function(event,obj)
	{
		var x,y;
		if (this.isie)
		{
			if (!obj)
			{ x = document.body.scrollLeft + event.clientX - event.offsetX;
			  y = document.body.scrollTop + event.clientY - event.offsetY;
			}
			else  // Non-absolute position
			{
			  x = obj.getBoundingClientRect().left + document.body.scrollLeft;
			  y = obj.getBoundingClientRect().top + document.body.scrollTop;
			}

		}
		else
		{
			var x = 0;
			var y = 0;
			var temp = null;

			if (!obj)
			   temp=(event==null)?obj:getEvtSrc(event);
			else
			   temp=obj;   // Object is passed in
	           
			do
			{
				x += temp.offsetLeft;
				y += temp.offsetTop;
				temp = temp.offsetParent;
			}
			while(temp!=null)
		}
		return new Array(x,y);
	}
	
	this.getMouseXY_Static = function(obj, strRootId)
	{
		var x = 0;
		var y = 0;
		var temp=obj;
		do
		{
			x += temp.offsetLeft;
			y += temp.offsetTop;
			temp = temp.offsetParent;
		}
		while(temp!=null && temp.id!=strRootId)
		
		return new Array(x,y);
	}
	
	// Cancels the browser event for all browswers
	this.cancelEvt=function(event)
	{
		if (event==null)
		{
			// alert("ERROR:  EVENT OBJECT IS NULL WHEN TRYING TO CANCEL EVENT.");
			return;
		}

		if (this.isie)
		{
			event.cancelBubble=true;
			event.returnValue=false;
		}
		else
		{
			event.stopPropagation();
			event.preventDefault();
		}

		return false;
	}
	
	// This function will return the index of the item in the given array or -1 if not found
	this.getArrayIndex=function(oArray, oItem)
	{
		for (var i=0; i<oArray.length; i++)
		{
			if (oArray[i]==oItem)
				return i;
		}
    
		return -1;
	}

	// This function will check for a value inside the given array
	// Returns true if the item is in the array specified or false if not found in the array
	this.inArray=function(oArray, oItem)
	{
		if (this.getArrayIndex(oArray, oItem) >= 0)
			return true;

		return false;
	}

	// This function will show a modal window for ie/netscape, then call the specified callback function
	this.showModal=function(url, args, extraArgs, fnCallback, iWidth, iHeight, windowParams, navigable)
	{
	    var ieWindowParams="center:yes;help:no;resizable:yes;status:no;";
	    var nsWindowParams="directories=no,toolbar=no,menubar=no,location=not,alwaysRaised=yes,dependent=yes,resizable=yes,status=no,";
	
	    if (windowParams != null)
	    {
	        windowParams="help:no;"+windowParams;
	        ieWindowParams=windowParams;
	        nsWindowParams=windowParams.replace(/:/g,"=").replace(/;/g,",");
	    }
	
	    if (iWidth!=null && iWidth!="" && iHeight!=null && iHeight!="")
	    { var dlgLeft = (screen.width-iWidth)/2;
	      var dlgTop  = (screen.height-iHeight)/2;
	    
	      ieWindowParams+="dialogWidth:"+iWidth+"px;dialogHeight:"+iHeight+"px;";
	      nsWindowParams+="left="+dlgLeft+"px,top="+dlgTop+"px,width="+iWidth+"px,height="+iHeight+"px;";
	    }
	
	    if (this.isie)
	    {
	        if (window.event && window.event.ctrlKey && window.bMainPage!=true && window.bRepeaterPage!=true)
	        { var strMsg="Navigating to the following URL:\n\n"+url+"\n\nPress Ctrl+C to copy to the windows clipboard.";
	          alert(strMsg);
	        }
	
	        var ret = null;
	        if (navigable!=null && navigable==true)
	        {
	        	args[args.length] = url;
	            ret = window.showModalDialog("iemodal.htm",args,ieWindowParams);
	        }
	        else
	           ret = window.showModalDialog(url,args,ieWindowParams);
	        
	        if (ret!=null && fnCallback)
	           fnCallback(ret,extraArgs);
	    }
	    else
	    {
	        var win = null;
	        if(navigable!=null && navigable==true)
	        {
			    args[args.length]=url;
	            url="iemodal.htm";			
	        }
	
	        win = window.open(url,"MODAL"+iHeight, nsWindowParams);
	        
	        if (win==null)
	        {
	            alert("Error:  Popup windows are disabled in the browser; please enable popups in order to continue.");
	            return;
	        }
	           
	        if (fnCallback)
	            win.cb=fnCallback;
	        win.dialogArguments=args;

			if (this.issafari)
			{
				_cb=fnCallback;	        
		        _dialogArguments=args;
				_extraArgs=extraArgs;
			}

	        win.extraArgs=extraArgs;
	        win.focus();
	    }
	}

	this.getInnerText = function(node)
		{
		    if (node==null)
		       return "";
		
		    var innerT = "";
		    if(node.hasChildNodes())
		    {
		        for(var i=0;i<node.childNodes.length;i++)
		        {
		            if(node.childNodes[i].tagName!="SCRIPT")
		                innerT += util_getInnerText(node.childNodes[i]);
		        }
		    }
		    else
		    {
		        innerT = node.nodeValue;
		    }
		
		    if (innerT==null)
		       innerT="";
		
		    return innerT;
		}

	this.setInnerText = function (node, text)
		{
		    if ((node==null) || (text==null))
		       return;
		
		    node.innerHTML = "";
		    node.appendChild(document.createTextNode(text));
		}

	this.selectNodes=function(currnode,xpath,bNoArray)
		{
			if(!currnode)
				return null;
		
			if(this.isie)
			{
				try
				{	
					return currnode.selectNodes(xpath);
				}
				catch (e)
				{
					return new Array();
				}
			}
			else if(this.issafari)
			{
				var tags = xpath.split("/");
				if(tags[0].length==0 && tags[1]!=currnode.tagName)
					return null;
				var s = (tags[0].length==0)?2:1;

				var xPathResult = recurseSingleNodeFind(currnode, tags, s, false).parentNode;

				if (bNoArray==true)
				   return xPathResult;
				var aNodeArray = new Array();
				if (xPathResult)
				{
					for (var i=0; i<xPathResult.childNodes.length; i++)
					{	if (xPathResult.childNodes[i].nodeType==1 && xPathResult.childNodes[i].tagName==tags[tags.length-1])
							aNodeArray[aNodeArray.length] = xPathResult.childNodes[i];
					}
				} 
				return aNodeArray;
			}
			else
			{
				var xPathResult = null;
				if(currnode.ownerDocument==null)
					xPathResult=currnode.evaluate(xpath, currnode, null, 0, null);
				else
					xPathResult=currnode.ownerDocument.evaluate(xpath, currnode, null, 0, null);
				
				if (bNoArray==true)
				   return xPathResult;
				
				var aNodeArray = new Array();
				if (xPathResult)
				{
					var oNode = null;
					while((oNode=xPathResult.iterateNext()))
					{
						aNodeArray[aNodeArray.length] = oNode;
					}
				} 
				return aNodeArray;
			}
		}
	this.selectSingleNode = function(currnode,xpath)
		{
			if(!currnode)
				return null;
		
			if(this.isie)
			{
				return currnode.selectSingleNode(xpath);
			}
			else if(this.issafari)
			{
				var tags = xpath.split("/");
				if(tags[0].length==0 && tags[1]!=currnode.tagName)
					return null;
				var s = (tags[0].length==0)?2:1;
				return recurseSingleNodeFind(currnode, tags, s, false);
			}
			else   // isnetscape
			{
				if(currnode.ownerDocument==null)
					return currnode.evaluate(xpath,currnode,null,0,null).iterateNext();
				else
					return currnode.ownerDocument.evaluate(xpath,currnode,null,0,null).iterateNext();
			}
		}

	this.selectSingleNodeText = function(currnode,xpath,bRelative)
		{
			if(!currnode)
				return null;

			if (typeof(currnode)=="string")
			   return currnode;
			   		
			if(this.isie)
			{
				var node = currnode.selectSingleNode(xpath);
				if(node!=null)
					return node.text;
				else
					return null;
			}
			else if(this.issafari)
			{
				var tags = xpath.split("/");
				if(tags[0].length==0 && tags[1]!=currnode.tagName)
					return null;
				var s = (tags[0].length==0)?2:1;
				
				if (bRelative==true)  // Workaround for Safari
					s=0;
					
				return recurseSingleNodeFind(currnode, tags, s, true);
			}
			else   // isnetscape
			{
				var node = null;
				if(currnode.ownerDocument==null)
					node=currnode.evaluate(xpath,currnode,null,0,null).iterateNext();
				else
					node=currnode.ownerDocument.evaluate(xpath,currnode,null,0,null).iterateNext();
		
				if(node!=null)
				{
					if(node.firstChild!=null)
						return node.firstChild.nodeValue;
					else
						return "";
				}
				else
					return null;
			}
		}

	this.setFocusToCtrl = function(strCtrl)
		{
			try
			{ 
				document.getElementById(strCtrl).focus(); 
				document.getElementById(strCtrl).select(); 
			}
			catch (e) {}
		}

	// Returns the URL query string parameters as a hashtable
	this.getURLParams = function()
	{
		if(window.location.search.length>1)
		{
			var nvs = window.location.search.substring(1).split("&");
			if(nvs.length>0)
			{
				var ret = new Object();
				for(var i=0;i<nvs.length;i++)
				{
					var nv = nvs[i].split("=");
					if(nv.length==2)
						ret[nv[0]] = nv[1];
					else
						ret[nv[0]] = "";
				}
				return ret;
			}
			else
				return null;
		}
		else
			return null;
	}

	this.addOption = function(lb,strValue,strLabel,index)
		{
		    var oOption = document.createElement("OPTION");
			lb.options.add(oOption, index);
					    
		    if (strLabel==null)
		       strLabel=strValue;

		    oOption.text=strLabel;
		    oOption.value=strValue;
		    
		    return oOption;
		}

	// This function will set a value of a listbox to strValue.  It will guarantee
	// the value of the listbox will be set properly with an existing value
	this.setListBoxValue = function(lbList,strVal)
		{
		    if (lbList==null)
		       return;
		       
		    for (var i=0; i<lbList.options.length; i++)
		    {
		        if (lbList.options[i].value==String(strVal))
		        { lbList.options[i].selected=true;
		          // lbList.selectedIndex=i;
		          return i;
		        }
		    }
		    
		    return -1;
		}

	this.advanceField = function(event,currentField,strNextFieldName,iMaxLen)
		{
			if ((event.keyCode>=48 && event.keyCode<=57) ||  // Number
			    (event.keyCode>=65 && event.keyCode<=122))   // Alpha
			{
				if (currentField.value.length == iMaxLen)
				{
					document.getElementById(strNextFieldName).focus();
					document.getElementById(strNextFieldName).select();
				}
			}
		}

	this.getCurrentStyle = function(obj,attribute)
		{
		    if (typeof(obj) == 'string') 
		    	obj = document.getElementById(obj);
			
			if (obj.style[attribute])
			{	// inline style property
				return obj.style[attribute];
			} else if (obj.currentStyle)
			{	// external stylesheet for Explorer
				return obj.currentStyle[attribute];
			}
			else if (document.defaultView && document.defaultView.getComputedStyle)
			{	// external stylesheet for Mozilla and Safari 1.3+
				attribute = attribute.replace(/([A-Z])/g, "-$1");
				attribute = attribute.toLowerCase();
				var ret=document.defaultView.getComputedStyle(obj,"");
				if (ret!=null)
					return ret.getPropertyValue(attribute);
			}

			return null;
		}

	this.removeNode = function(obj)
		{
		    return obj.parentNode.removeChild(obj);
		}

	this.removeTableRows = function(tbl, bSaveHeaderRow)
		{
			var iStartRow=0;
			if (bSaveHeaderRow==true)
				iStartRow=1;
				
			if (tbl!=null)
			{
				while (tbl.rows.length > iStartRow)
					_util.removeNode(tbl.rows[iStartRow]);
			}
		}
		
	// Returns the URL query string parameters as a hashtable
	this.getURLParams = function()
		{
			if(window.location.search.length>1)
			{
				var nvs = window.location.search.substring(1).split("&");
				if(nvs.length>0)
				{
					var ret = new Object();
					for(var i=0;i<nvs.length;i++)
					{
						var nv = nvs[i].split("=");
						if(nv.length==2)
							ret[nv[0]] = nv[1];
						else
							ret[nv[0]] = "";
					}
					return ret;
				}
				else
					return null;
			}
			else
				return null;
		}
		
	this.getBaseUrl = function(path)
		{
			var href = window.document.location.href;
			var up = href.indexOf("://");
			href = href.substr(up + 3);
			var link = "http://";
			
			var arg = href.split("/");
			var pos = arg[0].indexOf(":");
			var point = "/";
			if(pos > 0)
			{
				var point = href.substr(pos +1,4);
				if("8443" == point)
					point = "8080";
				link = link + href.substr(0,pos) + ":" + point;
			}
			else
			{
				link = link + arg[0];
			}
			var strPath = "" != path  ? path :"";
			link = link + "/" + arg[1] + "/" + strPath;
		
			return link;
		}	

	this.isDemoUser = function(xml)
		{
			var demoUser=false;

			try
			{
				var result = _util.selectSingleNodeText(xml, "/result/code");
				if (result!=null && result=="nodemoaccess")
				{
					alert(getLocalizedString("demo_user_no_access"));
					demoUser=true;
				}
			}
			catch (e)
			{
				// alert("isDemoUser():  Invalid returned xml value: '"+xml+"'");
			}
			
			return demoUser;
		}
		
	this.validateEmail = function(email)
	{
		email = this.trim(email);
		var objRegExp  = /(^[a-zA-Z0-9]([a-zA-Z0-9_\-\$\~\.]*)@([a-zA-Z0-9_\-\.]*)([.][a-zA-Z]{3})$)|(^[a-zA-Z0-9]([a-zA-Z0-9_\.]*)@([a-zA-Z0-9_\-\.]*)(\.[a-zA-Z]{2,3})(\.[a-zA_Z]{2})*$)/i;
		return objRegExp.test(email);
	}
}
		
function recurseSingleNodeFind(node, tags, x, getText)
{
	for(var i=0;i<node.childNodes.length;i++)
	{
		if(node.childNodes[i].nodeType==1)
		{
			if(node.childNodes[i].tagName==tags[x])
			{
				if(x==tags.length-1)
				{
					if(getText)
					{
						if(node.childNodes[i].firstChild!=null)
						{
							return node.childNodes[i].firstChild.nodeValue;
						}
						else
						{
							return "";
						}
					}
					else
						return node.childNodes[i];
				}
				else
					return recurseSingleNodeFind(node.childNodes[i], tags, x+1, getText);
			}
		}
	}
}

<!-- Mouse Action -->
function onMouseAction(obj,type)
{
	if(type != null)
	{
		var temp = "";
		if('over' == type)//mouse over action
			temp = 'mover';
		else if('out' == type)//mouse out action
			temp = 'mout';
		var oldCN = obj.className;
		var n = oldCN.indexOf('_');
		if(n != -1)
			oldCN = oldCN.substr(0,n);
			
		obj.className = oldCN + "_" + temp;
	}
}

function getELById(id)
{
	return document.getElementById(id);
}
function getELsByName(name)
{
	return document.getElementsByName(name);
}
function getFieldVal(id)
{
	var field = getELById(id);
	if(!field)
		return "";
	return field.value;
}
function getSelectFieldVal(id)
{
	var field = getELById(id);
	var index = field.selectedIndex;
	if(index < 0)
		return "";
	return field.options[index].innerHTML;
}
function getSelectOptionVal(id)
{
	var field = getELById(id);
	var index = field.selectedIndex;
	if(index < 0)
		return "";
	return field.options[index].value;
}
function getSelectOptionFieldVal(id,name)
{
	var field = getELById(id);
	var index = field.selectedIndex;
	if(index < 0)
		return "";
	return field.options[index].getAttribbute(name);
}
function getCheckedValues(name)
{
	var elems = getELsByName(name);
	var values = new Array();
	for(var i = 0;i < elems.length;i++)
	{
		var item = elems[i];
		if(item.checked)
			values.push(item.value);
	}
	return values;
}
function formatCC(strNumber)
{
	return "XXXX-XXXX-XXXX-"+strNumber.substring(12);
}

function maskCC(strNumber)
{
	strNumber = _util.trim(strNumber);
	var length = strNumber.length;
	if (strNumber.length > 4)
	{
		var end = strNumber.substr(length - 4);
		var str = "";
		for (var i = 0; i < length - 4; i++) str += "X";
		return str + end;
	}
	return "XXXX";
}

Number.prototype.add = function(obj)
{
	return forAdd(obj,this);
}

function forAdd(arg1,arg2){
    var r1,r2,m;
    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
    m=Math.pow(10,Math.max(r1,r2))
    return (arg1*m+arg2*m)/m
}

function changeStyle(obj,className)
{
	if(!obj) return;
	var tempClassName = obj.className;
	if(tempClassName.indexOf("sel") == -1)
		obj.className = className;
}

// btn, the button object
// type, '' | 'over' | 'disable' | 'normal' (same as '')
// style_key, e.g. 'btn_back', then normal class name is 'btn_back', over is 'btn_back_over', disable is 'btn_back_dis' 
function changeButtonStyle(btn, type, style_key)
{
	var is_disable = (btn ? isButtonDisabled(btn.id) : false);
	var name = style_key;
	if (type == "over")
		name += (is_disable ? "_dis" : "_over");
	else if (type == "disable" || is_disable)
		name += "_dis";
	if (btn) btn.className = name;
}

// [{"name":"abc", "status":"disable"}]
var btn_status_arr = [];
function isButtonDisabled(btn_id)
{
	return (getButtonStatus(btn_id) == "disable");
}
function getButtonStatus(btn_id)
{
	var btn_status = null;
	for (var i = 0; i < btn_status_arr.length; i++)
	{
		if (btn_status_arr[i].name = btn_id)
		{
			btn_status = btn_status_arr[i];
			break;
		}
	}
	if (btn_status && btn_status.status == "disable") return "disable";
	return "normal";
}
// btn_id, the button name
// type, '' | 'disable' | 'normal' (same as '')
function setButtonStatus(btn_id, type)
{
	var btn_status = null;
	for (var i = 0; i < btn_status_arr.length; i++)
	{
		if (btn_status_arr[i].name = btn_id)
		{
			btn_status = btn_status_arr[i];
			break;
		}
	}
	type = (type == "disable" ? "disable" : "normal");
	if (btn_status)
		btn_status.status = type;
	else
		btn_status_arr[btn_status_arr.length] = {"name":btn_id, "status":type};
		
	var btn = document.getElementById(btn_id);
	if (btn)
		btn.disabled = (type == "disable");
}

function disableElm(id, flag)
{
	var obj_ = document.getElementById(id);
	if (obj_) obj_.disabled = flag;
}


function getEl(id)
{
	return document.getElementById(id);
}

function getEls(name)
{
	return document.getElementsByName(name);
}
	
function setBtnStyle(elem, action)
{
	if (!elem) return;
	// klNextImg, klNextImgOver, klNextImgDis, klNextImgDisOver			
	var cls = elem.className;
	if (!cls) return;
	var base = cls;
	var is_dis = false, is_over = false;
	var len = cls.length;
	if (len > 7 && cls.substring(len - 7, len) == "DisOver") 
	{
		base = cls.substring(0, len - 7);
		is_dis = true;
		is_over = true;
	}
	else if (len > 4 && cls.substring(len - 4, len) == "Over") 
	{
		base = cls.substring(0, len - 4);
		is_over = false;
	}
	else if (len > 3 && cls.substring(len - 3, len) == "Dis") 
	{
		base = cls.substring(0, len - 3);
		is_dis = true;
	}
	if (action=="over")
		cls = base + (is_dis ? "DisOver" : "Over");
	else if (action=="out")
		cls = base + (is_dis ? "Dis" : "");
	else if (action=="dis")
		cls = base + (is_over ? "DisOver" : "Dis");
	else 
		cls = base + (is_over ? "Over" : "");
	elem.className = cls;
}

function isDisabledBtn(elem)
{
	if (!elem) return false;
	var cls = elem.className;
	var len = cls.length;
	return ((len > 7 && cls.substring(len - 7, len) == "DisOver") || (len > 3 && cls.substring(len - 3, len) == "Dis"))
}
	
function isCheckedImg(elem)
{
	if(!elem) return false;	
	var cls = elem.className;
	if(!cls) return false;
	return (cls == "klRadioImgChecked");
}

function setImgChecked(elem, checked)
{
	if(!elem) return;	
	elem.className = (checked ? "klRadioImgChecked" : "klRadioImg");
}

var format = function (number, form) {
    var forms = form.split('.'), number = '' + number, numbers = number.split('.')
        , leftnumber = numbers[0].split('')
        , exec = function (lastMatch) {
            if (lastMatch == '0' || lastMatch == '#') {
                if (leftnumber.length) {
                    return leftnumber.pop();
                } else if (lastMatch == '0') {
                    return lastMatch;
                } else {
                    return '';
                }
            } else {
                return lastMatch;
            }
    }, string
    
    string = forms[0].split('').reverse().join('').replace(/./g, exec).split('').reverse().join('');
    string = leftnumber.join('') + string;
    
    if (forms[1] && forms[1].length) {
        leftnumber = (numbers[1] && numbers[1].length) ? numbers[1].split('').reverse() : [];
        string += '.' + forms[1].replace(/./g, exec);
    }
    return string.replace(/\.$/, '');
};	

function disableElem(elem, flag)
{
	if (elem)
	{
		if (flag && elem.checked) elem.checked = false;
		elem.disabled = flag;
	}
}

function disableElemById(id, flag)
{
	var elem = getEl(id);
	disableElem(elem, flag);
}

// apply to checkbox
function updateCheckbox(value_list, check_name)
{
	var elems = getEls(check_name);
	if (!(elems && elems.length > 0)) return;
	
	var checked = false;
	var list = [];
	if (value_list) list = value_list.split(",");
	for (var i = 0; i < elems.length; i++)
	{
		checked = false;
		for(var j = 0; j < list.length; j++)
		{
			if(elems[i].value == list[j] && !elems[i].disabled) 
			{
				checked = true;
				break;
			}
		}
		elems[i].checked = checked;
	}
}

// apply to radiolist
function updateRadiolist(value, radio_name)
{
	var elems = getEls(radio_name);
	if (!(elems && elems.length > 0)) return;
	
	var checked = false;
	for (var i = 0; i < elems.length; i++)
	{
		if(elems[i].value == value && !elems[i].disabled) 
		{
			elems[i].checked = true;
			checked = true;
			break;
		}
	}
	if (!checked && !elems[0].disabled) elems[0].checked = true;
}
