123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891 |
- /**
- *
- * Date picker
- * Author: Stefan Petre www.eyecon.ro
- *
- * Dual licensed under the MIT and GPL licenses
- *
- */
- (function ($) {
- var DatePicker = function () {
- var ids = {},
- views = {
- years: 'datepickerViewYears',
- moths: 'datepickerViewMonths',
- days: 'datepickerViewDays'
- },
- tpl = {
- wrapper: '<div class="datepicker"><div class="datepickerBorderT" /><div class="datepickerBorderB" /><div class="datepickerBorderL" /><div class="datepickerBorderR" /><div class="datepickerBorderTL" /><div class="datepickerBorderTR" /><div class="datepickerBorderBL" /><div class="datepickerBorderBR" /><div class="datepickerContainer"><table cellspacing="0" cellpadding="0"><tbody><tr></tr></tbody></table></div></div>',
- head: [
- '<td>',
- '<table cellspacing="0" cellpadding="0">',
- '<thead>',
- '<tr>',
- '<th class="datepickerGoPrev"><a href="#"><span><%=prev%></span></a></th>',
- '<th colspan="6" class="datepickerMonth"><a href="#"><span></span></a></th>',
- '<th class="datepickerGoNext"><a href="#"><span><%=next%></span></a></th>',
- '</tr>',
- '<tr class="datepickerDoW">',
- '<th><span><%=week%></span></th>',
- '<th><span><%=day1%></span></th>',
- '<th><span><%=day2%></span></th>',
- '<th><span><%=day3%></span></th>',
- '<th><span><%=day4%></span></th>',
- '<th><span><%=day5%></span></th>',
- '<th><span><%=day6%></span></th>',
- '<th><span><%=day7%></span></th>',
- '</tr>',
- '</thead>',
- '</table></td>'
- ],
- space : '<td class="datepickerSpace"><div></div></td>',
- days: [
- '<tbody class="datepickerDays">',
- '<tr>',
- '<th class="datepickerWeek"><a href="#"><span><%=weeks[0].week%></span></a></th>',
- '<td class="<%=weeks[0].days[0].classname%>"><a href="#"><span><%=weeks[0].days[0].text%></span></a></td>',
- '<td class="<%=weeks[0].days[1].classname%>"><a href="#"><span><%=weeks[0].days[1].text%></span></a></td>',
- '<td class="<%=weeks[0].days[2].classname%>"><a href="#"><span><%=weeks[0].days[2].text%></span></a></td>',
- '<td class="<%=weeks[0].days[3].classname%>"><a href="#"><span><%=weeks[0].days[3].text%></span></a></td>',
- '<td class="<%=weeks[0].days[4].classname%>"><a href="#"><span><%=weeks[0].days[4].text%></span></a></td>',
- '<td class="<%=weeks[0].days[5].classname%>"><a href="#"><span><%=weeks[0].days[5].text%></span></a></td>',
- '<td class="<%=weeks[0].days[6].classname%>"><a href="#"><span><%=weeks[0].days[6].text%></span></a></td>',
- '</tr>',
- '<tr>',
- '<th class="datepickerWeek"><a href="#"><span><%=weeks[1].week%></span></a></th>',
- '<td class="<%=weeks[1].days[0].classname%>"><a href="#"><span><%=weeks[1].days[0].text%></span></a></td>',
- '<td class="<%=weeks[1].days[1].classname%>"><a href="#"><span><%=weeks[1].days[1].text%></span></a></td>',
- '<td class="<%=weeks[1].days[2].classname%>"><a href="#"><span><%=weeks[1].days[2].text%></span></a></td>',
- '<td class="<%=weeks[1].days[3].classname%>"><a href="#"><span><%=weeks[1].days[3].text%></span></a></td>',
- '<td class="<%=weeks[1].days[4].classname%>"><a href="#"><span><%=weeks[1].days[4].text%></span></a></td>',
- '<td class="<%=weeks[1].days[5].classname%>"><a href="#"><span><%=weeks[1].days[5].text%></span></a></td>',
- '<td class="<%=weeks[1].days[6].classname%>"><a href="#"><span><%=weeks[1].days[6].text%></span></a></td>',
- '</tr>',
- '<tr>',
- '<th class="datepickerWeek"><a href="#"><span><%=weeks[2].week%></span></a></th>',
- '<td class="<%=weeks[2].days[0].classname%>"><a href="#"><span><%=weeks[2].days[0].text%></span></a></td>',
- '<td class="<%=weeks[2].days[1].classname%>"><a href="#"><span><%=weeks[2].days[1].text%></span></a></td>',
- '<td class="<%=weeks[2].days[2].classname%>"><a href="#"><span><%=weeks[2].days[2].text%></span></a></td>',
- '<td class="<%=weeks[2].days[3].classname%>"><a href="#"><span><%=weeks[2].days[3].text%></span></a></td>',
- '<td class="<%=weeks[2].days[4].classname%>"><a href="#"><span><%=weeks[2].days[4].text%></span></a></td>',
- '<td class="<%=weeks[2].days[5].classname%>"><a href="#"><span><%=weeks[2].days[5].text%></span></a></td>',
- '<td class="<%=weeks[2].days[6].classname%>"><a href="#"><span><%=weeks[2].days[6].text%></span></a></td>',
- '</tr>',
- '<tr>',
- '<th class="datepickerWeek"><a href="#"><span><%=weeks[3].week%></span></a></th>',
- '<td class="<%=weeks[3].days[0].classname%>"><a href="#"><span><%=weeks[3].days[0].text%></span></a></td>',
- '<td class="<%=weeks[3].days[1].classname%>"><a href="#"><span><%=weeks[3].days[1].text%></span></a></td>',
- '<td class="<%=weeks[3].days[2].classname%>"><a href="#"><span><%=weeks[3].days[2].text%></span></a></td>',
- '<td class="<%=weeks[3].days[3].classname%>"><a href="#"><span><%=weeks[3].days[3].text%></span></a></td>',
- '<td class="<%=weeks[3].days[4].classname%>"><a href="#"><span><%=weeks[3].days[4].text%></span></a></td>',
- '<td class="<%=weeks[3].days[5].classname%>"><a href="#"><span><%=weeks[3].days[5].text%></span></a></td>',
- '<td class="<%=weeks[3].days[6].classname%>"><a href="#"><span><%=weeks[3].days[6].text%></span></a></td>',
- '</tr>',
- '<tr>',
- '<th class="datepickerWeek"><a href="#"><span><%=weeks[4].week%></span></a></th>',
- '<td class="<%=weeks[4].days[0].classname%>"><a href="#"><span><%=weeks[4].days[0].text%></span></a></td>',
- '<td class="<%=weeks[4].days[1].classname%>"><a href="#"><span><%=weeks[4].days[1].text%></span></a></td>',
- '<td class="<%=weeks[4].days[2].classname%>"><a href="#"><span><%=weeks[4].days[2].text%></span></a></td>',
- '<td class="<%=weeks[4].days[3].classname%>"><a href="#"><span><%=weeks[4].days[3].text%></span></a></td>',
- '<td class="<%=weeks[4].days[4].classname%>"><a href="#"><span><%=weeks[4].days[4].text%></span></a></td>',
- '<td class="<%=weeks[4].days[5].classname%>"><a href="#"><span><%=weeks[4].days[5].text%></span></a></td>',
- '<td class="<%=weeks[4].days[6].classname%>"><a href="#"><span><%=weeks[4].days[6].text%></span></a></td>',
- '</tr>',
- '<tr>',
- '<th class="datepickerWeek"><a href="#"><span><%=weeks[5].week%></span></a></th>',
- '<td class="<%=weeks[5].days[0].classname%>"><a href="#"><span><%=weeks[5].days[0].text%></span></a></td>',
- '<td class="<%=weeks[5].days[1].classname%>"><a href="#"><span><%=weeks[5].days[1].text%></span></a></td>',
- '<td class="<%=weeks[5].days[2].classname%>"><a href="#"><span><%=weeks[5].days[2].text%></span></a></td>',
- '<td class="<%=weeks[5].days[3].classname%>"><a href="#"><span><%=weeks[5].days[3].text%></span></a></td>',
- '<td class="<%=weeks[5].days[4].classname%>"><a href="#"><span><%=weeks[5].days[4].text%></span></a></td>',
- '<td class="<%=weeks[5].days[5].classname%>"><a href="#"><span><%=weeks[5].days[5].text%></span></a></td>',
- '<td class="<%=weeks[5].days[6].classname%>"><a href="#"><span><%=weeks[5].days[6].text%></span></a></td>',
- '</tr>',
- '</tbody>'
- ],
- months: [
- '<tbody class="<%=className%>">',
- '<tr>',
- '<td colspan="2"><a href="#"><span><%=data[0]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[1]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[2]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[3]%></span></a></td>',
- '</tr>',
- '<tr>',
- '<td colspan="2"><a href="#"><span><%=data[4]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[5]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[6]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[7]%></span></a></td>',
- '</tr>',
- '<tr>',
- '<td colspan="2"><a href="#"><span><%=data[8]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[9]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[10]%></span></a></td>',
- '<td colspan="2"><a href="#"><span><%=data[11]%></span></a></td>',
- '</tr>',
- '</tbody>'
- ]
- },
- defaults = {
- flat: false,
- starts: 1,
- prev: '◀',
- next: '▶',
- lastSel: false,
- mode: 'single',
- view: 'days',
- calendars: 1,
- format: 'Y-m-d',
- position: 'bottom',
- eventName: 'click',
- onRender: function(){return {};},
- onChange: function(){return true;},
- onShow: function(){return true;},
- onBeforeShow: function(){return true;},
- onHide: function(){return true;},
- locale: {
- days: ["日", "一", "二", "三", "四", "五", "六", "日"],
- daysShort: ["日", "一", "二", "三", "四", "五", "六", "日"],
- daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"],
- months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
- monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
- weekMin: '周'
- }
- },
- fill = function(el) {
- var options = $(el).data('datepicker');
- var cal = $(el);
- var currentCal = Math.floor(options.calendars/2), date, data, dow, month, cnt = 0, week, days, indic, indic2, html, tblCal;
- cal.find('td>table tbody').remove();
- for (var i = 0; i < options.calendars; i++) {
- date = new Date(options.current);
- date.addMonths(-currentCal + i);
- tblCal = cal.find('table').eq(i+1);
- switch (tblCal[0].className) {
- case 'datepickerViewDays':
- dow = formatDate(date, 'B, Y');
- break;
- case 'datepickerViewMonths':
- dow = date.getFullYear();
- break;
- case 'datepickerViewYears':
- dow = (date.getFullYear()-6) + ' - ' + (date.getFullYear()+5);
- break;
- }
- tblCal.find('thead tr:first th:eq(1) span').text(dow);
- dow = date.getFullYear()-6;
- data = {
- data: [],
- className: 'datepickerYears'
- }
- for ( var j = 0; j < 12; j++) {
- data.data.push(dow + j);
- }
- html = tmpl(tpl.months.join(''), data);
- date.setDate(1);
- data = {weeks:[], test: 10};
- month = date.getMonth();
- var dow = (date.getDay() - options.starts) % 7;
- date.addDays(-(dow + (dow < 0 ? 7 : 0)));
- week = -1;
- cnt = 0;
- while (cnt < 42) {
- indic = parseInt(cnt/7,10);
- indic2 = cnt%7;
- if (!data.weeks[indic]) {
- week = date.getWeekNumber();
- data.weeks[indic] = {
- week: week,
- days: []
- };
- }
- data.weeks[indic].days[indic2] = {
- text: date.getDate(),
- classname: []
- };
- if (month != date.getMonth()) {
- data.weeks[indic].days[indic2].classname.push('datepickerNotInMonth');
- }
- if (date.getDay() == 0) {
- data.weeks[indic].days[indic2].classname.push('datepickerSunday');
- }
- if (date.getDay() == 6) {
- data.weeks[indic].days[indic2].classname.push('datepickerSaturday');
- }
- var fromUser = options.onRender(date);
- var val = date.valueOf();
- if (fromUser.selected || options.date == val || $.inArray(val, options.date) > -1 || (options.mode == 'range' && val >= options.date[0] && val <= options.date[1])) {
- data.weeks[indic].days[indic2].classname.push('datepickerSelected');
- }
- if (fromUser.disabled) {
- data.weeks[indic].days[indic2].classname.push('datepickerDisabled');
- }
- if (fromUser.className) {
- data.weeks[indic].days[indic2].classname.push(fromUser.className);
- }
- data.weeks[indic].days[indic2].classname = data.weeks[indic].days[indic2].classname.join(' ');
- cnt++;
- date.addDays(1);
- }
- html = tmpl(tpl.days.join(''), data) + html;
- data = {
- data: options.locale.monthsShort,
- className: 'datepickerMonths'
- };
- html = tmpl(tpl.months.join(''), data) + html;
- tblCal.append(html);
- }
- },
- parseDate = function (date, format) {
- if (date.constructor == Date) {
- return new Date(date);
- }
- var parts = date.split(/\W+/);
- var against = format.split(/\W+/), d, m, y, h, min, now = new Date();
- for (var i = 0; i < parts.length; i++) {
- switch (against[i]) {
- case 'd':
- case 'e':
- d = parseInt(parts[i],10);
- break;
- case 'm':
- m = parseInt(parts[i], 10)-1;
- break;
- case 'Y':
- case 'y':
- y = parseInt(parts[i], 10);
- y += y > 100 ? 0 : (y < 29 ? 2000 : 1900);
- break;
- case 'H':
- case 'I':
- case 'k':
- case 'l':
- h = parseInt(parts[i], 10);
- break;
- case 'P':
- case 'p':
- if (/pm/i.test(parts[i]) && h < 12) {
- h += 12;
- } else if (/am/i.test(parts[i]) && h >= 12) {
- h -= 12;
- }
- break;
- case 'M':
- min = parseInt(parts[i], 10);
- break;
- }
- }
- return new Date(
- y === undefined ? now.getFullYear() : y,
- m === undefined ? now.getMonth() : m,
- d === undefined ? now.getDate() : d,
- h === undefined ? now.getHours() : h,
- min === undefined ? now.getMinutes() : min,
- 0
- );
- },
- formatDate = function(date, format) {
- var m = date.getMonth();
- var d = date.getDate();
- var y = date.getFullYear();
- var wn = date.getWeekNumber();
- var w = date.getDay();
- var s = {};
- var hr = date.getHours();
- var pm = (hr >= 12);
- var ir = (pm) ? (hr - 12) : hr;
- var dy = date.getDayOfYear();
- if (ir == 0) {
- ir = 12;
- }
- var min = date.getMinutes();
- var sec = date.getSeconds();
- var parts = format.split(''), part;
- for ( var i = 0; i < parts.length; i++ ) {
- part = parts[i];
- switch (parts[i]) {
- case 'a':
- part = date.getDayName();
- break;
- case 'A':
- part = date.getDayName(true);
- break;
- case 'b':
- part = date.getMonthName();
- break;
- case 'B':
- part = date.getMonthName(true);
- break;
- case 'C':
- part = 1 + Math.floor(y / 100);
- break;
- case 'd':
- part = (d < 10) ? ("0" + d) : d;
- break;
- case 'e':
- part = d;
- break;
- case 'H':
- part = (hr < 10) ? ("0" + hr) : hr;
- break;
- case 'I':
- part = (ir < 10) ? ("0" + ir) : ir;
- break;
- case 'j':
- part = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy;
- break;
- case 'k':
- part = hr;
- break;
- case 'l':
- part = ir;
- break;
- case 'm':
- part = (m < 9) ? ("0" + (1+m)) : (1+m);
- break;
- case 'M':
- part = (min < 10) ? ("0" + min) : min;
- break;
- case 'p':
- case 'P':
- part = pm ? "PM" : "AM";
- break;
- case 's':
- part = Math.floor(date.getTime() / 1000);
- break;
- case 'S':
- part = (sec < 10) ? ("0" + sec) : sec;
- break;
- case 'u':
- part = w + 1;
- break;
- case 'w':
- part = w;
- break;
- case 'y':
- part = ('' + y).substr(2, 2);
- break;
- case 'Y':
- part = y;
- break;
- }
- parts[i] = part;
- }
- return parts.join('');
- },
- extendDate = function(options) {
- if (Date.prototype.tempDate) {
- return;
- }
- Date.prototype.tempDate = null;
- Date.prototype.months = options.months;
- Date.prototype.monthsShort = options.monthsShort;
- Date.prototype.days = options.days;
- Date.prototype.daysShort = options.daysShort;
- Date.prototype.getMonthName = function(fullName) {
- return this[fullName ? 'months' : 'monthsShort'][this.getMonth()];
- };
- Date.prototype.getDayName = function(fullName) {
- return this[fullName ? 'days' : 'daysShort'][this.getDay()];
- };
- Date.prototype.addDays = function (n) {
- this.setDate(this.getDate() + n);
- this.tempDate = this.getDate();
- };
- Date.prototype.addMonths = function (n) {
- if (this.tempDate == null) {
- this.tempDate = this.getDate();
- }
- this.setDate(1);
- this.setMonth(this.getMonth() + n);
- this.setDate(Math.min(this.tempDate, this.getMaxDays()));
- };
- Date.prototype.addYears = function (n) {
- if (this.tempDate == null) {
- this.tempDate = this.getDate();
- }
- this.setDate(1);
- this.setFullYear(this.getFullYear() + n);
- this.setDate(Math.min(this.tempDate, this.getMaxDays()));
- };
- Date.prototype.getMaxDays = function() {
- var tmpDate = new Date(Date.parse(this)),
- d = 28, m;
- m = tmpDate.getMonth();
- d = 28;
- while (tmpDate.getMonth() == m) {
- d ++;
- tmpDate.setDate(d);
- }
- return d - 1;
- };
- Date.prototype.getFirstDay = function() {
- var tmpDate = new Date(Date.parse(this));
- tmpDate.setDate(1);
- return tmpDate.getDay();
- };
- Date.prototype.getWeekNumber = function() {
- var tempDate = new Date(this);
- tempDate.setDate(tempDate.getDate() - (tempDate.getDay() + 6) % 7 + 3);
- var dms = tempDate.valueOf();
- tempDate.setMonth(0);
- tempDate.setDate(4);
- return Math.round((dms - tempDate.valueOf()) / (604800000)) + 1;
- };
- Date.prototype.getDayOfYear = function() {
- var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
- var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
- var time = now - then;
- return Math.floor(time / 24*60*60*1000);
- };
- },
- layout = function (el) {
- var options = $(el).data('datepicker');
- var cal = $('#' + options.id);
- if (!options.extraHeight) {
- var divs = $(el).find('div');
- options.extraHeight = divs.get(0).offsetHeight + divs.get(1).offsetHeight;
- options.extraWidth = divs.get(2).offsetWidth + divs.get(3).offsetWidth;
- }
- var tbl = cal.find('table:first').get(0);
- var width = tbl.offsetWidth;
- var height = tbl.offsetHeight;
- cal.css({
- width: width + options.extraWidth + 'px',
- height: height + options.extraHeight + 'px'
- }).find('div.datepickerContainer').css({
- width: width + 'px',
- height: height + 'px'
- });
- },
- click = function(ev) {
- if ($(ev.target).is('span')) {
- ev.target = ev.target.parentNode;
- }
- var el = $(ev.target);
- if (el.is('a')) {
- ev.target.blur();
- if (el.hasClass('datepickerDisabled')) {
- return false;
- }
- var options = $(this).data('datepicker');
- var parentEl = el.parent();
- var tblEl = parentEl.parent().parent().parent();
- var tblIndex = $('table', this).index(tblEl.get(0)) - 1;
- var tmp = new Date(options.current);
- var changed = false;
- var fillIt = false;
- if (parentEl.is('th')) {
- if (parentEl.hasClass('datepickerWeek') && options.mode == 'range' && !parentEl.next().hasClass('datepickerDisabled')) {
- var val = parseInt(parentEl.next().text(), 10);
- tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
- if (parentEl.next().hasClass('datepickerNotInMonth')) {
- tmp.addMonths(val > 15 ? -1 : 1);
- }
- tmp.setDate(val);
- options.date[0] = (tmp.setHours(0,0,0,0)).valueOf();
- tmp.setHours(23,59,59,0);
- tmp.addDays(6);
- options.date[1] = tmp.valueOf();
- fillIt = true;
- changed = true;
- options.lastSel = false;
- } else if (parentEl.hasClass('datepickerMonth')) {
- tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
- switch (tblEl.get(0).className) {
- case 'datepickerViewDays':
- tblEl.get(0).className = 'datepickerViewMonths';
- el.find('span').text(tmp.getFullYear());
- break;
- case 'datepickerViewMonths':
- tblEl.get(0).className = 'datepickerViewYears';
- el.find('span').text((tmp.getFullYear()-6) + ' - ' + (tmp.getFullYear()+5));
- break;
- case 'datepickerViewYears':
- tblEl.get(0).className = 'datepickerViewDays';
- el.find('span').text(formatDate(tmp, 'B, Y'));
- break;
- }
- } else if (parentEl.parent().parent().is('thead')) {
- switch (tblEl.get(0).className) {
- case 'datepickerViewDays':
- options.current.addMonths(parentEl.hasClass('datepickerGoPrev') ? -1 : 1);
- break;
- case 'datepickerViewMonths':
- options.current.addYears(parentEl.hasClass('datepickerGoPrev') ? -1 : 1);
- break;
- case 'datepickerViewYears':
- options.current.addYears(parentEl.hasClass('datepickerGoPrev') ? -12 : 12);
- break;
- }
- fillIt = true;
- }
- } else if (parentEl.is('td') && !parentEl.hasClass('datepickerDisabled')) {
- switch (tblEl.get(0).className) {
- case 'datepickerViewMonths':
- options.current.setMonth(tblEl.find('tbody.datepickerMonths td').index(parentEl));
- options.current.setFullYear(parseInt(tblEl.find('thead th.datepickerMonth span').text(), 10));
- options.current.addMonths(Math.floor(options.calendars/2) - tblIndex);
- tblEl.get(0).className = 'datepickerViewDays';
- break;
- case 'datepickerViewYears':
- options.current.setFullYear(parseInt(el.text(), 10));
- tblEl.get(0).className = 'datepickerViewMonths';
- break;
- default:
- var val = parseInt(el.text(), 10);
- tmp.addMonths(tblIndex - Math.floor(options.calendars/2));
- if (parentEl.hasClass('datepickerNotInMonth')) {
- tmp.addMonths(val > 15 ? -1 : 1);
- }
- tmp.setDate(val);
- switch (options.mode) {
- case 'multiple':
- val = (tmp.setHours(0,0,0,0)).valueOf();
- if ($.inArray(val, options.date) > -1) {
- $.each(options.date, function(nr, dat){
- if (dat == val) {
- options.date.splice(nr,1);
- return false;
- }
- });
- } else {
- options.date.push(val);
- }
- break;
- case 'range':
- if (!options.lastSel) {
- options.date[0] = (tmp.setHours(0,0,0,0)).valueOf();
- }
- val = (tmp.setHours(23,59,59,0)).valueOf();
- if (val < options.date[0]) {
- options.date[1] = options.date[0] + 86399000;
- options.date[0] = val - 86399000;
- } else {
- options.date[1] = val;
- }
- options.lastSel = !options.lastSel;
- break;
- default:
- options.date = tmp.valueOf();
- break;
- }
- break;
- }
- fillIt = true;
- changed = true;
- }
- if (fillIt) {
- fill(this);
- }
- if (changed) {
- options.onChange.apply(this, prepareDate(options));
- }
- }
- return false;
- },
- prepareDate = function (options) {
- var tmp;
- if (options.mode == 'single') {
- tmp = new Date(options.date);
- return [formatDate(tmp, options.format), tmp, options.el];
- } else {
- tmp = [[],[], options.el];
- $.each(options.date, function(nr, val){
- var date = new Date(val);
- tmp[0].push(formatDate(date, options.format));
- tmp[1].push(date);
- });
- return tmp;
- }
- },
- getViewport = function () {
- var m = document.compatMode == 'CSS1Compat';
- return {
- l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
- t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
- w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
- h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
- };
- },
- isChildOf = function(parentEl, el, container) {
- if (parentEl == el) {
- return true;
- }
- if (parentEl.contains) {
- return parentEl.contains(el);
- }
- if ( parentEl.compareDocumentPosition ) {
- return !!(parentEl.compareDocumentPosition(el) & 16);
- }
- var prEl = el.parentNode;
- while(prEl && prEl != container) {
- if (prEl == parentEl)
- return true;
- prEl = prEl.parentNode;
- }
- return false;
- },
- show = function (ev) {
- var cal = $('#' + $(this).data('datepickerId'));
- if (!cal.is(':visible')) {
- var calEl = cal.get(0);
- fill(calEl);
- var options = cal.data('datepicker');
- options.onBeforeShow.apply(this, [cal.get(0)]);
- var pos = $(this).offset();
- var viewPort = getViewport();
- var top = pos.top;
- var left = pos.left;
- var oldDisplay = $.curCSS(calEl, 'display');
- cal.css({
- visibility: 'hidden',
- display: 'block'
- });
- layout(calEl);
- switch (options.position){
- case 'top':
- top -= calEl.offsetHeight;
- break;
- case 'left':
- left -= calEl.offsetWidth;
- break;
- case 'right':
- left += this.offsetWidth;
- break;
- case 'bottom':
- top += this.offsetHeight;
- break;
- }
- if (top + calEl.offsetHeight > viewPort.t + viewPort.h) {
- top = pos.top - calEl.offsetHeight;
- }
- if (top < viewPort.t) {
- top = pos.top + this.offsetHeight + calEl.offsetHeight;
- }
- if (left + calEl.offsetWidth > viewPort.l + viewPort.w) {
- left = pos.left - calEl.offsetWidth;
- }
- if (left < viewPort.l) {
- left = pos.left + this.offsetWidth
- }
- cal.css({
- visibility: 'visible',
- display: 'block',
- top: top + 'px',
- left: left + 'px'
- });
- if (options.onShow.apply(this, [cal.get(0)]) != false) {
- cal.show();
- }
- $(document).bind('mousedown', {cal: cal, trigger: this}, hide);
- }
- return false;
- },
- hide = function (ev) {
- if (ev.target != ev.data.trigger && !isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
- if (ev.data.cal.data('datepicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
- ev.data.cal.hide();
- }
- $(document).unbind('mousedown', hide);
- }
- };
- return {
- init: function(options){
- options = $.extend({}, defaults, options||{});
- extendDate(options.locale);
- options.calendars = Math.max(1, parseInt(options.calendars,10)||1);
- options.mode = /single|multiple|range/.test(options.mode) ? options.mode : 'single';
- return this.each(function(){
- if (!$(this).data('datepicker')) {
- options.el = this;
- if (options.date.constructor == String) {
- options.date = parseDate(options.date, options.format);
- options.date.setHours(0,0,0,0);
- }
- if (options.mode != 'single') {
- if (options.date.constructor != Array) {
- options.date = [options.date.valueOf()];
- if (options.mode == 'range') {
- options.date.push(((new Date(options.date[0])).setHours(23,59,59,0)).valueOf());
- }
- } else {
- for (var i = 0; i < options.date.length; i++) {
- options.date[i] = (parseDate(options.date[i], options.format).setHours(0,0,0,0)).valueOf();
- }
- if (options.mode == 'range') {
- options.date[1] = ((new Date(options.date[1])).setHours(23,59,59,0)).valueOf();
- }
- }
- } else {
- options.date = options.date.valueOf();
- }
- if (!options.current) {
- options.current = new Date();
- } else {
- options.current = parseDate(options.current, options.format);
- }
- options.current.setDate(1);
- options.current.setHours(0,0,0,0);
- var id = 'datepicker_' + parseInt(Math.random() * 1000), cnt;
- options.id = id;
- $(this).data('datepickerId', options.id);
- var cal = $(tpl.wrapper).attr('id', id).bind('click', click).data('datepicker', options);
- if (options.className) {
- cal.addClass(options.className);
- }
- var html = '';
- for (var i = 0; i < options.calendars; i++) {
- cnt = options.starts;
- if (i > 0) {
- html += tpl.space;
- }
- html += tmpl(tpl.head.join(''), {
- week: options.locale.weekMin,
- prev: options.prev,
- next: options.next,
- day1: options.locale.daysMin[(cnt++)%7],
- day2: options.locale.daysMin[(cnt++)%7],
- day3: options.locale.daysMin[(cnt++)%7],
- day4: options.locale.daysMin[(cnt++)%7],
- day5: options.locale.daysMin[(cnt++)%7],
- day6: options.locale.daysMin[(cnt++)%7],
- day7: options.locale.daysMin[(cnt++)%7]
- });
- }
- cal
- .find('tr:first').append(html)
- .find('table').addClass(views[options.view]);
- fill(cal.get(0));
- if (options.flat) {
- cal.appendTo(this).show().css('position', 'relative');
- layout(cal.get(0));
- } else {
- cal.appendTo(document.body);
- $(this).bind(options.eventName, show);
- }
- }
- });
- },
- showPicker: function() {
- return this.each( function () {
- if ($(this).data('datepickerId')) {
- show.apply(this);
- }
- });
- },
- hidePicker: function() {
- return this.each( function () {
- if ($(this).data('datepickerId')) {
- $('#' + $(this).data('datepickerId')).hide();
- }
- });
- },
- setDate: function(date, shiftTo){
- return this.each(function(){
- if ($(this).data('datepickerId')) {
- var cal = $('#' + $(this).data('datepickerId'));
- var options = cal.data('datepicker');
- options.date = date;
- if (options.date.constructor == String) {
- options.date = parseDate(options.date, options.format);
- options.date.setHours(0,0,0,0);
- }
- if (options.mode != 'single') {
- if (options.date.constructor != Array) {
- options.date = [options.date.valueOf()];
- if (options.mode == 'range') {
- options.date.push(((new Date(options.date[0])).setHours(23,59,59,0)).valueOf());
- }
- } else {
- for (var i = 0; i < options.date.length; i++) {
- options.date[i] = (parseDate(options.date[i], options.format).setHours(0,0,0,0)).valueOf();
- }
- if (options.mode == 'range') {
- options.date[1] = ((new Date(options.date[1])).setHours(23,59,59,0)).valueOf();
- }
- }
- } else {
- options.date = options.date.valueOf();
- }
- if (shiftTo) {
- options.current = new Date (options.mode != 'single' ? options.date[0] : options.date);
- }
- fill(cal.get(0));
- }
- });
- },
- getDate: function(formated) {
- if (this.size() > 0) {
- return prepareDate($('#' + $(this).data('datepickerId')).data('datepicker'))[formated ? 0 : 1];
- }
- },
- clear: function(){
- return this.each(function(){
- if ($(this).data('datepickerId')) {
- var cal = $('#' + $(this).data('datepickerId'));
- var options = cal.data('datepicker');
- if (options.mode != 'single') {
- options.date = [];
- fill(cal.get(0));
- }
- }
- });
- },
- fixLayout: function(){
- return this.each(function(){
- if ($(this).data('datepickerId')) {
- var cal = $('#' + $(this).data('datepickerId'));
- var options = cal.data('datepicker');
- if (options.flat) {
- layout(cal.get(0));
- }
- }
- });
- }
- };
- }();
- $.fn.extend({
- DatePicker: DatePicker.init,
- DatePickerHide: DatePicker.hidePicker,
- DatePickerShow: DatePicker.showPicker,
- DatePickerSetDate: DatePicker.setDate,
- DatePickerGetDate: DatePicker.getDate,
- DatePickerClear: DatePicker.clear,
- DatePickerLayout: DatePicker.fixLayout
- });
- })(jQuery);
- (function(){
- var cache = {};
-
- this.tmpl = function tmpl(str, data){
- // Figure out if we're getting a template, or if we need to
- // load the template - and be sure to cache the result.
- var fn = !/\W/.test(str) ?
- cache[str] = cache[str] ||
- tmpl(document.getElementById(str).innerHTML) :
-
- // Generate a reusable function that will serve as a template
- // generator (and which will be cached).
- new Function("obj",
- "var p=[],print=function(){p.push.apply(p,arguments);};" +
-
- // Introduce the data as local variables using with(){}
- "with(obj){p.push('" +
-
- // Convert the template into pure JavaScript
- str
- .replace(/[\r\t\n]/g, " ")
- .split("<%").join("\t")
- .replace(/((^|%>)[^\t]*)'/g, "$1\r")
- .replace(/\t=(.*?)%>/g, "',$1,'")
- .split("\t").join("');")
- .split("%>").join("p.push('")
- .split("\r").join("\\'")
- + "');}return p.join('');");
-
- // Provide some basic currying to the user
- return data ? fn( data ) : fn;
- };
- })();
|