//calendar generator
  var daysPerMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  var isLeap = false;

  function isLeapYear(year) {
    return new Date('Feb 29, ' + year).getMonth() === 1;
  }

var dayArrayShort = null;
var dayArrayMed = null;
var dayArrayLong = null;
var monthArrayShort = null;
var monthArrayMed = null;
var monthArrayLong = null;
var datePickerID = 'calendar1';
var selected = null;
var availableDates = null;




function displayDatePicker(dateFieldName, displayBelowThisObject, dtFormat, dtSep, displayPos){
  var targetDateField = document.getElementsByName (dateFieldName).item(0);
 
  if (!displayBelowThisObject)
    displayBelowThisObject = targetDateField;
 
  if (dtSep)
    dateSeparator = dtSep;
  else
    dateSeparator = defaultDateSeparator;
 
  if (dtFormat)
    dateFormat = dtFormat;
  else
    dateFormat = defaultDateFormat;

	var x = y = 0;
	if(displayPos == 'right'){
		x = displayBelowThisObject.offsetLeft + displayBelowThisObject.offsetWidth;
		y = 0;
	}else if(displayPos == 'bottomright'){
		x = displayBelowThisObject.offsetLeft + displayBelowThisObject.offsetWidth;
		y = displayBelowThisObject.offsetTop + displayBelowThisObject.offsetHeight;
	}else { // position bottom;
		x = displayBelowThisObject.offsetLeft;
		y = displayBelowThisObject.offsetTop + displayBelowThisObject.offsetHeight;
	}
	
 
  drawDatePicker(targetDateField, x, y);
}

function drawDatePicker(targetDateField, x, y){
  var dt = getFieldDate(targetDateField.value );
 
  if (!document.getElementById(datePickerID)) {
    var newNode = document.createElement("div");
    newNode.setAttribute("id", datePickerID);
    newNode.setAttribute("class", "calPopup");
    newNode.setAttribute("style", "display:none;");
    document.body.appendChild(newNode);
  }
 
  var pickerDiv = document.getElementById(datePickerID);
  pickerDiv.style.left = x + "px";
	pickerDiv.style.top = y + "px";
  pickerDiv.style.display = (pickerDiv.style.display == "block" ? "none" : "block");
  pickerDiv.style.zIndex = 10000;
 
  if(availableDates == null){
		refreshDatePicker(targetDateField.name, dt.getMonth() + '-' + dt.getFullYear(), dt.getDate());
	}else{
		refreshDatePickerSelective(targetDateField.name, dt.getMonth() + '-' + dt.getFullYear(), dt.getDate());
	}
}

function getButtonCode(dateFieldName, dateVal, adjust, img, alt){
  var newMonth = (dateVal.getMonth () + adjust) % 12;
  var newYear = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);
  if (newMonth < 0) {
    newMonth += 12;
    newYear += -1;
  }
  if(typeof(alt) == 'undefined'){
    alt = '';
  }
  return '<a href="#" onclick="refreshDatePicker(\'' + dateFieldName + '\', ' + newYear + ', ' + newMonth + ');"><img alt="' + alt + '" src="images/' + img + '" /></a>';
}

function getDateString(dateVal){
  var dayString = "00" + dateVal.getDate();
  var monthString = "00" + (dateVal.getMonth()+1);
  dayString = dayString.substring(dayString.length - 2);
  monthString = monthString.substring(monthString.length - 2);
 
  switch (dateFormat) {
    case "dmy" :
      return dayString + dateSeparator + monthString + dateSeparator + dateVal.getFullYear();
    case "ymd" :
      return dateVal.getFullYear() + dateSeparator + monthString + dateSeparator + dayString;
    case "mdy" :
    default :
      return monthString + dateSeparator + dayString + dateSeparator + dateVal.getFullYear();
  }
}

function getFieldDate(dateString){
  var dateVal;
  var dArray;
  var d, m, y;
 
  try {
    dArray = splitDateString(dateString);
    if (dArray) {
      switch (dateFormat) {
        case "dmy" :
          d = parseInt(dArray[0], 10);
          m = parseInt(dArray[1], 10) - 1;
          y = parseInt(dArray[2], 10);
          break;
        case "ymd" :
          d = parseInt(dArray[2], 10);
          m = parseInt(dArray[1], 10) - 1;
          y = parseInt(dArray[0], 10);
          break;
        case "mdy" :
        default :
          d = parseInt(dArray[1], 10);
          m = parseInt(dArray[0], 10) - 1;
          y = parseInt(dArray[2], 10);
          break;
      }
      dateVal = new Date(y, m, d);
    } else if (dateString) {
      dateVal = new Date(dateString);
    } else {
      dateVal = new Date();
    }
  } catch(e) {
    dateVal = new Date();
  }
 
  return dateVal;
}

