//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function removeChildren( o ) {
	var i = null;
	if ( o.childNodes && o.childNodes.length > 0 ) {
		while( o.firstChild ) {
			try {
				i = o.removeChild( o.firstChild );
				removeEvents( i );
				i = removeChildren( i );
			} catch ( e ) {}
		}
	}
}

var myBrowser = GetBrowser();
function GetBrowser() {
try{
	var agt=navigator.userAgent.toLowerCase();
	if (agt.indexOf("opera") != -1) return 'Opera';
	if (agt.indexOf("staroffice") != -1) return 'Star Office';
	if (agt.indexOf("webtv") != -1) return 'WebTV';
	if (agt.indexOf("beonex") != -1) return 'Beonex';
	if (agt.indexOf("chimera") != -1) return 'Chimera';
	if (agt.indexOf("netpositive") != -1) return 'NetPositive';
	if (agt.indexOf("phoenix") != -1) return 'Phoenix';
	if (agt.indexOf("firefox") != -1) return 'Firefox';
	if (agt.indexOf("safari") != -1) return 'Safari';
	if (agt.indexOf("skipstone") != -1) return 'SkipStone';
	if (agt.indexOf("msie") != -1) return 'IE';
	if (agt.indexOf("netscape") != -1) return 'Netscape';
	if (agt.indexOf("mozilla/5.0") != -1) return 'Mozilla';
	if (agt.indexOf('\/') != -1) {
	if (agt.substr(0,agt.indexOf('\/')) != 'mozilla') {
	return navigator.userAgent.substr(0,agt.indexOf('\/'));}
	else return 'Netscape';} else if (agt.indexOf(' ') != -1)
	return navigator.userAgent.substr(0,agt.indexOf(' '));
	else return navigator.userAgent;
	} catch (e){}
}

function btfover(oSource){
	var re = /_n/i;
	var style = oSource.className;
	style = style.replace(re,"_h");
	oSource.className = style;
}
function btfout(oSource){
	var re = /_h/i;
	var style = oSource.className;
	style = style.replace(re,"_n");
	oSource.className = style;
}

function isyear(obj){
	obj.setAttribute("bad",false);
	obj.backgroundColor = "";
	if (obj.value){
		if (isNaN(parseInt(obj.value))){
			obj.setAttribute("bad",true);
			obj.style.backgroundColor = "pink";
			alert("Entry must be a number");
		} else {
			var y = parseInt(obj.value);
			if ((y < 1990) || (y > 2099)){
				obj.setAttribute("bad",true);
				obj.style.backgroundColor = "pink";
				alert("Invalid year!");
			}
		}
	}
}

function popwindow(href,width,height){
	if ((width)&&(height)){
		window.open(href,'_blank','width=' + width + ', height=' + height + ', status=yes, resizable=yes, scrollbars=yes, toolbar=no, location=no, directories=no, menubar=no, copyhistory=n');
	} else {
		// fullscreen mode
		//window.open(href,'_blank','fullscreen=yes titlebar=yes status=yes, resizable=yes, scrollbars=yes, toolbar=no, location=no, directories=no, menubar=yes, copyhistory=n');
		width = window.screen.width;
		height = window.screen.height;
		window.open(href,'_blank','top=0 left=0 width=' + width + ', height=' + height + ', status=no, resizable=yes, scrollbars=yes, toolbar=no, location=no, directories=no, menubar=no, copyhistory=n');
	}
}

function popform(formid,index,width,height){
	var href = "view.php?frm=" + formid + "&indx=" + index;
	popwindow(href,width,height);
}

function popgroup(groupid,index,width,height){
	var href = "view.php?grp=" + groupid + "&indx=" + index;
	popwindow(href,width,height);
}

function navto(location){
	window.location = location;
}

function submitform(method){
	document.getElementById("formmethod").value = method;
	document.ThisForm.submit();
}

function hide(id){
	if (document.getElementById(id)){
		document.getElementById(id).style.display = "none";
	} else {
		alert("hide '" + id + "' failed");
	}
}

function show(id){
	if (document.getElementById(id)){
		document.getElementById(id).style.display = "";
	} else {
		alert("show '" + id + "' failed");
	}
}

