%PDF- %PDF-
| Direktori : /home/bitrix/www/local/templates/p4_new/js/ |
| Current File : /home/bitrix/www/local/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 );