/*
************generic functions that just do stuff**********************************
function p_getValue(obj){
function p_collectAttribute(obj, p_name){
function Mod(a, b) {
**************************** attaching functions *****************************************
function addEvent(obj, evType, fn, useCapture){
function removeEvent(obj, evType, fn, useCapture){
function getObj(event) {
function changeValidation(obj, val, req){
function eventOrObject(event){
//*************Display functions very usefull for lots of things***********************************************************
function p_getOffsetTop(obj)//returns the offsetTop of an object in relation to the top of the Doc
//the body margin and padding must be set to 0 for these to work properly on inline objects
function p_getOffsetLeft(obj){
function p_getWidth(obj){//returns the width of the obj
function p_getHeight(obj)//returns the height of the obj
function p_getErrWidth(obj)//returns the width of the error message
function p_getErrHeight(obj)//returns the height of the error message
function p_hideBleed(obj)//loops through the Document and hides all elements that will bleed through DHTML
function p_centerErrMSG(eL, eW, oW, oS)//Places the error message centered on a form element
function p_ShowSel(obj)//Shows hidden elements
function p_hideErr()//hides the error message
function p_offField(obj)// this sets the background colors
function p_showError(obj)// Shows the error message
function val_Active(event)//this is the functions that calls the error message functionality
function val_Blur(event)// this happens onBlur and sets the background colors and hides the errMSG
//***********************this group of functions check custom attributes*********************************
function p_isRequired(obj)
function p_isFillDate(obj){
//********************************This section is used for validating the form on submit****************************************************
function p_allClear(frm)//checks the form for errors
function p_lastRequiredCheckDisplay(obj)//double checks the form at the end
function p_showSubmit(frm)//shows submit button if validation fails
function val_check(frm){
//********************************Date Formatting***************************************************
function val_MakeFullDate(event)//Formats Dates on blur event 
function p_fullDate(p)//returns a formatted date
//********************************stock validation********************************************************************
function p_inStrGrp(src,reg)//used to evaluate regular expressions
//********************************Date Manipulation functions********************************************************************
//some of these are using the built in names used by VB to make remembering them easier
function formatDate(vDate, vFormat)//returns a formated date - similar to VB function
function dateDiff(interval,fdate,tdate)//returns the difference between dates
//uses the same syntax as the VB function, but only does seconds through Days
function p_makeDate(p_time)//returns a date object
function p_makeNumDate(p){return new Date(p);}//returns a date object from a Julian number
function addZero(vNumber){ 
function isDate(varDate)//Returns error message based on date provided
//********************************date range stuff for validation********************************************************************
function getDayWord(obj, att){
function dateInRange(obj, dt){
function isNumber(p_value){//allows 0 and decimals for currency fields
function checkPrecision(obj){ //check precision abilities
//********************************date range stuff for validation********************************************************************
function numberInRange(obj){
//********************************Validation functions************************************************************************************
//Put the function name in the val attribute in the tag being evaluated
function v_date(event){
function v_text(event)//evaluates that a tag contains text doesn't count spaces or tabs as text
//using this on a SELECT will make it required
function v_number(event)//number function
function v_pattern(event)//pattern matching function for things like phone numbers and such
function v_none(event)//just a holder to allow people to set the events but not have validation
function v_address(event)//validation of all address fields
//usefull for people who are dynamically changing validation
///*********************************calendar crap**********************************************************
function setBefore(obj, dt, inc){
function setAfter(obj, dt, inc){
function getBefore(obj){
function getAfter(obj){
function cal_hover(){
function cal_unHover(){
function returnDateFromCalendar(){
function moveCalendar(){
function returnDay(day){//takes a number from a zero based array and returns a day name
function returnMonth(month){//takes a number from a zreo based array and returns a month name
function createCalendar(){//builds main elements of calendar
function createDayHeader(weekday,now,cal){//write days header
function createWeek(tbody,now,cal){
function showCalendar(){
function showMyCal(){
function hideCalender(event){
function initCalendar(){
function val_init()//loops the form and sets events for the validation stuff
function initLabels(){
///*********************************table sort stuff**********************************************************
function getCol(obj){
function sortR(a, b){
function numberSort(a, b) { return a - b}
function dateSort(a, b) {
function alphaSortI(a, b) { //ignore case
function alphaSortRI(a, b) { //, reverse sort, ignore case
function sortCells(a, b){
function sortTable(event){
function init_tablesort() {
*//*-----------------------------------Begin Real Code---------------------------------------------
The following refer to setting basic parameters in the tag being evaluated
to center error over element: default "No"
cErr = "Yes"
to shift error message use shift = "integer"
shift = "5"
for autodate fill
fillDate = "yes"
*/

//validation message display stuff
var pageSwitch=0;
var errMinWidth = 200;
var errSpaceAbove = 2;
var arrSpan = document.createElement("SPAN");
arrSpan.style.paddingLeft = "5px";
//var val_ArraySelect = new Array;

//************generic functions that just do stuff**********************************
function p_getValue(obj){
	return obj.value
}
function p_collectAttribute(obj, p_name){
	var p_val = obj.getAttribute(p_name);
	if(p_val != null){try{p_val = p_val.toUpperCase();}catch(err){/*alert(err)*/}}
	return p_val;
}
function Mod(a, b) {
    return a - Math.floor(a / b) * b;
}
//**************************** attaching functions *****************************************
// got these super handi functions from http://www.scottandrew.com he is pretty dang smart ***********************
function addEvent(obj, evType, fn, useCapture){
	//alert(obj);
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be attached");
  }
}
function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}

