webshims-rails 1.13.0 → 1.14.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/extras/modernizr-custom.js +0 -0
  4. data/vendor/assets/javascripts/webshims/polyfiller.js +45 -26
  5. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/canvas2png.js +0 -0
  6. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.js +0 -0
  7. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/flashcanvas.swf +0 -0
  8. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/proxy.php +0 -0
  9. data/vendor/assets/javascripts/webshims/shims/FlashCanvas/save.php +0 -0
  10. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/canvas2png.js +0 -0
  11. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash10canvas.swf +0 -0
  12. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flash9canvas.swf +0 -0
  13. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/flashcanvas.js +0 -0
  14. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/proxy.php +0 -0
  15. data/vendor/assets/javascripts/webshims/shims/FlashCanvasPro/save.php +0 -0
  16. data/vendor/assets/javascripts/webshims/shims/color-picker.js +0 -0
  17. data/vendor/assets/javascripts/webshims/shims/combos/1.js +33 -2
  18. data/vendor/assets/javascripts/webshims/shims/combos/10.js +82 -29
  19. data/vendor/assets/javascripts/webshims/shims/combos/11.js +50 -27
  20. data/vendor/assets/javascripts/webshims/shims/combos/12.js +0 -0
  21. data/vendor/assets/javascripts/webshims/shims/combos/13.js +0 -0
  22. data/vendor/assets/javascripts/webshims/shims/combos/14.js +1 -1
  23. data/vendor/assets/javascripts/webshims/shims/combos/15.js +115 -43
  24. data/vendor/assets/javascripts/webshims/shims/combos/16.js +115 -43
  25. data/vendor/assets/javascripts/webshims/shims/combos/17.js +50 -27
  26. data/vendor/assets/javascripts/webshims/shims/combos/18.js +50 -27
  27. data/vendor/assets/javascripts/webshims/shims/combos/19.js +33 -3
  28. data/vendor/assets/javascripts/webshims/shims/combos/2.js +65 -4
  29. data/vendor/assets/javascripts/webshims/shims/combos/20.js +33 -3
  30. data/vendor/assets/javascripts/webshims/shims/combos/21.js +1 -1
  31. data/vendor/assets/javascripts/webshims/shims/combos/22.js +0 -0
  32. data/vendor/assets/javascripts/webshims/shims/combos/23.js +0 -0
  33. data/vendor/assets/javascripts/webshims/shims/combos/25.js +492 -2580
  34. data/vendor/assets/javascripts/webshims/shims/combos/26.js +8314 -1432
  35. data/vendor/assets/javascripts/webshims/shims/combos/27.js +1642 -556
  36. data/vendor/assets/javascripts/webshims/shims/combos/28.js +50 -39
  37. data/vendor/assets/javascripts/webshims/shims/combos/29.js +0 -0
  38. data/vendor/assets/javascripts/webshims/shims/combos/3.js +66 -5
  39. data/vendor/assets/javascripts/webshims/shims/combos/30.js +66 -5
  40. data/vendor/assets/javascripts/webshims/shims/combos/31.js +65 -4
  41. data/vendor/assets/javascripts/webshims/shims/combos/32.js +0 -0
  42. data/vendor/assets/javascripts/webshims/shims/combos/33.js +0 -0
  43. data/vendor/assets/javascripts/webshims/shims/combos/34.js +32 -2
  44. data/vendor/assets/javascripts/webshims/shims/combos/4.js +33 -3
  45. data/vendor/assets/javascripts/webshims/shims/combos/5.js +50 -27
  46. data/vendor/assets/javascripts/webshims/shims/combos/6.js +50 -27
  47. data/vendor/assets/javascripts/webshims/shims/combos/7.js +66 -5
  48. data/vendor/assets/javascripts/webshims/shims/combos/8.js +66 -5
  49. data/vendor/assets/javascripts/webshims/shims/combos/9.js +82 -29
  50. data/vendor/assets/javascripts/webshims/shims/combos/97.js +0 -0
  51. data/vendor/assets/javascripts/webshims/shims/combos/98.js +1 -2
  52. data/vendor/assets/javascripts/webshims/shims/combos/99.js +1 -2
  53. data/vendor/assets/javascripts/webshims/shims/combos/comboinfo.json +1 -0
  54. data/vendor/assets/javascripts/webshims/shims/details.js +0 -0
  55. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +32 -2
  56. data/vendor/assets/javascripts/webshims/shims/es5.js +0 -0
  57. data/vendor/assets/javascripts/webshims/shims/excanvas.js +0 -0
  58. data/vendor/assets/javascripts/webshims/shims/filereader.js +441 -362
  59. data/vendor/assets/javascripts/webshims/shims/form-combat.js +19 -7
  60. data/vendor/assets/javascripts/webshims/shims/form-core.js +33 -2
  61. data/vendor/assets/javascripts/webshims/shims/form-datalist-lazy.js +0 -0
  62. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +0 -0
  63. data/vendor/assets/javascripts/webshims/shims/form-fixrangechange.js +0 -0
  64. data/vendor/assets/javascripts/webshims/shims/form-message.js +1 -1
  65. data/vendor/assets/javascripts/webshims/shims/form-native-extend.js +0 -0
  66. data/vendor/assets/javascripts/webshims/shims/form-number-date-api.js +0 -0
  67. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +50 -27
  68. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +49 -38
  69. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +45 -14
  70. data/vendor/assets/javascripts/webshims/shims/form-validation.js +105 -7
  71. data/vendor/assets/javascripts/webshims/shims/form-validators.js +212 -134
  72. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +15 -12
  73. data/vendor/assets/javascripts/webshims/shims/geolocation.js +0 -0
  74. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ar.js +0 -0
  75. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ch-CN.js +0 -0
  76. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-cs.js +0 -0
  77. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-de.js +0 -0
  78. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-el.js +0 -0
  79. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-en.js +0 -0
  80. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-es.js +0 -0
  81. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-fr.js +0 -0
  82. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-he.js +0 -0
  83. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-hi.js +0 -0
  84. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-hu.js +0 -0
  85. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-it.js +0 -0
  86. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ja.js +0 -0
  87. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-lt.js +0 -0
  88. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-nl.js +0 -0
  89. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pl.js +0 -0
  90. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt-BR.js +0 -0
  91. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt-PT.js +0 -0
  92. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-pt.js +0 -0
  93. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-ru.js +0 -0
  94. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-sv.js +0 -0
  95. data/vendor/assets/javascripts/webshims/shims/i18n/formcfg-zh-CN.js +0 -0
  96. data/vendor/assets/javascripts/webshims/shims/jajax.js +0 -0
  97. data/vendor/assets/javascripts/webshims/shims/jme/b.js +0 -0
  98. data/vendor/assets/javascripts/webshims/shims/jme/c.js +1 -2
  99. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +0 -0
  100. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +0 -0
  101. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +3 -3
  102. data/vendor/assets/javascripts/webshims/shims/jme/p.js +0 -0
  103. data/vendor/assets/javascripts/webshims/shims/jpicker/ChangeLog.txt +0 -0
  104. data/vendor/assets/javascripts/webshims/shims/jpicker/ReadMe.txt +0 -0
  105. data/vendor/assets/javascripts/webshims/shims/jpicker/images/AlphaBar.png +0 -0
  106. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Bars.png +0 -0
  107. data/vendor/assets/javascripts/webshims/shims/jpicker/images/Maps.png +0 -0
  108. data/vendor/assets/javascripts/webshims/shims/jpicker/images/NoColor.png +0 -0
  109. data/vendor/assets/javascripts/webshims/shims/jpicker/images/bar-opacity.png +0 -0
  110. data/vendor/assets/javascripts/webshims/shims/jpicker/images/map-opacity.png +0 -0
  111. data/vendor/assets/javascripts/webshims/shims/jpicker/images/mappoint.gif +0 -0
  112. data/vendor/assets/javascripts/webshims/shims/jpicker/images/picker.gif +0 -0
  113. data/vendor/assets/javascripts/webshims/shims/jpicker/images/preview-opacity.png +0 -0
  114. data/vendor/assets/javascripts/webshims/shims/jpicker/images/rangearrows.gif +0 -0
  115. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +0 -0
  116. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +0 -0
  117. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +1 -1
  118. data/vendor/assets/javascripts/webshims/shims/mediaelement-native-fix.js +0 -0
  119. data/vendor/assets/javascripts/webshims/shims/mediaelement-yt.js +1 -1
  120. data/vendor/assets/javascripts/webshims/shims/moxie/flash/Moxie.cdn.swf +0 -0
  121. data/vendor/assets/javascripts/webshims/shims/moxie/js/moxie.js +7994 -0
  122. data/vendor/assets/javascripts/webshims/shims/moxie/silverlight/Moxie.cdn.xap +0 -0
  123. data/vendor/assets/javascripts/webshims/shims/picture.js +50 -43
  124. data/vendor/assets/javascripts/webshims/shims/plugins/jquery.ui.position.js +0 -0
  125. data/vendor/assets/javascripts/webshims/shims/promise.js +0 -0
  126. data/vendor/assets/javascripts/webshims/shims/range-ui.js +0 -0
  127. data/vendor/assets/javascripts/webshims/shims/sizzle.js +0 -0
  128. data/vendor/assets/javascripts/webshims/shims/styles/color-picker.png +0 -0
  129. data/vendor/assets/javascripts/webshims/shims/styles/config.rb +0 -0
  130. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +7 -2
  131. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +0 -0
  132. data/vendor/assets/javascripts/webshims/shims/styles/progress.gif +0 -0
  133. data/vendor/assets/javascripts/webshims/shims/styles/progress.png +0 -0
  134. data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-forms-ext.scss +219 -0
  135. data/vendor/assets/javascripts/webshims/shims/styles/scss/_api-shim.scss +115 -0
  136. data/vendor/assets/javascripts/webshims/shims/styles/scss/_extends.scss +31 -0
  137. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +583 -0
  138. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +488 -0
  139. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim-ext.scss +2 -0
  140. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +736 -0
  141. data/vendor/assets/javascripts/webshims/shims/styles/shim-ext.css +105 -21
  142. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +91 -19
  143. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  144. data/vendor/assets/javascripts/webshims/shims/swf/filereader.swf +0 -0
  145. data/vendor/assets/javascripts/webshims/shims/swfmini-embed.js +0 -0
  146. data/vendor/assets/javascripts/webshims/shims/swfmini.js +0 -0
  147. data/vendor/assets/javascripts/webshims/shims/track-ui.js +1 -1
  148. data/vendor/assets/javascripts/webshims/shims/track.js +0 -0
  149. metadata +13 -2
