agenda-libre-ruby/public/webshims/shims/forms-picker.js

1683 lines
49 KiB
JavaScript
Raw Normal View History

(function($){
(function () {
if($.event.special.mousewheel){return;}
var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
slice = Array.prototype.slice,
nullLowestDeltaTimeout, lowestDelta;
if ( $.event.fixHooks ) {
for ( var i = toFix.length; i; ) {
$.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
}
}
$.event.special.mousewheel = {
version: '3.1.6',
setup: function() {
if ( this.addEventListener ) {
for ( var i = toBind.length; i; ) {
this.addEventListener( toBind[--i], handler, false );
}
} else {
this.onmousewheel = handler;
}
},
teardown: function() {
if ( this.removeEventListener ) {
for ( var i = toBind.length; i; ) {
this.removeEventListener( toBind[--i], handler, false );
}
} else {
this.onmousewheel = null;
}
}
};
$.fn.extend({
mousewheel: function(fn) {
return fn ? this.on('mousewheel', fn) : this.trigger('mousewheel');
},
unmousewheel: function(fn) {
return this.off('mousewheel', fn);
}
});
function handler(event) {
var orgEvent = event || window.event,
args = slice.call(arguments, 1),
delta = 0,
deltaX = 0,
deltaY = 0,
absDelta = 0;
event = $.event.fix(orgEvent);
event.type = 'mousewheel';
// Old school scrollwheel delta
if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }
if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }
if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }
if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
// Firefox < 17 horizontal scrolling related to DOMMouseScroll event
if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
deltaX = deltaY * -1;
deltaY = 0;
}
// Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
delta = deltaY === 0 ? deltaX : deltaY;
// New school wheel delta (wheel event)
if ( 'deltaY' in orgEvent ) {
deltaY = orgEvent.deltaY * -1;
delta = deltaY;
}
if ( 'deltaX' in orgEvent ) {
deltaX = orgEvent.deltaX;
if ( deltaY === 0 ) { delta = deltaX * -1; }
}
// No change actually happened, no reason to go any further
if ( deltaY === 0 && deltaX === 0 ) { return; }
// Store lowest absolute delta to normalize the delta values
absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
if ( !lowestDelta || absDelta < lowestDelta ) {
lowestDelta = absDelta;
}
// Get a whole, normalized value for the deltas
delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);
deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
// Add information to the event object
event.deltaX = deltaX;
event.deltaY = deltaY;
event.deltaFactor = lowestDelta;
// Add event and delta to the front of the arguments
args.unshift(event, delta, deltaX, deltaY);
// Clearout lowestDelta after sometime to better
// handle multiple device types that give different
// a different lowestDelta
// Ex: trackpad = 3 and mouse wheel = 120
if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
return ($.event.dispatch || $.event.handle).apply(this, args);
}
function nullLowestDelta() {
lowestDelta = null;
}
})();
(function(){
if($.event.special.mwheelIntent){return;}
var mwheelI = {
pos: [-260, -260]
},
minDif = 3,
doc = document,
root = doc.documentElement,
body = doc.body,
longDelay, shortDelay
;
if(!body){
$(function(){
body = doc.body;
});
}
function unsetPos(){
if(this === mwheelI.elem){
mwheelI.pos = [-260, -260];
mwheelI.elem = false;
minDif = 3;
}
}
$.event.special.mwheelIntent = {
setup: function(){
var jElm = $(this).on('mousewheel', $.event.special.mwheelIntent.handler);
if( this !== doc && this !== root && this !== body ){
jElm.on('mouseleave', unsetPos);
}
jElm = null;
return true;
},
teardown: function(){
$(this)
.off('mousewheel', $.event.special.mwheelIntent.handler)
.off('mouseleave', unsetPos)
;
return true;
},
handler: function(e, d){
var pos = [e.clientX, e.clientY];
if( this === mwheelI.elem || Math.abs(mwheelI.pos[0] - pos[0]) > minDif || Math.abs(mwheelI.pos[1] - pos[1]) > minDif ){
mwheelI.elem = this;
mwheelI.pos = pos;
minDif = 250;
clearTimeout(shortDelay);
shortDelay = setTimeout(function(){
minDif = 10;
}, 200);
clearTimeout(longDelay);
longDelay = setTimeout(function(){
minDif = 3;
}, 1500);
e = $.extend({}, e, {type: 'mwheelIntent'});
return ($.event.dispatch || $.event.handle).apply(this, arguments);
}
}
};
$.fn.extend({
mwheelIntent: function(fn) {
return fn ? this.on("mwheelIntent", fn) : this.trigger("mwheelIntent");
},
unmwheelIntent: function(fn) {
return this.off("mwheelIntent", fn);
}
});
$(function(){
body = doc.body;
//assume that document is always scrollable, doesn't hurt if not
$(doc).on('mwheelIntent.mwheelIntentDefault', $.noop);
});
})();
(function(){
if($.event.special.mousepress){return;}
var removeTimer = function(elem, full){
var timer = elem.data('mousepresstimer');
if(timer){
clearTimeout(timer);
}
if(full){
elem.off('mouseup.mousepressext mouseleave.mousepressext');
}
elem = null;
};
$.event.special.mousepress = {
setup: function(){
var timer;
$(this).on('mousedown.mousepressext', function(e){
var elem = $(this);
var startIntervall = function(delay){
var steps = 0;
removeTimer(elem);
elem.data('mousepresstimer', setInterval(function(){
$.event.special.mousepress.handler(elem[0], e);
steps++;
if(steps > 3 && delay > 45){
startIntervall(delay - 40);
}
}, delay));
};
var target = $(e.target).trigger('mousepressstart', [e]);
removeTimer(elem);
elem.data('mousepresstimer', setTimeout(function(){
startIntervall(180);
}, 200));
elem.on('mouseup.mousepressext mouseleave.mousepressext', function(e){
removeTimer(elem, true);
target.trigger('mousepressend', [e]);
elem = null;
target = null;
});
});
},
teardown: function(){
removeTimer($(this).off('.mousepressext'), true);
},
handler: function(elem, e){
return $.event.dispatch.call(elem, {type: 'mousepress', target: e.target, pageX: e.pageX, pageY: e.pageY});
}
};
})();
})(webshims.$);
webshims.register('forms-picker', function($, webshims, window, document, undefined, options){
"use strict";
var picker = webshims.picker;
var actions = picker._actions;
var moduleOpts = options;
var getDateArray = function(date){
var ret = [date.getFullYear(), moduleOpts.addZero(date.getMonth() + 1), moduleOpts.addZero(date.getDate())];
ret.month = ret[0]+'-'+ret[1];
ret.date = ret[0]+'-'+ret[1]+'-'+ret[2];
ret.time = moduleOpts.addZero(date.getHours()) +':'+ moduleOpts.addZero(date.getMinutes());
ret['datetime-local'] = ret.date +'T'+ ret.time;
return ret;
};
var today = getDateArray(new Date());
var _setFocus = function(element, _noFocus){
element = $(element || this.activeButton);
this.activeButton.attr({tabindex: '-1', 'aria-selected': 'false'});
this.activeButton = element.attr({tabindex: '0', 'aria-selected': 'true'});
this.index = this.buttons.index(this.activeButton[0]);
clearTimeout(this.timer);
picker._genericSetFocus.apply(this, arguments);
};
var _initialFocus = function(){
var sel;
if(this.popover.navedInitFocus){
sel = this.popover.navedInitFocus.sel || this.popover.navedInitFocus;
if((!this.activeButton || !this.activeButton[0]) && this.buttons[sel]){
this.activeButton = this.buttons[sel]();
} else if(sel){
this.activeButton = $(sel, this.element);
}
if(!this.activeButton[0] && this.popover.navedInitFocus.alt){
this.activeButton = this.buttons[this.popover.navedInitFocus.alt]();
}
}
if(!this.activeButton || !this.activeButton[0]){
this.activeButton = this.buttons.filter('.checked-value');
}
if(!this.activeButton[0]){
this.activeButton = this.buttons.filter('.this-value');
}
if(!this.activeButton[0]){
this.activeButton = this.buttons.eq(0);
}
this.setFocus(this.activeButton, this.opts.noFocus);
};
var formcfg = webshims.formcfg;
var curCfg = formcfg.__active || formcfg[''];
var stopPropagation = function(e){
e.stopImmediatePropagation();
};
var steps = options.steps;
var mousePress = function(e){
$(this)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
};
var getMonthNameHTML = function(index, year, prefix){
var dateCfg = curCfg.date;
var str = [];
if(!prefix){
prefix = '';
}
$.each({monthNames: 'monthname', monthDigits: 'month-digit', monthNamesShort: 'monthname-short'}, function(prop, cName){
var name = [prefix + dateCfg[prop][index]];
if(year){
name.push(year);
if(dateCfg.showMonthAfterYear){
name.reverse();
}
}
str.push('<span class="'+ cName +'">'+ name.join(' ') +'</span>');
});
return str.join('');
};
var setJump = ('inputMode' in document.createElement('input')) || !((/ipad|iphone/i).test(navigator.userAgent));
var widgetProtos = {
_addBindings: function(){
var isFocused;
var that = this;
var o = this.options;
var eventTimer = (function(){
var events = {};
return {
init: function(name, curVal, fn){
if (!events[name]) {
events[name] = {
fn: fn
};
$(that.orig).on(name, function(){
events[name].val = $.prop(that.orig, 'value');
});
}
events[name].val = curVal;
},
call: function(name, val){
if (events[name] && events[name].val != val) {
clearTimeout(events[name].timer);
events[name].val = val;
events[name].fn(val, that);
}
}
};
})();
var initChangeEvents = function(){
eventTimer.init('input', $.prop(that.orig, 'value'), that.options.input);
eventTimer.init('change', $.prop(that.orig, 'value'), that.options.change);
};
var step = {};
var preventBlur = function(e){
if (preventBlur.prevent) {
e.preventDefault();
$(isFocused || that.element.getShadowFocusElement()).trigger('focus');
stopPropagation(e);
return true;
}
};
(function(){
var timer;
var call = function(e){
var val;
clearTimeout(timer);
val = that.parseValue();
if (that.type == 'color') {
that.inputElements.val(val);
}
$.prop(that.orig, 'value', val);
eventTimer.call('input', val);
if (!e || e.type != 'wsupdatevalue') {
eventTimer.call('change', val);
}
};
var onFocus = function(e){
clearTimeout(timer);
$(e.target).trigger('wswidgetfocusin');
};
var onBlur = function(e){
clearTimeout(timer);
timer = setTimeout(call, 0);
$(e.target).trigger('wswidgetfocusout');
if (e.type == 'ws__change') {
stopPropagation(e);
if (!o.splitInput) {
call();
}
}
};
that.element.on('wsupdatevalue', call);
that.inputElements.add(that.buttonWrapper).add(that.element).on({
'ws__focusin': onFocus,
'ws__blur ws__focusout ws__change': onBlur
});
setTimeout(function(){
if (that.popover) {
that.popover.element.on('wspopoverhide', onBlur);
that.popover.element.children().on({
'focusin': onFocus,
'focusout': onBlur
});
}
}, 0);
})();
var spinEvents = {};
var spinElement = o.splitInput ? this.inputElements.filter('.ws-spin') : this.inputElements.eq(0);
var elementEvts = {
ws__blur: function(e){
if (!preventBlur(e) && !o.disabled && !o.readonly) {
if (!preventBlur.prevent) {
isFocused = false;
}
}
stopPropagation(e);
},
ws__focus: function(e){
if (!isFocused) {
initChangeEvents();
isFocused = this;
}
},
keypress: function(e){
if (e.isDefaultPrevented()) {
return;
}
var chr;
var stepped = true;
var code = e.keyCode;
if (!e.ctrlKey && !e.metaKey && curCfg[that.type + 'Signs']) {
chr = String.fromCharCode(e.charCode == null ? code : e.charCode);
stepped = !(chr < " " || (curCfg[that.type + 'Signs'] + '0123456789').indexOf(chr) > -1);
}
else {
stepped = false;
}
if (stepped) {
e.preventDefault();
}
},
ws__input: (this.type == 'color' || !this.isValid) ? $.noop : (function(){
var timer;
var delay = that.type == 'number' && !o.nogrouping ? 99 : 199;
var check = function(){
var val = that.parseValue(true);
if (val && that.isValid(val)) {
that.setInput(val, true);
}
};
return function(){
clearTimeout(timer);
timer = setTimeout(check, delay);
};
})(),
'ws__input keydown keypress': (function(){
var timer;
var isStopped = false;
var releaseTab = function(){
if (isStopped === true) {
isStopped = 'semi';
timer = setTimeout(releaseTab, 250);
}
else {
isStopped = false;
}
};
var stopTab = function(){
isStopped = true;
clearTimeout(timer);
timer = setTimeout(releaseTab, 300);
};
var select = function(){
var elem = this;
setTimeout(function(){
elem.focus();
if(elem.select){
elem.select();
}
}, 4);
stopTab();
};
return function(e){
if (o.splitInput && o.jumpInputs) {
if (e.type == 'ws__input') {
if ($.prop(this, 'value').length === $.prop(this, 'maxLength')) {
try {
$(this).next().next('input, select').each(select);
}
catch (er) {}
}
}
else
if (!e.shiftKey && !e.crtlKey && e.keyCode == 9 && (isStopped === true || (isStopped && !$.prop(this, 'value')))) {
e.preventDefault();
}
}
};
})()
};
var mouseDownInit = function(){
if (!o.disabled && !isFocused) {
that.element.getShadowFocusElement().trigger('focus');
}
preventBlur.set();
return false;
};
preventBlur.set = (function(){
var timer;
var reset = function(){
preventBlur.prevent = false;
};
return function(){
clearTimeout(timer);
preventBlur.prevent = true;
setTimeout(reset, 9);
};
})();
if(o.splitInput && setJump && o.jumpInputs == null){
o.jumpInputs = true;
}
this.buttonWrapper.on('mousedown', mouseDownInit);
this.setInput = function(value, isLive){
that.value(value, false, isLive);
eventTimer.call('input', value);
};
this.setChange = function(value){
that.setInput(value);
eventTimer.call('change', value);
};
this.inputElements.on(elementEvts);
if (steps[this.type]) {
['stepUp', 'stepDown'].forEach(function(name){
step[name] = function(factor){
if (!o.disabled && !o.readonly) {
if (!isFocused) {
mouseDownInit();
}
var ret = false;
if (!factor) {
factor = 1;
}
if(o.stepfactor){
factor *= o.stepfactor;
}
if(factor > 0 && !isNaN(that.minAsNumber) && (isNaN(that.valueAsNumber) || that.valueAsNumber < that.minAsNumber) && that.elemHelper.prop('valueAsNumber') <= that.minAsNumber){
ret = that.asValue(that.minAsNumber);
} else if(factor < 0 && !isNaN(that.maxAsNumber) && (isNaN(that.valueAsNumber) || that.valueAsNumber > that.minAsNumber) && that.elemHelper.prop('valueAsNumber') <= that.maxAsNumber){
ret = that.asValue(that.maxAsNumber);
}
if(ret === false){
try {
that.elemHelper[name](factor);
ret = that.elemHelper.prop('value');
} catch (er) {
if (!o.value && that.maxAsNumber >= that.minAsNumber) {
ret = o.defValue;
}
}
}
if (ret !== false && o.value != ret) {
that.value(ret);
if(o.toFixed && o.type == 'number'){
that.element[0].value = that.toFixed(that.element[0].value, true);
}
eventTimer.call('input', ret);
}
return ret;
}
};
});
if (!o.noSpinbtn) {
spinEvents.mwheelIntent = function(e, delta){
if (delta && isFocused && !o.disabled) {
step[delta > 0 ? 'stepUp' : 'stepDown']();
e.preventDefault();
}
};
spinEvents.keydown = function(e){
if (o.list || e.isDefaultPrevented() || (e.altKey && e.keyCode == 40) || $.attr(this, 'list')) {
return;
}
var stepped = true;
var code = e.keyCode;
if (code == 38) {
step.stepUp();
}
else
if (code == 40) {
step.stepDown();
}
else {
stepped = false;
}
if (stepped) {
e.preventDefault();
}
};
spinElement.on(spinEvents);
}
$(this.buttonWrapper)
.on('mousepressstart mousepressend', '.step-up, .step-down', mousePress)
.on('mousedown mousepress', '.step-up', function(e){
step.stepUp();
})
.on('mousedown mousepress', '.step-down', function(e){
step.stepDown();
})
;
initChangeEvents();
}
},
_getSelectionEnd: function(val){
var oldVal, selectionEnd;
if((oldVal = this.element[0].value) && this.element.is(':focus') && (selectionEnd = this.element.prop('selectionEnd')) < oldVal.length){
if(this.type == 'number'){
oldVal = oldVal.substr(0, selectionEnd).split(curCfg.numberFormat[',']);
val = val.substr(0, selectionEnd).split(curCfg.numberFormat[',']);
if(oldVal.length < val.length){
selectionEnd++;
} else if(oldVal.length > val.length){
selectionEnd--;
}
}
return selectionEnd;
}
},
initDataList: function(){
var listTimer;
var that = this;
var updateList = function(){
$(that.orig)
.jProp('list')
.off('updateDatalist', updateList)
.on('updateDatalist', updateList)
;
clearTimeout(listTimer);
listTimer = setTimeout(function(){
if(that.list){
that.list();
}
}, 9);
};
$(this.orig).onTrigger('listdatalistchange', updateList);
},
getOptions: function(){
var options = {};
var datalist = $(this.orig).jProp('list');
datalist.find('option').each(function(){
options[$.prop(this, 'value')] = $.prop(this, 'label');
});
return [options, datalist.data('label')];
}
};
$.extend($.fn.wsBaseWidget.wsProto, widgetProtos);
$.extend($.fn.spinbtnUI.wsProto, widgetProtos);
$(formcfg).on('change', function(e, data){
curCfg = formcfg.__active;
});
webshims.ListBox = function (element, popover, opts){
this.element = $('ul', element);
this.popover = popover;
this.opts = opts || {};
this.buttons = $('button:not(:disabled)', this.element);
this.ons(this);
this._initialFocus();
};
webshims.ListBox.prototype = {
setFocus: _setFocus,
_initialFocus: _initialFocus,
prev: function(){
var index = this.index - 1;
if(index < 0){
if(this.opts.prev){
this.popover.navedInitFocus = 'last';
this.popover.actionFn(this.opts.prev);
this.popover.navedInitFocus = false;
}
} else {
this.setFocus(this.buttons.eq(index));
}
},
next: function(){
var index = this.index + 1;
if(index >= this.buttons.length){
if(this.opts.next){
this.popover.navedInitFocus = 'first';
this.popover.actionFn(this.opts.next);
this.popover.navedInitFocus = false;
}
} else {
this.setFocus(this.buttons.eq(index));
}
},
ons: function(that){
this.element
.on({
'keydown': function(e){
var handled;
var key = e.keyCode;
if(e.ctrlKey){return;}
if(key == 36 || key == 33){
that.setFocus(that.buttons.eq(0));
handled = true;
} else if(key == 34 || key == 35){
that.setFocus(that.buttons.eq(that.buttons.length - 1));
handled = true;
} else if(key == 38 || key == 37){
that.prev();
handled = true;
} else if(key == 40 || key == 39){
that.next();
handled = true;
}
if(handled){
return false;
}
}
})
;
}
};
webshims.Grid = function (element, popover, opts){
this.element = $('tbody', element);
this.popover = popover;
this.opts = opts || {};
this.buttons = $('button:not(:disabled):not(.othermonth)', this.element);
this.ons(this);
this._initialFocus();
if(this.popover.openedByFocus){
this.popover.activeElement = this.activeButton;
}
};
webshims.Grid.prototype = {
setFocus: _setFocus,
_initialFocus: _initialFocus,
first: function(){
this.setFocus(this.buttons.eq(0));
},
last: function(){
this.setFocus(this.buttons.eq(this.buttons.length - 1));
},
upPage: function(){
$('.ws-picker-header > button:not(:disabled)', this.popover.element).trigger('click');
},
downPage: function(){
this.activeButton.filter(':not([data-action="changeInput"])').trigger('click');
},
ons: function(that){
this.element
.on({
'keydown': function(e){
var handled, sKey;
var key = e.keyCode;
if(e.shiftKey){return;}
sKey = e.ctrlKey || e.altKey; //|| e.metaKey
if((sKey && key == 40)){
handled = 'downPage';
} else if((sKey && key == 38)){
handled = 'upPage';
} else if(key == 33 || (sKey && key == 37)){
handled = 'prevPage';
} else if(key == 34 || (sKey && key == 39)){
handled = 'nextPage';
} else if(e.keyCode == 36 || e.keyCode == 33){
handled = 'first';
} else if(e.keyCode == 35){
handled = 'last';
} else if(e.keyCode == 38){
handled = 'up';
} else if(e.keyCode == 37){
handled = 'prev';
} else if(e.keyCode == 40){
handled = 'down';
} else if(e.keyCode == 39){
handled = 'next';
}
if(handled){
that[handled]();
return false;
}
}
})
;
}
};
$.each({
prevPage: {get: 'last', action: 'prev'},
nextPage: {get: 'first', action: 'next'}
}, function(name, val){
webshims.Grid.prototype[name] = function(){
if(this.opts[val.action]){
this.popover.navedInitFocus = {
sel: 'button[data-id="'+ this.activeButton.attr('data-id') +'"]:not(:disabled,.othermonth)',
alt: val.get
};
this.popover.actionFn(this.opts[val.action]);
this.popover.navedInitFocus = false;
}
};
});
$.each({
up: {traverse: 'prevAll', get: 'last', action: 'prev', reverse: true},
down: {traverse: 'nextAll', get: 'first', action: 'next'}
}, function(name, val){
webshims.Grid.prototype[name] = function(){
var cellIndex = this.activeButton.closest('td').prop('cellIndex');
var sel = 'td:nth-child('+(cellIndex + 1)+') button:not(:disabled,.othermonth)';
var button = this.activeButton.closest('tr')[val.traverse]();
if(val.reverse){
button = $(button.get().reverse());
}
button = button.find(sel)[val.get]();
if(!button[0]){
if(this.opts[val.action]){
this.popover.navedInitFocus = sel+':'+val.get;
this.popover.actionFn(this.opts[val.action]);
this.popover.navedInitFocus = false;
}
} else {
this.setFocus(button.eq(0));
}
};
});
$.each({
prev: {traverse: 'prevAll',get: 'last', reverse: true},
next: {traverse: 'nextAll', get: 'first'}
}, function(name, val){
webshims.Grid.prototype[name] = function(){
var sel = 'button:not(:disabled,.othermonth)';
var button = this.activeButton.closest('td')[val.traverse]('td');
if(val.reverse){
button = $(button.get().reverse());
}
button = button.find(sel)[val.get]();
if(!button[0]){
button = this.activeButton.closest('tr')[val.traverse]('tr');
if(val.reverse){
button = $(button.get().reverse());
}
button = button.find(sel)[val.get]();
}
if(!button[0]){
if(this.opts[name]){
this.popover.navedInitFocus = val.get;
this.popover.actionFn(this.opts[name]);
this.popover.navedInitFocus = false;
}
} else {
this.setFocus(button.eq(0));
}
};
});
//taken from jquery ui
picker.getWeek = function(date){
var time;
var checkDate = new Date(date.getTime());
checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
time = checkDate.getTime();
checkDate.setMonth(0);
checkDate.setDate(1);
return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
};
picker.getYearList = function(value, data){
var j, i, val, disabled, lis, prevDisabled, nextDisabled, classStr, classArray, start;
var o = data.options;
var size = o.size;
var max = o.max.split('-');
var min = o.min.split('-');
var cols = o.cols || 4;
var currentValue = o.value.split('-');
var xthCorrect = 0;
var enabled = 0;
var str = '';
var rowNum = 0;
var triggerValueValidation = (data.orig && ('validatevalue' in $.data(data.orig)));
if(!data.options.useDecadeBase){
if(!max[0] && min[0]){
data.options.useDecadeBase = 'min';
} else if(max[0] && !min[0]){
data.options.useDecadeBase = 'max';
}
}
if(data.options.useDecadeBase == 'max' && max[0]){
xthCorrect = 11 - (max[0] % 12);
} else if(data.options.useDecadeBase == 'min' && min[0]){
xthCorrect = 0 - (min[0] % 12);
}
value = value[0] * 1;
start = value - ((value + xthCorrect) % (12 * size));
for(j = 0; j < size; j++){
if(j){
start += 12;
} else {
prevDisabled = picker.isInRange([start-1], max, min) ? {'data-action': 'setYearList','value': start-1} : false;
}
str += '<div class="year-list picker-list ws-index-'+ j +'"><div class="ws-picker-header"><select data-action="setYearList" class="decade-select">'+ picker.createYearSelect(value, max, min, '', {start: start, step: 12 * size, label: start+' '+(start + 11)}).join('') +'</select><button disabled="disabled"><span>'+ start +' '+(start + 11)+'</span></button></div>';
lis = [];
for(i = 0; i < 12; i++){
val = start + i ;
classArray = [];
if( !picker.isInRange([val], max, min) || (triggerValueValidation && $(data.orig).triggerHandler('validatevalue', [{value: val, valueAsDate: null, isPartial: [val]}]))){
disabled = ' disabled=""';
} else {
disabled = '';
enabled++;
}
if(val == today[0]){
classArray.push('this-value');
}
if(currentValue[0] == val){
classArray.push('checked-value');
}
classStr = classArray.length ? ' class="'+ (classArray.join(' ')) +'"' : '';
if(i && !(i % cols)){
rowNum++;
lis.push('</tr><tr class="ws-row-'+ rowNum +'">');
}
lis.push('<td class="ws-item-'+ i +'" role="presentation"><button data-id="year-'+ i +'" type="button"'+ disabled + classStr +' data-action="setMonthList" value="'+val+'" tabindex="-1" role="gridcell">'+val+'</button></td>');
}
if(j == size - 1){
nextDisabled = picker.isInRange([val+1], max, min) ? {'data-action': 'setYearList','value': val+1} : false;
}
str += '<div class="picker-grid"><table role="grid" aria-label="'+ start +' '+(start + 11)+'"><tbody><tr class="ws-row-0">'+ (lis.join(''))+ '</tr></tbody></table></div></div>';
}
return {
enabled: enabled,
main: str,
next: nextDisabled,
prev: prevDisabled,
type: 'Grid'
};
};
picker.getMonthList = function(value, data){
var j, i, name, val, disabled, lis, prevDisabled, nextDisabled, classStr, classArray;
var o = data.options;
var size = o.size;
var max = o.maxS;
var min = o.minS;
var cols = o.cols || 4;
var currentValue = o.value.split('-');
var enabled = 0;
var rowNum = 0;
var str = '';
var action = data.type == 'month' ? 'changeInput' : 'setDayList' ;
var triggerValueValidation = (data.orig && ('validatevalue' in $.data(data.orig)));
var isPartial = action != 'changeInput';
value = value[0] - Math.floor((size - 1) / 2);
for(j = 0; j < size; j++){
if(j){
value++;
} else {
prevDisabled = picker.isInRange([value-1], max, min) ? {'data-action': 'setMonthList','value': value-1} : false;
}
if(j == size - 1){
nextDisabled = picker.isInRange([value+1], max, min) ? {'data-action': 'setMonthList','value': value+1} : false;
}
lis = [];
if( !picker.isInRange([value, '01'], max, min) && !picker.isInRange([value, '12'], max, min)){
disabled = ' disabled=""';
} else {
disabled = '';
}
if(o.minView >= 1){
disabled = ' disabled=""';
}
str += '<div class="month-list picker-list ws-index-'+ j +'"><div class="ws-picker-header">';
str += '<select data-action="setMonthList" class="year-select">'+ picker.createYearSelect(value, max, min).join('') +'</select> <button data-action="setYearList"'+disabled+' value="'+ value +'" tabindex="-1"><span>'+ value +'</span></button>';
str += '</div>';
for(i = 0; i < 12; i++){
val = curCfg.date.monthkeys[i+1];
name = getMonthNameHTML(i);
classArray = [];
if(!picker.isInRange([value, val], max, min) || (triggerValueValidation && $(data.orig).triggerHandler('validatevalue', [{value: value+'-'+val, valueAsDate: data.asDate(value+'-'+val), isPartial: isPartial && [value, val]}]))){
disabled = ' disabled=""';
} else {
disabled = '';
enabled++;
}
if(value == today[0] && today[1] == val){
classArray.push('this-value');
}
if(currentValue[0] == value && currentValue[1] == val){
classArray.push('checked-value');
}
classStr = (classArray.length) ? ' class="'+ (classArray.join(' ')) +'"' : '';
if(i && !(i % cols)){
rowNum++;
lis.push('</tr><tr class="ws-row-'+ rowNum +'">');
}
lis.push('<td class="ws-item-'+ i +'" role="presentation"><button data-id="month-'+ i +'" type="button"'+ disabled + classStr +' data-action="'+ action +'" value="'+value+'-'+val+'" tabindex="-1" role="gridcell" aria-label="'+ curCfg.date.monthNames[i] +'">'+name+'</button></td>');
}
str += '<div class="picker-grid"><table role="grid" aria-label="'+value+'"><tbody><tr class="ws-row-0">'+ (lis.join(''))+ '</tr></tbody></table></div></div>';
}
return {
enabled: enabled,
main: str,
prev: prevDisabled,
next: nextDisabled,
type: 'Grid'
};
};
picker.getDayList = function(value, data){
var j, i, k, day, nDay, disabled, prevDisabled, nextDisabled, yearNext, yearPrev, addTr, week, rowNum;
var lastMonth, curMonth, otherMonth, dateArray, monthName, fullMonthName, buttonStr, date2, classArray;
var o = data.options;
var size = o.size;
var max = o.maxS;
var min = o.minS;
var currentValue = o.value.split('T')[0].split('-');
var dateCfg = curCfg.date;
var str = [];
var date = new Date(value[0], value[1] - 1, 1);
var action = (data.type == 'datetime-local') ? 'setTimeList' : 'changeInput';
var triggerValueValidation = (data.orig && ('validatevalue' in $.data(data.orig)));
var isPartial = action != 'changeInput';
date.setMonth(date.getMonth() - Math.floor((size - 1) / 2));
yearNext = [ (value[0] * 1) + 1, value[1] ];
yearNext = picker.isInRange(yearNext, max, min) ? {'data-action': 'setDayList','value': yearNext.join('-')} : false;
yearPrev = [ (value[0] * 1) - 1, value[1] ];
yearPrev = picker.isInRange(yearPrev, max, min) ? {'data-action': 'setDayList','value': yearPrev.join('-')} : false;
for(j = 0; j < size; j++){
date.setDate(1);
lastMonth = date.getMonth();
rowNum = 0;
if(!j){
date2 = new Date(date.getTime());
date2.setDate(-1);
dateArray = getDateArray(date2);
prevDisabled = picker.isInRange(dateArray, max, min) ? {'data-action': 'setDayList','value': dateArray[0]+'-'+dateArray[1]} : false;
}
dateArray = getDateArray(date);
str.push('<div class="day-list picker-list ws-index-'+ j +'"><div class="ws-picker-header">');
monthName = ['<select data-action="setDayList" class="month-select" tabindex="0">'+ picker.createMonthSelect(dateArray, max, min).join('') +'</select>', '<select data-action="setDayList" class="year-select" tabindex="0">'+ picker.createYearSelect(dateArray[0], max, min, '-'+dateArray[1]).join('') +'</select>'];
if(curCfg.date.showMonthAfterYear){
monthName.reverse();
}
str.push( monthName.join(' ') );
fullMonthName = [dateCfg.monthNames[(dateArray[1] * 1) - 1], dateArray[0]];
if(dateCfg.showMonthAfterYear){
fullMonthName.reverse();
}
str.push(
'<button data-action="setMonthList"'+ (o.minView >= 2 ? ' disabled="" ' : '') +' value="'+ dateArray.date +'" tabindex="-1">'+ getMonthNameHTML((dateArray[1] * 1) - 1, dateArray[0]) +'</button>'
);
str.push('</div><div class="picker-grid"><table role="grid" aria-label="'+ fullMonthName.join(' ') +'"><thead><tr>');
str.push('<th class="week-header ws-week">'+ dateCfg.weekHeader +'</th>');
for(k = dateCfg.firstDay; k < dateCfg.dayNamesShort.length; k++){
str.push('<th class="day-'+ k +'"><abbr title="'+ dateCfg.dayNames[k] +'">'+ dateCfg.dayNamesShort[k] +'</abbr></th>');
}
k = dateCfg.firstDay;
while(k--){
str.push('<th class="day-'+ k +'"><abbr title="'+ dateCfg.dayNames[k] +'">'+ dateCfg.dayNamesShort[k] +'</abbr></th>');
}
str.push('</tr></thead><tbody><tr class="ws-row-0">');
week = picker.getWeek(date);
str.push('<td class="week-cell ws-week" role="gridcell" aria-disabled="true">'+ week +'</td>');
for (i = 0; i < 99; i++) {
addTr = (i && !(i % 7));
curMonth = date.getMonth();
otherMonth = lastMonth != curMonth;
day = date.getDay();
classArray = [];
if(addTr && otherMonth && rowNum >= 5){
str.push('</tr>');
break;
}
if(addTr){
rowNum++;
str.push('</tr><tr class="ws-row-'+ rowNum + ((otherMonth) ? ' other-month-row' : '')+'">');
week++;
if(week > 52){
week = picker.getWeek(date);
}
str.push('<td class="week-cell ws-week" role="gridcell" aria-disabled="true">'+ week +'</td>');
}
if(!i){
if(day != curCfg.date.firstDay){
nDay = day - curCfg.date.firstDay;
if(nDay < 0){
nDay += 7;
}
date.setDate(date.getDate() - nDay);
day = date.getDay();
curMonth = date.getMonth();
otherMonth = lastMonth != curMonth;
}
}
dateArray = getDateArray(date);
buttonStr = '<td role="presentation" class="day-'+ day +'"><button data-id="day-'+ date.getDate() +'" role="gridcell" data-action="'+action+'" value="'+ (dateArray.join('-')) +'" type="button"';
if(otherMonth){
classArray.push('othermonth');
} else {
classArray.push('day-'+date.getDate());
}
if(dateArray[0] == today[0] && today[1] == dateArray[1] && today[2] == dateArray[2]){
classArray.push('this-value');
}
if(currentValue[0] == dateArray[0] && dateArray[1] == currentValue[1] && dateArray[2] == currentValue[2]){
classArray.push('checked-value');
}
if(classArray.length){
buttonStr += ' class="'+ classArray.join(' ') +'"';
}
if(!picker.isInRange(dateArray, max, min) || (triggerValueValidation && $(data.orig).triggerHandler('validatevalue', [{value: dateArray.join('-'), valueAsDate: date, isPartial: isPartial && dateArray}]))){
buttonStr += ' disabled=""';
}
str.push(buttonStr+' tabindex="-1">'+ date.getDate() +'</button></td>');
date.setDate(date.getDate() + 1);
}
str.push('</tbody></table></div></div>');
if(j == size - 1){
dateArray = getDateArray(date);
dateArray[2] = 1;
nextDisabled = picker.isInRange(dateArray, max, min) ? {'data-action': 'setDayList','value': dateArray.date} : false;
}
}
return {
enabled: 9,
main: str.join(''),
prev: prevDisabled,
next: nextDisabled,
yearPrev: yearPrev,
yearNext: yearNext,
type: 'Grid'
};
};
// var createDatimeValue =
picker.getTimeList = function(value, data){
var label, tmpValue, iVal, hVal, valPrefix;
var str = '<div class="time-list picker-list ws-index-0">';
var i = 0;
var rowNum = 0;
var len = 23;
var attrs = {
min: $.prop(data.orig, 'min'),
max: $.prop(data.orig, 'max'),
step: $.prop(data.orig, 'step')
};
var triggerValueValidation = (data.orig && ('validatevalue' in $.data(data.orig)));
var gridLabel = '';
if(data.type == 'time'){
label = '<button type="button" disabled="">'+ $.trim($(data.orig).jProp('labels').text() || '').replace(/[\:\*]/g, '')+'</button>';
} else {
tmpValue = value[2].split('T');
value[2] = tmpValue[0];
if(tmpValue[1]){
value[3] = tmpValue[1];
}
gridLabel = ' aria-label="'+ value[2] +'. '+ (curCfg.date.monthNames[(value[1] * 1) - 1]) +' '+ value[0] +'"';
label = getMonthNameHTML((value[1] * 1) - 1, value[0], value[2] +'. ');
label = '<button tabindex="-1" data-action="setDayList" value="'+value[0]+'-'+value[1]+'-'+value[2]+'" type="button">'+label+'</button>';
valPrefix = value[0] +'-'+value[1]+'-'+value[2]+'T';
}
str += '<div class="ws-picker-header">'+label+'</div>';
str += '<div class="picker-grid"><table role="grid"'+ gridLabel +'><tbody><tr>';
for(; i <= len; i++){
iVal = moduleOpts.addZero(''+i) +':00';
hVal = valPrefix ?
valPrefix+iVal :
iVal
;
if(i && !(i % 4)){
rowNum++;
str += '</tr><tr class="ws-row-'+ rowNum +'">';
}
str += '<td role="presentation"><button role="gridcell" data-action="changeInput" value="'+ hVal +'" type="button" tabindex="-1"';
if(!data.isValid(hVal, attrs) || (triggerValueValidation && $(data.orig).triggerHandler('validatevalue', [{value: hVal, valueAsDate: data.asDate(hVal), partial: false}]))){
str += ' disabled=""';
}
if(value == iVal){
str += ' class="checked-value"';
}
str += '>'+ webshims._format.time(iVal) +'</button></td>';
}
str += '</tr></tbody></table></div></div>';
return {
enabled: 9,
main: str,
prev: false,
next: false,
type: 'Grid'
};
};
picker.isInRange = function(values, max, min){
var i;
var ret = true;
for(i = 0; i < values.length; i++){
if(min[i] && min[i] > values[i]){
ret = false;
break;
} else if( !(min[i] && min[i] == values[i]) ){
break;
}
}
if(ret){
for(i = 0; i < values.length; i++){
if((max[i] && max[i] < values[i])){
ret = false;
break;
} else if( !(max[i] && max[i] == values[i]) ){
break;
}
}
}
return ret;
};
picker.createMonthSelect = function(value, max, min, monthNames){
if(!monthNames){
monthNames = curCfg.date.monthNames;
}
var selected;
var i = 0;
var options = [];
var tempVal = value[1]-1;
for(; i < monthNames.length; i++){
selected = tempVal == i ? ' selected=""' : '';
if(selected || picker.isInRange([value[0], i+1], max, min)){
options.push('<option value="'+ value[0]+'-'+moduleOpts.addZero(i+1) + '"'+selected+'>'+ monthNames[i] +'</option>');
}
}
return options;
};
(function(){
var retNames = function(name){
return 'get'+name+'List';
};
var retSetNames = function(name){
return 'set'+name+'List';
};
var stops = {
date: 'Day',
week: 'Day',
month: 'Month',
'datetime-local': 'Time',
time: 'Time'
};
var setDirButtons = function(content, popover, dir){
if(content[dir]){
//set content and idl attribute (content for css + idl for IE8-)
popover[dir+'Element']
.attr(content[dir])
.prop({disabled: false})
.prop(content[dir])
;
} else {
popover[dir+'Element']
.removeAttr('data-action')
.prop({disabled: true})
;
}
};
$.each({'setYearList' : ['Year', 'Month', 'Day', 'Time'], 'setMonthList': ['Month', 'Day', 'Time'], 'setDayList': ['Day', 'Time'], 'setTimeList': ['Time']}, function(setName, names){
var getNames = names.map(retNames);
var setNames = names.map(retSetNames);
actions[setName] = function(val, popover, data, startAt){
val = ''+val;
var o = data.options;
var values = val.split('-');
if(!startAt){
startAt = 0;
}
$.each(getNames, function(i, item){
if(i >= startAt){
var content = picker[item](values, data);
if( values.length < 2 || content.enabled > 1 || content.prev || content.next || stops[data.type] === names[i]){
popover.element
.attr({'data-currentview': setNames[i]})
.addClass('ws-size-'+o.size)
.data('pickercontent', {
data: data,
content: content,
values: values
})
;
popover.bodyElement.html(content.main);
setDirButtons(content, popover, 'prev');
setDirButtons(content, popover, 'next');
setDirButtons(content, popover, 'yearPrev');
setDirButtons(content, popover, 'yearNext');
$(o.orig).trigger('pickerchange');
if(webshims[content.type]){
new webshims[content.type](popover.bodyElement.children(), popover, content);
}
popover.element
.filter('[data-vertical="bottom"]')
.triggerHandler('pospopover')
;
return false;
}
}
});
};
});
})();
picker.showPickerContent = function(data, popover){
var options = data.options;
var init = data._popoverinit;
data._popoverinit = true;
if(!init){
picker.commonInit(data, popover);
picker.commonDateInit(data, popover);
}
popover.element.triggerHandler('updatepickercontent');
if(!init || options.restartView) {
actions.setYearList( options.defValue || options.value, popover, data, options.startView);
} else {
actions[popover.element.attr('data-currentview') || 'setYearList']( options.defValue || options.value, popover, data, 0);
}
data._popoverinit = true;
};
picker.commonDateInit = function(data, popover){
if(data._commonDateInit){return;}
data._commonDateInit = true;
var o = data.options;
var actionfn = function(e){
2014-07-20 02:43:13 +02:00
if(!$(this).hasClass('othermonth') || $(this).css('cursor') == 'pointer'){
popover.actionFn({
'data-action': $.attr(this, 'data-action'),
value: $(this).val() || $.attr(this, 'value')
});
}
return false;
};
var id = new Date().getTime();
var generateList = function(o, max, min){
var options = [];
var label = '';
var labelId = '';
o.options = data.getOptions() || {};
$('div.ws-options', popover.contentElement).remove();
$.each(o.options[0], function(val, label){
var disabled = picker.isInRange(val.split('-'), o.maxS, o.minS) ?
'' :
' disabled="" '
;
if(label){
label = ' <span class="ws-label">'+ label +'</span>';
}
options.push('<li role="presentation"><button value="'+ val +'" '+disabled+' data-action="changeInput" tabindex="-1" role="option"><span class="ws-value">'+ data.formatValue(val, false) +'</span>'+ label +'</button></li>');
});
if(options.length){
id++;
if(o.options[1]){
labelId = 'datalist-'+id;
label = '<h5 id="'+labelId+'">'+ o.options[1] +'</h5>';
labelId = ' aria-labelledbyid="'+ labelId +'" ';
}
new webshims.ListBox($('<div class="ws-options">'+label+'<ul role="listbox" '+ labelId +'>'+ options.join('') +'</div>').insertAfter(popover.bodyElement)[0], popover, {noFocus: true});
}
};
var updateContent = function(){
var tmpMinMax;
if(popover.isDirty){
popover.isDirty = false;
tmpMinMax = o.max.split('T');
o.maxS = tmpMinMax[0].split('-');
if(tmpMinMax[1]){
o.maxS.push(tmpMinMax[1]);
}
tmpMinMax = o.min.split('T');
o.minS = tmpMinMax[0].split('-');
if(tmpMinMax[1]){
o.minS.push(tmpMinMax[1]);
}
$('button', popover.buttonRow).each(function(){
var text;
2014-07-20 02:43:13 +02:00
if($(this).hasClass('ws-empty')){
text = curCfg.date.clear;
if(!text){
text = formcfg[''].date.clear || 'clear';
webshims.warn("could not get clear text from form cfg");
}
2014-07-20 02:43:13 +02:00
} else if($(this).hasClass('ws-current')){
text = (curCfg[data.type] || {}).currentText;
if(!text){
text = (formcfg[''][[data.type]] || {}).currentText || (curCfg.date || {}).currentText || 'current';
webshims.warn("could not get currentText from form cfg for "+data.type);
}
if(today[data.type] && data.type != 'time'){
$.prop(this, 'disabled', (!picker.isInRange(today[data.type].split('-'), o.maxS, o.minS) || !!$(data.orig).triggerHandler('validatevalue', [{value: today[data.type], valueAsDate: new Date(), isPartial: false}])));
}
}
if(text){
$(this).text(text).attr({'aria-label': text});
}
});
popover.nextElement
.attr({'aria-label': curCfg.date.nextText})
;
popover.prevElement
.attr({'aria-label': curCfg.date.prevText})
;
popover.yearNextElement
.attr({'aria-label': curCfg.date.nextText})
;
popover.yearPrevElement
.attr({'aria-label': curCfg.date.prevText})
;
popover.contentElement.attr({
dir: curCfg.date.isRTL ? 'rtl' : 'ltr',
lang: webshims.formcfg.__activeName
});
generateList(o, o.maxS, o.minS);
if(popover.isVisible){
picker.showPickerContent(data, popover);
}
}
$('button.ws-empty', popover.buttonRow).prop('disabled', $.prop(data.orig, 'required'));
popover.isDirty = false;
};
if(data.type == 'time'){
o.minView = 3;
o.startView = 3;
}
if(!o.minView){
o.minView = 0;
}
if(o.startView < o.minView){
o.startView = o.minView;
webshims.warn("wrong config for minView/startView.");
}
if(!o.size){
o.size = 1;
}
popover.actionFn = function(obj){
var changeChangeBehavior;
if(actions[obj['data-action']]){
if(obj['data-action'] == 'changeInput' && o.inlinePicker && o.updateOnInput){
data._handledValue = true;
if(o.size > 1){
changeChangeBehavior = $('button[value="'+obj.value+'"]', popover.bodyElement);
if(changeChangeBehavior.filter(':not(.othermonth)').length){
$('button.checked-value', popover.bodyElement).removeClass('checked-value');
changeChangeBehavior.addClass('checked-value').trigger('focus');
o.updateOnInput = false;
} else {
changeChangeBehavior = false;
}
}
}
actions[obj['data-action']](obj.value, popover, data, 0);
if(data._handledValue){
delete data._handledValue;
if(changeChangeBehavior){
o.updateOnInput = true;
}
}
} else {
webshims.warn('no action for '+ obj['data-action']);
}
};
popover.contentElement.html('<div class="prev-controls ws-picker-controls"><button class="ws-super-prev ws-year-btn" tabindex="0" type="button"></button><button class="ws-prev" tabindex="0" type="button"></button></div> <div class="next-controls ws-picker-controls"><button class="ws-next" tabindex="0" type="button"></button><button class="ws-super-next ws-year-btn" tabindex="0" type="button"></button></div><div class="ws-picker-body"></div><div class="ws-button-row"><button type="button" class="ws-current" data-action="changeInput" value="'+today[data.type]+'" tabindex="0"></button> <button type="button" data-action="changeInput" value="" class="ws-empty" tabindex="0"></button></div>');
popover.nextElement = $('button.ws-next', popover.contentElement);
popover.prevElement = $('button.ws-prev', popover.contentElement);
popover.yearNextElement = $('button.ws-super-next', popover.contentElement);
popover.yearPrevElement = $('button.ws-super-prev', popover.contentElement);
popover.bodyElement = $('div.ws-picker-body', popover.contentElement);
popover.buttonRow = $('div.ws-button-row', popover.contentElement);
popover.element.on('updatepickercontent', updateContent);
popover.contentElement
.wsTouchClick('button[data-action]', actionfn)
.on('change', 'select[data-action]', actionfn)
;
$(o.orig).on('input', function(){
var currentView;
if(o.updateOnInput && popover.isVisible && o.value && (currentView = popover.element.attr('data-currentview'))){
actions[currentView]( data.options.value , popover, data, 0);
}
});
$(document).onTrigger('wslocalechange', data._propertyChange);
if(o.updateOnInput == null && (o.inlinePicker || o.noChangeDismiss)){
o.updateOnInput = true;
}
if(o.inlinePicker){
popover.element.attr('data-class', $.prop(data.orig, 'className'));
popover.element.attr('data-id', $.prop(data.orig, 'id'));
}
$(o.orig).trigger('pickercreated');
};
});