« IllegalStateException in MyFaces Extension Filter | Main | Akin==Bush »

Fix for incorrect jsf inputCalendar position in tomahawk

When using JSF myfaces 1.1.3 tomahawk's inputCalendar, I have some absolute div's on my jsp and my calendar was being positioned incorrectly via it's java script.

After checking Jira log on it [#TOMAHAWK-128] Incorrect inputCalendar position when placed in DIV tag with position: absolute; - ASF JIRA

, I was able to override the included javascript in a parallel package structure at:

org.apache.myfaces.custom.calendar.resource

(see the extended entry for the javascript submitted

 

// based on code written by Tan Ling Wee on 2 Dec 2001

// last updated 20 June 2003

// email : fuushikaden@yahoo.com

//

// Modified to be completely object-oriented, CSS based and using proper DOM-access functions

// @author Martin Marinschek

// @author Sylvain Vieujot

 

org_apache_myfaces_CalendarInitData = function()

{

this.fixedX = -1;

// x position (-1 if to appear below control)

this.fixedY = -1;

// y position (-1 if to appear below control)

this.startAt = 1;

// 0 - sunday ; 1 - monday

this.showWeekNumber = 1;

// 0 - don't show; 1 - show

this.showToday = 1;

// 0 - don't show; 1 - show

this.imgDir = "images/";

// directory for images ... e.g. this.imgDir="/img/"

this.themePrefix = "jscalendar-DB";

 

this.gotoString = "Go To Current Month";

this.todayString = "Today is";

this.todayDateFormat = null;

this.weekString = "Wk";

this.scrollLeftMessage = "Click to scroll to previous month. Hold mouse button to scroll automatically.";

this.scrollRightMessage = "Click to scroll to next month. Hold mouse button to scroll automatically."

this.selectMonthMessage = "Click to select a month."

this.selectYearMessage = "Click to select a year."

this.selectDateMessage = "Select [date] as date." // do not replace [date], it will be replaced by date.

 

this.popupLeft=false;

 

this.monthName = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); this.dayName = this.startAt == 0 ? new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") : new Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");

 

}

 

org_apache_myfaces_DateParts = function(sec, min, hour, date, month, year)

{

this.sec = sec;

this.min = min;

this.hour = hour;

this.date = date;

this.month = month;

this.year = year;

}

 

org_apache_myfaces_HolidayRec = function(d, m, y, desc)

{

this.d = d;

this.m = m;

this.y = y;

this.desc = desc;

}

 

org_apache_myfaces_PopupCalendar = function()

{

this.idPrefix = "org_apache_myfaces_PopupCalendar";

 

this.selectedDate = new org_apache_myfaces_DateParts(0, 0, 0, 0, 0, 0);this.saveSelectedDate = new org_apache_myfaces_DateParts(0, 0, 0, 0, 0, 0);

 

this.monthConstructed = false;

this.yearConstructed = false;

this.intervalID1;

this.intervalID2;

this.timeoutID1;

this.timeoutID2;

this.ctlToPlaceValue;

this.ctlNow;

this.containerCtl;

this.dateFormat="MM/dd/yyyy";

this.nStartingYear;

this.bPageLoaded = false;

this.ie = document.all;

this.dom = document.getElementById;

this.ns4 = document.layers;

this.dateFormatSymbols = new org_apache_myfaces_DateFormatSymbols();

this.initData = new org_apache_myfaces_CalendarInitData();

this.today = new Date();

this.dateNow = this.today.getDate();

this.monthNow = this.today.getMonth();

this.yearNow = this.today.getYear();

this.imgSrc = new Array("drop1.gif", "drop2.gif", "left1.gif", "left2.gif", "right1.gif", "right2.gif");this.img = new Array();

 

//elements which need to change their dynamical

//representation over time

this.calendarDiv;

this.selectMonthDiv;

this.selectYearDiv;

this.todaySpan = null;

this.captionSpan = null;

this.contentSpan = null;

this.closeCalendarSpan = null;

this.monthSpan = null;

this.yearSpan = nullthis

.changeMonthImg = null;this.changeYearImg = null;

 

this.holidaysCounter = 0;

this.holidays = new Array();

 

this.bClickOnCalendar = false;this.bCalendarHidden = true;

 

this.myFacesCtlType = "x:inputCalendar";

this.inputDateClientId;

}

 

org_apache_myfaces_PopupCalendar.prototype._hideElement = function(overDiv)

{

 

if (document.all)

{var

iframe = document.getElementById(overDiv.id + "_IFRAME");

 

if (iframe == null)

{

iframe = document.createElement("<iframe id='" + overDiv.id + "_IFRAME' style='visibility:hidden; position: absolute; top:0px;left:0px;'/>"); this.containerCtl.appendChild(iframe);

}

 

this._recalculateElement(overDiv); }

}

 

org_apache_myfaces_PopupCalendar.prototype._recalculateElement = function(overDiv)

{

 

if (document.all)

{var

iframe = document.getElementById(overDiv.id + "_IFRAME");

 

if (iframe)

{var

popup = overDiv;

 

popup.style.zIndex = 98;

 

iframe.style.zIndex = popup.style.zIndex - 1;

iframe.style.width = popup.offsetWidth;

iframe.style.height = popup.offsetHeight;

iframe.style.top = popup.style.top;

iframe.style.left = popup.style.left;

iframe.style.display = "block";

iframe.style.visibility = "visible";

/*we have to set an explicit visible otherwise it wont work*/}

}

}

 

org_apache_myfaces_PopupCalendar.prototype._showElement = function(overDiv)

{

 

var iframe = document.getElementById(overDiv.id + "_IFRAME");

 

if (document.all && iframe)

{

iframe.style.display = "none"; }

}

 

org_apache_myfaces_PopupCalendar.prototype.addHoliday = function(d, m, y, desc)

{

this.holidays[this.holidaysCounter++] = new org_apache_myfaces_HolidayRec (d, m, y, desc);

}

 

org_apache_myfaces_PopupCalendar.prototype._swapImage = function(srcImg, destImg)

