/**
CLASS DATEPICKER
incrementado do original: http://www.nsftools.com/tips/NotesTips.htm#datepicker
*/
var datePicker = function (_target) {
	this.textTarget = (typeof _target == 'string') ? $(_target) : _target ;
	this.targetID = this.textTarget.getAttribute("id");
	this.datePickerDivID = "datepicker" + this.targetID;
	this.iFrameDivID = "datepickeriframe" + this.targetID;

	this.dateSeparator = "/";
	this.dateFormat = "dmy";



	this.dayArrayShort = new Array('D', 'S', 'T', 'Q', 'Q', 'S', 'S');
	this.dayArrayMed = new Array('Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab');
	this.dayArrayLong = new Array('Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado');
	this.monthArrayShort = this.monthArrayMed = new Array('Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez');
	this.monthArrayLong = new Array('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro');

	this.actualDate = '';
}

datePicker.prototype.setDateSeparator = function(strSeparator) { this.dateSeparator = strSeparator; }
datePicker.prototype.setDateFormat = function(strFormat) { this.dateFormat = strFormat; }

datePicker.prototype.displayDatePicker = function()
{
	var x = this.textTarget.offsetLeft;
	var y = this.textTarget.offsetTop + this.textTarget.offsetHeight ;

	// deal with elements inside tables and such
	var parent = this.textTarget;
	while (parent.offsetParent) {
	parent = parent.offsetParent;
	x += parent.offsetLeft;
	y += parent.offsetTop ;
	}

	this.drawDatePicker(x, y);
}

datePicker.prototype.drawDatePicker = function (x, y)
{
	this.actualDate = this.setDateByField();

	if (!$(this.datePickerDivID)) {
		var newNode = cE("div", this.textTarget.parentNode, this.datePickerDivID);
		newNode.className = 'dpDiv';
		newNode.style.visibility = 'hidden';
		var o = this;
	}

	// move the datepicker div to the proper x,y coordinate and toggle the visiblity
	var pickerDiv = $(this.datePickerDivID);
	pickerDiv.style.position = "absolute";
	pickerDiv.style.left = x + "px";
	pickerDiv.style.top = y + "px";
	pickerDiv.style.visibility = (pickerDiv.style.visibility == "visible" ? "hidden" : "visible");
	pickerDiv.style.display = (pickerDiv.style.display == "block" ? "none" : "block");
	pickerDiv.style.zIndex = 10000;

	// draw the datepicker table
	this.refreshDatePicker(this.actualDate.getFullYear(), this.actualDate.getMonth(), this.actualDate.getDate());
}

/**
This is the function that actually draws the datepicker calendar.
*/
datePicker.prototype.refreshDatePicker = function()
{
	var year = this.actualDate.getFullYear();
	var month = this.actualDate.getMonth();
	var day = this.actualDate.getDate();

	var thisDay = new Date();

	if ((month >= 0) && (year > 0)) {
		thisDay = new Date(year, month, 1);
	} else {
		day = thisDay.getDate();
		thisDay.setDate(1);
	}

	var crlf = "\r\n";
	var on, aClass;
	var i, y;


	var tableID = "table" + this.targetID;
	if($(tableID))
		 $(tableID).parentNode.removeChild( $(tableID).parentNode.getElementsByTagName("table")[0] );

	var rTable = cE("table", this.datePickerDivID, tableID);
	rTable.setAttribute("summary", "Calendar");
	rTable.className = "dpTable";

	//caption
	var rCaption = cE("caption", rTable, null);
	this.addButton(rCaption, thisDay, -1, "<");
	var captionText = this.monthArrayLong[month] + ' (' + thisDay.getFullYear() + ')';
	rCaption.appendChild(document.createTextNode(captionText));
	this.addButton(rCaption, thisDay, 1, ">");

	//thead
	var rThead = cE("thead", rTable, null);
	var rRowThead = cE("tr", rThead, null);
	for( i = 0; i < this.dayArrayShort.length; i++ ) {
		y = cE('th', rRowThead, null);
		y.appendChild(document.createTextNode(this.dayArrayShort[i]));
	}

	//tbody
	var rTbody = cE("tbody", rTable, null);
	var actualRow = cE("tr", rTbody, null);
	for (i = 0; i < thisDay.getDay(); i++) // empty days
		cE('td', actualRow, null);

	// now, the days of the month
	var o = this;
	do {
		dayNum = thisDay.getDate();

		//on = " onclick=\"updateDateField('" + this.targetID + "', '" + this.getDateString(thisDay) + "');\"";
		y = cE('td', actualRow, null);
		var aAction = cE("a", y, null);
		aAction.setAttribute('href', 'javascript:;');
		aAction.d = (dayNum<10) ? '0' + dayNum : dayNum;
		aAction.onclick = function() {
			o.updateField(this.d);
		}
		if(dayNum == day) aAction.className = "selected";

		aAction.appendChild(document.createTextNode(dayNum));

		// if this is a Saturday, start a new row
		if (thisDay.getDay() == 6)
		  actualRow = cE("tr", rTbody, null);

		// increment the day
		thisDay.setDate(thisDay.getDate() + 1);
	} while (thisDay.getDate() > 1)

	// fill in any trailing blanks
	if (thisDay.getDay() > 0) {
		for (i = 6; i >= thisDay.getDay(); i--)
		  cE('td', actualRow, null);
	}

	//tfoot
	var rTfoot = cE("tfoot", rTable, null);
	var rTfootRow = cE("tr", rTfoot, null);

	var rTfootRowTd = cE("td", rTfootRow, null);
	rTfootRowTd.colSpan = 7;


	var today = new Date();// add a button to allow the user to easily return to today, or close the calendar
	var todayButton = cE("button", rTfootRowTd, null);
	todayButton.className = "dpTodayButton";
	todayButton.appendChild(document.createTextNode("hoje"));
	todayButton.onclick = function() {
		o.actualDate = today;
		o.refreshDatePicker();
	}

	var closeButton = cE("button", rTfootRowTd, null);
	closeButton.className = "dpCloseButton";
	closeButton.appendChild(document.createTextNode("cancelar"));
	closeButton.onclick = function() {
		o.close();
	}

	this.adjustiFrame();

}


