vendor/assets/javascripts/webshims/shims/form-shim-extend2.js in webshims-rails-1.12.5 vs vendor/assets/javascripts/webshims/shims/form-shim-extend2.js in webshims-rails-1.12.7
- old
+ new
@@ -1,490 +1,473 @@
webshims.register('form-shim-extend2', function($, webshims, window, document, undefined, options){
-"use strict";
-var emptyJ = $([]);
-var isNumber = function(string){
- return (typeof string == 'number' || (string && string == string * 1));
-};
-var getGroupElements = function(elem){
- elem = $(elem);
- var name;
- var form;
- var ret = emptyJ;
- if(elem[0].type == 'radio'){
- form = elem.prop('form');
- name = elem[0].name;
- if(!name){
- ret = elem;
- } else if(form){
- ret = $(form[name]);
- } else {
- ret = $(document.getElementsByName(name)).filter(function(){
- return !$.prop(this, 'form');
- });
- }
- ret = ret.filter('[type="radio"]');
- }
- return ret;
-};
+ "use strict";
+ var isNumber = function(string){
+ return (typeof string == 'number' || (string && string == string * 1));
+ };
+
//support getSetAttribute
-var supportGetSetAttribute = !(('getSetAttribute' in $.support) && !$.support.getSetAttribute);
+ var supportGetSetAttribute = !(('getSetAttribute' in $.support) && !$.support.getSetAttribute);
//submitbubbles for IE6-IE8
-var supportSubmitBubbles = !('submitBubbles' in $.support) || $.support.submitBubbles;
-var addSubmitBubbles = function(form){
- if (!supportSubmitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
-
- $.event.add( form, 'submit._submit', function( event ) {
- event._submit_bubble = true;
- });
-
- form._submit_attached = true;
- }
-};
-if(!supportSubmitBubbles && $.event.special.submit){
-
- $.event.special.submit.setup = function() {
- // Only need this for delegated form submit events
- if ( $.nodeName( this, "form" ) ) {
- return false;
- }
+ var supportSubmitBubbles = !('submitBubbles' in $.support) || $.support.submitBubbles;
+ var addSubmitBubbles = function(form){
+ if (!supportSubmitBubbles && form && typeof form == 'object' && !form._submit_attached ) {
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- $.event.add( this, "click._submit keypress._submit", function( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
- addSubmitBubbles(form);
-
- });
- // return undefined since we don't need an event listener
+ $.event.add( form, 'submit._submit', function( event ) {
+ event._submit_bubble = true;
+ });
+
+ form._submit_attached = true;
+ }
};
-}
+ if(!supportSubmitBubbles && $.event.special.submit){
+ $.event.special.submit.setup = function() {
+ // Only need this for delegated form submit events
+ if ( $.nodeName( this, "form" ) ) {
+ return false;
+ }
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
+ $.event.add( this, "click._submit keypress._submit", function( e ) {
+ // Node name check avoids a VML-related crash in IE (#9807)
+ var elem = e.target,
+ form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined;
+ addSubmitBubbles(form);
-webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', {
- set: function(value){
- $(this).getShadowFocusElement().attr('aria-required', !!(value)+'');
- },
- initAttr: true
-});
+ });
+ // return undefined since we don't need an event listener
+ };
+ }
-webshims.reflectProperties(['input'], ['pattern']);
+ webshims.reflectProperties(['input'], ['pattern']);
-if( !('maxLength' in document.createElement('textarea')) ){
- var constrainMaxLength = (function(){
- var timer;
- var curLength = 0;
- var lastElement = $([]);
- var max = 1e9;
- var constrainLength = function(){
- var nowValue = lastElement.prop('value');
- var nowLen = nowValue.length;
- if(nowLen > curLength && nowLen > max){
- nowLen = Math.max(curLength, max);
- lastElement.prop('value', nowValue.substr(0, nowLen ));
+ if( !('maxLength' in document.createElement('textarea')) ){
+ var constrainMaxLength = (function(){
+ var timer;
+ var curLength = 0;
+ var lastElement = $([]);
+ var max = 1e9;
+ var constrainLength = function(){
+ var nowValue = lastElement.prop('value');
+ var nowLen = nowValue.length;
+ if(nowLen > curLength && nowLen > max){
+ nowLen = Math.max(curLength, max);
+ lastElement.prop('value', nowValue.substr(0, nowLen ));
+ }
+ curLength = nowLen;
+ };
+ var remove = function(){
+ clearTimeout(timer);
+ lastElement.off('.maxlengthconstraint');
+ };
+ return function(element, maxLength){
+ remove();
+ if(maxLength > -1){
+ max = maxLength;
+ curLength = $.prop(element, 'value').length;
+ lastElement = $(element);
+ lastElement.on({
+ 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
+ setTimeout(constrainLength, 0);
+ },
+ 'keyup.maxlengthconstraint': constrainLength,
+ 'blur.maxlengthconstraint': remove
+ });
+ timer = setInterval(constrainLength, 200);
+ }
+ };
+ })();
+
+ constrainMaxLength.update = function(element, maxLength){
+ if($(element).is(':focus')){
+ if(!maxLength){
+ maxLength = $.prop(element, 'maxlength');
+ }
+ constrainMaxLength(element, maxLength);
}
- curLength = nowLen;
};
- var remove = function(){
- clearTimeout(timer);
- lastElement.off('.maxlengthconstraint');
- };
- return function(element, maxLength){
- remove();
- if(maxLength > -1){
- max = maxLength;
- curLength = $.prop(element, 'value').length;
- lastElement = $(element);
- lastElement.on({
- 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){
- setTimeout(constrainLength, 0);
- },
- 'keyup.maxlengthconstraint': constrainLength,
- 'blur.maxlengthconstraint': remove
- });
- timer = setInterval(constrainLength, 200);
+
+ $(document).on('focusin', function(e){
+ var maxLength;
+ if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
+ constrainMaxLength(e.target, maxLength);
}
- };
- })();
-
- constrainMaxLength.update = function(element, maxLength){
- if($(element).is(':focus')){
- if(!maxLength){
- maxLength = $.prop(element, 'maxlength');
- }
- constrainMaxLength(element, maxLength);
- }
- };
-
- $(document).on('focusin', function(e){
- var maxLength;
- if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){
- constrainMaxLength(e.target, maxLength);
- }
- });
-
- webshims.defineNodeNameProperty('textarea', 'maxlength', {
- attr: {
- set: function(val){
- this.setAttribute('maxlength', ''+val);
- constrainMaxLength.update(this);
+ });
+
+ webshims.defineNodeNameProperty('textarea', 'maxlength', {
+ attr: {
+ set: function(val){
+ this.setAttribute('maxlength', ''+val);
+ constrainMaxLength.update(this);
+ },
+ get: function(){
+ var ret = this.getAttribute('maxlength');
+ return ret == null ? undefined : ret;
+ }
},
- get: function(){
- var ret = this.getAttribute('maxlength');
- return ret == null ? undefined : ret;
- }
- },
- prop: {
- set: function(val){
- if(isNumber(val)){
- if(val < 0){
- throw('INDEX_SIZE_ERR');
+ prop: {
+ set: function(val){
+ if(isNumber(val)){
+ if(val < 0){
+ throw('INDEX_SIZE_ERR');
+ }
+ val = parseInt(val, 10);
+ this.setAttribute('maxlength', val);
+ constrainMaxLength.update(this, val);
+ return;
}
- val = parseInt(val, 10);
- this.setAttribute('maxlength', val);
- constrainMaxLength.update(this, val);
- return;
+ this.setAttribute('maxlength', '0');
+ constrainMaxLength.update(this, 0);
+ },
+ get: function(){
+ var val = this.getAttribute('maxlength');
+ return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
+
}
- this.setAttribute('maxlength', '0');
- constrainMaxLength.update(this, 0);
- },
- get: function(){
- var val = this.getAttribute('maxlength');
- return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1;
-
}
- }
- });
- webshims.defineNodeNameProperty('textarea', 'maxLength', {
- prop: {
- set: function(val){
- $.prop(this, 'maxlength', val);
- },
- get: function(){
- return $.prop(this, 'maxlength');
+ });
+ webshims.defineNodeNameProperty('textarea', 'maxLength', {
+ prop: {
+ set: function(val){
+ $.prop(this, 'maxlength', val);
+ },
+ get: function(){
+ return $.prop(this, 'maxlength');
+ }
}
- }
- });
-}
+ });
+ }
-if(!supportGetSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
- webshims.defineNodeNameProperty('form', 'novalidate', {
- attr: {
- set: function(val){
- this.setAttribute('novalidate', ''+val);
- },
- get: function(){
- var ret = this.getAttribute('novalidate');
- return ret == null ? undefined : ret;
+ if(!supportGetSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){
+ webshims.defineNodeNameProperty('form', 'novalidate', {
+ attr: {
+ set: function(val){
+ this.setAttribute('novalidate', ''+val);
+ },
+ get: function(){
+ var ret = this.getAttribute('novalidate');
+ return ret == null ? undefined : ret;
+ }
}
- }
- });
-}
+ });
+ }
-if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldsetelements){
- (function(){
- if(!Modernizr.fieldsetdisabled){
- var isFieldsetGroup = /^(?:fieldset)$/i;
- var disableElementsSel = 'input, textarea, select, button';
- $.extend($.expr[":"], {
- "enabled": function( elem ) {
- return elem.disabled === false || (isFieldsetGroup.test(elem.nodeName) && webshims.contentAttr(elem, 'disabled') == null && !$(elem).is('fieldset[disabled] *')) ;
- },
-
- "disabled": function( elem ) {
- return elem.disabled === true || (isFieldsetGroup.test(elem.nodeName) && (webshims.contentAttr(elem, 'disabled') != null || $(elem).is('fieldset[disabled] *')));
- }
- });
-
-
- var groupControl = {
- getElements: function(group){
- $(disableElementsSel, group).each(groupControl.disable);
- },
- disable: function(){
- if(!this.disabled){
- webshims.data(this, 'groupedisabled', true);
- this.disabled = true;
+ if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled || !Modernizr.fieldsetelements){
+ (function(){
+ if(!Modernizr.fieldsetdisabled){
+ var isFieldsetGroup = {
+ fieldset: 1,
+ FIELDSET: 1
+ };
+ var disableElementsSel = 'input, textarea, select, button';
+ $.extend($.expr[":"], {
+ "enabled": function( elem ) {
+ return elem.disabled === false || (isFieldsetGroup[elem.nodeName] && webshims.contentAttr(elem, 'disabled') == null && !$(elem).is('fieldset[disabled] *')) ;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true || (isFieldsetGroup[elem.nodeName] && (webshims.contentAttr(elem, 'disabled') != null || $(elem).is('fieldset[disabled] *')));
}
- },
- enable: function(){
- if(this.disabled && webshims.data(this, 'groupedisabled')){
- webshims.data(this, 'groupedisabled', false);
- this.disabled = false;
- }
- }
- };
-
- $(window).on('unload', function(){
- $(disableElementsSel).each(groupControl.enable);
- });
-
- webshims.defineNodeNamesBooleanProperty(['fieldset'], 'disabled', {
- set: function(value){
-
- if(value){
- $(disableElementsSel, this).each(groupControl.disable);
- } else if(!$(this).is('fieldset[disabled] *')){
- var nested = $('fieldset[disabled]', this);
- var elements = $(disableElementsSel, this);
-
- if(nested.length){
- elements = elements.not('fieldset[disabled] *');
+ });
+
+
+ var groupControl = {
+ disable: function(){
+ if(!this.disabled){
+ webshims.data(this, 'groupedisabled', true);
+ this.disabled = true;
}
-
- elements.each(groupControl.enable);
+ },
+ enable: function(){
+ if(this.disabled && webshims.data(this, 'groupedisabled')){
+ webshims.data(this, 'groupedisabled', false);
+ this.disabled = false;
+ }
}
- },
- initAttr: true,
- useContentAttribute: true
- });
-
- ['input', 'textarea', 'select', 'button'].forEach(function(nodeName){
- var desc = webshims.defineNodeNameProperty(nodeName, 'disabled', {
- prop: {
- set: function(value){
- if(value){
- webshims.data(this, 'groupedisabled', false);
- desc.prop._supset.call(this, value);
- } else if($(this).is('fieldset[disabled] *')){
- webshims.data(this, 'groupedisabled', true);
- desc.prop._supset.call(this, true);
- } else {
- webshims.data(this, 'groupedisabled', false);
- desc.prop._supset.call(this, value);
+ };
+
+ $(window).on('unload', function(){
+ $(disableElementsSel).each(groupControl.enable);
+ });
+
+ webshims.defineNodeNamesBooleanProperty(['fieldset'], 'disabled', {
+ set: function(value){
+ value = !!value;
+
+ if(value){
+ $(disableElementsSel, this).each(groupControl.disable);
+ } else if(!$(this).is('fieldset[disabled] *')){
+ var elements = $(this.querySelectorAll(disableElementsSel));
+
+ if( this.querySelector('fieldset[disabled]') ){
+ elements = elements.not('fieldset[disabled] *');
}
- },
- get: function(){
- var ret = desc.prop._supget.call(this);
- return ret ? !webshims.data(this, 'groupedisabled') : ret;
+
+ elements.each(groupControl.enable);
}
},
- removeAttr: {
- value: function(){
- desc.prop.set.call(this, false);
- }
- }
+ initAttr: true,
+ useContentAttribute: true
});
- });
-
- webshims.addReady(function(context){
-
- $(context)
- .filter('fieldset[disabled], fieldset[disabled] *')
- .find(disableElementsSel)
- .each(groupControl.disable)
- ;
- });
- }
-
-
- if(!Modernizr.formattribute){
- (function(prop, undefined){
- $.prop = function(elem, name, value){
- var ret;
- if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){
- ret = document.getElementsByName(name);
- if(!ret || !ret.length){
- ret = document.getElementById(name);
+
+ ['input', 'textarea', 'select', 'button'].forEach(function(nodeName){
+ var desc = webshims.defineNodeNameProperty(nodeName, 'disabled', {
+ prop: {
+ set: function(value){
+ if(value){
+ webshims.data(this, 'groupedisabled', false);
+ desc.prop._supset.call(this, value);
+ } else if($(this).is('fieldset[disabled] *')){
+ webshims.data(this, 'groupedisabled', true);
+ desc.prop._supset.call(this, true);
+ } else {
+ webshims.data(this, 'groupedisabled', false);
+ desc.prop._supset.call(this, value);
+ }
+ },
+ get: function(){
+ var ret = desc.prop._supget.call(this);
+ return ret ? !webshims.data(this, 'groupedisabled') : ret;
+ }
+ },
+ removeAttr: {
+ value: function(){
+ desc.prop.set.call(this, false);
+ }
}
- if(ret){
- ret = $(ret).filter(function(){
- return $.prop(this, 'form') == elem;
- }).get();
- if(ret.length){
- return ret.length == 1 ? ret[0] : ret;
+ });
+ });
+
+ webshims.addReady(function(context){
+
+ $(context)
+ .filter('fieldset[disabled], fieldset[disabled] *')
+ .find(disableElementsSel)
+ .each(groupControl.disable)
+ ;
+ });
+ }
+
+
+ if(!Modernizr.formattribute){
+ (function(prop, undefined){
+ var isForm = {form: 1, FORM: 1};
+ $.prop = function(elem, name, value){
+ var ret;
+ if(elem && elem.nodeType == 1 && value === undefined && isForm[elem.nodeName] && elem.id){
+ ret = document.getElementsByName(name);
+ if(!ret || !ret.length){
+ ret = document.getElementById(name);
}
+ if(ret){
+ ret = $(ret).filter(function(){
+ return $.prop(this, 'form') == elem;
+ }).get();
+ if(ret.length){
+ return ret.length == 1 ? ret[0] : ret;
+ }
+ }
}
+ return prop.apply(this, arguments);
+ };
+ })($.prop, undefined);
+
+ var removeAddedElements = function(form){
+ var elements = $.data(form, 'webshimsAddedElements');
+ if(elements){
+ elements.remove();
+ $.removeData(form, 'webshimsAddedElements');
}
- return prop.apply(this, arguments);
};
- })($.prop, undefined);
-
- var removeAddedElements = function(form){
- var elements = $.data(form, 'webshimsAddedElements');
- if(elements){
- elements.remove();
- $.removeData(form, 'webshimsAddedElements');
- }
- };
-
- webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
- prop: {
- get: function(){
- var form = webshims.contentAttr(this, 'form');
- if(form){
- form = document.getElementById(form);
- if(form && !$.nodeName(form, 'form')){
- form = null;
+
+ webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', {
+ prop: {
+ get: function(){
+ var form = webshims.contentAttr(this, 'form');
+ if(form){
+ form = document.getElementById(form);
+ if(form && !$.nodeName(form, 'form')){
+ form = null;
+ }
}
- }
- return form || this.form;
- },
- writeable: false
- }
- });
-
-
- webshims.defineNodeNamesProperty(['form'], 'elements', {
- prop: {
- get: function(){
- var id = this.id;
- var elements = $.makeArray(this.elements);
- if(id){
- elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get();
+ return form || this.form;
+ },
+ writeable: false
+ }
+ });
+
+ webshims.defineNodeNamesProperty(['form'], 'elements', {
+ prop: {
+ get: function(){
+ var sel, addElements, detachElements;
+ var id = this.id;
+ var elements = $.makeArray(this.elements);
+ if(id){
+ detachElements = $.data(this, 'webshimsAddedElements');
+ if(detachElements){
+ detachElements.detach();
+ }
+ sel = 'input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]';
+ addElements = document.querySelectorAll(sel) || [];
+ if(addElements.length){
+ elements = $(elements).add(addElements).get();
+
+ }
+ if(detachElements){
+ detachElements.appendTo(this);
+ }
+ }
+ return elements;
+ },
+ writeable: false
+ }
+ });
+
+
+
+ $(function(){
+ var stopPropagation = function(e){
+ e.stopPropagation();
+ };
+ var submitters = {
+ image: 1,
+ submit: 1
+ };
+ $(document).on('submit', function(e){
+
+ if(!e.isDefaultPrevented()){
+ var form = e.target;
+ var id = form.id;
+ var elements;
+
+
+ if(id){
+ removeAddedElements(form);
+ elements = document.querySelectorAll('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]');
+ elements = $(elements)
+ .filter(function(){
+ return !this.disabled && this.name && this.form != form;
+ })
+ .clone()
+ ;
+ if(elements.length){
+ $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
+ setTimeout(function(){
+ removeAddedElements(form);
+ }, 9);
+ }
+ elements = null;
+ }
}
- return elements;
- },
- writeable: false
- }
- });
-
-
-
- $(function(){
- var stopPropagation = function(e){
- e.stopPropagation();
- };
- var submitters = {
- image: 1,
- submit: 1
- };
- $(document).on('submit', function(e){
-
- if(!e.isDefaultPrevented()){
- var form = e.target;
- var id = form.id;
- var elements;
-
-
- if(id){
- removeAddedElements(form);
-
- elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]')
- .filter(function(){
- return !this.disabled && this.name && this.form != form;
- })
- .clone()
- ;
- if(elements.length){
- $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form));
+ });
+
+
+ $(document).on('click', function(e){
+ if(submitters[e.target.type] && !e.isDefaultPrevented() && webshims.contentAttr(e.target, 'form')){
+ var trueForm = $.prop(e.target, 'form');
+ var formIn = e.target.form;
+ var clone;
+ if(trueForm && trueForm != formIn){
+ clone = $(e.target)
+ .clone()
+ .removeAttr('form')
+ .addClass('webshims-visual-hide')
+ .on('click', stopPropagation)
+ .appendTo(trueForm)
+ ;
+ if(formIn){
+ e.preventDefault();
+ }
+ addSubmitBubbles(trueForm);
+ clone.trigger('click');
setTimeout(function(){
- removeAddedElements(form);
+ clone.remove();
+ clone = null;
}, 9);
}
- elements = null;
}
- }
+ });
});
-
-
- $(document).on('click', function(e){
- if(submitters[e.target.type] && !e.isDefaultPrevented() && $(e.target).is('input[form], button[form]')){
- var trueForm = $.prop(e.target, 'form');
- var formIn = e.target.form;
- var clone;
- if(trueForm && trueForm != formIn){
- clone = $(e.target)
- .clone()
- .removeAttr('form')
- .addClass('webshims-visual-hide')
- .on('click', stopPropagation)
- .appendTo(trueForm)
- ;
- if(formIn){
- e.preventDefault();
- }
- addSubmitBubbles(trueForm);
- clone.trigger('click');
- setTimeout(function(){
- clone.remove();
- clone = null;
- }, 9);
- }
- }
- });
- });
-
- if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
- var rCRLF = /\r?\n/g,
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
- rselectTextarea = /^(?:select|textarea)/i;
- $.fn.serializeArray = function() {
+
+ if(!$.fn.finish && parseFloat($.fn.jquery, 10) < 1.9){
+ var rCRLF = /\r?\n/g,
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+ rselectTextarea = /^(?:select|textarea)/i;
+ $.fn.serializeArray = function() {
return this.map(function(){
var elements = $.prop(this, 'elements');
return elements ? $.makeArray( elements ) : this;
})
- .filter(function(){
- return this.name && !$(this).is(':disabled') &&
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
- rinput.test( this.type ) );
- })
- .map(function( i, elem ){
- var val = $( this ).val();
-
- return val == null ?
- null :
- $.isArray( val ) ?
- $.map( val, function( val, i ){
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }) :
+ .filter(function(){
+ return this.name && !$(this).is(':disabled') &&
+ ( this.checked || rselectTextarea.test( this.nodeName ) ||
+ rinput.test( this.type ) );
+ })
+ .map(function( i, elem ){
+ var val = $( this ).val();
+
+ return val == null ?
+ null :
+ $.isArray( val ) ?
+ $.map( val, function( val, i ){
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }).get();
+ }).get();
};
- }
- }
-
- if(!Modernizr.fieldsetelements){
- webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
- prop: {
- get: function(){
- //add listed elements without keygen, object, output
- return $('input, select, textarea, button, fieldset', this).get() || [];
- },
- writeable: false
}
- });
- }
-
- })();
-}
+ }
+ if(!Modernizr.fieldsetelements){
+ webshims.defineNodeNamesProperty(['fieldset'], 'elements', {
+ prop: {
+ get: function(){
+ //add listed elements without keygen, object, output
+ return this.querySelectorAll('input, select, textarea, button, fieldset') || [];
+ },
+ writeable: false
+ }
+ });
+ }
+
+ })();
+ }
+
if($('<input />').prop('labels') == null){
webshims.defineNodeNamesProperty('button, input, keygen, meter, output, progress, select, textarea', 'labels', {
prop: {
get: function(){
if(this.type == 'hidden'){return null;}
var id = this.id;
var labels = $(this)
- .closest('label')
- .filter(function(){
- var hFor = (this.attributes['for'] || {});
- return (!hFor.specified || hFor.value == id);
- })
- ;
-
+ .closest('label')
+ .filter(function(){
+ var hFor = (this.attributes['for'] || {});
+ return (!hFor.specified || hFor.value == id);
+ })
+ ;
+
if(id) {
- labels = labels.add('label[for="'+ id +'"]');
+ labels = labels.add(document.querySelectorAll('label[for="'+ id +'"]'));
}
return labels.get();
},
writeable: false
}
});
}
-
+
if(!('value' in document.createElement('progress'))){
(function(){
-
+
var nan = parseInt('NaN', 10);
-
+
var updateProgress = function(progress){
var position = $.prop(progress, 'position');
-
+
$.attr(progress, 'data-position', position);
$('> span', progress).css({width: (position < 0 ? 100 : position * 100) +'%'});
};
var desc = {
position: {
@@ -492,12 +475,12 @@
get: function(){
var max;
//jQuery 1.8.x try's to normalize "0" to 0
var val = this.getAttribute('value');
var ret = -1;
-
- val = val ? (val * 1) : nan;
+
+ val = val ? (val * 1) : nan;
if(!isNaN(val)){
max = $.prop(this, 'max');
ret = Math.max(Math.min(val / max, 1), 0);
if(updateProgress.isInChange){
$.attr(this, 'aria-valuenow', ret * 100);
@@ -513,11 +496,11 @@
},
writeable: false
}
}
};
-
+
$.each({value: 0, max: 1}, function(name, defValue){
var removeProp = (name == 'value' && !$.fn.finish);
desc[name] = {
attr: {
set: function(value){
@@ -562,23 +545,23 @@
return desc[name].attr.set.call(this, value);
}
}
};
});
-
+
webshims.createElement(
- 'progress',
+ 'progress',
function(){
var labels = $(this)
- .attr({role: 'progressbar', 'aria-valuemin': '0'})
- .html('<span class="progress-value" />')
- .jProp('labels')
- .map(function(){
- return webshims.getID(this);
- })
- .get()
- ;
+ .attr({role: 'progressbar', 'aria-valuemin': '0'})
+ .html('<span class="progress-value" />')
+ .jProp('labels')
+ .map(function(){
+ return webshims.getID(this);
+ })
+ .get()
+ ;
if(labels.length){
$.attr(this, 'aria-labelledby', labels.join(' '));
} else {
webshims.info("you should use label elements for your prgogress elements");
}
@@ -586,573 +569,489 @@
$(this).addClass('ws-is-rtl');
}
updateProgress.isInChange = 'max';
updateProgress(this);
updateProgress.isInChange = false;
- },
+ },
desc
);
-
+
})();
}
-try {
- document.querySelector(':checked');
-} catch(er){
- (function(){
- $('html').addClass('no-csschecked');
- var checkInputs = {
- radio: 1,
- checkbox: 1
- };
- var selectChange = function(){
- var options = this.options || [];
- var i, len, option;
- for(i = 0, len = options.length; i < len; i++){
- option = $(options[i]);
- option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked');
- }
- };
- var checkChange = function(){
- var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass';
- var className = this.className || '';
- var parent;
-
- //IE8- has problems to update styles, we help
- if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){
- $(this)[fn]('prop-checked');
- if((parent = this.parentNode)){
- parent.className = parent.className;
- }
- }
- };
-
-
- webshims.onNodeNamesPropertyModify('select', 'value', selectChange);
- webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange);
- webshims.onNodeNamesPropertyModify('option', 'selected', function(){
- $(this).closest('select').each(selectChange);
- });
- webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){
- var type = this.type;
- if(type == 'radio' && boolVal){
- getGroupElements(this).each(checkChange);
- } else if(checkInputs[type]) {
- $(this).each(checkChange);
- }
- });
-
- $(document).on('change', function(e){
-
- if(checkInputs[e.target.type]){
- if(e.target.type == 'radio'){
- getGroupElements(e.target).each(checkChange);
- } else {
- $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked');
- }
- } else if(e.target.nodeName.toLowerCase() == 'select'){
- $(e.target).each(selectChange);
- }
- });
-
- webshims.addReady(function(context, contextElem){
- $('option, input', context)
- .add(contextElem.filter('option, input'))
- .each(function(){
- var prop;
- if(checkInputs[this.type]){
- prop = 'checked';
- } else if(this.nodeName.toLowerCase() == 'option'){
- prop = 'selected';
- }
- if(prop){
- $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked');
- }
-
- })
- ;
- });
- })();
-}
+ if(!('setSelectionRange' in document.createElement('input'))){
+ (function(){
+ var getSelection = function(elem, getStart){
+ var range, value, normalizedValue, textInputRange, len, endRange;
+ var start = 0;
+ var end = 0;
+ if (document.selection && (range = document.selection.createRange()) && range.parentElement() == elem) {
+ value = $.prop(elem, 'value');
+ len = value.length;
+ normalizedValue = value.replace(/\r\n/g, "\n");
-if(!('setSelectionRange' in document.createElement('input'))){
- (function(){
- var getSelection = function(elem, getStart){
- var range, value, normalizedValue, textInputRange, len, endRange;
- var start = 0;
- var end = 0;
- if (document.selection && (range = document.selection.createRange()) && range.parentElement() == elem) {
- value = $.prop(elem, 'value');
- len = value.length;
- normalizedValue = value.replace(/\r\n/g, "\n");
-
- textInputRange = elem.createTextRange();
- textInputRange.moveToBookmark(range.getBookmark());
-
-
- endRange = elem.createTextRange();
- endRange.collapse(false);
-
- if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
- start = end = len;
- } else {
- if(getStart){
- start = -textInputRange.moveStart("character", -len);
- start += normalizedValue.slice(0, start).split("\n").length - 1;
+ textInputRange = elem.createTextRange();
+ textInputRange.moveToBookmark(range.getBookmark());
+
+
+ endRange = elem.createTextRange();
+ endRange.collapse(false);
+
+ if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
+ start = end = len;
} else {
- if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
- end = len;
+ if(getStart){
+ start = -textInputRange.moveStart("character", -len);
+ start += normalizedValue.slice(0, start).split("\n").length - 1;
} else {
- end = -textInputRange.moveEnd("character", -len);
- end += normalizedValue.slice(0, end).split("\n").length - 1;
+ if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
+ end = len;
+ } else {
+ end = -textInputRange.moveEnd("character", -len);
+ end += normalizedValue.slice(0, end).split("\n").length - 1;
+ }
}
+
}
-
}
- }
- return {
- start: start,
- end: end
+ return {
+ start: start,
+ end: end
+ };
};
- };
-
- ['input', 'textarea'].forEach(function(name){
- var isTextarea = name == 'textarea';
- //email?
- var allowedTypes = {text: 1, search: 1, url: 1, tel: 1, password: 1, email: 1};
- 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';
- webshims.defineNodeNameProperties(name, {
- selectionStart: {
- get: function(){
- if(isTextarea || allowedTypes[$.prop(this, 'type')]){
- return getSelection(this, true).start;
- }
- webshims.error(error);
- },
- set: function(v){
- if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
- var range = this.createTextRange();
- range.collapse(true);
- range.moveStart('character', v);
- range.moveEnd('character', $.prop(this, 'selectionEnd'));
- if($(this).is(':focus')){
- range.select();
+
+ ['input', 'textarea'].forEach(function(name){
+ var isTextarea = name == 'textarea';
+ //email?
+ var allowedTypes = {text: 1, search: 1, url: 1, tel: 1, password: 1, email: 1};
+ 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';
+ webshims.defineNodeNameProperties(name, {
+ selectionStart: {
+ get: function(){
+ if(isTextarea || allowedTypes[$.prop(this, 'type')]){
+ return getSelection(this, true).start;
}
- } else {
webshims.error(error);
+ },
+ set: function(v){
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
+ var range = this.createTextRange();
+ range.collapse(true);
+ range.moveStart('character', v);
+ range.moveEnd('character', $.prop(this, 'selectionEnd'));
+ if($(this).is(':focus')){
+ range.select();
+ }
+ } else {
+ webshims.error(error);
+ }
}
- }
- },
- selectionEnd: {
- get: function(){
- if(isTextarea || allowedTypes[$.prop(this, 'type')]){
- return getSelection(this).end;
- }
- webshims.error(error);
},
- set: function(v){
- if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
- var range = this.createTextRange();
- var start;
- range.collapse(true);
- start = getSelection(this, true).start;
- range.moveStart('character', start);
- range.moveEnd('character', v - start);
- if($(this).is(':focus')){
- range.select();
+ selectionEnd: {
+ get: function(){
+ if(isTextarea || allowedTypes[$.prop(this, 'type')]){
+ return getSelection(this).end;
}
- } else {
webshims.error(error);
+ },
+ set: function(v){
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
+ var range = this.createTextRange();
+ var start;
+ range.collapse(true);
+ start = getSelection(this, true).start;
+ range.moveStart('character', start);
+ range.moveEnd('character', v - start);
+ if($(this).is(':focus')){
+ range.select();
+ }
+ } else {
+ webshims.error(error);
+ }
}
- }
- },
- setSelectionRange: {
- value: function(start, end, dir){
- if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
- var range = this.createTextRange();
- range.collapse(true);
- range.moveStart('character', start);
- range.moveEnd('character', end - start);
- if($(this).is(':focus')){
- range.select();
+ },
+ setSelectionRange: {
+ value: function(start, end, dir){
+ if(this.createTextRange && (isTextarea || allowedTypes[$.prop(this, 'type')])){
+ var range = this.createTextRange();
+ range.collapse(true);
+ range.moveStart('character', start);
+ range.moveEnd('character', end - start);
+ if($(this).is(':focus')){
+ range.select();
+ }
+ } else {
+ webshims.error(error);
}
- } else {
- webshims.error(error);
}
}
- }
- }, 'prop');
- });
-
- })();
-}
+ }, 'prop');
+ });
-(function(){
- if(options.noPlaceholderPolyfill){return;}
- var bustedPlaceholder;
- Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
- if(Modernizr.input.placeholder && options.overridePlaceholder){
- bustedPlaceholder = true;
- }
- if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedPlaceholder){
- (function(){
- var ua = navigator.userAgent;
-
- if(ua.indexOf('Mobile') != -1 && ua.indexOf('Safari') != -1){
- $(window).on('orientationchange', (function(){
- var timer;
- var retVal = function(i, value){
- return value;
- };
-
- var set = function(){
- $('input[placeholder], textarea[placeholder]').attr('placeholder', retVal);
- };
- return function(e){
- clearTimeout(timer);
- timer = setTimeout(set, 9);
- };
- })());
- }
})();
-
- //abort
- return;
}
-
- var isOver = (webshims.cfg.forms.placeholderType == 'over');
- var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
- var polyfillElements = ['textarea'];
- if(!Modernizr.input.placeholder || bustedPlaceholder){
- polyfillElements.push('input');
- }
-
- var setSelection = function(elem){
- try {
- $(elem).setSelectionRange(0,0);
- return true;
- } catch(er){}
- };
-
- var hidePlaceholder = function(elem, data, value, _onFocus){
- if(value === false){
- value = $.prop(elem, 'value');
- }
-
- if(!isOver && elem.type != 'password'){
- if(!value && _onFocus && setSelection(elem)){
- var selectTimer = setTimeout(function(){
- setSelection(elem);
- }, 9);
+
+ (function(){
+ if(options.noPlaceholderPolyfill){return;}
+ var bustedPlaceholder;
+ Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]);
+ if(Modernizr.input.placeholder && options.overridePlaceholder){
+ bustedPlaceholder = true;
+ }
+ if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder && !bustedPlaceholder){
+ (function(){
+ var ua = navigator.userAgent;
+
+ if(ua.indexOf('Mobile') != -1 && ua.indexOf('Safari') != -1){
+ $(window).on('orientationchange', (function(){
+ var timer;
+ var retVal = function(i, value){
+ return value;
+ };
+
+ var set = function(){
+ $('input[placeholder], textarea[placeholder]').attr('placeholder', retVal);
+ };
+ return function(e){
+ clearTimeout(timer);
+ timer = setTimeout(set, 9);
+ };
+ })());
+ }
+ })();
+
+ //abort
+ return;
+ }
+
+ var isOver = (webshims.cfg.forms.placeholderType == 'over');
+ var isResponsive = (webshims.cfg.forms.responsivePlaceholder);
+ var polyfillElements = ['textarea'];
+ if(!Modernizr.input.placeholder || bustedPlaceholder){
+ polyfillElements.push('input');
+ }
+
+ var setSelection = function(elem){
+ try {
+ $(elem).setSelectionRange(0,0);
+ return true;
+ } catch(er){}
+ };
+
+ var hidePlaceholder = function(elem, data, value, _onFocus){
+ if(value === false){
+ value = $.prop(elem, 'value');
+ }
+
+ if(!isOver && elem.type != 'password'){
+ if(!value && _onFocus && setSelection(elem)){
+ var selectTimer = setTimeout(function(){
+ setSelection(elem);
+ }, 9);
+ $(elem)
+ .off('.placeholderremove')
+ .on({
+ 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
+ if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
+ elem.value = $.prop(elem, 'value');
+ data.box.removeClass('placeholder-visible');
+ clearTimeout(selectTimer);
+ $(elem).off('.placeholderremove');
+ },
+ 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
+ setSelection(elem);
+ clearTimeout(selectTimer);
+ selectTimer = setTimeout(function(){
+ setSelection(elem);
+ }, 9);
+ },
+ 'blur.placeholderremove': function(){
+ clearTimeout(selectTimer);
+ $(elem).off('.placeholderremove');
+ }
+ })
+ ;
+ return;
+ } else if(!_onFocus && !value && elem.value){ //especially on submit
+ elem.value = value;
+ }
+ } else if(!value && _onFocus){
$(elem)
.off('.placeholderremove')
.on({
'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
- elem.value = $.prop(elem, 'value');
data.box.removeClass('placeholder-visible');
- clearTimeout(selectTimer);
$(elem).off('.placeholderremove');
},
- 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){
- setSelection(elem);
- clearTimeout(selectTimer);
- selectTimer = setTimeout(function(){
- setSelection(elem);
- }, 9);
- },
'blur.placeholderremove': function(){
- clearTimeout(selectTimer);
$(elem).off('.placeholderremove');
}
})
;
return;
- } else if(!_onFocus && !value && elem.value){ //especially on submit
- elem.value = value;
}
- } else if(!value && _onFocus){
- $(elem)
- .off('.placeholderremove')
- .on({
- 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){
- if(e && (e.keyCode == 17 || e.keyCode == 16)){return;}
- data.box.removeClass('placeholder-visible');
- $(elem).off('.placeholderremove');
- },
- 'blur.placeholderremove': function(){
- $(elem).off('.placeholderremove');
- }
- })
- ;
- return;
- }
- data.box.removeClass('placeholder-visible');
- },
- showPlaceholder = function(elem, data, placeholderTxt){
- if(placeholderTxt === false){
- placeholderTxt = $.prop(elem, 'placeholder');
- }
-
- if(!isOver && elem.type != 'password'){
- elem.value = placeholderTxt;
- }
- data.box.addClass('placeholder-visible');
- },
- changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
- if(!data){
- data = $.data(elem, 'placeHolder');
- if(!data){return;}
- }
- var isVisible = $(elem).hasClass('placeholder-visible');
- if(placeholderTxt === false){
- placeholderTxt = $.attr(elem, 'placeholder') || '';
- }
-
- $(elem).off('.placeholderremove');
-
- if(value === false){
- value = $.prop(elem, 'value');
- }
-
- if(!value && (type == 'focus' || (!type && $(elem).is(':focus')))){
- if(elem.type == 'password' || isOver || isVisible){
- hidePlaceholder(elem, data, '', true);
+ data.box.removeClass('placeholder-visible');
+ },
+ showPlaceholder = function(elem, data, placeholderTxt){
+ if(placeholderTxt === false){
+ placeholderTxt = $.prop(elem, 'placeholder');
}
- return;
- }
-
- if(value){
- hidePlaceholder(elem, data, value);
- return;
- }
-
- if(placeholderTxt && !value){
- showPlaceholder(elem, data, placeholderTxt);
- } else {
- hidePlaceholder(elem, data, value);
- }
- },
- hasLabel = function(elem){
- elem = $(elem);
- return !!(elem.prop('title') || elem.attr('aria-labelledby') || elem.attr('aria-label') || elem.jProp('labels').length);
- },
- createPlaceholder = function(elem){
- elem = $(elem);
- return $( hasLabel(elem) ? '<span class="placeholder-text"></span>' : '<label for="'+ elem.prop('id') +'" class="placeholder-text"></label>');
- },
- pHolder = (function(){
- var allowedPlaceholder = {
- text: 1,
- search: 1,
- url: 1,
- email: 1,
- password: 1,
- tel: 1,
- number: 1
+
+ if(!isOver && elem.type != 'password'){
+ elem.value = placeholderTxt;
}
- ;
- if(webshims.modules["form-number-date-ui"].loaded){
- delete allowedPlaceholder.number;
- }
-
- return {
- create: function(elem){
- var data = $.data(elem, 'placeHolder');
- var form;
- if(data){return data;}
- data = $.data(elem, 'placeHolder', {});
-
- $(elem).on('focus.placeholder blur.placeholder', function(e){
- changePlaceholderVisibility(this, false, false, data, e.type );
- data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
- });
-
- if((form = $.prop(elem, 'form'))){
- $(elem).onWSOff('reset.placeholder', function(e){
- setTimeout(function(){
- changePlaceholderVisibility(elem, false, false, data, e.type );
- }, 0);
- }, false, form);
+ data.box.addClass('placeholder-visible');
+ },
+ changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){
+ if(!data){
+ data = $.data(elem, 'placeHolder');
+ if(!data){return;}
+ }
+ var isVisible = $(elem).hasClass('placeholder-visible');
+ if(placeholderTxt === false){
+ placeholderTxt = $.attr(elem, 'placeholder') || '';
+ }
+
+ $(elem).off('.placeholderremove');
+
+ if(value === false){
+ value = $.prop(elem, 'value');
+ }
+
+ if(!value && (type == 'focus' || (!type && $(elem).is(':focus')))){
+ if(elem.type == 'password' || isOver || isVisible){
+ hidePlaceholder(elem, data, '', true);
}
-
- if(elem.type == 'password' || isOver){
- data.text = createPlaceholder(elem);
- if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
- data.box = data.text;
- } else {
- data.box = $('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
- .insertAfter(elem)
- ;
- data.box.append(elem);
+ return;
+ }
+
+ if(value){
+ hidePlaceholder(elem, data, value);
+ return;
+ }
+
+ if(placeholderTxt && !value){
+ showPlaceholder(elem, data, placeholderTxt);
+ } else {
+ hidePlaceholder(elem, data, value);
+ }
+ },
+ createPlaceholder = function(){
+ return $('<span class="placeholder-text"></span>');
+ },
+ pHolder = (function(){
+ var allowedPlaceholder = {
+ text: 1,
+ search: 1,
+ url: 1,
+ email: 1,
+ password: 1,
+ tel: 1,
+ number: 1
+ }
+ ;
+ if(webshims.modules["form-number-date-ui"].loaded){
+ delete allowedPlaceholder.number;
+ }
+
+ return {
+ create: function(elem){
+ var data = $.data(elem, 'placeHolder');
+ var form;
+ if(data){return data;}
+ data = $.data(elem, 'placeHolder', {});
+
+ $(elem).on('focus.placeholder blur.placeholder', function(e){
+ changePlaceholderVisibility(this, false, false, data, e.type );
+ data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused');
+ });
+
+ if((form = $.prop(elem, 'form'))){
+ $(elem).onWSOff('reset.placeholder', function(e){
+ setTimeout(function(){
+ changePlaceholderVisibility(elem, false, false, data, e.type );
+ }, 0);
+ }, false, form);
}
- data.text
- .insertAfter(elem)
- .on('mousedown.placeholder', function(){
- changePlaceholderVisibility(this, false, false, data, 'focus');
- try {
- setTimeout(function(){
- elem.focus();
- }, 0);
- } catch(e){}
- return false;
- })
- ;
-
-
- $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
- var prop = $.css(elem, style);
- if(data.text.css(style) != prop){
- data.text.css(style, prop);
+
+ if(elem.type == 'password' || isOver){
+ data.text = createPlaceholder(elem);
+ if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){
+ data.box = data.text;
+ } else {
+ data.box = $('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />')
+ .insertAfter(elem)
+ ;
+ data.box.append(elem);
}
- });
- $.each(['Left', 'Top'], function(i, side){
- 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);
- data.text.css('padding'+ side, size);
- });
+ data.text
+ .insertAfter(elem)
+ .on('mousedown.placeholder', function(){
+ changePlaceholderVisibility(this, false, false, data, 'focus');
+ try {
+ setTimeout(function(){
+ elem.focus();
+ }, 0);
+ } catch(e){}
+ return false;
+ })
+ ;
- $(elem)
- .onWSOff('updateshadowdom', (function(){
- var lastWidth, init, timer;
- var jelm = $(elem);
- var lastPos = {};
- return function(){
- var width, fn;
- if((width = elem.offsetWidth)){
+ $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){
+ var prop = $.css(elem, style);
+ if(data.text.css(style) != prop){
+ data.text.css(style, prop);
+ }
+ });
+ $.each(['Left', 'Top'], function(i, side){
+ 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);
+ data.text.css('padding'+ side, size);
+ });
- fn = function(){
- var pos = jelm.position();
- if(width !== lastWidth){
- lastWidth = width;
- data.text[0].style.width = width +'px';
+ $(elem)
+ .onWSOff('updateshadowdom', (function(){
+ var lastWidth, init, timer;
+ var jelm = $(elem);
+ var lastPos = {};
+ return function(){
+ var width, fn;
+
+ if((width = elem.offsetWidth)){
+
+ fn = function(){
+ var pos = jelm.position();
+ if(width !== lastWidth){
+ lastWidth = width;
+ data.text[0].style.width = width +'px';
+ }
+ if(pos.top !== lastPos.top || pos.left !== lastPos.left){
+ lastPos = pos;
+ data.text[0].style.top = pos.top +'px';
+ data.text[0].style.left = pos.left +'px';
+ }
+ };
+ if(!init){
+ fn();
+ init = true;
+ } else {
+ clearTimeout(timer);
+ timer = setTimeout(fn, 99);
}
- if(pos.top !== lastPos.top || pos.left !== lastPos.left){
- lastPos = pos;
- data.text[0].style.top = pos.top +'px';
- data.text[0].style.left = pos.left +'px';
- }
- };
- if(!init){
- fn();
- init = true;
- } else {
- clearTimeout(timer);
- timer = setTimeout(fn, 99);
}
- }
- };
- })(), true)
- ;
-
- } else {
- var reset = function(e){
- if($(elem).hasClass('placeholder-visible')){
- hidePlaceholder(elem, data, '');
-
- setTimeout(function(){
- if(!e || e.type != 'submit' || e.isDefaultPrevented()){
- changePlaceholderVisibility(elem, false, false, data );
- }
- }, 9);
+ };
+ })(), true)
+ ;
+
+ } else {
+ var reset = function(e){
+ if($(elem).hasClass('placeholder-visible')){
+ hidePlaceholder(elem, data, '');
+
+ setTimeout(function(){
+ if(!e || e.type != 'submit' || e.isDefaultPrevented()){
+ changePlaceholderVisibility(elem, false, false, data );
+ }
+ }, 9);
+ }
+ };
+
+ $(elem).onWSOff('beforeunload', reset, false, window);
+ data.box = $(elem);
+ if(form){
+ $(elem).onWSOff('submit', reset, false, form);
}
- };
-
- $(elem).onWSOff('beforeunload', reset, false, window);
- data.box = $(elem);
- if(form){
- $(elem).onWSOff('submit', reset, false, form);
}
+
+ return data;
+ },
+ update: function(elem, val){
+ var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
+ if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
+ webshims.warn('placeholder not allowed on input[type="'+type+'"], but it is a good fallback :-)');
+ return;
+ }
+
+
+ var data = pHolder.create(elem);
+ if(data.text){
+ data.text.text(val);
+ }
+
+ changePlaceholderVisibility(elem, false, val, data);
}
-
- return data;
- },
- update: function(elem, val){
- var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase();
- if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){
- webshims.warn('placeholder not allowed on input[type="'+type+'"], but it is a good fallback :-)');
- return;
+ };
+ })()
+ ;
+
+ $.webshims.publicMethods = {
+ pHolder: pHolder
+ };
+ polyfillElements.forEach(function(nodeName){
+ webshims.defineNodeNameProperty(nodeName, 'placeholder', {
+ attr: {
+ set: function(val){
+ var elem = this;
+ if(bustedPlaceholder){
+ webshims.data(elem, 'bustedPlaceholder', val);
+ elem.placeholder = '';
+ } else {
+ webshims.contentAttr(elem, 'placeholder', val);
+ }
+ pHolder.update(elem, val);
+ },
+ get: function(){
+ var placeholder;
+ if(bustedPlaceholder){
+ placeholder = webshims.data(this, 'bustedPlaceholder');
+ }
+ return placeholder || webshims.contentAttr(this, 'placeholder');
}
-
-
- var data = pHolder.create(elem);
- if(data.text){
- data.text.text(val);
- }
-
- changePlaceholderVisibility(elem, false, val, data);
- }
- };
- })()
- ;
-
- $.webshims.publicMethods = {
- pHolder: pHolder
- };
- polyfillElements.forEach(function(nodeName){
- var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', {
- attr: {
- set: function(val){
- var elem = this;
- if(bustedPlaceholder){
- webshims.data(elem, 'bustedPlaceholder', val);
- elem.placeholder = '';
- } else {
- webshims.contentAttr(elem, 'placeholder', val);
- }
- pHolder.update(elem, val);
},
- get: function(){
- var placeholder;
- if(bustedPlaceholder){
- placeholder = webshims.data(this, 'bustedPlaceholder');
- }
- return placeholder || webshims.contentAttr(this, 'placeholder');
- }
- },
- reflect: true,
- initAttr: true
+ reflect: true,
+ initAttr: true
+ });
});
- });
-
-
- polyfillElements.forEach(function(name){
- var placeholderValueDesc = {};
- var desc;
- ['attr', 'prop'].forEach(function(propType){
- placeholderValueDesc[propType] = {
- set: function(val){
- var elem = this;
- var placeholder;
- if(bustedPlaceholder){
- placeholder = webshims.data(elem, 'bustedPlaceholder');
+
+
+ polyfillElements.forEach(function(name){
+ var placeholderValueDesc = {};
+ var desc;
+ ['attr', 'prop'].forEach(function(propType){
+ placeholderValueDesc[propType] = {
+ set: function(val){
+ var elem = this;
+ var placeholder;
+ if(bustedPlaceholder){
+ placeholder = webshims.data(elem, 'bustedPlaceholder');
+ }
+ if(!placeholder){
+ placeholder = webshims.contentAttr(elem, 'placeholder');
+ }
+ $.removeData(elem, 'cachedValidity');
+ var ret = desc[propType]._supset.call(elem, val);
+ if(placeholder && 'value' in elem){
+ changePlaceholderVisibility(elem, val, placeholder);
+ }
+ return ret;
+ },
+ get: function(){
+ var elem = this;
+ return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
}
- if(!placeholder){
- placeholder = webshims.contentAttr(elem, 'placeholder');
- }
- $.removeData(elem, 'cachedValidity');
- var ret = desc[propType]._supset.call(elem, val);
- if(placeholder && 'value' in elem){
- changePlaceholderVisibility(elem, val, placeholder);
- }
- return ret;
- },
- get: function(){
- var elem = this;
- return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem);
- }
- };
+ };
+ });
+ desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
});
- desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc);
- });
-
-})();
+ })();
+
(function(){
- var doc = document;
+ var doc = document;
if( 'value' in document.createElement('output') ){return;}
-
+
webshims.defineNodeNameProperty('output', 'value', {
prop: {
set: function(value){
var setVal = $.data(this, 'outputShim');
if(!setVal){
@@ -1163,39 +1062,39 @@
get: function(){
return webshims.contentAttr(this, 'value') || $(this).text() || '';
}
}
});
-
-
+
+
webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){
if(type == 'removeAttr'){return;}
var setVal = $.data(this, 'outputShim');
if(setVal){
setVal(value);
}
});
-
+
var outputCreate = function(elem){
- if(elem.getAttribute('aria-live')){return;}
+ if($.data(elem, 'outputShim')){return;}
elem = $(elem);
var value = (elem.text() || '').trim();
var id = elem.prop('id');
var htmlFor = elem.attr('for');
var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem);
- var form = shim[0].form || doc;
var setValue = function(val){
shim[0].value = val;
val = shim[0].value;
elem.text(val);
webshims.contentAttr(elem[0], 'value', val);
};
-
+
elem[0].defaultValue = value;
webshims.contentAttr(elem[0], 'value', value);
-
+
elem.attr({'aria-live': 'polite'});
+
if(id){
shim.attr('id', id);
elem.attr('aria-labelledby', elem.jProp('labels').map(function(){
return webshims.getID(this);
}).get().join(' '));
@@ -1211,17 +1110,17 @@
}
elem.data('outputShim', setValue );
shim.data('outputShim', setValue );
return setValue;
};
-
+
webshims.addReady(function(context, contextElem){
- $('output', context).add(contextElem.filter('output')).each(function(){
+ $(context.getElementsByTagName('output')).add(contextElem.filter('output')).each(function(){
outputCreate(this);
});
});
-
+
/*
* Implements input event in all browsers
*/
(function(){
var noInputTriggerEvts = {updateInput: 1, input: 1},
@@ -1231,56 +1130,58 @@
submit: 1,
button: 1,
image: 1,
reset: 1,
file: 1
-
+
//pro forma
,color: 1
},
- observe = function(input){
- var timer,
- lastVal = input.prop('value'),
- trigger = function(e){
- //input === null
- if(!input){return;}
- var newVal = input.prop('value');
- if(newVal !== lastVal){
- lastVal = newVal;
- if(!e || !noInputTriggerEvts[e.type]){
- webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
- }
- }
- },
- extraTimer,
- extraTest = function(){
- clearTimeout(extraTimer);
- extraTimer = setTimeout(trigger, 9);
- },
- unbind = function(){
- input.off('focusout', unbind).off('keyup keypress keydown paste cut', extraTest).off('input change updateInput triggerinput', trigger);
- clearInterval(timer);
- setTimeout(function(){
- trigger();
- input = null;
- }, 1);
-
+ timer,
+ lastVal,
+ input,
+ trigger = function(e){
+ if(!input){return;}
+ var newVal = input.prop('value');
+ if(newVal !== lastVal){
+ lastVal = newVal;
+ if(!e || !noInputTriggerEvts[e.type]){
+ webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input');
}
- ;
-
+ }
+ },
+ extraTimer,
+ extraTest = function(){
+ clearTimeout(extraTimer);
+ extraTimer = setTimeout(trigger, 9);
+ },
+ unbind = function(){
+ clearTimeout(extraTimer);
clearInterval(timer);
- timer = setInterval(trigger, 200);
- extraTest();
- input.on({
- 'keyup keypress keydown paste cut': extraTest,
- focusout: unbind,
- 'input updateInput change triggerinput': trigger
- });
+ if(input){
+ input.off('focusout', unbind).off('keyup keypress keydown paste cut', extraTest).off('input change updateInput triggerinput', trigger);
+ }
+
+
}
;
-
+ var observe = function(newInput){
+ unbind();
+
+ input = newInput;
+ lastVal = input.prop('value');
+ clearInterval(timer);
+ timer = setInterval(trigger, 200);
+ extraTest();
+ input.on({
+ 'keyup keypress keydown paste cut': extraTest,
+ 'focusout wswidgetfocusout': unbind,
+ 'input updateInput change triggerinput': trigger
+ });
+ };
+
$(doc)
- .on('focusin', function(e){
+ .on('focusin wswidgetfocusin', function(e){
if( e.target && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] && !(webshims.data(e.target, 'implemented') || {}).inputwidgets){
observe($(e.target));
}
})
;