{

 

if (srcImg)

srcImg.setAttribute("src", this.initData.imgDir + destImg);

}

 

org_apache_myfaces_PopupCalendar.prototype._keypresshandler = function()

{

try

{

if (event && event.keyCode == 27)

this._hideCalendar();

}

catch(ex)

{

}

}

 

org_apache_myfaces_PopupCalendar.prototype._clickhandler = function()

{

if (!this.bClickOnCalendar)

{this

._hideCalendar();

}

 

this.bClickOnCalendar = false;

}

 

org_apache_myfaces_PopupCalendar.prototype.init = function(containerCtl)

{

if (this.dom)

{

 

if (!this.calendarDiv)

{for

(i = 0; i < this.imgSrc.length; i++)this.img[i] = new Image;

 

this.containerCtl = containerCtl;

 

this.calendarDiv = document.createElement("div");

this.calendarDiv.id = containerCtl.id + "_calendarDiv";this.calendarDiv.className = this.initData.themePrefix + "-div-style";

 

Event.observe(this.calendarDiv, "click", function()

{

this.bClickOnCalendar = true;

}.bind(this), false);

 

this.containerCtl.appendChild(this.calendarDiv);

 

var mainTable = document.createElement("table");

mainTable.setAttribute("style", "width:" + ((this.initData.showWeekNumber == 1)?250:220) + "px;");mainTable.className =

this.initData.themePrefix + "-table-style";

 

this.calendarDiv.appendChild(mainTable);

 

//This is necessary for IE. If you don't create a tbody element, the table will never show up!var mainBody = document.createElement("tbody");

mainTable.appendChild(mainBody);

 

var mainRow = document.createElement("tr");mainRow.className = this.initData.themePrefix + "-title-background-style";

 

mainBody.appendChild(mainRow);

 

var mainCell = document.createElement("td");

 

mainRow.appendChild(mainCell);

 

var contentTable = document.createElement("table");contentTable.setAttribute("style", "width:" + ((this.initData.showWeekNumber == 1)?248:218) + "px;");

 

var contentBody = document.createElement("tbody");

contentTable.appendChild(contentBody);

 

mainCell.appendChild(contentTable);

 

var headerRow = document.createElement("tr");

contentBody.appendChild(headerRow);

 

var captionCell = document.createElement("td");captionCell.className = this.initData.themePrefix + "-title-style";

headerRow.appendChild(captionCell);

 

this.captionSpan = document.createElement("span");captionCell.appendChild(this.captionSpan);

 

var closeButtonCell = document.createElement("td");closeButtonCell.setAttribute(

"style", "text-align:right;");

headerRow.appendChild(closeButtonCell);

 

var closeCalendarLink = document.createElement("a");

closeCalendarLink.setAttribute("href", "#");Event.observe(closeCalendarLink,

"click", function(event)

{this

._hideCalendar();

Event.stop(event);

}.bindAsEventListener(this), false);

 

closeButtonCell.appendChild(closeCalendarLink);

 

this.closeCalendarSpan = document.createElement("span");

 

closeCalendarLink.appendChild(this.closeCalendarSpan);

 

var contentRow = document.createElement("tr");

mainBody.appendChild(contentRow);

 

var contentCell = document.createElement("td");contentCell.className = this.initData.themePrefix + "-body-style";

contentRow.appendChild(contentCell);

 

this.contentSpan = document.createElement("span");contentCell.appendChild(this.contentSpan);

 

if (this.initData.showToday == 1)

{

var todayRow = document.createElement("tr");todayRow.className =

this.initData.themePrefix + "-today-style";

mainBody.appendChild(todayRow);

 

var todayCell = document.createElement("td");todayCell.className = this.initData.themePrefix + "-today-lbl-style";

todayRow.appendChild(todayCell);

 

this.todaySpan = document.createElement("span"); todayCell.appendChild(this.todaySpan);

}

 

this.selectMonthDiv = document.createElement("div");

this.selectMonthDiv.id = this.containerCtl.id + "_selectMonthDiv";

this.selectMonthDiv.className = this.initData.themePrefix + "-div-style";

 

this.containerCtl.appendChild(this.selectMonthDiv);

 

this.selectYearDiv = document.createElement("div");

this.selectYearDiv.id = this.containerCtl.id + "_selectYearDiv";

this.selectYearDiv.className = this.initData.themePrefix + "-div-style";

 

this.containerCtl.appendChild(this.selectYearDiv);

 

Event.observe(document, "keypress", this._keypresshandler.bind(this), false);

Event.observe(document, "click", this._clickhandler.bind(this), false);

}

}

 

 

if (!this.ns4)

{if

(!this.ie)this.yearNow += 1900;

 

this._hideCalendar();

 

this.monthConstructed = false;

this.yearConstructed = false;

 

if (this.initData.showToday == 1)

{this

.todaySpan.appendChild(document.createTextNode(this.initData.todayString + " "))

 

var todayLink = document.createElement("a");

todayLink.className = this.initData.themePrefix + "-today-style";todayLink.setAttribute(

"title", this.initData.gotoString);

todayLink.setAttribute("href", "#")todayLink.appendChild(document.createTextNode(

this._todayIsDate()));

Event.observe(todayLink, "click", function(event)

{

this.selectedDate.month = this.monthNow;

this.selectedDate.year = this.yearNow;this._constructCalendar();

Event.stop(event);

}.bindAsEventListener(this), false);Event.observe(todayLink,

"mousemove", function()

{

window.status = this.initData.gotoString;

}.bind(this), false);Event.observe(todayLink,

"mouseout", function()

{

window.status = "";}.bind(this), false);

 

this.todaySpan.appendChild(todayLink);

}

 

this._appendNavToCaption("left");this._appendNavToCaption("right");

 

this.monthSpan = document.createElement("span");

this.monthSpan.className = this.initData.themePrefix + "-title-control-normal-style";

 

Event.observe(this.monthSpan, "mouseover", function(event)

{this

._swapImage(this.changeMonthImg, "drop2.gif");

this.monthSpan.className = this.initData.themePrefix + "-title-control-select-style";window.status =

this.selectMonthMessage;}.bindAsEventListener(this), false);

 

Event.observe(this.monthSpan, "mouseout", function(event)

{

this._swapImage(this.changeMonthImg, "drop1.gif");

this.monthSpan.className = this.initData.themePrefix + "-title-control-normal-style";

window.status = "";

}.bindAsEventListener(this), false);

 

Event.observe(this.monthSpan, "click", function(event)

{this

._popUpMonth();

Event.stop(event);

}.bind(this), false);

 

this.captionSpan.appendChild(this.monthSpan);this._appendNbsp(this.captionSpan);

 

this.yearSpan = document.createElement("span");

this.yearSpan.className = this.initData.themePrefix + "-title-control-normal-style";

 

Event.observe(this.yearSpan, "mouseover", function(event)

{this

._swapImage(this.changeYearImg, "drop2.gif");

this.yearSpan.className = this.initData.themePrefix + "-title-control-select-style";window.status =

this.selectYearMessage;}.bindAsEventListener(this), false);

 

Event.observe(this.yearSpan, "mouseout", function(event)

{

this._swapImage(this.changeYearImg, "drop1.gif");

this.yearSpan.className = this.initData.themePrefix + "-title-control-normal-style";

window.status = "";

}.bindAsEventListener(this), false);

 

Event.observe(this.yearSpan, "click", function(event)

{this

._popUpYear();

Event.stop(event);

}.bind(this), false);

 

this.captionSpan.appendChild(this.yearSpan);this._appendNbsp(this.captionSpan);

 

this.bPageLoaded = true;

 

}

}

 

