/***********************************************
// JavaScript DropDownCal.js
// script by Kishantha Nanayakkara (kishantha@intervest.gi)

 ************************************************/
 
var Today = new Date();
var DefaultDateFormat = 'MM/DD/YYYY'; // If no date format is supplied, this will be used instead
var MonthNames = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
var MonthDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var Y2kPivotPoint = 76; // 2-digit years before this point will be created in the 21st century


// Returns the number of days in a month (handles leap-years)
function GetDayCount(SomeYear, SomeMonth) {
   return ((SomeMonth == 1) && ((SomeYear % 400 == 0) || ((SomeYear % 4 == 0) && (SomeYear % 100 != 0)))) ? 29 : MonthDays[SomeMonth];
}

// Determines which century to use (20th or 21st) when dealing with 2-digit years
function GetGoodYear(YearDigits) {
   if (YearDigits.length == 4) return YearDigits;
   else {
      var Millennium = (YearDigits < Y2kPivotPoint) ? 2000 : 1900;
      return Millennium + parseInt(YearDigits,10);
   }
}

// Holds characteristics about a date
function dateObject() {

   if (Function.call) { // Used when 'call' method of the Function object is supported
      var ParentObject = this;
      var ArgumentStart = 0;
   }
   else { // Used with 'call' method of the Function object is NOT supported
      var ParentObject = arguments[0];
      var ArgumentStart = 1;
   }

   ParentObject.date = (arguments.length == (ArgumentStart+1)) ? new Date(arguments[ArgumentStart+0]) : new Date(arguments[ArgumentStart+0], arguments[ArgumentStart+1], arguments[ArgumentStart+2]);

   ParentObject.yearValue = ParentObject.date.getFullYear();
   ParentObject.monthIndex = ParentObject.date.getMonth();
   ParentObject.monthName = MonthNames[ParentObject.monthIndex];
  
   ParentObject.fullName = ParentObject.monthName + ' ' + ParentObject.yearValue;
   ParentObject.day = ParentObject.date.getDate();
   ParentObject.dayCount = GetDayCount(ParentObject.yearValue, ParentObject.monthIndex);
   var FirstDate = new Date(ParentObject.yearValue, ParentObject.monthIndex, 1);
   ParentObject.firstDay = FirstDate.getDay();
}

// Keeps track of the date that goes into the hidden field
function storedMonthObject(DateFormat, DateYear, DateMonth, DateDay) {
	
   (Function.call) ? dateObject.call(this, DateYear, DateMonth, DateDay) : dateObject(this, DateYear, DateMonth, DateDay);
   
   this.yearPad = this.yearValue.toString();
   this.monthPad = (this.monthIndex < 9) ? '0' + String(this.monthIndex + 1) : this.monthIndex + 1;
   this.dayPad = (this.day < 10) ? '0' + this.day.toString() : this.day;
   this.monthShort = this.monthName.substr(0,3).toUpperCase();
   // Formats the year with 2 digits instead of 4
   if (DateFormat.indexOf('YYYY') == -1) this.yearPad = this.yearPad.substr(2);
   // Define the date-part delimiter
   if (DateFormat.indexOf('/') >= 0) var Delimiter = '/';
   else if (DateFormat.indexOf('-') >= 0) var Delimiter = '-';
   else var Delimiter = '';
   // Determine the order of the months and days
   if (/DD?.?((MON)|(MM?M?))/.test(DateFormat)) {
      this.formatted = this.dayPad + Delimiter;
      this.formatted += (RegExp.$1.length == 3) ? this.monthShort : this.monthPad;
   }
   else if (/((MON)|(MM?M?))?.?DD?/.test(DateFormat)) {
      this.formatted = (RegExp.$1.length == 3) ? this.monthShort : this.monthPad;
      this.formatted += Delimiter + this.dayPad;
   }
   // Either prepend or append the year to the formatted date
   this.formatted = (DateFormat.substr(0,2) == 'YY') ? this.yearPad + Delimiter + this.formatted : this.formatted + Delimiter + this.yearPad;
}

// Adds/removes days from the day list, depending on the month/year
function FixDayList(DayList, NewDays) {
   var DayPick = DayList.selectedIndex + 1;
   if (NewDays != DayList.length) {
      var OldSize = DayList.length;
      for (var k=Math.min(NewDays,OldSize);k<Math.max(NewDays,OldSize);k++) {
         (k >= NewDays) ? DayList.options[NewDays] = null : DayList.options[k] = new Option(k+1, k+1);
      }
      DayPick = Math.min(DayPick, NewDays);
      DayList.options[DayPick-1].selected = true;
   }
   return DayPick;
}