function toggle(id){
	if (document.getElementById(id)){
		if (document.getElementById(id).style.display == "none"){
			document.getElementById(id).style.display = "";
			return true;
		} else {
			document.getElementById(id).style.display = "none";
			return false;
		}
	} else {
		alert("toggle '" + id + "' failed");
		return null;
	}
}

function chooseif(l,t,f){
	if (l){
		return t;
	} else {
		return f;
	}
}

function contains(src,find,flag){
	// if find in src
	try{
		var re = new RegExp(find,flag);
		if (src.search(re) >= 0){
			return true;
		} else {
			return false;
		}
	} catch (e){
		return false;
	}
}

function setctlval(ctl,val){
	if (typeof(ctl)!="object"){
		ctl = document.getElementById(ctl);
	}
	if (ctl.tagName == "INPUT"){
		if (ctl.type=="checkbox"){
			if (val){
				ctl.checked = true;
			}else{
				ctl.checked = false;
			}
		} else {
			ctl.value = val;
		}
	} else if (ctl.tagName == "SELECT"){
		ctl.value = val;
	} else {
		ctl.innerHTML = val;
	}
}
		
function kstr2array(kstr,dlms){
// core key string to array function
	var aout = new Array();
	var adlms = dlms.split(",");
	var skey;
	var askey;
	kstr = kstr.substring(adlms[0].length, kstr.length - adlms[2].length);
	var akstr = kstr.split(adlms[2] + adlms[0]);
	for (var i=0; i<akstr.length;i++){
		skey = akstr[i];
		askey = skey.split(adlms[1])
		if (askey[1]){
			aout[askey[0]] = askey[1];
		} else {
			aout[askey[0]] = "";
		}
	}
	return aout;
}

function populate(kstr){
	// populate controls from a key [|] string
	if (kstr){
		var arx = kstr2array(kstr,"[,|,]");
		for (var x in arx){
			if (document.getElementById(x)){
				setctlval(document.getElementById(x),arx[x]);
				//document.getElementById(x).value = arx[x];
			}
		}
	}
}

// jS object Utilities

// ************ IE / FF Compatibility ***********
function getTag(obj){
	// account for tagname /node name BS
	if (obj.nodeName){
		return obj.nodeName;
	} else if (obj.tagName){
		return obj.tagName;
	} else {
		return false;
	}
}

function getParent(obj){
	// account for tagname /node name BS
	if (obj.parentNode){
		return obj.parentNode;
	} else if (obj.parentElement){
		return obj.parentElement;
	} else {
		return false;
	}
}

function attachevent2(obj,evt,fun){
// IE SAFET Event attach
	switch (evt){
		case "onchange" :
			obj.onchange = function(){eval(fun);}
			break;
		case "onfocus" :
			obj.onfocus = function(){eval(fun);}
			break;
		case "onblur" :
			obj.onblur = function(){eval(fun);}
			break;
		case "onclick" :
			obj.onclick = function(){eval(fun);}
			break;
		case "onmousedown" :
			obj.onmousedown = function(){eval(fun);}
			break;
		case "onmouseup" :
			obj.onmouseup = function(){eval(fun);}
			break;
	   case "onmouseover" :
			obj.onmouseover = function(){eval(fun);}
			break;
	   case "onmousemove" :
			obj.onmousemove = function(){eval(fun);}
			break;
	   case "onkeydown" :
			obj.onkeydown = function(){eval(fun);}
	   case "onkeyup" :
			obj.onkeyup = function(){eval(fun);}
			break;
	   case "onkeypress" :
			obj.onkeypress = function(){eval(fun);}
			break;
	}
}
// ********************************

function attachevent(obj,evt,fun){
	if (obj.addEventListener) {
		evt = evt.substr(2); //remove the "on"
		//alert("event:" + evt + "  fun:" + fun);
		obj.addEventListener(evt, function(){eval(fun)}, false);
	} else if ( obj.attachEvent ) {
		obj.attachEvent(evt, function(){eval(fun)});
	} else {
		obj[evt] = fun;
	}
}
// ********************************

function removeEvents( o ) {
	if ( typeof o == 'object' ) {
		var events = new Array("onclick", "onblur", "onmouseover", "onmouseout", "onmousedown", "onmouseup");
		for ( var x = 0 ; x < events.length ; x++ ) {
			o[events[x]] = null;
		}
	}
}