org_apache_myfaces_PopupCalendar.prototype._appendNavToCaption = function(direction)

{

var imgLeft = document.createElement("img");

imgLeft.setAttribute("src", this.initData.imgDir + direction + "1.gif");imgLeft.setAttribute(

"width","10px");

imgLeft.setAttribute("height","11px");imgLeft.setAttribute(

"style", "border:0px;")

 

var spanLeft = document.createElement("span");

 

this._createControl(direction, spanLeft, imgLeft);

 

this._appendNbsp(spanLeft);

spanLeft.appendChild(imgLeft);

this._appendNbsp(spanLeft); this.captionSpan.appendChild(spanLeft);

this._appendNbsp(spanLeft);

}

 

org_apache_myfaces_PopupCalendar.prototype._createControl = function(direction, spanLeft, imgLeft)

{

spanLeft.className = this.initData.themePrefix + "-title-control-normal-style";

Event.observe(spanLeft, "mouseover", function(event)

{

this._swapImage(imgLeft, direction + "2.gif");spanLeft.className =

this.initData.themePrefix + "-title-control-select-style";

if (direction == "left")

{

window.status = this.scrollLeftMessage;

}

else

{

window.status = this.scrollRightMessage;

}}

.bindAsEventListener(this), false);

Event.observe(spanLeft, "click", function()

{

if (direction == "left")

{

this._decMonth();

}

else

{

this._incMonth();

}}

.bind(this), false);

Event.observe(spanLeft, "mouseout", function(event)

{

clearInterval(this.intervalID1);

this._swapImage(imgLeft, direction + "1.gif");

spanLeft.className = "" + this.initData.themePrefix + "-title-control-normal-style";window.status =

"";

}.bindAsEventListener(this), false);Event.observe(spanLeft,

"mousedown", function()

{

clearTimeout(this.timeoutID1);

this.timeoutID1 = setTimeout((function()

{

if (direction == "left")

{

this._startDecMonth();

}

else

{

this._startIncMonth();

}}

).bind(this), 500)

}.bind(this), false);Event.observe(spanLeft,

"mouseup", function()

{

clearTimeout(this.timeoutID1); clearInterval(this.intervalID1);

}.bind(this), false);

}

 

org_apache_myfaces_PopupCalendar.prototype._appendNbsp = function(element)

{

if (element)

element.appendChild(document.createTextNode(String.fromCharCode(160)));

}

org_apache_myfaces_PopupCalendar.prototype._todayIsDate = function()

{

var format = new org_apache_myfaces_SimpleDateFormat(this.initData.todayDateFormat?

this.initData.todayDateFormat:this.dateFormat,

this.dateFormatSymbols);

return format.format(this.today);

}

 

org_apache_myfaces_PopupCalendar.prototype._hideCalendar = function()

{

this.calendarDiv.style.visibility = "hidden"

this.bCalendarHidden = true;

if (this.selectMonthDiv.style != null)

{this

.selectMonthDiv.style.visibility = "hidden";

}if

(this.selectYearDiv.style != null)

{this

.selectYearDiv.style.visibility = "hidden";

}

 

this._showElement(this.selectMonthDiv); this._showElement(this.selectYearDiv);

this._showElement(this.calendarDiv);

}

 

org_apache_myfaces_PopupCalendar.prototype._padZero = function(num)

{

return (num < 10)? '0' + num : num;

}

 

org_apache_myfaces_PopupCalendar.prototype._constructDate = function(d, m, y)

{

var format = new org_apache_myfaces_SimpleDateFormat(this.dateFormat, this.dateFormatSymbols);

return format.format(new Date(y, m, d, this.selectedDate.hour, this.selectedDate.min, this.selectedDate.sec));

}

 

org_apache_myfaces_PopupCalendar.prototype._closeCalendar = function()

{

this._hideCalendar();

 

if (this.myFacesCtlType != "x:inputDate")

{this

.ctlToPlaceValue.value = this._constructDate(this.selectedDate.date, this.selectedDate.month, this.selectedDate.year)

var onchange = this.ctlToPlaceValue.getAttribute("onchange");

if (onchange)

{this

.ctlToPlaceValue.onchange();}

}

else

{

document.getElementById(this.myFacesInputDateClientId + ".day").value = this.selectedDate.date;

document.getElementById(this.myFacesInputDateClientId + ".month").value = this.selectedDate.month + 1;document.getElementById(

this.myFacesInputDateClientId + ".year").value = this.selectedDate.year; }

}

 