// Sets the date, based on the month selected
function CheckMonthChange(MonthList) {
   var DayList = this.getDayList();
   var DayPick = FixDayList(DayList, GetDayCount(this.picked.yearValue, MonthList.options[MonthList.selectedIndex].value));
   this.setPicked(this.picked.yearValue, MonthList.options[MonthList.selectedIndex].value, DayPick);


}

// Sets the date, based on the day selected
function CheckDayChange(DayList) {
   this.setPicked(this.picked.yearValue, this.picked.monthIndex, DayList.selectedIndex+1);
}

// Sets the current selected date
function SetPickedValues(PickedYear, PickedMonth, PickedDay, dontcallcb) {
	

    this.picked = new storedMonthObject(this.format, PickedYear, PickedMonth, PickedDay);
    this.setHidden(this.picked.formatted);
	var shouldcall = true;
    if(dontcallcb != null) {
   	 shouldcall = dontcallcb; 
    }
   
    if(this.inited && shouldcall) {
   	 if(this.callbackFnction != null)this.callbackFnction();   
    }
	this.inited = true;
}

// Changes the date when a valid year has been entered
function CheckYearInput(YearField) {
     
	 
      var NewYear = GetGoodYear(YearField.value);
	  
      var NewDay = FixDayList(this.getDayList(), GetDayCount(NewYear, this.picked.monthIndex));
	  
      this.setPicked(NewYear, this.picked.monthIndex , NewDay);
	  
      YearField.defaultValue = YearField.value;

}

// Sets the form elements after a day has been picked from the calendar
function PickDisplayDay(dontcallcb) {
 
   var MonthList = this.getMonthList();
   var DayList = this.getDayList();
   var YearList = this.getYearList();
   //FixDayList(DayList, GetDayCount(this.displayed.yearValue, this.displayed.monthIndex)); kishantha
   FixDayList(DayList, GetDayCount(this.picked.yearValue, this.picked.monthIndex));

// Select the month and day in the lists
   for (var i=0;i<MonthList.length;i++) {
      //if (MonthList.options[i].value == this.displayed.monthIndex) MonthList.options[i].selected = true; kishantha
	  if (MonthList.options[i].value == this.picked.monthIndex) MonthList.options[i].selected = true;
   }

   for (var j=1;j<=DayList.length;j++) {
      //if (j == ClickedDay) DayList.options[j-1].selected = true;
	  if (j == this.picked.day) DayList.options[j-1].selected = true;
   }
   
   for (var j=0;j<YearList.length;j++) {
      //if (j == ClickedDay) DayList.options[j-1].selected = true;
	  if (YearList.options[j].value == this.picked.yearValue) YearList.options[j].selected = true;
   }
   
   
   //this.setPicked(this.displayed.yearValue, this.displayed.monthIndex, ClickedDay, dontcallcb); kishantha
   this.setPicked(this.picked.yearValue, this.picked.monthIndex, this.picked.day, dontcallcb);
   // Change the year, if necessary
  // YearField.value = this.picked.yearPad;
  // YearField.defaultValue = YearField.value;
   
}

