/******************************************************************
   convert_date()
   
   Function to convert supplied dates to format - dd.mm.yyyy.
	Valid input dates = 
		ddmmyy, ddmmmyy, ddmmyyyy, ddmmmyyyy,
		d/m/yy, dd/m/yy, d/mm/yy, dd/mm/yy, d/mmm/yy, dd/mmm/yy,
		d/m/yyyy, dd/m/yyyy, d/mm/yyyy, dd/mm/yyyy, d/mmm/yyyy, dd/mmm/yyyy
	Valid date seperators =
		'-','.','/',' ',':','_',','
		
	Calls convert_month()
			invalid_date()
			validate_date()
			validate_year()
     
   Author: David Bsaibes 
   Date Created: 7/6/01
   
*******************************************************************/
function checkdate(field1,fld)
{
//alert (outdate1)
var fLength = field1.value.length; // Length of supplied field in characters.
var divider_values = new Array ('-','.','/',' ',':','_',','); // Array to hold permitted date seperators.  Add in '\' value
var array_elements = 7; // Number of elements in the array - divider_values.
var day1 = new String(null); // day value holder
var month1 = new String(null); // month value holder
var year1 = new String(null); // year value holder
var divider1 = null; // divider holder
var outdate1 = null; // formatted date to send back to calling field holder
var counter1 = 0; // counter for divider looping 
var divider_holder = new Array ('0','0','0'); // array to hold positions of dividers in dates
var s = String(field1.value); // supplied date value variable

//If field is empty do nothing
if ( fLength == 0 ) {
   return true;
}

// Deal with today or now
if ( field1.value.toUpperCase() == 'NOW' || field1.value.toUpperCase() == 'TODAY' ) {
   
	var newDate1 = new Date();
	
  		if (navigator.appName == "Netscape") {
    		var myYear1 = newDate1.getYear() + 1900;
  		}
  		else {
  			var myYear1 =newDate1.getYear();
  		}
  
	var myMonth1 = newDate1.getMonth()+1;  
	var myDay1 = newDate1.getDate();
	field1.value = converttomediumdate(myDay1 + "/" + myMonth1 + "/" + myYear1);
	fLength = field1.value.length;//re-evaluate string length.
	s = String(field1.value)//re-evaluate the string value.
}

//Check the date is the required length
if ( fLength != 0 && (fLength < 6 || fLength > 11) ) {
	invalid_date(field1);
	return false;   
	}
// Find position and type of divider in the date
for ( var i=0; i<3; i++ ) {
	for ( var x=0; x<array_elements; x++ ) {
		if ( s.indexOf(divider_values[x], counter1) != -1 ) {
			divider1 = divider_values[x];
			divider_holder[i] = s.indexOf(divider_values[x], counter1);
		   //alert(i + " divider1 = " + divider_holder[i]);
			counter1 = divider_holder[i] + 1;
			//alert(i + " counter1 = " + counter1);
			break;
		}
 	}
 }


// if element 2 is not 0 then more than 2 dividers have been found so date is invalid.
if ( divider_holder[2] != 0 ) {
   invalid_date(field1);
	return false;   
}

// See if no dividers are present in the date string.
if ( divider_holder[0] == 0 && divider_holder[1] == 0 ) { 
   
		//continue processing
		if ( fLength == 6 ) {//ddmmyy
   		day1 = field1.value.substring(0,2);
     		month1 = field1.value.substring(2,4);
  			year1 = field1.value.substring(4,6);
  			if ( (year1 = validate_year(year1)) == false ) {
   			invalid_date(field1);
				return false; 
				}
			}
			
		else if ( fLength == 7 ) {//ddmmmy
   		day1 = field1.value.substring(0,2);
  			month1 = field1.value.substring(2,5);
  			year1 = field1.value.substring(5,7);
  			if ( (month1 = convert_month(month1)) == false ) {
   			invalid_date(field1);
				return false; 
				}
  			if ( (year1 = validate_year(year1)) == false ) {
   			invalid_date(field1);
				return false; 
				}
			}
		else if ( fLength == 8 ) {//ddmmyyyy
   		day1 = field1.value.substring(0,2);
  			month1 = field1.value.substring(2,4);
  			year1 = field1.value.substring(4,8);
			}
		else if ( fLength == 9 ) {//ddmmmyyyy
   		day1 = field1.value.substring(0,2);
  			month1 = field1.value.substring(2,5);
  			year1 = field1.value.substring(5,9);
  			if ( (month1 = convert_month(month1)) == false ) {
   			invalid_date(field1);
				return false; 
				}
			}
		
		if ( (outdate1 = validate_date(day1,month1,year1)) == false ) {
		if (fld == null) {
   		alert("The value " + field1.value + " is not a valid date.\n\r" +  
			"Please enter a valid date in the format dd/mm/yyyy");
			field1.focus();
			field1.select();
			return false; }
		else {
   		alert("Invalid date.");
			fld.focus();
			return false;
			}
																		}

		field1.value = converttomediumdate(outdate1);
		return true;// All OK
		}

	
// 2 dividers are present so continue to process	
if ( divider_holder[0] != 0 && divider_holder[1] != 0 ) { 	
  	day1 = field1.value.substring(0, divider_holder[0]);
  	month1 = field1.value.substring(divider_holder[0] + 1, divider_holder[1]);
  	//alert(month1);
  	year1 = field1.value.substring(divider_holder[1] + 1, field1.value.length);
	}

if ( isNaN(day1) && isNaN(year1) ) { // Check day and year are numeric
	invalid_date(field1);
	return false;  
   }

if ( day1.length == 1 ) { //Make d day dd
   day1 = '0' + day1;  
}

if ( month1.length == 1 ) {//Make m month mm
	month1 = '0' + month1;   
}

if ( year1.length == 2 ) {//Make yy year yyyy
   if ( (year1 = validate_year(year1)) == false ) {
   	invalid_date(field1);
		return false;  
		}
}
if ( month1.length == 3 || month1.length == 4 ) {//Make mmm month mm
   if ( (month1 = convert_month(month1)) == false) {
   	invalid_date(field1);
   	return false;  
   }
}
// Date components are OK
if ( (day1.length == 2 || month1.length == 2 || year1.length == 4) == false) {
   invalid_date(field1);
   return false;
}
//Validate the date
if ( (outdate1 = validate_date(day1, month1, year1)) == false ) {
		if (fld == null) {
   alert("The value " + field1.value + " is not a valid date.\n\r" +  
	"Please enter a valid date in the format dd/mm/yyyy ");
			field1.focus();
			field1.select();
			return false; }
		else {
			alert("Invalid date.");			
			fld.focus();
			return false;
			}
																		}
// Redisplay the date in dd.mm.yyyy format
field1.value = converttomediumdate(outdate1);
return true;//All is well

}