function splitDateString(dateString){
  var dArray;
  if (dateString.indexOf("/") >= 0)
    dArray = dateString.split("/");
  else if (dateString.indexOf(".") >= 0)
    dArray = dateString.split(".");
  else if (dateString.indexOf("-") >= 0)
    dArray = dateString.split("-");
  else if (dateString.indexOf("\\") >= 0)
    dArray = dateString.split("\\");
  else
    dArray = false;
 
  return dArray;
}

function updateDateField(dateFieldName, dateString){
  var targetDateField = document.getElementsByName (dateFieldName).item(0);
  if (dateString)
    targetDateField.value = dateString;
 
  var pickerDiv = document.getElementById(datePickerID);
  pickerDiv.style.display = "none";
 
  targetDateField.focus();
	if (targetDateField.onchange){
		targetDateField.onchange(); 
	}
}

function getMonths(){
	var thisDay = new Date();
	var thisMonth = thisDay.getMonth();
	var thisYear = thisDay.getFullYear();
	var out = '';
	for(var i=0; i<12; i++){
		var index = -1;
		var year = -1;
		if(thisMonth + i > 11){
			index = thisMonth - 12 + i;
			year = thisYear + 1;
		}else{
			index = thisMonth + i;
			year = thisYear;
		}
		var select = '';
		if(selected != null && index == selected[0] && year == selected[1]){
			select = ' selected="selected"';
		}
		out += '<option value="' + index + '-' + year + '"' + select + '>' + monthArrayLong[index] + '</option>';
	}
	return out;
}

function refreshDatePicker(dateFieldName, yearMonth, day){
	selected = yearMonth.split('-', 2);
	var month = selected[0];
	var year = selected[1];

  var prevMonth = ((month == 0)? 11 : (month - 1));
  var daysInPrev = ((prevMonth == 1 && isLeapYear(year))? 29 : daysPerMonth[prevMonth]);
  var firstDay = 0;
	
  
  var thisDay = new Date();
  if((month >= 0) && year > 0){
    thisDay = new Date(year, month, 1); // first day of selected month
  }else{
    day = thisDay.getDate();
    thisDay.setDate(1);
  }
  
  
  var crlf = "\r\n";
  /*var LI = '<li>';
	var LI_title = '<li class="month">';
	var LI_weekdays = '<li class="dayType">';
	var A_active = '<a href="#" class="active"';
	var LI_otherMonth = '<li class="passive">';
	var xLI = '</li>' + crlf;
	var A_thisMonth = '<a href="#" ';
	var xA = '</a>';*/
	var TR = '<tr>';
	var xTR = '</tr>' + crlf;
	var TH = '<th colspan="7"><div><select class="month" onchange="refreshDatePicker(\'' + dateFieldName + '\', this.value); return false;">' + getMonths() + '</select></div></th>' + crlf;
	var TD = '<td>';
	var xTD = '</td>' + crlf;
	var TD_today = '<td class="today">';
	var TD_sunday = '<td class="sunday">';
	var A = '<a href="#" ';
	var xA = '</a>';

  var html = crlf + '<div class="top"></div><div class="middle"><div class="calendar"><table cellspacing="0" cellpadding="0">';
  
	html += TR + TH + xTR + crlf;
  firstDay = thisDay.getDay();
	html += TR;
	
	var amount = -1
	if(firstDay == 0){
		amount = 5;
	}else{
		amount = firstDay - 2;
	}
	for(i=daysInPrev-amount; i<=daysInPrev; i++){
    html += TD + i + xTD;
  }

  do{
    dayNum = thisDay.getDate();
		A_onclick = ' onclick="updateDateField(\'' + dateFieldName + '\', \'' + getDateString(thisDay) + '\'); return false;">';
		if(dayNum == day){
			html += TD_today + A + A_onclick + dayNum + xA + xTD;
			if(thisDay.getDay() == 0){
				html += xTR + crlf + TR;
			}
		}else if(thisDay.getDay() == 0){
			html += TD_sunday + A + A_onclick + dayNum + xA + xTD;
			html += xTR + crlf + TR;
		}else{
		  html += TD + A + A_onclick + dayNum + xA + xTD;
		}
		thisDay.setDate(thisDay.getDate()+1);
  }while(thisDay.getDate() > 1);
  
	if(thisDay.getDay() == 0){
		amount = 1;
	}else if(thisDay.getDay() == 1){
		amount = 0;
	}else{
		amount = 8 - thisDay.getDay();
	}
  for(i = 1; i<=(amount); i++){
    html += TD + i + xTD;
  }
	html += xTR + crlf;
	html += '</table></div><div class="cleaner"></div></div><div class="bottom"></div>';
  document.getElementById(datePickerID).innerHTML = html;
	
}

