/**
* jQuery EasyUI 1.4
*
* Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved.
*
* Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
* To use it on other terms please contact us at info@jeasyui.com
*
*/
/**
* datebox - jQuery EasyUI
*
* Dependencies:
* calendar
* combo
*
*/
(function($){
/**
* create date box
*/
function createBox(target){
var state = $.data(target, 'datebox');
var opts = state.options;
$(target).addClass('datebox-f').combo($.extend({}, opts, {
onShowPanel:function(){
setCalendar();
setValue(target, $(target).datebox('getText'), true);
// setValue(target, $(target).datebox('getText'));
opts.onShowPanel.call(target);
}
}));
$(target).combo('textbox').parent().addClass('datebox');
/**
* if the calendar isn't created, create it.
*/
if (!state.calendar){
createCalendar();
}
setValue(target, opts.value);
function createCalendar(){
var panel = $(target).combo('panel').css('overflow','hidden');
panel.panel('options').onBeforeDestroy = function(){
var sc = $(this).find('.calendar-shared');
if (sc.length){
sc.insertBefore(sc[0].pholder);
}
};
var cc = $('
').appendTo(panel);
if (opts.sharedCalendar){
var sc = $(opts.sharedCalendar);
if (!sc[0].pholder){
sc[0].pholder = $('').insertAfter(sc);
}
sc.addClass('calendar-shared').appendTo(cc);
if (!sc.hasClass('calendar')){
sc.calendar();
}
state.calendar = sc;
// state.calendar = $(opts.sharedCalendar).appendTo(cc);
// if (!state.calendar.hasClass('calendar')){
// state.calendar.calendar();
// }
} else {
state.calendar = $('').appendTo(cc).calendar();
}
$.extend(state.calendar.calendar('options'), {
fit:true,
border:false,
onSelect:function(date){
var opts = $(this.target).datebox('options');
setValue(this.target, opts.formatter.call(this.target, date));
$(this.target).combo('hidePanel');
opts.onSelect.call(target, date);
}
});
// setValue(target, opts.value);
var button = $('').appendTo(panel);
var tr = button.find('tr');
for(var i=0; i').appendTo(tr);
var btn = opts.buttons[i];
var t = $('').html($.isFunction(btn.text) ? btn.text(target) : btn.text).appendTo(td);
t.bind('click', {target: target, handler: btn.handler}, function(e){
e.data.handler.call(this, e.data.target);
});
}
tr.find('td').css('width', (100/opts.buttons.length)+'%');
}
function setCalendar(){
var panel = $(target).combo('panel');
var cc = panel.children('div.datebox-calendar-inner');
panel.children()._outerWidth(panel.width());
state.calendar.appendTo(cc);
state.calendar[0].target = target;
if (opts.panelHeight != 'auto'){
var height = panel.height();
panel.children().not(cc).each(function(){
height -= $(this).outerHeight();
});
cc._outerHeight(height);
}
state.calendar.calendar('resize');
}
}
/**
* called when user inputs some value in text box
*/
function doQuery(target, q){
setValue(target, q, true);
}
/**
* called when user press enter key
*/
function doEnter(target){
var state = $.data(target, 'datebox');
var opts = state.options;
var current = state.calendar.calendar('options').current;
if (current){
setValue(target, opts.formatter.call(target, current));
$(target).combo('hidePanel');
}
}
function setValue(target, value, remainText){
var state = $.data(target, 'datebox');
var opts = state.options;
var calendar = state.calendar;
$(target).combo('setValue', value);
calendar.calendar('moveTo', opts.parser.call(target, value));
if (!remainText){
if (value){
value = opts.formatter.call(target, calendar.calendar('options').current);
$(target).combo('setValue', value).combo('setText', value);
} else {
$(target).combo('setText', value);
}
}
}
$.fn.datebox = function(options, param){
if (typeof options == 'string'){
var method = $.fn.datebox.methods[options];
if (method){
return method(this, param);
} else {
return this.combo(options, param);
}
}
options = options || {};
return this.each(function(){
var state = $.data(this, 'datebox');
if (state){
$.extend(state.options, options);
} else {
$.data(this, 'datebox', {
options: $.extend({}, $.fn.datebox.defaults, $.fn.datebox.parseOptions(this), options)
});
}
createBox(this);
});
};
$.fn.datebox.methods = {
options: function(jq){
var copts = jq.combo('options');
return $.extend($.data(jq[0], 'datebox').options, {
width: copts.width,
height: copts.height,
originalValue: copts.originalValue,
disabled: copts.disabled,
readonly: copts.readonly
});
},
calendar: function(jq){ // get the calendar object
return $.data(jq[0], 'datebox').calendar;
},
setValue: function(jq, value){
return jq.each(function(){
setValue(this, value);
});
},
reset: function(jq){
return jq.each(function(){
var opts = $(this).datebox('options');
$(this).datebox('setValue', opts.originalValue);
});
}
};
$.fn.datebox.parseOptions = function(target){
return $.extend({}, $.fn.combo.parseOptions(target), $.parser.parseOptions(target, ['sharedCalendar']));
};
$.fn.datebox.defaults = $.extend({}, $.fn.combo.defaults, {
panelWidth:180,
panelHeight:'auto',
sharedCalendar:null,
keyHandler: {
up:function(e){},
down:function(e){},
left: function(e){},
right: function(e){},
enter:function(e){doEnter(this)},
query:function(q,e){doQuery(this, q)}
},
currentText:'Today',
closeText:'Close',
okText:'Ok',
buttons:[{
text: function(target){return $(target).datebox('options').currentText;},
handler: function(target){
$(target).datebox('calendar').calendar({
year:new Date().getFullYear(),
month:new Date().getMonth()+1,
current:new Date()
});
doEnter(target);
}
},{
text: function(target){return $(target).datebox('options').closeText;},
handler: function(target){
$(this).closest('div.combo-panel').panel('close');
}
}],
formatter:function(date){
var y = date.getFullYear();
var m = date.getMonth()+1;
var d = date.getDate();
return (m<10?('0'+m):m)+'/'+(d<10?('0'+d):d)+'/'+y;
// return m+'/'+d+'/'+y;
},
parser:function(s){
if (!s) return new Date();
var ss = s.split('/');
var m = parseInt(ss[0],10);
var d = parseInt(ss[1],10);
var y = parseInt(ss[2],10);
if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
return new Date(y,m-1,d);
} else {
return new Date();
}
},
onSelect:function(date){}
});
})(jQuery);