/**
 * @author mlawford-miles
 */

// Date Validation Javascript
// copyright 30th October 2004, by Stephen Chapman
// http://javascript.about.com

// You have permission to copy and use this javascript provided that
// the content of the script is not changed in any way.

// Date formats are either 
//		U - MM-dd-yyyy 
//		J - yyyy-MM-dd
//		W -	dd-MM-yyyy

// This function is called by the custom validator for date controls
function ValidateDate(source, arguments)
{
	var date = IsDateValid(arguments.Value, getFormat())
	if(!date)
	{
		arguments.IsValid = false;
	}
	else
	{
		document.getElementById(eval(source.id).controltovalidate).value = formatDate(date, readCookie("CVDATE"));
	}
}

// This function is called by the custom validator for date controls
function ValidateDateGreaterThanToday(source, arguments)
{
	if(arguments.Value == "dd/mm/yyyy")
	{	
		arguments.Value = "";
	}
	else
	{
		var date = IsDateValid(arguments.Value, getFormat())
		if(!date || date < new Date())
		{
			arguments.IsValid = false;
		}
		else
		{			
			document.getElementById(document.getElementById(source.id).controltovalidate).value = formatDate(date, readCookie("CVDATE"));
		}
	}
}

// This function is called by the custom validator for numeric fields
function ValidateNumeric(source, arguments)
{
	if(!isNum(arguments.Value))
	{
		arguments.IsValid = false;
	}
}

// This function is called by the custom validator for decimal fields
function ValidateDecimal(source, arguments)
{
	if(!/^\d+(\.\d+)?$/.test(arguments.Value))
	{
		arguments.IsValid = false;
	}
}

// This function is called by the custom validator to ensure a checkbox is checked
function IsCheckBoxChecked(checkbox)
{
	var el = YAHOO.util.Dom.get(checkbox);
	return el.checked
}

// this function takes in a date format and decides if it's US, Western or Jap
function getFormat()
{
	return "W";
}

// read a cookie
function readCookie(name) {
	return "dd MMM yyyy";
}
	
function stripBlanks(fld) 
{
	var result = "", c=0;
	for (i=0; i<fld.length; i++) 
	{
		if (fld.charAt(i) != " " || c > 0) 
		{
			result += fld.charAt(i);
			if (fld.charAt(i) != " ") 
				c = result.length;
		}
	}
	return result.substr(0,c);
}

var numb = '0123456789';

function isValid(parm,val) 
{
	if (parm == "") 
		return true;
	for (i=0; i<parm.length; i++) 
	{
		if (val.indexOf(parm.charAt(i),0) == -1)
			return false;
	}
	return true;
}

function isNum(parm) {return isValid(parm,numb);}
var mth = new Array(' ','january','february','march','april','may','june','july','august','september','october','november','december');
var day = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

// Check the date is valid according to the format (fmt) submitted
function IsDateValid(fld,fmt) 
{
	if(fld==null)
	{
		return false;	
	}
	var dd, mm, yy;
	fld = stripBlanks(fld);
	// test if it's a special date eg T for today, t+1 = tomrrow etc
	if(fld.toLowerCase()=='y')
		fld = "t-1";
	if(fld.toLowerCase()=='t')
		fld = "t+0";
	
	if((fld.substring(0, 1).toLowerCase()=='t' && fld.length==3))
	{
		fld = convertSpecialDate(fld, fmt);
		if (fld == '') 
		{
			return false;
		}
	}
	
	fld = fld.replace(/-/g, ' ');
	fld = fld.replace(/\//g, ' ');
	if (fld == '') 
	{
		return false;
	}
	var d1 = fld.split('\/');
	if (d1.length != 3) 
		d1 = fld.split(' ');
	if(d1.length == 4)
	{
		if(d1[0].indexOf("day")>-1)
		{
			d1.shift();
		}
		else if(d1[3].indexOf("day")>-1)
		{
			d1.pop();
		}
		else 
		{
			return false;
		}
		
	}
	if (d1.length != 3) 	
		return false;
		
	if(d1[0].length==0 || d1[1].length==0 || d1[2].length==0)
	{
		return false;
	}
	
	if (fmt == 'u' || fmt == 'U') 
	{
		  dd = d1[1]; 
		  mm = d1[0]; 
		  yy = d1[2];
	}
	else if (fmt == 'j' || fmt == 'J') 
	{
		dd = d1[2]; 
		mm = d1[1]; 
		yy = d1[0];
	}
	else if (fmt == 'w' || fmt == 'W')
	{
		dd = d1[0]; 
		mm = d1[1]; 
		yy = d1[2];
	}
	else return false;
	var n = dd.lastIndexOf('st');
	
	if (n > -1) 
		dd = dd.substr(0,n);
	n = dd.lastIndexOf('nd');
	if (n > -1) 
		dd = dd.substr(0,n);
	n = dd.lastIndexOf('rd');
	if (n > -1) 
		dd = dd.substr(0,n);
	n = dd.lastIndexOf('th');
	if (n > -1) 
		dd = dd.substr(0,n);
	n = dd.lastIndexOf(',');
	if (n > -1) 
		dd = dd.substr(0,n);
	n = mm.lastIndexOf(',');
	if (n > -1) mm = mm.substr(0,n);
	if (!isNum(dd)) 
		return false;
	if (!isNum(yy)) 
		return false;
	if (!isNum(mm)) {
	  var nn = mm.toLowerCase();
	  for (var i=1; i < 13; i++) {
		if (nn == mth[i] ||
			nn == mth[i].substr(0,3)) {mm = i; i = 13;}
	  }
	}
	if (!isNum(mm)) 
		return false;
	dd = parseFloat(dd); 
	mm = parseFloat(mm); 
	yy = parseFloat(yy);
	if (yy < 100) yy += 2000;
	if (yy < 1582 || yy > 4881) return false;
	if (mm == 2 && (yy%400 == 0 || (yy%4 == 0 && yy%100 != 0))) day[mm-1]++;
	if (mm < 1 || mm > 12) return false;
	if (dd < 1 || dd > day[mm-1]) return false;

	// Convert to date
	var t = new Date();
	t.setFullYear(yy); t.setMonth(mm-1); t.setDate(dd);
	t.setHours(0); t.setMinutes(0); t.setSeconds(0); t.setMilliseconds(0);


	return t;
}

// ------------------------------------------------------------------
// formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
// ------------------------------------------------------------------
function formatDate(date,format) {
	if(date=="")
	{
		return "";
	}
	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["MMMM"]=MONTH_NAMES[M-1];
	value["MMM"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["dddd"]=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;
	}
	
	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}

// takes in a t+1 or y and returns the correct date for it
function convertSpecialDate(fld)
{
	var returnDate = "";
	fld = fld.toLowerCase();

	var direction = fld.substring(1,2);
	var amount = fld.substring(2,3);	
	
	if(isNum(amount))
	{
		var time = 86400000 * amount;
		returnDate = calcTime(time, direction)
	}
	
	return formatDate(returnDate, readCookie("CVDATE"));
}

// calculates the time needed to add or takeaway from today
// in support of convertSepecialDate
function calcTime(time, direction)
{
	var today = new Date();
	var returnTime = "";
	switch (direction)
	{
		case "-" :
			returnTime = new Date( today.getTime() - time );
			break;
		case "+" :
			returnTime = new Date( today.getTime() + time );
			break;
	}	
	
	return returnTime;
}

