1/* 2 DatePicker v4.4 by frequency-decoder.com 3 4 Released under a creative commons Attribution-ShareAlike 2.5 license (http://creativecommons.org/licenses/by-sa/2.5/) 5 6 Please credit frequency-decoder in any derivative work - thanks. 7 8 You are free: 9 10 * to copy, distribute, display, and perform the work 11 * to make derivative works 12 * to make commercial use of the work 13 14 Under the following conditions: 15 16 by Attribution. 17 -------------- 18 You must attribute the work in the manner specified by the author or licensor. 19 20 sa 21 -- 22 Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one. 23 24 * For any reuse or distribution, you must make clear to others the license terms of this work. 25 * Any of these conditions can be waived if you get permission from the copyright holder. 26*/ 27var datePickerController; 28 29(function() { 30 31// Detect the browser language 32datePicker.languageinfo = navigator.language ? navigator.language : navigator.userLanguage; 33datePicker.languageinfo = datePicker.languageinfo ? datePicker.languageinfo.toLowerCase().replace(/-[a-z]+$/, "") : 'es'; 34 35// Load the appropriate language file 36var scriptFiles = document.getElementsByTagName('head')[0].getElementsByTagName('script'); 37var loc = scriptFiles[scriptFiles.length - 1].src.substr(0, scriptFiles[scriptFiles.length - 1].src.lastIndexOf("/")) + "/lang/" + datePicker.languageinfo + ".js"; 38 39 40 41// Defaults should the locale file not load 42datePicker.months = ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"]; 43datePicker.fullDay = ["Lunes","Martes","Miércoles","Jueves","Viernes","Sábado","Domingo"]; 44datePicker.titles = ["Mes anterior","Mes siguiente","Año anterior","Año siguiente", "Hoy", "Ver Calendario"]; 45 46datePicker.getDaysPerMonth = function(nMonth, nYear) { 47 nMonth = (nMonth + 12) % 12; 48 return (((0 == (nYear%4)) && ((0 != (nYear%100)) || (0 == (nYear%400)))) && nMonth == 1) ? 29: [31,28,31,30,31,30,31,31,30,31,30,31][nMonth]; 49}; 50 51function datePicker(options) { 52 53 this.defaults = {}; 54 for(opt in options) { this[opt] = this.defaults[opt] = options[opt]; }; 55 56 this.date = new Date(); 57 this.yearinc = 1; 58 this.timer = null; 59 this.pause = 1000; 60 this.timerSet = false; 61 this.fadeTimer = null; 62 this.interval = new Date(); 63 this.firstDayOfWeek = this.defaults.firstDayOfWeek = this.dayInc = this.monthInc = this.yearInc = this.opacity = this.opacityTo = 0; 64 this.dateSet = null; 65 this.visible = false; 66 this.disabledDates = []; 67 this.enabledDates = []; 68 this.nbsp = String.fromCharCode( 160 ); 69 var o = this; 70 71 o.events = { 72 onblur:function(e) { 73 o.removeKeyboardEvents(); 74 }, 75 onfocus:function(e) { 76 o.addKeyboardEvents(); 77 }, 78 onkeydown: function (e) { 79 o.stopTimer(); 80 if(!o.visible) return false; 81 82 if(e == null) e = document.parentWindow.event; 83 var kc = e.keyCode ? e.keyCode : e.charCode; 84 85 if( kc == 13 ) { 86 // close (return) 87 var td = document.getElementById(o.id + "-date-picker-hover"); 88 if(!td || td.className.search(/out-of-range|day-disabled/) != -1) return o.killEvent(e); 89 o.returnFormattedDate(); 90 o.hide(); 91 return o.killEvent(e); 92 } else if(kc == 27) { 93 // close (esc) 94 o.hide(); 95 return o.killEvent(e); 96 }
96 else if(kc == 32 || kc == 0) { 97 // today (space) 98 o.date = new Date(); 99 o.updateTable(); 100 return o.killEvent(e); 101 }; 102 103 // Internet Explorer fires the keydown event faster than the JavaScript engine can 104 // update the interface. The following attempts to fix this. 105 /*@cc_on 106 @if(@_win32) 107 if(new Date().getTime() - o.interval.getTime() < 100) return o.killEvent(e); 108 o.interval = new Date(); 109 @end 110 @*/ 111 112 if ((kc > 49 && kc < 56) || (kc > 97 && kc < 104)) { 113 if (kc > 96) kc -= (96-48); 114 kc -= 49; 115 o.firstDayOfWeek = (o.firstDayOfWeek + kc) % 7; 116 o.updateTable(); 117 return o.killEvent(e); 118 }; 119 120 if ( kc < 37 || kc > 40 ) return true; 121 122 var d = new Date( o.date ).valueOf(); 123 124 if ( kc == 37 ) { 125 // ctrl + left = previous month 126 if( e.ctrlKey ) { 127 d = new Date( o.date ); 128 d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth() - 1,d.getFullYear())) ); 129 d.setMonth( d.getMonth() - 1 ); 130 } else { 131 d = new Date( o.date.getFullYear(), o.date.getMonth(), o.date.getDate() - 1 ); 132 }; 133 } else if ( kc == 39 ) { 134 // ctrl + right = next month 135 if( e.ctrlKey ) { 136 d = new Date( o.date ); 137 d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth() + 1,d.getFullYear())) ); 138 d.setMonth( d.getMonth() + 1 ); 139 } else { 140 d = new Date( o.date.getFullYear(), o.date.getMonth(), o.date.getDate() + 1 ); 141 }; 142 } else if ( kc == 38 ) { 143 // ctrl + up = next year 144 if( e.ctrlKey ) { 145 d = new Date( o.date ); 146 d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth(),d.getFullYear() + 1)) ); 147 d.setFullYear( d.getFullYear() + 1 ); 148 } else { 149 d = new Date( o.date.getFullYear(), o.date.getMonth(), o.date.getDate() - 7 ); 150 }; 151 } else if ( kc == 40 ) { 152 // ctrl + down = prev year 153 if( e.ctrlKey ) { 154 d = new Date( o.date ); 155 d.setDate( Math.min(d.getDate(), datePicker.getDaysPerMonth(d.getMonth(),d.getFullYear() - 1)) ); 156 d.setFullYear( d.getFullYear() - 1 ); 157 } else { 158 d = new Date( o.date.getFullYear(), o.date.getMonth(), o.date.getDate() + 7 ); 159 }; 160 }; 161 162 var tmpDate = new Date(d); 163 164 if(o.outOfRange(tmpDate)) return o.killEvent(e); 165 166 var cacheDate = new Date(o.date); 167 o.date = tmpDate; 168 169 if(cacheDate.getFullYear() != o.date.getFullYear() || cacheDate.getMonth() != o.date.getMonth()) o.updateTable(); 170 else { 171 o.disableTodayButton(); 172 var tds = o.table.getElementsByTagName('td'); 173 var txt; 174 var start = o.date.getDate() - 6; 175 if(start < 0) start = 0; 176 177 for(var i = start, td; td = tds[i]; i++) { 178 txt = Number(td.firstChild.nodeValue); 179 if(isNaN(txt) || txt != o.date.getDate()) continue; 180 o.removeHighlight(); 181 td.id = o.id + "-date-picker-hover"; 182 td.className = td.className.replace(/date-picker-hover/g, "") + " date-picker-hover"; 183 }; 184 }; 185 return o.killEvent(e); 186 }, 187 gotoToday: function(e) { 188 o.date = new Date(); 189 o.updateTable(); 190 return o.killEvent(e); 191 }, 192 onmousedown: function(e) { 193 if ( e == null ) e = document.parentWindow.event; 194 var el = e.target != null ? e.target : e.srcElement; 195 196 var found = false;
197 while(el.parentNode) { 198 if(el.id && (el.id == "fd-"+o.id || el.id == "fd-but-"+o.id)) { 199 found = true; 200 break; 201 }; 202 try { 203 el = el.parentNode; 204 } catch(err) { 205 break; 206 }; 207 }; 208 if(found) return true; 209 o.stopTimer(); 210 datePickerController.hideAll(); 211 }, 212 onmouseover: function(e) { 213 o.stopTimer(); 214 var txt = this.firstChild.nodeValue; 215 if(this.className == "out-of-range" || txt.search(/^[\d]+$/) == -1) return; 216 217 o.removeHighlight(); 218 219 this.id = o.id+"-date-picker-hover"; 220 this.className = this.className.replace(/date-picker-hover/g, "") + " date-picker-hover"; 221 222 o.date.setDate(this.firstChild.nodeValue); 223 o.disableTodayButton(); 224 }, 225 onclick: function(e) { 226 if(o.opacity != o.opacityTo || this.className.search(/out-of-range|day-disabled/) != -1) return false; 227 if ( e == null ) e = document.parentWindow.event; 228 var el = e.target != null ? e.target : e.srcElement; 229 while ( el.nodeType != 1 ) el = el.parentNode; 230 var d = new Date( o.date ); 231 var txt = el.firstChild.data; 232 if(txt.search(/^[\d]+$/) == -1) return; 233 var n = Number( txt ); 234 if(isNaN(n)) { return true; }; 235 d.setDate( n ); 236 o.date = d; 237 o.returnFormattedDate(); 238 if(!o.staticPos) o.hide(); 239 o.stopTimer(); 240 return o.killEvent(e); 241 }, 242 incDec: function(e) { 243 if ( e == null ) e = document.parentWindow.event; 244 var el = e.target != null ? e.target : e.srcElement; 245 246 if(el && el.className && el.className.search('fd-disabled') != -1) { return false; } 247 datePickerController.addEvent(document, "mouseup", o.events.clearTimer); 248 o.timerInc = 800; 249 o.dayInc = arguments[1]; 250 o.yearInc = arguments[2]; 251 o.monthInc = arguments[3]; 252 o.timerSet = true; 253 254 o.updateTable(); 255 return true; 256 }, 257 clearTimer: function(e) { 258 o.stopTimer(); 259 o.timerInc = 1000; 260 o.yearInc = 0; 261 o.monthInc = 0; 262 o.dayInc = 0; 263 datePickerController.removeEvent(document, "mouseup", o.events.clearTimer); 264 } 265 }; 266 o.stopTimer = function() { 267 o.timerSet = false; 268 window.clearTimeout(o.timer); 269 }; 270 o.removeHighlight = function() { 271 if(document.getElementById(o.id+"-date-picker-hover")) { 272 document.getElementById(o.id+"-date-picker-hover").className = document.getElementById(o.id+"-date-picker-hover").className.replace("date-picker-hover", ""); 273 document.getElementById(o.id+"-date-picker-hover").id = ""; 274 }; 275 }; 276 o.reset = function() { 277 for(def in o.defaults) { o[def] = o.defaults[def]; }; 278 }; 279 o.setOpacity = function(op) { 280 o.div.style.opacity = op/100; 281 o.div.style.filter = 'alpha(opacity=' + op + ')'; 282 o.opacity = op; 283 }; 284 o.fade = function() { 285 window.clearTimeout(o.fadeTimer); 286 o.fadeTimer = null; 287 delete(o.fadeTimer); 288 289 var diff = Math.round(o.opacity + ((o.opacityTo - o.opacity) / 4)); 290 291 o.setOpacity(diff); 292 293 if(Math.abs(o.opacityTo - diff) > 3 && !o.noTransparency) { 294 o.fadeTimer = window.setTimeout(o.fade, 50); 295 } else { 296 o.setOpacity(o.opacityTo); 297 if(o.opacityTo == 0) { 298 o.div.style.display = "none"; 299 o.visible = false;
300 } else { 301 o.visible = true; 302 }; 303 }; 304 }; 305 o.killEvent = function(e) { 306 e = e || document.parentWindow.event; 307 308 if(e.stopPropagation) { 309 e.stopPropagation(); 310 e.preventDefault(); 311 }; 312 313 /*@cc_on 314 @if(@_win32) 315 e.cancelBubble = true; 316 e.returnValue = false; 317 @end 318 @*/ 319 return false; 320 }; 321 o.getElem = function() { 322 return document.getElementById(o.id.replace(/^fd-/, '')) || false; 323 }; 324 o.setRangeLow = function(range) { 325 if(String(range).search(/^(\d\d?\d\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/) == -1) range = ''; 326 o.low = o.defaults.low = range; 327 if(o.staticPos) o.updateTable(true); 328 }; 329 o.setRangeHigh = function(range) { 330 if(String(range).search(/^(\d\d?\d\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])$/) == -1) range = ''; 331 o.high = o.defaults.high = range; 332 if(o.staticPos) o.updateTable(true); 333 }; 334 o.setDisabledDays = function(dayArray) { 335 o.disableDays = o.defaults.disableDays = dayArray; 336 if(o.staticPos) o.updateTable(true); 337 }; 338 o.setDisabledDates = function(dateArray) { 339 var fin = []; 340 for(var i = dateArray.length; i-- ;) { 341 if(dateArray[i].match(/^(\d\d\d\d|\*\*\*\*)(0[1-9]|1[012]|\*\*)(0[1-9]|[12][0-9]|3[01])$/) != -1) fin[fin.length] = dateArray[i]; 342 }; 343 if(fin.length) { 344 o.disabledDates = fin; 345 o.enabledDates = []; 346 if(o.staticPos) o.updateTable(true); 347 }; 348 }; 349 o.setEnabledDates = function(dateArray) { 350 var fin = []; 351 for(var i = dateArray.length; i-- ;) { 352 if(dateArray[i].match(/^(\d\d\d\d|\*\*\*\*)(0[1-9]|1[012]|\*\*)(0[1-9]|[12][0-9]|3[01]|\*\*)$/) != -1 && dateArray[i] != "********") fin[fin.length] = dateArray[i]; 353 }; 354 if(fin.length) { 355 o.disabledDates = []; 356 o.enabledDates = fin; 357 if(o.staticPos) o.updateTable(true); 358 }; 359 }; 360 o.getDisabledDates = function(y, m) { 361 if(o.enabledDates.length) return o.getEnabledDates(y, m); 362 var obj = {}; 363 var d = datePicker.getDaysPerMonth(m - 1, y); 364 m = m < 10 ? "0" + String(m) : m; 365 for(var i = o.disabledDates.length; i-- ;) { 366 var tmp = o.disabledDates[i].replace("****", y).replace("**", m); 367 if(tmp < Number(String(y)+m+"01") || tmp > Number(y+String(m)+d)) continue; 368 obj[tmp] = 1; 369 }; 370 return obj; 371 }; 372 o.getEnabledDates = function(y, m) { 373 var obj = {}; 374 var d = datePicker.getDaysPerMonth(m - 1, y); 375 m = m < 10 ? "0" + String(m) : m; 376 var day,tmp,de,me,ye,disabled; 377 for(var dd = 1; dd <= d; dd++) { 378 day = dd < 10 ? "0" + String(dd) : dd; 379 disabled = true; 380 for(var i = o.enabledDates.length; i-- ;) { 381 tmp = o.enabledDates[i]; 382 ye = String(o.enabledDates[i]).substr(0,4); 383 me = String(o.enabledDates[i]).substr(4,2); 384 de = String(o.enabledDates[i]).substr(6,2); 385 386 if(ye == y && me == m && de == day) { 387 disabled = false; 388 break; 389 } 390 391 if(ye == "****" || me == "**" || de == "**") { 392 if(ye == "****") tmp = tmp.replace(/^\*\*\*\*/, y); 393 if(me == "**") tmp = tmp = tmp.substr(0,4) + String(m) + tmp.substr(6,2); 394 if(de == "**") tmp = tmp.replace(/\*\*/, day); 395 396 if(tmp == String(y + String(m) + day)) { 397 disabled = false;
398 break; 399 }; 400 }; 401 }; 402 if(disabled) obj[String(y + String(m) + day)] = 1; 403 }; 404 return obj; 405 }; 406 o.setFirstDayOfWeek = function(e) { 407 if ( e == null ) e = document.parentWindow.event; 408 var elem = e.target != null ? e.target : e.srcElement; 409 if(elem.tagName.toLowerCase() != "th") { 410 while(elem.tagName.toLowerCase() != "th") elem = elem.parentNode; 411 }; 412 var cnt = 0; 413 while(elem.previousSibling) { 414 elem = elem.previousSibling; 415 if(elem.tagName.toLowerCase() == "th") cnt++; 416 }; 417 o.firstDayOfWeek = (o.firstDayOfWeek + cnt) % 7; 418 o.updateTableHeaders(); 419 return o.killEvent(e); 420 }; 421 o.truePosition = function(element) { 422 var pos = o.cumulativeOffset(element); 423 if(window.opera) { return pos; } 424 var iebody = (document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body; 425 var dsocleft = document.all ? iebody.scrollLeft : window.pageXOffset; 426 var dsoctop = document.all ? iebody.scrollTop : window.pageYOffset; 427 var posReal = o.realOffset(element); 428 return [pos[0] - posReal[0] + dsocleft, pos[1] - posReal[1] + dsoctop]; 429 }; 430 o.realOffset = function(element) { 431 var t = 0, l = 0; 432 do { 433 t += element.scrollTop || 0; 434 l += element.scrollLeft || 0; 435 element = element.parentNode; 436 } while (element); 437 return [l, t]; 438 }; 439 o.cumulativeOffset = function(element) { 440 var t = 0, l = 0; 441 do { 442 t += element.offsetTop || 0; 443 l += element.offsetLeft || 0; 444 element = element.offsetParent; 445 } while (element); 446 return [l, t]; 447 }; 448 o.resize = function() { 449 if(!o.created || !o.getElem()) return; 450 451 o.div.style.visibility = "hidden"; 452 if(!o.staticPos) { o.div.style.left = o.div.style.top = "0px"; } 453 o.div.style.display = "block"; 454 455 var osh = o.div.offsetHeight; 456 var osw = o.div.offsetWidth; 457 458 o.div.style.visibility = "visible"; 459 o.div.style.display = "none"; 460 461 if(!o.staticPos) { 462 var elem = document.getElementById('fd-but-' + o.id); 463 var pos = o.truePosition(elem); 464 var trueBody = (document.compatMode && document.compatMode!="BackCompat") ? document.documentElement : document.body; 465 var scrollTop = window.devicePixelRatio || window.opera ? 0 : trueBody.scrollTop; 466 var scrollLeft = window.devicePixelRatio || window.opera ? 0 : trueBody.scrollLeft; 467 468 if(parseInt(trueBody.clientWidth+scrollLeft) < parseInt(osw+pos[0])) { 469 o.div.style.left = Math.abs(parseInt((trueBody.clientWidth+scrollLeft) - osw)) + "px"; 470 } else { 471 o.div.style.left = pos[0] + "px"; 472 }; 473 474 if(parseInt(trueBody.clientHeight+scrollTop) < parseInt(osh+pos[1]+elem.offsetHeight+2)) { 475 o.div.style.top = Math.abs(parseInt(pos[1] - (osh + 2))) + "px"; 476 } else { 477 o.div.style.top = Math.abs(parseInt(pos[1] + elem.offsetHeight + 2)) + "px"; 478 }; 479 }; 480 /*@cc_on 481 @if(@_jscript_version <= 5.6) 482 if(o.staticPos) return; 483 o.iePopUp.style.top = o.div.style.top; 484 o.iePopUp.style.left = o.div.style.left; 485 o.iePopUp.style.width = osw + "px"; 486 o.iePopUp.style.height = (osh - 2) + "px"; 487 @end 488 @*/ 489 }; 490 o.equaliseDates = function() { 491 var clearDayFound = false;
492 var tmpDate; 493 for(var i = o.low; i <= o.high; i++) { 494 tmpDate = String(i); 495 if(!o.disableDays[new Date(tmpDate.substr(0,4), tmpDate.substr(6,2), tmpDate.substr(4,2)).getDay() - 1]) { 496 clearDayFound = true; 497 break; 498 }; 499 }; 500 if(!clearDayFound) o.disableDays = o.defaults.disableDays = [0,0,0,0,0,0,0]; 501 }; 502 o.outOfRange = function(tmpDate) { 503 if(!o.low && !o.high) return false; 504 505 var level = false; 506 if(!tmpDate) { 507 level = true; 508 tmpDate = o.date; 509 }; 510 511 var d = (tmpDate.getDate() < 10) ? "0" + tmpDate.getDate() : tmpDate.getDate(); 512 var m = ((tmpDate.getMonth() + 1) < 10) ? "0" + (tmpDate.getMonth() + 1) : tmpDate.getMonth() + 1; 513 var y = tmpDate.getFullYear(); 514 var dt = String(y)+String(m)+String(d); 515 516 if(o.low && parseInt(dt) < parseInt(o.low)) { 517 if(!level) return true; 518 o.date = new Date(o.low.substr(0,4), o.low.substr(4,2)-1, o.low.substr(6,2), 5, 0, 0); 519 return false; 520 }; 521 if(o.high && parseInt(dt) > parseInt(o.high)) { 522 if(!level) return true; 523 o.date = new Date( o.high.substr(0,4), o.high.substr(4,2)-1, o.high.substr(6,2), 5, 0, 0); 524 }; 525 return false; 526 }; 527 o.createButton = function() { 528 if(o.staticPos) { return; }; 529 530 var but; 531 532 if(!document.getElementById("fd-but-" + o.id)) { 533 var inp = o.getElem(); 534 535 but = document.createElement('a'); 536 but.href = "#"; 537 538 var span = document.createElement('span'); 539 span.appendChild(document.createTextNode(String.fromCharCode( 160 ))); 540 541 but.className = "date-picker-control"; 542 but.title = (typeof(fdLocale) == "object" && options.locale && fdLocale.titles.length > 5) ? fdLocale.titles[5] : ""; 543 544 but.id = "fd-but-" + o.id; 545 but.appendChild(span); 546 547 //if(inp.nextSibling) { 548 // inp.parentNode.insertBefore(but, inp.nextSibling); 549 //} else { 550 inp.parentNode.appendChild(but); 551 //}; 552 } else { 553 but = document.getElementById("fd-but-" + o.id); 554 }; 555 556 but.onclick = but.onpress = function(e) { 557 e = e || window.event; 558 var inpId = this.id.replace('fd-but-',''); 559 try { var dp = datePickerController.getDatePicker(inpId); } catch(err) { return false; }; 560 561 if(e.type == "press") { 562 var kc = e.keyCode != null ? e.keyCode : e.charCode; 563 if(kc != 13) { return true; }; 564 if(dp.visible) { 565 hideAll(); 566 return false; 567 }; 568 }; 569 570 if(!dp.visible) { 571 datePickerController.hideAll(inpId); 572 dp.show(); 573 } else { 574 datePickerController.hideAll(); 575 }; 576 return false; 577 }; 578 but = null; 579 }, 580 o.create = function() { 581 582 function createTH(details) { 583 var th = document.createElement('th'); 584 if(details.thClassName) th.className = details.thClassName; 585 if(details.colspan) { 586 /*@cc_on 587 /*@if (@_win32) 588 th.setAttribute('colSpan',details.colspan); 589 @else @*/ 590 th.setAttribute('colspan',details.colspan); 591 /*@end 592 @*/ 593 }; 594 /*@cc_on 595 /*@if (@_win32) 596 th.unselectable = "on"; 597 /*@end@*/ 598 return th; 599 }; 600 601 function createThAndButton(tr, obj) { 602 for(var i = 0, details; details = obj[i]; i++) { 603 var th = createTH(details); 604 tr.appendChild(th); 605 var but = document.createElement('span'); 606 but.className = details.className; 607 but.id = o.id + details.id; 608 but.appendChild(document.createTextNode(details.text)); 609 but.title = details.title || ""; 610 if(details.onmousedown) but.onmousedown = details.onmousedown; 611 if(details.onclick) but.onclick = details.onclick; 612 if(details.onmouseout) but.onmouseout = details.onmouseout; 613 th.appendChild(but); 614 }; 615 }; 616 617 /*@cc_on 618 @if(@_jscript_version <= 5.6) 619 if(!document.getElementById("iePopUpHack")) { 620 o.iePopUp = document.createElement('iframe'); 621 o.iePopUp.src = "javascript:'<html></html>';"; 622 o.iePopUp.setAttribute('className','iehack'); 623 o.iePopUp.scrolling="no"; 624 o.iePopUp.frameBorder="0"; 625 o.iePopUp.name = o.iePopUp.id = "iePopUpHack"; 626 document.body.appendChild(o.iePopUp); 627 } else { 628 o.iePopUp = document.getElementById("iePopUpHack"); 629 }; 630 @end 631 @*/ 632 633 if(typeof(fdLocale) == "object" && o.locale) { 634 datePicker.titles = fdLocale.titles; 635 datePicker.months = fdLocale.months; 636 datePicker.fullDay = fdLocale.fullDay; 637 // Optional parameters 638 if(fdLocale.dayAbbr) datePicker.dayAbbr = fdLocale.dayAbbr; 639 if(fdLocale.firstDayOfWeek) o.firstDayOfWeek = o.defaults.firstDayOfWeek = fdLocale.firstDayOfWeek; 640 }; 641 642 o.div = document.createElement('div'); 643 o.div.style.zIndex = 9999; 644 o.div.id = "fd-"+o.id; 645 o.div.className = "datePicker"; 646 o.div.dir = "ltr"; 647 648 if(!o.staticPos) { 649 document.getElementsByTagName('body')[0].appendChild(o.div); 650 } else { 651 elem = o.getElem(); 652 if(!elem) { 653 o.div = null; 654 return; 655 }; 656 o.div.className += " staticDP"; 657 o.div.setAttribute("tabIndex", "0"); 658 o.div.onfocus = o.events.onfocus; 659 o.div.onblur = o.events.onblur; 660 elem.parentNode.insertBefore(o.div, elem.nextSibling); 661 if(o.hideInput && elem.type && elem.type == "text") elem.setAttribute("type", "hidden"); 662 }; 663 664 //var nbsp = String.fromCharCode( 160 ); 665 var tr, row, col, tableHead, tableBody; 666 667 //outerTable = document.createElement('table'); 668 //o.div.appendChild(outerTable); 669 670 //outerTr = document.createElement('tr'); 671 //outerTable.appendChild(outerTr); 672 673 //outerTd = document.createElement('td'); 674 //outerTr.appendChild(outerTd); 675 676 o.table = document.createElement('table'); 677 //outerTd.appendChild( o.table ); 678 o.div.appendChild(o.table); 679 680 tableHead = document.createElement('thead'); 681 o.table.appendChild( tableHead ); 682 683 tr = document.createElement('tr'); 684 tableHead.appendChild(tr); 685 686 // Title Bar 687 o.titleBar = createTH({thClassName:"date-picker-title", colspan:7}); 688 tr.appendChild( o.titleBar ); 689 tr = null; 690 691 var span = document.createElement('span'); 692 span.className = "month-display"; 693 o.titleBar.appendChild(span); 694 695 span = document.createElement('span'); 696 span.className = "year-display"; 697 o.titleBar.appendChild(span); 698 699 span = null; 700 701 tr = document.createElement('tr'); 702 tableHead.appendChild(tr); 703 704 createThAndButton(tr, [{className:"prev-but", id:"-prev-year-but", text:"\u00AB", title:datePicker.titles[2], onmousedown:function(e) { o.events.incDec(e,0,-1,0); }, onmouseout:o.events.clearTimer },{className:"prev-but", id:"-prev-month-but", text:"\u2039", title:datePicker.titles[0], onmousedown:function(e) { o.events.incDec(e,0,0,-1); }, onmouseout:o.events.clearTimer },{colspan:3, className:"today-but", id:"-today-but", text:datePicker.titles.length > 4 ? datePicker.titles[4] : "Today", onclick:o.events.gotoToday},{className:"next-but", id:"-next-month-but", text:"\u203A", title:datePicker.titles[1], onmousedown:function(e) { o.events.incDec(e,0,0,1); }, onmouseout:o.events.clearTimer },{className:"next-but", id:"-next-year-but", text:"\u00BB", title:datePicker.titles[3], onmousedown:function(e) { o.events.incDec(e,0,1,0); }, onmouseout:o.events.clearTimer }]); 705 706 tableBody = document.createElement('tbody'); 707 o.table.appendChild( tableBody ); 708 709 for(var rows = 0; rows < 7; rows++) { 710 row = document.createElement('tr'); 711 712 if(rows != 0) tableBody.appendChild(row); 713 else tableHead.appendChild(row); 714 715 for(var cols = 0; cols < 7; cols++) { 716 col = (rows == 0) ? document.createElement('th') : document.createElement('td'); 717 718 row.appendChild(col); 719 if(rows != 0) { 720 col.appendChild(document.createTextNode(o.nbsp)); 721 col.onmouseover = o.events.onmouseover; 722 col.onclick = o.events.onclick; 723 } else { 724 col.className = "date-picker-day-header"; 725 col.scope = "col"; 726 }; 727 col = null; 728 }; 729 row = null; 730 }; 731 732 // Table headers 733 var but; 734 var ths = o.table.getElementsByTagName('thead')[0].getElementsByTagName('tr')[2].getElementsByTagName('th'); 735 for ( var y = 0; y < 7; y++ ) { 736 if(y > 0) { 737 but = document.createElement("span"); 738 but.className = "fd-day-header"; 739 but.onclick = ths[y].onclick = o.setFirstDayOfWeek; 740 but.appendChild(document.createTextNode(o.nbsp)); 741 ths[y].appendChild(but); 742 but = null; 743 } else { 744 ths[y].appendChild(document.createTextNode(o.nbsp)); 745 }; 746 }; 747 748 o.ths = o.table.getElementsByTagName('thead')[0].getElementsByTagName('tr')[2].getElementsByTagName('th'); 749 o.trs = o.table.getElementsByTagName('tbody')[0].getElementsByTagName('tr'); 750 751 o.updateTableHeaders(); 752 753 tableBody = tableHead = tr = createThAndButton = createTH = null; 754 755 if(o.low && o.high && (o.high - o.low < 7)) { o.equaliseDates(); }; 756 757 o.created = true; 758 759 if(o.staticPos) { 760 var yyN = document.getElementById(o.id); 761 datePickerController.addEvent(yyN, "change", o.changeHandler); 762 if(o.splitDate) { 763 var mmN = document.getElementById(o.id+'-mm'); 764 var ddN = document.getElementById(o.id+'-dd'); 765 datePickerController.addEvent(mmN, "change", o.changeHandler); 766 datePickerController.addEvent(ddN, "change", o.changeHandler); 767 }; 768 769 o.show(); 770 } else { 771 o.createButton(); 772 o.resize(); 773 o.fade(); 774 }; 775 }; 776 o.changeHandler = function() { 777 o.setDateFromInput(); 778 o.updateTable(); 779 }; 780 o.setDateFromInput = function() { 781 function m2c(val) { 782 return String(val).length < 2 ? "00".substring(0, 2 - String(val).length) +
782String(val) : val; 783 }; 784 785 o.dateSet = null; 786 787 var elem = o.getElem(); 788 if(!elem) return; 789 790 if(!o.splitDate) { 791 var date = datePickerController.dateFormat(elem.value, o.format.search(/m-d-y/i) != -1); 792 } else { 793 var mmN = document.getElementById(o.id+'-mm'); 794 var ddN = document.getElementById(o.id+'-dd'); 795 var tm = parseInt(mmN.tagName.toLowerCase() == "input" ? mmN.value : mmN.options[mmN.selectedIndex].value, 10); 796 var td = parseInt(ddN.tagName.toLowerCase() == "input" ? ddN.value : ddN.options[ddN.selectedIndex].value, 10); 797 var ty = parseInt(elem.tagName.toLowerCase() == "input" ? elem.value : elem.options[elem.selectedIndex || 0].value, 10); 798 var date = datePickerController.dateFormat(tm + "/" + td + "/" + ty, true); 799 800// var elem2 = document.getElementById('evento_final'); 801// if(elem2 != null){ 802// var mmN2 = document.getElementById('evento_final-mm'); 803// var ddN2 = document.getElementById('evento_final-dd'); 804// var tm2 = parseInt(mmN2.tagName.toLowerCase() == "input" ? mmN2.value : mmN2.options[mmN2.selectedIndex].value, 10); 805// var td2 = parseInt(ddN2.tagName.toLowerCase() == "input" ? ddN2.value : ddN2.options[ddN2.selectedIndex].value, 10); 806// var ty2 = parseInt(elem2.tagName.toLowerCase() == "input" ? elem2.value : elem2.options[elem2.selectedIndex || 0].value, 10); 807// } 808 809 }; 810 811 var badDate = false; 812 if(!date) { 813 badDate = true; 814 date = String(new Date().getFullYear()) + m2c(new Date().getMonth()+1) + m2c(new Date().getDate()); 815 }; 816 817 var d,m,y; 818 y = Number(date.substr(0, 4)); 819 m = Number(date.substr(4, 2)) - 1; 820 d = Number(date.substr(6, 2)); 821 822 var dpm = datePicker.getDaysPerMonth(m, y); 823 if(d > dpm) d = dpm; 824 825 if(new Date(y, m, d) == 'Invalid Date' || new Date(y, m, d) == 'NaN') { 826 badDate = true; 827 o.date = new Date(); 828 o.date.setHours(5); 829 return; 830 }; 831 832 o.date = new Date(y, m, d); 833 o.date.setHours(5); 834 835 if(!badDate) o.dateSet = new Date(o.date); 836 m2c = null; 837 }; 838 o.setSelectIndex = function(elem, indx) { 839 var len = elem.options.length; 840 indx = Number(indx); 841 for(var opt = 0; opt < len; opt++) { 842 if(elem.options[opt].value == indx) { 843 elem.selectedIndex = opt; 844 return; 845 }; 846 }; 847 }, 848 o.returnFormattedDate = function() { 849 850 var elem = o.getElem(); 851 if(!elem) return; 852 853 var d = (o.date.getDate() < 10) ? "0" + o.date.getDate() : o.date.getDate(); 854 var m = ((o.date.getMonth() + 1) < 10) ? "0" + (o.date.getMonth() + 1) : o.date.getMonth() + 1; 855 var yyyy = o.date.getFullYear(); 856 var disabledDates = o.getDisabledDates(yyyy, m); 857 var weekDay = ( o.date.getDay() + 6 ) % 7; 858 859 if(!(o.disableDays[weekDay] || String(yyyy)+m+d in disabledDates)) { 860 861 if(o.splitDate) { 862 var ddE = document.getElementById(o.id+"-dd"); 863 var mmE = document.getElementById(o.id+"-mm"); 864 865 if(ddE.tagName.toLowerCase() == "input") { ddE.value = d; } 866 else { o.setSelectIndex(ddE, d); /*ddE.selectedIndex = d - 1;*/ }; 867 868 if(mmE.tagName.toLowerCase() == "input") { mmE.value = m; } 869 else { o.setSelectIndex(mmE, m); /*mmE.selectedIndex = m - 1;*/ }; 870 871 if(elem.tagName.toLowerCase() == "input") elem.value = yyyy; 872 else { 873 o.setSelectIndex(elem, yyyy); /* 874 for(var opt = 0; opt < elem.options.length; opt++) { 875 if(elem.options[opt].value == yyyy) { 876 elem.selectedIndex = opt; 877 break; 878 }; 879 }; 880 */ 881 }; 882 var elem2 = document.getElementById('evento_final_preview'); 883 if(elem2 != null && o.id && o.id =='evento_inicio'){ 884 var ddE2 = document.getElementById("evento_final-dd_preview"); 885 var mmE2 = document.getElementById("evento_final-mm_preview"); 886 ddE2.innerHTML = d; 887 mmE2.innerHTML = m; 888 elem2.innerHTML = yyyy; 889 890 ddE2 = document.getElementById("evento_final-dd"); 891 mmE2 = document.getElementById("evento_final-mm"); 892 elem2 = document.getElementById('evento_final'); 893 ddE2.value = d; 894 mmE2.value = m; 895 elem2.value = yyyy; 896 }; 897 } else { 898 elem.value = o.format.replace('y',yyyy).replace('m',m).replace('d',d).replace(/-/g,o.divider); 899 }; 900 // HACK: Falla en IEx 901// if(!elem.type || elem.type && elem.type != "hidden"){ elem.focus(); } 902 if(o.staticPos) { 903 o.dateSet = new Date( o.date ); 904 o.updateTable(); 905 }; 906 907 // Programmatically fire the onchange event 908 if(document.createEvent) { 909 var onchangeEvent = document.createEvent('HTMLEvents'); 910 onchangeEvent.initEvent('change', true, false); 911 elem.dispatchEvent(onchangeEvent); 912 } else if(document.createEventObject) { 913 elem.fireEvent('onchange'); 914 }; 915 }; 916 }; 917 o.disableTodayButton = function() { 918 var today = new Date(); 919 document.getElementById(o.id + "-today-but").className = document.getElementById(o.id + "-today-but").className.replace("fd-disabled", ""); 920 if(o.outOfRange(today) || (o.date.getDate() == today.getDate() && o.date.getMonth() == today.getMonth() && o.date.getFullYear() == today.getFullYear())) { 921 document.getElementById(o.id + "-today-but").className += " fd-disabled"; 922 document.getElementById(o.id + "-today-but").onclick = null; 923 } else { 924 document.getElementById(o.id + "-today-but").onclick = o.events.gotoToday; 925 }; 926 }; 927 o.updateTableHeaders = function() { 928 var d, but; 929 var ths = o.ths; 930 for ( var y = 0; y < 7; y++ ) {
931 d = (o.firstDayOfWeek + y) % 7; 932 ths[y].title = datePicker.fullDay[d]; 933 934 if(y > 0) { 935 but = ths[y].getElementsByTagName("span")[0]; 936 but.removeChild(but.firstChild); 937 but.appendChild(document.createTextNode(datePicker.dayAbbr ? datePicker.dayAbbr[d] : datePicker.fullDay[d].charAt(0))); 938 but.title = datePicker.fullDay[d]; 939 but = null; 940 } else { 941 ths[y].removeChild(ths[y].firstChild); 942 ths[y].appendChild(document.createTextNode(datePicker.dayAbbr ? datePicker.dayAbbr[d] : datePicker.fullDay[d].charAt(0))); 943 }; 944 }; 945 o.updateTable(); 946 }; 947 948 o.updateTable = function(noCallback) { 949 950 if(o.timerSet) { 951 var d = new Date(o.date); 952 d.setDate( Math.min(d.getDate()+o.dayInc, datePicker.getDaysPerMonth(d.getMonth()+o.monthInc,d.getFullYear()+o.yearInc)) ); 953 d.setMonth( d.getMonth() + o.monthInc ); 954 d.setFullYear( d.getFullYear() + o.yearInc ); 955 o.date = d; 956 }; 957 958 if(!noCallback && "onupdate" in datePickerController && typeof(datePickerController.onupdate) == "function") datePickerController.onupdate(o); 959 960 o.outOfRange(); 961 o.disableTodayButton(); 962 963 // Set the tmpDate to the second day of this month (to avoid daylight savings time madness on Windows) 964 var tmpDate = new Date( o.date.getFullYear(), o.date.getMonth(), 2 ); 965 tmpDate.setHours(5); 966 967 var tdm = tmpDate.getMonth(); 968 var tdy = tmpDate.getFullYear(); 969 970 // Do the disableDates for this year and month 971 var disabledDates = o.getDisabledDates(o.date.getFullYear(), o.date.getMonth() + 1); 972 973 var today = new Date(); 974 975 // Previous buttons out of range 976 var b = document.getElementById(o.id + "-prev-year-but"); 977 b.className = b.className.replace("fd-disabled", ""); 978 if(o.outOfRange(new Date((tdy - 1), Number(tdm), datePicker.getDaysPerMonth(Number(tdm), tdy-1)))) { 979 b.className += " fd-disabled"; 980 if(o.yearInc == -1) o.stopTimer(); 981 }; 982 983 b = document.getElementById(o.id + "-prev-month-but") 984 b.className = b.className.replace("fd-disabled", ""); 985 if(o.outOfRange(new Date(tdy, (Number(tdm) - 1), datePicker.getDaysPerMonth(Number(tdm)-1, tdy)))) { 986 b.className += " fd-disabled"; 987 if(o.monthInc == -1) o.stopTimer(); 988 }; 989 990 // Next buttons out of range 991 b= document.getElementById(o.id + "-next-year-but") 992 b.className = b.className.replace("fd-disabled", ""); 993 if(o.outOfRange(new Date((tdy + 1), Number(tdm), 1))) { 994 b.className += " fd-disabled"; 995 if(o.yearInc == 1) o.stopTimer(); 996 }; 997 998 b = document.getElementById(o.id + "-next-month-but") 999 b.className = b.className.replace("fd-disabled", ""); 1000 if(o.outOfRange(new Date(tdy, Number(tdm) + 1, 1))) { 1001 b.className += " fd-disabled"; 1002 if(o.monthInc == 1) o.stopTimer(); 1003 }; 1004 1005 b = null; 1006 1007 var cd = o.date.getDate(); 1008 var cm = o.date.getMonth(); 1009 var cy = o.date.getFullYear(); 1010 1011 // Title Bar 1012 var span = o.titleBar.getElementsByTagName("span"); 1013 while(span[0].firstChild) span[0].removeChild(span[0].firstChild); 1014 while(span[1].firstChild) span[1].removeChild(span[1].firstChild); 1015 span[0].appendChild(document.createTextNode(datePicker.months[cm] + o.nbsp)); 1016 span[1].appendChild(document.createTextNode(cy)); 1017 1018 tmpDate.setDate( 1 ); 1019 1020 var dt, cName, td, tds, i; 1021 var weekDay = ( tmpDate.getDay() + 6 ) % 7; 1022 var firstColIndex = (( (weekDay - o.firstDayOfWeek) + 7 ) % 7) - 1; 1023 var dpm = datePicker.getDaysPerMonth(cm, cy); 1024 1025 var todayD = today.getDate(); 1026 var todayM = today.getMonth(); 1027 var todayY = today.getFullYear(); 1028 1029 var c = "class"; 1030 /*@cc_on 1031 @if(@_win32) 1032 c = "className"; 1033 @end 1034 @*/ 1035 1036 var stub = String(tdy) + (String(tdm+1).length < 2 ? "0" + (tdm+1) : tdm+1); 1037 1038 for(var row = 0; row < 6; row++) { 1039 1040 tds = o.trs[row].getElementsByTagName('td'); 1041 1042 for(var col = 0; col < 7; col++) { 1043 1044 td = tds[col]; 1045 td.removeChild(td.firstChild); 1046 1047 td.setAttribute("id", ""); 1048 td.setAttribute("title", ""); 1049 1050 i = (row * 7) + col; 1051 1052 if(i > firstColIndex && i <= (firstColIndex + dpm)) { 1053 dt = i - firstColIndex; 1054 1055 tmpDate.setDate(dt); 1056 td.appendChild(document.createTextNode(dt)); 1057 1058 if(o.outOfRange(tmpDate)) { 1059 td.setAttribute(c, "out-of-range"); 1060 } else { 1061 1062 cName = []; 1063 weekDay = ( tmpDate.getDay() + 6 ) % 7; 1064 1065 if(dt == todayD && tdm == todayM && tdy == todayY) { 1066 cName.push("date-picker-today"); 1067 }; 1068 1069 if(o.dateSet != null && o.dateSet.getDate() == dt && o.dateSet.getMonth() == tdm && o.dateSet.getFullYear() == tdy) { 1070 cName.push("date-picker-selected-date"); 1071 }; 1072 1073 if(o.disableDays[weekDay] || stub + String(dt < 10 ? "0" + dt : dt) in disabledDates) { 1074 cName.push("day-disabled"); 1075 } else if(o.highlightDays[weekDay]) { 1076 cName.push("date-picker-highlight"); 1077 }; 1078 1079 if(cd == dt) { 1080 td.setAttribute("id", o.id + "-date-picker-hover"); 1081 cName.push("date-picker-hover"); 1082 }; 1083 1084 cName.push("dm-" + dt + '-' + (tdm + 1) + " " + " dmy-" + dt + '-' + (tdm + 1) + '-' + tdy); 1085 td.setAttribute(c, cName.join(' ')); 1086 td.setAttribute("title", datePicker.months[cm] + o.nbsp + dt + "," + o.nbsp + cy); 1087 }; 1088 } else { 1089 td.appendChild(document.createTextNode(o.nbsp)); 1090 td.setAttribute(c, "date-picker-unused"); 1091 }; 1092 }; 1093 }; 1094 1095 if(o.timerSet) { 1096 o.timerInc = 50 + Math.round(((o.timerInc - 50) / 1.8)); 1097 o.timer = window.setTimeout(o.updateTable, o.timerInc); 1098 }; 1099 }; 1100 o.addKeyboardEvents = function() { 1101 datePickerController.addEvent(document, "keypress", o.events.onkeydown); 1102 /*@cc_on 1103 @if(@_win32) 1104 datePickerController.removeEvent(document, "keypress", o.events.onkeydown); 1105 datePickerController.addEvent(document, "keydown", o.events.onkeydown); 1106 @end 1107 @*/ 1108 if(window.devicePixelRatio) { 1109 datePickerController.removeEvent(document, "keypress", o.events.onkeydown); 1110 datePickerController.addEvent(document, "keydown", o.events.onkeydown); 1111 }; 1112 }; 1113 o.removeKeyboardEvents =function() { 1114 datePickerController.removeEvent(document, "keypress", o.events.onkeydown); 1115 datePickerController.removeEvent(document, "keydown", o.events.onkeydown); 1116 }; 1117 o.show = function() { 1118 var elem = o.getElem(); 1119 if(!elem || o.visible || elem.disabled) return; 1120 1121 o.reset(); 1122 o.setDateFromInput(); 1123 o.updateTable(); 1124 1125 if(!o.staticPos) o.resize(); 1126 1127 datePickerController.addEvent(o.staticPos ? o.table : document, "mousedown", o.events.onmousedown); 1128 1129 if(!o.staticPos) { o.addKeyboardEvents(); }; 1130 1131 o.opacityTo = o.noTransparency ? 99 : 90; 1132 o.div.style.display = "block"; 1133 /*@cc_on 1134 @if(@_jscript_version <= 5.6) 1135 if(!o.staticPos) o.iePopUp.style.display = "block"; 1136 @end 1137 @*/ 1138 1139 o.fade(); 1140 o.visible = true; 1141 }; 1142 o.hide = function() { 1143 if(!o.visible) return; 1144 o.stopTimer(); 1145 if(o.staticPos) return; 1146 1147 datePickerController.removeEvent(document, "mousedown", o.events.onmousedown); 1148 datePickerController.removeEvent(document, "mouseup", o.events.clearTimer); 1149 o.removeKeyboardEvents(); 1150 1151 /*@cc_on 1152 @if(@_jscript_version <= 5.6) 1153 o.iePopUp.style.display = "none"; 1154 @end 1155 @*/ 1156 1157 o.opacityTo = 0; 1158 o.fade(); 1159 o.visible = false;
1160 var elem = o.getElem(); 1161 // HACK: Falla en IEx 1162// if(!elem.type || elem.type && elem.type != "hidden") { elem.focus(); }; 1163 }; 1164 o.destroy = function() { 1165 // Cleanup for Internet Explorer 1166 datePickerController.removeEvent(o.staticPos ? o.table : document, "mousedown", o.events.onmousedown); 1167 datePickerController.removeEvent(document, "mouseup", o.events.clearTimer); 1168 o.removeKeyboardEvents(); 1169 1170 if(o.staticPos) { 1171 var yyN = document.getElementById(o.id); 1172 datePickerController.removeEvent(yyN, "change", o.changeHandler); 1173 if(o.splitDate) { 1174 var mmN = document.getElementById(o.id+'-mm'); 1175 var ddN = document.getElementById(o.id+'-dd'); 1176 1177 datePickerController.removeEvent(mmN, "change", o.changeHandler); 1178 datePickerController.removeEvent(ddN, "change", o.changeHandler); 1179 }; 1180 o.div.onfocus = o.div.onblur = null; 1181 }; 1182 1183 var ths = o.table.getElementsByTagName("th"); 1184 for(var i = 0, th; th = ths[i]; i++) { 1185 th.onmouseover = th.onmouseout = th.onmousedown = th.onclick = null; 1186 }; 1187 1188 var tds = o.table.getElementsByTagName("td"); 1189 for(var i = 0, td; td = tds[i]; i++) { 1190 td.onmouseover = td.onclick = null; 1191 }; 1192 1193 var butts = o.table.getElementsByTagName("span"); 1194 for(var i = 0, butt; butt = butts[i]; i++) { 1195 butt.onmousedown = butt.onclick = butt.onkeypress = null; 1196 }; 1197 1198 o.ths = o.trs = null; 1199 1200 clearTimeout(o.fadeTimer); 1201 clearTimeout(o.timer); 1202 o.fadeTimer = o.timer = null; 1203 1204 /*@cc_on 1205 @if(@_jscript_version <= 5.6) 1206 o.iePopUp = null; 1207 @end 1208 @*/ 1209 1210 if(!o.staticPos && document.getElementById(o.id.replace(/^fd-/, 'fd-but-'))) { 1211 var butt = document.getElementById(o.id.replace(/^fd-/, 'fd-but-')); 1212 butt.onclick = butt.onpress = null; 1213 }; 1214 1215 if(o.div && o.div.parentNode) { 1216 o.div.parentNode.removeChild(o.div); 1217 }; 1218 1219 o.titleBar = o.table = o.div = null; 1220 o = null; 1221 }; 1222 o.create(); 1223}; 1224 1225datePickerController = function() { 1226 var datePickers = {}; 1227 var uniqueId = 0; 1228 1229 var addEvent = function(obj, type, fn) { 1230 if( obj.attachEvent ) { 1231 obj["e"+type+fn] = fn; 1232 obj[type+fn] = function(){obj["e"+type+fn]( window.event );}; 1233 obj.attachEvent( "on"+type, obj[type+fn] ); 1234 } else { 1235 obj.addEventListener( type, fn, true ); 1236 }; 1237 }; 1238 var removeEvent = function(obj, type, fn) { 1239 try { 1240 if( obj.detachEvent ) { 1241 obj.detachEvent( "on"+type, obj[type+fn] ); 1242 obj[type+fn] = null; 1243 } else { 1244 obj.removeEventListener( type, fn, true ); 1245 }; 1246 } catch(err) {}; 1247 }; 1248 var hideAll = function(exception) { 1249 var dp; 1250 for(dp in datePickers) { 1251 if(!datePickers[dp].created || datePickers[dp].staticPos) continue; 1252 if(exception && exception == datePickers[dp].id) { continue; }; 1253 if(document.getElementById(datePickers[dp].id)) { datePickers[dp].hide(); }; 1254 }; 1255 }; 1256 var cleanUp = function() { 1257 var dp; 1258 for(dp in datePickers) { 1259 if(!document.getElementById(datePickers[dp].id)) { 1260 if(!datePickers[dp].created) continue; 1261 datePickers[dp].destroy(); 1262 datePickers[dp] = null; 1263 delete datePickers[dp]; 1264 }; 1265 }; 1266 }; 1267 var destroy = function() { 1268 for(dp in datePickers) { 1269 if(!datePickers[dp].created) continue; 1270 datePickers[dp].destroy(); 1271 datePickers[dp] = null; 1272 delete datePickers[dp]; 1273 }; 1274 datePickers = null; 1275 /*@cc_on 1276 @if(@_jscript_version <= 5.6) 1277 if(document.getElementById("iePopUpHack")) { 1278 document.body.removeChild(document.getElementById("iePopUpHack")); 1279 }; 1280 @end 1281 @*/ 1282 datePicker.script = null; 1283 removeEvent(window, 'load', datePickerController.create); 1284 removeEvent(window, 'unload', datePickerController.destroy); 1285 }; 1286 var dateFormat = function(dateIn, favourMDY) { 1287 var dateTest = [ 1288 { regExp:/^(0?[1-9]|[12][0-9]|3[01])([- \/.])(0?[1-9]|1[012])([- \/.])((\d\d)?\d\d)$/, d:1, m:3, y:5 }, // dmy 1289 { regExp:/^(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])([- \/.])((\d\d)?\d\d)$/, d:3, m:1, y:5 }, // mdy 1290 { regExp:/^(\d\d\d\d)([- \/.])(0?[1-9]|1[012])([- \/.])(0?[1-9]|[12][0-9]|3[01])$/, d:5, m:3, y:1 } // ymd 1291 ]; 1292 1293 var start; 1294 var cnt = 0; 1295 while(cnt < 3) { 1296 start = (cnt + (favourMDY ? 4 : 3)) % 3; 1297 if(dateIn.match(dateTest[start].regExp)) { 1298 res = dateIn.match(dateTest[start].regExp); 1299 y = res[dateTest[start].y]; 1300 m = res[dateTest[start].m]; 1301 d = res[dateTest[start].d]; 1302 if(m.length == 1) m = "0" + m; 1303 if(d.length == 1) d = "0" + d; 1304 if(y.length != 4) y = (parseInt(y) < 50) ? '20' + y : '19' + y; 1305 return String(y)+m+d; 1306 }; 1307 cnt++; 1308 }; 1309 return 0; 1310 }; 1311 var joinNodeLists = function() { 1312 if(!arguments.length) { return []; } 1313 var nodeList = []; 1314 for (var i = 0; i < arguments.length; i++) { 1315 for (var j = 0, item; item = arguments[i][j]; j++) { 1316 nodeList[nodeList.length] = item; 1317 }; 1318 }; 1319 return nodeList; 1320 }; 1321 var addDatePicker = function(inpId, options) { 1322 if(!(inpId in datePickers)) { 1323 datePickers[inpId] = new datePicker(options); 1324 }; 1325 }; 1326 var getDatePicker = function(inpId) { 1327 if(!(inpId in datePickers)) { throw "No datePicker has been created for the form element with an id of '" + inpId.toString() + "'"; }; 1328 return datePickers[inpId]; 1329 }; 1330 var grepRangeLimits = function(sel) { 1331 var range = []; 1332 for(var i = 0; i < sel.options.length; i++) { 1333 if(sel.options[i].value.search(/^\d\d\d\d$/) == -1) { continue; }; 1334 if(!range[0] || Number(sel.options[i].value) < range[0]) { range[0] = Number(sel.options[i].value); }; 1335 if(!range[1] || Number(sel.options[i].value) > range[1]) { range[1] = Number(sel.options[i].value); }; 1336 }; 1337 return range; 1338 }; 1339 var create = function(inp) { 1340 if(!(typeof document.createElement != "undefined" && typeof document.documentElement != "undefined" && typeof document.documentElement.offsetWidth == "number")) return; 1341 1342 var inputs = (inp && inp.tagName) ? [inp] : joinNodeLists(document.getElementsByTagName('input'), document.getElementsByTagName('select')); 1343 var regExp1 = /disable-days-([1-7]){1,6}/g; // the days to disable 1344 var regExp2 = /no-transparency/g; // do not use transparency effects 1345 var regExp3 = /highlight-days-([1-7]){1,7}/g; // the days to highlight in red 1346 var regExp4 = /range-low-(\d\d\d\d-\d\d-\d\d)/g; // the lowest selectable date 1347 var regExp5 = /range-high-(\d\d\d\d-\d\d-\d\d)/g; // the highest selectable date 1348 var regExp6 = /format-(d-m-y|m-d-y|y-m-d)/g; // the input/output date format 1349 var regExp7 = /divider-(dot|slash|space|dash)/g; // the character used to divide the date 1350 var regExp8 = /no-locale/g; // do not attempt to detect the browser language 1351 var regExp9 = /no-fade/g; // always show the datepicker 1352 var regExp10 = /hide-input/g; // hide the input 1353 1354 for(var i=0, inp;
1354 inp = inputs[i]; i++) { 1355 if(inp.className && (inp.className.search(regExp6) != -1 || inp.className.search(/split-date/) != -1) && ((inp.tagName.toLowerCase() == "input" && (inp.type == "text" || inp.type == "hidden")) || inp.tagName.toLowerCase() == "select")) { 1356 1357 if(inp.id && document.getElementById('fd-'+inp.id)) { continue; }; 1358 1359 if(!inp.id) { inp.id = "fdDatePicker-" + uniqueId++; }; 1360 1361 var options = { 1362 id:inp.id, 1363 low:"", 1364 high:"", 1365 divider:"/", 1366 format:"d-m-y", 1367 highlightDays:[0,0,0,0,0,1,1], 1368 disableDays:[0,0,0,0,0,0,0], 1369 locale:inp.className.search(regExp8) == -1, 1370 splitDate:0, 1371 noTransparency:inp.className.search(regExp2) != -1, 1372 staticPos:inp.className.search(regExp9) != -1, 1373 hideInput:inp.className.search(regExp10) != -1 1374 }; 1375 1376 if(!options.staticPos) { 1377 options.hideInput = false; 1378 } else { 1379 options.noTransparency = true; 1380 }; 1381 1382 // Split the date into three parts ? 1383 if(inp.className.search(/split-date/) != -1) { 1384 if(document.getElementById(inp.id+'-dd') && document.getElementById(inp.id+'-mm') && document.getElementById(inp.id+'-dd').tagName.search(/input|select/i) != -1 && document.getElementById(inp.id+'-mm').tagName.search(/input|select/i) != -1) { 1385 options.splitDate = 1; 1386 }; 1387 }; 1388 1389 // Date format(variations of d-m-y) 1390 if(inp.className.search(regExp6) != -1) { 1391 options.format = inp.className.match(regExp6)[0].replace('format-',''); 1392 }; 1393 1394 // What divider to use, a "/", "-", "." or " " 1395 if(inp.className.search(regExp7) != -1) { 1396 var dividers = { dot:".", space:" ", dash:"-", slash:"/" }; 1397 options.divider = (inp.className.search(regExp7) != -1 && inp.className.match(regExp7)[0].replace('divider-','') in dividers) ? dividers[inp.className.match(regExp7)[0].replace('divider-','')] : "/"; 1398 }; 1399 1400 // The days to highlight 1401 if(inp.className.search(regExp3) != -1) { 1402 var tmp = inp.className.match(regExp3)[0].replace(/highlight-days-/, ''); 1403 options.highlightDays = [0,0,0,0,0,0,0]; 1404 for(var j = 0; j < tmp.length; j++) { 1405 options.highlightDays[tmp.charAt(j) - 1] = 1; 1406 }; 1407 }; 1408 1409 // The days to disable 1410 if(inp.className.search(regExp1) != -1) { 1411 var tmp = inp.className.match(regExp1)[0].replace(/disable-days-/, ''); 1412 options.disableDays = [0,0,0,0,0,0,0]; 1413 for(var j = 0; j < tmp.length; j++) { 1414 options.disableDays[tmp.
1414charAt(j) - 1] = 1; 1415 }; 1416 }; 1417 1418 // The lower limit 1419 if(inp.className.search(/range-low-today/i) != -1) { 1420 options.low = datePickerController.dateFormat((new Date().getMonth() + 1) + "/" + new Date().getDate() + "/" + new Date().getFullYear(), true); 1421 } else if(inp.className.search(regExp4) != -1) { 1422 options.low = datePickerController.dateFormat(inp.className.match(regExp4)[0].replace(/range-low-/, ''), false); 1423 if(!options.low) { 1424 options.low = ''; 1425 }; 1426 }; 1427 1428 // The higher limit 1429 if(inp.className.search(/range-high-today/i) != -1 && inp.className.search(/range-low-today/i) == -1) { 1430 options.high = datePickerController.dateFormat((new Date().getMonth() + 1) + "/" + new Date().getDate() + "/" + new Date().getFullYear(), true); 1431 } else if(inp.className.search(regExp5) != -1) { 1432 options.high = datePickerController.dateFormat(inp.className.match(regExp5)[0].replace(/range-high-/, ''), false); 1433 if(!options.high) { 1434 options.high = ''; 1435 }; 1436 }; 1437 1438 // Always round lower & higher limits if a selectList involved 1439 if(inp.tagName.search(/select/i) != -1) { 1440 var range = grepRangeLimits(inp); 1441 options.low = options.low ? range[0] + String(options.low).substr(4,4) : datePickerController.dateFormat(range[0] + "/01/01"); 1442 options.high = options.high ? range[1] + String(options.low).substr(4,4) : datePickerController.dateFormat(range[1] + "/12/31"); 1443 }; 1444 1445 addDatePicker(inp.id, options); 1446 }; 1447 }; 1448 } 1449 1450 return { 1451 addEvent:addEvent, 1452 removeEvent:removeEvent, 1453 create:create, 1454 destroy:destroy, 1455 cleanUp:cleanUp, 1456 addDatePicker:addDatePicker, 1457 getDatePicker:getDatePicker, 1458 dateFormat:dateFormat, 1459 datePickers:datePickers, 1460 hideAll:hideAll 1461 }; 1462}(); 1463 1464})(); 1465 1466datePickerController.addEvent(window, 'load', datePickerController.create); 1467datePickerController.addEvent(window, 'unload', datePickerController.destroy);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.