/** * Filename.......: calendar.js * Project........: Popup Calendar * Last Modified..: $Date$ * CVS Revision...: $Revision$ * Copyright......: 2001, 2002 Richard Heyes */ dynCalendar_layers = new Array(); dynCalendar_mouseoverStatus = true; dynCalendar_mouseX = 0; dynCalendar_mouseY = 0; /** * The calendar constructor * * @access public * @param string objName Name of the object that you create * @param string callbackFunc Name of the callback function * @param string OPTIONAL Optional layer name * @param string OPTIONAL Optional images path */ function dynCalendar(objName, callbackFunc, targetID) { this.targetID=targetID; // Todays date this.today = new Date(); this.date = this.today.getDate(); this.month = this.today.getMonth(); this.year = this.today.getFullYear(); this.objName = objName; this.callbackFunc = callbackFunc; this.imagesPath = arguments[3] ? arguments[3] : 'images/'; this.defDate = arguments[4] ? arguments[4] : function() { return [this.year,this.month,this.date]; }; this.layerID = arguments[5] ? arguments[5] : 'dynCalendar_layer_' + dynCalendar_layers.length; this.offsetX = 5; this.offsetY = 5; this.useMonthCombo = true; this.useYearCombo = true; this.yearComboRange = 5; this.currentMonth = this.month; this.currentYear = this.year; /** * Public Methods */ this.show = dynCalendar_show; this.writeHTML = dynCalendar_writeHTML; // Accessor methods this.setOffset = dynCalendar_setOffset; this.setOffsetX = dynCalendar_setOffsetX; this.setOffsetY = dynCalendar_setOffsetY; this.setImagesPath = dynCalendar_setImagesPath; this.setMonthCombo = dynCalendar_setMonthCombo; this.setYearCombo = dynCalendar_setYearCombo; this.setCurrentMonth = dynCalendar_setCurrentMonth; this.setCurrentYear = dynCalendar_setCurrentYear; this.setYearComboRange = dynCalendar_setYearComboRange; /** * Private methods */ // Layer manipulation this._getLayer = dynCalendar_getLayer; this._hideLayer = dynCalendar_hideLayer; this._showLayer = dynCalendar_showLayer; this._setLayerPosition = dynCalendar_setLayerPosition; this._setHTML = dynCalendar_setHTML; // Miscellaneous this._getDaysInMonth = dynCalendar_getDaysInMonth; this._mouseover = dynCalendar_mouseover; /** * Constructor type code */ dynCalendar_layers[dynCalendar_layers.length] = this; this.writeHTML(); } function dynCalendar_show() { // Variable declarations to prevent globalisation var month, year, monthnames, numdays, thisMonth, firstOfMonth; var ret, row, i, cssClass, linkHTML, previousMonth, previousYear; var nextMonth, nextYear, prevImgHTML, prevLinkHTML, nextImgHTML, nextLinkHTML; var monthComboOptions, monthCombo, yearComboOptions, yearCombo, html; this.currentMonth = month = arguments[0] != null ? arguments[0] : this.currentMonth; this.currentYear = year = arguments[1] != null ? arguments[1] : this.currentYear; // monthnames = new Array('Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'); monthnames = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); // Main body of calendar // var wds= 'HKSzCsPSzV'; var wds= 'MoTuWeThFrSaSu'; var r2=new Array(); //var thisMonth=new Array();var ret=new Array(); var y2=year; var m2=month-1; if (m2==-1) { y2--; m2=11; } var ms=3; while (ms>0) { numdays = this._getDaysInMonth(m2, y2); thisMonth = new Date(y2, m2, 1); firstOfMonth = thisMonth.getDay(); // First few blanks up to first day ret= new Array(new Array()); var fd=firstOfMonth-1; if (fd<0) fd+=7; for(var i=0; i5? 'dynCalendar_weekend':'dynCalendar_weekday'); var linkJS=sprintf('%s(%s, %s, %s); %s._hideLayer();', this.callbackFunc, i, Number(m2) + 1, y2, this.objName); linkHTML = i++; var mOver="this.oCN=this.className; this.className='dynCalendar_day_over';"; var mOut="this.className=this.oCN;"; ret[row][ret[row].length] = sprintf('%s', mOver, mOut, linkJS, cssClass, linkHTML); } for(var i=0; i'+y2+' '+monthnames[m2]+''+wds+'' + ret.join('\n') + ''); if (m2==11) { y2++; m2=0; } else m2++; ms--; } thisMonth = new Date(year, month, 1); previousYear = thisMonth.getFullYear(); previousMonth = thisMonth.getMonth() - 1; if(previousMonth < 0){ previousMonth = 11; previousYear--; } nextYear = thisMonth.getFullYear(); nextMonth = thisMonth.getMonth() + 1; if(nextMonth > 11){ nextMonth = 0; nextYear++; } var mOver="this.oCN=this.className; this.className='dynCalendar_prevnext_over';"; var mOut="this.className=this.oCN;"; prevImgHTML = sprintf('<<', this.imagesPath); prevCellHTML = sprintf('%s', mOver,mOut, this.objName, previousMonth, previousYear, prevImgHTML); nextImgHTML = sprintf('<<', this.imagesPath); nextCellHTML = sprintf('%s', mOver,mOut, this.objName, nextMonth, nextYear, nextImgHTML); /** * Build month combo */ if (this.useMonthCombo) { monthComboOptions = ''; for (i=0; i<12; i++) { selected = (i == thisMonth.getMonth() ? 'selected="selected"' : ''); monthComboOptions += sprintf('', i, selected, monthnames[i]); } monthCombo = sprintf('', this.objName, this.objName, monthComboOptions); } else { monthCombo = monthnames[thisMonth.getMonth()]; } /** * Build year combo */ if (this.useYearCombo) { yearComboOptions = ''; for (i = thisMonth.getFullYear() - this.yearComboRange; i <= (thisMonth.getFullYear() + this.yearComboRange); i++) { selected = (i == thisMonth.getFullYear() ? 'selected="selected"' : ''); yearComboOptions += sprintf('', i, selected, i); } yearCombo = sprintf('', this.objName, this.objName, yearComboOptions); } else { yearCombo = thisMonth.getFullYear(); } html = ''; html += sprintf('', prevCellHTML, yearCombo, monthCombo, nextCellHTML); html += r2.join(''); html += '
%s%s
%s %s
'; this._setHTML(html); if (!arguments[0] && !arguments[1]) { this._showLayer(); this._setLayerPosition(); } } function dynCalendar_writeHTML() { GE(this.targetID).innerHTML= sprintf('', this.objName, this.imagesPath)+ sprintf('
', this.layerID, this.objName, this.objName); } function dynCalendar_setOffset(Xoffset, Yoffset) { this.setOffsetX(Xoffset); this.setOffsetY(Yoffset); } function dynCalendar_setOffsetX(Xoffset) { this.offsetX = Xoffset; } function dynCalendar_setOffsetY(Yoffset) { this.offsetY = Yoffset; } function dynCalendar_setImagesPath(path) { this.imagesPath = path; } function dynCalendar_setMonthCombo(useMonthCombo) { this.useMonthCombo = useMonthCombo; } function dynCalendar_setYearCombo(useYearCombo) { this.useYearCombo = useYearCombo; } function dynCalendar_setCurrentMonth(month) { this.currentMonth = month; } function dynCalendar_setCurrentYear(year) { this.currentYear = year; } function dynCalendar_setYearComboRange(range) { this.yearComboRange = range; } function dynCalendar_getLayer() { var layerID = this.layerID; if (document.getElementById(layerID)) { return document.getElementById(layerID); } else if (document.all) if (document.all(layerID)) { return document.all(layerID); } } function dynCalendar_hideLayer() { this._getLayer().style.visibility = 'hidden'; } function dynCalendar_showLayer() { //alert(this.layerID); this._getLayer().style.visibility = 'visible'; } function docW() { if (document.all) return document.body.clientWidth; else return document.width-10; } function docH() { if (document.all) return document.body.clientHeight; else return document.height-10; } function dynCalendar_setLayerPosition() { var L=this._getLayer(); var top,left; top=dynCalendar_mouseY + this.offsetY; if (top+L.offsetHeight>docH() && top-L.offsetHeight>0) top-=L.offsetHeight; left=dynCalendar_mouseX + this.offsetX; if (left+L.offsetWidth>docW() && left-L.offsetWidth>0) left-=L.offsetWidth; L.style.top=top+'px'; L.style.left=left+'px'; } function dynCalendar_setHTML(html) { this._getLayer().innerHTML = html; } function dynCalendar_getDaysInMonth(month, year) { monthdays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if (month != 1) { return monthdays[month]; } else { return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? 29 : 28); } } function dynCalendar_mouseover(status) { dynCalendar_mouseoverStatus = status; return true; } if (!mouseMoveEventAssigned) { dynCalendar_oldOnmousemove = document.onmousemove ? document.onmousemove : new Function; var dw; document.onmousemove = function () { if (arguments[0]) { dynCalendar_mouseX = arguments[0].pageX; dynCalendar_mouseY = arguments[0].pageY; } else { dynCalendar_mouseX = event.clientX + document.documentElement.scrollLeft; dynCalendar_mouseY = event.clientY + document.documentElement.scrollTop; arguments[0] = null; } dynCalendar_oldOnmousemove(arguments[0]); } var mouseMoveEventAssigned = true; } if (!clickEventAssigned) { dynCalendar_oldOnclick = document.onclick ? document.onclick : new Function; document.onclick = function () { if(!dynCalendar_mouseoverStatus){ for(i=0; i