if (null == window.phpVars) window.phpVars = {}; if (null == phpVars.ADMIN_THEME_ID) phpVars.ADMIN_THEME_ID = '.default'; function JCCalendar() { var _this = this; this.mess = {}; if (jsCalendarMess) this.mess = jsCalendarMess; this.floatDiv = null; this.content = null; this.dateInitial = new Date(); this.dateCurrent = null; this.dateCreate = new Date(); this.bTime = false; this.bFirst = true; this.menu = null; this.form = this.field = this.fieldFrom = this.fieldTo = null; /* Main functions */ this.Show = function(obj, field, fieldFrom, fieldTo, bTime, serverTime, form_name, bHideTimebar) { if (!form_name) form_name = null; this.bTime = !bHideTimebar && bTime; if(this.floatDiv) this.Close(); if (null != form_name) this.field = document.forms[form_name][field]; else this.field = document.getElementById(field); if (null == this.field) this.field = document.getElementsByName(field)[0]; if (!this.field) { alert(this.mess.error_fld); return; } this.form = (null == form_name) ? this.field.form : document.forms[form_name]; if (null != fieldFrom) { if (null != this.form) this.fieldFrom = this.form.elements[fieldFrom]; if (null == this.fieldFrom) this.fieldFrom = document.getElementById(fieldFrom); if (null == this.fieldFrom) this.fieldFrom = document.getElementsByName(fieldFrom)[0]; } if (null != fieldTo) { if (null != this.form) this.fieldTo = this.form.elements[fieldTo]; if (null == this.fieldTo) this.fieldTo = document.getElementById(fieldTo); if (null == this.fieldTo) this.fieldTo = document.getElementsByName(fieldTo)[0]; } var difference = serverTime*1000 - (this.dateCreate.valueOf() - this.dateCreate.getTimezoneOffset()*60000); this.dateCurrent = this.ParseDate(this.field.value); if(this.dateCurrent) this.dateInitial.setTime(this.dateCurrent.valueOf()); else if(this.bFirst) { this.dateInitial.setTime((new Date()).valueOf() + difference); this.dateInitial.setHours(0, 0, 0); } var div = document.body.appendChild(document.createElement("DIV")); div.id = "calendar_float_div"; div.className = "bx-calendar-float"; div.style.position = 'absolute'; div.style.zIndex = 10000; div.style.left = '-1000px'; div.style.top = '-1000px'; this.hoursSpin = new JCSpinner('hours'); this.minutesSpin = new JCSpinner('minutes'); this.secondsSpin = new JCSpinner('seconds'); div.innerHTML = '
'+ ''+ ' '+ ' '+ '
'+this.mess["title"]+'
'+ '
'+ '
'+ '
'+ '
'+ ''+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ ' '+ '
'+this.mess["hour"]+''+this.hoursSpin.Show('jsCalendar.hoursSpin')+' '+this.mess["minute"]+''+this.hoursSpin.Show('jsCalendar.minutesSpin')+' '+this.mess["second"]+''+this.hoursSpin.Show('jsCalendar.secondsSpin')+' 
'+ '
'+ '
'; if (!bHideTimebar) { div.innerHTML += ''+ ' '+ ' '+ ' '+ '
'; } this.floatDiv = div; this.content = jsUtils.FindChildObject(this.floatDiv, 'div', 'bx-calendar-content'); this.content.innerHTML = this.GetMonthPage(); var pos = jsUtils.GetRealPos(obj); pos["bottom"]+=2; pos = jsUtils.AlignToPos(pos, div.offsetWidth, div.offsetHeight); jsFloatDiv.Show(div, pos["left"], pos["top"]); setTimeout(function(){jsUtils.addEvent(document, "click", _this.CheckClick)}, 10); jsUtils.addEvent(document, "keypress", _this.OnKeyPress); this.bFirst = false; } this.GetMonthPage = function() { var aMonths = [this.mess["jan"], this.mess["feb"], this.mess["mar"], this.mess["apr"], this.mess["may"], this.mess["jun"], this.mess["jul"], this.mess["aug"], this.mess["sep"], this.mess["okt"], this.mess["nov"], this.mess["des"]]; var initYear = this.dateInitial.getFullYear(), initMonth = this.dateInitial.getMonth(), initDay = this.dateInitial.getDate(); var today = new Date(); today.setHours(this.dateInitial.getHours(), this.dateInitial.getMinutes(), this.dateInitial.getSeconds()); var bCurMonth = (today.getFullYear() == initYear && today.getMonth() == initMonth); document.getElementById('calendar_float_title').innerHTML = aMonths[initMonth]+', '+initYear; var s = ''; s += '
'+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ '
'+aMonths[initMonth]+''+initYear+'
'; s += '
'+ '
'+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''; var firstDate = new Date(initYear, initMonth, 1, this.dateInitial.getHours(), this.dateInitial.getMinutes(), this.dateInitial.getSeconds()); var firstDay = firstDate.getDay()-1; if(firstDay == -1) firstDay = 6; var date = new Date(); var bBreak = false; for(var i=0; i<6; i++) { var row = i*7; date.setTime(firstDate.valueOf()); date.setDate(1-firstDay+row); if(i > 0 && date.getDate() == 1) break; var nWeek = this.WeekNumber(date); s += ''; for(var j=0; j<7; j++) { date.setTime(firstDate.valueOf()); date.setDate(1-firstDay+row+j); var d = date.getDate(); if(i > 0 && d == 1) bBreak = true; var sClass = ''; if(row+j+1 > firstDay && !bBreak) { if(d == today.getDate() && bCurMonth) sClass += ' bx-calendar-today'; if(this.dateCurrent && d == this.dateCurrent.getDate() && initMonth == this.dateCurrent.getMonth() && initYear == this.dateCurrent.getFullYear()) sClass += ' bx-calendar-current'; } if(j==5 || j==6) sClass += ' bx-calendar-holiday'; if(!(row+j+1 > firstDay && !bBreak)) sClass += ' bx-calendar-inactive'; s += ''; s += ''+d+''; s += ''; } s += ''; if(bBreak) break; } s += '
 '+this.mess["mo"]+''+this.mess["tu"]+''+this.mess["we"]+''+this.mess["th"]+''+this.mess["fr"]+''+this.mess["sa"]+''+this.mess["su"]+'
'+nWeek+'
'+ '
'+ '
'+ '
'; return s; } /* Dates arithmetics */ this.WeekNumber = function(date) { date.setHours(0, 0, 0, 0); var firstYearDate = new Date(date.getFullYear(), 0, 1); var firstYearDay = firstYearDate.getDay()-1; if(firstYearDay == -1) firstYearDay = 6; var nDays = Math.round((date.valueOf() - firstYearDate.valueOf())/(24*60*60*1000)); var nWeek = (nDays-(7-firstYearDay))/7 + 1; if(firstYearDay < 4) nWeek++; if(nWeek > 52) { firstYearDate = new Date(date.getFullYear()+1, 0, 1); firstYearDay = firstYearDate.getDay()-1; if(firstYearDay == -1) firstYearDay = 6; if(firstYearDay < 4) nWeek = 1; } return nWeek; } this.NavigateToday = function() { var h = this.dateInitial.getHours(), m = this.dateInitial.getMinutes(), s = this.dateInitial.getSeconds(); this.dateInitial.setTime((new Date()).valueOf()); this.dateInitial.setHours(h, m, s); this.content.innerHTML = jsCalendar.GetMonthPage(); } this.NavigateMonth = function(mon) { this.dateInitial.setMonth(mon, 1); this.content.innerHTML = jsCalendar.GetMonthPage(); } this.NavigateYear = function(year) { this.dateInitial.setFullYear(year, this.dateInitial.getMonth(), 1); this.content.innerHTML = jsCalendar.GetMonthPage(); } this.getMonthFirst = function() { var d = new Date(); d.setTime(this.dateInitial.valueOf()); d.setDate(1); return d; } this.getMonthLast = function() { var d = new Date(); d.setTime(this.dateInitial.valueOf()); d.setMonth(d.getMonth()+1); d.setDate(0); return d; } this.getYearFirst = function() { var d = new Date(); d.setTime(this.dateInitial.valueOf()); d.setMonth(0); d.setDate(1); return d; } this.getYearLast = function() { var d = new Date(); d.setTime(this.dateInitial.valueOf()); d.setFullYear(d.getFullYear()+1); d.setMonth(0); d.setDate(0); return d; } /* Input / Output */ this.InsertDaysBack = function(input, days) { if(days != '') { var d = new Date(); if(days > 0) d.setTime(d.valueOf() - days*24*60*60*1000); input.value = this.FormatDate(d, phpVars.FORMAT_DATE); input.disabled = true; } else { input.disabled = false; input.value = ''; } } this.ValueToString = function(value) { var date = new Date(); date.setTime(value); if(this.bTime) { var form = document.float_calendar_time; date.setHours(parseInt(form.hours.value, 10)); date.setMinutes(parseInt(form.minutes.value, 10)); date.setSeconds(parseInt(form.seconds.value, 10)); } return this.FormatDate(date); } this.CurrentTime = function(difference) { var time = new Date(); time.setTime(time.valueOf() + difference); var form = document.float_calendar_time; form.hours.value = time.getHours(); form.minutes.value = time.getMinutes(); form.seconds.value = time.getSeconds(); form.hours.onchange(); form.minutes.onchange(); form.seconds.onchange(); } this.ClearTime = function() { var form = document.float_calendar_time; form.hours.value = form.minutes.value = form.seconds.value = '00'; } this.InsertDate = function(value) { this.field.value = this.ValueToString(value); if(this.field.onchange && typeof(this.field.onchange) == 'function') this.field.onchange(); this.Close(); } this.InsertPeriod = function(value1, value2) { if(null != this.fieldFrom && null != this.fieldTo) { this.fieldFrom.value = this.ValueToString(value1); this.fieldTo.value = this.ValueToString(value2); if(this.fieldFrom.onchange && typeof(this.fieldFrom.onchange) == 'function') this.fieldFrom.onchange(); if(this.fieldTo.onchange && typeof(this.fieldTo.onchange) == 'function') this.fieldTo.onchange(); } else { this.field.value = this.ValueToString(value1); if(this.field.onchange && typeof(this.field.onchange) == 'function') this.field.onchange(); } this.Close(); } this.Number = function(val) { return (val < 10? '0'+val : val); } this.FormatDate = function(date, format) { var val; var str = (format? format : (this.bTime? phpVars.FORMAT_DATETIME : phpVars.FORMAT_DATE)); str = str.replace(/YYYY/ig, date.getFullYear()); str = str.replace(/MM/ig, this.Number(date.getMonth()+1)); str = str.replace(/DD/ig, this.Number(date.getDate())); str = str.replace(/HH/ig, this.Number(date.getHours())); str = str.replace(/MI/ig, this.Number(date.getMinutes())); str = str.replace(/SS/ig, this.Number(date.getSeconds())); return str; } this.ParseDate = function(str) { var aDate = str.split(/\D/ig); var aFormat = phpVars.FORMAT_DATE.split(/\W/ig); if(aDate.length > aFormat.length) aFormat = phpVars.FORMAT_DATETIME.split(/\W/ig); var i, cnt; var aDateArgs=[], aFormatArgs=[]; for(i = 0, cnt = aDate.length; i < cnt; i++) if(jsUtils.trim(aDate[i]) != '') aDateArgs[aDateArgs.length] = aDate[i]; for(i = 0, cnt = aFormat.length; i < cnt; i++) if(jsUtils.trim(aFormat[i]) != '') aFormatArgs[aFormatArgs.length] = aFormat[i]; var aResult={}; for(i = 0, cnt = aFormatArgs.length; i < cnt; i++) aResult[aFormatArgs[i].toUpperCase()] = parseInt(aDateArgs[i], 10); if(aResult['DD'] > 0 && aResult['MM'] > 0 && aResult['YYYY'] > 0) { var d = new Date(); d.setDate(1); d.setFullYear(aResult['YYYY']); d.setMonth(aResult['MM']-1); d.setDate(aResult['DD']); d.setHours(0, 0, 0); if(!isNaN(aResult['HH']) && !isNaN(aResult['MI']) && !isNaN(aResult['SS'])) { this.bTime = true; d.setHours(aResult['HH'], aResult['MI'], aResult['SS']); } return d; } return null; } /* Navigation interface */ this.MenuMonth = function(a) { var aMonths = [this.mess["jan"], this.mess["feb"], this.mess["mar"], this.mess["apr"], this.mess["may"], this.mess["jun"], this.mess["jul"], this.mess["aug"], this.mess["sep"], this.mess["okt"], this.mess["nov"], this.mess["des"]]; var items = []; var mon = this.dateInitial.getMonth(); for(var i in aMonths) items[i] = {'ICONCLASS': (mon == i? 'checked':''), 'TEXT': aMonths[i], 'ONCLICK': 'jsCalendar.NavigateMonth('+i+')', 'DEFAULT': ((new Date()).getMonth() == i? true:false)}; this.ShowMenu(a, items); } this.MenuYear = function(a) { var items = []; var y = this.dateInitial.getFullYear(); for(var i=0; i<11; i++) { item_year = y-5+i; items[i] = {'ICONCLASS': (y == item_year? 'checked':''), 'TEXT': item_year, 'ONCLICK': 'jsCalendar.menu.PopupHide(); jsCalendar.NavigateYear('+item_year+')', 'DEFAULT': ((new Date()).getFullYear() == item_year? true:false)}; } this.ShowMenu(a, items); } this.ShowMenu = function(a, items) { if(!this.menu) { this.menu = new PopupMenu('calendar_float_menu'); this.menu.Create(10010); this.menu.OnClose = function() { setTimeout( function() { jsUtils.removeEvent(document, "click", _this.CheckClick); jsUtils.removeEvent(document, "keypress", _this.OnKeyPress); if (_this.floatDiv) jsUtils.addEvent(document, "click", _this.CheckClick) }, 50); jsUtils.addEvent(document, "keypress", _this.OnKeyPress); } } if(this.menu.IsVisible()) return; this.menu.SetItems(items); this.menu.BuildItems(); var pos = jsUtils.GetRealPos(a); pos["bottom"]+=1; jsUtils.removeEvent(document, "click", _this.CheckClick); jsUtils.removeEvent(document, "keypress", _this.OnKeyPress); this.menu.PopupShow(pos); } this.ToggleTime = function() { var div = jsUtils.FindChildObject(this.floatDiv, 'div', 'bx-calendar-time'); var a = document.getElementById('calendar_time_button'); if(div.style.display == 'none') { div.style.display = 'block'; a.className = 'bx-calendar-button bx-calendar-arrow-up'; a.title = this.mess['time_hide']; } else { div.style.display = 'none'; a.className = 'bx-calendar-button bx-calendar-arrow-down'; a.title = this.mess['time']; } a.blur(); jsFloatDiv.AdjustShadow(this.floatDiv); } this.TimeChange = function(input) { this.bTime = true; var val = parseInt(input.value, 10); if(isNaN(val)) val = '00'; else if(val < 0) { if(input.name == 'hours') val = '23'; else val = '59'; } else if(input.name == 'hours' && val > 23 || val > 59) val = '00'; else val = this.Number(val); input.value = val; } /* Window operations: close, drag, move */ this.Close = function() { jsUtils.removeEvent(document, "click", _this.CheckClick); jsUtils.removeEvent(document, "keypress", _this.OnKeyPress); jsFloatDiv.Close(this.floatDiv); this.floatDiv.parentNode.removeChild(this.floatDiv); this.floatDiv = null; } this.OnKeyPress = function(e) { if(!e) e = window.event if(!e) return; if(e.keyCode == 27) _this.Close(); } this.CheckClick = function(e) { var div = _this.floatDiv; if(!div) return; var windowSize = jsUtils.GetWindowSize(); var x = e.clientX + windowSize.scrollLeft; var y = e.clientY + windowSize.scrollTop; var arPos = jsUtils.GetRealPos(div); /*region*/ //var posLeft = parseInt(div.style.left); //var posTop = parseInt(div.style.top); //var posRight = posLeft + div.offsetWidth; //var posBottom = posTop + div.offsetHeight; if(x >= arPos.left && x <= arPos.right && y >= arPos.top && y <= arPos.bottom) return; _this.Close(); } } var jsCalendar = new JCCalendar(); if (null == window.JCSpinner) { function JCSpinner(name) { var _this = this; this.name = name; this.mousedown = false; this.Show = function(name) { var s = ''+ ' '+ ' '+ '
'; return s; } this.Start = function(delta) { this.mousedown = true; jsUtils.addEvent(document, "mouseup", _this.MouseUp); this.ChangeValue(delta, true); } this.ChangeValue = function(delta, bFirst) { if(!this.mousedown) return; var input = document.float_calendar_time.elements[this.name]; input.value = parseInt(input.value, 10) + delta; input.onchange(); setTimeout(function(){_this.ChangeValue(delta, false)}, (bFirst? 1000:150)); } this.MouseUp = function() { _this.mousedown = false; jsUtils.removeEvent(document, "mouseup", _this.MouseUp); } } }