var validAlerts = 0;
var oops = 0;
var stay_oops = 0;
var invalidMessage = "";
var one_day = 1000*60*60*24;
var dates = new Array();
var prettyDateFormat = "NNN d, yyyy";
var veryPrettyDateFormat = "EE, NNN d, yyyy at h:mm a";
var disableMethods = new Array();
var itemFocus = null;
disableMethods['phone']=false;
disableMethods['ccard']=true;
disableMethods['email']=false;
var invalidItemMessages = new Array();
invalidItemMessages['ph1'] =
	"A phone number may contain only digits, parentheses and dashes.";
invalidItemMessages['em1'] =
	"An Email address must contain \'@\' and \'.\'";
invalidItemMessages['dig'] =
	"This item must contain only digits 0-9.";
invalidItemMessages['vSp'] =
	"Cannot parse date.";
invalidItemMessages['ckd'] =
	"Invalid card number (bad check digit)";
invalidItemMessages['req'] =
	"This input is required.";

function vaWarn(where)
{	return "VALIDATION ALERT ["+where+"] (not for live)\n" +
	"<-=============================================->\n";
}
function setValidAlerts(where)
{	var va = false;
	if (elm = document.getElementById('validalert')) va = elm.checked;
	return va;
}
function zeroTime(d)
{	d.setHours(0); d.setMinutes(0); d.setSeconds(0);
}
function validAlert(where,text)
{	if(text.length && setValidAlerts(where)) alert(vaWarn(where)+text);
}
function prettyDate(d,fmt)
{	return formatDate(d,fmt ? fmt : prettyDateFormat);
}
function badDate(did)
{	var elm = document.getElementById(did);
	invalidItemMessage("bD",elm.name+" ("+elm.value+") is not a valid date.");
//	elm.value="";
	oops++;
}
function dateValsById(id)
{	if(elm = document.getElementById(id)) return dateValsByElement(elm);
	else return "noElement["+id+"]";
}
function dateValsByElement(elm)
{	return elm.name+"["+elm.id+"]='"+elm.value+"'";
}
function dateDetails(name,d)
{	var str = name+" (";
	if(d) str += prettyDate(d);
	str += ")";
//	str += "["+d.valueOf()+"]";
	return str;
}
function calcSpan(d0,d1)
{	var diff = null;
	if(d0 && d1)
		diff = Math.ceil((d1.valueOf() - d0.valueOf())/one_day);
	if(diff)
		validAlert("CS","calcSpan("+(d0 ? prettyDate(d0) : "no")+","+(d1 ? prettyDate(d1) : "no")+") = "+diff);
	return diff;
}
function dateBefore(e1,d1,n0,d0,diff,los,where)
{	validAlert("dB","dateBefore("+e1.name+","+n0+","+los.name+"="+diff+")");
	before = Math.abs(0+diff);
	invalidItemMessage(where,dateDetails(e1.name,d1)+
		" is "+before+" day"+(before>1 ? "s" : "")+
		" before "+((d0===null) ? n0 : dateDetails(n0,d0)));
	stay_oops++;
//	e1.value = "";
	los.value = 0;
}
function missingRequired(elm)
{	invalidItemMessageByElement("mR",elm,"req");
	oops++;
}
function validEmail(str)
{	var result
	var filter=/^.+@.+\..{2,3}$/
	if (filter.test(str)) result=true
	else result=false
	return (result)
}
function validPhone(TheNumber,req)
{	var GoodChars = "0123456789()-+ ";
	validAlert("PH","Parsing Phone number");
//	if (TheNumber=="") { return false; }
	for (var i=0; i<TheNumber.length; i++)
	{	if (GoodChars.indexOf(TheNumber.charAt(i)) == -1)
			return false;
	}
	return true;
}
function validDate(did,master)
{	var elm;
	dates[did] = null;
	if ((elm = document.getElementById(did)) === null)
	{	validAlert("VD","Internal Error: getElementById("+did+") not found.");
		return null;
	}
//	alert("validDate("+did+","+master+") "+elm.value+"["+elm.value.length+"]");
	if(elm.value.length == 0)
	{	validAlert("VD2","validDate("+dateValsById(did)+") ZERO length");
		return true;
	}
	if((d = parseDate(elm.value)) === null)
	{	validAlert("VD3","validDate("+dateValsById(did)+") INVALID FORMAT");
		badDate(did);
		return null;
	}
	zeroTime(d);
	dates[did] = d;
	elm.value = prettyDate(d);
	validAlert("VD4","validDate("+dateValsById(did)+") OK "+elm.value);
	return d;
}
function itemStatus(elm)
{	if(validAlerts)
	{	inputDef = "<input value='"+elm.value+"' id='"+elm.id+"' valid='"+elm.getAttribute('valid')+"'>";
		if(!confirm("Validate "+elm.name+"\n"+inputDef+
				" [f="+elm.form.validalert.value+",j="+validAlerts+"]"))
			validAlerts=false;
	}
}
function nnvalidItem(elm,master)
{	rc = validEachItem(elm,master);
	if(oops)
		invalidItemReport();
	return rc;
}
function validItem(elm,master)
{	oops=0;stay_oops=0;
//	alert("validEachItem("+elm.name+")");
	if(validEachItem(elm,master)) return true;
//	alert(elm.name+" not valid");
	invalidItemReport();
	return false;
}
function validEachItem(elm,master)
{	if(master) invalidMessage = "";
	method=elm.getAttribute('valid');
	req=elm.getAttribute('required');
	itemFocus=null;
	if(elm.value.length)
	{	if (method)
		{	if(disableMethods[method]) { return true; }
			itemStatus(elm);
			switch (method)
			{	case 'date':
					if (validDate(elm.id,master) === null)
					{	if(master) badDate(elm.id);
						itemFocus=elm;
						return false;
					}
					return true;
					break;
				case 'los':
					if(los_id = elm.getAttribute('los'))
					{	if (!validStay(los_id,master))
						{	itemFocus=elm;
							return false;
						}
					}
					return true;
					break;
				case 'phone':
					if(validPhone(elm.value)) return true;
					invalidItemMessageByElement("vPH",elm,"ph1");
					itemFocus=elm;
					++oops; return false;
					break;
				case 'stay':
					startStay = elm.getAttribute('startStay');
					endStay = elm.getAttribute('endStay');
					stay = elm.getAttribute('stay');
					alert("validStay method");
					return validStay(elm,master);
					break;
				case 'email':
					if(validEmail(elm.value)) return true;
//					invalidItemMessage("em",elm.name+" ("+elm.value+") is not valid.");
					invalidItemMessageByElement("vEM",elm,"em1");
//					elm.value = "";
					itemFocus=elm;
					++oops; return false;
					break;
				case 'ccard':
					if(validCcard(elm.value)) return true;
					invalidItemMessageByElement("cc",elm,"ckd");
					++oops; return false;
					break;
				case 'required':
					break;
				case null:
					break;
				default:
					invalidItemMessage("dfl",elm.name+" validation method '"+method+"' is unrecognized.");
					itemFocus=elm;
					++oops; return false;
					break;
			}
		}
		return true;
	}
	else if(req || (method == 'required'))
	{	missingRequired(elm);
		return false;
	}
}
function validForm(form)
{	oops = 0; invalidMessage = ""; elms = new Array();
	dates.length = 0; var x = form.elements;
	var focused = 0;
	setValidAlerts("vF");
	for (var i=0;i<x.length;i++)
	{	elm = x[i];
		if(method = elm.getAttribute('valid'))
		{	validEachItem(elm,false);
		}
		else
		if (elm.getAttribute('required'))
		{	validEachItem(elm,false);
		}
		if(invalidMessage.length && invalidMessageChanged)
		{	validAlert("VFS "+elm.name,invalidMessage);
			invalidMessageChanged = false;
		}
	}
	if(oops)
	{	/*
		if (!focused && itemFocus)
		{	alert("set focus to "+itemFocus);
			itemFocus.focus(); itemFocus=null; focused = 1;
		}
		*/
		return invalidForm(null,oops);
	}
	validAlert("Beautifying Dates");
	for (var n=0;n<elms.length;n++)
	{	if (elm = elms[n])
		{	elm.value = prettyDate(dates[elm.id],veryPrettyDateFormat);
			elm.size = elm.value.length;
		}
	}
	return true;

}
function invalidForm(rval,oops)
{	invalidInputMessage(invalidMessage+"\nForm will NOT be submitted.",oops);
	return rval;
}
function invalidInputMessage(msg,n)
{	alert("There "+(n>1 ? "are "+n : "is a ")+" problem"+(n>1?"s":"")+" with your information.\n\n"+msg);
}
function invalidItemReport()
{	invalidInputMessage(invalidMessage,oops);
}
function invalidItemMessage(where,text)
{	invalidMessage += text+"  [error="+where+"]\n";
	invalidMessageChanged = true;
	if(setValidAlerts("IIM")) validAlert(where,invalidMessage);
}
function invalidItemMessageByElement(where,elm,eid)
{	invalidItemMessage(where+"."+eid,elm.name+" ("+elm.value+")\n\t"+
		invalidItemMessages[eid]);
}
function fromDate(elmAname,dA,elmBname,dB)
{	if (dB === null) { dB = new Date(); zeroTime(dB); }
	var diff = calcSpan(dB,dA);
	validAlert("fD","fromDate("+elmBname+" = "+prettyDate(dB)+", "+elmAname+" = "+prettyDate(dA)+") diff="+diff);
	return(diff);
}
function print_r(theObj){
  if(theObj.constructor == Array ||
     theObj.constructor == Object){
    ("<ul>")
    for(var p in theObj){
      if(theObj[p].constructor == Array||
         theObj[p].constructor == Object){
("<li>["+p+"] => "+typeof(theObj)+"</li>");
        ("<ul>")
        print_r(theObj[p]);
        ("</ul>")
      } else {
("<li>["+p+"] => "+theObj[p]+"</li>");
      }
    }
    ("</ul>")
  }
}