function drillto(obj,tag){
// drill down to the first sub tag
	if (obj.children) {
		if (obj.children.length > 0){
			for (var j=0; j < obj.children.length;j++){
				if (getTag(obj.children[j]) == tag){
					return obj.children[j];
				} else {
					var subobj = drillto(obj.children[j],tag);
					if (subobj){
						return subobj;
					}
				}
			}
		}
	}
	return null;
}

function drilltoid(obj,id){
// drill down to the first sub id
	if (obj.children) {
		if (obj.children.length > 0){
			for (var j=0; j < obj.children.length;j++){
				if (obj.children[j].id){
					if (obj.children[j].id == id){
						return obj.children[j];
					} else {
						var subobj = drilltoid(obj.children[j],id);
						if (subobj){
							return subobj;
						}
					}
				}
			}
		}
	}
	return null;
}

function drillup(obj,tag){
// drill up to the first sub tag
	var xtag;
	while (obj){
		xtag = getTag(obj);
		if (xtag.toLowerCase() == tag.toLowerCase()){
			return obj;
		}
		obj = getParent(obj);
	}
	return null;
}

function findinrow(id,trobj){
// find a control in corresponding row
	var tr = trobj;
	if (getTag(trobj) != "TR"){
		tr = drillup(trobj,"TR");
	}
	if (typeof(tr) == "object"){
		if (getTag(tr) != "TR"){
			alert("error in ObjUtilities.findinrow!");
			return false;
		}
		if (tr.document.getElementById(id)){
			for (var i=0;i<tr.cells.length;i++){
				if(tr.cells[i].children){
					for (var j=0;j<tr.cells[i].children.length;j++){
						if (tr.cells[i].children[j].id == id){
							return tr.cells[i].children[j];
						}
					}
				}
			}
		} else {
			return false;
		}
	}
	return null;
}

function clearrow(trobj){
// find a control in corresponding row
	var tr = trobj;
	if (trobj.tagName != "TR"){
		tr = drillup(trobj,"TR");
	}
	if (typeof(tr) == "object"){
		if (tr.tagName != "TR"){
			alert("error in ObjUtilities.clearrow!");
			return false;
		}

		for (var i=0;i<tr.cells.length;i++){
			if(tr.cells[i].children){
				for (var j=0;j<tr.cells[i].children.length;j++){
					if (tr.cells[i].children[j].tagName == "INPUT"){
						if (tr.cells[i].children[j].type != "checkbox"){
							tr.cells[i].children[j].value = "";
						}
					}
				}
			}
		}
	}
	return null;
}

//utility fun needed in datebox HTC returns true if parentid (pid)
function isAChildOf(obj,pid){
	while(obj){
		if (obj.id){
			if (obj.id == pid){
				return true;
			}
		}
		obj = obj.parentNode;
	}
	return false;
}

function abspos(obj){
	var dx = 0;
	var dy = 0;
/*	if (obj.getAttribute("calYoffset")){
		dy = parseInt(obj.getAttribute("calYoffset"));
	}
*/
	while(obj.offsetParent){
		dx = dx + obj.offsetLeft;
		dy = dy + obj.offsetTop;
		obj = obj.offsetParent;
	}
	var apos = new Array();
	apos["x"] =  dx;
	apos["y"] =  dy;
	return apos;
}