function converttomediumdate(dmydate)
{
	arvar = dmydate.split("/")
	//alert(dmydate)
	switch (arvar[1])
	{
		case "01" :
			tmpmonth = "Jan"
			break
		case "02" :
			tmpmonth = "Feb"
			break
		case "03" :
			tmpmonth = "Mar"
			break
		case "04" :
			tmpmonth = "Apr"
			break
		case "05" :
			tmpmonth = "May"
			break
		case "06" :
			tmpmonth = "Jun"
			break
		case "07" :
			tmpmonth = "Jul"
			break
		case "08" :
			tmpmonth = "Aug"
			break
		case "09" :
			tmpmonth = "Sep"
			break
		case "10" :
			tmpmonth = "Oct"
			break
		case "11" :
			tmpmonth = "Nov"
			break
		case "12" :
			tmpmonth = "Dec"
			break
	}
	tmpvar = arvar[0] + "-" + tmpmonth + "-" + arvar[2]
	//alert (tmpvar)
	return tmpvar
}

function convertfrommediumdate(mediumdate)
{	arvar = mediumdate.split("-")
	//alert(dmydate)
	switch (arvar[1])
	{
		case "Jan" :
			tmpmonth = "01"
			break
		case "Feb" :
			tmpmonth = "02"
			break
		case "Mar" :
			tmpmonth = "03"
			break
		case "Apr" :
			tmpmonth = "04"
			break
		case "May" :
			tmpmonth = "05"
			break
		case "Jun" :
			tmpmonth = "06"
			break
		case "Jul" :
			tmpmonth = "07"
			break
		case "Aug" :
			tmpmonth = "08"
			break
		case "Sep" :
			tmpmonth = "09"
			break
		case "Oct" :
			tmpmonth = "10"
			break
		case "Nov" :
			tmpmonth = "11"
			break
		case "Dec" :
			tmpmonth = "12"
			break
		case "JAN" :
			tmpmonth = "01"
			break
		case "FEB" :
			tmpmonth = "02"
			break
		case "MAR" :
			tmpmonth = "03"
			break
		case "APR" :
			tmpmonth = "04"
			break
		case "MAY" :
			tmpmonth = "05"
			break
		case "JUN" :
			tmpmonth = "06"
			break
		case "JUL" :
			tmpmonth = "07"
			break
		case "AUG" :
			tmpmonth = "08"
			break
		case "SEP" :
			tmpmonth = "09"
			break
		case "OCT" :
			tmpmonth = "10"
			break
		case "NOV" :
			tmpmonth = "11"
			break
		case "DEC" :
			tmpmonth = "12"
			break

	}
	
	tmpvar = tmpmonth + "/" + arvar[0] + "/" + arvar[2]
	//alert (tmpvar)
	return tmpvar
}