/**
Convenience function for writing the code for the buttons that bring us back or forward
a month.
*/
datePicker.prototype.addButton = function (_target, dateVal, adjust, label)
{
	var newMonth = (dateVal.getMonth () + adjust) % 12;
	var newYear = dateVal.getFullYear() + parseInt((dateVal.getMonth() + adjust) / 12);
	if (newMonth < 0) {
		newMonth += 12;
		newYear += -1;
	}

	var c = (adjust>0) ? 'plus' : 'minus';
	var b = cE('button', _target, null);
	b.className = c;
	b.appendChild(document.createTextNode(label));
	b._year = newYear;
	b._month = newMonth;
	b._day = dateVal.getDate();
	var o = this;
	b.onclick = function() {
		o.actualDate = new Date(this._year, this._month, this._day);
		o.refreshDatePicker();
	}
	return b;
}

datePicker.prototype.setDateByField = function() {
	var d = new Date();
	if(this.textTarget.value.toString() != '') {
		d = this.getFieldDate();
		if(!d) return false;
		d = new Date(d.getFullYear(), d.getMonth(), d.getDate());
	}

	return d;
}

/**
Convert a JavaScript Date object to a string, based on the dateFormat and dateSeparator
variables at the beginning of this script library.
*/
datePicker.prototype.getDateString = function(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 (this.dateFormat) {
    case "dmy" :
      return dayString + this.dateSeparator + monthString + this.dateSeparator + dateVal.getFullYear();
    case "ymd" :
      return dateVal.getFullYear() + this.dateSeparator + monthString + this.dateSeparator + dayString;
    case "mdy" :
    default :
      return monthString + this.dateSeparator + dayString + this.dateSeparator + dateVal.getFullYear();
  }
}


/**
Convert a string to a JavaScript Date object.
*/
datePicker.prototype.getFieldDate = function()
{
	var dateString = this.textTarget.value.toString();
	var dateVal;
	var dArray;
	var d, m, y;

	try {
		if(dateString.indexOf(this.dateSeparator) == -1 && dateString.length != 0) {
			alert('A data no campo deve ser separada por "' + this.dateSeparator + '".');
			this.textTarget.value = '';
			return new Date;
		}
		dArray = dateString.split(this.dateSeparator);
		if (dArray) {
			switch (this.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;
}

datePicker.prototype.updateField = function(dayNumber) {
	var formated = '';
	var l = this.dateFormat.length;
	for(var i = 0; i<l; i++ ) {
		formated += '{{' + this.dateFormat.substring(i,i+1) + '}}';
		if(i!=l-1) formated += this.dateSeparator;
	}

	var m = this.actualDate.getMonth()+1;
	m = (m<10) ? '0' + m : m;

	var s = new Array('d', 'm', 'y');
	var r = new Array(dayNumber, m, this.actualDate.getFullYear());
	var sr;
	for( i=0 ; i<s.length ; i++ ) {
		sr = new RegExp("{{" + s[i] + '}}');
		formated = formated.replace(sr, r[i]);
	}
	this.textTarget.value = formated;
	this.close();
}

datePicker.prototype.close = function() {
	$(this.datePickerDivID).parentNode.removeChild($(this.datePickerDivID));
}

datePicker.prototype.adjustiFrame = function()
{
	var tt_n = navigator.userAgent.toLowerCase();
	var tt_nv = navigator.appVersion;
	var tt_ie = (tt_n.indexOf("msie") != -1 && document.all)?true:false;
	var tt_ie6 = tt_ie && parseFloat(tt_nv.substring(tt_nv.indexOf("MSIE")+5)) >= 5.5 ? true : false;
	if(tt_ie || tt_ie6){
		var pickerDiv = $(this.datePickerDivID);
		if(!$(this.iframeDivID)) {
			var newNode = cE("iframe", $(this.datePickerDivID), this.iframeDivID);
			newNode.setAttribute("src", "javascript:false;");
			newNode.setAttribute("scrolling", "no");
			newNode.setAttribute ("frameborder", "0");
		}
		var tIframe = $(this.iframeDivID);
		tIframe.style.filter = "Alpha(opacity=0)";
		tIframe.style.position = "absolute";
		tIframe.style.width = pickerDiv.offsetWidth;
		tIframe.style.height = pickerDiv.offsetHeight ;
		tIframe.style.top = 0;
		tIframe.style.left = 0;
		tIframe.style.zIndex = - 100;
	}
}