/*** Month Pulldown ***/

 

org_apache_myfaces_PopupCalendar.prototype._startDecMonth = function()

{

this.intervalID1 = setInterval((function()

{this

._decMonth

}).bind(this), 80);

}

 

org_apache_myfaces_PopupCalendar.prototype._startIncMonth = function()

{

this.intervalID1 = setInterval((function()

{this

._incMonth

}).bind(this), 80);

}

 

org_apache_myfaces_PopupCalendar.prototype._incMonth = function()

{

this.selectedDate.month = this.selectedDate.month + 1;

if (this.selectedDate.month > 11)

{

this.selectedDate.month = 0;

this.selectedDate.year++; }

this._constructCalendar();

}

 

org_apache_myfaces_PopupCalendar.prototype._decMonth = function()

{

this.selectedDate.month = this.selectedDate.month - 1;

if (this.selectedDate.month < 0)

{

this.selectedDate.month = 11

this.selectedDate.year-- }

this._constructCalendar()

}

 

 

org_apache_myfaces_PopupCalendar.prototype._removeAllChildren = function(element)

{

while (element && element.hasChildNodes())

element.removeChild(element.lastChild);

}

 

org_apache_myfaces_PopupCalendar.prototype._constructMonth = function()

{

this._popDownYear(); if (!this.monthConstructed)

{

 

var selectMonthTable = document.createElement("table");

selectMonthTable.setAttribute("style", "width:70px;border-collapse:collapse;")selectMonthTable.className =

this.initData.themePrefix + "-dropdown-style";

 

this._removeAllChildren(this.selectMonthDiv);

 

this.selectMonthDiv.appendChild(selectMonthTable);

 

Event.observe(selectMonthTable, "mouseover", function()

{

clearTimeout(this.timeoutID1);

}.bind(this), false);Event.observe(selectMonthTable,

"mouseout", function(event)

{

clearTimeout(this.timeoutID1);

this.timeoutID1 = setTimeout((function()

{

this._popDownMonth()

}).bind(this), 100);

Event.stop(event);

}.bindAsEventListener(this), false);

 

var selectMonthTableBody = document.createElement("tbody");

selectMonthTable.appendChild(selectMonthTableBody);

 

for (i = 0; i < 12; i++)

{var

sName = this.initData.monthName[i];

 

var sNameNode = null;

 

if (i == this.selectedDate.month)

{

sNameNode = document.createElement("span");sNameNode.setAttribute("style", "font-weight:bold;");

sNameNode.appendChild(document.createTextNode(sName));

sNameNode.setAttribute("userData",i);

}

else

{

sNameNode = document.createTextNode(sName);

}

 

var monthRow = document.createElement("tr");

selectMonthTableBody.appendChild(monthRow);

 

var monthCell = document.createElement("td");monthCell.setAttribute("userData",i);

monthRow.appendChild(monthCell);

 

Event.observe(monthCell, "mouseover", function(event)

{

Event.element(event).className = this.initData.themePrefix + "-dropdown-select-style";}.bind(this), false);

 

Event.observe(monthCell, "mouseout", function(event)

{

Event.element(event).className = this.initData.themePrefix + "-dropdown-normal-style";

}.bind(this), false);

 

Event.observe(monthCell, "click", function(event)

{this

.monthConstructed = false;

this.selectedDate.month = parseInt(Event.element(event).getAttribute("userData"),10);

this._constructCalendar();this._popDownMonth();

Event.stop(event);

}.bindAsEventListener(this), false);

 

this._appendNbsp(monthCell);

monthCell.appendChild(sNameNode);

this._appendNbsp(monthCell);

}

 

this.monthConstructed = true; }

}

 

org_apache_myfaces_PopupCalendar.prototype._popUpMonth = function()

{

this._constructMonth()

this.selectMonthDiv.style.visibility = (this.dom || this.ie)? "visible" : "show"

this.selectMonthDiv.style.left = parseInt(this._formatInt(this.calendarDiv.style.left), 10) + 50 + "px";this.selectMonthDiv.style.top = parseInt(this._formatInt(this.calendarDiv.style.top), 10) + 26 + "px";

 

this._hideElement(this.selectMonthDiv);

}

 

org_apache_myfaces_PopupCalendar.prototype._popDownMonth = function()

{

this.selectMonthDiv.style.visibility = "hidden";

this._showElement(this.selectMonthDiv);

}

 

/*** Year Pulldown ***/

 

org_apache_myfaces_PopupCalendar.prototype._incYear = function()

{

for (i = 0; i < 7; i++)

{

newYear = (i + this.nStartingYear) + 1;

 

this._createAndAddYear(newYear, i);

}this

.nStartingYear++;

this.bClickOnCalendar = true;

}

 

org_apache_myfaces_PopupCalendar.prototype._createAndAddYear = function(newYear, i)

{

var parentNode = document.getElementById(this.containerCtl.getAttribute("id")+"y" + i);

 

this._removeAllChildren(parentNode);

 

if (newYear == this.selectedDate.year)

{this

._appendNbsp(parentNode);

var newYearSpan = document.createElement("span");newYearSpan.setAttribute(

"userData",newYear);

newYearSpan.appendChild(document.createTextNode(newYear));

parentNode.appendChild(newYearSpan);

this._appendNbsp(parentNode);}

else

{

this._appendNbsp(parentNode);

parentNode.appendChild(document.createTextNode(newYear));

this._appendNbsp(parentNode);

}

 

parentNode.setAttribute("userData",newYear);

}

 

 

org_apache_myfaces_PopupCalendar.prototype._decYear = function()

{

for (i = 0; i < 7; i++)

{

newYear = (i + this.nStartingYear) - 1;

 

this._createAndAddYear(newYear, i);

}this

.nStartingYear--;

this.bClickOnCalendar = true;

}

 

org_apache_myfaces_PopupCalendar.prototype._constructYear = function()