//************************************************************************************
function checkdateSpecial(field1)
{
var fLength = field1.value.length; // Length of supplied field in characters.
var divider_values = new Array ('-','.','/',' ',':','_',','); // Array to hold permitted date seperators.  Add in '\' value
var array_elements = 7; // Number of elements in the array - divider_values.
var day1 = new String(null); // day value holder
var month1 = new String(null); // month value holder
var year1 = new String(null); // year value holder
var divider1 = null; // divider holder
var outdate1 = null; // formatted date to send back to calling field holder
var counter1 = 0; // counter for divider looping 
var divider_holder = new Array ('0','0','0'); // array to hold positions of dividers in dates
var s = String(field1.value); // supplied date value variable

//If field is empty do nothing
if ( fLength == 0 ) {
   return true;
}

// Deal with today or now
if ( field1.value.toUpperCase() == 'NOW' || field1.value.toUpperCase() == 'TODAY' ) {
   
	var newDate1 = new Date();
	
  		if (navigator.appName == "Netscape") {
    		var myYear1 = newDate1.getYear() + 1900;
  		}
  		else {
  			var myYear1 =newDate1.getYear();
  		}
  
	var myMonth1 = newDate1.getMonth()+1;  
	var myDay1 = newDate1.getDate();
	field1.value = myDay1 + "/" + myMonth1 + "/" + myYear1;
	fLength = field1.value.length;//re-evaluate string length.
	s = String(field1.value)//re-evaluate the string value.
}

//Check the date is the required length
if ( fLength != 0 && (fLength < 6 || fLength > 11) ) {
	invalid_date(field1);
	return false;   
	}

// Find position and type of divider in the date
for ( var i=0; i<3; i++ ) {
	for ( var x=0; x<array_elements; x++ ) {
		if ( s.indexOf(divider_values[x], counter1) != -1 ) {
			divider1 = divider_values[x];
			divider_holder[i] = s.indexOf(divider_values[x], counter1);
		   //alert(i + " divider1 = " + divider_holder[i]);
			counter1 = divider_holder[i] + 1;
			//alert(i + " counter1 = " + counter1);
			break;
		}
 	}
 }

// if element 2 is not 0 then more than 2 dividers have been found so date is invalid.
if ( divider_holder[2] != 0 ) {
   invalid_date(field1);
	return false;   
}

// See if no dividers are present in the date string.
if ( divider_holder[0] == 0 && divider_holder[1] == 0 ) { 
   
		//continue processing
		if ( fLength == 6 ) {//ddmmyy
   		day1 = field1.value.substring(0,2);
     		month1 = field1.value.substring(2,4);
  			year1 = field1.value.substring(4,6);
  			if ( (year1 = validate_year(year1)) == false ) {
   			invalid_date(field1);
				return false; 
				}
			}
			
		else if ( fLength == 7 ) {//ddmmmy
   		day1 = field1.value.substring(0,2);
  			month1 = field1.value.substring(2,5);
  			year1 = field1.value.substring(5,7);
  			if ( (month1 = convert_month(month1)) == false ) {
   			invalid_date(field1);
				return false; 
				}
  			if ( (year1 = validate_year(year1)) == false ) {
   			invalid_date(field1);
				return false; 
				}
			}
		else if ( fLength == 8 ) {//ddmmyyyy
   		day1 = field1.value.substring(0,2);
  			month1 = field1.value.substring(2,4);
  			year1 = field1.value.substring(4,8);
			}
		else if ( fLength == 9 ) {//ddmmmyyyy
   		day1 = field1.value.substring(0,2);
  			month1 = field1.value.substring(2,5);
  			year1 = field1.value.substring(5,9);
  			if ( (month1 = convert_month(month1)) == false ) {
   			invalid_date(field1);
				return false; 
				}
			}
		
		if ( (outdate1 = validate_date(day1,month1,year1)) == false ) {
   		alert("The value " + field1.value + " is not a valid date.\n\r" +  
			"Please enter a valid date in the format dd/mm/yyyy");
			//field1.focus();
			field1.select();
			return false;
			}

		field1.value = outdate1;
		return true;// All OK
		}
		
// 2 dividers are present so continue to process	
if ( divider_holder[0] != 0 && divider_holder[1] != 0 ) { 	
  	day1 = field1.value.substring(0, divider_holder[0]);
  	month1 = field1.value.substring(divider_holder[0] + 1, divider_holder[1]);
  	//alert(month1);
  	year1 = field1.value.substring(divider_holder[1] + 1, field1.value.length);
	}

if ( isNaN(day1) && isNaN(year1) ) { // Check day and year are numeric
	invalid_date(field1);
	return false;  
   }

if ( day1.length == 1 ) { //Make d day dd
   day1 = '0' + day1;  
}

if ( month1.length == 1 ) {//Make m month mm
	month1 = '0' + month1;   
}

if ( year1.length == 2 ) {//Make yy year yyyy
   if ( (year1 = validate_year(year1)) == false ) {
   	invalid_date(field1);
		return false;  
		}
}

if ( month1.length == 3 || month1.length == 4 ) {//Make mmm month mm
   if ( (month1 = convert_month(month1)) == false) {
   	//alert("month1" + month1);
   	invalid_date(field1);
   	return false;  
   }
}

// Date components are OK
if ( (day1.length == 2 || month1.length == 2 || year1.length == 4) == false) {
   invalid_date(field1);
   return false;
}

//Validate the date
if ( (outdate1 = validate_date(day1, month1, year1)) == false ) {
   alert("The value " + field1.value + " is not a valid date.\n\r" +  
	"Please enter a valid date in the format dd/mm/yyyy");
	//field1.focus();
	field1.select();
	return false;
}

// Redisplay the date in dd.mm.yyyy format
field1.value = outdate1;
return true;//All is well

}



