%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/templates/p4_new/js/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/templates/p4_new/js/jquery.simpledatepicker.js

/**
 * jQuery simpleDatePicker
 * http://codecanyon.net/item/jquery-simpledatepicker/9372767
 *
 * Author: RieTs
 */
;(function ( $, window, document, undefined ) {

    "use strict";
    var pluginName = "simpleDatePicker";


    //Plugin constructor
    function Plugin ( element, options ) {

        this.element = element;
        this.$element = $(element);
        this.name = pluginName;

        // Extend default options with those supplied by user.
        this.opts = $.extend(true, {}, $.fn[pluginName].defaults, options);

        this.$elements = {
            day:null,
            month:null,
            year:null,
            output:null
        }

        this.init(element,options);

    }

    //Avoid Plugin.prototype conflicts
    Plugin.prototype =  {


        //Allways 2 digits
        _pad: function(number) {
            number = number + '';
            if (number.length<2) number='0'+number;
            return number
        },

        //Return date from string
        _date: function(date, format) {
            var year=date.substr(format.indexOf("yyyy"),4);
            var month=date.substr(format.indexOf("mm"),2);
            var day=date.substr(format.indexOf("dd"),2);
            return new Date(year, month-1, day, 0, 0, 0, 0);
        },

        //Return string date
        _format: function(date, format) {
            var year=date.getFullYear();
            var month=parseInt(date.getMonth(),10)+1;
            var day=date.getDate();

            format=format.replace("yyyy",year);
            format=format.replace("mm", this._pad(month));
            format=format.replace("dd", this._pad(day));

            return format;
        },


        //Initialize plugin
        init: function () {

            var me=this;

            //Default min -10 years
            if (me.opts.date.min==null) {
                var year=new Date().getFullYear()-10;
                me.opts.date.min=me._format(new Date(year, 0, 1, 0, 0, 0, 0),me.opts.format);
            }

            //Default max +10 years
            if (me.opts.date.max==null) {
                var year=new Date().getFullYear()+10;
                me.opts.date.max=me._format(new Date(year, 11, 31, 0, 0, 0, 0),me.opts.format);
            }

            //Default day, today
            if (me.opts.date.selected=='today') {
                me.opts.date.selected=me._format(new Date(),me.opts.format);
            }

            //Output element
            if (me.opts.output!=null) me.$elements.output=$(me.opts.output);


            //Selectors            
            me.$elements.year=$("<select />").attr("name","year");
            me.$elements.month=$("<select />").attr("name","month");
            me.$elements.day=$("<select />").attr("name","day");
            if (me.opts.css!=null) {
                me.$elements.year.addClass(me.opts.css);
                me.$elements.month.addClass(me.opts.css);
                me.$elements.day.addClass(me.opts.css);
            }

            //Watchers
            me.$elements.year.on("change",function() {
                me._draw();
                me.opts.onSelect.call(me, me, me._get());
                me._output();
            });

            me.$elements.month.on("change",function() {
                me._draw();
                me.opts.onSelect.call(me, me, me._get());
                me._output();
            });

            me.$elements.day.on("change",function() {
                me._draw();
                me.opts.onSelect.call(me, me, me._get());
                me._output();
            });

            if (me.$elements.output!=null) {
                me.$elements.output.on("change."+pluginName,function(){
                    var el=$(this)
                    me._set(el.val());
                });
                me.$elements.output.trigger("change."+pluginName);
            }

            //Append selectors to html
            var parts=me.opts.order.split("-");
            for (var i = 0, len = parts.length; i < len; i++) {
                if (parts[i]=='y') me.$element.append(me.$elements.year);
                if (parts[i]=='m') me.$element.append(me.$elements.month);
                if (parts[i]=='d') me.$element.append(me.$elements.day);
            }

            me._draw();

            //Set date
            if (me.opts.date.selected!=null) me._set(me.opts.date.selected);

            me.opts.onLoad.call(me,me);
        },

        //Destroy plugin
        destroy: function() {

            //Remove elements
            this.$elements.year.remove();
            this.$elements.month.remove();
            this.$elements.day.remove();

            //Remove data
            this.$element.removeData('plugin_' + pluginName);

            //Remove events
            if (this.$elements.output!=null) this.$elements.output.off("change."+pluginName);

            //callback function
            this.opts.onDestroy.call(this);
        },


        //Draw correct values for selects
        _draw: function() {
            var me=this;

            var date_min=me._date(me.opts.date.min, me.opts.format);
            var date_max=me._date(me.opts.date.max, me.opts.format);

            //Find days limit
            var limit=31;
            if (me.$elements.month.val()=='02') {
                var leapYear = (((me.$elements.year.val() % 4 == 0) && (me.$elements.year.val() % 100 != 0)) || (me.$elements.year.val() % 400 == 0)) ? 1 : 0;
                if (leapYear) limit=29;
                else limit=28;
            }
            if (me.$elements.month.val()=='04') limit=30;
            if (me.$elements.month.val()=='06') limit=30;
            if (me.$elements.month.val()=='09') limit=30;
            if (me.$elements.month.val()=='11') limit=30;


            /* Add options:
             - Get old value selected
             - Remove all options
             - Add new options
             - Mark selected, old value if exist or first option if not
             TODO: This code is not sexy, refactor in future versions
             */
            var old=null;
            var add=null;
            var mark=null;
            var option=null;

            //Year
            old=me.$elements.year.find("option:selected").val();
            me.$elements.year.find("option").remove();
            if (me.opts.text.year!=null) {
                option=$("<option/>").attr("value",'').text(me.opts.text.year);
                me.$elements.year.append(option);
            }
            for (var i=date_min.getFullYear();i<=date_max.getFullYear();i++) {
                var option=$("<option/>").attr("value",me._pad(i)).text(i);
                me.$elements.year.append(option);
            }
            mark=me.$elements.year.find("option[value='"+old+"']");
            if (mark.size()>0) mark.prop("selected",true);
            else me.$elements.year.find("option:first").prop("selected",true);

            //Month
            old=me.$elements.month.find("option:selected").val();
            me.$elements.month.find("option").remove();
            if (me.opts.text.month!=null) {
                option=$("<option/>").attr("value",'').text(me.opts.text.month);
                me.$elements.month.append(option);
            }
            for (var i=1;i<=12;i++) {
                add=1;

                if (me.$elements.year.val()==date_min.getFullYear()) {
                    if (i<date_min.getMonth()+1)  add=0;
                }
                if (me.$elements.year.val()==date_max.getFullYear()) {
                    if (i>date_max.getMonth()+1) add=0;
                }

                if (add==1) me.$elements.month.append("<option value='"+me._pad(i)+"'>"+me.opts.months[(i-1)]+"</option>");
            }
            mark=me.$elements.month.find("option[value='"+old+"']");
            if (mark.size()>0) mark.prop("selected",true);
            else me.$elements.month.find("option:first").prop("selected",true);

            //Day
            old=me.$elements.day.find("option:selected").val();
            me.$elements.day.find("option").remove();

            if (me.opts.text.day!=null) {
                option=$("<option/>").attr("value",'').text(me.opts.text.day);
                me.$elements.day.append(option);
            }
            for (var i=1;i<=31;i++) {
                add=1;
                if (me.$elements.year.val()==date_min.getFullYear() && me.$elements.month.val()==me._pad(date_min.getMonth()+1)) {
                    if (i<date_min.getDate()) add=0;
                }
                if (me.$elements.year.val()==date_max.getFullYear() && me.$elements.month.val()==me._pad(date_max.getMonth()+1)) {
                    if (i>date_max.getDate()) add=0;
                }
                if (i>limit) add=0;

                if (add==1) me.$elements.day.append("<option value='"+me._pad(i)+"'>"+i+"</option>");
            }
            mark=me.$elements.day.find("option[value='"+old+"']");
            if (mark.size()>0) mark.prop("selected",true);
            else me.$elements.day.find("option:first").prop("selected",true);
        },


        //Get selected date
        _get: function() {

            if (this.$elements.year.val()!='' && this.$elements.month.val()!='' && this.$elements.day.val()!='') {
                var output=this.opts.format;
                output=output.replace("yyyy",this.$elements.year.val());
                output=output.replace("mm",this.$elements.month.val());
                output=output.replace("dd",this.$elements.day.val());
                return output;
            }
            return null;

        },


        //Set date
        _set: function(date) {
            if (date!='') {
                var year=date.substr(this.opts.format.indexOf("yyyy"), 4);
                var month=date.substr(this.opts.format.indexOf("mm"), 2);
                var day=date.substr(this.opts.format.indexOf("dd"), 2);

                this.$elements.year.val(year);
                this.$elements.month.val(month);
                this.$elements.day.val(day);
            }

        },


        //Output result
        _output: function() {

            if (this.opts.output!=null) {
                var date=this._get();
                if (date) {
                    this.$elements.output.val(date);
                    this.$elements.output.change();
                } else {
                    this.$elements.output.val('');
                    this.$elements.output.change();
                }
            }

        },


        //Set min date
        setMin: function(min) {
            this.opts.date.min=min;
            this._draw();
        },


        //Set max date
        setMax: function(max) {
            this.opts.date.max=max;
            this._draw();
        },


        //Set selected date
        setDate: function(date) {
            this.opts.date.selected=date;
            this._set(this.opts.date.selected)
        },


        //Get selected date
        getDate: function() {
            var date=this._get();
            return date;
        },


        //Get selected date
        remove: function() {
            this.destroy();
        }

    }


    //Plugin definition
    $.fn[pluginName] = function(options) {

        //Public method
        if (typeof arguments[0] === 'string') {

            var args = Array.prototype.slice.call(arguments, 1);

            if ($.isFunction(Plugin.prototype[options])) {
                var response;
                this.each(function() {
                    response= $.data(this, 'plugin_' + pluginName)[options](args[0]);
                });

                //If exists method response, return response
                if (typeof response !== 'undefined') return response;
                else return this;
            } else {
                $.error('Method ' + options + ' is not available');
            }

            //New instance of the plugin
        } else if (typeof options === "object" || !options) {
            return this.each(function() {
                if (!$.data(this, 'plugin_' + pluginName)) {
                    $.data(this, 'plugin_' + pluginName, new Plugin(this, options));
                }
            });
        }

    };


    //Default options
    $.fn[pluginName].defaults = {
        date: {
            selected:null,
            min:null,
            max:null
        },
        months:['January','February','March','April','May','June','July','August','September','October','November','December'],
        text: {
            day:null,
            month:null,
            year:null
        },
        format: "yyyy-mm-dd",
        output:null,
        order: "y-m-d",
        css: null,
        onSelect:function() {},
        onDestroy:function() {},
        onLoad:function() {}
    };


})( jQuery, window, document );

Zerion Mini Shell 1.0