webshims-rails 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/lib/webshims-rails/version.rb +2 -2
  2. data/vendor/assets/javascripts/webshims/minified/polyfiller.js +30 -29
  3. data/vendor/assets/javascripts/webshims/minified/shims/combos/1.js +12 -12
  4. data/vendor/assets/javascripts/webshims/minified/shims/combos/10.js +76 -76
  5. data/vendor/assets/javascripts/webshims/minified/shims/combos/11.js +12 -12
  6. data/vendor/assets/javascripts/webshims/minified/shims/combos/12.js +12 -12
  7. data/vendor/assets/javascripts/webshims/minified/shims/combos/13.js +27 -27
  8. data/vendor/assets/javascripts/webshims/minified/shims/combos/16.js +12 -12
  9. data/vendor/assets/javascripts/webshims/minified/shims/combos/17.js +14 -14
  10. data/vendor/assets/javascripts/webshims/minified/shims/combos/18.js +63 -60
  11. data/vendor/assets/javascripts/webshims/minified/shims/combos/19.js +59 -59
  12. data/vendor/assets/javascripts/webshims/minified/shims/combos/20.js +1 -1
  13. data/vendor/assets/javascripts/webshims/minified/shims/combos/22.js +1 -1
  14. data/vendor/assets/javascripts/webshims/minified/shims/combos/24.js +67 -67
  15. data/vendor/assets/javascripts/webshims/minified/shims/combos/25.js +59 -58
  16. data/vendor/assets/javascripts/webshims/minified/shims/combos/26.js +81 -80
  17. data/vendor/assets/javascripts/webshims/minified/shims/combos/27.js +103 -102
  18. data/vendor/assets/javascripts/webshims/minified/shims/combos/6.js +34 -31
  19. data/vendor/assets/javascripts/webshims/minified/shims/combos/7.js +41 -38
  20. data/vendor/assets/javascripts/webshims/minified/shims/combos/8.js +35 -35
  21. data/vendor/assets/javascripts/webshims/minified/shims/combos/9.js +67 -67
  22. data/vendor/assets/javascripts/webshims/minified/shims/dom-extend.js +17 -17
  23. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-api.js +10 -8
  24. data/vendor/assets/javascripts/webshims/minified/shims/form-number-date-ui.js +24 -23
  25. data/vendor/assets/javascripts/webshims/minified/shims/mediaelement-swf.js +1 -1
  26. data/vendor/assets/javascripts/webshims/minified/shims/styles/shim.css +9 -0
  27. data/vendor/assets/javascripts/webshims/minified/shims/track-ui.js +9 -9
  28. data/vendor/assets/javascripts/webshims/minified/shims/track.js +21 -20
  29. data/vendor/assets/javascripts/webshims/polyfiller.js +144 -140
  30. data/vendor/assets/javascripts/webshims/shims/combos/1.js +10 -6
  31. data/vendor/assets/javascripts/webshims/shims/combos/10.js +11 -7
  32. data/vendor/assets/javascripts/webshims/shims/combos/11.js +10 -6
  33. data/vendor/assets/javascripts/webshims/shims/combos/12.js +10 -6
  34. data/vendor/assets/javascripts/webshims/shims/combos/13.js +10 -6
  35. data/vendor/assets/javascripts/webshims/shims/combos/16.js +10 -6
  36. data/vendor/assets/javascripts/webshims/shims/combos/17.js +10 -6
  37. data/vendor/assets/javascripts/webshims/shims/combos/18.js +986 -924
  38. data/vendor/assets/javascripts/webshims/shims/combos/19.js +10 -6
  39. data/vendor/assets/javascripts/webshims/shims/combos/20.js +1 -1
  40. data/vendor/assets/javascripts/webshims/shims/combos/22.js +1 -1
  41. data/vendor/assets/javascripts/webshims/shims/combos/24.js +10 -6
  42. data/vendor/assets/javascripts/webshims/shims/combos/25.js +820 -768
  43. data/vendor/assets/javascripts/webshims/shims/combos/26.js +820 -768
  44. data/vendor/assets/javascripts/webshims/shims/combos/27.js +821 -769
  45. data/vendor/assets/javascripts/webshims/shims/combos/6.js +986 -924
  46. data/vendor/assets/javascripts/webshims/shims/combos/7.js +986 -924
  47. data/vendor/assets/javascripts/webshims/shims/combos/8.js +10 -6
  48. data/vendor/assets/javascripts/webshims/shims/combos/9.js +11 -7
  49. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +10 -6
  50. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +77 -77
  51. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +909 -847
  52. data/vendor/assets/javascripts/webshims/shims/mediaelement-swf.js +1 -1
  53. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +9 -0
  54. data/vendor/assets/javascripts/webshims/shims/track-ui.js +300 -291
  55. data/vendor/assets/javascripts/webshims/shims/track.js +810 -762
  56. metadata +10 -5
@@ -1183,80 +1183,80 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
1183
1183
  dateToString: function(date){
1184
1184
  return (date && date.getFullYear) ? date.getUTCFullYear() +'-'+ addleadingZero(date.getUTCMonth()+1, 2) +'-'+ addleadingZero(date.getUTCDate(), 2) : false;
1185
1185
  }
1186
+ },
1187
+ time: {
1188
+ mismatch: function(val, _getParsed){
1189
+ if(!val || !val.split || !(/\d$/.test(val))){return true;}
1190
+ val = val.split(/\u003A/);
1191
+ if(val.length < 2 || val.length > 3){return true;}
1192
+ var ret = false,
1193
+ sFraction;
1194
+ if(val[2]){
1195
+ val[2] = val[2].split(/\u002E/);
1196
+ sFraction = parseInt(val[2][1], 10);
1197
+ val[2] = val[2][0];
1198
+ }
1199
+ $.each(val, function(i, part){
1200
+ if(!isDateTimePart(part) || part.length !== 2){
1201
+ ret = true;
1202
+ return false;
1203
+ }
1204
+ });
1205
+ if(ret){return true;}
1206
+ if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
1207
+ return true;
1208
+ }
1209
+ if(val[2] && (val[2] > 59 || val[2] < 0 )){
1210
+ return true;
1211
+ }
1212
+ if(sFraction && isNaN(sFraction)){
1213
+ return true;
1214
+ }
1215
+ if(sFraction){
1216
+ if(sFraction < 100){
1217
+ sFraction *= 100;
1218
+ } else if(sFraction < 10){
1219
+ sFraction *= 10;
1220
+ }
1221
+ }
1222
+ return (_getParsed === true) ? [val, sFraction] : false;
1223
+ },
1224
+ step: 60,
1225
+ stepBase: 0,
1226
+ stepScaleFactor: 1000,
1227
+ asDate: function(val){
1228
+ val = new Date(this.asNumber(val));
1229
+ return (isNaN(val)) ? null : val;
1230
+ },
1231
+ asNumber: function(val){
1232
+ var ret = nan;
1233
+ val = this.mismatch(val, true);
1234
+ if(val !== true){
1235
+ ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
1236
+ if(val[1]){
1237
+ ret += val[1];
1238
+ }
1239
+ }
1240
+ return ret;
1241
+ },
1242
+ dateToString: function(date){
1243
+ if(date && date.getUTCHours){
1244
+ var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
1245
+ tmp = date.getSeconds()
1246
+ ;
1247
+ if(tmp != "0"){
1248
+ str += ':'+ addleadingZero(tmp, 2);
1249
+ }
1250
+ tmp = date.getUTCMilliseconds();
1251
+ if(tmp != "0"){
1252
+ str += '.'+ addleadingZero(tmp, 3);
1253
+ }
1254
+ return str;
1255
+ } else {
1256
+ return false;
1257
+ }
1258
+ }
1186
1259
  }
1187
- // ,time: {
1188
- // mismatch: function(val, _getParsed){
1189
- // if(!val || !val.split || !(/\d$/.test(val))){return true;}
1190
- // val = val.split(/\u003A/);
1191
- // if(val.length < 2 || val.length > 3){return true;}
1192
- // var ret = false,
1193
- // sFraction;
1194
- // if(val[2]){
1195
- // val[2] = val[2].split(/\u002E/);
1196
- // sFraction = parseInt(val[2][1], 10);
1197
- // val[2] = val[2][0];
1198
- // }
1199
- // $.each(val, function(i, part){
1200
- // if(!isDateTimePart(part) || part.length !== 2){
1201
- // ret = true;
1202
- // return false;
1203
- // }
1204
- // });
1205
- // if(ret){return true;}
1206
- // if(val[0] > 23 || val[0] < 0 || val[1] > 59 || val[1] < 0){
1207
- // return true;
1208
- // }
1209
- // if(val[2] && (val[2] > 59 || val[2] < 0 )){
1210
- // return true;
1211
- // }
1212
- // if(sFraction && isNaN(sFraction)){
1213
- // return true;
1214
- // }
1215
- // if(sFraction){
1216
- // if(sFraction < 100){
1217
- // sFraction *= 100;
1218
- // } else if(sFraction < 10){
1219
- // sFraction *= 10;
1220
- // }
1221
- // }
1222
- // return (_getParsed === true) ? [val, sFraction] : false;
1223
- // },
1224
- // step: 60,
1225
- // stepBase: 0,
1226
- // stepScaleFactor: 1000,
1227
- // asDate: function(val){
1228
- // val = new Date(this.asNumber(val));
1229
- // return (isNaN(val)) ? null : val;
1230
- // },
1231
- // asNumber: function(val){
1232
- // var ret = nan;
1233
- // val = this.mismatch(val, true);
1234
- // if(val !== true){
1235
- // ret = Date.UTC('1970', 0, 1, val[0][0], val[0][1], val[0][2] || 0);
1236
- // if(val[1]){
1237
- // ret += val[1];
1238
- // }
1239
- // }
1240
- // return ret;
1241
- // },
1242
- // dateToString: function(date){
1243
- // if(date && date.getUTCHours){
1244
- // var str = addleadingZero(date.getUTCHours(), 2) +':'+ addleadingZero(date.getUTCMinutes(), 2),
1245
- // tmp = date.getSeconds()
1246
- // ;
1247
- // if(tmp != "0"){
1248
- // str += ':'+ addleadingZero(tmp, 2);
1249
- // }
1250
- // tmp = date.getUTCMilliseconds();
1251
- // if(tmp != "0"){
1252
- // str += '.'+ addleadingZero(tmp, 3);
1253
- // }
1254
- // return str;
1255
- // } else {
1256
- // return false;
1257
- // }
1258
- // }
1259
- // }
1260
1260
  // ,'datetime-local': {