/******************************************************************
   convert_month()
   
   Function to convert mmm month to mm month 
   
   Called by convert_date()    
   
*******************************************************************/
function convert_month(monthIn) {

var month_values = new Array ("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");

monthIn = monthIn.toUpperCase(); 
if ( monthIn.length == 3 ) {
	for ( var i=0; i<12; i++ ) 
		{
   	if ( monthIn == month_values[i] ) 
   		{
			monthIn = i + 1;
			if ( monthIn != 10 && monthIn != 11 && monthIn != 12 ) 
				{
   			monthIn = '0' + monthIn;
				}
			return monthIn;
			}
		}
	}

else if ( monthIn.length == 4 && monthIn == 'SEPT') {
   monthIn = '09';
   return monthIn;
	}
	
else {
	return false;
	} 
}
/******************************************************************
   invalid_date()
   
   If an entered date is deemed to be invalid, invali
   d_date() is called to display a warning message to
   the user.  Also returns focus to the date  in que
   stion and selects the date for edit.
        
   Called by convert_date()
   
*******************************************************************/
function invalid_date(inField) 
{
alert("The value " + inField.value + " is not in a valid date format.\n\r" + 
        "Please enter date in the format dd/mm/yyyy");
inField.focus();
inField.select();
return true   
}
/******************************************************************
   validate_date()
   
   Validates date output from convert_date().  Checks
   day is valid for month, leap years, month !> 12,.
   
*******************************************************************/
function validate_date(day2, month2, year2)
{                                                              
var DayArray = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var MonthArray = new Array("01","02","03","04","05","06","07","08","09","10","11","12"); 
var inpDate = day2 + month2 + year2;
var filter=/^[0-9]{2}[0-9]{2}[0-9]{4}$/;                    

//Check ddmmyyyy date supplied
if (! filter.test(inpDate))                                      
  {
  return false;                                                 
  }                                                                                                                                                                                                
/* Check Valid Month */
filter=/01|02|03|04|05|06|07|08|09|10|11|12/ ;     
if (! filter.test(month2))                                      
  {                                                              
  return false;                                             
  }                                                                                                                     
/* Check For Leap Year */                                                                                                  
var N = Number(year2);                                             
if ( ( N%4==0 && N%100 !=0 ) || ( N%400==0 ) )                     
  	{                                                       
   DayArray[1]=29;                                                 
  	}                                                                                                                                                                                                   
/* Check for valid days for month */                              
for(var ctr=0; ctr<=11; ctr++)                                 
  	{                                                                
   if (MonthArray[ctr]==month2)                                 
   	{                                                                 
      if (day2<= DayArray[ctr] && day2 >0 )                    
        {
        inpDate = day2 + '/' + month2 + '/' + year2;       
        return inpDate;
        }                                             
      else                                                         
        {                                                                                 
        return false;                                             
        }                                                           
   	}                                                                   
   }                                          
}
/******************************************************************
   validate_year()
   
   converts yy years to yyyy
   Uses a hinge date of 10
        < 10 = 20yy 
        => 10 = 19yy.
         
   Called by convert_date() before validate_date().
      
*******************************************************************/
function validate_year(inYear) 
{
if ( inYear < 10 ) 
	{
   inYear = "20" + inYear;
   return inYear;
	}
else if ( inYear >= 10 )
	{
   inYear = "20" + inYear;
   return inYear;
	}
else 
	{
	return false;
	}   
}