{

this._popDownMonth();

var sHTML = "";

if (!this.yearConstructed)

{

 

var selectYearTable = document.createElement("table");

selectYearTable.setAttribute("style", "width:44px;border-collapse:collapse;")selectYearTable.className =

this.initData.themePrefix + "-dropdown-style";

 

this._removeAllChildren(this.selectYearDiv);

 

this.selectYearDiv.appendChild(selectYearTable);

 

Event.observe(selectYearTable, "mouseover", function()

{

clearTimeout(this.timeoutID2);

}.bind(this), false);Event.observe(selectYearTable,

"mouseout", function(event)

{

clearTimeout(this.timeoutID2);

this.timeoutID2 = setTimeout((function()

{

this._popDownYear()

}).bind(this), 100);

Event.stop(event);

}.bindAsEventListener(this), false);

 

 

var selectYearTableBody = document.createElement("tbody");

selectYearTable.appendChild(selectYearTableBody);

 

var selectYearRowMinus = document.createElement("tr");

selectYearTableBody.appendChild(selectYearRowMinus);

 

var selectYearCellMinus = document.createElement("td");selectYearCellMinus.setAttribute("align", "center");

 

selectYearCellMinus.appendChild(document.createTextNode("-"));

 

selectYearRowMinus.appendChild(selectYearCellMinus);

 

Event.observe(selectYearCellMinus, "mouseover", function(event)

{

Event.element(event).className = this.initData.themePrefix + "-dropdown-select-style";}.bindAsEventListener(this), false);

 

Event.observe(selectYearCellMinus, "mouseout", function(event)

{

clearInterval(this.intervalID1);Event.element(event).className =

this.initData.themePrefix + "-dropdown-normal-style";}.bindAsEventListener(this), false);

 

Event.observe(selectYearCellMinus, "mousedown", function(event)

{

clearInterval(this.intervalID1);

this.intervalID1 = setInterval((function()

{this

._decYear();}).bind(this), 30);

Event.stop(event);

}.bindAsEventListener(this), false);

 

Event.observe(selectYearCellMinus, "mouseup", function(event)

{clearInterval(this.intervalID1);

Event.stop(event);

}.bindAsEventListener(this), false);

 

 

//sHTML = "<tr><td align='center' onmouseover='this.className=\""+this.initData.themePrefix+"-dropdown-select-style\"' onmouseout='clearInterval(this.intervalID1); this.className=\""+this.initData.themePrefix+"-dropdown-normal-style\"' onmousedown='clearInterval(this.intervalID1);this.intervalID1=setInterval(\"_decYear()\",30)' onmouseup='clearInterval(this.intervalID1)'>-</td></tr>";

 

this.nStartingYear = this.selectedDate.year - 3;

var j = 0;

for (i = this.selectedDate.year - 3; i <= (this.selectedDate.year + 3); i++)

{var

sName = i;

 

var sNameNode = null;

 

if (i == this.selectedDate.year)

{

sNameNode = document.createElement("span");sNameNode.setAttribute("style", "font-weight:bold;");

sNameNode.appendChild(document.createTextNode(sName));

sNameNode.setAttribute("userData", sName);

}

else

{

sNameNode = document.createTextNode(sName);

}

 

var yearRow = document.createElement("tr");

selectYearTableBody.appendChild(yearRow);

 

var yearCell = document.createElement("td");

yearCell.setAttribute("userData",sName);yearCell.setAttribute(

"id",this.containerCtl.getAttribute("id")+"y" + j);

yearRow.appendChild(yearCell);

 

Event.observe(yearCell, "mouseover", function(event)

{

Event.element(event).className = this.initData.themePrefix + "-dropdown-select-style";}.bind(this), false);

 

Event.observe(yearCell, "mouseout", function(event)

{

Event.element(event).className = this.initData.themePrefix + "-dropdown-normal-style";

}.bind(this), false);

 

Event.observe(yearCell, "click", function(event)

{var

elem = Event.element(event);

var sYear = null;

this.selectedDate.year = parseInt(this._formatInt(elem.getAttribute("userData"),10));

this.yearConstructed = false;

this._popDownYear();this._constructCalendar();

Event.stop(event);

}.bindAsEventListener(this), false);

 

this._appendNbsp(yearCell);

yearCell.appendChild(sNameNode);

this._appendNbsp(yearCell);

j++;

}

 

var selectYearRowPlus = document.createElement("tr");

selectYearTableBody.appendChild(selectYearRowPlus);

 

var selectYearCellPlus = document.createElement("td");selectYearCellPlus.setAttribute("align", "center");

 

selectYearCellPlus.appendChild(document.createTextNode("+"));

 

selectYearRowPlus.appendChild(selectYearCellPlus);

 

Event.observe(selectYearCellPlus, "mouseover", function(event)

{

Event.element(event).className = this.initData.themePrefix + "-dropdown-select-style";}.bindAsEventListener(this), false);

 

Event.observe(selectYearCellPlus, "mouseout", function(event)

{

clearInterval(this.intervalID2);Event.element(event).className =

this.initData.themePrefix + "-dropdown-normal-style";}.bindAsEventListener(this), false);

 

Event.observe(selectYearCellPlus, "mousedown", function(event)

{

clearInterval(this.intervalID2);

this.intervalID2 = setInterval((function()

{this

._incYear();

}).bind(this), 30);

}.bindAsEventListener(this), false);

 

Event.observe(selectYearCellPlus, "mouseup", function(event)

{

clearInterval(this.intervalID2);}.bindAsEventListener(this), false);

 

this.yearConstructed = true;

}

}

 

org_apache_myfaces_PopupCalendar.prototype._popDownYear = function()

{

clearInterval(this.intervalID1);

clearTimeout(this.timeoutID1);clearInterval(

this.intervalID2);

clearTimeout(this.timeoutID2);

this.selectYearDiv.style.visibility = "hidden";

this._showElement(this.selectYearDiv);

}

 

org_apache_myfaces_PopupCalendar.prototype._popUpYear = function()

