
//Validate Dates
function validateDates(source, args)
{
args.IsValid=true;
dateControlName=window.document.getElementById(source.id).getAttribute('controltovalidate');
allowPastDates=eval(window.document.getElementById(dateControlName).getAttribute('allowpastdates').valueOf());
dateFormat=window.document.getElementById(dateControlName).getAttribute('dateformat');
now=new Date();
if (dateFormat == 'ShortDate' || dateFormat == 'LongDate')
{
day = window.document.getElementById(getCtl(source.id,3)).value;
month = window.document.getElementById(getCtl(source.id,2)).value;
year = window.document.getElementById(getCtl(source.id,'1')).value;
}
else if (dateFormat == 'DayMonth')
{
day = window.document.getElementById(getCtl(source.id,2)).value;
month = window.document.getElementById(getCtl(source.id,1)).value;
year = now.getYear;
} 
else if (dateFormat == 'MonthYear')
{
day = parseInt(now.getDate());
month = window.document.getElementById(getCtl(source.id,2)).value;
year = window.document.getElementById(getCtl(source.id,1)).value;
}
if (dateFormat == 'ShortDate' || dateFormat == 'LongDate' || dateFormat =='DayMonth')
{
maximum = monthDays(day, month, year);
if (maximum <  day)
{
	args.IsValid=false;
}
}
dateSelected=new Date(parseInt(year),parseInt(month)-1,parseInt(day));
currentDate = Date(now.getDate-1,now.getMonth,now.getYear);
dateSelected=formatDate(new Date(dateSelected),'yyyy,MM,dd');
currentDate=formatDate(new Date(currentDate),'yyyy,MM,dd');
//check to see if dates is valid
//allow  past dates
if (dateFormat == 'ShortDate' || dateFormat == 'LongDate' || dateFormat =='MonthYear')
{
if (!allowPastDates)
{
if  (compareDates(dateSelected,'yyyy,MM,dd',currentDate,'yyyy,MM,dd')!=1)
{
args.IsValid=false
window.document.getElementById(source.id).setAttribute("ErrorMessage","Date has already passed",false);
}
}
}
}
function monthDays(d,m,y)
{
if (m == 2)
return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) ? 29 : 28;
else
return (m == 4 || m == 6 || m == 9 || m == 11) ? 30 : 31;
}
function getCtl(controlName, numToSubtract){
	var pos = controlName.lastIndexOf('_ctl');
	var controlPrefix=controlName.slice(0,pos+4);
	var controlNum = parseInt(controlName.slice(pos+4, controlName.length));
	var newControlName;
	controlNum -= numToSubtract;
	return newControlName =controlPrefix + controlNum;
}