function datelessthanmdy( olddate, newdate)
{
olddate = convertfrommediumdate(olddate)
newdate = convertfrommediumdate(newdate)
arrold = olddate.split("/");
arrnew = newdate.split("/");

if ( eval(arrnew[2]) <  eval(arrold[2])  )
{
	return false;
}
else
{
	
	if (eval(arrnew[2]) ==  eval(arrold[2]))
	{
	
			if ( eval(arrnew[0]) <  eval(arrold[0])  )
			{
				return false;
			}
			else
			{
				if (eval(arrnew[0]) ==  eval(arrold[0]))
				{
							
							if ( eval(arrnew[1]) <  eval(arrold[1])  )
							{
								return false;
							}
							else
							{
								return true;
							}
				}
				else // if new month > old month
				{
					return true;
				}
								
			}
	}
	else // if new year > old year
	{
		return true;
	}
	
}
}

function datelessthan( olddate, newdate)
{
olddate = convertfrommediumdate(olddate)
newdate = convertfrommediumdate(newdate)
arrold = olddate.split("/");
arrnew = newdate.split("/");
if ( eval(arrnew[2]) <  eval(arrold[2])  )
{
	return false;
}
else
{
	
	if (eval(arrnew[2]) ==  eval(arrold[2]))
	{
	
			if ( eval(arrnew[1]) <  eval(arrold[1])  )
			{
				return false;
			}
			else
			{
				if (eval(arrnew[1]) ==  eval(arrold[1]))
				{
							
							if ( eval(arrnew[0]) <  eval(arrold[0])  )
							{
								return false;
							}
							else
							{
								return true;
							}
				}
				else // if new month > old month
				{
					return true;
				}
								
			}
	}
	else // if new year > old year
	{
		return true;
	}
	
}
}


function dateadd(inidate,addval,dayweek,addsub)
{
// inidate : the initial date to wich we will add or substruct adval days or weeks
// addval : the value of days or weeks to be added or substructed
// dayweek : can have two values d(days) or w(weeks)
// addsubb : can have two values a(for addition) or s(for subscription)
	
	inidate = convertfrommediumdate(inidate)
	
		arrdate = inidate.split("/")
		
		var EnteredDay = arrdate[1];//inidate.substr(0,2);
		var EnteredMonth = arrdate[0] - 1 ;//inidate.substr(3,2) - 1;
		var EnteredYear = 20 + arrdate[2];//inidate.substr(6,4);
		// Create a new date object with the entered month, day and year
		var EnteredDate = new Date(EnteredYear, EnteredMonth, EnteredDay, 0, 0, 0);

		// Determine the milliseconds in the timespan selected
		// Set the default (1 day)
		var MilliSecondsBase = 86400000 
		// If the span selected is weeks, multiply the default by 7
		if (dayweek == "w")
		{
			MilliSecondsBase *= 7;
		}
		
		// Multiply the millisecons by the period entered 
		MilliSecondsToAdd  = MilliSecondsBase * addval;
		// Create the new date using the correct operation
		if (addsub == "a")
		{
			var NewDateAsNumber = EnteredDate.getTime() + MilliSecondsToAdd;
		}
		else
		{
			var NewDateAsNumber = EnteredDate.getTime() - MilliSecondsToAdd;
		}
		// Create the new date object
		var NewDate = new Date(NewDateAsNumber);
		// Get the month, day and year values from the new date object
		// Set the month and day to two digits if they are less than 10
		var NewMonth = NewDate.getMonth() + 1;
		if (NewMonth < 10)
		{
			NewMonth = "0" + NewMonth;
		}
		var NewDay = NewDate.getDate();
		if (NewDay < 10)
		{
			NewDay = "0" + NewDay;
		}
		var NewYear = NewDate.getFullYear();
		// Display the new date in the form
		return converttomediumdate(NewDay + "/" + NewMonth + "/" + NewYear);


}