function validStay(los_id,master)
{
	if(!(los = document.getElementById(los_id)))
	{	j
		alert("No LoS for "+los_id);
		invalidItemMessage("vS0",endElm,"vSp");
		return false;
	}
	startLoS = los.getAttribute('startLoS');
	endLoS = los.getAttribute('endLoS');
	startElm = document.getElementById(startLoS);
	endElm = document.getElementById(endLoS);
	stay_oops = 0;
	if((startDate = parseDate(startElm.value)) === null)
		invalidItemMessageByElement("vPD1",startElm,"vSp");
	if((endDate = parseDate(endElm.value)) === null)
		invalidItemMessageByElement("vPD2",endElm,"vSp");
	validAlert("vS","validLoS("+los.name+") los="+los.value+"\ncalling validLengthofStay("+startElm.name+","+endElm.name+","+los.name+")");
	if(!master && ((endDate && startDate === null ) || ( startDate && endDate === null)))
		return true;
	validAlert("VLoS",dateValsById(startLoS)+"\n"+dateValsById(endLoS)+"\n"+los.name+"["+los.id+"]="+los.value);
	if(master) invalidMessage = "";
	var diff = 0;
	if(startDate && (diff = fromDate(startElm.name,startDate,"Today",null))<0)
		dateBefore(startElm,startDate,"Today",null,diff,los,"vls1");
	if(endDate && (diff = fromDate(endElm.name,endDate,"ToDay",null))<0)
		dateBefore(endElm,endDate,"Today",null,diff,los,"vls2");
//		alert("D1:"+startDate+",D2:"+endDate);
	if((startDate && endDate) && (diff = fromDate(endElm.name,endDate,startElm.name,startDate))<0)
		dateBefore(endElm,endDate,startElm.name+"?",startDate,diff,los,"vls1+2");
	if(stay_oops)
	{	oops += stay_oops;
		return false;
	}
	los.value = diff;
	return true;
}
function datePickerClosed(elm)
{	setValidAlerts("DPC");
	oops=0;
	if(elm.was == elm.value) return true;
	if(!validDate(elm.id,true)) return false;
	if(los = elm.getAttribute('los'))
	{	if (!validStay(los,true))
		{	invalidForm(invalidMessage,oops);
			return false;
		}
	}
	return true;
}
function myDatePicker(elm,b,c,d)
{	elm.was = elm.value;
//	elm.f1id = f1id;
//	elm.f2id = f2id;
//	elm.lid = lid;
	displayDatePicker(elm.name,b,c,d);
}
