/**
 *
 * Date picker
 * changes in blur to support on change idea
 * last update 10,07,20101
 */
(function ($) {
    var DatePicker = function () {
        var	ids = {},
        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',
            calendars: 1,
            format: 'Y-m-d',
            position: 'bottom',
            position_handle:24,
            eventName: 'click',
            onRender: function(){
                return {};

        },
        onChange: function(){
            return true;
        },
        onShow: function(){
            return true;
        },
        onBeforeShow: function(){
            return true;
        },
        onHide: function(){
            return true;
        },
        locale: {
            days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
            daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
            daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
            months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
            monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
            weekMin: 'wk'
        /*
                    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||now.getFullYear(),
            m||now.getMonth(),
            d||now.getDate(),
            h||now.getHours(),
            min||now.getMinutes(),
            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);
                        changed=false;
                        tblEl.get(0).className = 'datepickerViewDays';
                        break;
                    case 'datepickerViewYears':
                        options.current.setFullYear(parseInt(el.text(), 10));
                        changed=false;
                        tblEl.get(0).className = 'datepickerViewMonths';
                        break;
                    default:
                        changed = true;
                        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) {
                                            delete options.date[nr];
                                            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;
						
            }
            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];
        } else {
            tmp = [[],[]];
            $.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);
            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;
                case 'bottom-left':
                    top += this.offsetHeight;
                    left -= calEl.offsetWidth-options.position_handle;
                           
                    break;
                case 'bottom-right':
                    top += this.offsetHeight;
                    left += this.offsetWidth-options.position_handle-15;
                           
                    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')) {
                    if (options.date.constructor == String) {
                        options.date = parseDate(options.date, options.format);
                        //add 1 hour since in ubuntu when make timezone sving it will be Mar 26 2011 23:00:00 not 27, document.write(new Date(2011,02,27));
                        options.date.setHours(1,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++) {
                                //add 1 hour since in ubuntu when make timezone sving it will be Mar 26 2011 23:00:00 not 27, document.write(new Date(2011,02,27));
                                options.date[i] = (parseDate(options.date[i], options.format).setHours(1,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);
                    //add 1 hour since in ubuntu when make timezone sving it will be Mar 26 2011 23:00:00 not 27, document.write(new Date(2011,02,27));
                    options.current.setHours(1,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);
                    }
                    for (var i = 0; i < options.calendars; i++) {
                        cnt = options.starts;
                        cal.find('tr:first').append(
                            i > 0 ?  tpl.space: '',
                            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 table').addClass('datepickerViewDays');
                    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);
                        //add 1 hour since in ubuntu when make timezone sving it will be Mar 26 2011 23:00:00 not 27, document.write(new Date(2011,02,27));
                        options.date.setHours(1,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(format){
            if (this.size() > 0) {
                var options=$('#' + $(this).data('datepickerId')).data('datepicker');
                var fomrated_date='';
                if(options.format!='Y-m-d')
                    var temp_date=options.format;
                if(format!=undefined){
                    if(format.match('string'))
                        return prepareDate(options)[1];
                    else if(format.match('default')){
                        options.format='Y-m-d';
                        fomrated_date=prepareDate(options)[0];
                        if(temp_date)
                            options.format=temp_date;
                        return  fomrated_date;
                    }
                }
                return prepareDate(options)[0];
            }
        }
    };
}();
    $.fn.extend({
        DatePicker: DatePicker.init,
        DatePickerHide: DatePicker.hidePicker,
        DatePickerShow: DatePicker.showPicker,
        DatePickerSetDate: DatePicker.setDate,
        DatePickerGetDate: DatePicker.getDate
    });
})(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;
    };
})();

/**
 *
 * Zoomimage
 * Author: Stefan Petre www.eyecon.ro
 *
 */
(function($){
    var EYE = window.EYE = function() {
        var _registered = {
            init: []
        };
        return {
            init: function() {
                $.each(_registered.init, function(nr, fn){
                    fn.call();
                });
            },
            extend: function(prop) {
                for (var i in prop) {
                    if (prop[i] != undefined) {
                        this[i] = prop[i];
                    }
                }
            },
            register: function(fn, type) {
                if (!_registered[type]) {
                    _registered[type] = [];
                }
                _registered[type].push(fn);
            }
        };
    }();
    $(EYE.init);
})(jQuery);
/**
 *
 * Utilities
 * Author: Stefan Petre www.eyecon.ro
 *
 */
(function($) {
    EYE.extend({
        getPosition : function(e, forceIt)
        {
            var x = 0;
            var y = 0;
            var es = e.style;
            var restoreStyles = false;
            if (forceIt && jQuery.curCSS(e,'display') == 'none') {
                var oldVisibility = es.visibility;
                var oldPosition = es.position;
                restoreStyles = true;
                es.visibility = 'hidden';
                es.display = 'block';
                es.position = 'absolute';
            }
            var el = e;
            if (el.getBoundingClientRect) { // IE
                var box = el.getBoundingClientRect();
                x = box.left + Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) - 2;
                y = box.top + Math.max(document.documentElement.scrollTop, document.body.scrollTop) - 2;
            } else {
                x = el.offsetLeft;
                y = el.offsetTop;
                el = el.offsetParent;
                if (e != el) {
                    while (el) {
                        x += el.offsetLeft;
                        y += el.offsetTop;
                        el = el.offsetParent;
                    }
                }
                if (jQuery.browser.safari && jQuery.curCSS(e, 'position') == 'absolute' ) {
                    x -= document.body.offsetLeft;
                    y -= document.body.offsetTop;
                }
                el = e.parentNode;
                while (el && el.tagName.toUpperCase() != 'BODY' && el.tagName.toUpperCase() != 'HTML')
                {
                    if (jQuery.curCSS(el, 'display') != 'inline') {
                        x -= el.scrollLeft;
                        y -= el.scrollTop;
                    }
                    el = el.parentNode;
                }
            }
            if (restoreStyles == true) {
                es.display = 'none';
                es.position = oldPosition;
                es.visibility = oldVisibility;
            }
            return {
                x:x,
                y:y
            };
        },
        getSize : function(e)
        {
            var w = parseInt(jQuery.curCSS(e,'width'), 10);
            var h = parseInt(jQuery.curCSS(e,'height'), 10);
            var wb = 0;
            var hb = 0;
            if (jQuery.curCSS(e, 'display') != 'none') {
                wb = e.offsetWidth;
                hb = e.offsetHeight;
            } else {
                var es = e.style;
                var oldVisibility = es.visibility;
                var oldPosition = es.position;
                es.visibility = 'hidden';
                es.display = 'block';
                es.position = 'absolute';
                wb = e.offsetWidth;
                hb = e.offsetHeight;
                es.display = 'none';
                es.position = oldPosition;
                es.visibility = oldVisibility;
            }
            return {
                w:w,
                h:h,
                wb:wb,
                hb:hb
            };
        },
        getClient : function(e)
        {
            var h, w;
            if (e) {
                w = e.clientWidth;
                h = e.clientHeight;
            } else {
                var de = document.documentElement;
                w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
                h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
            }
            return {
                w:w,
                h:h
            };
        },
        getScroll : function (e)
        {
            var t=0, l=0, w=0, h=0, iw=0, ih=0;
            if (e && e.nodeName.toLowerCase() != 'body') {
                t = e.scrollTop;
                l = e.scrollLeft;
                w = e.scrollWidth;
                h = e.scrollHeight;
            } else  {
                if (document.documentElement) {
                    t = document.documentElement.scrollTop;
                    l = document.documentElement.scrollLeft;
                    w = document.documentElement.scrollWidth;
                    h = document.documentElement.scrollHeight;
                } else if (document.body) {
                    t = document.body.scrollTop;
                    l = document.body.scrollLeft;
                    w = document.body.scrollWidth;
                    h = document.body.scrollHeight;
                }
                if (typeof pageYOffset != 'undefined') {
                    t = pageYOffset;
                    l = pageXOffset;
                }
                iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
                ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
            }
            return {
                t: t,
                l: l,
                w: w,
                h: h,
                iw: iw,
                ih: ih
            };
        },
        getMargins : function(e, toInteger)
        {
            var t = jQuery.curCSS(e,'marginTop') || '';
            var r = jQuery.curCSS(e,'marginRight') || '';
            var b = jQuery.curCSS(e,'marginBottom') || '';
            var l = jQuery.curCSS(e,'marginLeft') || '';
            if (toInteger)
                return {
                    t: parseInt(t, 10)||0,
                    r: parseInt(r, 10)||0,
                    b: parseInt(b, 10)||0,
                    l: parseInt(l, 10)
                };
            else
                return {
                    t: t,
                    r: r,
                    b: b,
                    l: l
                };
        },
        getPadding : function(e, toInteger)
        {
            var t = jQuery.curCSS(e,'paddingTop') || '';
            var r = jQuery.curCSS(e,'paddingRight') || '';
            var b = jQuery.curCSS(e,'paddingBottom') || '';
            var l = jQuery.curCSS(e,'paddingLeft') || '';
            if (toInteger)
                return {
                    t: parseInt(t, 10)||0,
                    r: parseInt(r, 10)||0,
                    b: parseInt(b, 10)||0,
                    l: parseInt(l, 10)
                };
            else
                return {
                    t: t,
                    r: r,
                    b: b,
                    l: l
                };
        },
        getBorder : function(e, toInteger)
        {
            var t = jQuery.curCSS(e,'borderTopWidth') || '';
            var r = jQuery.curCSS(e,'borderRightWidth') || '';
            var b = jQuery.curCSS(e,'borderBottomWidth') || '';
            var l = jQuery.curCSS(e,'borderLeftWidth') || '';
            if (toInteger)
                return {
                    t: parseInt(t, 10)||0,
                    r: parseInt(r, 10)||0,
                    b: parseInt(b, 10)||0,
                    l: parseInt(l, 10)||0
                };
            else
                return {
                    t: t,
                    r: r,
                    b: b,
                    l: l
                };
        },
        traverseDOM : function(nodeEl, func)
        {
            func(nodeEl);
            nodeEl = nodeEl.firstChild;
            while(nodeEl){
                EYE.traverseDOM(nodeEl, func);
                nodeEl = nodeEl.nextSibling;
            }
        },
        getInnerWidth :  function(el, scroll) {
            var offsetW = el.offsetWidth;
            return scroll ? Math.max(el.scrollWidth,offsetW) - offsetW + el.clientWidth:el.clientWidth;
        },
        getInnerHeight : function(el, scroll) {
            var offsetH = el.offsetHeight;
            return scroll ? Math.max(el.scrollHeight,offsetH) - offsetH + el.clientHeight:el.clientHeight;
        },
        getExtraWidth : function(el) {
            if($.boxModel)
                return (parseInt($.curCSS(el, 'paddingLeft'))||0)
                + (parseInt($.curCSS(el, 'paddingRight'))||0)
                + (parseInt($.curCSS(el, 'borderLeftWidth'))||0)
                + (parseInt($.curCSS(el, 'borderRightWidth'))||0);
            return 0;
        },
        getExtraHeight : function(el) {
            if($.boxModel)
                return (parseInt($.curCSS(el, 'paddingTop'))||0)
                + (parseInt($.curCSS(el, 'paddingBottom'))||0)
                + (parseInt($.curCSS(el, 'borderTopWidth'))||0)
                + (parseInt($.curCSS(el, 'borderBottomWidth'))||0);
            return 0;
        },
        isChildOf: function(parentEl, el, container) {
            if (parentEl == el) {
                return true;
            }
            if (!el || !el.nodeType || el.nodeType != 1) {
                return false;
            }
            if (parentEl.contains && !$.browser.safari) {
                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;
        },
        centerEl : function(el, axis)
        {
            var clientScroll = EYE.getScroll();
            var size = EYE.getSize(el);
            if (!axis || axis == 'vertically')
                $(el).css(
                {
                    top: clientScroll.t + ((Math.min(clientScroll.h,clientScroll.ih) - size.hb)/2) + 'px'
                }
                );
            if (!axis || axis == 'horizontally')
                $(el).css(
                {
                    left: clientScroll.l + ((Math.min(clientScroll.w,clientScroll.iw) - size.wb)/2) + 'px'
                }
                );
        }
    });
    if (!$.easing.easeout) {
        $.easing.easeout = function(p, n, firstNum, delta, duration) {
            return -delta * ((n=n/duration-1)*n*n*n - 1) + firstNum;
        };
    }

})(jQuery);

jQuery.fn.focusInputField = function(e){
    return this.each(function(){
        var fields = jQuery(this).parents('div:eq(1)').find('input');
        var index = fields.index(this);
        var direction =fields.eq(index).css('direction');
        if(e.keyCode==9 || e.keyCode==16) return false;
        else if(jQuery(this).attr('maxlength')==jQuery(this).val().length || jQuery(this).val().length==0){
            if(direction.match('rtl')){
                if(e.keyCode==37)
                    index=index+1;
                else if(e.keyCode==39)
                    index=index-1;
                else if((e.keyCode!=8 || e.keyCode!=46) && jQuery(this).attr('maxlength')==jQuery(this).val().length)
                    index=index+1;
                else if(e.keyCode==8 && jQuery(this).val().length==0)
                    index=index-1;
            }
            else{
                if(e.keyCode==37)
                    index=index-1;
                else if(e.keyCode==39)
                    index=index+1;
                else if((e.keyCode!=8 || e.keyCode!=46) && jQuery(this).attr('maxlength')==jQuery(this).val().length)
                    index=index+1;
                else if(e.keyCode==8 && jQuery(this).val().length==0)
                    index=index-1;
            }
            if (index>-1 && index< fields.length){
                fields.eq(index).focus();
                fields.eq(index).select();
            }
            return false;
        }
        
    });
};

jQuery.fn.date_fill=function(value){
    var id=jQuery(this).attr('id');
    if(value!=undefined){
        value=value.split('-');
        year =value[0]!=undefined?value[0]:'';
        month=value[1]!=undefined?value[1]:'';
        date =value[2]!=undefined?value[2]:'';
        jQuery('#'+id+'_Y').val(year);
        jQuery('#'+id+'_m').val(month);
        jQuery('#'+id+'_d').val(date);
    }
    else{
        jQuery('#'+id+'_Y').val('');
        jQuery('#'+id+'_m').val('');
        jQuery('#'+id+'_d').val('');
    }
    return value;
   
};


jQuery.fn.time_fill=function(value){
    var id=jQuery(this).attr('id');
    if(value!=undefined){
        value=value.split(':');
        hour    =value[0]!=undefined?value[0]:'';
        minute  =value[1]!=undefined?value[1]:'';
        second  =value[2]!=undefined?value[2]:'';
        jQuery('#'+id+'_H').val(hour);
        jQuery('#'+id+'_i').val(minute);
        jQuery('#'+id+'_s').val(second);
    }
    else {
        jQuery('#'+id+'_H').val('');
        jQuery('#'+id+'_i').val('');
        jQuery('#'+id+'_s').val('');
    }
    return value;
};

jQuery.fn.date_val =function(value){
    var id=jQuery(this).attr('id');
    var date_exist=jQuery('#'+id+'_date').size();
    var time_exist=jQuery('#'+id+'_time').size();
    if(value==undefined || value.replace(/-/g,"")<1) value='';
    jQuery(this).val(value);
    if(date_exist>0 && time_exist>0){
        value=value.split(' ');
        jQuery(this).date_fill(value[0]);
        jQuery(this).time_fill(value[1]);
        if(!value[0]!=undefined)
            jQuery('#'+id+'_date').val(value[0]);
        if(!value[1]!=undefined)
            jQuery('#'+id+'_time').val(value[1]);
    }
    else if(date_exist>0){
        jQuery(this).date_fill(value);
        jQuery('#'+id+'_date').val(value);
    }
    else if(time_exist>0){
        jQuery(this).time_fill(value);
        jQuery('#'+id+'_time').val(value);
    }
}
jQuery.fn.date_disable =function(bool){
    var id=jQuery(this).attr('id');
    var date_exist=jQuery('#'+id+'_date').size();
    var time_exist=jQuery('#'+id+'_time').size();
    if(bool==undefined) {
        bool=true;
    }
    display= bool?'none':'';
    if(date_exist>0){
        jQuery('#'+id+'_d').attr('disabled',bool);
        jQuery('#'+id+'_m').attr('disabled',bool);
        jQuery('#'+id+'_Y').attr('disabled',bool);
    }

    if(time_exist>0){
        jQuery('#'+id+'_H').attr('disabled',bool);
        jQuery('#'+id+'_i').attr('disabled',bool);
        jQuery('#'+id+'_s').attr('disabled',bool);
    }
    
    jQuery('#'+id+'_button').css('display',display);
}
jQuery.fn.valid =function(bool){
    var id=jQuery(this).attr('id');
    var date_exist=jQuery('#'+id+'_date').size();
    var time_exist=jQuery('#'+id+'_time').size();
    if(bool==undefined) {
        bool=true;
    }
    
        
    if(bool){
        jQuery('#'+id).attr('class','valid');
        if(date_exist>0){
            jQuery('#'+id+'_date').attr('class','valid-int-8-date');
            jQuery('#'+id+'_d').attr('class','valid-int');
            jQuery('#'+id+'_m').attr('class','valid-int');
            jQuery('#'+id+'_Y').attr('class','valid-int');
        }
        if(time_exist>0){
            jQuery('#'+id+'_time').attr('class','valid');
            jQuery('#'+id+'_H').attr('class','valid');
            jQuery('#'+id+'_i').attr('class','valid');
            jQuery('#'+id+'_s').attr('class','valid');
        }
    }
    else{
        jQuery('#'+id).attr('class','');
        if(date_exist>0){
            jQuery('#'+id+'_date').attr('class','format-int-8-date');
            jQuery('#'+id+'_d').attr('class','format-int');
            jQuery('#'+id+'_m').attr('class','format-int');
            jQuery('#'+id+'_Y').attr('class','format-int');
        }
        if(time_exist>0){
            jQuery('#'+id+'_time').attr('class','');
            jQuery('#'+id+'_H').attr('class','');
            jQuery('#'+id+'_i').attr('class','');
            jQuery('#'+id+'_s').attr('class','');
        }
    }
    
}
jQuery.fn.date_int =function(functiondata){
    var id=jQuery(this).attr('id');
    var align = 'left';
    if(jQuery(this).css('direction')!=undefined)
     align=jQuery(this).css('direction').match('rtl')?'right':'left';
    var date_exist=jQuery('#'+id+'_date').size();
    var time_exist=jQuery('#'+id+'_time').size();
    if(date_exist>0){
        jQuery('#'+id+'_button').DatePicker({
            format:"Y-m-d",
            date:jQuery('#'+id+'_date').val(),
            current:jQuery('#'+id+'_date').val(),
            starts: 1,
            position:'bottom-'+align,
            onBeforeShow: function(){
                jQuery('#'+id+'_button').DatePickerSetDate( jQuery('#'+id).val(),true);
            },
            onChange: function(){
                var default_date=jQuery('#'+id+'_button').DatePickerGetDate('default');
                jQuery('#'+id+'_date').val(default_date);
                new_value =default_date;
                if(jQuery('#'+id+'_time').val())
                    new_value+=' '+jQuery('#'+id+'_time').val();
                old_val=jQuery('#'+id).val();
                jQuery('#'+id).date_val(new_value);

                jQuery('#'+id+'_button').DatePickerHide();
                if(functiondata!=undefined && (old_val!=new_value)) eval(functiondata);
            }
        })
        jQuery('#'+id+'_mask_date_container input').bind('keyup',function(e){

            var year=jQuery('#'+id+'_Y').val();
            var month=jQuery('#'+id+'_m').val();
            var day=jQuery('#'+id+'_d').val();

            jQuery(this).focusInputField(e);
           
            if(year.length==4 && month.length==2 && day.length==2)
                jQuery('#'+id+'_date').val(year+'-'+month+'-'+day);
            else
                jQuery('#'+id+'_date').val('');

        });

        jQuery('#'+id+'_mask_date_container input,#'+id+'_mask_date_container select').bind('blur',function(e){
            var year=jQuery('#'+id+'_Y').val();
            var month=jQuery('#'+id+'_m').val();
            var day=jQuery('#'+id+'_d').val();
            if(year.length==4 && month.length==2 && day.length==2){
                jQuery('#'+id+'_date').val(year+'-'+month+'-'+day);
                new_value =jQuery('#'+id+'_date').val();
                if(jQuery('#'+id+'_time').val())
                    new_value+=' '+jQuery('#'+id+'_time').val()
                old_val=jQuery('#'+id).val();
                jQuery('#'+id).val(new_value);
                if(functiondata!=undefined && (old_val!=new_value)) eval(functiondata);
            }
            else{
                jQuery('#'+id+'_date').val('');
                if(jQuery('#'+id+'_time').val())
                    jQuery('#'+id).val(jQuery('#'+id+'_time').val());
                else
                    jQuery('#'+id).val('');
            }
        });
    }

    if(time_exist>0){
        jQuery('#'+id+'_mask_time_container select').bind('change',function(e){
            var hour    =jQuery('#'+id+'_H').val();
            var minute  =jQuery('#'+id+'_i').val();
            var second  =jQuery('#'+id+'_s').val();
            if(!hour   || hour==undefined )   hour   ='00';
            if(!minute || minute==undefined) minute ='00';
            if(!second || second==undefined) second ='00';

            jQuery('#'+id+'_time').val(hour+':'+minute+':'+second);
            new_value='';
            if(jQuery('#'+id+'_date').val())
                new_value+=jQuery('#'+id+'_date').val()+' ';
            new_value+=jQuery('#'+id+'_time').val();

            old_val=jQuery('#'+id).val();
            jQuery('#'+id).val(new_value);

            if(date_exist>0){
                if(jQuery('#'+id+'_date').val()){
                    if(functiondata!=undefined && (old_val!=new_value)) eval(functiondata);
                }
            }
            else{
                if(functiondata!=undefined  && (old_val!=new_value)) eval(functiondata);
            }
            
        });
    }
};
