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,false);
 if (date==0) { return false; }
 return true;
}

function compareDates(date1,dateformat1,date2,dateformat2) {
 var d1=getDateFromFormat(date1,dateformat1,false);
 var d2=getDateFromFormat(date2,dateformat2,false);
 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,abDate) {
 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);
 if (abDate) {
 return newdate;
 } else {
 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],false);
 if (d!=0) { return new Date(d); }
 }
 }
 return null;
}

var gdTodaysDate = new Date();
gdTodaysDate.setHours(0,0,0);

// ------------------------------------------------------------------
// Page load functions
// ------------------------------------------------------------------
function bodyOnLoad() {
 handleBackButton();
 if (typeof(Init) == "function") Init();
 ErrorCheck();
}
// ------------------------------------------------------------------
// String functions
// ------------------------------------------------------------------
function strltrim() {return this.replace(/^\s+/,'');}
function strrtrim() {return this.replace(/\s+$/,'');}
function strtrim() {return this.replace(/^\s+/,'').replace(/\s+$/,'');}
String.prototype.ltrim = strltrim;
String.prototype.rtrim = strrtrim;
String.prototype.trim = strtrim;

function isInteger(asIntStr) {
 var lsdigits="1234567890";
 for (var llLoop=0; llLoop < asIntStr.length; llLoop++) {
 if (lsdigits.indexOf(asIntStr.charAt(llLoop))==-1) {return false;}
 }
 return true;
}

function isChecked(asField) {
 return ($(asField).checked) ? "Y" : "N";
}

// ------------------------------------------------------------------
// Class functions
// ------------------------------------------------------------------
function removeClassName (elem, className) {
 elem.className = elem.className.replace(className, "").trim();
}

function addClassName (elem, className) {
 removeClassName (elem, className);
 elem.className = (elem.className + " " + className).trim();
}

function setClassName (elem, className) {
 elem.className = className;
}

// ------------------------------------------------------------------
// Date build functions
// ------------------------------------------------------------------
function setDateField(asField, asDate) {
 var lsSetDD, lsSetMM, lsSetYY;
 if (arguments.length > 2) {
 lsSetDD = asDate;
 lsSetMM = arguments[2];
 lsSetYY = arguments[3];
 } else {
 lsSetDD = asDate.substr(0, 2);
 lsSetMM = asDate.substr(3, 2);
 lsSetYY = asDate.substr(6, 4);
 }
 $(asField + "DD").value = lsSetDD;
 $(asField + "MM").value = lsSetMM;
 $(asField + "YYYY").value = lsSetYY;
}

function getDateStr(asField) {
 return $f(asField + "DD").value + "-" + $f(asField + "MM").value + "-" + $f(asField + "YYYY").value;
}

function gbValidateDate(asField, asFieldLabel) {
 if (!isDate(getDateStr(asField), gsDateFormat)) {
 return setFocus(asFieldLabel + " is an invalid date", $(asField + "DD"));
 }
 return true;
}

function gsAddDaysStr(asDateStr, alDays) {
 if ((asDateStr != '') && (isDate(asDateStr, gsDateCalcFormat))) {
 var ldNewAddDate = getDateFromFormat(asDateStr, gsDateCalcFormat, true);
 if (ldNewAddDate != 0) {
 var alNewDays = ldNewAddDate.getDate();
 alNewDays += alDays;
 ldNewAddDate.setDate(alNewDays);
 return formatDate(ldNewAddDate, gsDateCalcFormat);
 }
 }
 return '';
}

// ------------------------------------------------------------------
// Common message functions
// ------------------------------------------------------------------
function addFlowCtl(asAct) {
 var lsXml = "<FLOCTL>";
 lsXml += '<CTLSITE>' + gsCtlSite + '</CTLSITE>';
 lsXml += "<CTLACT>" + asAct + "</CTLACT>";
 lsXml += "<CTLSCR>" + gsCtlScr + "</CTLSCR>";
 lsXml += "</FLOCTL>";
 return lsXml;
}

function xmlDateBuild(asField) {
 var lsXml = '';
 lsXml += "<DD>" + $(asField + "DD").value + "</DD>";
 lsXml += "<MM>" + $(asField + "MM").value + "</MM>";
 lsXml += "<YYYY>" + $(asField + "YYYY").value + "</YYYY>";
 return lsXml;
}

function xmlDateValueBuild(asDate, asDatePrefix) {
 if (typeof(asDatePrefix) == "undefined") {asDatePrefix = "";}
 var lsXml = '';
 lsXml += "<" + asDatePrefix + "DD>" + asDate.substr(0, 2) + "</" + asDatePrefix + "DD>";
 lsXml += "<" + asDatePrefix + "MM>" + asDate.substr(3, 2) + "</" + asDatePrefix + "MM>";
 lsXml += "<" + asDatePrefix + "YYYY>" + asDate.substr(6, 4) + "</" + asDatePrefix + "YYYY>";
 return lsXml;
}

function xmlAddField(asField, asNode) {
 return "<" + asNode + ">" + $(asField).value + "</" + asNode + ">";
}