function datatable(obj){
	// object to map the TH fom a table or its children
	// use the child obj
	var dtable;
	var aFlds = new Array();
	var aUndo = new Array();
	var fldname;
	var drow;
	var mr;
	dtable = drillup(obj,"TABLE");

	if (dtable){
		for (var i=0; i < dtable.rows.length; i++) {
			mr = dtable.rows(i);
			if (mr.cells(0).tagName == "TH"){
				for (var j=0; j < mr.cells.length; j++) {
					if (mr.cells(j).getAttribute("fld")){
						// establish the reference
						fldname = mr.cells(j).getAttribute("fld");
						fldname = fldname.toLowerCase();
						aFlds[fldname] = j;
					}
				}
				break;
			}
		}
	}
//alert("wtf:" + dtable.id + ":" + aFlds.length);
//--------
	this.setcell = function(Index,FieldName,value,color,bgcolor){
		if (dtable.document.getElementById("r_" + escape(Index))){
			var tr = dtable.document.getElementById("r_" + escape(Index));
			FieldName = FieldName.toLowerCase();
			if (aFlds[FieldName]){
				if (tr.cells(aFlds[FieldName])){
					var td = tr.cells(aFlds[FieldName])
					if (!aUndo[Index]){aUndo[Index] = new Array();}
					if (td.children(0)){
						var elem = td.children(0);
						if (!aUndo[Index][FieldName]){
							aUndo[Index][FieldName] = getVal(elem);
						}
						setVal(elem,value);
					} else {
						if (!aUndo[Index][FieldName]){
							aUndo[Index][FieldName] = td.innerHTML;
						}
						td.innerHTML = value;
					}
					if (bgcolor){
						td.style.backgroundColor = bgcolor;
					}
					if (color){
						td.style.color = color;
					}
				}
			}
		}
	}
	this.getcell = function(Index,FieldName){
		if (dtable.document.getElementById("r_" + Index)){
			var tr = dtable.document.getElementById("r_" + Index);
			FieldName = FieldName.toLowerCase();
			if (tr.cells(aFlds[FieldName])){
				var td = tr.cells(aFlds[FieldName])
				if (td.children(0)){
					var elem = td.children(0);
					return getVal(elem);
				} else {
					return td.innerHTML;
				}
			}
		}
		return null;
	}
	this.getUndo = function(){
		var index;
		var s = ""
		var field;
		for (index in aUndo){
			s += "{" + index + "~";
			for (field in aUndo[index]){
				s += "[" + field + "|" + aUndo[index][field] + "]";
			}
			s += "}";
		}
		return s;
	}

	this.setUndo = function(obj){
		// set the undo for a control
		var drow = drillup(obj,"TR");
		var fldname = obj.id;
		var afn =  fldname.split("~");
		fldname = afn[0];
		fldname = fldname.toLowerCase();
		if (drow&&fldname) {
			var indx = unescape(drow.id);
			indx = indx.substr(2);
			if (!aUndo[indx]){aUndo[indx] = new Array();}
			if (!aUndo[indx][fldname]){aUndo[indx][fldname] = obj.getAttribute("undo");}
		}
	}
}

function setval(elem,value){
	if (typeof(elem) != "object"){
		if (document.getElementById("elem")){
			elem = document.getElementById("elem");
		} else {
			return false;
		}
	}
	if (elem.tagName == "INPUT"){
		if (elem.type == "checkbox"){
			if (value){
				elem.checked = true;
				value = 1;
			} else {
				elem.checked = false;
				value = 0;
			}
		} else { //text controls
			elem.value = value;
		}
	} else if (elem.tagName == "SELECT") {
		//setselecttext(elem,value);
		elem.value = value;
	} else if ((elem.tagName == "SPAN")||(elem.tagName == "DIV")||(elem.tagName == "A")||(elem.tagName == "TEXTAREA")){
		elem.innerHTML = value;
	}
}

function getval(elem,txt){
	if (typeof(elem) != "object"){
		if (document.getElementById(elem)){
			elem = document.getElementById(elem);
		} else {
			return false;
		}
	}
	if (elem.tagName == "INPUT"){
		if (elem.type == "checkbox"){
			if (elem.checked == true){
				if (txt){
					return "<img src='images/ck_y.gif' />";
				} else {
					return 1;
				}
			} else {
				if (txt){
					return "<img src='images/ck_n.gif' />";
				} else {
					return 0;
				}
			}
		} else { //text controls
			return elem.value;
		}
	} else if (elem.tagName == "SELECT") {
		if (txt){
			return getselecttext(elem);
		} else {
			return elem.value;
		}
	} else if ((elem.tagName == "SPAN")||(elem.tagName == "DIV")||(elem.tagName == "A")||(elem.tagName == "TEXTAREA")){
		return elem.innerHTML;
	}
	return null;
}

function getselecttext(slct){
var dlm =""
var o = ""
	if (slct){
		if (slct.options){
			var opt = slct.options
			for (k=0; k < opt.length; k++) {
				if (opt[k].value == slct.value){
					o = o + opt[k].text + dlm;
					if (slct.type == "select-one"){
						//alert(o);
						return o;
						break;
					}else{
						dlm = ", "
					}
				}
			}
		}
	}
	return o;
}