var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?'':'0')+x}
function isDate(val,format) {
var date=getDateFromFormat(val,format);
if (date==0) { return false; }
return true;
}
function compareDates(date1,dateformat1,date2,dateformat2) {
var d1=getDateFromFormat(date1,dateformat1);
var d2=getDateFromFormat(date2,dateformat2);
if (d1==0 || d2==0) {
return -1;
}
else if (d1 >= d2) {
return 1;
}
return 0;
}
function formatDate(date,format) {
format=format+'';
var result='';
var i_format=0;
var c='';
var token='';
var y=date.getYear()+'';
var M=date.getMonth()+1;
var d=date.getDate();
var E=date.getDay();
var H=date.getHours();
var m=date.getMinutes();
var s=date.getSeconds();
var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
// Convert real date parts into formatted versions
var value=new Object();
if (y.length < 4) {y=''+(y-0+1900);}
value['y']=''+y;
value['yyyy']=y;
value['yy']=y.substring(2,4);
value['M']=M;
value['MM']=LZ(M);
value['MMM']=MONTH_NAMES[M-1];
value['NNN']=MONTH_NAMES[M+11];
value['d']=d;
value['dd']=LZ(d);
value['E']=DAY_NAMES[E+7];
value['EE']=DAY_NAMES[E];
value['H']=H;
value['HH']=LZ(H);
if (H==0){value['h']=12;}
else if (H>12){value['h']=H-12;}
else {value['h']=H;}
value['hh']=LZ(value['h']);
if (H>11){value['K']=H-12;} else {value['K']=H;}
value['k']=H+1;
value['KK']=LZ(value['K']);
value['kk']=LZ(value['k']);
if (H > 11) { value['a']='PM'; }
else { value['a']='AM'; }
value['m']=m;
value['mm']=LZ(m);
value['s']=s;
value['ss']=LZ(s);
while (i_format < format.length) {
c=format.charAt(i_format);
token='';
while ((format.charAt(i_format)==c) && (i_format < format.length)) {
token += format.charAt(i_format++);
}
if (value[token] != null) { result=result + value[token]; }
else { result=result + token; }
}
return result;
}
function _isInteger(val) {
var digits='1234567890';
for (var i=0; i < val.length; i++) {
if (digits.indexOf(val.charAt(i))==-1) { return false; }
}
return true;
}
function _getInt(str,i,minlength,maxlength) {
for (var x=maxlength; x>=minlength; x--) {
var token=str.substring(i,i+x);
if (token.length < minlength) { return null; }
if (_isInteger(token)) { return token; }
}
return null;
}
function getDateFromFormat(val,format) {
val=val+'';
format=format+'';
var i_val=0;
var i_format=0;
var c='';
var token='';
var token2='';
var x,y;
var now=new Date();
var year=now.getYear();
var month=now.getMonth()+1;
var date=1;
var hh=now.getHours();
var mm=now.getMinutes();
var ss=now.getSeconds();
var ampm='';
while (i_format < format.length) {
// Get next token from format string
c=format.charAt(i_format);
token='';
while ((format.charAt(i_format)==c) && (i_format < format.length)) {
token += format.charAt(i_format++);
}
// Extract contents of value based on format token
if (token=='yyyy' || token=='yy' || token=='y') {
if (token=='yyyy') { x=4;y=4; }
if (token=='yy')   { x=2;y=2; }
if (token=='y')    { x=2;y=4; }
year=_getInt(val,i_val,x,y);
if (year==null) { return 0; }
i_val += year.length;
if (year.length==2) {
if (year > 70) { year=1900+(year-0); }
else { year=2000+(year-0); }
}
}
else if (token=='MMM'||token=='NNN'){
month=0;
for (var i=0; i<MONTH_NAMES.length; i++) {
var month_name=MONTH_NAMES[i];
if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
if (token=='MMM'||(token=='NNN'&&i>11)) {
month=i+1;
if (month>12) { month -= 12; }
i_val += month_name.length;
break;
}
}
}
if ((month < 1)||(month>12)){return 0;}
}
else if (token=='EE'||token=='E'){
for (var i=0; i<DAY_NAMES.length; i++) {
var day_name=DAY_NAMES[i];
if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
i_val += day_name.length;
break;
}
}
}
else if (token=='MM'||token=='M') {
month=_getInt(val,i_val,token.length,2);
if(month==null||(month<1)||(month>12)){return 0;}
i_val+=month.length;}
else if (token=='dd'||token=='d') {
date=_getInt(val,i_val,token.length,2);
if(date==null||(date<1)||(date>31)){return 0;}
i_val+=date.length;}
else if (token=='hh'||token=='h') {
hh=_getInt(val,i_val,token.length,2);
if(hh==null||(hh<1)||(hh>12)){return 0;}
i_val+=hh.length;}
else if (token=='HH'||token=='H') {
hh=_getInt(val,i_val,token.length,2);
if(hh==null||(hh<0)||(hh>23)){return 0;}
i_val+=hh.length;}
else if (token=='KK'||token=='K') {
hh=_getInt(val,i_val,token.length,2);
if(hh==null||(hh<0)||(hh>11)){return 0;}
i_val+=hh.length;}
else if (token=='kk'||token=='k') {
hh=_getInt(val,i_val,token.length,2);
if(hh==null||(hh<1)||(hh>24)){return 0;}
i_val+=hh.length;hh--;}
else if (token=='mm'||token=='m') {
mm=_getInt(val,i_val,token.length,2);
if(mm==null||(mm<0)||(mm>59)){return 0;}
i_val+=mm.length;}
else if (token=='ss'||token=='s') {
ss=_getInt(val,i_val,token.length,2);
if(ss==null||(ss<0)||(ss>59)){return 0;}
i_val+=ss.length;}
else if (token=='a') {
if (val.substring(i_val,i_val+2).toLowerCase()=='am') {ampm='AM';}
else if (val.substring(i_val,i_val+2).toLowerCase()=='pm') {ampm='PM';}
else {return 0;}
i_val+=2;}
else {
if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
else {i_val+=token.length;}
}
}
// If there are any trailing characters left in the value, it doesn't match
if (i_val != val.length) { return 0; }
// Is date valid for month?
if (month==2) {
// Check for leap year
if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
if (date > 29){ return 0; }
}
else { if (date > 28) { return 0; } }
}
if ((month==4)||(month==6)||(month==9)||(month==11)) {
if (date > 30) { return 0; }
}
// Correct hours value
if (hh<12 && ampm=='PM') { hh=hh-0+12; }
else if (hh>11 && ampm=='AM') { hh-=12; }
var newdate=new Date(year,month-1,date,hh,mm,ss);
return newdate.getTime();
}
function parseDate(val) {
var preferEuro=(arguments.length==2)?arguments[1]:false;
generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
var d=null;
for (var i=0; i<checkList.length; i++) {
var l=window[checkList[i]];
for (var j=0; j<l.length; j++) {
d=getDateFromFormat(val,l[j]);
if (d>0) { return new Date(d); }
}
}
return null;
}