function xmlAddValue(asValue, asNode) {
 return "<" + asNode + ">" + asValue + "</" + asNode + ">";
}

// ------------------------------------------------------------------
// Alert functions
// ------------------------------------------------------------------
function setFocus(lsAlertMsg, aoField) {
 if (typeof(aoField) == "string") aoField = $(aoField);
 alert(lsAlertMsg);
 aoField.focus();
 return false;
}

// ------------------------------------------------------------------
// Radio button functions
// ------------------------------------------------------------------
function getRadioValue(asName) {
 var value = null;
 var radioButtonGroup = getInputsByName(asName);
 if (radioButtonGroup.length > 0) {
 for (var idx = 0; idx < radioButtonGroup.length; idx++)
 if (radioButtonGroup[idx].checked) value = radioButtonGroup[idx].value;
 }
 return value;
}

// ------------------------------------------------------------------
// Get first DOM child (Firefox fix)
// ------------------------------------------------------------------
function getFirstChild(theParent) {
 var theChild = theParent.firstChild;
 while (theChild.nodeType != 1) {
 theChild = theChild.nextSibling;
 }

 return theChild;
}

// ------------------------------------------------------------------
// Get element function
// ------------------------------------------------------------------
function $f(element) {
 if (arguments.length > 1) {
 for (var i = 0, elements = [], length = arguments.length; i < length; i++)
 elements.push($f(arguments[i]));
 return elements;
 }
 if (typeof element == 'string')
 element = document.getElementById(element);
 return element;
}


// ------------------------------------------------------------------
// Get input fields function
// ------------------------------------------------------------------
function getInputsByName(name) {
 var results = [];
 results.numChecked = 0;
 var input = document.getElementsByTagName("input");
 for (var i=0; i < input.length; i++) {
 if (input[i].name == name) {
 results.push(input[i]);
 if (input[i].checked)
 results.numChecked++;
 }
 }
 return results;
}

// ------------------------------------------------------------------
// Format a number to 2 decimal places
// ------------------------------------------------------------------
function formatNumber() {
 if (isNaN(this)) return("");
 var NumVal = new Number(this);
 var RetVal = new String();
 var IntegerPlaces = new Number(15);
 var DecimalPlaces = new Number(2);
 NumVal = Math.round(Math.ceil(NumVal * Math.pow(10, DecimalPlaces))) / Math.pow(10, DecimalPlaces);
 RetVal = String(NumVal);
 if (RetVal.indexOf('.') == -1) RetVal += '.';
 if (RetVal.substring(0, RetVal.indexOf('.')).length > IntegerPlaces) return("");
 while (RetVal.substr(RetVal.indexOf('.') + 1).length < DecimalPlaces) {RetVal += '0';}
 return(RetVal);
}

Number.prototype.format = formatNumber;

// ------------------------------------------------------------------
// Switch on holding page if we've got it
// ------------------------------------------------------------------
function useHolding() {
 if ($f('holdingPage')) {
 addClassName($f('maincontentHolder'), 'hideme');
 removeClassName($f('holdingPage'), 'hideme');
 }
}

function truncateSentence(sentence, numWords) {
 var str='';
 var splitStr = sentence.split(' ');
 var totalNumWords = splitStr.length;
 for (i=0;i<numWords && i<totalNumWords;i++) str=str+splitStr[i]+" ";
 document.write(str);
}

function adjustDays(dd,mm,yy)
{
 var day = document.getElementById(dd);
 var month = parseInt(document.getElementById(mm).value);
 var year=document.getElementById(yy).value;
 limitList(monthDays(month,year), dd);
}
function monthDays(month,year) {
	month--;
 var day = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  if ((year % 4 == 0) && (month==1)) {
 if (year % 100 == 0) {
 if (year % 400 == 0) {
 return 29;
 } else {
 return 28;
 }
 } else {
 return 29;
 }
 } else {
 return day[month];
 }
}

function limitList(length, dd) {
 var list;
 var len1=length;
 var len2=0;
 var elOptNew29;
 var elOptNew30;
 var elOptNew31;

 var list=document.getElementById(dd);

 while (list.length > len1){
 list.remove(list.length - 1);
 }

 while (len1 > list.length){
 if (list.length == 28){
 elOptNew29 = document.createElement('option');
 elOptNew29.text = 29;
 elOptNew29.value = 29;
 try {
 list.add(elOptNew29, null); // standards compliant; doesn't work in IE
 }
 catch(ex) {
 list.add(elOptNew29); // IE only
 }
 }
 else if (list.length == 29){
 elOptNew29 = document.createElement('option');
 elOptNew29.text = 30;
 elOptNew29.value = 30;
 try {
 list.add(elOptNew29, null); // standards compliant; doesn't work in IE
 }
 catch(ex) {
 list.add(elOptNew29); // IE only
 }
 }
 else if (list.length == 30){
 elOptNew29 = document.createElement('option');
 elOptNew29.text = 31;
 elOptNew29.value = 31;
 try {
 list.add(elOptNew29, null); // standards compliant; doesn't work in IE
 }
 catch(ex) {
 list.add(elOptNew29); // IE only
 }
 }
 }
}