function stripquotes(s){
	if (s){
		if((s.substr(0,1) == '"')||(s.substr(0,1) == "'")){
			return s.substr(1,s.length - 2);
		}
	}
	return s;
}

// ****** Validation Functions ************

function fieldok(obj,ok){
	if (ok){
		obj.style.backgroundColor = "#ffffff";
		obj.setAttribute("baddata",0);
	} else {
		obj.style.backgroundColor = "#ff9999";
		obj.setAttribute("baddata",1);
	}
}

function checkZIP(obj) {
var field = obj.value;
var re;
var msg = "Invalid characters in your zip code.  Please try again.\n Zip Code must be 5 digit or 5 digit+four format, or 6 character Canadian Postal Code";

	if (field.length == 5) {
		re = /(\d{5})/
	} else if (field.length == 10) {
		re = /(\d{5})(-\d{4})/
	} else if (field.length == 6) {
		// canada  space
		re = /\S{6}/
		obj.value = field.toUpperCase()
	} else if (field.length == 7) {
		// canada  space
		re = /\S{3}[\s,-]\S{3}/
		obj.value = field.toUpperCase()

	} else {
		fieldok(obj,false);
		alert(msg);
		return false;
	}
	if (re.test(field)){
		fieldok(obj,true);
		return true;
	} else {
		fieldok(obj,false);
		alert(msg);
		return false;
	}
}

function setmaxchar(obj,maxchars){
var s = obj.value;
	if(s){
		if(s.length > maxchars){
			alert("Maximum of " + maxchars + " characters exceeded for " + obj.getAttribute("title"));
			obj.value = s.substring(0,maxchars-1);
			fieldok(obj,false);
			return false;
		}
	}
	fieldok(obj,true);
	return true;
}


function checkNumber(obj){
var str = obj.value;
	if (str){
		if (!parseFloat(str)){
			fieldok(obj,false);
			alert("Input must be a number");
			return false;
		} else {
			obj.value = parseFloat(str);
		}
	}
	fieldok(obj,true);
	return true;
}

function checkInt(obj){
var str = obj.value;
	if (str){
		if (!parseInt(str)){
			alert("Input must be an integer number");
			fieldok(obj,false);
			return false;
		} else {
			obj.value = parseInt(str);
		}
	}
	fieldok(obj,true);
	return true;
}

function checkEmail(obj) {
var str = obj.value;
var re = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;

	if (re.test(str)){
		fieldok(obj,true);
		return true;
	} else {
		fieldok(obj,false)
		alert("Invalid e-mail address!");
		return false;
	}
}

function checkPhone(obj){
var str = obj.value;
var re1 = /[(). -]/g;
var re2 = /\d{10}/; //must be 10 numbers
	str = str.replace(re1,"");
	if (re2.test(str)){
		str = "(" + str.substring(0,3) + ") " + str.substring(3,6) + "-" + str.substring(6,10);
		obj.value = str;
		fieldok(obj,true);
		return false;
	} else {
		fieldok(obj,false);
		alert("Invalid Phone#... Please enter (areacode) + 7 digit number");
		return true;
	}
}

function onenterkey(e,callback,obj){
var keycode; // enter key is 13
try{
	if(window.event) {
		keycode = e.keyCode; // IE
	} else if(e.which){
		keycode = e.which; // Firefox
	} else {
		return;
	}
	
	if (keycode == 13){
		if (!e) var e = window.event;
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
	
		if (obj){
			window[callback](obj);
		} else {
			window[callback]();
		}
	}
  } catch (x){}
}

function sectominsec(ns){
	// take seconds and convert to min:sec
	if (ns){
		var m = parseInt(ns / 60);
		var s = ns % 60;
		return pad(m,"0",2) + ":" + pad(s,"0",2);
	}
}

function pad(s,c,n){
	// pad s with n chars
	s = s.toString();
	s = repeat(c,n-s.length) + s;
	return s;
}

function repeat(c,n){
	var s = "";
	for (var i=0;i < n;i++){
		s += c;
	}
	return s;
}