{

var leftOffset;

 

this._constructYear();

this.selectYearDiv.style.visibility = (this.dom || this.ie) ? "visible" : "show";leftOffset = parseInt(

this._formatInt(this.calendarDiv.style.left), 10) + this.yearSpan.offsetLeft;if (this.ie)

leftOffset += 6;

this.selectYearDiv.style.left = leftOffset + "px";

this.selectYearDiv.style.top = parseInt(this._formatInt(this.calendarDiv.style.top), 10) + 26 + "px";

 

this._hideElement(this.selectYearDiv);

}

 

/*** calendar ***/

org_apache_myfaces_PopupCalendar.prototype._weekNbr = function(n)

{

// Algorithm used:

// From Klaus Tondering's Calendar document (The Authority/Guru)

// hhtp://www.tondering.dk/claus/calendar.html

// a = (14-month) / 12

// y = year + 4800 - a

// m = month + 12a - 3

// J = day + (153m + 2) / 5 + 365y + y / 4 - y / 100 + y / 400 - 32045

// d4 = (J + 31741 - (J mod 7)) mod 146097 mod 36524 mod 1461

// L = d4 / 1460

// d1 = ((d4 - L) mod 365) + L

// WeekNumber = d1 / 7 + 1

 

year = n.getFullYear();

month = n.getMonth() + 1;

if (this.initData.startAt == 0)

day = n.getDate() + 1;

elseday = n.getDate();

 

a = Math.floor((14 - month) / 12);

y = year + 4800 - a;

m = month + 12 * a - 3;

b = Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400);

J = day + Math.floor((153 * m + 2) / 5) + 365 * y + b - 32045;

d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461;

L = Math.floor(d4 / 1460);

d1 = ((d4 - L) % 365) + L;

week = Math.floor(d1 / 7) + 1;

 

return week;

}

 

org_apache_myfaces_PopupCalendar.prototype._appendCell = function(parentElement, value)

{

var cell = document.createElement("td");cell.setAttribute("style", "text-align:right;");

 

if (value && value != "")

{

cell.appendChild(document.createTextNode(value));

}

else

{

this._appendNbsp(cell);

}

 

parentElement.appendChild(cell);

}

 

org_apache_myfaces_PopupCalendar.prototype._getDateStyle = function(datePointer)

{

var sStyle = this.initData.themePrefix + "-normal-day-style";

//regular day

 

if ((datePointer == this.dateNow) &&

(this.selectedDate.month == this.monthNow) && (this.selectedDate.year == this.yearNow)) //today

{

sStyle = this.initData.themePrefix + "-current-day-style";

}

else if (dayPointer % 7 == (this.initData.startAt * -1) + 1) //end-of-the-week day

{ sStyle = this.initData.themePrefix + "-end-of-weekday-style";

}

 

//selected day

if ((datePointer == this.saveSelectedDate.date) &&

(this.selectedDate.month == this.saveSelectedDate.month) &&(

this.selectedDate.year == this.saveSelectedDate.year))

{

sStyle += " " + this.initData.themePrefix + "-selected-day-style";

}

 

for (k = 0; k < this.holidaysCounter; k++)

{if

((parseInt(this._formatInt(this.holidays[k].d), 10) == datePointer) && (parseInt(this._formatInt(this.holidays[k].m), 10) == (this.selectedDate.month + 1)))

{if

((parseInt(this._formatInt(this.holidays[k].y), 10) == 0) || ((parseInt(this._formatInt(this.holidays[k].y), 10) == this.selectedDate.year) && (parseInt(this._formatInt(this.holidays[k].y), 10) != 0)))

{

sStyle += " " + this.initData.themePrefix + "-holiday-style";}

}

}

 

return sStyle;

}

 

org_apache_myfaces_PopupCalendar.prototype._getHolidayHint = function(datePointer)

{

var sHint = "";

for (k = 0; k < this.holidaysCounter; k++)

{

if ((parseInt(this._formatInt(this.holidays[k].d), 10) == datePointer) && (parseInt(this._formatInt(this.holidays[k].m), 10) == (this.selectedDate.month + 1)))

{

if ((parseInt(this._formatInt(this.holidays[k].y), 10) == 0) || ((parseInt(this._formatInt(this.holidays[k].y), 10) == this.selectedDate.year) && (parseInt(this._formatInt(this.holidays[k].y), 10) != 0)))

{

sHint += sHint == ""?this.holidays[k].desc:"\n" + this.holidays[k].desc;

}

}

}

 

return sHint;

}

 

 

org_apache_myfaces_PopupCalendar.prototype._constructCalendar = function()