function getObj(event) {
	if (window.event) {
		target = window.event.srcElement;
	}else{
		if (event.tagName){
			target = event;
		}else{
			target = null;
			if(event.currentTarget){
				target = event.currentTarget;
			}
		}
  }
 	return target;
}
function changeValidation(obj, val, req){
	var oldVal = eval(obj.val)
	try{
		removeEvent(obj, "focus", val_Active, false);
		removeEvent(obj, "blur", val_Blur, false);
		removeEvent(obj, "keyup", val_Active, false);
		removeEvent(obj, "keyup", oldVal, false);
		removeEvent(obj, "focus", oldVal, false);
		removeEvent(obj, "blur", oldVal, false);
		removeEvent(obj, "change", val_Active, false);
		removeEvent(obj, "change", oldVal, false);
	}catch(err){}
	obj.val = val
	val = eval(val)
	addEvent(obj, "focus", val_Active, false);
	addEvent(obj, "blur", val_Blur, false);
	addEvent(obj, "keyup", val_Active, false);
	addEvent(obj, "keyup", val, false);
	addEvent(obj, "focus", val, false);
	addEvent(obj, "blur", val, false);
	addEvent(obj, "change", val_Active, false);
	addEvent(obj, "change", val, false);
	if(req){
		obj.setAttribute("required", "Y");
	}else{
		obj.setAttribute("required","N");
	}
}
function eventOrObject(event){
	if(event.type == "text" || event.type == "select" || event.type == "select-one" || event.type == "password" || event.type == "select-multiple" || event.type == "textarea"){
		var obj = event;
	}else{
		var obj = getObj(event);
	}
	return obj;
}
//*************Display functions very usefull for lots of things***********************************************************
//returns the offsetTop of an object in relation to the top of the Doc
//the body margin and padding must be set to 0 for these to work properly on inline objects
function p_getOffsetTop(obj){
	var objTop = 0;
	while (obj.offsetParent){
		objTop+=obj.offsetTop;
		obj = obj.offsetParent;
	}
	return objTop
}
function p_getOffsetLeft(obj){
	var objLeft = 0;
	while (obj.offsetParent){
		objLeft+=obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return objLeft
}
//returns the width of the obj
function p_getWidth(obj){
	return parseInt(obj.offsetWidth);
}
//returns the height of the obj
function p_getHeight(obj){
	return parseInt(obj.offsetHeight);
}
//returns the width of the error message
function p_getErrWidth(obj){
	var objWidth = obj.offsetWidth;
	if(objWidth < errMinWidth){
		return parseInt(errMinWidth);
	}else{
		return parseInt(objWidth);
	}
}
//returns the height of the error message
function p_getErrHeight(obj){
	return parseInt(obj.offsetHeight + errSpaceAbove);
}
//loops through the Document and hides all elements that will bleed through DHTML
function p_hideBleed(obj){
	var eT = p_getOffsetTop(obj);
	var eH = p_getHeight(obj);
	var eL = p_getOffsetLeft(obj);
	var eW = p_getWidth(obj);
	var val_ArraySelect = new Array;
	var ctr = 0;
	for (var j=0; j < document.forms.length; j++){
		if(document.forms[j].name != "doNotScan"){
			for (var i=0; i < document.forms[j].elements.length; i++){
				var el = document.forms[j].elements[i];
				if (el.type=="select-one"||el.type=="textarea"||el.type=="select-multiple"){
					var thisT = p_getOffsetTop(el);
					var thisH = p_getHeight(el);
					var thisL = p_getOffsetLeft(el);
					var thisW = p_getWidth(el);
					if(thisT > (eT-thisH) && thisT < (eT+eH)){
						if(thisL+thisW>eL&&thisL<eL+eW){
							if(el.style.visibility != 'hidden'){
								el.style.visibility = 'hidden';
								val_ArraySelect[ctr++]=el;
								obj.hideArray = val_ArraySelect;
							}
						}
					}
				}
			}
		}
	}
}
//Places the error message centered on a form element
function p_centerErrMSG(eL, eW, oW, oS){
	if(eL>((eW-oW)/2)){
		eL-=(eW-oW)/2;
		if(document.body.clientWidth+document.body.scrollLeft-(eL+eW)<0){
			eL=document.body.clientWidth+document.body.scrollLeft-eW-2;
		}
	}else{
		eL=2;
	}
	return eL+=parseInt(oS);
}
//Shows hidden elements
function p_ShowSel(obj){
	if(obj.hideArray){
		val_ArraySelect = obj.hideArray
		for(var i=0;i<val_ArraySelect.length;i++){
			val_ArraySelect[i].style.visibility = 'visible';
		}
		obj.hideArray = null;
	}
}
//hides the error message
function p_hideErr(){
	if(document.getElementById("errMSG")){
		document.getElementById("errMSG").style.display = "none";
		p_ShowSel(document.getElementById("errMSG"));
	}
}
// this sets the background colors
function p_offField(obj){
	if(obj.err==""){
		obj.style.backgroundColor="";
		obj.style.color="";
		obj.style.fontWeight="";
		p_hideErr();
	}else{
		obj.style.backgroundColor="red";
		obj.style.color="white";
		//obj.runtimeStyle.fontWeight="bold";
	}
}
// Shows the error message
function p_showError(obj){
	if(obj.err!=""){
		if(!document.getElementById("errMSG")){
			var errm = document.createElement("DIV");
			errm.id="errMSG";
			document.body.appendChild(errm);
		}
		var errMSG = document.getElementById("errMSG");
		if(errMSG.style.position != "absolute"){
			errMSG.style.position = "absolute";
			errMSG.style.background = "#fff";
			errMSG.style.color = "#f00";
			errMSG.style.border = "thin solid Navy";
		}
		errMSG.style.width = p_getErrWidth(obj)+"px";
		errMSG.innerHTML = obj.err;
		errMSG.style.display="block";
		errMSG.style.width = p_getErrWidth(obj)+"px";
		errMSG.style.left = p_getOffsetLeft(obj)+"px";
		errMSG.style.top = (p_getOffsetTop(obj) - p_getErrHeight(errMSG))+"px";
		var cerr = "";
		var shift = 0;
		if(obj.cErr){cerr = obj.cErr.toUpperCase();}
		if(!isNaN(obj.shift)){shift = parseInt(obj.shift)}
		if(cerr=="YES"||cerr=="Y"){
			errMSG.style.left = (p_centerErrMSG(parseInt(errMSG.style.left), parseInt(errMSG.style.width), obj.offsetWidth, shift))+"px";
		}else{
			errMSG.style.left = (parseInt(errMSG.style.left) + shift)+"px";
		}
		p_hideBleed(errMSG);
	}
}
//this is the functions that calls the error message functionality
function val_Active(event){
	if(pageSwitch==1){
		var obj = getObj(event)
		p_showError(obj);
		p_offField(obj);
	}
}
// this happens onBlur and sets the background colors and hides the errMSG
function val_Blur(event){
	if(pageSwitch==1){
		var obj = getObj(event)
		p_showError(obj);
		p_offField(obj);
		p_hideErr(obj);
	}
}
//*************************************************************************************/*
// this group of functions check custom attributes
function p_isRequired(obj){
	try{var att = p_collectAttribute(obj, "required")}catch(err){return false;}
	var val = p_collectAttribute(obj, "val")
	if(att == "Y" || att == "YES"){
		return true;
	}else if(obj.tagName=="SELECT" && val == "V_TEXT"){
		return true;
	}else{
		return false;
	}
}
function p_isFillDate(obj){
	var att = p_collectAttribute(obj, "fillDate")
	if(att == "Y" || att == "YES"){
		return true;
	}else{
		return false;
	}
}


//************************************************************************************
//This section is used for validating the form on submit
//checks the form for errors
function p_allClear(frm){
	for (var i = 0; i < frm.elements.length; i++){
		var obj = frm.elements[i];
		if(!obj.err){obj.err="";}
		var op=obj;
		var c=1;
		while (op.parentElement){
			if(op.style.display=="none"||op.style.visibility=="hidden"||op.disabled==true){
				c=0;
			}
			op=op.parentElement;
		}
		if(c){
			if(obj.val){
				var func = eval(obj.val)
				//alert(func(obj) + obj.value)
				if(!func(obj)){
					try{frm.elements[i].focus();}catch(err){}
					return false;
				}
			}
			if(frm.elements[i].err!=""){
				//alert(frm.elements[i].err)
				try{frm.elements[i].focus();}catch(err){}
				return false;
			}
		}
	}
	return true;
}
function chk_element(event){
//alert(event)
	var obj = eventOrObject(event);
//	if(!obj.err){obj.err="";}
	if(obj.getAttribute("val")){
		var func = eval(obj.getAttribute("val"));
		if(!func(obj)){ //calls v_* function to validate obj
			try{obj.focus();}catch(err){}
			p_showError(obj);
			p_offField(obj);
///////
				var val = obj.getAttribute("val")
				if(val != null && !(obj.onkeyp)){
					if(val==""){val = v_none}else{val = eval(val);obj.err=""}
					addEvent(obj, "change", chk_element, false);
/*					if (obj.addEventListener){
						if(p_isFillDate(obj)){
							addEvent(obj, "blur", val_MakeFullDate, false);
						}
						addEvent(obj, "keyup", val, false);
						addEvent(obj, "focus", val, false);
						addEvent(obj, "blur", val, false);
						addEvent(obj, "focus", val_Active, false);
						addEvent(obj, "blur", val_Blur, false);
						addEvent(obj, "keyup", val_Active, false);
						if(obj.type=="select-one"||obj.type=="select-multiple"){
							addEvent(obj, "change", val_Active, false);
						}
					}else{
						addEvent(obj, "focus", val_Active, false);
						addEvent(obj, "blur", val_Blur, false);
						addEvent(obj, "keyup", val_Active, false);
						addEvent(obj, "keyup", val, false);
						addEvent(obj, "focus", val, false);
						addEvent(obj, "blur", val, false);
						if(obj.type=="select-one"||obj.type=="select-multiple"){
							addEvent(obj, "change", val_Active, false);
							addEvent(obj, "change", val, false);
						}
						if(p_isFillDate(obj)){
							addEvent(obj, "blur", val_MakeFullDate, false);
						}
//					}
*/				}

//alert("we made it!!");
///////
			return false;
		}
	}
	obj.err="";
	p_offField(obj);
//	if(obj.err!=""){
//		try{obj.focus();}catch(err){}
//		return false;
//	}
	return true;
}
//double checks the form at the end
function RPEAT_WK(event){
	var obj = eventOrObject(event);
	for(var k=1;k<document.frm.RPEAT_WK.length ;k++){
		if(document.frm.RPEAT_WK[k].checked == true){
			obj.err="";
			return true;
		}
	}
	obj.err = "Please select a week.";
	return false;
}
function p_lastRequiredCheckDisplay(obj){
	pageSwitch=1;
	for(var i = 0; i < obj.elements.length; i++){
		var t = obj.elements[i];
		if(!t.err){t.err="";}
		var op=t;
		var c=1;
		while (op.parentElement){
			if(op.style.display=="none"||op.style.visibility=="hidden"){
				c=0;
			}
			op=op.parentElement;
		}
		if(c){
			try{t.focus();}catch(err){}
		}
	}
}
//hides submit button to prevent double entry
function p_hideSubmit(frm){
	for(var i = 0; i < frm.elements.length; i++){
		if(frm.elements[i].type=="submit"){
			frm.elements[i].style.visibility="hidden"
		}
	}
}
//shows submit button if validation fails
function p_showSubmit(frm){
	for(var i = 0; i < frm.elements.length; i++){
		if(frm.elements[i].type=="submit"){
			frm.elements[i].style.visibility="visible"
		}
	}
}
function val_check(frm){
	//alert(event);
	//var frm = getObj(event);
	//p_lastRequiredCheckDisplay(frm);
	
	p_hideSubmit(frm);
	pageSwitch=1;
	if(p_allClear(frm)){
		 return true;
	}else{
		p_showSubmit(frm);
		return false;
	}
}
//***********************************************************************************
//Date Formatting
//Formats Dates on blur event 
function val_MakeFullDate(event){
	var p = getObj(event);
	p.value = p_fullDate(p.value);
}
//returns a formatted date
function p_fullDate(p){
	var pHold;
	pHold = p.replace(/-/g, '/');
	var varDA = pHold.split("/");
	if(varDA.length < 2 || varDA.length > 3){
		return p;
	}else{
		if(p_inStrGrp(pHold, '^([1-9]|0[1-9]|1[0-2])/([1-9]|[0-2][0-9]|30|31)$')){
			var today = new Date();
			pHold = varDA[0]+"/"+varDA[1]+"/"+today.getFullYear();
		}else if(p_inStrGrp(pHold, '^([1-9]|0[1-9]|1[0-2])/([1-9]|[0-2][0-9]|30|31)/$')){
			var today = new Date();
			pHold = varDA[0]+"/"+varDA[1]+"/"+today.getFullYear();
		}else if(p_inStrGrp(pHold, '^([1-9]|0[1-9]|1[0-2])/([1-9]|[0-2][0-9]|30|31)/[0-9]{2}$')){
			pHold = varDA[0]+"/"+varDA[1]+"/"+"20"+varDA[2];
		}else if(p_inStrGrp(pHold, '^([1-9]|0[1-9]|1[0-2])/([1-9]|[0-2][0-9]|30|31)/[0-9]{4}$')){
			pHold = varDA[0]+"/"+varDA[1]+"/"+varDA[2];
		}else{
			return p;
		}
		var rHold = p_makeDate(pHold);
		if(parseInt(varDA[0]) == eval(parseInt(rHold.getMonth())+1)){
			return formatDate(rHold, "MM/dd/yyyy");
		}else{
			return p;
		}
		
	}
}
//****************************************************************************************************
//stock validation
//***********************************************************************************
//used to evaluate regular expressions
function p_inStrGrp(src,reg){
	var regex=new RegExp(reg);
	try{
		return regex.test(src);
	}catch(err){
		alert("an error has occured");
		return false;
	}
}
//Date Manipulation functions
//some of these are using the built in names used by VB to make remembering them easier
//returns a formated date - similar to VB function
function formatDate(vDate, vFormat){ 
	var vDay              = addZero(vDate.getDate()); 
	var vMonth            = addZero(vDate.getMonth()+1); 
	var vYearLong         = addZero(vDate.getFullYear()); 
	var vYearShort        = addZero(vDate.getFullYear().toString().substring(3,4)); 
	var vYear             = (vFormat.indexOf("yyyy")>-1?vYearLong:vYearShort);
	var vHour             = addZero(vDate.getHours()); 
	var vMinute           = addZero(vDate.getMinutes()); 
	var vSecond           = addZero(vDate.getSeconds()); 
	var vDateString       = vFormat.replace(/dd/g, vDay).replace(/MM/g, vMonth).replace(/y{1,4}/g, vYear);
	vDateString           = vDateString.replace(/hh/g, vHour).replace(/mm/g, vMinute).replace(/ss/g, vSecond);
	return vDateString;
}
//returns the difference between dates
//uses the same syntax as the VB function, but only does seconds through Days
function dateDiff(interval,fdate,tdate){
	var intVal;
	switch(interval){
		case "s" :intVal = 1000;break;
		case "n" :intVal = 1000*60;break;
		case "h" :intVal = 1000*60*60;break;
		case "d" :intVal = 1000*60*60*24;break;
	}
	var o_from_date = p_makeNumDate(Date.parse(fdate));
	var o_to_date  = p_makeNumDate(Date.parse(tdate));
	return Math.ceil((o_to_date.getTime()-o_from_date.getTime())/(intVal));
}
//returns a date object
function p_makeDate(p_time){
	if(p_time != null){
		var arr_date = p_time.split("/");
		if(arr_date.length >2){
			return new Date(arr_date[2],arr_date[0]-1,arr_date[1]);
		}else{return p_time;}
	}else{return p_time;}
}
//returns a date object from a Julian number
function p_makeNumDate(p){return new Date(p);}
function addZero(vNumber){ 
	return ((vNumber < 10) ? "0" : "") + vNumber;
}
//Returns error message based on date provided
function isDate(varDate){
	var today = new Date();
	var ermsg = new Array;
	ermsg[0]="Please enter your date in the "+ formatDate(today, "MM/dd/yyyy") +" format.";
	ermsg[1]="Please enter a month value between 01 and 12.";
	ermsg[2]="Please enter a day between 01 and 30.";
	ermsg[3]="Please enter a valid day for February.";
	ermsg[4]="Please enter a day between 01 and 31.";
	ermsg[5]="Please enter a year between 1990 and the current year.";
	if(!p_inStrGrp(varDate, "^([1-9]|0[1-9]|1[0-2])/([1-9]|[0-2][0-9]|30|31)/([0-9]{2}|20[0-9]{2}|19[0-9]{2})$")){
		return ermsg[0];
	}else{
		varLeapYear = false;				
		varDateArray = varDate.split("/");varMonth = varDateArray[0];varDay = varDateArray[1];varYear = varDateArray[2];
		if (varYear % 4 == 0) {varLeapYear = true;}
		if (varMonth<1 || varMonth>12) {return ermsg[1];}
		if (varMonth== 4 || varMonth== 6 || varMonth== 9 || varMonth==11){if (varDay< 1 || varDay>30) {return ermsg[2];}}
		if (varMonth== 2 && varLeapYear==false){if (varDay>28){return ermsg[3];}}
		if (varMonth== 2 && varLeapYear==true){if (varDay>29){return ermsg[3];}}
		if (varDay< 1 || varDay>31) {return ermsg[4];}
	}	
	return "";
}

///// date range stuff for validation
function getDayWord(obj, att){
	var r_att = p_collectAttribute(obj, att);
	//var RetVal = ""
	var Now = new Date();
	var Today = formatDate(Now, 'MM/dd/yyyy');
	if(r_att == "TODAY"){r_att = formatDate(Now, 'MM/dd/yyyy');}
	if(r_att == "YESTERDAY"){Now.setDate(Now.getDate() - 1); r_att = formatDate(Now, 'MM/dd/yyyy');}
	if(r_att == "TOMORROW"){Now.setDate(Now.getDate() + 1); r_att = formatDate(Now, 'MM/dd/yyyy');}
	return r_att;
}
function dateInRange(obj, dt){
	var show = "";
	var before = getBefore(obj)
	if(before == null || before == ""){}else{
		before = p_makeDate(before);
		if(dateDiff("d",dt,before) < 1){show = "This date must be before "+formatDate(before, "MM/dd/yyyy")+"<br />";}
	}
	var after = getAfter(obj);
	if(after == null || after == ""){}else{
		after = p_makeDate(after);
		if(dateDiff("d",after,dt) < 1){show += "This date must be after "+formatDate(after, "MM/dd/yyyy");}
	}
	return show;
}
function isNumber(p_value){//allows 0 and decimals for currency fields
	var ermsg = new Array;
	ermsg[0]='This must be numeric';
	ermsg[1]='This must have a value';
	ermsg[2]='This should not contain spaces';
	if (p_value == "") {return ermsg[1];}
	else if (p_inStrGrp(p_value, ' ')){return ermsg[2];}
	else if (isNaN(p_value)) {return ermsg[0];}
	return "";
	
}
function checkPrecision(obj){ //check precision abilities
	var myPrecision = p_collectAttribute(obj, "precision");
	var objVal = obj.value;
	if(myPrecision != null ){
		var numLeft = 0;
		var numRight = 0;
		if(myPrecision.indexOf(",")>=0){
			var arrPrecision = myPrecision.split(",");
			numLeft = parseInt(arrPrecision[0]) - parseInt(arrPrecision[1]);
			numRight = arrPrecision[1];
		}else{
			numLeft = myPrecision;
			if (p_inStrGrp(objVal, '([.\d])')){return "This should be a whole number";}
		}
		if(objVal.indexOf(".")>=0){
			var arrNum = objVal.split(".");
			if(arrNum[0].length > numLeft && arrNum[1].length > numRight){
				return "This number should only have " + numLeft + " digits left of the decimal and " +numRight+ " to the right";
			}else if(arrNum[0].length > numLeft){
				return "This number should only have " + numLeft + " digits left of the decimal";
			}else if(arrNum[1].length > numRight){
				return "This number should only have " + numRight + " digits right of the decimal";
			}
		}else{
			if(objVal.length > numLeft){
				return "This number should only be " + numLeft + " digits long";
			}
		}
	}
	return "";
}
///// date range stuff for validation
function numberInRange(obj){
	var objVal = obj.value;
	var show = "";
	var gt = obj.getAttribute("gt");
	if(gt == null || gt == ""){}else{
		if(!(eval(objVal)>eval(gt))){
			show = "This number should be greater than " + gt
		}
	}
	var lt = obj.getAttribute("lt");
	if(lt == null || lt == ""){}else{
		if(!(eval(objVal)<eval(lt))){
			show += "This number should be less than " + lt
		}
	}
	var gte = obj.getAttribute("gte");
	if(gte == null || gte == ""){}else{
		if(!(eval(objVal)>=eval(gte))){
			show = "This number should be greater than or equal to " + gte
		}
	}
	var lte = obj.getAttribute("lte");
	if(lte == null || lte == ""){}else{
		if(!(eval(objVal)<=eval(lte))){
			show += "This number should be less than or equal to " + lte
		}
	}
	return show;
}
//********************************************************************************************************************
//Validation functions
//Put the function name in the val attribute in the tag being evaluated
//********************************************************************************************************************
function v_address(event){
	var vCity = document.frm.CITY;
//	var vCity = eventOrObject(event);
	var vState = document.frm.STATE;
	var vZip = document.frm.ZIP;
	var vMetro = document.frm.METRO_ID;
	var ermsg = new Array;
	vCity.getAttribute("err");
	ermsg[0]='Address must include both City and State, or a Zip Code, or a Metro ID';
	if(vZip.value=="" && vMetro.value==""){
		if(vCity.value=="" || vState.value==""){
//			vCity.setAttribute("err",ermsg[0]);
			vCity.err=ermsg[0];
		}else {
//			vCity.setAttribute("err","");
			vCity.err="";
		}
	}else{
//		vCity.setAttribute("err","");
			vCity.err="";
	}
	if(vCity.err == ""){
		return true;
	}else{
		return false;
	}
}
function v_password(event){
	var vPassword = eventOrObject(event);
	var vConfirm = document.frm.passConfirm;
	var ermsg = new Array;
	vPassword.getAttribute("err");
	ermsg[0]='Your password does match';
	if(vConfirm.value !=  vPassword.value || vPassword.value==""){
		vPassword.err=ermsg[0];return false;
	}else{
		vPassword.err="";return true;
	}
}
function v_date(event){
	//var obj = window.event.srcElement;
	var obj = eventOrObject(event);
	var varDate;
	var myErr = "";
	if(p_isFillDate(obj)){
		varDate = p_fullDate(obj.value);
	}else{
		varDate = obj.value;
	}
	if(p_isRequired(obj)){
		myErr = isDate(varDate);
		myErr += dateInRange(obj, varDate);
		obj.err = myErr;
	}else{
		if(obj.value != ""){
			myErr = isDate(varDate);
			myErr += dateInRange(obj, varDate);
			obj.err = myErr;
		}else{
			obj.err = ""
		}
	}
	if(myErr == ""){
		return true;
	}else{
		return false;
	}
}

//evaluates that a tag contains text doesn't count spaces or tabs as text
//using this on a SELECT will make it required
function v_text(event){
	var obj = eventOrObject(event);
	var objVal = obj.value;
	var maxLen = obj.getAttribute("maxlength");
	var ermsg = new Array;
	ermsg[0]='This field must have a value';
	ermsg[1]='This field must not exceed '+maxLen+' characters long.';
	if(!p_isRequired(obj) && obj.tagName == "TEXTAREA" && objVal==""){obj.err = "";return true;}
	if((objVal == "")||(!p_inStrGrp(objVal, '([a-zA-Z]|[0-9])'))){obj.err = ermsg[0];return false;}
	//if(event.type == "blur" || event.type == "focus"){
	if(maxLen!=null && maxLen!= "" && obj.value.length > maxLen){obj.err = ermsg[1];return false;}
	//}
	obj.err = "";
	return true;
}

//number function
function v_number(event){
	var obj = eventOrObject(event);
	var objVal = obj.value;
	if(p_isRequired(obj)){
		obj.err = isNumber(objVal);
		if(obj.err!=""){return false;}
		obj.err = checkPrecision(obj);
		if(obj.err!=""){return false;}
		obj.err = numberInRange(obj);
	}else{
		if(obj.value != ""){
			obj.err = isNumber(objVal);
			if(obj.err!=""){return false;}
			obj.err = checkPrecision(obj);
			if(obj.err!=""){return false;}
			obj.err = numberInRange(obj);
		}else{
			obj.err = ""
		}
	}	
	return true;
}

//pattern matching function for things like phone numbers and such
function v_pattern(event){
	var obj = eventOrObject(event);
	var objVal = obj.value;
	var reg = obj.getAttribute("regex")
	var msg = obj.getAttribute("message")
	if(p_isRequired(obj)){
		if(obj.value != ""){
			if(!p_inStrGrp(objVal,reg)){
				obj.err = msg;
				return false;
			}else{
				obj.err = ""
			}
		}else{
			obj.err = "This must have a value"
			return false;
		}
	}else{
		if(obj.value != ""){
			if(!p_inStrGrp(objVal,reg)){
				obj.err = msg;
				return false;
			}else{
				obj.err = ""
			}
		}else{
			obj.err = ""
		}
	}
	return true;
}
//just a holder to allow people to set the events but not have validation
//usefull for people who are dynamically changing validation
function v_none(event){
	var obj = eventOrObject(event);
	obj.err = "";
	return true;
}

///********************************************************************calendar crap**********************************************************
function setBefore(obj, dt, inc){
	if(isDate(dt)==""){
		if(inc=="Y" || inc=="YES"){
			dt = p_makeDate(dt);
			dt.setDate(dt.getDate() + 1);
			dt = formatDate(dt, "MM/dd/yyyy");
		}
		obj.before = dt;
	}else{
		obj.before = "";
	}
}
function setAfter(obj, dt, inc){
	var val=dt;
	if(isDate(dt)==""){
		if(inc=="Y" || inc=="YES"){
			dt = p_makeDate(dt);
			dt.setDate(dt.getDate() - 1);
			dt = formatDate(dt, "MM/dd/yyyy");
			val = p_makeDate(val);
			val = formatDate(val, "MM/dd/yyyy");
		}
		if(obj.value==""){obj.value = val;}
		obj.after = dt;
	}else{
		obj.after = "";
	}
}
function getBefore(obj){
	var inc = p_collectAttribute(obj, "incbefore") ;
	var dt = getDayWord(obj, "before");
	if(inc=="Y" || inc=="YES"){
		if(dt != ""){
			dt = p_makeDate(dt);
			if(isDate(dt)==""){
				dt.setDate(dt.getDate() + 1);
				dt = formatDate(dt, "MM/dd/yyyy");
			}
		}
	}
	return dt;
}
function getAfter(obj){
	var inc = p_collectAttribute(obj, "incafter")
	var dt = getDayWord(obj, "after");
	if(inc=="Y" || inc=="YES"){
		if(dt != ""){
			dt = p_makeDate(dt);
			if(isDate(dt)==""){
				dt.setDate(dt.getDate() - 1);
				dt = formatDate(dt, "MM/dd/yyyy");
			}
		}
	}
	return dt;
}
function cal_hover(){
	if (window.event) {
		var obj = event.srcElement;
		obj.runtimeStyle.backgroundColor="#cccccc";
	}
}
function cal_unHover(){
	if (window.event) {
		var obj = event.srcElement;
		obj.runtimeStyle.backgroundColor="";
	}
}
function returnDateFromCalendar(){
	var obj = document.getElementById("javaScriptCalendar");
	var month = (obj.month<10)?"0"+obj.month:obj.month;
	var day = (eval(this.innerHTML)<10)?"0"+this.innerHTML:this.innerHTML;
	obj.myObj.value = month+"/"+day+"/"+obj.year;
	obj.style.display="none";
	p_ShowSel(document.getElementById("javaScriptCalendar"));
	try{obj.myObj.focus()}catch(err){}
}
function moveCalendar(){
	var obj = document.getElementById("javaScriptCalendar");
	var month = (obj.month<10)?"0"+obj.month:obj.month;
	var day = 1;var inc = 1;
	var myDate= new Date(month+"/"+day+"/"+obj.year);
	if(this.innerHTML=="&lt;&lt;"){inc = (-1);}
	myDate.setMonth(myDate.getMonth()+inc);
	showCalendar(myDate,obj.before,obj.after);
}
function returnDay(day){
	//takes a number from a zero based array and returns a day name
	var dayOfWeek = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	return dayOfWeek[day];
}
function returnMonth(month){
	//takes a number from a zreo based array and returns a month name
	var monthOfYear = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
	return monthOfYear[month];
}
/*function createCalendar(){
	//builds main elements of calendar
	if(!document.getElementById("javaScriptCalendar")){
		var cal = document.createElement("div");
		cal.id="javaScriptCalendar";
		document.body.appendChild(cal);
		
	}else{
		document.getElementById("javaScriptCalendar").removeChild(document.getElementById("javaScriptCalendar").childNodes[0]);
		document.getElementById("javaScriptCalendar").removeChild(document.getElementById("javaScriptCalendar").childNodes[0]);
	}
	document.getElementById("javaScriptCalendar").appendChild(document.createElement("div"));
	document.getElementById("javaScriptCalendar").appendChild(document.createElement("table"));
}
function createDayHeader(weekday,now,cal){
	//write days header
	var thead = document.createElement("thead");
	var tr = document.createElement("tr");
	for(var i=0;i<7;i++){
		var th = document.createElement("th");
		th.appendChild(document.createTextNode(returnDay(i)));
		if(i==weekday&&now.getMonth()==cal.getMonth()&&now.getFullYear()==cal.getFullYear()){th.className = "this";}
		tr.appendChild(th);
	}
	thead.appendChild(tr);
	document.getElementById("javaScriptCalendar").childNodes[1].appendChild(thead);
	
}
function createWeek(tbody,now,cal){
	var tr =  document.createElement("tr");
	var ctr = 0;
	var month = cal.getMonth();
	for(var i=ctr;i<7;i++){
		var td = document.createElement("td");
		if(cal.getMonth()==month){
			if(cal.getDate()==1 && cal.getDay()>i){
				td.appendChild(document.createTextNode(" "))
			}else{
				var show = true;
				if(arguments.length > 3){
					if(dateDiff("d",cal,arguments[3]) < 1){show = false;}
					if(dateDiff("d",arguments[4],cal) < 1){show = false;}
				}
				td.appendChild(document.createTextNode(cal.getDate()))
				if(show){
					td.onmouseover =  cal_hover;
					td.onmouseout =  cal_unHover;
					td.onclick = returnDateFromCalendar;
					if(cal.getMonth()+"/"+cal.getDate()+"/"+cal.getFullYear()==now.getMonth()+"/"+now.getDate()+"/"+now.getFullYear()){
						td.className = "this";
					}else{td.className = "that";}
				}
				cal = new Date(cal.getFullYear(), cal.getMonth( ), cal.getDate( )+1);
			}
		}else{
			td.appendChild(document.createTextNode(" "))
		}
		tr.appendChild(td);
		
	}
	tbody.appendChild(tr);
	return cal;
}*/
function showCalendar(){
	var pDate = arguments[0];
	var selDate = new Date(pDate);
	var Calendar = new Date(pDate);		//date of calendar
	var selectedDay = Calendar.getDate();
	if (isNaN(Calendar.getDay())){Calendar = new Date( );}
	Calendar.setDate("1");
	var year = Calendar.getFullYear();	// Returns year
	var month = Calendar.getMonth();	// Returns month (0-11)
	
	var nowCalendar = new Date( );		//date right now
	var today = nowCalendar.getDate();	// Returns day (1-31)
	var weekday = nowCalendar.getDay();	// Returns day (0-6)
	
	createCalendar("javaScriptCalendar"); // if calendar object doesn't exist create it
	document.getElementById("javaScriptCalendar").month = month+1;
	document.getElementById("javaScriptCalendar").year = year;
	document.getElementById("javaScriptCalendar").before = arguments[1];
	document.getElementById("javaScriptCalendar").after = arguments[2];
	//write month to calendar div
	var lArrow = document.createElement("span");
	lArrow.appendChild(document.createTextNode("<<"));
	lArrow.onclick = moveCalendar;
	lArrow.style.left="15px";
	lArrow.className = "arrow";
	var monthLabel = document.createElement("span");
	monthLabel.appendChild(document.createTextNode(returnMonth(Calendar.getMonth()) + ", " + Calendar.getFullYear()));
	var rArrow = document.createElement("span");
	rArrow.appendChild(document.createTextNode(">>"));
	rArrow.onclick = moveCalendar;
	rArrow.style.right="15px";
	rArrow.className = "arrow";
	var closer = document.createElement("span");
	closer.className = "close";
	closer.style.position = "absolute"
	closer.style.right = "2px";
	closer.onmouseover =  cal_hover;
	closer.onmouseout =  cal_unHover;
	closer.appendChild(document.createTextNode("X"));
	addEvent(closer, "click", hideCalender, false);
	document.getElementById("javaScriptCalendar").childNodes[0].appendChild(lArrow);
	document.getElementById("javaScriptCalendar").childNodes[0].appendChild(monthLabel);
	document.getElementById("javaScriptCalendar").childNodes[0].appendChild(rArrow);
	document.getElementById("javaScriptCalendar").childNodes[0].appendChild(closer);
	//write days header
	createDayHeader(weekday,nowCalendar,Calendar,"javaScriptCalendar");
	//write calendar days
	var tbody = document.createElement("tbody");
	while(Calendar.getMonth()==month){
		if(arguments.length > 1){
			var p_before = arguments[1];
			var p_after = arguments[2];
			Calendar = createWeek(tbody,nowCalendar,Calendar,selDate,"javaScriptCalendar",p_before,p_after);
		}else{
			Calendar = createWeek(tbody,nowCalendar,Calendar);
		}
		
	}
	document.getElementById("javaScriptCalendar").childNodes[1].appendChild(tbody);
}

function showMyCal(varObj){
//	obj = this.myObj;
obj = document.getElementById(varObj);
	if(obj.disabled == false){
		obj.focus();
		if(!document.getElementById("javaScriptCalendar")){
			showCalendar(obj.value, getBefore(obj), getAfter(obj));
			document.getElementById("javaScriptCalendar").myObj = obj;
			document.getElementById("javaScriptCalendar").style.display="block";
			document.getElementById("javaScriptCalendar").style.top=eval(p_getOffsetTop(obj)+obj.offsetHeight)+"px";
			document.getElementById("javaScriptCalendar").style.left=p_getOffsetLeft(obj)+"px";
			p_hideBleed(document.getElementById("javaScriptCalendar"))
		}else if(document.getElementById("javaScriptCalendar").style.display!="none"){
			document.getElementById("javaScriptCalendar").style.display="none";
			p_ShowSel(document.getElementById("javaScriptCalendar"));
		}else{
			showCalendar(obj.value, getBefore(obj), getAfter(obj));
			document.getElementById("javaScriptCalendar").myObj = obj;
			document.getElementById("javaScriptCalendar").style.display="block";
			document.getElementById("javaScriptCalendar").style.top=eval(p_getOffsetTop(obj)+obj.offsetHeight)+"px";
			document.getElementById("javaScriptCalendar").style.left=p_getOffsetLeft(obj)+"px";
			p_hideBleed(document.getElementById("javaScriptCalendar"))
		}
	}
}
function hideCalender(event){
  	document.getElementById("javaScriptCalendar").style.display="none";
	p_ShowSel(document.getElementById("javaScriptCalendar"));
}

function initCalendar(){
//	document.removeChild(document.getElementsByName("calImage"));
for (var j = 0; j < document.forms.length; j++){
		if(document.forms[j].name != "doNotScan"){
			for (var i = 0; i < document.forms[j].elements.length; i++){
				var obj = document.forms[j].elements[i];
				var useCal = p_collectAttribute(obj, "calendar");
				if(useCal=="Y" || useCal=="YES"){
					var div = document.createElement("div");
					var img = document.createElement("IMG");
					img.src = "images/cal_button.gif";
					div.name="calImage";
					div.appendChild(img);
					div.myObj = obj;
					div.onclick = showMyCal;
					div.className="calendarLaunch";
					div.style.top = p_getOffsetTop(div.myObj)+"px";
					div.style.left=eval(p_getOffsetLeft(div.myObj)+div.myObj.offsetWidth)+"px";
					document.body.appendChild(div);
//alert(div.innerHTML);
				}
			}
		}
	}
}

//loops the form and sets events for the validation stuff
function val_init(){
	//these have to be set to zero for this to work
	document.body.style.padding = "0";
	document.body.style.margin = "0";
	for(var j = 0; j < document.forms.length;j++){
		if(document.forms[j].name != "doNotScan"){
			for (var i = 0; i < document.forms[j].elements.length; i++){
				var t = document.forms[j].elements[i];
				var val = t.getAttribute("val")
				if(val != null){
					if(val==""){val = v_none}else{val = eval(val);t.err=""}
					if (t.addEventListener){
						if(p_isFillDate(t)){
							addEvent(t, "blur", val_MakeFullDate, false);
						}
						addEvent(t, "keyup", val, false);
						addEvent(t, "focus", val, false);
						addEvent(t, "blur", val, false);
						addEvent(t, "focus", val_Active, false);
						addEvent(t, "blur", val_Blur, false);
						addEvent(t, "keyup", val_Active, false);
						if(t.type=="select-one"||t.type=="select-multiple"){
							addEvent(t, "change", val, false);
							addEvent(t, "change", val_Active, false);
						}
					}else{
						addEvent(t, "focus", val_Active, false);
						addEvent(t, "blur", val_Blur, false);
						addEvent(t, "keyup", val_Active, false);
						addEvent(t, "keyup", val, false);
						addEvent(t, "focus", val, false);
						addEvent(t, "blur", val, false);
						if(t.type=="select-one"||t.type=="select-multiple"){
							addEvent(t, "change", val_Active, false);
							addEvent(t, "change", val, false);
						}
						if(p_isFillDate(t)){
							addEvent(t, "blur", val_MakeFullDate, false);
						}
					}
				}
				if(!t.className){
					t.style.fontSize="12px";
					t.style.fontFamily="Arial, Helvetica, sans-serif";
				}
				//try{if(t.type!="checkbox"){t.focus();}}catch(err){}
			}
		}
	}
}
function val_initNew(){
	//these have to be set to zero for this to work
	document.body.style.padding = "0";
	document.body.style.margin = "0";
//	var els=getElementsByTagName();
	for(var j = 0; j < document.forms.length;j++){
		if(document.forms[j].name != "doNotScan"){
			for (var i = 0; i < document.forms[j].elements.length; i++){
				var t = document.forms[j].elements[i];
				var val = t.getAttribute("val")
				if(val != null){
					if(val==""){val = v_none}else{val = eval(val);t.err=""}
					if (t.addEventListener){
						if(p_isFillDate(t)){
							addEvent(t, "blur", val_MakeFullDate, false);
						}
						addEvent(t, "keyup", val, false);
						addEvent(t, "focus", val, false);
						addEvent(t, "blur", val, false);
						addEvent(t, "focus", val_Active, false);
						addEvent(t, "blur", val_Blur, false);
						addEvent(t, "keyup", val_Active, false);
						if(t.type=="select-one"||t.type=="select-multiple"){
							addEvent(t, "change", val, false);
							addEvent(t, "change", val_Active, false);
						}
					}else{
						addEvent(t, "focus", val_Active, false);
						addEvent(t, "blur", val_Blur, false);
						addEvent(t, "keyup", val_Active, false);
						addEvent(t, "keyup", val, false);
						addEvent(t, "focus", val, false);
						addEvent(t, "blur", val, false);
						if(t.type=="select-one"||t.type=="select-multiple"){
							addEvent(t, "change", val_Active, false);
							addEvent(t, "change", val, false);
						}
						if(p_isFillDate(t)){
							addEvent(t, "blur", val_MakeFullDate, false);
						}
					}
				}
				if(!t.className){
					t.style.fontSize="12px";
					t.style.fontFamily="Arial, Helvetica, sans-serif";
				}
				//try{if(t.type!="checkbox"){t.focus();}}catch(err){}
			}
		}
	}
}


//table sort stuff
		function getCol(obj){
			for(var i=0;i < obj.parentNode.childNodes.length; i++){
				if(obj == obj.parentNode.childNodes.item(i)){return i;}
			}
		}
		
		function sortR(a, b){
			//reverse sort
		   if(a > b) { return -1; }
		   if(a < b) { return 1; }
		   return 0;
		} 
		
		function numberSort(a, b) { return a - b}
		
		function dateSort(a, b) {
			var o_from_date = new Date(Date.parse(b));
			var o_to_date  = new Date(Date.parse(a));
			return Math.ceil(o_to_date.getTime()-o_from_date.getTime());
		}
		
		function alphaSortI(a, b) { //ignore case
			a = a.toLowerCase();
			b = b.toLowerCase();
			if (a < b) { return -1; }
			else {
				if (a > b) { return 1; }
				else { return 0; }
			}
		}
		
		function alphaSortRI(a, b) { //, reverse sort, ignore case
			if (a.toLowerCase()) { a = a.toLowerCase(); }
			if (b.toLowerCase()) { b = b.toLowerCase(); }
			
			if (a < b) { return 1; }
			else {
				if (a > b) { return -1; }
				else { return 0; }
			}
		}
		
		function sortCells(a, b){
			var a_val = a.childNodes.item(a.colSort).innerHTML;
			var b_val = b.childNodes.item(b.colSort).innerHTML;
			
			//if it's a date...
			if (!isNaN(Date.parse(a_val)) && !isNaN(Date.parse(b_val))) { 
				if(a.r) { 
					return dateSort(b_val, a_val);
				} else {
					return dateSort(a_val, b_val);
				}
			//if it's a number...
			} else if(!isNaN(a_val) && !isNaN(b_val)) {
				if(a.r) { 
					return numberSort(b_val, a_val)
				} else {
					return numberSort(a_val, b_val)
				}
			//if it's alpha sort...
			} else {
				if(a.r) { return alphaSortRI(a_val, b_val) 
				} else { 
					return alphaSortRI(b_val, a_val)
				}
			}
		}
		
		function sortTable(event){
			var obj = getObj(event);
			var thd = false;
			var th, td, tr, tbl, col,sib;
			while(obj.tagName != "TABLE"){
				if(obj.tagName == "TH"){
					th = obj;
					col = getCol(obj);
					if(th.r){
						th.r = false; 
						arrSpan.innerHTML = "&darr;";
					}else{
						th.r = true; 
						arrSpan.innerHTML = "&uarr;";
					}
					th.appendChild(arrSpan);
				}
				if (obj.tagName == "TD") { td  = obj; }
				if (obj.tagName == "TR") { tr = obj; }
				if (obj.tagName == "THEAD") { thd = true; }
				obj = obj.parentNode;
				if (obj.tagName == "TABLE") { tbl = obj; }
				
			}
			sib = tr.parentNode;
			while(sib){
				if (sib.tagName == "TBODY"){		
					tby = sib;
//alert("hello")
					break;
				}else{
					sib = sib.nextSibling;
				}
			}
/*			for(var i = 0; i<tbl.childNodes.length; i++) {
				if(tbl.childNodes.item(i).tagName == "TBODY") {
					tby = tbl.childNodes.item(i);
				}
			}
*/			if (thd) {
				var arrTby = new Array();
				for(var j = 0; j<tby.childNodes.length; j++) {
					if(tby.childNodes.item(j).tagName == "TR") {
						if(th.r) { tby.childNodes.item(j).r=true }
						else{ tby.childNodes.item(j).r=false };
						tby.childNodes.item(j).colSort = col;
						arrTby.push(tby.childNodes.item(j))
					}
				}
				arrTby.sort(sortCells);
				for(var j = 0; j<arrTby.length; j++) {
					if(Mod(j,2)==0){arrTby[j].className = "stripe"}else{arrTby[j].className = ""}
					tby.appendChild(arrTby[j]);
				}
			} else {
				
			}
//		}}
		}
		
		function init_tablesort() {
			var d = document;
			
			//find all theads. then see if they want sorting
			var theads = d.getElementsByTagName("thead");
			for (var j=0; j<theads.length; j++) {
				if (theads[j].getAttribute("sortable") == "true") {
					//run through the sortable theads and assign events to all the TH's
					for(var i=0; i<theads[j].getElementsByTagName("th").length; i++){
						if ( //added so that empty cells set to "empty-cells:show;" in the body style do not sort
							theads[j].getElementsByTagName("th").item(i).childNodes[0] && //this one is here for the sake of IE
							theads[j].getElementsByTagName("th").item(i).childNodes[0].nodeType == 3 &&
							theads[j].getElementsByTagName("th").item(i).childNodes[0].data != "" &&
							theads[j].getElementsByTagName("th").item(i).childNodes[0].data != "Edit" &&
							theads[j].getElementsByTagName("th").item(i).childNodes[0].data != "Work"
						) {
							addEvent(theads[j].getElementsByTagName("th").item(i), "click", sortTable)
						}
					}
				}
			}
		}
function initLabels(){
	var obj;
	/*for (var i=0; i < document.getElementsByTagName("LABEL").length; i++){
		obj = document.getElementsByTagName("LABEL").item(i);
		obj.style.position="absolute";
	}*/
	for (var i=0; i < document.getElementsByTagName("LABEL").length; i++){
		obj = document.getElementsByTagName("LABEL").item(i);
		var disPar = obj;
		while(disPar.parentNode && disPar.style.display != "none"){disPar = disPar.parentNode;}
		
		if(disPar.tagName!="FIELDSET"){
			//alert(disPar.type);
			var frm = obj;
			while(frm.tagName != "FORM"){frm = frm.parentNode;}
			if(obj.htmlFor!=""){
				objField = frm.elements[obj.htmlFor]
//alert(p_isRequired(objField));
				if(objField.disabled){
					obj.style.color = "#444444";
					var myImg = null;
					for(var k=0;k<obj.childNodes.length ;k++){
						if(obj.childNodes[k].tagName == "IMG"){
							myImg = obj.childNodes[k];
							document.appendChild(myImg); 
						}
					}
					obj.innerHTML = obj.innerHTML.replace(/\*/g, '');
					if(myImg){obj.appendChild(myImg);}
				}else if(objField.style.display == "none"){
					obj.style.display = "none"
				}else if(p_isRequired(objField)){
//alert(obj.name);
					if(obj.style.color!="red"){
						obj.style.color = "red";
						obj.insertBefore(document.createTextNode("*"), obj.childNodes[0]);
					}
				}else{
					obj.style.color = "";
					var myImg = null;
					for(var k=0;k<obj.childNodes.length ;k++){
						if(obj.childNodes[k].tagName == "IMG"){
							myImg = obj.childNodes[k];
							document.appendChild(myImg); 
						}
					}
					obj.innerHTML = obj.innerHTML.replace(/\*/g, '');
					if(myImg){obj.appendChild(myImg);}
					//
				}
				if (p_collectAttribute(objField, "label") == "RIGHT"){
					try{obj.style.top = eval(p_getOffsetTop(objField) + p_getOffsetTop(obj.offsetParent) + 4) + "px";
					obj.style.left = eval(p_getOffsetLeft(objField) +3 - p_getOffsetLeft(obj.offsetParent) + p_getWidth(objField)) + "px";}catch(err){};
				}else{
					try{obj.style.top = eval(p_getOffsetTop((objField)) - (p_getHeight(obj) + p_getOffsetTop(obj.offsetParent))) + "px";
					obj.style.left = eval(p_getOffsetLeft(objField) +3 - p_getOffsetLeft(obj.offsetParent)) + "px";}catch(err){};
				}
			}
		}
	}
}