function refreshDatePickerSelective(dateFieldName, yearMonth, day){
	selected = yearMonth.split('-', 2);
	var month = Number(selected[0]);
	var phpMonth = (month+1);
	var year = Number(selected[1]);

  var prevMonth = ((month == 0)? 11 : (month - 1));
  var daysInPrev = ((prevMonth == 1 && isLeapYear(year))? 29 : daysPerMonth[prevMonth]);
  var firstDay = 0;
	
  
  var thisDay = new Date();
  if((month >= 0) && year > 0){
    thisDay = new Date(year, month, 1); // first day of selected month
  }else{
    day = thisDay.getDate();
    thisDay.setDate(1);
  }
  
  // define HTML to use;
  var crlf = "\r\n";
	var TR = '<tr>';
	var xTR = '</tr>' + crlf;
	var TH = '';
	if(availableDates == null){
		TH = '<th colspan="7"><div><select class="month" onchange="refreshDatePicker(\'' + dateFieldName + '\', this.value); return false;">' + getMonths() + '</select></div></th>' + crlf;
	}else{
		TH = '<th colspan="7"><div><select class="month" onchange="refreshDatePickerSelective(\'' + dateFieldName + '\', this.value); return false;">' + getMonths() + '</select></div></th>' + crlf;
	}
	var TD = '<td>';
	var xTD = '</td>' + crlf;
	var TD_today = '<td class="today">';
	var TD_sunday = '<td class="sunday">';
	var A = '<a href="#" ';
	var Agt = '>';
	var xA = '</a>';

  var html = crlf + '<div class="top"></div><div class="middle"><div class="calendar"><table cellspacing="0" cellpadding="0">';
  
	html += TR + TH + xTR + crlf;
  firstDay = thisDay.getDay();
	html += TR;
	
	var amount = -1
	if(firstDay == 0){
		amount = 5;
	}else{
		amount = firstDay - 2;
	}
	for(i=daysInPrev-amount; i<=daysInPrev; i++){
    html += TD + i + xTD;
  }
	var c = 0;
	
	if(typeof(availableDates[phpMonth]) == 'undefined'){
		var curAvailable = 0;
	}else{
		var curAvailable = availableDates[phpMonth][c++];
	}
	

  // Draw calendar table;
	do{
    dayNum = thisDay.getDate();
		A_onclick = ' onclick="updateDateField(\'' + dateFieldName + '\', \'' + getDateString(thisDay) + '\'); return false;"';
		if(dayNum == day){ // today;
			if(curAvailable == dayNum){ // if available;
				html += TD_today + A + A_onclick + Agt + dayNum + xA + xTD;
				if(c <= availableDates[phpMonth].length){
					curAvailable = availableDates[phpMonth][c++];
				}
			}else{
				html += TD_today + dayNum + xTD;
			}
			if(thisDay.getDay() == 0){
				html += xTR + crlf + TR;
			}
		}else if(thisDay.getDay() == 0){
			if(curAvailable == dayNum){
				html += TD_sunday + A + A_onclick + Agt + dayNum + xA + xTD;
				html += xTR + crlf + TR;
				if(c < availableDates[phpMonth].length){
					curAvailable = availableDates[phpMonth][c++];
				}
			}else{
				html += TD_sunday + dayNum + xTD;
				html += xTR + crlf + TR;
			}
		}else{
			if(curAvailable == dayNum){
				html += TD + A + A_onclick + Agt + dayNum + xA + xTD;
				if(c < availableDates[phpMonth].length){
					curAvailable = availableDates[phpMonth][c++];
				}
			}else{
				html += TD + dayNum + xTD;
			}
		}
		thisDay.setDate(thisDay.getDate()+1);
  }while(thisDay.getDate() > 1);

	if(thisDay.getDay() == 0){
		amount = 1;
	}else if(thisDay.getDay() == 1){
		amount = 0;
	}else{
		amount = 8 - thisDay.getDay();
	}
  for(i = 1; i<=(amount); i++){
    html += TD + i + xTD;
  }
	html += xTR + crlf;
	html += '</table></div><div class="cleaner"></div></div><div class="bottom"></div>';
  document.getElementById(datePickerID).innerHTML = html;
	
}