@@ -1,612 +1,1698 @@
1
- /*! SWFMini - a SWFObject 2.2 cut down version for webshims
2
- *
3
- * based on SWFObject v2.2 <http://code.google.com/p/swfobject/>
4
- is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
5
- */
6
-
7
- var swfmini = function() {
8
- var wasRemoved = function(){webshims.error('This method was removed from swfmini');};
9
- var UNDEF = "undefined",
10
- OBJECT = "object",
11
- webshims = window.webshims,
12
- SHOCKWAVE_FLASH = "Shockwave Flash",
13
- SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
14
- FLASH_MIME_TYPE = "application/x-shockwave-flash",
15
-
16
- win = window,
17
- doc = document,
18
- nav = navigator,
19
-
20
- plugin = false,
21
- domLoadFnArr = [main],
22
-
23
- isDomLoaded = false,
24
- autoHideShow = true,
25
-
26
- /* Centralized function for browser feature detection
27
- - User agent string detection is only used when no good alternative is possible
28
- - Is executed directly for optimal performance
29
- */
30
- ua = function() {
31
- var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
32
- u = nav.userAgent.toLowerCase(),
33
- p = nav.platform.toLowerCase(),
34
- windows = p ? /win/.test(p) : /win/.test(u),
35
- mac = p ? /mac/.test(p) : /mac/.test(u),
36
- webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
37
- ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
38
- playerVersion = [0,0,0],
39
- d = null;
40
- if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
41
- d = nav.plugins[SHOCKWAVE_FLASH].description;
42
- if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
43
- plugin = true;
44
- ie = false; // cascaded feature detection for Internet Explorer
45
- d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
46
- playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
47
- playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
48
- playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
49
- }
1
+ webshims.register('form-shim-extend2', function($, webshims, window, document, undefined, options){
2
+ "use strict";
3
+ var isNumber = function(string){
4
+ return (typeof string == 'number' || (string && string == string * 1));
5
+ };
6
+
7
+ //support getSetAttribute
8
+ var supportGetSetAttribute = !(('getSetAttribute' in $.support) && !$.support.getSetAttribute);
9
+ //submitbubbles for IE6-IE8
10
+ var supportSubmitBubbles = !('submitBubbles' in $.support) || $.support.submitBubbles;
11
+ var addSubmitBubbles = function(form){
12
+ if (!supportSubmitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
13
+
14
+ $.event.add( form, 'submit._submit', function( event ) {
15
+ event._submit_bubble = true;
16
+ });
17
+
18
+ form._submit_attached = true;
50
19
  }
51
- else if (typeof win.ActiveXObject != UNDEF) {
52
- try {
53
- var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
54
- if (a) { // a will return null when ActiveX is disabled
55
- d = a.GetVariable("$version");
56
- if (d) {
57
- ie = true; // cascaded feature detection for Internet Explorer
58
- d = d.split(" ")[1].split(",");
59
- playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
60
- }
61
- }
20
+ };
21
+ if(!supportSubmitBubbles && $.event.special.submit){
22
+
23
+ $.event.special.submit.setup = function() {
24
+ // Only need this for delegated form submit events
25
+ if ( $.nodeName( this, "form" ) ) {
26
+ return false;
62
27
  }
63
- catch(e) {}
64
- }
65
- return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
66
- }();
67
-
68
-
69
- function callDomLoadFunctions() {
70
- if (isDomLoaded) { return; }
71
- isDomLoaded = true;
72
- var dl = domLoadFnArr.length;
73
- for (var i = 0; i < dl; i++) {
74
- domLoadFnArr[i]();
75
- }
76
- }
77
-
78
- function addDomLoadEvent(fn) {
79
- if (isDomLoaded) {
80
- fn();
81
- }
82
- else {
83
- domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
84
- }
85
- }
86
28
 
87
-
88
- /* Main function
89
- - Will preferably execute onDomLoad, otherwise onload (as a fallback)
90
- */
91
- function main() {
92
- if (plugin) {
93
- testPlayerVersion();
94
- }
29
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
30
+ $.event.add( this, "click._submit keypress._submit", function( e ) {
31
+ // Node name check avoids a VML-related crash in IE (#9807)
32
+ var elem = e.target,
33
+ form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
34
+ addSubmitBubbles(form);
35
+
36
+ });
37
+ // return undefined since we don't need an event listener
38
+ };
95
39
  }
96
-
97
- /* Detect the Flash Player version for non-Internet Explorer browsers
98
- - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
99
- a. Both release and build numbers can be detected
100
- b. Avoid wrong descriptions by corrupt installers provided by Adobe
101
- c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
102
- - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
103
- */
104
- function testPlayerVersion() {
105
- var b = doc.getElementsByTagName("body")[0];
106
- var o = createElement(OBJECT);
107
- o.setAttribute("type", FLASH_MIME_TYPE);
108
- var t = b.appendChild(o);
109
- if (t) {
110
- var counter = 0;
111
- (function(){
112
- if (typeof t.GetVariable != UNDEF) {
113
- var d = t.GetVariable("$version");
114
- if (d) {
115
- d = d.split(" ")[1].split(",");
116
- ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
40
+
41
+ webshims.reflectProperties(['input'], ['pattern']);
42
+
43
+
44
+ if( !('maxLength' in document.createElement('textarea')) ){
45
+ var constrainMaxLength = (function(){
46
+ var timer;
47
+ var curLength = 0;
48
+ var lastElement = $([]);
49
+ var max = 1e9;
50
+ var constrainLength = function(){
51
+ var nowValue = lastElement.prop('value');
52
+ var nowLen = nowValue.length;
53
+ if(nowLen > curLength && nowLen > max){
54
+ nowLen = Math.max(curLength, max);
55
+ lastElement.prop('value', nowValue.substr(0, nowLen ));
56
+ }
57
+ curLength = nowLen;
58
+ };
59
+ var remove = function(){
60
+ clearTimeout(timer);
61
+ lastElement.off('.maxlengthconstraint');
62
+ };
63
+ return function(element, maxLength){
64
+ remove();
65
+ if(maxLength > -1){
66
+ max = maxLength;
67
+ curLength = $.prop(element, 'value').length;
68
+ lastElement = $(element);
69
+ lastElement.on({
70
+ 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
71
+ setTimeout(constrainLength, 0);
72
+ },
73
+ 'keyup.maxlengthconstraint': constrainLength,
74
+ 'blur.maxlengthconstraint': remove
75
+ });
76
+ timer = setInterval(constrainLength, 200);
77
+ }
78
+ };
79
+ })();
80
+
81
+ constrainMaxLength.update = function(element, maxLength){
82
+ if($(element).is(':focus')){
83
+ if(!maxLength){
84
+ maxLength = $.prop(element, 'maxlength');
85
+ }
86
+ constrainMaxLength(element, maxLength);
87
+ }
88
+ };
89
+
90
+ $(document).on('focusin', function(e){
91
+ var maxLength;
92
+ if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
93
+ constrainMaxLength(e.target, maxLength);
94
+ }
95
+ });
96
+
97
+ webshims.defineNodeNameProperty('textarea', 'maxlength', {
98
+ attr: {
99
+ set: function(val){
100
+ this.setAttribute('maxlength', ''+val);
101
+ constrainMaxLength.update(this);
102
+ },
103
+ get: function(){
104
+ var ret = this.getAttribute('maxlength');
105
+ return ret == null ? undefined : ret;
106
+ }
107
+ },
108
+ prop: {
109
+ set: function(val){
110
+ if(isNumber(val)){
111
+ if(val < 0){
112
+ throw('INDEX_SIZE_ERR');
113
+ }
114
+ val = parseInt(val, 10);
115
+ this.setAttribute('maxlength', val);
116
+ constrainMaxLength.update(this, val);
117
+ return;
117
118
  }
119
+ this.setAttribute('maxlength', '0');
120
+ constrainMaxLength.update(this, 0);
121
+ },
122
+ get: function(){
123
+ var val = this.getAttribute('maxlength');
124
+ return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
125
+
118
126
  }
119
- else if (counter < 10) {
120
- counter++;
121
- setTimeout(arguments.callee, 10);
122
- return;
127
+ }
128
+ });
129
+ webshims.defineNodeNameProperty('textarea', 'maxLength', {
130
+ prop: {
131
+ set: function(val){
132
+ $.prop(this, 'maxlength', val);
133
+ },
134
+ get: function(){
135
+ return $.prop(this, 'maxlength');
123
136
  }
124
- b.removeChild(o);
125
- t = null;
126
- })();
127
- }
137
+ }
138
+ });
128
139
  }
129
140
 
130
-
131
- function createElement(el) {
132
- return doc.createElement(el);
133
- }
134
-
135
-
136
- /* Flash Player and SWF content version matching
137
- */
138
- function hasPlayerVersion(rv) {
139
- var pv = ua.pv, v = rv.split(".");
140
- v[0] = parseInt(v[0], 10);
141
- v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
142
- v[2] = parseInt(v[2], 10) || 0;
143
- return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
141
+ if(!supportGetSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
142
+ webshims.defineNodeNameProperty('form', 'novalidate', {
143
+ attr: {
144
+ set: function(val){
145
+ this.setAttribute('novalidate', ''+val);
146
+ },
147
+ get: function(){
148
+ var ret = this.getAttribute('novalidate');
149
+ return ret == null ? undefined : ret;
150
+ }
151
+ }
152
+ });
144
153
  }
145
-
146
-
147
154
 
148
155
 
156
+ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldsetelements){
157
+ (function(){
158
+ if(!Modernizr.fieldsetdisabled){
159
+ var isFieldsetGroup = {
160
+ fieldset: 1,
161
+ FIELDSET: 1
162
+ };
163
+ var disableElementsSel = 'input, textarea, select, button';
164
+ $.extend($.expr[":"], {
165
+ "enabled": function( elem ) {
166
+ return elem.disabled === false || (isFieldsetGroup[elem.nodeName] && webshims.contentAttr(elem, 'disabled') == null && !$(elem).is('fieldset[disabled] *')) ;
167
+ },
149
168
 
150
- webshims.ready('DOM', callDomLoadFunctions);
169
+ "disabled": function( elem ) {
170
+ return elem.disabled === true || (isFieldsetGroup[elem.nodeName] && (webshims.contentAttr(elem, 'disabled') != null || $(elem).is('fieldset[disabled] *')));
171
+ }
172
+ });
151
173
 
152
- webshims.loader.addModule('swfmini-embed', {d: ['swfmini']});
153
- var loadEmbed = hasPlayerVersion('9.0.0') ?
154
- function(){
155
- webshims.loader.loadList(['swfmini-embed']);
156
- return true;
157
- } :
158
- webshims.$.noop
159
- ;
160
174
 
161
- if(!Modernizr.video){
162
- loadEmbed();
163
- } else {
164
- webshims.ready('WINDOWLOAD', loadEmbed);
165
- }
175
+ var groupControl = {
176
+ disable: function(){
177
+ if(!this.disabled){
178
+ webshims.data(this, 'groupedisabled', true);
179
+ this.disabled = true;
180
+ }
181
+ },
182
+ enable: function(){
183
+ if(this.disabled && webshims.data(this, 'groupedisabled')){
184
+ webshims.data(this, 'groupedisabled', false);
185
+ this.disabled = false;
186
+ }
187
+ }
188
+ };
189
+
190
+ $(window).on('unload', function(){
191
+ $(disableElementsSel).each(groupControl.enable);
192
+ });
193
+
194
+ webshims.defineNodeNamesBooleanProperty(['fieldset'], 'disabled', {
195
+ set: function(value){
196
+ value = !!value;
166
197
 
167
- return {
168
- /* Public API
169
- - Reference: http://code.google.com/p/swfobject/wiki/documentation
170
- */
171
- registerObject: wasRemoved,
172
-
173
- getObjectById: wasRemoved,
174
-
175
- embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
176
- var args = arguments;
177
- if(loadEmbed()){
178
- webshims.ready('swfmini-embed', function(){
179
- swfmini.embedSWF.apply(swfmini, args);
198
+ if(value){
199
+ $(this.querySelectorAll(disableElementsSel)).each(groupControl.disable);
200
+ } else if(!$(this).is('fieldset[disabled] *')){
201
+ var elements = $(this.querySelectorAll(disableElementsSel));
202
+
203
+ if( this.querySelector('fieldset[disabled]') ){
204
+ elements = elements.not('fieldset[disabled] *');
205
+ }
206
+
207
+ elements.each(groupControl.enable);
208
+ }
209
+ },
210
+ initAttr: true,
211
+ useContentAttribute: true
212
+ });
213
+
214
+ ['input', 'textarea', 'select', 'button'].forEach(function(nodeName){
215
+ var desc = webshims.defineNodeNameProperty(nodeName, 'disabled', {
216
+ prop: {
217
+ set: function(value){
218
+ if(value){
219
+ webshims.data(this, 'groupedisabled', false);
220
+ desc.prop._supset.call(this, value);
221
+ } else if($(this).is('fieldset[disabled] *')){
222
+ webshims.data(this, 'groupedisabled', true);
223
+ desc.prop._supset.call(this, true);
224
+ } else {
225
+ webshims.data(this, 'groupedisabled', false);
226
+ desc.prop._supset.call(this, value);
227
+ }
228
+ },
229
+ get: function(){
230
+ var ret = desc.prop._supget.call(this);
231
+ return ret ? !webshims.data(this, 'groupedisabled') : ret;
232
+ }
233
+ },
234
+ removeAttr: {
235
+ value: function(){
236
+ desc.prop.set.call(this, false);
237
+ }
238
+ }
239
+ });
240
+ });
241
+
242
+ webshims.addReady(function(context){
243
+
244
+ $(context)
245
+ .filter('fieldset[disabled], fieldset[disabled] *')
246
+ .find(disableElementsSel)
247
+ .each(groupControl.disable)
248
+ ;
180
249
  });
181
- } else if(callbackFn) {
182
- callbackFn({success:false, id:replaceElemIdStr});
183
250
  }
184
- },
185
-
186
- switchOffAutoHideShow: function() {
187
- autoHideShow = false;
188
- },
189
-
190
- ua: ua,
191
-
192
- getFlashPlayerVersion: function() {
193
- return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
194
- },
195
-
196
- hasFlashPlayerVersion: hasPlayerVersion,
197
-
198
- createSWF: function(attObj, parObj, replaceElemIdStr) {
199
- if (ua.w3) {
200
- return createSWF(attObj, parObj, replaceElemIdStr);
251
+
252
+
253
+ if(!Modernizr.formattribute){
254
+ (function(prop, undefined){
255
+ var isForm = {form: 1, FORM: 1};
256
+ $.prop = function(elem, name, value){
257
+ var ret;
258
+ //TODO: cache + perftest
259
+ if(elem && elem.nodeType == 1 && value === undefined && isForm[elem.nodeName] && elem.id){
260
+ ret = document.getElementsByName(name);
261
+ if(!ret || !ret.length){
262
+ ret = document.getElementById(name);
263
+ }
264
+ if(ret){
265
+ ret = $(ret).filter(function(){
266
+ return $.prop(this, 'form') == elem;
267
+ }).get();
268
+ if(ret.length){
269
+ return ret.length == 1 ? ret[0] : ret;
270
+ }
271
+ }
272
+ }
273
+ return prop.apply(this, arguments);
274
+ };
275
+ })($.prop, undefined);
276
+
277
+ var removeAddedElements = function(form){
278
+ var elements = $.data(form, 'webshimsAddedElements');
279
+ if(elements){
280
+ elements.remove();
281
+ $.removeData(form, 'webshimsAddedElements');
282
+ }
283
+ };
284
+
285
+ var getAssociatedForm = function () {
286
+ var form = webshims.contentAttr(this, 'form');
287
+ if(form){
288
+ form = document.getElementById(form);
289
+ if(form && !$.nodeName(form, 'form')){
290
+ form = null;
291
+ }
292
+ }
293
+ return form || this.form;
294
+ };
295
+ webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
296
+ prop: {
297
+ get: getAssociatedForm,
298
+ writeable: false
299
+ }
300
+ });
301
+
302
+ webshims.defineNodeNamesProperty(['form'], 'elements', {
303
+ prop: {
304
+ get: function(){
305
+ //TODO: cache + perftest
306
+ var sel, addElements, detachElements, formElements, i, len;
307
+ var id = this.id;
308
+ var elements = [];
309
+ if(id){
310
+ detachElements = $.data(this, 'webshimsAddedElements');
311
+ if(detachElements){
312
+ detachElements.detach();
313
+ }
314
+ }
315
+
316
+ formElements = this.elements;
317
+
318
+ if(this.querySelector('input[form], select[form], textarea[form]')){
319
+ for(i = 0, len = formElements.length; i < len; i++){
320
+ if(getAssociatedForm.call(formElements[i]) == this){
321
+ elements.push(formElements[i]);
322
+ }
323
+ }
324
+ } else {
325
+ elements = $.makeArray(formElements);
326
+ }
327
+
328
+ if(id){
329
+ sel = 'input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]';
330
+ addElements = document.querySelectorAll(sel) || [];
331
+ if(addElements.length){
332
+ elements = $(elements).add(addElements).get();
333
+
334
+ }
335
+ if(detachElements){
336
+ detachElements.appendTo(this);
337
+ }
338
+ }
339
+ return elements;
340
+ },
341
+ writeable: false
342
+ }
343
+ });
344
+
345
+
346
+
347
+ $(function(){
348
+ var stopPropagation = function(e){
349
+ e.stopPropagation();
350
+ };
351
+ var submitters = {
352
+ image: 1,
353
+ submit: 1
354
+ };
355
+ $(document).on('submit', function(e){
356
+
357
+ if(!e.isDefaultPrevented()){
358
+ var form = e.target;
359
+ var id = form.id;
360
+ var elements;
361
+
362
+
363
+ if(id){
364
+ removeAddedElements(form);
365
+ elements = document.querySelectorAll('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]');
366
+ elements = $(elements)
367
+ .filter(function(){
368
+ return !this.disabled && this.name && this.form != form;
369
+ })
370
+ .clone()
371
+ ;
372
+ if(elements.length){
373
+ $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
374
+ setTimeout(function(){
375
+ removeAddedElements(form);
376
+ }, 9);
377
+ }
378
+ elements = null;
379
+ }
380
+ }
381
+ });
382
+
383
+
384
+ $(document).on('click', function(e){
385
+ if(submitters[e.target.type] && !e.isDefaultPrevented() && webshims.contentAttr(e.target, 'form')){
386
+ var trueForm = $.prop(e.target, 'form');
387
+ var formIn = e.target.form;
388
+ var clone;
389
+ if(trueForm && trueForm != formIn){
390
+ clone = $(e.target)
391
+ .clone()
392
+ .removeAttr('form')
393
+ .addClass('webshims-visual-hide')
394
+ .on('click', stopPropagation)
395
+ .appendTo(trueForm)
396
+ ;
397
+ if(formIn){
398
+ e.preventDefault();
399
+ }
400
+ addSubmitBubbles(trueForm);
401
+ clone.trigger('click');
402
+ setTimeout(function(){
403
+ clone.remove();
404
+ clone = null;
405
+ }, 9);
406
+ }
407
+ }
408
+ });
409
+ });
410
+
411
+ if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
412
+ var rCRLF = /\r?\n/g,
413
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
414
+ rselectTextarea = /^(?:select|textarea)/i;
415
+ $.fn.serializeArray = function() {
416
+ return this.map(function(){
417
+ var elements = $.prop(this, 'elements');
418
+ return elements ? $.makeArray( elements ) : this;
419
+ })
420
+ .filter(function(){
421
+ return this.name && !$(this).is(':disabled') &&
422
+ ( this.checked || rselectTextarea.test( this.nodeName ) ||
423
+ rinput.test( this.type ) );
424
+ })
425
+ .map(function( i, elem ){
426
+ var val = $( this ).val();
427
+
428
+ return val == null ?
429
+ null :
430
+ $.isArray( val ) ?
431
+ $.map( val, function( val, i ){
432
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
433
+ }) :
434
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
435
+ }).get();
436
+ };
437
+ }
201
438
  }
202
- else {
203
- return undefined;
439
+
440
+ if(!Modernizr.fieldsetelements){
441
+ webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
442
+ prop: {
443
+ get: function(){
444
+ //add listed elements without keygen, object, output
445
+ return this.querySelectorAll('input, select, textarea, button, fieldset') || [];
446
+ },
447
+ writeable: false
448
+ }
449
+ });
204
450
  }
205
- },
206
-
207
- showExpressInstall: wasRemoved,
208
-
209
- removeSWF: wasRemoved,
210
-
211
- createCSS: wasRemoved,
212
-
213
- addDomLoadEvent: addDomLoadEvent,
214
-
215
- addLoadEvent: wasRemoved,
216
-
217
-
218
- // For internal usage only
219
- expressInstallCallback: wasRemoved
220
- };
221
- }();
222
451
 
223
- webshims.isReady('swfmini', true);
224
- ;webshims.register('filereader', function( $, webshims ){
225
- "use strict";
226
- /**
227
- * Code is based on https://github.com/Jahdrien/FileReader
228
- *
229
- */
452
+ })();
453
+ }
454
+
455
+ if($('<input />').prop('labels') == null){
456
+ webshims.defineNodeNamesProperty('button, input, keygen, meter, output, progress, select, textarea', 'labels', {
457
+ prop: {
458
+ get: function(){
459
+ if(this.type == 'hidden'){return null;}
460
+ var id = this.id;
461
+ var labels = $(this)
462
+ .closest('label')
463
+ .filter(function(){
464
+ var hFor = (this.attributes['for'] || {});
465
+ return (!hFor.specified || hFor.value == id);
466
+ })
467
+ ;
468
+
469
+ if(id) {
470
+ labels = labels.add(document.querySelectorAll('label[for="'+ id +'"]'));
471
+ }
472
+ return labels.get();
473
+ },
474
+ writeable: false
475
+ }
476
+ });
477
+ }
478
+
479
+ if(!('value' in document.createElement('progress'))){
480
+ (function(){
481
+
482
+ var nan = parseInt('NaN', 10);
483
+
484
+ var updateProgress = function(progress){
485
+ var position = $.prop(progress, 'position');
486
+
487
+ $.attr(progress, 'data-position', position);
488
+ $('> span', progress).css({width: (position < 0 ? 100 : position * 100) +'%'});
489
+ };
490
+ var desc = {
491
+ position: {
492
+ prop: {
493
+ get: function(){
494
+ var max;
495
+ //jQuery 1.8.x try's to normalize "0" to 0
496
+ var val = this.getAttribute('value');
497
+ var ret = -1;
498
+
499
+ val = val ? (val * 1) : nan;
500
+ if(!isNaN(val)){
501
+ max = $.prop(this, 'max');
502
+ ret = Math.max(Math.min(val / max, 1), 0);
503
+ if(updateProgress.isInChange){
504
+ $.attr(this, 'aria-valuenow', ret * 100);
505
+ if(updateProgress.isInChange == 'max'){
506
+ $.attr(this, 'aria-valuemax', max);
507
+ }
508
+ }
509
+ $(this).removeClass('ws-indeterminate');
510
+ } else if(updateProgress.isInChange) {
511
+ $(this).removeAttr('aria-valuenow').addClass('ws-indeterminate');
512
+ }
513
+ return ret;
514
+ },
515
+ writeable: false
516
+ }
517
+ }
518
+ };
519
+
520
+ $.each({value: 0, max: 1}, function(name, defValue){
521
+ var removeProp = (name == 'value' && !$.fn.finish);
522
+ desc[name] = {
523
+ attr: {
524
+ set: function(value){
525
+ var ret = desc[name].attr._supset.call(this, value);
526
+ updateProgress.isInChange = name;
527
+ updateProgress(this);
528
+ updateProgress.isInChange = false;
529
+ return ret;
530
+ }
531
+ },
532
+ removeAttr: {
533
+ value: function(){
534
+ this.removeAttribute(name);
535
+ if(removeProp){
536
+ try {
537
+ delete this.value;
538
+ } catch(er){}
539
+ }
540
+ updateProgress.isInChange = name;
541
+ updateProgress(this);
542
+ updateProgress.isInChange = false;
543
+ }
544
+ },
545
+ prop: {
546
+ get: function(){
547
+ var max;
548
+ var ret = (desc[name].attr.get.call(this) * 1);
549
+ if(ret < 0 || isNaN(ret)){
550
+ ret = defValue;
551
+ } else if(name == 'value'){
552
+ ret = Math.min(ret, $.prop(this, 'max'));
553
+ } else if(ret === 0){
554
+ ret = defValue;
555
+ }
556
+ return ret;
557
+ },
558
+ set: function(value){
559
+ value = value * 1;
560
+ if(isNaN(value)){
561
+ webshims.error('Floating-point value is not finite.');
562
+ }
563
+ return desc[name].attr.set.call(this, value);
564
+ }
565
+ }
566
+ };
567
+ });
568
+
569
+ webshims.createElement(
570
+ 'progress',
571
+ function(){
572
+ var labels = $(this)
573
+ .attr({role: 'progressbar', 'aria-valuemin': '0'})
574
+ .html('<span class="progress-value" />')
575
+ .jProp('labels')
576
+ .map(function(){
577
+ return webshims.getID(this);
578
+ })
579
+ .get()
580
+ ;
581
+ if(labels.length){
582
+ $.attr(this, 'aria-labelledby', labels.join(' '));
583
+ } else {
584
+ webshims.info("you should use label elements for your prgogress elements");
585
+ }
586
+ if($(this).css('direction') == 'rtl'){
587
+ $(this).addClass('ws-is-rtl');
588
+ }
589
+ updateProgress.isInChange = 'max';
590
+ updateProgress(this);
591
+ updateProgress.isInChange = false;
592
+ },
593
+ desc
594
+ );
595
+
596
+ })();
597
+ }
598
+
599
+ if(!('setSelectionRange' in document.createElement('input'))){
600
+ (function(){
601
+ var getSelection = function(elem, getStart){
602
+ var range, value, normalizedValue, textInputRange, len, endRange;
603
+ var start = 0;
604
+ var end = 0;
605
+ if (document.selection && (range = document.selection.createRange()) && range.parentElement() == elem) {
606
+ value = $.prop(elem, 'value');
607
+ len = value.length;
608
+ normalizedValue = value.replace(/\r\n/g, "\n");
609
+
610
+ textInputRange = elem.createTextRange();
611
+ textInputRange.moveToBookmark(range.getBookmark());
612
+
613
+
614
+ endRange = elem.createTextRange();
615
+ endRange.collapse(false);
616
+
617
+ if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
618
+ start = end = len;
619
+ } else {
620
+ if(getStart){
621
+ start = -textInputRange.moveStart("character", -len);
622
+ start += normalizedValue.slice(0, start).split("\n").length - 1;
623
+ } else {
624
+ if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
625
+ end = len;
626
+ } else {
627
+ end = -textInputRange.moveEnd("character", -len);
628
+ end += normalizedValue.slice(0, end).split("\n").length - 1;
629
+ }
630
+ }
631
+
632
+ }
633
+ }
634
+ return {
635
+ start: start,
636
+ end: end
637
+ };
638
+ };
639
+
640
+ ['input', 'textarea'].forEach(function(name){
641
+ var isTextarea = name == 'textarea';
642
+ //email?
643
+ var allowedTypes = {text: 1, search: 1, url: 1, tel: 1, password: 1, email: 1};
644
+ var error = 'InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable. selection not allowed on this type';
645
+ webshims.defineNodeNameProperties(name, {
646
+ selectionStart: {
647
+ get: function(){
648
+ if(isTextarea || allowedTypes[$.prop(this, 'type')]){
649
+ return getSelection(this, true).start;
650
+ }
651
+ webshims.error(error);
652
+ },
653
+ set: function(v){
654
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
655
+ var range = this.createTextRange();
656
+ range.collapse(true);
657
+ range.moveStart('character', v);
658
+ range.moveEnd('character', $.prop(this, 'selectionEnd'));
659
+ if($(this).is(':focus')){
660
+ range.select();
661
+ }
662
+ } else {
663
+ webshims.error(error);
664
+ }
665
+ }
666
+ },
667
+ selectionEnd: {
668
+ get: function(){
669
+ if(isTextarea || allowedTypes[$.prop(this, 'type')]){
670
+ return getSelection(this).end;
671
+ }
672
+ webshims.error(error);
673
+ },
674
+ set: function(v){
675
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
676
+ var range = this.createTextRange();
677
+ var start;
678
+ range.collapse(true);
679
+ start = getSelection(this, true).start;
680
+ range.moveStart('character', start);
681
+ range.moveEnd('character', v - start);
682
+ if($(this).is(':focus')){
683
+ range.select();
684
+ }
685
+ } else {
686
+ webshims.error(error);
687
+ }
688
+ }
689
+ },
690
+ setSelectionRange: {
691
+ value: function(start, end, dir){
692
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
693
+ var range = this.createTextRange();
694
+ range.collapse(true);
695
+ range.moveStart('character', start);
696
+ range.moveEnd('character', end - start);
697
+ if($(this).is(':focus')){
698
+ range.select();
699
+ }
700
+ } else {
701
+ webshims.error(error);
702
+ }
703
+ }
704
+ }
705
+ }, 'prop');
706
+ });
707
+
708
+ })();
709
+ }
710
+
230
711
  (function(){
231
- var swfobject = window.swfmini || window.swfobject;
232
-
233
- var readyCallbacks = $.Callbacks('once unique memory'),
234
- inputsCount = 0,
235
- currentTarget = null;
236
-
237
- // if native FileReader support, then dont add the polyfill and make the plugin do nothing
238
- if (window.FileReader) {
239
- $.fn.fileReader = function () { return this; }
240
- return ;
712
+ if(options.noPlaceholderPolyfill){return;}
713
+ var bustedPlaceholder;
714
+ Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
715
+ if(Modernizr.input.placeholder && options.overridePlaceholder){
716
+ bustedPlaceholder = true;
241
717
  }
242
-
243
- /**
244
- * JQuery Plugin
245
- */
246
- $.fn.fileReader = function( options ) {
247
- if(this.length){
248
- options = $.extend($.fn.fileReader.defaults, options);
249
-
250
- var self = this;
251
- readyCallbacks.add(function() {
252
- return main(self, options);
253
- });
254
- if ($.isFunction(options.callback)) readyCallbacks.add(options.callback);
255
-
256
- if (!FileAPIProxy.ready) {
257
- FileAPIProxy.init(options);
718
+ if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedPlaceholder){
719
+ (function(){
720
+ var ua = navigator.userAgent;
721
+
722
+ if(ua.indexOf('Mobile') != -1 && ua.indexOf('Safari') != -1){
723
+ $(window).on('orientationchange', (function(){
724
+ var timer;
725
+ var retVal = function(i, value){
726
+ return value;
727
+ };
728
+
729
+ var set = function(){
730
+ $('input[placeholder], textarea[placeholder]').attr('placeholder', retVal);
731
+ };
732
+ return function(e){
733
+ clearTimeout(timer);
734
+ timer = setTimeout(set, 9);
735
+ };
736
+ })());
258
737
  }
259
- }
260
- return this;
261
- };
262
-
263
- /**
264
- * Default options
265
- * allows user set default options
266
- */
267
- $.fn.fileReader.defaults = {
268
- id : 'fileReaderSWFObject', // ID for the created swf object container,
269
- multiple : null,
270
- accept : null,
271
- label : null,
272
- extensions : null,
273
- filereader : 'files/filereader.swf', // The path to the filereader swf file
274
- expressInstall : null, // The path to the express install swf file
275
- debugMode : false,
276
- callback : false // Callback function when Filereader is ready
277
- };
278
-
279
- /**
280
- * Plugin callback
281
- * adds an input to registry
282
- */
283
- var main = function(el, options) {
284
- return el.each(function(i, input) {
285
- input = $(input);
286
- var id = input.attr('id');
287
- var multiple, accept, label;
288
- if (!id) {
289
- id = 'flashFileInput' + inputsCount;
290
- input.attr('id', id);
291
- inputsCount++;
292
- }
293
- multiple = input.prop('multiple');
294
- accept = input.data('swfaccept') || input.prop('accept') || options.accept;
295
- label = input.jProp('labels')
296
- .map(function(){
297
- return $(this).text();
298
- }).get().join(' ') ||
299
- input.data('swflabel') ||
300
- options.label;
301
-
302
- FileAPIProxy.inputs[id] = input;
303
- FileAPIProxy.swfObject.add(id, multiple, accept, label, options.extensions);
304
-
305
- input.css('z-index', 0)
306
- .mouseover(function (e) {
307
- if (id !== currentTarget) {
308
- e = e || window.event;
309
- currentTarget = id;
310
- FileAPIProxy.swfObject.mouseover(id);
311
- FileAPIProxy.container
312
- .height(input.outerHeight())
313
- .width(input.outerWidth())
314
- .css(input.offset());
315
- }
316
- })
317
- .click(function(e) {
318
- e.preventDefault();
319
- e.stopPropagation();
320
- e.stopImmediatePropagation();
321
- return false;
322
- });
323
- });
738
+ })();
739
+
740
+ //abort
741
+ return;
742
+ }
743
+
744
+ var isOver = (webshims.cfg.forms.placeholderType == 'over');
745
+ var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
746
+ var polyfillElements = ['textarea'];
747
+ if(!Modernizr.input.placeholder || bustedPlaceholder){
748
+ polyfillElements.push('input');
749
+ }
750
+
751
+ var setSelection = function(elem){
752
+ try {
753
+ $(elem).setSelectionRange(0,0);
754
+ return true;
755
+ } catch(er){}
324
756
  };
325
-
326
- /**
327
- * Flash FileReader Proxy
328
- */
329
- window.FileAPIProxy = {
330
- ready: false,
331
- _inititalized: false,
332
- init: function(o) {
333
- var self = this;
334
- this.debugMode = o.debugMode;
335
-
336
- if(!this.container){
337
- this.container = $('<div>').attr('id', o.id)
338
- .wrap('<div>')
339
- .parent()
340
- .css({
341
- position:'fixed',
342
- // top:'0px',
343
- width:'1px',
344
- height:'1px',
345
- display:'inline-block',
346
- background:'transparent',
347
- 'z-index':99999
348
- })
349
- // Hands over mouse events to original input for css styles
350
- .on('mouseover mouseout mousedown mouseup', function(evt) {
351
- if(currentTarget){
352
- $('#' + currentTarget).trigger(evt.type);
757
+
758
+ var hidePlaceholder = function(elem, data, value, _onFocus){
759
+ if(value === false){
760
+ value = $.prop(elem, 'value');
761
+ }
762
+
763
+ if(!isOver && elem.type != 'password'){
764
+ if(!value && _onFocus && setSelection(elem)){
765
+ var selectTimer = setTimeout(function(){
766
+ setSelection(elem);
767
+ }, 9);
768
+ $(elem)
769
+ .off('.placeholderremove')
770
+ .on({
771
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
772
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
773
+ elem.value = $.prop(elem, 'value');
774
+ data.box.removeClass('placeholder-visible');
775
+ clearTimeout(selectTimer);
776
+ $(elem).off('.placeholderremove');
777
+ },
778
+ 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
779
+ setSelection(elem);
780
+ clearTimeout(selectTimer);
781
+ selectTimer = setTimeout(function(){
782
+ setSelection(elem);
783
+ }, 9);
784
+ },
785
+ 'blur.placeholderremove': function(){
786
+ clearTimeout(selectTimer);
787
+ $(elem).off('.placeholderremove');
788
+ }
789
+ })
790
+ ;
791
+ return;
792
+ } else if(!_onFocus && !value && elem.value){ //especially on submit
793
+ elem.value = value;
794
+ }
795
+ } else if(!value && _onFocus){
796
+ $(elem)
797
+ .off('.placeholderremove')
798
+ .on({
799
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
800
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
801
+ data.box.removeClass('placeholder-visible');
802
+ $(elem).off('.placeholderremove');
803
+ },
804
+ 'blur.placeholderremove': function(){
805
+ $(elem).off('.placeholderremove');
353
806
  }
354
807
  })
355
- .appendTo('body');
356
-
357
- swfobject.embedSWF(o.filereader, o.id, '100%', '100%', '10', o.expressInstall, {debugMode: o.debugMode ? true : ''}, {'wmode':'transparent','allowScriptAccess':'sameDomain'}, {}, function(e) {
358
- self.swfObject = e.ref;
359
- $(self.swfObject)
360
- .css({
361
- display: 'block',
362
- outline: 0
363
- })
364
- .attr('tabindex', 0);
365
-
366
- self.ready = e.success && typeof e.ref.add === "function";
367
-
368
- if (self.ready) {
369
- readyCallbacks.fire();
370
- }
371
- });
808
+ ;
809
+ return;
372
810
  }
811
+ data.box.removeClass('placeholder-visible');
373
812
  },
374
- swfObject: null,
375
- container: null,
376
- // Inputs Registry
377
- inputs: {},
378
- // Readers Registry
379
- readers: {},
380
- // Receives FileInput events
381
- onFileInputEvent: function(evt) {
382
- if (this.debugMode) console.info('FileInput Event ', evt.type, evt);
383
- if (evt.target in this.inputs) {
384
- var el = this.inputs[evt.target];
385
- evt.target = el[0];
386
- if( evt.type === 'change') {
387
- webshims.data(evt.target, 'fileList', new FileList(evt.files));
388
- }
389
- el.trigger(evt);
390
- }
391
- window.focus();
813
+ showPlaceholder = function(elem, data, placeholderTxt){
814
+ if(placeholderTxt === false){
815
+ placeholderTxt = $.prop(elem, 'placeholder');
816
+ }
817
+
818
+ if(!isOver && elem.type != 'password'){
819
+ elem.value = placeholderTxt;
820
+ }
821
+ data.box.addClass('placeholder-visible');
392
822
  },
393
- // Receives FileReader ProgressEvents
394
- onFileReaderEvent: function(evt) {
395
- if (this.debugMode) console.info('FileReader Event ', evt.type, evt, evt.target in this.readers);
396
- if (evt.target in this.readers) {
397
- var reader = this.readers[evt.target];
398
- evt.target = reader;
399
- reader._handleFlashEvent.call(reader, evt);
823
+ changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
824
+ if(!data){
825
+ data = $.data(elem, 'placeHolder');
826
+ if(!data){return;}
827
+ }
828
+ var isVisible = $(elem).hasClass('placeholder-visible');
829
+ if(placeholderTxt === false){
830
+ placeholderTxt = $.attr(elem, 'placeholder') || '';
831
+ }
832
+
833
+ $(elem).off('.placeholderremove');
834
+
835
+ if(value === false){
836
+ value = $.prop(elem, 'value');
837
+ }
838
+
839
+ if(!value && (type == 'focus' || (!type && $(elem).is(':focus')))){
840
+ if(elem.type == 'password' || isOver || isVisible){
841
+ hidePlaceholder(elem, data, '', true);
842
+ }
843
+ return;
844
+ }
845
+
846
+ if(value){
847
+ hidePlaceholder(elem, data, value);
848
+ return;
849
+ }
850
+
851
+ if(placeholderTxt && !value){
852
+ showPlaceholder(elem, data, placeholderTxt);
853
+ } else {
854
+ hidePlaceholder(elem, data, value);
400
855
  }
401
856
  },
402
- // Receives flash FileReader Error Events
403
- onFileReaderError: function(error) {
404
- if (this.debugMode) console.log(error);
857
+ createPlaceholder = function(){
858
+ return $('<span class="placeholder-text"></span>');
405
859
  },
406
- onSWFReady: function() {
407
- this.container.css({position: 'absolute'});
408
- this.ready = typeof this.swfObject.add === "function";
409
- if (this.ready) {
410
- readyCallbacks.fire();
860
+ pHolder = (function(){
861
+ var allowedPlaceholder = {
862
+ text: 1,
863
+ search: 1,
864
+ url: 1,
865
+ email: 1,
866
+ password: 1,
867
+ tel: 1,
868
+ number: 1
869
+ }
870
+ ;
871
+ if(webshims.modules["form-number-date-ui"].loaded){
872
+ delete allowedPlaceholder.number;
411
873
  }
412
-
413
- return true;
414
- }
874
+
875
+ return {
876
+ create: function(elem){
877
+ var data = $.data(elem, 'placeHolder');
878
+ var form;
879
+ if(data){return data;}
880
+ data = $.data(elem, 'placeHolder', {});
881
+
882
+ $(elem).on('focus.placeholder blur.placeholder', function(e){
883
+ changePlaceholderVisibility(this, false, false, data, e.type );
884
+ data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
885
+ });
886
+
887
+ if((form = $.prop(elem, 'form'))){
888
+ $(elem).onWSOff('reset.placeholder', function(e){
889
+ setTimeout(function(){
890
+ changePlaceholderVisibility(elem, false, false, data, e.type );
891
+ }, 0);
892
+ }, false, form);
893
+ }
894
+
895
+ if(elem.type == 'password' || isOver){
896
+ data.text = createPlaceholder(elem);
897
+ if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
898
+ data.box = data.text;
899
+ } else {
900
+ data.box = $('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
901
+ .insertAfter(elem)
902
+ ;
903
+ data.box.append(elem);
904
+ }
905
+ data.text
906
+ .insertAfter(elem)
907
+ .on('mousedown.placeholder', function(){
908
+ changePlaceholderVisibility(this, false, false, data, 'focus');
909
+ try {
910
+ setTimeout(function(){
911
+ elem.focus();
912
+ }, 0);
913
+ } catch(e){}
914
+ return false;
915
+ })
916
+ ;
917
+
918
+
919
+ $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
920
+ var prop = $.css(elem, style);
921
+ if(data.text.css(style) != prop){
922
+ data.text.css(style, prop);
923
+ }
924
+ });
925
+ $.each(['Left', 'Top'], function(i, side){
926
+ var size = (parseInt($.css(elem, 'padding'+ side), 10) || 0) + Math.max((parseInt($.css(elem, 'margin'+ side), 10) || 0), 0) + (parseInt($.css(elem, 'border'+ side +'Width'), 10) || 0);
927
+ data.text.css('padding'+ side, size);
928
+ });
929
+
930
+ $(elem)
931
+ .onWSOff('updateshadowdom', (function(){
932
+ var lastWidth, init, timer;
933
+ var jelm = $(elem);
934
+ var lastPos = {};
935
+ return function(){
936
+ var width, fn;
937
+
938
+ if((width = elem.offsetWidth)){
939
+
940
+ fn = function(){
941
+ var pos = jelm.position();
942
+ if(width !== lastWidth){
943
+ lastWidth = width;
944
+ data.text[0].style.width = width +'px';
945
+ }
946
+ if(pos.top !== lastPos.top || pos.left !== lastPos.left){
947
+ lastPos = pos;
948
+ data.text[0].style.top = pos.top +'px';
949
+ data.text[0].style.left = pos.left +'px';
950
+ }
951
+ };
952
+ if(!init){
953
+ fn();
954
+ init = true;
955
+ } else {
956
+ clearTimeout(timer);
957
+ timer = setTimeout(fn, 99);
958
+ }
959
+ }
960
+ };
961
+ })(), true)
962
+ ;
963
+
964
+ } else {
965
+ var reset = function(e){
966
+ if($(elem).hasClass('placeholder-visible')){
967
+ hidePlaceholder(elem, data, '');
968
+
969
+ setTimeout(function(){
970
+ if(!e || e.type != 'submit' || e.isDefaultPrevented()){
971
+ changePlaceholderVisibility(elem, false, false, data );
972
+ }
973
+ }, 9);
974
+ }
975
+ };
976
+
977
+ $(elem).onWSOff('beforeunload', reset, false, window);
978
+ data.box = $(elem);
979
+ if(form){
980
+ $(elem).onWSOff('submit', reset, false, form);
981
+ }
982
+ }
983
+
984
+ return data;
985
+ },
986
+ update: function(elem, val){
987
+ var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
988
+ if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
989
+ webshims.warn('placeholder not allowed on input[type="'+type+'"], but it is a good fallback :-)');
990
+ return;
991
+ }
992
+
993
+
994
+ var data = pHolder.create(elem);
995
+ if(data.text){
996
+ data.text.text(val);
997
+ }
998
+
999
+ changePlaceholderVisibility(elem, false, val, data);
1000
+ }
1001
+ };
1002
+ })()
1003
+ ;
1004
+
1005
+ $.webshims.publicMethods = {
1006
+ pHolder: pHolder
415
1007
  };
416
-
417
-
418
- /**
419
- * Add FileReader to the window object
420
- */
421
- window.FileReader = function () {
422
- // states
423
- this.EMPTY = 0;
424
- this.LOADING = 1;
425
- this.DONE = 2;
426
-
427
- this.readyState = 0;
428
-
429
- // File or Blob data
430
- this.result = null;
431
-
432
- this.error = null;
433
-
434
- // event handler attributes
435
- this.onloadstart = null;
436
- this.onprogress = null;
437
- this.onload = null;
438
- this.onabort = null;
439
- this.onerror = null;
440
- this.onloadend = null;
441
-
442
- // Event Listeners handling using JQuery Callbacks
443
- this._callbacks = {
444
- loadstart : $.Callbacks( "unique" ),
445
- progress : $.Callbacks( "unique" ),
446
- abort : $.Callbacks( "unique" ),
447
- error : $.Callbacks( "unique" ),
448
- load : $.Callbacks( "unique" ),
449
- loadend : $.Callbacks( "unique" )
1008
+ polyfillElements.forEach(function(nodeName){
1009
+ webshims.defineNodeNameProperty(nodeName, 'placeholder', {
1010
+ attr: {
1011
+ set: function(val){
1012
+ var elem = this;
1013
+ if(bustedPlaceholder){
1014
+ webshims.data(elem, 'bustedPlaceholder', val);
1015
+ elem.placeholder = '';
1016
+ } else {
1017
+ webshims.contentAttr(elem, 'placeholder', val);
1018
+ }
1019
+ pHolder.update(elem, val);
1020
+ },
1021
+ get: function(){
1022
+ var placeholder;
1023
+ if(bustedPlaceholder){
1024
+ placeholder = webshims.data(this, 'bustedPlaceholder');
1025
+ }
1026
+ return placeholder || webshims.contentAttr(this, 'placeholder');
1027
+ }
1028
+ },
1029
+ reflect: true,
1030
+ initAttr: true
1031
+ });
1032
+ });
1033
+
1034
+
1035
+ polyfillElements.forEach(function(name){
1036
+ var placeholderValueDesc = {};
1037
+ var desc;
1038
+ ['attr', 'prop'].forEach(function(propType){
1039
+ placeholderValueDesc[propType] = {
1040
+ set: function(val){
1041
+ var elem = this;
1042
+ var placeholder;
1043
+ if(bustedPlaceholder){
1044
+ placeholder = webshims.data(elem, 'bustedPlaceholder');
1045
+ }
1046
+ if(!placeholder){
1047
+ placeholder = webshims.contentAttr(elem, 'placeholder');
1048
+ }
1049
+ $.removeData(elem, 'cachedValidity');
1050
+ var ret = desc[propType]._supset.call(elem, val);
1051
+ if(placeholder && 'value' in elem){
1052
+ changePlaceholderVisibility(elem, val, placeholder);
1053
+ }
1054
+ return ret;
1055
+ },
1056
+ get: function(){
1057
+ var placeholder;
1058
+ var elem = this;
1059
+ var curValue;
1060
+
1061
+ if($(elem).hasClass('placeholder-visible')){
1062
+ if(webshims.cfg.debug && (curValue = desc[propType]._supget.call(elem)) && (placeholder = $.attr(elem, 'placeholder')) && placeholder != curValue){
1063
+ webshims.error('value input[placeholder] was changed by input.value instead using $.val or $.prop.');
1064
+ changePlaceholderVisibility(elem, curValue, placeholder);
1065
+ } else {
1066
+ curValue = '';
1067
+ }
1068
+ } else {
1069
+ curValue = desc[propType]._supget.call(elem);
1070
+ }
1071
+ return curValue;
1072
+ }
1073
+ };
1074
+ });
1075
+ desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
1076
+ });
1077
+
1078
+ })();
1079
+
1080
+ (function(){
1081
+ var doc = document;
1082
+ if( 'value' in document.createElement('output') ){return;}
1083
+
1084
+ webshims.defineNodeNameProperty('output', 'value', {
1085
+ prop: {
1086
+ set: function(value){
1087
+ var setVal = $.data(this, 'outputShim');
1088
+ if(!setVal){
1089
+ setVal = outputCreate(this);
1090
+ }
1091
+ setVal(value);
1092
+ },
1093
+ get: function(){
1094
+ return webshims.contentAttr(this, 'value') || $(this).text() || '';
1095
+ }
1096
+ }
1097
+ });
1098
+
1099
+
1100
+ webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
1101
+ if(type == 'removeAttr'){return;}
1102
+ var setVal = $.data(this, 'outputShim');
1103
+ if(setVal){
1104
+ setVal(value);
1105
+ }
1106
+ });
1107
+
1108
+ var outputCreate = function(elem){
1109
+ if($.data(elem, 'outputShim')){return;}
1110
+ elem = $(elem);
1111
+ var value = (elem.text() || '').trim();
1112
+ var id = elem.prop('id');
1113
+ var htmlFor = elem.attr('for');
1114
+ var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
1115
+ var setValue = function(val){
1116
+ shim[0].value = val;
1117
+ val = shim[0].value;
1118
+ elem.text(val);
1119
+ webshims.contentAttr(elem[0], 'value', val);
450
1120
  };
451
-
452
- // Custom properties
453
- this._id = null;
1121
+
1122
+ elem[0].defaultValue = value;
1123
+ webshims.contentAttr(elem[0], 'value', value);
1124
+
1125
+ elem.attr({'aria-live': 'polite'});
1126
+
1127
+ if(id){
1128
+ shim.attr('id', id);
1129
+ elem.attr('aria-labelledby', elem.jProp('labels').map(function(){
1130
+ return webshims.getID(this);
1131
+ }).get().join(' '));
1132
+ }
1133
+ if(htmlFor){
1134
+ id = webshims.getID(elem);
1135
+ htmlFor.split(' ').forEach(function(control){
1136
+ control = document.getElementById(control);
1137
+ if(control){
1138
+ control.setAttribute('aria-controls', id);
1139
+ }
1140
+ });
1141
+ }
1142
+ elem.data('outputShim', setValue );
1143
+ shim.data('outputShim', setValue );
1144
+ return setValue;
454
1145
  };
455
-
456
- window.FileReader.prototype = {
457
- // async read methods
458
- readAsBinaryString: function (file) {
459
- this._start(file);
460
- FileAPIProxy.swfObject.read(file.input, file.name, 'readAsBinaryString');
461
- },
462
- readAsText: function (file, encoding) {
463
- this._start(file);
464
- FileAPIProxy.swfObject.read(file.input, file.name, 'readAsText');
465
- },
466
- readAsDataURL: function (file) {
467
- this._start(file);
468
- FileAPIProxy.swfObject.read(file.input, file.name, 'readAsDataURL');
469
- },
470
- readAsArrayBuffer: function(file){
471
- throw("Whoops FileReader.readAsArrayBuffer is unimplemented");
472
- },
473
-
474
- abort: function () {
475
- this.result = null;
476
- if (this.readyState === this.EMPTY || this.readyState === this.DONE) return;
477
- FileAPIProxy.swfObject.abort(this._id);
478
- },
479
-
480
- // Event Target interface
481
- addEventListener: function (type, listener) {
482
- if (type in this._callbacks) this._callbacks[type].add(listener);
483
- },
484
- removeEventListener: function (type, listener) {
485
- if (type in this._callbacks) this._callbacks[type].remove(listener);
486
- },
487
- dispatchEvent: function (event) {
488
- event.target = this;
489
- if (event.type in this._callbacks) {
490
- var fn = this['on' + event.type];
491
- if ($.isFunction(fn)) fn(event);
492
- this._callbacks[event.type].fire(event);
1146
+
1147
+ webshims.addReady(function(context, contextElem){
1148
+ $(context.getElementsByTagName('output')).add(contextElem.filter('output')).each(function(){
1149
+ outputCreate(this);
1150
+ });
1151
+ });
1152
+
1153
+ /*
1154
+ * Implements input event in all browsers
1155
+ */
1156
+ (function(){
1157
+ var noInputTriggerEvts = {updateInput: 1, input: 1},
1158
+ noInputTypes = {
1159
+ radio: 1,
1160
+ checkbox: 1,
1161
+ submit: 1,
1162
+ button: 1,
1163
+ image: 1,
1164
+ reset: 1,
1165
+ file: 1
1166
+
1167
+ //pro forma
1168
+ ,color: 1
1169
+ },
1170
+ inputElements = {
1171
+ input: 1,
1172
+ INPUT: 1,
1173
+ textarea: 1,
1174
+ TEXTAREA: 1
1175
+ },
1176
+ timer,
1177
+ lastVal,
1178
+ input,
1179
+ trigger = function(e){
1180
+ if(!input){return;}
1181
+ var newVal = input.prop('value');
1182
+ if(newVal !== lastVal){
1183
+ lastVal = newVal;
1184
+ if(!e || !noInputTriggerEvts[e.type]){
1185
+ webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
1186
+ }
1187
+ }
1188
+ },
1189
+ extraTimer,
1190
+ extraTest = function(){
1191
+ clearTimeout(extraTimer);
1192
+ extraTimer = setTimeout(trigger, 9);
1193
+ },
1194
+ unbind = function(){
1195
+ clearTimeout(extraTimer);
1196
+ clearInterval(timer);
1197
+ if(input){
1198
+ input.off('focusout', unbind).off('keyup keypress keydown paste cut', extraTest).off('input change updateInput triggerinput', trigger);
1199
+ }
1200
+
1201
+
493
1202
  }
494
- return true;
495
- },
496
-
497
- // Custom private methods
498
-
499
- // Registers FileReader instance for flash callbacks
500
- _register: function(file) {
501
- this._id = file.input + '.' + file.name;
502
- FileAPIProxy.readers[this._id] = this;
503
- },
504
- _start: function(file) {
505
- this._register(file);
506
- if (this.readyState === this.LOADING) throw {type: 'InvalidStateError', code: 11, message: 'The object is in an invalid state.'};
507
- },
508
- _handleFlashEvent: function(evt) {
509
- switch (evt.type) {
510
- case 'loadstart':
511
- this.readyState = this.LOADING;
512
- break;
513
- case 'loadend':
514
- this.readyState = this.DONE;
515
- break;
516
- case 'load':
517
- this.readyState = this.DONE;
518
- this.result = FileAPIProxy.swfObject.result(this._id);
519
- break;
520
- case 'error':
521
- this.result = null;
522
- this.error = {
523
- name: 'NotReadableError',
524
- message: 'The File cannot be read!'
525
- };
1203
+ ;
1204
+ var observe = function(newInput){
1205
+ unbind();
1206
+
1207
+ input = newInput;
1208
+ lastVal = input.prop('value');
1209
+ clearInterval(timer);
1210
+ timer = setInterval(trigger, 200);
1211
+ extraTest();
1212
+ input.on({
1213
+ 'keyup keypress keydown paste cut': extraTest,
1214
+ 'focusout wswidgetfocusout': unbind,
1215
+ 'input updateInput change triggerinput': trigger
1216
+ });
1217
+ };
1218
+
1219
+ $(doc)
1220
+ .on('focusin wswidgetfocusin', function(e){
1221
+ if( e.target && !e.target.readOnly && !e.target.disabled && inputElements[e.target.nodeName] && !noInputTypes[e.target.type] && !(webshims.data(e.target, 'implemented') || {}).inputwidgets){
1222
+ observe($(e.target));
1223
+ }
1224
+ })
1225
+ ;
1226
+ })();
1227
+ })();
1228
+
1229
+
1230
+ });
1231
+ ;webshim.register('filereader', function($, webshim, window, document, undefined, featureOptions){
1232
+ "use strict";
1233
+ var mOxie, moxie, hasXDomain;
1234
+ var FormData = $.noop;
1235
+ var sel = 'input[type="file"].ws-filereader';
1236
+ var loadMoxie = function (){
1237
+ webshim.loader.loadList(['moxie']);
1238
+ };
1239
+ var _createFilePicker = function(){
1240
+ var $input, picker, $parent, onReset;
1241
+ var input = this;
1242
+
1243
+ if(webshim.implement(input, 'filepicker')){
1244
+
1245
+ input = this;
1246
+ $input = $(this);
1247
+ $parent = $input.parent();
1248
+ onReset = function(){
1249
+ if(!input.value){
1250
+ $input.prop('value', '');
526
1251
  }
527
- this.dispatchEvent(new FileReaderEvent(evt));
1252
+ };
1253
+
1254
+ $input.attr('tabindex', '-1').on('mousedown.filereaderwaiting click.filereaderwaiting', false);
1255
+ $parent.addClass('ws-loading');
1256
+ picker = new mOxie.FileInput({
1257
+ browse_button: this,
1258
+ accept: $.prop(this, 'accept'),
1259
+ multiple: $.prop(this, 'multiple')
1260
+ });
1261
+
1262
+ $input.jProp('form').on('reset', function(){
1263
+ setTimeout(onReset);
1264
+ });
1265
+ picker.onready = function(){
1266
+ $input.off('.fileraderwaiting');
1267
+ $parent.removeClass('ws-waiting');
1268
+ };
1269
+
1270
+ picker.onchange = function(e){
1271
+ webshim.data(input, 'fileList', e.target.files);
1272
+ $input.trigger('change');
1273
+ };
1274
+ picker.onmouseenter = function(){
1275
+ $input.trigger('mouseover');
1276
+ $parent.addClass('ws-mouseenter');
1277
+ };
1278
+ picker.onmouseleave = function(){
1279
+ $input.trigger('mouseout');
1280
+ $parent.removeClass('ws-mouseenter');
1281
+ };
1282
+ picker.onmousedown = function(){
1283
+ $input.trigger('mousedown');
1284
+ $parent.addClass('ws-active');
1285
+ };
1286
+ picker.onmouseup = function(){
1287
+ $input.trigger('mouseup');
1288
+ $parent.removeClass('ws-active');
1289
+ };
1290
+
1291
+ webshim.data(input, 'filePicker', picker);
1292
+
1293
+ webshim.ready('WINDOWLOAD', function(){
1294
+ var lastWidth;
1295
+ $input.onWSOff('updateshadowdom', function(){
1296
+ var curWitdth = input.offsetWidth;
1297
+ if(curWitdth && lastWidth != curWitdth){
1298
+ lastWidth = curWitdth;
1299
+ picker.refresh();
1300
+ }
1301
+ });
1302
+ });
1303
+
1304
+ webshim.addShadowDom();
1305
+
1306
+ picker.init();
1307
+ if(input.disabled){
1308
+ picker.disable(true);
528
1309
  }
529
- };
530
-
531
- /**
532
- * FileReader ProgressEvent implenting Event interface
533
- */
534
- window.FileReaderEvent = function (e) {
535
- this.initEvent(e);
536
- };
537
-
538
- window.FileReaderEvent.prototype = {
539
- initEvent: function (event) {
540
- $.extend(this, {
541
- type: null,
542
- target: null,
543
- currentTarget: null,
544
-
545
- eventPhase: 2,
546
-
547
- bubbles: false,
548
- cancelable: false,
549
-
550
- defaultPrevented: false,
551
-
552
- isTrusted: false,
553
- timeStamp: new Date().getTime()
554
- }, event);
555
- },
556
- stopPropagation: function (){
557
- },
558
- stopImmediatePropagation: function (){
559
- },
560
- preventDefault: function (){
1310
+ }
1311
+ };
1312
+ var getFileNames = function(file){
1313
+ return file.name;
1314
+ };
1315
+ var createFilePicker = function(){
1316
+ var elem = this;
1317
+ loadMoxie();
1318
+ $(elem)
1319
+ .on('mousedown.filereaderwaiting click.filereaderwaiting', false)
1320
+ .parent()
1321
+ .addClass('ws-loading')
1322
+ ;
1323
+ webshim.ready('moxie', function(){
1324
+ createFilePicker.call(elem);
1325
+ });
1326
+ };
1327
+ var noxhr = /^(?:script|jsonp)$/i;
1328
+ var notReadyYet = function(){
1329
+ loadMoxie();
1330
+ webshim.error('filereader/formdata not ready yet. please wait for moxie to load `webshim.ready("moxie", callbackFn);`` or wait for the first change event on input[type="file"].ws-filereader.')
1331
+ };
1332
+ var inputValueDesc = webshim.defineNodeNameProperty('input', 'value', {
1333
+ prop: {
1334
+ get: function(){
1335
+ var fileList = webshim.data(this, 'fileList');
1336
+
1337
+ if(fileList && fileList.map){
1338
+ return fileList.map(getFileNames).join(', ');
1339
+ }
1340
+
1341
+ return inputValueDesc.prop._supget.call(this);
1342
+ },
1343
+ set: function(val){
1344
+ if(val === '' && this.type == 'file' && $(this).hasClass('ws-filereader')){
1345
+ webshim.data(this, 'fileList', []);
1346
+ }
1347
+ inputValueDesc.prop._supset.call(this);
1348
+ }
561
1349
  }
562
- };
563
-
564
- /**
565
- * FileList interface (Object with item function)
566
- */
567
- window.FileList = function(array) {
568
- if (array) {
569
- for (var i = 0; i < array.length; i++) {
570
- this[i] = array[i];
571
- }
572
- this.length = array.length;
573
- } else {
574
- this.length = 0;
1350
+ }
1351
+ );
1352
+ var shimMoxiePath = webshim.cfg.basePath+'moxie/';
1353
+ var crossXMLMessage = 'You nedd a crossdomain.xml to get all "filereader" / "XHR2" / "CORS" features to work. Or host moxie.swf/moxie.xap on your server an configure filereader options: "swfpath"/"xappath"';
1354
+ var testMoxie = function(options){
1355
+ return (options.wsType == 'moxie' || (options.data && options.data instanceof mOxie.FormData) || (options.crossDomain && $.support.cors !== false && hasXDomain != 'no' && !noxhr.test(options.dataType || '')));
1356
+ };
1357
+ var createMoxieTransport = function (options){
1358
+
1359
+ if(testMoxie(options)){
1360
+ var ajax;
1361
+ webshim.info('moxie transfer used for $.ajax');
1362
+ if(hasXDomain == 'no'){
1363
+ webshim.error(crossXMLMessage);
575
1364
  }
576
- };
577
-
578
- window.FileList.prototype = {
579
- item: function(index) {
580
- return (index in this) ? this[index] : null;
1365
+ return {
1366
+ send: function( headers, completeCallback ) {
1367
+
1368
+ var proressEvent = function(obj, name){
1369
+ if(options[name]){
1370
+ var called = false;
1371
+ ajax.addEventListener('load', function(e){
1372
+ if(!called){
1373
+ options[name]({type: 'progress', lengthComputable: true, total: 1, loaded: 1});
1374
+ } else if(called.lengthComputable && called.total > called.loaded){
1375
+ options[name]({type: 'progress', lengthComputable: true, total: called.total, loaded: called.total});
1376
+ }
1377
+ });
1378
+ obj.addEventListener('progress', function(e){
1379
+ called = e;
1380
+ options[name](e);
1381
+ });
1382
+ }
1383
+ };
1384
+ ajax = new moxie.xhr.XMLHttpRequest();
1385
+
1386
+ ajax.open(options.type, options.url, options.async, options.username, options.password);
1387
+
1388
+ proressEvent(ajax.upload, featureOptions.uploadprogress);
1389
+ proressEvent(ajax.upload, featureOptions.progress);
1390
+
1391
+ ajax.addEventListener('load', function(e){
1392
+ var responses = {
1393
+ text: ajax.responseText,
1394
+ xml: ajax.responseXML
1395
+ };
1396
+ completeCallback(ajax.status, ajax.statusText, responses, ajax.getAllResponseHeaders());
1397
+ });
1398
+
1399
+ if(options.xhrFields && options.xhrFields.withCredentials){
1400
+ ajax.withCredentials = true;
1401
+ }
1402
+
1403
+ if(options.timeout){
1404
+ ajax.timeout = options.timeout;
1405
+ }
1406
+
1407
+ $.each(headers, function(name, value){
1408
+ ajax.setRequestHeader(name, value);
1409
+ });
1410
+
1411
+
1412
+ ajax.send(options.data);
1413
+
1414
+ },
1415
+ abort: function() {
1416
+ if(ajax){
1417
+ ajax.abort();
1418
+ }
1419
+ }
1420
+ };
1421
+ }
1422
+ };
1423
+ var transports = {
1424
+ //based on script: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
1425
+ xdomain: (function(){
1426
+ var httpRegEx = /^https?:\/\//i;
1427
+ var getOrPostRegEx = /^get|post$/i;
1428
+ var sameSchemeRegEx = new RegExp('^'+location.protocol, 'i');
1429
+ return function(options, userOptions, jqXHR) {
1430
+
1431
+ // Only continue if the request is: asynchronous, uses GET or POST method, has HTTP or HTTPS protocol, and has the same scheme as the calling page
1432
+ if (!options.crossDomain || options.username || (options.xhrFields && options.xhrFields.withCredentials) || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url) || (options.data && options.data instanceof mOxie.FormData) || noxhr.test(options.dataType || '')) {
1433
+ return;
1434
+ }
1435
+
1436
+ var xdr = null;
1437
+ webshim.info('xdomain transport used.');
1438
+
1439
+ return {
1440
+ send: function(headers, complete) {
1441
+ var postData = '';
1442
+ var userType = (userOptions.dataType || '').toLowerCase();
1443
+
1444
+ xdr = new XDomainRequest();
1445
+ if (/^\d+$/.test(userOptions.timeout)) {
1446
+ xdr.timeout = userOptions.timeout;
1447
+ }
1448
+
1449
+ xdr.ontimeout = function() {
1450
+ complete(500, 'timeout');
1451
+ };
1452
+
1453
+ xdr.onload = function() {
1454
+ var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType;
1455
+ var status = {
1456
+ code: xdr.status || 200,
1457
+ message: xdr.statusText || 'OK'
1458
+ };
1459
+ var responses = {
1460
+ text: xdr.responseText,
1461
+ xml: xdr.responseXML
1462
+ };
1463
+ try {
1464
+ if (userType === 'html' || /text\/html/i.test(xdr.contentType)) {
1465
+ responses.html = xdr.responseText;
1466
+ } else if (userType === 'json' || (userType !== 'text' && /\/json/i.test(xdr.contentType))) {
1467
+ try {
1468
+ responses.json = $.parseJSON(xdr.responseText);
1469
+ } catch(e) {
1470
+
1471
+ }
1472
+ } else if (userType === 'xml' && !xdr.responseXML) {
1473
+ var doc;
1474
+ try {
1475
+ doc = new ActiveXObject('Microsoft.XMLDOM');
1476
+ doc.async = false;
1477
+ doc.loadXML(xdr.responseText);
1478
+ } catch(e) {
1479
+
1480
+ }
1481
+
1482
+ responses.xml = doc;
1483
+ }
1484
+ } catch(parseMessage) {}
1485
+ complete(status.code, status.message, responses, allResponseHeaders);
1486
+ };
1487
+
1488
+ // set an empty handler for 'onprogress' so requests don't get aborted
1489
+ xdr.onprogress = function(){};
1490
+ xdr.onerror = function() {
1491
+ complete(500, 'error', {
1492
+ text: xdr.responseText
1493
+ });
1494
+ };
1495
+
1496
+ if (userOptions.data) {
1497
+ postData = ($.type(userOptions.data) === 'string') ? userOptions.data : $.param(userOptions.data);
1498
+ }
1499
+ xdr.open(options.type, options.url);
1500
+ xdr.send(postData);
1501
+ },
1502
+ abort: function() {
1503
+ if (xdr) {
1504
+ xdr.abort();
1505
+ }
1506
+ }
1507
+ };
1508
+ };
1509
+ })(),
1510
+ moxie: function (options, originalOptions, jqXHR){
1511
+ if(testMoxie(options)){
1512
+ loadMoxie(options);
1513
+ var ajax;
1514
+
1515
+ var tmpTransport = {
1516
+ send: function( headers, completeCallback ) {
1517
+ ajax = true;
1518
+ webshim.ready('moxie', function(){
1519
+ if(ajax){
1520
+ ajax = createMoxieTransport(options, originalOptions, jqXHR);
1521
+ tmpTransport.send = ajax.send;
1522
+ tmpTransport.abort = ajax.abort;
1523
+ ajax.send(headers, completeCallback);
1524
+ }
1525
+ });
1526
+ },
1527
+ abort: function() {
1528
+ ajax = false;
1529
+ }
1530
+ };
1531
+ return tmpTransport;
581
1532
  }
582
- };
583
- })();
584
-
585
- webshims.defineNodeNameProperty('input', 'files', {
1533
+ }
1534
+ };
1535
+
1536
+ if(!featureOptions.progress){
1537
+ featureOptions.progress = 'onprogress';
1538
+ }
1539
+
1540
+ if(!featureOptions.uploadprogress){
1541
+ featureOptions.uploadprogress = 'onuploadprogress';
1542
+ }
1543
+
1544
+ if(!featureOptions.swfpath){
1545
+ featureOptions.swfpath = shimMoxiePath+'flash/Moxie.cdn.swf';
1546
+ }
1547
+ if(!featureOptions.xappath){
1548
+ featureOptions.xappath = shimMoxiePath+'silverlight/Moxie.cdn.xap';
1549
+ }
1550
+
1551
+ if($.support.cors !== false || !window.XDomainRequest){
1552
+ delete transports.xdomain;
1553
+ }
1554
+
1555
+
1556
+ $.ajaxTransport("+*", function( options, originalOptions, jqXHR ) {
1557
+ var ajax, type;
1558
+
1559
+ if(options.wsType || transports[transports]){
1560
+ ajax = transports[transports](options, originalOptions, jqXHR);
1561
+ }
1562
+ if(!ajax){
1563
+ for(type in transports){
1564
+ ajax = transports[type](options, originalOptions, jqXHR);
1565
+ if(ajax){break;}
1566
+ }
1567
+ }
1568
+ return ajax;
1569
+ });
1570
+
1571
+ webshim.defineNodeNameProperty('input', 'files', {
586
1572
  prop: {
587
1573
  writeable: false,
588
1574
  get: function(){
589
1575
  if(this.type != 'file'){return null;}
590
1576
  if(!$(this).is('.ws-filereader')){
591
- webshims.error("please add the 'ws-filereader' class to your input[type='file'] to implement files-property");
1577
+ webshim.info("please add the 'ws-filereader' class to your input[type='file'] to implement files-property");
592
1578
  }
593
- return webshims.data(this, 'fileList') || webshims.data(this, 'fileList', new FileList());
1579
+ return webshim.data(this, 'fileList') || [];
594
1580
  }
595
1581
  }
596
1582
  }
597
1583
  );
598
-
599
- webshims.defineNodeNamesBooleanProperty('input', 'multiple');
600
-
601
- //webshims
602
- $.fn.fileReader.defaults.filereader = webshims.cfg.basePath +'swf/filereader.swf';
603
- var wait = ['DOM'];
604
- if(webshims.modules["form-core"].loaded){
605
- wait.push('forms');
1584
+
1585
+ webshim.reflectProperties(['input'], ['accept']);
1586
+
1587
+ if($('<input />').prop('multiple') == null){
1588
+ webshim.defineNodeNamesBooleanProperty(['input'], ['multiple']);
606
1589
  }
607
- webshims.ready(wait, function(){
608
- webshims.addReady(function(context, contextElem){
609
- $('input[type="file"].ws-filereader', context).fileReader();
610
- });
1590
+
1591
+ webshim.onNodeNamesPropertyModify('input', 'disabled', function(value, boolVal, type){
1592
+ var picker = webshim.data(this, 'filePicker');
1593
+ if(picker){
1594
+ picker.disable(boolVal);
1595
+ }
611
1596
  });
1597
+
1598
+ window.FileReader = notReadyYet;
1599
+ window.FormData = notReadyYet;
1600
+ webshim.ready('moxie', function(){
1601
+ var wsMimes = 'application/xml,xml';
1602
+ moxie = window.moxie;
1603
+ mOxie = window.mOxie;
1604
+
1605
+ mOxie.Env.swf_url = featureOptions.swfpath;
1606
+ mOxie.Env.xap_url = featureOptions.xappath;
1607
+
1608
+ window.FileReader = mOxie.FileReader;
1609
+
1610
+ window.FormData = function(form){
1611
+ var appendData, i, len, files, fileI, fileLen, inputName;
1612
+ var moxieData = new mOxie.FormData();
1613
+ if(form && $.nodeName(form, 'form')){
1614
+ appendData = $(form).serializeArray();
1615
+ for(i = 0; i < appendData.length; i++){
1616
+ if(Array.isArray(appendData[i].value)){
1617
+ appendData[i].value.forEach(function(val){
1618
+ moxieData.append(appendData[i].name, val);
1619
+ });
1620
+ } else {
1621
+ moxieData.append(appendData[i].name, appendData[i].value);
1622
+ }
1623
+ }
1624
+
1625
+ appendData = form.querySelectorAll('input[type="file"][name]');
1626
+
1627
+ for(i = 0, len = appendData.length; i < appendData.length; i++){
1628
+ inputName = appendData[i].name;
1629
+ if(inputName && !$(appendData[i]).is(':disabled')){
1630
+ files = $.prop(appendData[i], 'files') || [];
1631
+ if(files.length){
1632
+ if(files.length > 1){
1633
+ webshim.error('FormData shim can only handle one file per ajax. Use multiple ajax request. One per file.');
1634
+ }
1635
+ for(fileI = 0, fileLen = files.length; fileI < fileLen; fileI++){
1636
+ moxieData.append(inputName, files[fileI]);
1637
+ }
1638
+ }
1639
+ }
1640
+ }
1641
+ }
1642
+
1643
+ return moxieData;
1644
+ };
1645
+ FormData = window.FormData;
1646
+
1647
+ createFilePicker = _createFilePicker;
1648
+ transports.moxie = createMoxieTransport;
1649
+
1650
+ featureOptions.mimeTypes = (featureOptions.mimeTypes) ? wsMimes+','+featureOptions.mimeTypes : wsMimes;
1651
+ try {
1652
+ mOxie.Mime.addMimeType(featureOptions.mimeTypes);
1653
+ } catch(e){
1654
+ webshim.warn('mimetype to moxie error: '+e);
1655
+ }
1656
+
1657
+ });
1658
+
1659
+ webshim.addReady(function(context, contextElem){
1660
+ $(context.querySelectorAll(sel)).add(contextElem.filter(sel)).each(createFilePicker);
1661
+ });
1662
+ webshim.ready('WINDOWLOAD', loadMoxie);
1663
+
1664
+ if(webshim.cfg.debug !== false && featureOptions.swfpath.indexOf((location.protocol+'//'+location.hostname)) && featureOptions.swfpath.indexOf(('https://'+location.hostname))){
1665
+ webshim.ready('WINDOWLOAD', function(){
1666
+
1667
+ var printMessage = function(){
1668
+ if(hasXDomain == 'no'){
1669
+ webshim.error(crossXMLMessage);
1670
+ }
1671
+ };
1672
+
1673
+ try {
1674
+ hasXDomain = sessionStorage.getItem('wsXdomain.xml');
1675
+ } catch(e){}
1676
+ printMessage();
1677
+ if(hasXDomain == null){
1678
+ $.ajax({
1679
+ url: 'crossdomain.xml',
1680
+ type: 'HEAD',
1681
+ dataType: 'xml',
1682
+ success: function(){
1683
+ hasXDomain = 'yes';
1684
+ },
1685
+ error: function(){
1686
+ hasXDomain = 'no';
1687
+ },
1688
+ complete: function(){
1689
+ try {
1690
+ sessionStorage.setItem('wsXdomain.xml', hasXDomain);
1691
+ } catch(e){}
1692
+ printMessage();
1693
+ }
1694
+ });
1695
+ }
1696
+ });
1697
+ }
612
1698
  });