// The DateSelectObject object
function DateSelectObject(DateName, Required, DateFormat, DefaultDate, CallbackFnc) {



    /* Properties */
	this.hiddenFieldName = DateName;
    this.format = DateFormat;
	this.formNumber = -1;
	this.dayListID = DateName + '_Day_ID';
	this.monthListID = DateName + '_Month_ID';
	this.yearListID = DateName + '_Year_ID';
	this.callbackFnction = CallbackFnc;
	//this.required = (Required == true);
	

    /* Methods */
	this.checkYear = CheckYearInput;
	this.setPicked = SetPickedValues;
	this.pickDay = PickDisplayDay;
	this.changeMonth = CheckMonthChange;
    this.changeDay = CheckDayChange;
	this.getDayList = new Function('return document.getElementById(this.dayListID)');
	this.getMonthList = new Function('return document.getElementById(this.monthListID)');
    this.getYearList = new Function('return document.getElementById(this.yearListID)');
	this.setHidden = new Function('D','if (this.formNumber >= 0) this.getHiddenField().value=D');
	this.getHiddenField = new Function('return document.forms[this.formNumber].elements[this.hiddenFieldName]');
	
	/*Constructor*/
	if (this.format.substr(0,2) != 'YY' && /(-|\/)(\d{2,4})$/.test(DefaultDate)) { // Year is at the end
		var YearPart = GetGoodYear(RegExp.$2);
		// Determine the order of the months and days
		if (/^(\w{1,3})(-|\/)(\w{1,3})(-|\/)/.test(DefaultDate)) {
		   if (this.format.substr(0,1) == 'D') { // Starts with days
			  var DayPart = RegExp.$1;
			  var MonthPart = RegExp.$3;
		   }
		   else { // Starts with months
			  var MonthPart = RegExp.$1;
			  var DayPart = RegExp.$3;
		   }
		   MonthPart = (/\d{1,2}/i.test(MonthPart)) ? parseInt(MonthPart,10)-1 : getMonthIndex(MonthPart);
		   
		   
		   //this.date = new Date(YearPart,MonthPart,DayPart);
		   this.setPicked(YearPart, MonthPart, DayPart);
		   
		}else{
		  alert("Invalid date format");
		}
	}else{
		alert("Invalid date format");
	}
			

   
}


function DateSelect(DateName, Required, DateFormat, DefaultDate, CallbackFnc){


    // Creates the calendar object!
      eval(DateName + '_Object=new DateSelectObject(\'' + DateName + '\',\'' + Required + '\',\'' + DateFormat + '\',\'' + DefaultDate + '\',' + CallbackFnc + ')');
      var InitialDate = eval(DateName + '_Object.picked.formatted');
	  
	  var InitialStatus = '';
      // Create the form elements
      with (document) {
         writeln('<input type="hidden" name="' + DateName + '" value="' + InitialDate + '">');
         // Find this form number
         for (var f=0;f<forms.length;f++) {
            for (var e=0;e<forms[f].elements.length;e++) {
               if (typeof forms[f].elements[e].type == 'string') {
                  //if ((forms[f].elements[e].type == 'hidden') && (forms[f].elements[e].name == DateName)) {
				  if ((forms[f].elements[e].name == DateName)) {
					 eval(DateName + '_Object.formNumber='+f);
                     break;
                  }
               }
            }
         }
		 
		 
		 writeln('<table cellpadding="0" cellspacing="2"><tr>' + String.fromCharCode(13) + '<td valign="middle">');
         
         writeln('<select' + InitialStatus + ' class="calendarDateInput" id="' + DateName + '_Day_ID" onChange="' + DateName + '_Object.changeDay(this)">');

		 for (var j=1;j<=eval(DateName + '_Object.picked.dayCount');j++) {
            DaySelected = ((DefaultDate != '') && (eval(DateName + '_Object.picked.day') == j)) ? ' selected' : '';
            writeln('<option' + DaySelected + '>' + j + '</option>');
         }
 
         writeln('</select>' + String.fromCharCode(13) + '</td>' + String.fromCharCode(13) + '<td valign="middle">')
		 
		 writeln('<select class="calendarDateInput" id="' + DateName + '_Month_ID" onChange="' + DateName + '_Object.changeMonth(this)">');

         for (var i=0;i<12;i++) {
            MonthSelected = ((DefaultDate != '') && (eval(DateName + '_Object.picked.monthIndex') == i)) ? ' selected' : '';
            writeln('<option value="' + i + '"' + MonthSelected + '>' + MonthNames[i].substr(0,3) + '</option>');
         }
         writeln('</select>' + String.fromCharCode(13) + '</td>' + String.fromCharCode(13) + '<td valign="middle">');

		 writeln('<select class="calendarDateInput" id="' + DateName + '_Year_ID" onChange="' + DateName + '_Object.checkYear(this)">');
         for (var j=eval(DateName + '_Object.picked.yearValue')  ;j<=eval(DateName + '_Object.picked.yearValue')+1;j++) {
			 
            YearSelected = ((DefaultDate != '') && (eval(DateName + '_Object.picked.yearValue') == j)) ? ' selected' : '';
            writeln('<option' + YearSelected + ' value="'+j +'" >' + j + '</option>');
         }

         writeln('</select>' + String.fromCharCode(13) + '</td>' + String.fromCharCode(13) );
		 

		 writeln('</tr></table>' + String.fromCharCode(13));
		 
		 eval(DateName + '_Object.pickDay(false)')
	 }
		 

}