1261
1261
  // mismatch: function(val, _getParsed){
1262
1262
  // if(!val || !val.split || (val+'special').split(/\u0054/).length !== 2){return true;}
@@ -1290,7 +1290,7 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
1290
1290
 
1291
1291
  if(typeBugs || !supportsType('range') || !supportsType('time')){
1292
1292
  typeProtos.range = $.extend({}, typeProtos.number, typeProtos.range);
1293
- // typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
1293
+ typeProtos.time = $.extend({}, typeProtos.date, typeProtos.time);
1294
1294
  // typeProtos['datetime-local'] = $.extend({}, typeProtos.date, typeProtos.time, typeProtos['datetime-local']);
1295
1295
  }
1296
1296
 
@@ -1304,858 +1304,920 @@ jQuery.webshims.register('form-datalist', function($, webshims, window, document
1304
1304
  if(typeBugs || !supportsType('date')){
1305
1305
  webshims.addInputType('date', typeProtos.date);
1306
1306
  }
1307
- // if(typeBugs || !supportsType('time')){
1308
- // webshims.addInputType('time', typeProtos.time);
1309
- // }
1307
+ if(typeBugs || !supportsType('time')){
1308
+ webshims.addInputType('time', typeProtos.time);
1309
+ }
1310
1310
 
1311
1311
  // if(typeBugs || !supportsType('datetime-local')){
1312
1312
  // webshims.addInputType('datetime-local', typeProtos['datetime-local']);
1313
1313
  // }
1314
1314
 
1315
- });/* number-date-ui */
1316
- /* https://github.com/aFarkas/webshim/issues#issue/23 */
1317
- jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
1318
- "use strict";
1319
-
1320
- var triggerInlineForm = webshims.triggerInlineForm;
1321
- var modernizrInputTypes = Modernizr.inputtypes;
1322
- var adjustInputWithBtn = (function(){
1323
- var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
1324
- var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
1325
- if($.browser.msie && webshims.browserVersion < 8){
1326
- boxSizing = false;
1327
- }
1328
- var getWidth = function(input){
1329
- var widthFn = "width";
1330
- if(boxSizing){
1331
- widthFn = fns[input.css(boxSizing)] || widthFn;
1332
- }
1333
-
1334
- return {
1335
- w: input[widthFn](),
1336
- add: widthFn == "width"
1337
- };
1338
-
1339
- };
1340
-
1341
-
1342
- return function(input, button){
1343
- var inputDim = getWidth(input);
1344
- if(!inputDim.w){return;}
1345
- var controlDim = {
1346
- mL: (parseInt(button.css('marginLeft'), 10) || 0),
1347
- w: button.outerWidth()
1348
- };
1349
- inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
1350
- if(inputDim.mR){
1351
- input.css('marginRight', 0);
1352
- }
1353
- //is inside
1354
- if( controlDim.mL <= (controlDim.w * -1) ){
1355
- button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
1356
- input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
1357
- if(inputDim.add){
1358
- input.css('width', Math.floor(inputDim.w + controlDim.mL));
1359
- }
1360
- } else {
1361
- button.css('marginRight', inputDim.mR);
1362
- input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
1363
- }
1364
- };
1365
- })();
1366
-
1367
-
1368
- var defaultDatepicker = {};
1369
- var labelID = 0;
1370
- var emptyJ = $([]);
1371
- var isCheckValidity;
1372
- var replaceInputUI = function(context, elem){
1373
- $('input', context).add(elem.filter('input')).each(function(){
1374
- var type = $.prop(this, 'type');
1375
- if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
1376
- replaceInputUI[type]($(this));
1377
- }
1378
- });
1379
- };
1380
- //set date is extremly slow in IE so we do it lazy
1381
- var lazySetDate = function(elem, date){
1382
- if(!options.lazyDate){
1383
- elem.datepicker('setDate', date);
1384
- return;
1385
- }
1386
- var timer = $.data(elem[0], 'setDateLazyTimer');
1387
- if(timer){
1388
- clearTimeout(timer);
1389
- }
1390
- $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
1391
- elem.datepicker('setDate', date);
1392
- $.removeData(elem[0], 'setDateLazyTimer');
1393
- elem = null;
1394
- }, 0));
1395
- };
1396
-
1397
-
1398
- var copyAttrs = {
1399
- tabindex: 1,
1400
- tabIndex: 1,
1401
- title: 1,
1402
- "aria-required": 1,
1403
- "aria-invalid": 1
1404
- };
1405
- if(!options.copyAttrs){
1406
- options.copyAttrs = {};
1407
- }
1408
-
1409
- webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
1410
-
1411
- var getDimensions = function(orig){
1412
- return (options.calculateWidth) ?
1413
- {
1414
- css: {
1415
- marginRight: orig.css('marginRight'),
1416
- marginLeft: orig.css('marginLeft')
1417
- },
1418
- outerWidth: orig.outerWidth()
1419
-
1420
- } :
1421
- {}
1422
- ;
1423
- };
1424
- var focusAttrs = copyAttrs;
1425
-
1426
- replaceInputUI.common = function(orig, shim, methods){
1427
- if(Modernizr.formvalidation){
1428
- orig.bind('firstinvalid', function(e){
1429
- if(!webshims.fromSubmit && isCheckValidity){return;}
1430
- orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
1431
- if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
1432
- webshims.validityAlert.showFor( e.target );
1433
- e.preventDefault();
1434
- evt.preventDefault();
1435
- }
1436
- orig.unbind('invalid.replacedwidgetbubble');
1437
- });
1438
- });
1439
- }
1440
- var i, prop;
1441
- var focusElement = $('input, span.ui-slider-handle', shim);
1442
- var attrs = orig[0].attributes;
1443
- for(i in options.copyAttrs){
1444
- if ((prop = attrs[i]) && prop.specified) {
1445
- if(focusAttrs[i] && focusElement[0]){
1446
- focusElement.attr(i, prop.nodeValue);
1447
- } else {
1448
- shim[0].setAttribute(i, prop.nodeValue);
1449
- }
1450
- }
1451
- }
1452
-
1453
- var id = orig.attr('id'),
1454
- label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
1455
- ;
1456
-
1457
-
1458
-
1459
- shim.addClass(orig[0].className);
1460
- webshims.addShadowDom(orig, shim, {
1461
- data: methods || {},
1462
- shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
1463
- shadowChilds: focusElement
1464
- });
1465
-
1466
- orig.after(shim);
1467
-
1468
- if(orig[0].form){
1469
- $(orig[0].form).bind('reset', function(e){
1470
- if(e.originalEvent && !e.isDefaultPrevented()){
1471
- setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
1472
- }
1473
- });
1474
- }
1475
-
1476
- if(label[0]){
1477
- shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
1478
- label.bind('click', function(){
1479
- orig.getShadowFocusElement().focus();
1480
- return false;
1481
- });
1482
- }
1483
- };
1484
-
1485
- if(Modernizr.formvalidation){
1486
- ['input', 'form'].forEach(function(name){
1487
- var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
1488
- prop: {
1489
- value: function(){
1490
- isCheckValidity = true;
1491
- var ret = desc.prop._supvalue.apply(this, arguments);
1492
- isCheckValidity = false;
1493
- return ret;
1494
- }
1495
- }
1496
- });
1497
- });
1498
- }
1499
- //date and datetime-local implement if we have to replace
1500
- if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
1501
-
1502
- var datetimeFactor = {
1503
- trigger: [0.595,0.395],
1504
- normal: [0.565,0.425]
1505
- };
1506
- var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
1507
-
1508
- var configureDatePicker = function(elem, datePicker, change, _wrapper){
1509
- var stopFocusout;
1510
- var focusedOut;
1511
- var resetFocusHandler = function(){
1512
- data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
1513
- stopFocusout = false;
1514
- focusedOut = false;
1515
- };
1516
- var data = datePicker
1517
- .bind('focusin', function(){
1518
- resetFocusHandler();
1519
- data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
1520
- stopFocusout = true;
1521
- });
1522
- })
1523
- .bind('focusout blur', function(e){
1524
- if(stopFocusout){
1525
- focusedOut = true;
1526
- e.stopImmediatePropagation();
1527
- }
1528
- })
1529
- .datepicker($.extend({
1530
- onClose: function(){
1531
- if(focusedOut && datePicker.not(':focus')){
1532
- resetFocusHandler();
1533
- datePicker.trigger('focusout');
1534
- datePicker.triggerHandler('blur');
1535
- } else {
1536
- resetFocusHandler();
1537
- }
1538
- }
1539
- }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
1540
- .bind('change', change)
1541
- .data('datepicker')
1542
- ;
1543
- data.dpDiv.addClass('input-date-datepicker-control');
1544
-
1545
- if(_wrapper){
1546
- webshims.triggerDomUpdate(_wrapper[0]);
1547
- }
1548
- ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
1549
- var fn = 'data-placeholder' ? 'attr' : 'prop';
1550
- var val = elem[fn](name);
1551
- if(val){
1552
- elem[fn](name, val);
1553
- }
1554
- });
1555
-
1556
- return data;
1557
- };
1558
-
1559
- // replaceInputUI['datetime-local'] = function(elem){
1560
- // if(!$.fn.datepicker){return;}
1561
- //
1562
- // var date = $('<span role="group" class="input-datetime-local"><input type="text" class="input-datetime-local-date" /><input type="time" class="input-datetime-local-time" /></span>'),
1563
- // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
1564
- // datePicker = $('input.input-datetime-local-date', date),
1565
- // datePickerChange = function(e){
1566
- //
1567
- // var value = datePicker.prop('value') || '',
1568
- // timeVal = ''
1569
- // ;
1570
- // if(options.lazyDate){
1571
- // var timer = $.data(datePicker[0], 'setDateLazyTimer');
1572
- // if(timer){
1573
- // clearTimeout(timer);
1574
- // $.removeData(datePicker[0], 'setDateLazyTimer');
1575
- // }
1576
- // }
1577
- //
1578
- // if(value){
1579
- // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
1580
- // try {
1581
- // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
1582
- // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
1583
- // } catch (e) {value = datePicker.prop('value');}
1584
- // }
1585
- // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
1586
- // replaceInputUI['datetime-local'].blockAttr = true;
1587
- // elem.prop('value', value);
1588
- // replaceInputUI['datetime-local'].blockAttr = false;
1589
- // e.stopImmediatePropagation();
1590
- // triggerInlineForm(elem[0], 'input');
1591
- // triggerInlineForm(elem[0], 'change');
1592
- // },
1593
- // data = configureDatePicker(elem, datePicker, datePickerChange, date)
1594
- // ;
1595
- //
1596
- //
1597
- // $('input.input-datetime-local-time', date).bind('change', function(e){
1598
- // var timeVal = $.prop(this, 'value');
1599
- // var val = ['', ''];
1600
- // if(timeVal){
1601
- // val = elem.prop('value').split('T');
1602
- // if((val.length < 2 || !val[0])){
1603
- // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
1604
- // }
1605
- // val[1] = timeVal;
1606
- //
1607
- // if (timeVal) {
1608
- // try {
1609
- // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
1610
- // } catch (e) {}
1611
- // }
1612
- // }
1613
- // val = (!val[0] && !val[1]) ? '' : val.join('T');
1614
- // replaceInputUI['datetime-local'].blockAttr = true;
1615
- // elem.prop('value', val);
1616
- // replaceInputUI['datetime-local'].blockAttr = false;
1617
- // e.stopImmediatePropagation();
1618
- // triggerInlineForm(elem[0], 'input');
1619
- // triggerInlineForm(elem[0], 'change');
1620
- // });
1621
- //
1622
- //
1623
- //
1624
- // date.attr('aria-labelledby', attr.label.attr('id'));
1625
- // attr.label.bind('click', function(){
1626
- // datePicker.focus();
1627
- // return false;
1628
- // });
1629
- //
1630
- // if(attr.css){
1631
- // date.css(attr.css);
1632
- // if(attr.outerWidth){
1633
- // date.outerWidth(attr.outerWidth);
1634
- // var width = date.width();
1635
- // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
1636
- // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
1637
- // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
1638
- // if(data.trigger[0]){
1639
- // adjustInputWithBtn(datePicker, data.trigger);
1640
- // }
1641
- // }
1642
- // }
1643
- //
1644
- //
1645
- // };
1646
- //
1647
- // replaceInputUI['datetime-local'].attrs = {
1648
- // disabled: function(orig, shim, value){
1649
- // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
1650
- // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
1651
- // },
1652
- // step: function(orig, shim, value){
1653
- // $('input.input-datetime-local-time', shim).attr('step', value);
1654
- // },
1655
- // //ToDo: use min also on time
1656
- // min: function(orig, shim, value){
1657
- // if(value){
1658
- // value = (value.split) ? value.split('T') : [];
1659
- // try {
1660
- // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
1661
- // } catch(e){value = false;}
1662
- // }
1663
- // if(!value){
1664
- // value = null;
1665
- // }
1666
- // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
1667
- //
1668
- // },
1669
- // //ToDo: use max also on time
1670
- // max: function(orig, shim, value){
1671
- // if(value){
1672
- // value = (value.split) ? value.split('T') : [];
1673
- // try {
1674
- // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
1675
- // } catch(e){value = false;}
1676
- // }
1677
- // if(!value){
1678
- // value = null;
1679
- // }
1680
- // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
1681
- // },
1682
- // value: function(orig, shim, value){
1683
- // var dateValue;
1684
- // if(value){
1685
- // value = (value.split) ? value.split('T') : [];
1686
- // try {
1687
- // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
1688
- // } catch(e){dateValue = false;}
1689
- // }
1690
- // if(dateValue){
1691
- // if(!replaceInputUI['datetime-local'].blockAttr){
1692
- // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
1693
- // }
1694
- // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
1695
- // } else {
1696
- // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
1697
- // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
1698
- // }
1699
- //
1700
- //
1701
- // }
1702
- // };
1703
-
1704
-
1705
- replaceInputUI.date = function(elem){
1706
-
1707
- if(!$.fn.datepicker){return;}
1708
- var date = $('<input class="input-date" type="text" />'),
1709
-
1710
- change = function(e){
1711
-
1712
- replaceInputUI.date.blockAttr = true;
1713
- var value;
1714
- if(options.lazyDate){
1715
- var timer = $.data(date[0], 'setDateLazyTimer');
1716
- if(timer){
1717
- clearTimeout(timer);
1718
- $.removeData(date[0], 'setDateLazyTimer');
1719
- }
1720
- }
1721
- try {
1722
- value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
1723
- value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
1724
- } catch(e){
1725
- value = date.prop('value');
1726
- }
1727
- elem.prop('value', value);
1728
- replaceInputUI.date.blockAttr = false;
1729
- e.stopImmediatePropagation();
1730
- triggerInlineForm(elem[0], 'input');
1731
- triggerInlineForm(elem[0], 'change');
1732
- },
1733
- data
1734
-
1735
- ;
1736
-
1737
- this.common(elem, date, replaceInputUI.date.attrs);
1738
-
1739
- data = configureDatePicker(elem, date, change);
1740
-
1741
- $(elem)
1742
- .bind('updateshadowdom', function(){
1743
- if (data.trigger[0]) {
1744
- elem.css({display: ''});
1745
- if(elem[0].offsetWidth || elem[0].offsetHeight){
1746
- var attr = getDimensions(elem);
1747
- if (attr.css) {
1748
- date.css(attr.css);
1749
- if (attr.outerWidth) {
1750
- date.outerWidth(attr.outerWidth);
1751
- }
1752
- adjustInputWithBtn(date, data.trigger);
1753
- }
1754
- }
1755
- }
1756
- elem.css({display: 'none'});
1757
- })
1758
- .triggerHandler('updateshadowdom')
1759
- ;
1760
- if (data.trigger[0]) {
1761
- setTimeout(function(){
1762
- webshims.ready('WINDOWLOAD', function(){
1763
- $(elem).triggerHandler('updateshadowdom');
1764
- });
1765
- }, 9);
1766
- }
1767
-
1768
- };
1769
-
1770
-
1771
- replaceInputUI.date.attrs = {
1772
- disabled: function(orig, shim, value){
1773
- $.prop(shim, 'disabled', !!value);
1774
- },
1775
- min: function(orig, shim, value){
1776
- try {
1777
- value = $.datepicker.parseDate('yy-mm-dd', value);
1778
- } catch(e){value = false;}
1779
- if(value){
1780
- $(shim).datepicker('option', 'minDate', value);
1781
- }
1782
- },
1783
- max: function(orig, shim, value){
1784
- try {
1785
- value = $.datepicker.parseDate('yy-mm-dd', value);
1786
- } catch(e){value = false;}
1787
- if(value){
1788
- $(shim).datepicker('option', 'maxDate', value);
1789
- }
1790
- },
1791
- 'data-placeholder': function(orig, shim, value){
1792
- var hintValue = (value || '').split('-');
1793
- var dateFormat;
1794
- if(hintValue.length == 3){
1795
- value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
1796
- }
1797
- $.prop(shim, 'placeholder', value);
1798
- },
1799
- value: function(orig, shim, value){
1800
- if(!replaceInputUI.date.blockAttr){
1801
- try {
1802
- var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
1803
- } catch(e){var dateValue = false;}
1804
-
1805
- if(dateValue){
1806
- lazySetDate($(shim), dateValue);
1807
- } else {
1808
- $.prop(shim, 'value', value);
1809
- }
1810
- }
1811
- }
1812
- };
1813
- }
1814
- if (!modernizrInputTypes.range || options.replaceUI) {
1815
- replaceInputUI.range = function(elem){
1816
- if(!$.fn.slider){return;}
1817
- var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
1818
- change = function(e, ui){
1819
- if(e.originalEvent){
1820
- replaceInputUI.range.blockAttr = true;
1821
- elem.prop('value', ui.value);
1822
- replaceInputUI.range.blockAttr = false;
1823
- triggerInlineForm(elem[0], 'input');
1824
- triggerInlineForm(elem[0], 'change');
1825
- }
1826
- }
1827
- ;
1828
-
1829
- this.common(elem, range, replaceInputUI.range.attrs);
1830
-
1831
-
1832
- elem
1833
- .bind('updateshadowdom', function(){
1834
- elem.css({display: ''});
1835
- if (elem[0].offsetWidth || elem[0].offsetHeight) {
1836
- var attr = getDimensions(elem);
1837
- if (attr.css) {
1838
- range.css(attr.css);
1839
- if (attr.outerWidth) {
1840
- range.outerWidth(attr.outerWidth);
1841
- }
1842
- }
1843
- }
1844
- elem.css({display: 'none'});
1845
- })
1846
- .triggerHandler('updateshadowdom')
1847
- ;
1848
-
1849
-
1850
- range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change);
1851
-
1852
- ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
1853
- var val = elem.prop(name);
1854
- var shadow;
1855
- if(name == 'value' && !val){
1856
-
1857
- shadow = elem.getShadowElement();
1858
- if(shadow){
1859
- val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
1860
- }
1861
- }
1862
- if(val != null){
1863
- elem.prop(name, val);
1864
- }
1865
- });
1866
- };
1867
-
1868
- replaceInputUI.range.attrs = {
1869
- disabled: function(orig, shim, value){
1870
- value = !!value;
1871
- $(shim).slider( "option", "disabled", value );
1872
- $('span', shim)
1873
- .attr({
1874
- 'aria-disabled': value+'',
1875
- 'tabindex': (value) ? '-1' : '0'
1876
- })
1877
- ;
1878
- },
1879
- min: function(orig, shim, value){
1880
- value = (value) ? value * 1 || 0 : 0;
1881
- $(shim).slider( "option", "min", value );
1882
- $('span', shim).attr({'aria-valuemin': value});
1883
- },
1884
- max: function(orig, shim, value){
1885
- value = (value || value === 0) ? value * 1 || 100 : 100;
1886
- $(shim).slider( "option", "max", value );
1887
- $('span', shim).attr({'aria-valuemax': value});
1888
- },
1889
- value: function(orig, shim, value){
1890
- value = $(orig).prop('valueAsNumber');
1891
- if(!isNaN(value)){
1892
- if(!replaceInputUI.range.blockAttr){
1893
- $(shim).slider( "option", "value", value );
1894
- }
1895
- $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
1896
- }
1897
- },
1898
- step: function(orig, shim, value){
1899
- value = (value && $.trim(value)) ? value * 1 || 1 : 1;
1900
- $(shim).slider( "option", "step", value );
1901
- }
1902
- };
1903
- }
1904
-
1905
- if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
1906
- var reflectFn = function(val){
1907
- if(webshims.data(this, 'hasShadow')){
1908
- $.prop(this, 'value', $.prop(this, 'value'));
1909
- }
1910
- };
1911
-
1912
- webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
1913
- webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
1914
- }
1915
-
1916
- $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
1917
- webshims.onNodeNamesPropertyModify('input', attr, function(val){
1918
- var shadowData = webshims.data(this, 'shadowData');
1919
- if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
1920
- shadowData.data[attr](this, shadowData.shadowElement, val);
1921
- }
1922
- }
1923
- );
1924
- });
1925
- if(!options.availabeLangs){
1926
- options.availabeLangs = 'af ar ar-DZ az bg bs ca cs da de el en-AU en-GB en-NZ eo es et eu fa fi fo fr fr-CH gl he hr hu hy id is it ja ko kz lt lv ml ms nl no pl pt-BR rm ro ru sk sl sq sr sr-SR sv ta th tr uk vi zh-CN zh-HK zh-TW'.split(' ');
1927
- }
1928
-
1929
- var getDefaults = function(){
1930
- if(!$.datepicker){return;}
1931
-
1932
- webshims.activeLang({
1933
- langObj: $.datepicker.regional,
1934
- module: 'form-number-date-ui',
1935
- callback: function(langObj){
1936
- var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
1937
-
1938
-
1939
- if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
1940
- $('input.hasDatepicker')
1941
- .filter('.input-date, .input-datetime-local-date')
1942
- .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
1943
- .getNativeElement()
1944
- .filter('[data-placeholder]')
1945
- .attr('data-placeholder', function(i, val){
1946
- return val;
1947
- })
1948
- ;
1949
- }
1950
- $.datepicker.setDefaults(datepickerCFG);
1951
- }
1952
- });
1953
- $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1954
- };
1955
-
1956
- $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1957
- getDefaults();
1958
-
1959
- //implement set/arrow controls
1960
- (function(){
1961
- var supportsType = (function(){
1962
- var types = {};
1963
- return function(type){
1964
- if(type in types){
1965
- return types[type];
1966
- }
1967
- return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
1968
- };
1969
- })();
1970
-
1971
- if(supportsType('number')/* && supportsType('time')*/){return;}
1972
- var doc = document;
1973
- var options = webshims.cfg["forms-ext"];
1974
- var typeModels = webshims.inputTypes;
1975
-
1976
- var getNextStep = function(input, upDown, cache){
1977
-
1978
- cache = cache || {};
1979
-
1980
- if( !('type' in cache) ){
1981
- cache.type = $.prop(input, 'type');
1982
- }
1983
- if( !('step' in cache) ){
1984
- cache.step = webshims.getStep(input, cache.type);
1985
- }
1986
- if( !('valueAsNumber' in cache) ){
1987
- cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
1988
- }
1989
- var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
1990
- ret
1991
- ;
1992
- webshims.addMinMaxNumberToCache('min', $(input), cache);
1993
- webshims.addMinMaxNumberToCache('max', $(input), cache);
1994
-
1995
- if(isNaN(cache.valueAsNumber)){
1996
- cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
1997
- }
1998
- //make a valid step
1999
- if(cache.step !== 'any'){
2000
- ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
2001
- if(ret && Math.abs(ret) != cache.step){
2002
- cache.valueAsNumber = cache.valueAsNumber - ret;
2003
- }
2004
- }
2005
- ret = cache.valueAsNumber + (delta * upDown);
2006
- //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
2007
- if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
2008
- ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
2009
- } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
2010
- ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
2011
- } else {
2012
- ret = Math.round( ret * 1e7) / 1e7;
2013
- }
2014
- return ret;
2015
- };
2016
-
2017
- webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
2018
-
2019
- var doSteps = function(input, type, control){
2020
- if(input.disabled || input.readOnly || $(control).hasClass('step-controls')){return;}
2021
- $.prop(input, 'value', typeModels[type].numberToString(getNextStep(input, ($(control).hasClass('step-up')) ? 1 : -1, {type: type})));
2022
- $(input).unbind('blur.stepeventshim');
2023
- triggerInlineForm(input, 'input');
2024
-
2025
-
2026
- if( doc.activeElement ){
2027
- if(doc.activeElement !== input){
2028
- try {input.focus();} catch(e){}
2029
- }
2030
- setTimeout(function(){
2031
- if(doc.activeElement !== input){
2032
- try {input.focus();} catch(e){}
2033
- }
2034
- $(input)
2035
- .one('blur.stepeventshim', function(){
2036
- triggerInlineForm(input, 'change');
2037
- })
2038
- ;
2039
- }, 0);
2040
-
2041
- }
2042
- };
2043
-
2044
-
2045
- if(options.stepArrows){
2046
- var stepDisableEnable = {
2047
- // don't change getter
2048
- set: function(value){
2049
- var stepcontrols = webshims.data(this, 'step-controls');
2050
- if(stepcontrols){
2051
- stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
2052
- }
2053
- }
2054
- };
2055
- webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
2056
- webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
2057
- }
2058
- var stepKeys = {
2059
- 38: 1,
2060
- 40: -1
2061
- };
2062
- webshims.addReady(function(context, contextElem){
2063
- //ui for numeric values
2064
- if(options.stepArrows){
2065
- $('input', context).add(contextElem.filter('input')).each(function(){
2066
- var type = $.prop(this, 'type');
2067
- if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
2068
- var elem = this;
2069
- var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
2070
- .insertAfter(elem)
2071
- .bind('selectstart dragstart', function(){return false;})
2072
- .bind('mousedown mousepress', function(e){
2073
- doSteps(elem, type, e.target);
2074
- return false;
2075
- })
2076
- .bind('mousepressstart mousepressend', function(e){
2077
- $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
2078
- })
2079
- ;
2080
- var mwheelUpDown = function(e, d){
2081
- if(elem.disabled || elem.readOnly || !d){return;}
2082
- $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, d, {type: type})));
2083
- triggerInlineForm(elem, 'input');
2084
- return false;
2085
- };
2086
- var jElm = $(elem)
2087
- .addClass('has-step-controls')
2088
- .attr({
2089
- readonly: elem.readOnly,
2090
- disabled: elem.disabled,
2091
- autocomplete: 'off',
2092
- role: 'spinbutton'
2093
- })
2094
- .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
2095
- if(elem.disabled || elem.readOnly || !stepKeys[e.keyCode]){return;}
2096
- $.prop(elem, 'value', typeModels[type].numberToString(getNextStep(elem, stepKeys[e.keyCode], {type: type})));
2097
- triggerInlineForm(elem, 'input');
2098
- return false;
2099
- })
2100
- ;
2101
- if(type == 'number'){
2102
- jElm.bind('keypress', (function(){
2103
- var chars = '0123456789.';
2104
- return function(event){
2105
- var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
2106
- return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
2107
- };
2108
- })());
2109
- }
2110
- if($.fn.mwheelIntent){
2111
- jElm.add(controls).bind('mwheelIntent', mwheelUpDown);
2112
- } else if($.fn.mousewheel) {
2113
- jElm
2114
- .bind('focus', function(){
2115
- jElm.add(controls).unbind('.mwhellwebshims')
2116
- .bind('mousewheel.mwhellwebshims', mwheelUpDown)
2117
- ;
2118
- })
2119
- .bind('blur', function(){
2120
- $(elem).add(controls).unbind('.mwhellwebshims');
2121
- })
2122
- ;
2123
- }
2124
- webshims.data(elem, 'step-controls', controls);
2125
- if(options.calculateWidth){
2126
- var init;
2127
- jElm
2128
- .bind('updateshadowdom', function(){
2129
- if(!init && (elem.offsetWidth || elem.offsetHeight)){
2130
- init = true;
2131
- adjustInputWithBtn(jElm, controls);
2132
- controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
2133
- }
2134
- })
2135
- .triggerHandler('updateshadowdom')
2136
- ;
2137
- }
2138
- });
2139
- }
2140
- });
2141
- })();
2142
-
2143
-
2144
- webshims.addReady(function(context, elem){
2145
- $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
2146
- if($.datepicker || $.fn.slider){
2147
- if($.datepicker && !defaultDatepicker.dateFormat){
2148
- defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
2149
- }
2150
- replaceInputUI(context, elem);
2151
- }
2152
- if($.datepicker && $.fn.slider){
2153
- $(document).unbind('.initinputui');
2154
- } else if(!webshims.modules["input-widgets"].src){
2155
- webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
2156
- }
2157
- });
2158
- });
2159
-
2160
- });
2161
-
1315
+ });/* number-date-ui */
1316
+ /* https://github.com/aFarkas/webshim/issues#issue/23 */
1317
+ jQuery.webshims.register('form-number-date-ui', function($, webshims, window, document, undefined, options){
1318
+ "use strict";
1319
+
1320
+ var triggerInlineForm = webshims.triggerInlineForm;
1321
+ var modernizrInputTypes = Modernizr.inputtypes;
1322
+ var adjustInputWithBtn = (function(){
1323
+ var fns = {"padding-box": "innerWidth", "border-box": "outerWidth", "content-box": "width"};
1324
+ var boxSizing = Modernizr.prefixed && Modernizr.prefixed("boxSizing");
1325
+ if($.browser.msie && webshims.browserVersion < 8){
1326
+ boxSizing = false;
1327
+ }
1328
+ var getWidth = function(input){
1329
+ var widthFn = "width";
1330
+ if(boxSizing){
1331
+ widthFn = fns[input.css(boxSizing)] || widthFn;
1332
+ }
1333
+
1334
+ return {
1335
+ w: input[widthFn](),
1336
+ add: widthFn == "width"
1337
+ };
1338
+
1339
+ };
1340
+
1341
+
1342
+ return function(input, button){
1343
+ var inputDim = getWidth(input);
1344
+ if(!inputDim.w){return;}
1345
+ var controlDim = {
1346
+ mL: (parseInt(button.css('marginLeft'), 10) || 0),
1347
+ w: button.outerWidth()
1348
+ };
1349
+ inputDim.mR = (parseInt(input.css('marginRight'), 10) || 0);
1350
+ if(inputDim.mR){
1351
+ input.css('marginRight', 0);
1352
+ }
1353
+ //is inside
1354
+ if( controlDim.mL <= (controlDim.w * -1) ){
1355
+ button.css('marginRight', Math.floor(Math.abs(controlDim.w + controlDim.mL - 0.1) + inputDim.mR));
1356
+ input.css('paddingRight', (parseInt(input.css('paddingRight'), 10) || 0) + Math.abs(controlDim.mL));
1357
+ if(inputDim.add){
1358
+ input.css('width', Math.floor(inputDim.w + controlDim.mL));
1359
+ }
1360
+ } else {
1361
+ button.css('marginRight', inputDim.mR);
1362
+ input.css('width', Math.floor(inputDim.w - controlDim.mL - controlDim.w - 0.2));
1363
+ }
1364
+ };
1365
+ })();
1366
+
1367
+
1368
+ var defaultDatepicker = {};
1369
+ var labelID = 0;
1370
+ var emptyJ = $([]);
1371
+ var isCheckValidity;
1372
+ var replaceInputUI = function(context, elem){
1373
+ $('input', context).add(elem.filter('input')).each(function(){
1374
+ var type = $.prop(this, 'type');
1375
+ if(replaceInputUI[type] && !webshims.data(this, 'shadowData')){
1376
+ replaceInputUI[type]($(this));
1377
+ }
1378
+ });
1379
+ };
1380
+ //set date is extremly slow in IE so we do it lazy
1381
+ var lazySetDate = function(elem, date){
1382
+ if(!options.lazyDate){
1383
+ elem.datepicker('setDate', date);
1384
+ return;
1385
+ }
1386
+ var timer = $.data(elem[0], 'setDateLazyTimer');
1387
+ if(timer){
1388
+ clearTimeout(timer);
1389
+ }
1390
+ $.data(elem[0], 'setDateLazyTimer', setTimeout(function(){
1391
+ elem.datepicker('setDate', date);
1392
+ $.removeData(elem[0], 'setDateLazyTimer');
1393
+ elem = null;
1394
+ }, 0));
1395
+ };
1396
+
1397
+
1398
+ var copyAttrs = {
1399
+ tabindex: 1,
1400
+ tabIndex: 1,
1401
+ title: 1,
1402
+ "aria-required": 1,
1403
+ "aria-invalid": 1
1404
+ };
1405
+ if(!options.copyAttrs){
1406
+ options.copyAttrs = {};
1407
+ }
1408
+
1409
+ webshims.extendUNDEFProp(options.copyAttrs, copyAttrs);
1410
+
1411
+ var getDimensions = function(orig){
1412
+ return (options.calculateWidth) ?
1413
+ {
1414
+ css: {
1415
+ marginRight: orig.css('marginRight'),
1416
+ marginLeft: orig.css('marginLeft')
1417
+ },
1418
+ outerWidth: orig.outerWidth()
1419
+
1420
+ } :
1421
+ {}
1422
+ ;
1423
+ };
1424
+ var focusAttrs = copyAttrs;
1425
+
1426
+ replaceInputUI.common = function(orig, shim, methods){
1427
+ if(Modernizr.formvalidation){
1428
+ orig.bind('firstinvalid', function(e){
1429
+ if(!webshims.fromSubmit && isCheckValidity){return;}
1430
+ orig.unbind('invalid.replacedwidgetbubble').bind('invalid.replacedwidgetbubble', function(evt){
1431
+ if(!e.isInvalidUIPrevented() && !evt.isDefaultPrevented()){
1432
+ webshims.validityAlert.showFor( e.target );
1433
+ e.preventDefault();
1434
+ evt.preventDefault();
1435
+ }
1436
+ orig.unbind('invalid.replacedwidgetbubble');
1437
+ });
1438
+ });
1439
+ }
1440
+ var i, prop;
1441
+ var focusElement = $('input, span.ui-slider-handle', shim);
1442
+ var attrs = orig[0].attributes;
1443
+ for(i in options.copyAttrs){
1444
+ if ((prop = attrs[i]) && prop.specified) {
1445
+ if(focusAttrs[i] && focusElement[0]){
1446
+ focusElement.attr(i, prop.nodeValue);
1447
+ } else {
1448
+ shim[0].setAttribute(i, prop.nodeValue);
1449
+ }
1450
+ }
1451
+ }
1452
+
1453
+ var id = orig.attr('id'),
1454
+ label = (id) ? $('label[for="'+ id +'"]', orig[0].form) : emptyJ
1455
+ ;
1456
+
1457
+
1458
+
1459
+ shim.addClass(orig[0].className);
1460
+ webshims.addShadowDom(orig, shim, {
1461
+ data: methods || {},
1462
+ shadowFocusElement: $('input.input-datetime-local-date, span.ui-slider-handle', shim)[0],
1463
+ shadowChilds: focusElement
1464
+ });
1465
+
1466
+ orig.after(shim);
1467
+
1468
+ if(orig[0].form){
1469
+ $(orig[0].form).bind('reset', function(e){
1470
+ if(e.originalEvent && !e.isDefaultPrevented()){
1471
+ setTimeout(function(){orig.prop( 'value', orig.prop('value') );}, 0);
1472
+ }
1473
+ });
1474
+ }
1475
+
1476
+ if(label[0]){
1477
+ shim.getShadowFocusElement().attr('aria-labelledby', webshims.getID(label));
1478
+ label.bind('click', function(){
1479
+ orig.getShadowFocusElement().focus();
1480
+ return false;
1481
+ });
1482
+ }
1483
+ };
1484
+
1485
+ if(Modernizr.formvalidation){
1486
+ ['input', 'form'].forEach(function(name){
1487
+ var desc = webshims.defineNodeNameProperty(name, 'checkValidity', {
1488
+ prop: {
1489
+ value: function(){
1490
+ isCheckValidity = true;
1491
+ var ret = desc.prop._supvalue.apply(this, arguments);
1492
+ isCheckValidity = false;
1493
+ return ret;
1494
+ }
1495
+ }
1496
+ });
1497
+ });
1498
+ }
1499
+ //date and datetime-local implement if we have to replace
1500
+ if(!modernizrInputTypes['date'] /*||!modernizrInputTypes['datetime-local']*/ || options.replaceUI){
1501
+
1502
+ var datetimeFactor = {
1503
+ trigger: [0.595,0.395],
1504
+ normal: [0.565,0.425]
1505
+ };
1506
+ var subPixelCorrect = (!$.browser.msie || webshims.browserVersion > 6) ? 0 : 0.45;
1507
+
1508
+ var configureDatePicker = function(elem, datePicker, change, _wrapper){
1509
+ var stopFocusout;
1510
+ var focusedOut;
1511
+ var resetFocusHandler = function(){
1512
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler');
1513
+ stopFocusout = false;
1514
+ focusedOut = false;
1515
+ };
1516
+ var data = datePicker
1517
+ .bind('focusin', function(){
1518
+ resetFocusHandler();
1519
+ data.dpDiv.unbind('mousedown.webshimsmousedownhandler').bind('mousedown.webshimsmousedownhandler', function(){
1520
+ stopFocusout = true;
1521
+ });
1522
+ })
1523
+ .bind('focusout blur', function(e){
1524
+ if(stopFocusout){
1525
+ focusedOut = true;
1526
+ e.stopImmediatePropagation();
1527
+ }
1528
+ })
1529
+ .datepicker($.extend({
1530
+ onClose: function(){
1531
+ if(focusedOut && datePicker.not(':focus')){
1532
+ resetFocusHandler();
1533
+ datePicker.trigger('focusout');
1534
+ datePicker.triggerHandler('blur');
1535
+ } else {
1536
+ resetFocusHandler();
1537
+ }
1538
+ }
1539
+ }, defaultDatepicker, options.datepicker, elem.data('datepicker')))
1540
+ .bind('change', change)
1541
+ .data('datepicker')
1542
+ ;
1543
+ data.dpDiv.addClass('input-date-datepicker-control');
1544
+
1545
+ if(_wrapper){
1546
+ webshims.triggerDomUpdate(_wrapper[0]);
1547
+ }
1548
+ ['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'].forEach(function(name){
1549
+ var fn = 'data-placeholder' ? 'attr' : 'prop';
1550
+ var val = elem[fn](name);
1551
+ if(val){
1552
+ elem[fn](name, val);
1553
+ }
1554
+ });
1555
+
1556
+ return data;
1557
+ };
1558
+
1559
+ // replaceInputUI['datetime-local'] = function(elem){
1560
+ // if(!$.fn.datepicker){return;}
1561
+ //
1562
+ // var date = $('<span role="group" class="input-datetime-local"><input type="text" class="input-datetime-local-date" /><input type="time" class="input-datetime-local-time" /></span>'),
1563
+ // attr = this.common(elem, date, replaceInputUI['datetime-local'].attrs),
1564
+ // datePicker = $('input.input-datetime-local-date', date),
1565
+ // datePickerChange = function(e){
1566
+ //
1567
+ // var value = datePicker.prop('value') || '',
1568
+ // timeVal = ''
1569
+ // ;
1570
+ // if(options.lazyDate){
1571
+ // var timer = $.data(datePicker[0], 'setDateLazyTimer');
1572
+ // if(timer){
1573
+ // clearTimeout(timer);
1574
+ // $.removeData(datePicker[0], 'setDateLazyTimer');
1575
+ // }
1576
+ // }
1577
+ //
1578
+ // if(value){
1579
+ // timeVal = $('input.input-datetime-local-time', date).prop('value') || '00:00';
1580
+ // try {
1581
+ // value = $.datepicker.parseDate(datePicker.datepicker('option', 'dateFormat'), value);
1582
+ // value = (value) ? $.datepicker.formatDate('yy-mm-dd', value) : datePicker.prop('value');
1583
+ // } catch (e) {value = datePicker.prop('value');}
1584
+ // }
1585
+ // value = (!value && !timeVal) ? '' : value + 'T' + timeVal;
1586
+ // replaceInputUI['datetime-local'].blockAttr = true;
1587
+ // elem.prop('value', value);
1588
+ // replaceInputUI['datetime-local'].blockAttr = false;
1589
+ // e.stopImmediatePropagation();
1590
+ // triggerInlineForm(elem[0], 'input');
1591
+ // triggerInlineForm(elem[0], 'change');
1592
+ // },
1593
+ // data = configureDatePicker(elem, datePicker, datePickerChange, date)
1594
+ // ;
1595
+ //
1596
+ //
1597
+ // $('input.input-datetime-local-time', date).bind('change', function(e){
1598
+ // var timeVal = $.prop(this, 'value');
1599
+ // var val = ['', ''];
1600
+ // if(timeVal){
1601
+ // val = elem.prop('value').split('T');
1602
+ // if((val.length < 2 || !val[0])){
1603
+ // val[0] = $.datepicker.formatDate('yy-mm-dd', new Date());
1604
+ // }
1605
+ // val[1] = timeVal;
1606
+ //
1607
+ // if (timeVal) {
1608
+ // try {
1609
+ // datePicker.prop('value', $.datepicker.formatDate(datePicker.datepicker('option', 'dateFormat'), $.datepicker.parseDate('yy-mm-dd', val[0])));
1610
+ // } catch (e) {}
1611
+ // }
1612
+ // }
1613
+ // val = (!val[0] && !val[1]) ? '' : val.join('T');
1614
+ // replaceInputUI['datetime-local'].blockAttr = true;
1615
+ // elem.prop('value', val);
1616
+ // replaceInputUI['datetime-local'].blockAttr = false;
1617
+ // e.stopImmediatePropagation();
1618
+ // triggerInlineForm(elem[0], 'input');
1619
+ // triggerInlineForm(elem[0], 'change');
1620
+ // });
1621
+ //
1622
+ //
1623
+ //
1624
+ // date.attr('aria-labelledby', attr.label.attr('id'));
1625
+ // attr.label.bind('click', function(){
1626
+ // datePicker.focus();
1627
+ // return false;
1628
+ // });
1629
+ //
1630
+ // if(attr.css){
1631
+ // date.css(attr.css);
1632
+ // if(attr.outerWidth){
1633
+ // date.outerWidth(attr.outerWidth);
1634
+ // var width = date.width();
1635
+ // var widthFac = (data.trigger[0]) ? datetimeFactor.trigger : datetimeFactor.normal;
1636
+ // datePicker.outerWidth(Math.floor((width * widthFac[0]) - subPixelCorrect), true);
1637
+ // $('input.input-datetime-local-time', date).outerWidth(Math.floor((width * widthFac[1]) - subPixelCorrect), true);
1638
+ // if(data.trigger[0]){
1639
+ // adjustInputWithBtn(datePicker, data.trigger);
1640
+ // }
1641
+ // }
1642
+ // }
1643
+ //
1644
+ //
1645
+ // };
1646
+ //
1647
+ // replaceInputUI['datetime-local'].attrs = {
1648
+ // disabled: function(orig, shim, value){
1649
+ // $('input.input-datetime-local-date', shim).prop('disabled', !!value);
1650
+ // $('input.input-datetime-local-time', shim).prop('disabled', !!value);
1651
+ // },
1652
+ // step: function(orig, shim, value){
1653
+ // $('input.input-datetime-local-time', shim).attr('step', value);
1654
+ // },
1655
+ // //ToDo: use min also on time
1656
+ // min: function(orig, shim, value){
1657
+ // if(value){
1658
+ // value = (value.split) ? value.split('T') : [];
1659
+ // try {
1660
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
1661
+ // } catch(e){value = false;}
1662
+ // }
1663
+ // if(!value){
1664
+ // value = null;
1665
+ // }
1666
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'minDate', value);
1667
+ //
1668
+ // },
1669
+ // //ToDo: use max also on time
1670
+ // max: function(orig, shim, value){
1671
+ // if(value){
1672
+ // value = (value.split) ? value.split('T') : [];
1673
+ // try {
1674
+ // value = $.datepicker.parseDate('yy-mm-dd', value[0]);
1675
+ // } catch(e){value = false;}
1676
+ // }
1677
+ // if(!value){
1678
+ // value = null;
1679
+ // }
1680
+ // $('input.input-datetime-local-date', shim).datepicker('option', 'maxDate', value);
1681
+ // },
1682
+ // value: function(orig, shim, value){
1683
+ // var dateValue;
1684
+ // if(value){
1685
+ // value = (value.split) ? value.split('T') : [];
1686
+ // try {
1687
+ // dateValue = $.datepicker.parseDate('yy-mm-dd', value[0]);
1688
+ // } catch(e){dateValue = false;}
1689
+ // }
1690
+ // if(dateValue){
1691
+ // if(!replaceInputUI['datetime-local'].blockAttr){
1692
+ // lazySetDate($('input.input-datetime-local-date', shim), dateValue);
1693
+ // }
1694
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '00:00');
1695
+ // } else {
1696
+ // $('input.input-datetime-local-date', shim).prop('value', value[0] || '');
1697
+ // $('input.input-datetime-local-time', shim).prop('value', value[1] || '');
1698
+ // }
1699
+ //
1700
+ //
1701
+ // }
1702
+ // };
1703
+
1704
+
1705
+ replaceInputUI.date = function(elem){
1706
+
1707
+ if(!$.fn.datepicker){return;}
1708
+ var date = $('<input class="input-date" type="text" />'),
1709
+
1710
+ change = function(e){
1711
+
1712
+ replaceInputUI.date.blockAttr = true;
1713
+ var value;
1714
+ if(options.lazyDate){
1715
+ var timer = $.data(date[0], 'setDateLazyTimer');
1716
+ if(timer){
1717
+ clearTimeout(timer);
1718
+ $.removeData(date[0], 'setDateLazyTimer');
1719
+ }
1720
+ }
1721
+ try {
1722
+ value = $.datepicker.parseDate(date.datepicker('option', 'dateFormat'), date.prop('value') );
1723
+ value = (value) ? $.datepicker.formatDate( 'yy-mm-dd', value ) : date.prop('value');
1724
+ } catch(e){
1725
+ value = date.prop('value');
1726
+ }
1727
+ elem.prop('value', value);
1728
+ replaceInputUI.date.blockAttr = false;
1729
+ e.stopImmediatePropagation();
1730
+ triggerInlineForm(elem[0], 'input');
1731
+ triggerInlineForm(elem[0], 'change');
1732
+ },
1733
+ data
1734
+
1735
+ ;
1736
+
1737
+ this.common(elem, date, replaceInputUI.date.attrs);
1738
+
1739
+ data = configureDatePicker(elem, date, change);
1740
+
1741
+ $(elem)
1742
+ .bind('updateshadowdom', function(){
1743
+ if (data.trigger[0]) {
1744
+ elem.css({display: ''});
1745
+ if(elem[0].offsetWidth || elem[0].offsetHeight){
1746
+ var attr = getDimensions(elem);
1747
+ if (attr.css) {
1748
+ date.css(attr.css);
1749
+ if (attr.outerWidth) {
1750
+ date.outerWidth(attr.outerWidth);
1751
+ }
1752
+ adjustInputWithBtn(date, data.trigger);
1753
+ }
1754
+ }
1755
+ }
1756
+ elem.css({display: 'none'});
1757
+ })
1758
+ .triggerHandler('updateshadowdom')
1759
+ ;
1760
+ if (data.trigger[0]) {
1761
+ setTimeout(function(){
1762
+ webshims.ready('WINDOWLOAD', function(){
1763
+ $(elem).triggerHandler('updateshadowdom');
1764
+ });
1765
+ }, 9);
1766
+ }
1767
+
1768
+ };
1769
+
1770
+
1771
+ replaceInputUI.date.attrs = {
1772
+ disabled: function(orig, shim, value){
1773
+ $.prop(shim, 'disabled', !!value);
1774
+ },
1775
+ min: function(orig, shim, value){
1776
+ try {
1777
+ value = $.datepicker.parseDate('yy-mm-dd', value);
1778
+ } catch(e){value = false;}
1779
+ if(value){
1780
+ $(shim).datepicker('option', 'minDate', value);
1781
+ }
1782
+ },
1783
+ max: function(orig, shim, value){
1784
+ try {
1785
+ value = $.datepicker.parseDate('yy-mm-dd', value);
1786
+ } catch(e){value = false;}
1787
+ if(value){
1788
+ $(shim).datepicker('option', 'maxDate', value);
1789
+ }
1790
+ },
1791
+ 'data-placeholder': function(orig, shim, value){
1792
+ var hintValue = (value || '').split('-');
1793
+ var dateFormat;
1794
+ if(hintValue.length == 3){
1795
+ value = $(shim).datepicker('option','dateFormat').replace('yy', hintValue[0]).replace('mm', hintValue[1]).replace('dd', hintValue[2]);
1796
+ }
1797
+ $.prop(shim, 'placeholder', value);
1798
+ },
1799
+ value: function(orig, shim, value){
1800
+ if(!replaceInputUI.date.blockAttr){
1801
+ try {
1802
+ var dateValue = $.datepicker.parseDate('yy-mm-dd', value);
1803
+ } catch(e){var dateValue = false;}
1804
+
1805
+ if(dateValue){
1806
+ lazySetDate($(shim), dateValue);
1807
+ } else {
1808
+ $.prop(shim, 'value', value);
1809
+ }
1810
+ }
1811
+ }
1812
+ };
1813
+ }
1814
+ if (!modernizrInputTypes.range || options.replaceUI) {
1815
+ replaceInputUI.range = function(elem){
1816
+ if(!$.fn.slider){return;}
1817
+ var range = $('<span class="input-range"><span class="ui-slider-handle" role="slider" tabindex="0" /></span>'),
1818
+ change = function(e, ui){
1819
+ if(e.originalEvent){
1820
+ replaceInputUI.range.blockAttr = true;
1821
+ elem.prop('value', ui.value);
1822
+ replaceInputUI.range.blockAttr = false;
1823
+ triggerInlineForm(elem[0], 'input');
1824
+ }
1825
+ }
1826
+ ;
1827
+
1828
+ this.common(elem, range, replaceInputUI.range.attrs);
1829
+
1830
+
1831
+ elem
1832
+ .bind('updateshadowdom', function(){
1833
+ elem.css({display: ''});
1834
+ if (elem[0].offsetWidth || elem[0].offsetHeight) {
1835
+ var attr = getDimensions(elem);
1836
+ if (attr.css) {
1837
+ range.css(attr.css);
1838
+ if (attr.outerWidth) {
1839
+ range.outerWidth(attr.outerWidth);
1840
+ }
1841
+ }
1842
+ }
1843
+ elem.css({display: 'none'});
1844
+ })
1845
+ .triggerHandler('updateshadowdom')
1846
+ ;
1847
+
1848
+
1849
+ range.slider($.extend(true, {}, options.slider, elem.data('slider'))).bind('slide', change).bind('slidechange', function(e){
1850
+ if(e.originalEvent){
1851
+ triggerInlineForm(elem[0], 'change');
1852
+ }
1853
+ });
1854
+
1855
+ ['disabled', 'min', 'max', 'step', 'value'].forEach(function(name){
1856
+ var val = elem.prop(name);
1857
+ var shadow;
1858
+ if(name == 'value' && !val){
1859
+
1860
+ shadow = elem.getShadowElement();
1861
+ if(shadow){
1862
+ val = ($(shadow).slider('option', 'max') - $(shadow).slider('option', 'min')) / 2;
1863
+ }
1864
+ }
1865
+ if(val != null){
1866
+ elem.prop(name, val);
1867
+ }
1868
+ });
1869
+ };
1870
+
1871
+ replaceInputUI.range.attrs = {
1872
+ disabled: function(orig, shim, value){
1873
+ value = !!value;
1874
+ $(shim).slider( "option", "disabled", value );
1875
+ $('span', shim)
1876
+ .attr({
1877
+ 'aria-disabled': value+'',
1878
+ 'tabindex': (value) ? '-1' : '0'
1879
+ })
1880
+ ;
1881
+ },
1882
+ min: function(orig, shim, value){
1883
+ value = (value) ? value * 1 || 0 : 0;
1884
+ $(shim).slider( "option", "min", value );
1885
+ $('span', shim).attr({'aria-valuemin': value});
1886
+ },
1887
+ max: function(orig, shim, value){
1888
+ value = (value || value === 0) ? value * 1 || 100 : 100;
1889
+ $(shim).slider( "option", "max", value );
1890
+ $('span', shim).attr({'aria-valuemax': value});
1891
+ },
1892
+ value: function(orig, shim, value){
1893
+ value = $(orig).prop('valueAsNumber');
1894
+ if(!isNaN(value)){
1895
+ if(!replaceInputUI.range.blockAttr){
1896
+ $(shim).slider( "option", "value", value );
1897
+ }
1898
+ $('span', shim).attr({'aria-valuenow': value, 'aria-valuetext': value});
1899
+ }
1900
+ },
1901
+ step: function(orig, shim, value){
1902
+ value = (value && $.trim(value)) ? value * 1 || 1 : 1;
1903
+ $(shim).slider( "option", "step", value );
1904
+ }
1905
+ };
1906
+ }
1907
+
1908
+ if(!webshims.bugs.valueAsNumberSet && (options.replaceUI || !Modernizr.inputtypes.date /*|| !Modernizr.inputtypes["datetime-local"]*/ || !Modernizr.inputtypes.range)){
1909
+ var reflectFn = function(val){
1910
+ if(webshims.data(this, 'hasShadow')){
1911
+ $.prop(this, 'value', $.prop(this, 'value'));
1912
+ }
1913
+ };
1914
+
1915
+ webshims.onNodeNamesPropertyModify('input', 'valueAsNumber', reflectFn);
1916
+ webshims.onNodeNamesPropertyModify('input', 'valueAsDate', reflectFn);
1917
+ }
1918
+
1919
+ $.each(['disabled', 'min', 'max', 'value', 'step', 'data-placeholder'], function(i, attr){
1920
+ webshims.onNodeNamesPropertyModify('input', attr, function(val){
1921
+ var shadowData = webshims.data(this, 'shadowData');
1922
+ if(shadowData && shadowData.data && shadowData.data[attr] && shadowData.nativeElement === this){
1923
+ shadowData.data[attr](this, shadowData.shadowElement, val);
1924
+ }
1925
+ }
1926
+ );
1927
+ });
1928
+ if(!options.availabeLangs){
1929
+ options.availabeLangs = 'af ar ar-DZ az bg bs ca cs da de el en-AU en-GB en-NZ eo es et eu fa fi fo fr fr-CH gl he hr hu hy id is it ja ko kz lt lv ml ms nl no pl pt-BR rm ro ru sk sl sq sr sr-SR sv ta th tr uk vi zh-CN zh-HK zh-TW'.split(' ');
1930
+ }
1931
+
1932
+ var getDefaults = function(){
1933
+ if(!$.datepicker){return;}
1934
+
1935
+ webshims.activeLang({
1936
+ langObj: $.datepicker.regional,
1937
+ module: 'form-number-date-ui',
1938
+ callback: function(langObj){
1939
+ var datepickerCFG = $.extend({}, defaultDatepicker, langObj, options.datepicker);
1940
+
1941
+
1942
+ if(datepickerCFG.dateFormat && options.datepicker.dateFormat != datepickerCFG.dateFormat ){
1943
+ $('input.hasDatepicker')
1944
+ .filter('.input-date, .input-datetime-local-date')
1945
+ .datepicker('option', 'dateFormat', datepickerCFG.dateFormat)
1946
+ .getNativeElement()
1947
+ .filter('[data-placeholder]')
1948
+ .attr('data-placeholder', function(i, val){
1949
+ return val;
1950
+ })
1951
+ ;
1952
+ }
1953
+ $.datepicker.setDefaults(datepickerCFG);
1954
+ }
1955
+ });
1956
+ $(document).unbind('jquery-uiReady.langchange input-widgetsReady.langchange');
1957
+ };
1958
+
1959
+ $(document).bind('jquery-uiReady.langchange input-widgetsReady.langchange', getDefaults);
1960
+ getDefaults();
1961
+
1962
+ //implement set/arrow controls
1963
+ (function(){
1964
+ var supportsType = (function(){
1965
+ var types = {};
1966
+ return function(type){
1967
+ if(type in types){
1968
+ return types[type];
1969
+ }
1970
+ return (types[type] = ($('<input type="'+type+'" />')[0].type === type));
1971
+ };
1972
+ })();
1973
+
1974
+ if(supportsType('number') && supportsType('time')){return;}
1975
+ var doc = document;
1976
+ var options = webshims.cfg["forms-ext"];
1977
+ var typeModels = webshims.inputTypes;
1978
+ var allowedChars = {
1979
+ number: '0123456789.',
1980
+ time: '0123456789:.'
1981
+ };
1982
+
1983
+ var getNextStep = function(input, upDown, cache){
1984
+
1985
+ cache = cache || {};
1986
+
1987
+ if( !('type' in cache) ){
1988
+ cache.type = $.prop(input, 'type');
1989
+ }
1990
+ if( !('step' in cache) ){
1991
+ cache.step = webshims.getStep(input, cache.type);
1992
+ }
1993
+ if( !('valueAsNumber' in cache) ){
1994
+ cache.valueAsNumber = typeModels[cache.type].asNumber($.prop(input, 'value'));
1995
+ }
1996
+ var delta = (cache.step == 'any') ? typeModels[cache.type].step * typeModels[cache.type].stepScaleFactor : cache.step,
1997
+ ret
1998
+ ;
1999
+ webshims.addMinMaxNumberToCache('min', $(input), cache);
2000
+ webshims.addMinMaxNumberToCache('max', $(input), cache);
2001
+
2002
+ if(isNaN(cache.valueAsNumber)){
2003
+ cache.valueAsNumber = typeModels[cache.type].stepBase || 0;
2004
+ }
2005
+ //make a valid step
2006
+ if(cache.step !== 'any'){
2007
+ ret = Math.round( ((cache.valueAsNumber - (cache.minAsnumber || 0)) % cache.step) * 1e7 ) / 1e7;
2008
+ if(ret && Math.abs(ret) != cache.step){
2009
+ cache.valueAsNumber = cache.valueAsNumber - ret;
2010
+ }
2011
+ }
2012
+ ret = cache.valueAsNumber + (delta * upDown);
2013
+ //using NUMBER.MIN/MAX is really stupid | ToDo: either use disabled state or make this more usable
2014
+ if(!isNaN(cache.minAsNumber) && ret < cache.minAsNumber){
2015
+ ret = (cache.valueAsNumber * upDown < cache.minAsNumber) ? cache.minAsNumber : isNaN(cache.maxAsNumber) ? cache.valueAsNumber : cache.maxAsNumber;
2016
+ } else if(!isNaN(cache.maxAsNumber) && ret > cache.maxAsNumber){
2017
+ ret = (cache.valueAsNumber * upDown > cache.maxAsNumber) ? cache.maxAsNumber : isNaN(cache.minAsNumber) ? cache.valueAsNumber : cache.minAsNumber;
2018
+ } else {
2019
+ ret = Math.round( ret * 1e7) / 1e7;
2020
+ }
2021
+ return ret;
2022
+ };
2023
+
2024
+ webshims.modules["form-number-date-ui"].getNextStep = getNextStep;
2025
+
2026
+
2027
+ if(options.stepArrows){
2028
+ var stepDisableEnable = {
2029
+ // don't change getter
2030
+ set: function(value){
2031
+ var stepcontrols = webshims.data(this, 'step-controls');
2032
+ if(stepcontrols){
2033
+ stepcontrols[ (this.disabled || this.readonly) ? 'addClass' : 'removeClass' ]('disabled-step-control');
2034
+ }
2035
+ }
2036
+ };
2037
+ webshims.onNodeNamesPropertyModify('input', 'disabled', stepDisableEnable);
2038
+ webshims.onNodeNamesPropertyModify('input', 'readonly', $.extend({}, stepDisableEnable));
2039
+ }
2040
+ var stepKeys = {
2041
+ 38: 1,
2042
+ 40: -1
2043
+ };
2044
+
2045
+ var changeInput = function(elem, type){
2046
+ var blockBlurChange = false;
2047
+ var DELAY = 9;
2048
+ var doChangeValue, blockChangeValue;
2049
+
2050
+ function step(dir){
2051
+ if($.prop(elem, 'disabled') || elem.readOnly || !dir){return;}
2052
+ doChangeValue = typeModels[type].numberToString(getNextStep(elem, dir, {type: type}));
2053
+ $.prop(elem, 'value', doChangeValue);
2054
+ triggerInlineForm(elem, 'input');
2055
+ }
2056
+
2057
+ function setFocus(){
2058
+ blockBlurChange = true;
2059
+ setTimeout(function(){
2060
+ blockBlurChange = false;
2061
+ }, DELAY + 9);
2062
+ setTimeout(function(){
2063
+ if(!$(elem).is(':focus')){
2064
+ try{
2065
+ elem.focus();
2066
+ } catch(e){}
2067
+ }
2068
+ }, 1);
2069
+ }
2070
+
2071
+ function triggerChange(){
2072
+ var curValue = $.prop(elem, 'value');
2073
+ if(curValue == doChangeValue && curValue != blockChangeValue && typeof curValue == 'string'){
2074
+ triggerInlineForm(elem, 'change');
2075
+ }
2076
+ blockChangeValue = curValue;
2077
+ }
2078
+
2079
+ function init(){
2080
+ blockChangeValue = $(elem)
2081
+ .bind({
2082
+ 'change.stepcontrol focus.stepcontrol': function(e){
2083
+ if(!blockBlurChange || e.type != 'focus'){
2084
+ blockChangeValue = $.prop(elem, 'value');
2085
+ }
2086
+ },
2087
+ 'blur.stepcontrol': function(){
2088
+ if(!blockBlurChange){
2089
+ setTimeout(function(){
2090
+ if(!blockBlurChange && !$(elem).is(':focus')){
2091
+ triggerChange();
2092
+ }
2093
+ doChangeValue = false;
2094
+ }, DELAY);
2095
+ }
2096
+ }
2097
+ })
2098
+ .prop('value')
2099
+ ;
2100
+ }
2101
+
2102
+ init();
2103
+ return {
2104
+ triggerChange: triggerChange,
2105
+ step: step,
2106
+ setFocus: setFocus
2107
+ };
2108
+ };
2109
+
2110
+ webshims.addReady(function(context, contextElem){
2111
+ //ui for numeric values
2112
+ if(options.stepArrows){
2113
+ $('input', context).add(contextElem.filter('input')).each(function(){
2114
+ var type = $.prop(this, 'type');
2115
+ if(!typeModels[type] || !typeModels[type].asNumber || !options.stepArrows || (options.stepArrows !== true && !options.stepArrows[type]) || supportsType(type) || $(elem).hasClass('has-step-controls')){return;}
2116
+ var elem = this;
2117
+ var uiEvents = changeInput(elem, type);
2118
+ var controls = $('<span class="step-controls" unselectable="on"><span class="step-up" /><span class="step-down" /></span>')
2119
+ .insertAfter(elem)
2120
+ .bind('selectstart dragstart', function(){return false;})
2121
+ .bind('mousedown mousepress', function(e){
2122
+ if(!$(e.target).hasClass('step-controls')){
2123
+ uiEvents.step(($(e.target).hasClass('step-up')) ? 1 : -1);
2124
+ }
2125
+ uiEvents.setFocus();
2126
+ return false;
2127
+ })
2128
+ .bind('mousepressstart mousepressend', function(e){
2129
+ if(e.type == 'mousepressend'){
2130
+ uiEvents.triggerChange();
2131
+ }
2132
+ $(e.target)[e.type == 'mousepressstart' ? 'addClass' : 'removeClass']('mousepress-ui');
2133
+ })
2134
+ ;
2135
+ var mwheelUpDown = function(e, d){
2136
+ if(d){
2137
+ uiEvents.step(d);
2138
+ return false;
2139
+ }
2140
+ };
2141
+
2142
+ var jElm = $(elem)
2143
+ .addClass('has-step-controls')
2144
+ .attr({
2145
+ readonly: elem.readOnly,
2146
+ disabled: elem.disabled,
2147
+ autocomplete: 'off',
2148
+ role: 'spinbutton'
2149
+ })
2150
+ .bind('keyup', function(e){
2151
+ var step = stepKeys[e.keyCode];
2152
+ if(step){
2153
+ uiEvents.triggerChange(step);
2154
+ }
2155
+ })
2156
+ .bind(($.browser.msie) ? 'keydown' : 'keypress', function(e){
2157
+ var step = stepKeys[e.keyCode];
2158
+ if(step){
2159
+ uiEvents.step(step);
2160
+ return false;
2161
+ }
2162
+ })
2163
+ ;
2164
+
2165
+ if(allowedChars[type]){
2166
+ jElm.bind('keypress', (function(){
2167
+ var chars = allowedChars[type];
2168
+ return function(event){
2169
+ var chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
2170
+ return event.ctrlKey || event.metaKey || (chr < ' ' || chars.indexOf(chr) > -1);
2171
+ };
2172
+ })());
2173
+ }
2174
+
2175
+ jElm
2176
+ .bind('focus', function(){
2177
+ jElm.add(controls).unbind('.mwhellwebshims')
2178
+ .bind('mousewheel.mwhellwebshims', mwheelUpDown)
2179
+ ;
2180
+ })
2181
+ .bind('blur', function(){
2182
+ $(elem).add(controls).unbind('.mwhellwebshims');
2183
+ })
2184
+ ;
2185
+
2186
+ webshims.data(elem, 'step-controls', controls);
2187
+ if(options.calculateWidth){
2188
+ var init;
2189
+ jElm
2190
+ .bind('updateshadowdom', function(){
2191
+ if(!init && (elem.offsetWidth || elem.offsetHeight)){
2192
+ init = true;
2193
+ adjustInputWithBtn(jElm, controls);
2194
+ controls.css('marginTop', (jElm.outerHeight() - controls.outerHeight()) / 2);
2195
+ }
2196
+ })
2197
+ .triggerHandler('updateshadowdom')
2198
+ ;
2199
+ }
2200
+ });
2201
+ }
2202
+ });
2203
+ })();
2204
+
2205
+
2206
+ webshims.addReady(function(context, elem){
2207
+ $(document).bind('jquery-uiReady.initinputui input-widgetsReady.initinputui', function(e){
2208
+ if($.datepicker || $.fn.slider){
2209
+ if($.datepicker && !defaultDatepicker.dateFormat){
2210
+ defaultDatepicker.dateFormat = $.datepicker._defaults.dateFormat;
2211
+ }
2212
+ replaceInputUI(context, elem);
2213
+ }
2214
+ if($.datepicker && $.fn.slider){
2215
+ $(document).unbind('.initinputui');
2216
+ } else if(!webshims.modules["input-widgets"].src){
2217
+ webshims.warn('jQuery UI Widget factory is already included, but not datepicker or slider. configure src of $.webshims.modules["input-widgets"].src');
2218
+ }
2219
+ });
2220
+ });
2221
+
2222
+ });
2223
+