{

var aNumDays = Array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

 

var dateMessage;

var startDate = new Date (this.selectedDate.year, this.selectedDate.month, 1);

var endDate;

 

if (this.selectedDate.month == 1)

{

endDate = new Date (this.selectedDate.year, this.selectedDate.month + 1, 1);endDate = new Date (endDate - (24 * 60 * 60 * 1000));

numDaysInMonth = endDate.getDate();

}

else

{

numDaysInMonth = aNumDays[this.selectedDate.month];

}

 

datePointer = 0;dayPointer = startDate.getDay() - this.initData.startAt;

 

if (dayPointer < 0)

dayPointer = 6;

 

this._removeAllChildren(this.contentSpan);

 

var contentTable = document.createElement("table");

contentTable.setAttribute("style", "border:0px;")contentTable.className =

this.initData.themePrefix + "-body-style";

 

this.contentSpan.appendChild(contentTable);

 

var contentBody = document.createElement("tbody");

contentTable.appendChild(contentBody);

 

var contentRow = document.createElement("tr");

contentBody.appendChild(contentRow);

 

if (this.initData.showWeekNumber == 1)

{var

showWeekNumberCell = document.createElement("td");showWeekNumberCell.setAttribute("style", "width:27px;font-weight:bold;");

 

contentRow.appendChild(showWeekNumberCell);

 

showWeekNumberCell.appendChild(document.createTextNode(this.initData.weekString));

 

var dividerCell = document.createElement("td");

dividerCell.setAttribute("style", "width:1px;")dividerCell.setAttribute(

"rowSpan", "7");dividerCell.className = this.initData.themePrefix + "-weeknumber-div-style";

 

contentRow.appendChild(dividerCell);

 

var dividerImg = document.createElement("img");

dividerImg.setAttribute("src", this.initData.imgDir + "divider.gif");dividerImg.setAttribute(

"style", "width:1px;");

dividerCell.appendChild(dividerImg);

}

 

for (i = 0; i < 7; i++)

{var

dayNameCell = document.createElement("td");dayNameCell.setAttribute("style", "width:27px;text-align:right;font-weight:bold;")

contentRow.appendChild(dayNameCell);

 

dayNameCell.appendChild(document.createTextNode(this.initData.dayName[i]));

}

 

var currentRow = document.createElement("tr");

contentBody.appendChild(currentRow);

 

if (this.initData.showWeekNumber == 1)

{this

._appendCell(currentRow, this._weekNbr(startDate) + " ");

}

 

for (var i = 1; i <= dayPointer; i++)

{this

._appendCell(currentRow);

}

 

for (datePointer = 1; datePointer <= numDaysInMonth; datePointer++)

{

dayPointer++;

var dateCell = document.createElement("td");dateCell.setAttribute(

"style", "text-align:right;");

 

currentRow.appendChild(dateCell);

 

var sStyle = this._getDateStyle(datePointer);var sHint = this._getHolidayHint(datePointer);

 

var sSelectStyle = sStyle + " " + this.initData.themePrefix + "-would-be-selected-day-style";

var sNormalStyle = sStyle;

 

var dateLink = document.createElement("a");

dateLink.className = sStyle;

dateLink.setAttribute("href", "#");dateLink.setAttribute("title", "sHint");

 

dateLink.sNormalStyle = sNormalStyle;

dateLink.sSelectStyle = sSelectStyle;

dateLink.datePointer = datePointer;

 

dateCell.appendChild(dateLink);

 

Event.observe(dateLink, "mousemove", function(event)

{

window.status = this.initData.selectDateMessage.replace("[date]", this._constructDate(datePointer, this.selectedDate.month, this.selectedDate.year));

}.bindAsEventListener(this), false);Event.observe(dateLink,

"mouseout", function(event)

{var

elem = Event.element(event);

elem.className = elem.sNormalStyle;

window.status = "";

}.bindAsEventListener(this), false);Event.observe(dateLink,

"click", function(event)

{var

elem = Event.element(event);

this.selectedDate.date = elem.datePointer;

this._closeCalendar();

Event.stop(event);

}.bindAsEventListener(this), false);

Event.observe(dateLink, "mouseover", function(event)

{var elem = Event.element(event);

elem.className = elem.sSelectStyle;

}.bindAsEventListener(this), false);

 

this._appendNbsp(dateLink);

dateLink.appendChild(document.createTextNode(datePointer));

this._appendNbsp(dateLink);

 

if ((dayPointer + this.initData.startAt) % 7 == this.initData.startAt)

{currentRow = document.createElement("tr");

contentBody.appendChild(currentRow);

 

if ((this.initData.showWeekNumber == 1) && (datePointer < numDaysInMonth))

{this

._appendCell(currentRow, this._weekNbr(new Date(this.selectedDate.year, this.selectedDate.month, datePointer + 1)) + " ");

}

 

}

}

 

this._removeAllChildren(this.monthSpan);

 

this._appendNbsp(this.monthSpan);

this.monthSpan.appendChild(document.createTextNode(this.initData.monthName[this.selectedDate.month]));

this._appendNbsp(this.monthSpan);

 

this.changeMonthImg = document.createElement("img");

this.changeMonthImg.setAttribute("src", this.initData.imgDir + "drop1.gif");

this.changeMonthImg.setAttribute("width","12px");

this.changeMonthImg.setAttribute("height","10px");

this.changeMonthImg.setAttribute("style", "border:0px;");

 

this.monthSpan.appendChild(this.changeMonthImg);

 

this._removeAllChildren(this.yearSpan);

 

this._appendNbsp(this.yearSpan);

this.yearSpan.appendChild(document.createTextNode(this.selectedDate.year));

this._appendNbsp(this.yearSpan);

 

this.changeYearImg = document.createElement("img");

this.changeYearImg.setAttribute("src", this.initData.imgDir + "drop1.gif");

this.changeYearImg.setAttribute("width","12px");

this.changeYearImg.setAttribute("height","10px");

this.changeYearImg.setAttribute("style", "border:0px;");

 

this.yearSpan.appendChild(this.changeYearImg);

 

this._removeAllChildren(this.closeCalendarSpan);

 

var closeButtonImg = document.createElement("img");

closeButtonImg.setAttribute("src", this.initData.imgDir + "close.gif");closeButtonImg.setAttribute(

"width","15px");

closeButtonImg.setAttribute("height","13px");closeButtonImg.setAttribute(

"style", "border:0px;");closeButtonImg.setAttribute("alt", "Close the calendar");

 

this.closeCalendarSpan.appendChild(closeButtonImg);

 

this._recalculateElement(this.calendarDiv);

}

 

org_apache_myfaces_PopupCalendar.prototype._popUpCalendar = function(ctl, ctl2, format)

{

if (this.bPageLoaded)

{if

(this.calendarDiv.style.visibility == "hidden")

{this

.ctlToPlaceValue = ctl2;this.dateFormat = format;

 

var simpleDateFormat = new org_apache_myfaces_SimpleDateFormat(this.dateFormat, this.dateFormatSymbols);

var dateSelected = simpleDateFormat.parse(ctl2.value);

 

if (dateSelected)

{this

.selectedDate.sec = dateSelected.getSeconds();

this.selectedDate.min = dateSelected.getMinutes();

this.selectedDate.hour = dateSelected.getHours();

this.selectedDate.date = dateSelected.getDate();

this.selectedDate.month = dateSelected.getMonth();

 

var yearStr = dateSelected.getYear() + "";

 

if (yearStr.length < 4)

{

yearStr = (parseInt(yearStr, 10) + 1900) + "";

}

 

this.selectedDate.year = parseInt(yearStr, 10);}

else

{

this.selectedDate.date = this.dateNow;

this.selectedDate.month = this.monthNow;

this.selectedDate.year = this.yearNow;

}

 

this._popUpCalendar_Show(ctl);}

else

{

this._hideCalendar();

if (this.ctlNow != ctl)

this._popUpCalendar(ctl, ctl2, format);

}this

.ctlNow = ctl; }

}

 

