普通HTML的input调用Ext js DatePicker的实现方法

普通HTML的input调用Ext js DatePicker的实现方法
/*!
 * Ext JS Library 3.2.1
 * Copyright(c) 2006-2010 Ext JS, Inc.
 * [email protected]
 * http://www.extjs.com/license
 */
Ext.ns('Ext.ux');
/*
 * @class Ext.ux.DatePicker
 * @extends Ext.DatePicker
 * Ext.ux.DatePicker
 */
Ext.ux.DatePicker = Ext.extend(Ext.DatePicker,{
    
    // bind this component to normal <input/> tag
    bindToInput : false,
    
    initComponent:function(){
        Ext.ux.DatePicker.superclass.initComponent.call(this);
        if(this.bindToInput){//create container to render
            this.createAlignToContainer();
            this.render(this.alignToContainerId);
        }
    },
    
    // private
    onRender : function(container, position){
        Ext.ux.DatePicker.superclass.onRender.call(this, container, position);
        if(this.bindToInput){
            Ext.getDoc().on('mousedown',function(e,t,o){
                if(t == this.bindTo.dom || e.getTarget('div.x-date-picker')){
                    //do nothing
                }else{// hide this component when click other area except <input/> tag and datepicker area
                    this.hide();
                }
            },this);
        }
    },
    
    // bind a singleton datepicker to <input/> tag while it onclick
    bindingTo: function(bindTo){
        if(bindTo){
            this.bindTo = Ext.get(bindTo);
            if(this.bindTo){
                if(this.bindTo.dom.prev){
                    this.prev = Ext.get(this.bindTo.dom.prev);
                }
                if(this.bindTo.dom.next){
                    this.next = Ext.get(this.bindTo.dom.next);
                }
                if(this.bindToInput){
                    this.alignToContainer.alignTo(bindTo,'tl-bl?');// alignment
                }
            }
        }
    },
    
    // create container
    createAlignToContainer : function(){
        var divElement = document.createElement('div');
        this.alignToContainerId = Ext.id();
        document.body.appendChild(divElement);
        divElement.setAttribute('id',this.alignToContainerId)
        this.alignToContainer = Ext.get(this.alignToContainerId);
        this.alignToContainer.applyStyles("position:absolute");
        this.alignToContainer.applyStyles("z-index:99999");
    },
    
    // override
    showMonthPicker : function(){
        if(!this.disabled){
            this.createMonthPicker();
            var size = this.el.getSize();
            this.monthPicker.setSize(size);
            this.monthPicker.child('table').setSize(size);

            this.mpSelMonth = (this.activeDate || this.value).getMonth();
            this.updateMPMonth(this.mpSelMonth);
            this.mpSelYear = (this.activeDate || this.value).getFullYear();
            this.updateMPYear(this.mpSelYear);

            if(this.format.indexOf('d') != -1){// format with days
                this.monthPicker.slideIn('t', {duration:0.2});
            }else{//format no days
                this.monthPicker.show();
                this.monthPicker.child('> table',false).setWidth(this.el.getWidth() - 2);
                this.monthPicker.setWidth(this.el.getWidth() - 2);
            }
        }
    },
    
    // override
    show : function(){
        Ext.ux.DatePicker.superclass.show.call(this);
        if(this.format.indexOf('d') == -1){
            this.showMonthPicker();
        }
    },
    
    // override
    onMonthClick : function(e, t){
        e.stopEvent();
        var el = new Ext.Element(t), pn;
        if(el.is('button.x-date-mp-cancel')){
            if(this.format.indexOf('d') == -1){
                this.hide();
            }else{
                this.hideMonthPicker();
            }
        }
        else if(el.is('button.x-date-mp-ok')){
            var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());
            if(d.getMonth() != this.mpSelMonth){
                // 'fix' the JS rolling date conversion if needed
                d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth();
            }
            this.update(d);
            if(this.format.indexOf('d') == -1){
                this.bindTo.dom.value = d.format(this.format);
                this.setValue(Date.parseDate(d.format(this.format),this.format),true);
                this.hide();
                if(this.fireEvent('select', this, this.value) == true){
                    this.validateDate();
                }
            }else{
                this.hideMonthPicker();
            }
        }
        else if((pn = el.up('td.x-date-mp-month', 2))){
            this.mpMonths.removeClass('x-date-mp-sel');
            pn.addClass('x-date-mp-sel');
            this.mpSelMonth = pn.dom.xmonth;
        }
        else if((pn = el.up('td.x-date-mp-year', 2))){
            this.mpYears.removeClass('x-date-mp-sel');
            pn.addClass('x-date-mp-sel');
            this.mpSelYear = pn.dom.xyear;
        }
        else if(el.is('a.x-date-mp-prev')){
            this.updateMPYear(this.mpyear-10);
        }
        else if(el.is('a.x-date-mp-next')){
            this.updateMPYear(this.mpyear+10);
        }
    },

    // override
    onMonthDblClick : function(e, t){
        e.stopEvent();
        var el = new Ext.Element(t), pn, d;
        if((pn = el.up('td.x-date-mp-month', 2))){
            d = new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate());
            this.update(d);
            
            if(this.format.indexOf('d') == -1){
                this.bindTo.dom.value = d.format(this.format);
                this.setValue(Date.parseDate(d.format(this.format),this.format),true);
                this.hide();
                if(this.fireEvent('select', this, this.value) == true){
                    this.validateDate();
                }
            }else{
                this.hideMonthPicker();
            }
        }
        else if((pn = el.up('td.x-date-mp-year', 2))){
            d = new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate());
            this.update(d);
            
            if(this.format.indexOf('d') == -1){
                this.bindTo.dom.value = d.format(this.format);
                this.setValue(Date.parseDate(d.format(this.format),this.format),true);
                this.hide();
                if(this.fireEvent('select', this, this.value) == true){
                    this.validateDate();
                }
            }else{
                this.hideMonthPicker();
            }
        }
    },
    
    // private
    handleDateClick : function(e, t){
        e.stopEvent();
        if(!this.disabled && t.dateValue && !Ext.fly(t.parentNode).hasClass('x-date-disabled')){
            this.cancelFocus = this.focusOnSelect === false;
            this.setValue(new Date(t.dateValue));
            delete this.cancelFocus;
            if(this.fireEvent('select', this, this.value) == true){
                this.validateDate();
            }
        }
    },

    // private
    selectToday : function(){
        if(this.todayBtn && !this.todayBtn.disabled){
            this.setValue(new Date().clearTime());
            if(this.fireEvent('select', this, this.value) == true){
                this.validateDate();
            }
        }
    },
    
    //validate when a date is selected
    validateDate : function(){
        if(this.bindToInput){
            if(this.bindTo){
                if(this.prev){
                    if(Ext.get(this.prev)){
                        var prev_date = Date.parseDate(Ext.get(this.prev).getValue(),this.format,true);
                        if(prev_date){
                            var this_date = Date.parseDate(this.getValue().format(this.format),this.format,true);
                            if(prev_date.getTime() > this_date.getTime()){
                                Ext.Msg.alert('warning','"u6240"u9009"u65f6"u95f4"u7684"u524d"u540e"u987a"u5e8f"u6709"u8bef"uff01"uff01"uff01',function(){
                                    this.bindTo.focus();
                                    this.bindTo.dom.select();
                                },this);
                            }
                        }
                    }
                }
                if(this.next){
                    if(Ext.get(this.next)){
                        var next_date = Date.parseDate(Ext.get(this.next).getValue(),this.format,true);
                        if(next_date){
                            var this_date = Date.parseDate(this.getValue().format(this.format),this.format,true);
                            if(next_date.getTime() < this_date.getTime()){
                                Ext.Msg.alert('warning','"u6240"u9009"u65f6"u95f4"u7684"u524d"u540e"u987a"u5e8f"u6709"u8bef"uff01"uff01"uff01',function(){
                                    this.bindTo.focus();
                                    this.bindTo.dom.select();
                                },this);
                            }
                        }
                    }
                }
            }
        }
    }
});

/*
 * bind a datePicker,an example like this:
 * <input type='text' id='from_date' name='date1' next='to_date' onclick='showDatePicker(this);'/>
 * <input type='text' id='to_date' name='date2' prev='from_date' onclick='showDatePicker(this);'/>
 */
function showDatePicker(input){

    //singleton datePicker
    if(Ext.getCmp('x-datepicker-ux')){
        var datePicker = Ext.getCmp('x-datepicker-ux');
        datePicker.bindingTo(input);
        datePicker.show();
    }else{
        var datePicker = new Ext.ux.DatePicker({
            id: 'x-datepicker-ux',
            format: 'Y-m',
            bindToInput: true,
            handler: function(_datePicker,_date){
                _datePicker.bindTo.dom.value = _date.format(_datePicker.format);
                _datePicker.hide();
            }
        });
        datePicker.bindingTo(input);
        datePicker.show();
    }
}

你可能感兴趣的:(普通HTML的input调用Ext js DatePicker的实现方法)