org_apache_myfaces_PopupCalendar.prototype._popUpCalendarForInputDate = function(clientId, format)

{

if (this.bPageLoaded)

{this

.myFacesCtlType = "x:inputDate";

this.myFacesInputDateClientId = clientId;

this.dateFormat = format;

 

this.selectedDate.date = parseInt(this._formatInt(document.getElementById(clientId + ".day").value), 10);

this.selectedDate.month = parseInt(this._formatInt(document.getElementById(clientId + ".month").value), 10) - 1;

this.selectedDate.year = parseInt(this._formatInt(document.getElementById(clientId + ".year").value), 10);

this.ctlNow = document.getElementById(clientId + ".day");

this._popUpCalendar_Show(document.getElementById(clientId + ".day")); }

}

 

org_apache_myfaces_PopupCalendar.prototype._popUpCalendar_Show = function(ctl)

{

this.saveSelectedDate.date = this.selectedDate.date;

this.saveSelectedDate.month = this.selectedDate.month;

this.saveSelectedDate.year = this.selectedDate.year;

 

var leftpos = 0;var toppos = 0;

 

var aTag = ctl;

var aTagPositionisAbsolute=false;

// Added try-catch to the next loop (MYFACES-870)

try

{

do {

aTag = aTag.offsetParent;

leftpos += aTag.offsetLeft;

toppos += aTag.offsetTop;

aTagPositioningisAbsolute = (aTag.style.position == "absolute")

}while

((aTag.tagName != "BODY") && (aTag.tagName != "DIV") && (!aTagPositioningisAbsolute));

}catch

(ex)

{

// ignore

}

 

var leftScrollOffset = 0;var topScrollOffset = 0;

 

aTag = ctl;

// Added try-catch (MYFACES-870)try

{

do {

leftScrollOffset += aTag.scrollLeft;

topScrollOffset += aTag.scrollTop;

aTag = aTag.parentNode;

}

while ((aTag.tagName != "BODY") && (aTag.tagName != "DIV") && (aTag.style.position != "absolute"));

}

catch (ex)

{ // ignore

}

 

var bodyRect = this._getVisibleBodyRectangle();

var cal = this.calendarDiv;

var top = 0;

var left = 0

if (aTagPositioningisAbsolute) { top = ctl.offsetTop - topScrollOffset + ctl.offsetHeight + 2;

left = ctl.offsetLeft - leftScrollOffset;

}

else {

top = ctl.offsetTop + toppos - topScrollOffset + ctl.offsetHeight + 2;

left = ctl.offsetLeft + leftpos - leftScrollOffset;

}

 

if(this.initData.popupLeft)

{

left-=cal.offsetWidth;

}

 

if (left + cal.offsetWidth > bodyRect.right)

{

left = bodyRect.right - cal.offsetWidth;

}if

(top + cal.offsetHeight > bodyRect.bottom)

{

top = bodyRect.bottom - cal.offsetHeight;

}if

(left < bodyRect.left)

{

left = bodyRect.left;

}if

(top < bodyRect.top)

{

top = bodyRect.top;

}

 

this.calendarDiv.style.left = this.initData.fixedX == -1 ? left + "px": this.initData.fixedX;

this.calendarDiv.style.top = this.initData.fixedY == -1 ? top + "px": this.initData.fixedY;

this._constructCalendar(1, this.selectedDate.month, this.selectedDate.year);

 

this.calendarDiv.style.visibility = (this.dom || this.ie)? "visible" : "show";this.bCalendarHidden = false;

 

setTimeout((function()

{

this._hideElement(this.calendarDiv);

}).bind(this), 200);

 

this._hideElement(this.calendarDiv);

 

this.bClickOnCalendar = true;

}

 

org_apache_myfaces_PopupCalendar.prototype._getVisibleBodyRectangle = function()

{

var visibleRect = new org_apache_myfaces_Rectangle();

 

if (window.pageYOffset != undefined)

{

//Most non IEvisibleRect.top = window.pageYOffset;

visibleRect.left = window.pageXOffset;

}else if

(document.body && document.body.scrollTop)

{

//IE 6 strict modevisibleRect.top = document.body.scrollTop;

visibleRect.left = document.body.scrollLeft;

}else if

(document.documentElement && document.documentElement.scrollTop)

{

//Older IEvisibleRect.top = document.documentElement.scrollTop;

visibleRect.left = document.documentElement.scrollLeft;

}

 

if (window.innerWidth != undefined)

{

//Most non-IEvisibleRect.right = visibleRect.left + window.innerWidth;

visibleRect.bottom = visibleRect.top + window.innerHeight;

}else if

(document.documentElement && document.documentElement.clientHeight)

{

//IE 6 strict modevisibleRect.right = visibleRect.left + document.documentElement.clientWidth;

visibleRect.bottom = visibleRect.top + document.documentElement.clientHeight;

}else if

(document.body && document.body.clientHeight)

{

//IE 4 compatiblevisibleRect.right = visibleRect.left + document.body.clientWidth;

visibleRect.bottom = visibleRect.top + document.body.clientHeight;

}

return visibleRect;

}

 

function org_apache_myfaces_Rectangle()

{

this.top = 0;

this.left = 0;

this.bottom = 0;

this.right = 0;

}

 

org_apache_myfaces_PopupCalendar.prototype._formatInt = function(str)

{

 

if (typeof str == 'string')

{

 

//truncate 0 for number less than 10

if (str.charAt && str.charAt(0) == "0")

{ // <----- Change, added str.charAt for method availability detection (MYFACES) return str.charAt(1);

}

 

}

return str;

 

}

 


Hosting by Yahoo!