595 lines
33 KiB
JavaScript
595 lines
33 KiB
JavaScript
/*
|
|
* jQuery Form Plugin; v20130523
|
|
* http://jquery.malsup.com/form/
|
|
* Copyright (c) 2013 M. Alsup; Dual licensed: MIT/GPL
|
|
* https://github.com/malsup/form#copyright-and-license
|
|
*/
|
|
;(function(e){"use strict";function t(t){var r=t.data;t.isDefaultPrevented()||(t.preventDefault(),e(this).ajaxSubmit(r))}function r(t){var r=t.target,a=e(r);if(!a.is("[type=submit],[type=image]")){var n=a.closest("[type=submit]");if(0===n.length)return;r=n[0]}var i=this;if(i.clk=r,"image"==r.type)if(void 0!==t.offsetX)i.clk_x=t.offsetX,i.clk_y=t.offsetY;else if("function"==typeof e.fn.offset){var o=a.offset();i.clk_x=t.pageX-o.left,i.clk_y=t.pageY-o.top}else i.clk_x=t.pageX-r.offsetLeft,i.clk_y=t.pageY-r.offsetTop;setTimeout(function(){i.clk=i.clk_x=i.clk_y=null},100)}function a(){if(e.fn.ajaxSubmit.debug){var t="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(t):window.opera&&window.opera.postError&&window.opera.postError(t)}}var n={};n.fileapi=void 0!==e("<input type='file'/>").get(0).files,n.formdata=void 0!==window.FormData;var i=!!e.fn.prop;e.fn.attr2=function(){if(!i)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t){function r(r){var a,n,i=e.param(r,t.traditional).split("&"),o=i.length,s=[];for(a=0;o>a;a++)i[a]=i[a].replace(/\+/g," "),n=i[a].split("="),s.push([decodeURIComponent(n[0]),decodeURIComponent(n[1])]);return s}function o(a){for(var n=new FormData,i=0;a.length>i;i++)n.append(a[i].name,a[i].value);if(t.extraData){var o=r(t.extraData);for(i=0;o.length>i;i++)o[i]&&n.append(o[i][0],o[i][1])}t.data=null;var s=e.extend(!0,{},e.ajaxSettings,t,{contentType:!1,processData:!1,cache:!1,type:u||"POST"});t.uploadProgress&&(s.xhr=function(){var e=jQuery.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",function(e){var r=0,a=e.loaded||e.position,n=e.total;e.lengthComputable&&(r=Math.ceil(100*(a/n))),t.uploadProgress(e,a,n,r)},!1),e}),s.data=null;var l=s.beforeSend;return s.beforeSend=function(e,t){t.data=n,l&&l.call(this,e,t)},e.ajax(s)}function s(r){function n(e){var t=null;try{e.contentWindow&&(t=e.contentWindow.document)}catch(r){a("cannot get iframe.contentWindow document: "+r)}if(t)return t;try{t=e.contentDocument?e.contentDocument:e.document}catch(r){a("cannot get iframe.contentDocument: "+r),t=e.document}return t}function o(){function t(){try{var e=n(g).readyState;a("state = "+e),e&&"uninitialized"==e.toLowerCase()&&setTimeout(t,50)}catch(r){a("Server abort: ",r," (",r.name,")"),s(D),j&&clearTimeout(j),j=void 0}}var r=f.attr2("target"),i=f.attr2("action");w.setAttribute("target",d),u||w.setAttribute("method","POST"),i!=m.url&&w.setAttribute("action",m.url),m.skipEncodingOverride||u&&!/post/i.test(u)||f.attr({encoding:"multipart/form-data",enctype:"multipart/form-data"}),m.timeout&&(j=setTimeout(function(){T=!0,s(k)},m.timeout));var o=[];try{if(m.extraData)for(var l in m.extraData)m.extraData.hasOwnProperty(l)&&(e.isPlainObject(m.extraData[l])&&m.extraData[l].hasOwnProperty("name")&&m.extraData[l].hasOwnProperty("value")?o.push(e('<input type="hidden" name="'+m.extraData[l].name+'">').val(m.extraData[l].value).appendTo(w)[0]):o.push(e('<input type="hidden" name="'+l+'">').val(m.extraData[l]).appendTo(w)[0]));m.iframeTarget||(v.appendTo("body"),g.attachEvent?g.attachEvent("onload",s):g.addEventListener("load",s,!1)),setTimeout(t,15);try{w.submit()}catch(c){var p=document.createElement("form").submit;p.apply(w)}}finally{w.setAttribute("action",i),r?w.setAttribute("target",r):f.removeAttr("target"),e(o).remove()}}function s(t){if(!x.aborted&&!F){if(M=n(g),M||(a("cannot access response document"),t=D),t===k&&x)return x.abort("timeout"),S.reject(x,"timeout"),void 0;if(t==D&&x)return x.abort("server abort"),S.reject(x,"error","server abort"),void 0;if(M&&M.location.href!=m.iframeSrc||T){g.detachEvent?g.detachEvent("onload",s):g.removeEventListener("load",s,!1);var r,i="success";try{if(T)throw"timeout";var o="xml"==m.dataType||M.XMLDocument||e.isXMLDoc(M);if(a("isXml="+o),!o&&window.opera&&(null===M.body||!M.body.innerHTML)&&--O)return a("requeing onLoad callback, DOM not available"),setTimeout(s,250),void 0;var u=M.body?M.body:M.documentElement;x.responseText=u?u.innerHTML:null,x.responseXML=M.XMLDocument?M.XMLDocument:M,o&&(m.dataType="xml"),x.getResponseHeader=function(e){var t={"content-type":m.dataType};return t[e]},u&&(x.status=Number(u.getAttribute("status"))||x.status,x.statusText=u.getAttribute("statusText")||x.statusText);var l=(m.dataType||"").toLowerCase(),c=/(json|script|text)/.test(l);if(c||m.textarea){var f=M.getElementsByTagName("textarea")[0];if(f)x.responseText=f.value,x.status=Number(f.getAttribute("status"))||x.status,x.statusText=f.getAttribute("statusText")||x.statusText;else if(c){var d=M.getElementsByTagName("pre")[0],h=M.getElementsByTagName("body")[0];d?x.responseText=d.textContent?d.textContent:d.innerText:h&&(x.responseText=h.textContent?h.textContent:h.innerText)}}else"xml"==l&&!x.responseXML&&x.responseText&&(x.responseXML=X(x.responseText));try{L=_(x,l,m)}catch(b){i="parsererror",x.error=r=b||i}}catch(b){a("error caught: ",b),i="error",x.error=r=b||i}x.aborted&&(a("upload aborted"),i=null),x.status&&(i=x.status>=200&&300>x.status||304===x.status?"success":"error"),"success"===i?(m.success&&m.success.call(m.context,L,"success",x),S.resolve(x.responseText,"success",x),p&&e.event.trigger("ajaxSuccess",[x,m])):i&&(void 0===r&&(r=x.statusText),m.error&&m.error.call(m.context,x,i,r),S.reject(x,"error",r),p&&e.event.trigger("ajaxError",[x,m,r])),p&&e.event.trigger("ajaxComplete",[x,m]),p&&!--e.active&&e.event.trigger("ajaxStop"),m.complete&&m.complete.call(m.context,x,i),F=!0,m.timeout&&clearTimeout(j),setTimeout(function(){m.iframeTarget||v.remove(),x.responseXML=null},100)}}}var l,c,m,p,d,v,g,x,b,y,T,j,w=f[0],S=e.Deferred();if(r)for(c=0;h.length>c;c++)l=e(h[c]),i?l.prop("disabled",!1):l.removeAttr("disabled");if(m=e.extend(!0,{},e.ajaxSettings,t),m.context=m.context||m,d="jqFormIO"+(new Date).getTime(),m.iframeTarget?(v=e(m.iframeTarget),y=v.attr2("name"),y?d=y:v.attr2("name",d)):(v=e('<iframe name="'+d+'" src="'+m.iframeSrc+'" />'),v.css({position:"absolute",top:"-1000px",left:"-1000px"})),g=v[0],x={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var r="timeout"===t?"timeout":"aborted";a("aborting upload... "+r),this.aborted=1;try{g.contentWindow.document.execCommand&&g.contentWindow.document.execCommand("Stop")}catch(n){}v.attr("src",m.iframeSrc),x.error=r,m.error&&m.error.call(m.context,x,r,t),p&&e.event.trigger("ajaxError",[x,m,r]),m.complete&&m.complete.call(m.context,x,r)}},p=m.global,p&&0===e.active++&&e.event.trigger("ajaxStart"),p&&e.event.trigger("ajaxSend",[x,m]),m.beforeSend&&m.beforeSend.call(m.context,x,m)===!1)return m.global&&e.active--,S.reject(),S;if(x.aborted)return S.reject(),S;b=w.clk,b&&(y=b.name,y&&!b.disabled&&(m.extraData=m.extraData||{},m.extraData[y]=b.value,"image"==b.type&&(m.extraData[y+".x"]=w.clk_x,m.extraData[y+".y"]=w.clk_y)));var k=1,D=2,A=e("meta[name=csrf-token]").attr("content"),E=e("meta[name=csrf-param]").attr("content");E&&A&&(m.extraData=m.extraData||{},m.extraData[E]=A),m.forceSync?o():setTimeout(o,10);var L,M,F,O=50,X=e.parseXML||function(e,t){return window.ActiveXObject?(t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!=t.documentElement.nodeName?t:null},C=e.parseJSON||function(e){return window.eval("("+e+")")},_=function(t,r,a){var n=t.getResponseHeader("content-type")||"",i="xml"===r||!r&&n.indexOf("xml")>=0,o=i?t.responseXML:t.responseText;return i&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),a&&a.dataFilter&&(o=a.dataFilter(o,r)),"string"==typeof o&&("json"===r||!r&&n.indexOf("json")>=0?o=C(o):("script"===r||!r&&n.indexOf("javascript")>=0)&&e.globalEval(o)),o};return S}if(!this.length)return a("ajaxSubmit: skipping submit process - no element selected"),this;var u,l,c,f=this;"function"==typeof t&&(t={success:t}),u=t.type||this.attr2("method"),l=t.url||this.attr2("action"),c="string"==typeof l?e.trim(l):"",c=c||window.location.href||"",c&&(c=(c.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:c,success:e.ajaxSettings.success,type:u||"GET",iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var m={};if(this.trigger("form-pre-serialize",[this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&t.beforeSerialize(this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var p=t.traditional;void 0===p&&(p=e.ajaxSettings.traditional);var d,h=[],v=this.formToArray(t.semantic,h);if(t.data&&(t.extraData=t.data,d=e.param(t.data,p)),t.beforeSubmit&&t.beforeSubmit(v,this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[v,this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var g=e.param(v,p);d&&(g=g?g+"&"+d:d),"GET"==t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+g,t.data=null):t.data=g;var x=[];if(t.resetForm&&x.push(function(){f.resetForm()}),t.clearForm&&x.push(function(){f.clearForm(t.includeHidden)}),!t.dataType&&t.target){var b=t.success||function(){};x.push(function(r){var a=t.replaceTarget?"replaceWith":"html";e(t.target)[a](r).each(b,arguments)})}else t.success&&x.push(t.success);if(t.success=function(e,r,a){for(var n=t.context||this,i=0,o=x.length;o>i;i++)x[i].apply(n,[e,r,a||f,f])},t.error){var y=t.error;t.error=function(e,r,a){var n=t.context||this;y.apply(n,[e,r,a,f])}}if(t.complete){var T=t.complete;t.complete=function(e,r){var a=t.context||this;T.apply(a,[e,r,f])}}var j=e('input[type=file]:enabled[value!=""]',this),w=j.length>0,S="multipart/form-data",k=f.attr("enctype")==S||f.attr("encoding")==S,D=n.fileapi&&n.formdata;a("fileAPI :"+D);var A,E=(w||k)&&!D;t.iframe!==!1&&(t.iframe||E)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){A=s(v)}):A=s(v):A=(w||k)&&D?o(v):e.ajax(t),f.removeData("jqxhr").data("jqxhr",A);for(var L=0;h.length>L;L++)h[L]=null;return this.trigger("form-submit-notify",[this,t]),this},e.fn.ajaxForm=function(n){if(n=n||{},n.delegation=n.delegation&&e.isFunction(e.fn.on),!n.delegation&&0===this.length){var i={s:this.selector,c:this.context};return!e.isReady&&i.s?(a("DOM not ready, queuing ajaxForm"),e(function(){e(i.s,i.c).ajaxForm(n)}),this):(a("terminating; zero elements found by selector"+(e.isReady?"":" (DOM not ready)")),this)}return n.delegation?(e(document).off("submit.form-plugin",this.selector,t).off("click.form-plugin",this.selector,r).on("submit.form-plugin",this.selector,n,t).on("click.form-plugin",this.selector,n,r),this):this.ajaxFormUnbind().bind("submit.form-plugin",n,t).bind("click.form-plugin",n,r)},e.fn.ajaxFormUnbind=function(){return this.unbind("submit.form-plugin click.form-plugin")},e.fn.formToArray=function(t,r){var a=[];if(0===this.length)return a;var i=this[0],o=t?i.getElementsByTagName("*"):i.elements;if(!o)return a;var s,u,l,c,f,m,p;for(s=0,m=o.length;m>s;s++)if(f=o[s],l=f.name,l&&!f.disabled)if(t&&i.clk&&"image"==f.type)i.clk==f&&(a.push({name:l,value:e(f).val(),type:f.type}),a.push({name:l+".x",value:i.clk_x},{name:l+".y",value:i.clk_y}));else if(c=e.fieldValue(f,!0),c&&c.constructor==Array)for(r&&r.push(f),u=0,p=c.length;p>u;u++)a.push({name:l,value:c[u]});else if(n.fileapi&&"file"==f.type){r&&r.push(f);var d=f.files;if(d.length)for(u=0;d.length>u;u++)a.push({name:l,value:d[u],type:f.type});else a.push({name:l,value:"",type:f.type})}else null!==c&&c!==void 0&&(r&&r.push(f),a.push({name:l,value:c,type:f.type,required:f.required}));if(!t&&i.clk){var h=e(i.clk),v=h[0];l=v.name,l&&!v.disabled&&"image"==v.type&&(a.push({name:l,value:h.val()}),a.push({name:l+".x",value:i.clk_x},{name:l+".y",value:i.clk_y}))}return a},e.fn.formSerialize=function(t){return e.param(this.formToArray(t))},e.fn.fieldSerialize=function(t){var r=[];return this.each(function(){var a=this.name;if(a){var n=e.fieldValue(this,t);if(n&&n.constructor==Array)for(var i=0,o=n.length;o>i;i++)r.push({name:a,value:n[i]});else null!==n&&n!==void 0&&r.push({name:this.name,value:n})}}),e.param(r)},e.fn.fieldValue=function(t){for(var r=[],a=0,n=this.length;n>a;a++){var i=this[a],o=e.fieldValue(i,t);null===o||void 0===o||o.constructor==Array&&!o.length||(o.constructor==Array?e.merge(r,o):r.push(o))}return r},e.fieldValue=function(t,r){var a=t.name,n=t.type,i=t.tagName.toLowerCase();if(void 0===r&&(r=!0),r&&(!a||t.disabled||"reset"==n||"button"==n||("checkbox"==n||"radio"==n)&&!t.checked||("submit"==n||"image"==n)&&t.form&&t.form.clk!=t||"select"==i&&-1==t.selectedIndex))return null;if("select"==i){var o=t.selectedIndex;if(0>o)return null;for(var s=[],u=t.options,l="select-one"==n,c=l?o+1:u.length,f=l?o:0;c>f;f++){var m=u[f];if(m.selected){var p=m.value;if(p||(p=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value),l)return p;s.push(p)}}return s}return e(t).val()},e.fn.clearForm=function(t){return this.each(function(){e("input,select,textarea",this).clearFields(t)})},e.fn.clearFields=e.fn.clearInputs=function(t){var r=/^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;return this.each(function(){var a=this.type,n=this.tagName.toLowerCase();r.test(a)||"textarea"==n?this.value="":"checkbox"==a||"radio"==a?this.checked=!1:"select"==n?this.selectedIndex=-1:"file"==a?/MSIE/.test(navigator.userAgent)?e(this).replaceWith(e(this).clone(!0)):e(this).val(""):t&&(t===!0&&/hidden/.test(a)||"string"==typeof t&&e(this).is(t))&&(this.value="")})},e.fn.resetForm=function(){return this.each(function(){("function"==typeof this.reset||"object"==typeof this.reset&&!this.reset.nodeType)&&this.reset()})},e.fn.enable=function(e){return void 0===e&&(e=!0),this.each(function(){this.disabled=!e})},e.fn.selected=function(t){return void 0===t&&(t=!0),this.each(function(){var r=this.type;if("checkbox"==r||"radio"==r)this.checked=t;else if("option"==this.tagName.toLowerCase()){var a=e(this).parent("select");t&&a[0]&&"select-one"==a[0].type&&a.find("option").selected(!1),this.selected=t}})},e.fn.ajaxSubmit.debug=!1})(jQuery);
|
|
|
|
/*!
|
|
* jQuery blockUI plugin
|
|
* Version 2.59.0-2013.04.05
|
|
* @requires jQuery v1.7 or later
|
|
*
|
|
* Examples at: http://malsup.com/jquery/block/
|
|
* Copyright (c) 2007-2013 M. Alsup
|
|
* Dual licensed under the MIT and GPL licenses:
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
* http://www.gnu.org/licenses/gpl.html
|
|
*
|
|
* Thanks to Amir-Hossein Sobhi for some excellent contributions!
|
|
*/
|
|
|
|
;(function() {
|
|
/*jshint eqeqeq:false curly:false latedef:false */
|
|
"use strict";
|
|
|
|
function setup($) {
|
|
$.fn._fadeIn = $.fn.fadeIn;
|
|
|
|
var noOp = $.noop || function() {};
|
|
|
|
// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
|
|
// retarded userAgent strings on Vista)
|
|
var msie = /MSIE/.test(navigator.userAgent);
|
|
var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);
|
|
var mode = document.documentMode || 0;
|
|
var setExpr = $.isFunction( document.createElement('div').style.setExpression );
|
|
|
|
// global $ methods for blocking/unblocking the entire page
|
|
$.blockUI = function(opts) { install(window, opts); };
|
|
$.unblockUI = function(opts) { remove(window, opts); };
|
|
|
|
// convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)
|
|
$.growlUI = function(title, message, timeout, onClose) {
|
|
var $m = $('<div class="growlUI"></div>');
|
|
if (title) $m.append('<h1>'+title+'</h1>');
|
|
if (message) $m.append('<h2>'+message+'</h2>');
|
|
if (timeout === undefined) timeout = 3000;
|
|
$.blockUI({
|
|
message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
|
|
timeout: timeout, showOverlay: false,
|
|
onUnblock: onClose,
|
|
css: $.blockUI.defaults.growlCSS
|
|
});
|
|
};
|
|
|
|
// plugin method for blocking element content
|
|
$.fn.block = function(opts) {
|
|
if ( this[0] === window ) {
|
|
$.blockUI( opts );
|
|
return this;
|
|
}
|
|
var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});
|
|
this.each(function() {
|
|
var $el = $(this);
|
|
if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))
|
|
return;
|
|
$el.unblock({ fadeOut: 0 });
|
|
});
|
|
|
|
return this.each(function() {
|
|
if ($.css(this,'position') == 'static') {
|
|
this.style.position = 'relative';
|
|
$(this).data('blockUI.static', true);
|
|
}
|
|
this.style.zoom = 1; // force 'hasLayout' in ie
|
|
install(this, opts);
|
|
});
|
|
};
|
|
|
|
// plugin method for unblocking element content
|
|
$.fn.unblock = function(opts) {
|
|
if ( this[0] === window ) {
|
|
$.unblockUI( opts );
|
|
return this;
|
|
}
|
|
return this.each(function() {
|
|
remove(this, opts);
|
|
});
|
|
};
|
|
|
|
$.blockUI.version = 2.59; // 2nd generation blocking at no extra cost!
|
|
|
|
// override these in your code to change the default behavior and style
|
|
$.blockUI.defaults = {
|
|
// message displayed when blocking (use null for no message)
|
|
message: '<h1>Please wait...</h1>',
|
|
|
|
title: null, // title string; only used when theme == true
|
|
draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded)
|
|
|
|
theme: false, // set to true to use with jQuery UI themes
|
|
|
|
// styles for the message when blocking; if you wish to disable
|
|
// these and use an external stylesheet then do this in your code:
|
|
// $.blockUI.defaults.css = {};
|
|
css: {
|
|
padding: 0,
|
|
margin: 0,
|
|
width: '30%',
|
|
top: '40%',
|
|
left: '35%',
|
|
textAlign: 'center',
|
|
color: '#000',
|
|
border: '3px solid #aaa',
|
|
backgroundColor:'#fff',
|
|
cursor: 'wait'
|
|
},
|
|
|
|
// minimal style set used when themes are used
|
|
themedCSS: {
|
|
width: '30%',
|
|
top: '40%',
|
|
left: '35%'
|
|
},
|
|
|
|
// styles for the overlay
|
|
overlayCSS: {
|
|
backgroundColor: '#000',
|
|
opacity: 0.6,
|
|
cursor: 'wait'
|
|
},
|
|
|
|
// style to replace wait cursor before unblocking to correct issue
|
|
// of lingering wait cursor
|
|
cursorReset: 'default',
|
|
|
|
// styles applied when using $.growlUI
|
|
growlCSS: {
|
|
width: '350px',
|
|
top: '10px',
|
|
left: '',
|
|
right: '10px',
|
|
border: 'none',
|
|
padding: '5px',
|
|
opacity: 0.6,
|
|
cursor: 'default',
|
|
color: '#fff',
|
|
backgroundColor: '#000',
|
|
'-webkit-border-radius':'10px',
|
|
'-moz-border-radius': '10px',
|
|
'border-radius': '10px'
|
|
},
|
|
|
|
// IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
|
|
// (hat tip to Jorge H. N. de Vasconcelos)
|
|
/*jshint scripturl:true */
|
|
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
|
|
|
|
// force usage of iframe in non-IE browsers (handy for blocking applets)
|
|
forceIframe: false,
|
|
|
|
// z-index for the blocking overlay
|
|
baseZ: 1000,
|
|
|
|
// set these to true to have the message automatically centered
|
|
centerX: true, // <-- only effects element blocking (page block controlled via css above)
|
|
centerY: true,
|
|
|
|
// allow body element to be stetched in ie6; this makes blocking look better
|
|
// on "short" pages. disable if you wish to prevent changes to the body height
|
|
allowBodyStretch: true,
|
|
|
|
// enable if you want key and mouse events to be disabled for content that is blocked
|
|
bindEvents: true,
|
|
|
|
// be default blockUI will supress tab navigation from leaving blocking content
|
|
// (if bindEvents is true)
|
|
constrainTabKey: true,
|
|
|
|
// fadeIn time in millis; set to 0 to disable fadeIn on block
|
|
fadeIn: 200,
|
|
|
|
// fadeOut time in millis; set to 0 to disable fadeOut on unblock
|
|
fadeOut: 400,
|
|
|
|
// time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
|
|
timeout: 0,
|
|
|
|
// disable if you don't want to show the overlay
|
|
showOverlay: true,
|
|
|
|
// if true, focus will be placed in the first available input field when
|
|
// page blocking
|
|
focusInput: true,
|
|
|
|
// suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
|
|
// no longer needed in 2012
|
|
// applyPlatformOpacityRules: true,
|
|
|
|
// callback method invoked when fadeIn has completed and blocking message is visible
|
|
onBlock: null,
|
|
|
|
// callback method invoked when unblocking has completed; the callback is
|
|
// passed the element that has been unblocked (which is the window object for page
|
|
// blocks) and the options that were passed to the unblock call:
|
|
// onUnblock(element, options)
|
|
onUnblock: null,
|
|
|
|
// callback method invoked when the overlay area is clicked.
|
|
// setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.
|
|
onOverlayClick: null,
|
|
|
|
// don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
|
|
quirksmodeOffsetHack: 4,
|
|
|
|
// class name of the message block
|
|
blockMsgClass: 'blockMsg',
|
|
|
|
// if it is already blocked, then ignore it (don't unblock and reblock)
|
|
ignoreIfBlocked: false
|
|
};
|
|
|
|
// private data and functions follow...
|
|
|
|
var pageBlock = null;
|
|
var pageBlockEls = [];
|
|
|
|
function install(el, opts) {
|
|
var css, themedCSS;
|
|
var full = (el == window);
|
|
var msg = (opts && opts.message !== undefined ? opts.message : undefined);
|
|
opts = $.extend({}, $.blockUI.defaults, opts || {});
|
|
|
|
if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))
|
|
return;
|
|
|
|
opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
|
|
css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
|
|
if (opts.onOverlayClick)
|
|
opts.overlayCSS.cursor = 'pointer';
|
|
|
|
themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
|
|
msg = msg === undefined ? opts.message : msg;
|
|
|
|
// remove the current block (if there is one)
|
|
if (full && pageBlock)
|
|
remove(window, {fadeOut:0});
|
|
|
|
// if an existing element is being used as the blocking content then we capture
|
|
// its current place in the DOM (and current display style) so we can restore
|
|
// it when we unblock
|
|
if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
|
|
var node = msg.jquery ? msg[0] : msg;
|
|
var data = {};
|
|
$(el).data('blockUI.history', data);
|
|
data.el = node;
|
|
data.parent = node.parentNode;
|
|
data.display = node.style.display;
|
|
data.position = node.style.position;
|
|
if (data.parent)
|
|
data.parent.removeChild(node);
|
|
}
|
|
|
|
$(el).data('blockUI.onUnblock', opts.onUnblock);
|
|
var z = opts.baseZ;
|
|
|
|
// blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
|
|
// layer1 is the iframe layer which is used to supress bleed through of underlying content
|
|
// layer2 is the overlay layer which has opacity and a wait cursor (by default)
|
|
// layer3 is the message content that is displayed while blocking
|
|
var lyr1, lyr2, lyr3, s;
|
|
if (msie || opts.forceIframe)
|
|
lyr1 = $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>');
|
|
else
|
|
lyr1 = $('<div class="blockUI" style="display:none"></div>');
|
|
|
|
if (opts.theme)
|
|
lyr2 = $('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+ (z++) +';display:none"></div>');
|
|
else
|
|
lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
|
|
|
|
if (opts.theme && full) {
|
|
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:fixed">';
|
|
if ( opts.title ) {
|
|
s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || ' ')+'</div>';
|
|
}
|
|
s += '<div class="ui-widget-content ui-dialog-content"></div>';
|
|
s += '</div>';
|
|
}
|
|
else if (opts.theme) {
|
|
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:absolute">';
|
|
if ( opts.title ) {
|
|
s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || ' ')+'</div>';
|
|
}
|
|
s += '<div class="ui-widget-content ui-dialog-content"></div>';
|
|
s += '</div>';
|
|
}
|
|
else if (full) {
|
|
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+(z+10)+';display:none;position:fixed"></div>';
|
|
}
|
|
else {
|
|
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+(z+10)+';display:none;position:absolute"></div>';
|
|
}
|
|
lyr3 = $(s);
|
|
|
|
// if we have a message, style it
|
|
if (msg) {
|
|
if (opts.theme) {
|
|
lyr3.css(themedCSS);
|
|
lyr3.addClass('ui-widget-content');
|
|
}
|
|
else
|
|
lyr3.css(css);
|
|
}
|
|
|
|
// style the overlay
|
|
if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)
|
|
lyr2.css(opts.overlayCSS);
|
|
lyr2.css('position', full ? 'fixed' : 'absolute');
|
|
|
|
// make iframe layer transparent in IE
|
|
if (msie || opts.forceIframe)
|
|
lyr1.css('opacity',0.0);
|
|
|
|
//$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
|
|
var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);
|
|
$.each(layers, function() {
|
|
this.appendTo($par);
|
|
});
|
|
|
|
if (opts.theme && opts.draggable && $.fn.draggable) {
|
|
lyr3.draggable({
|
|
handle: '.ui-dialog-titlebar',
|
|
cancel: 'li'
|
|
});
|
|
}
|
|
|
|
// ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
|
|
var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);
|
|
if (ie6 || expr) {
|
|
// give body 100% height
|
|
if (full && opts.allowBodyStretch && $.support.boxModel)
|
|
$('html,body').css('height','100%');
|
|
|
|
// fix ie6 issue when blocked element has a border width
|
|
if ((ie6 || !$.support.boxModel) && !full) {
|
|
var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
|
|
var fixT = t ? '(0 - '+t+')' : 0;
|
|
var fixL = l ? '(0 - '+l+')' : 0;
|
|
}
|
|
|
|
// simulate fixed position
|
|
$.each(layers, function(i,o) {
|
|
var s = o[0].style;
|
|
s.position = 'absolute';
|
|
if (i < 2) {
|
|
if (full)
|
|
s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"');
|
|
else
|
|
s.setExpression('height','this.parentNode.offsetHeight + "px"');
|
|
if (full)
|
|
s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"');
|
|
else
|
|
s.setExpression('width','this.parentNode.offsetWidth + "px"');
|
|
if (fixL) s.setExpression('left', fixL);
|
|
if (fixT) s.setExpression('top', fixT);
|
|
}
|
|
else if (opts.centerY) {
|
|
if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
|
|
s.marginTop = 0;
|
|
}
|
|
else if (!opts.centerY && full) {
|
|
var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;
|
|
var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
|
|
s.setExpression('top',expression);
|
|
}
|
|
});
|
|
}
|
|
|
|
// show the message
|
|
if (msg) {
|
|
if (opts.theme)
|
|
lyr3.find('.ui-widget-content').append(msg);
|
|
else
|
|
lyr3.append(msg);
|
|
if (msg.jquery || msg.nodeType)
|
|
$(msg).show();
|
|
}
|
|
|
|
if ((msie || opts.forceIframe) && opts.showOverlay)
|
|
lyr1.show(); // opacity is zero
|
|
if (opts.fadeIn) {
|
|
var cb = opts.onBlock ? opts.onBlock : noOp;
|
|
var cb1 = (opts.showOverlay && !msg) ? cb : noOp;
|
|
var cb2 = msg ? cb : noOp;
|
|
if (opts.showOverlay)
|
|
lyr2._fadeIn(opts.fadeIn, cb1);
|
|
if (msg)
|
|
lyr3._fadeIn(opts.fadeIn, cb2);
|
|
}
|
|
else {
|
|
if (opts.showOverlay)
|
|
lyr2.show();
|
|
if (msg)
|
|
lyr3.show();
|
|
if (opts.onBlock)
|
|
opts.onBlock();
|
|
}
|
|
|
|
// bind key and mouse events
|
|
bind(1, el, opts);
|
|
|
|
if (full) {
|
|
pageBlock = lyr3[0];
|
|
pageBlockEls = $(':input:enabled:visible',pageBlock);
|
|
if (opts.focusInput)
|
|
setTimeout(focus, 20);
|
|
}
|
|
else
|
|
center(lyr3[0], opts.centerX, opts.centerY);
|
|
|
|
if (opts.timeout) {
|
|
// auto-unblock
|
|
var to = setTimeout(function() {
|
|
if (full)
|
|
$.unblockUI(opts);
|
|
else
|
|
$(el).unblock(opts);
|
|
}, opts.timeout);
|
|
$(el).data('blockUI.timeout', to);
|
|
}
|
|
}
|
|
|
|
// remove the block
|
|
function remove(el, opts) {
|
|
var count;
|
|
var full = (el == window);
|
|
var $el = $(el);
|
|
var data = $el.data('blockUI.history');
|
|
var to = $el.data('blockUI.timeout');
|
|
if (to) {
|
|
clearTimeout(to);
|
|
$el.removeData('blockUI.timeout');
|
|
}
|
|
opts = $.extend({}, $.blockUI.defaults, opts || {});
|
|
bind(0, el, opts); // unbind events
|
|
|
|
if (opts.onUnblock === null) {
|
|
opts.onUnblock = $el.data('blockUI.onUnblock');
|
|
$el.removeData('blockUI.onUnblock');
|
|
}
|
|
|
|
var els;
|
|
if (full) // crazy selector to handle odd field errors in ie6/7
|
|
els = $('body').children().filter('.blockUI').add('body > .blockUI');
|
|
else
|
|
els = $el.find('>.blockUI');
|
|
|
|
// fix cursor issue
|
|
if ( opts.cursorReset ) {
|
|
if ( els.length > 1 )
|
|
els[1].style.cursor = opts.cursorReset;
|
|
if ( els.length > 2 )
|
|
els[2].style.cursor = opts.cursorReset;
|
|
}
|
|
|
|
if (full)
|
|
pageBlock = pageBlockEls = null;
|
|
|
|
if (opts.fadeOut) {
|
|
count = els.length;
|
|
els.fadeOut(opts.fadeOut, function() {
|
|
if ( --count === 0)
|
|
reset(els,data,opts,el);
|
|
});
|
|
}
|
|
else
|
|
reset(els, data, opts, el);
|
|
}
|
|
|
|
// move blocking element back into the DOM where it started
|
|
function reset(els,data,opts,el) {
|
|
var $el = $(el);
|
|
els.each(function(i,o) {
|
|
// remove via DOM calls so we don't lose event handlers
|
|
if (this.parentNode)
|
|
this.parentNode.removeChild(this);
|
|
});
|
|
|
|
if (data && data.el) {
|
|
data.el.style.display = data.display;
|
|
data.el.style.position = data.position;
|
|
if (data.parent)
|
|
data.parent.appendChild(data.el);
|
|
$el.removeData('blockUI.history');
|
|
}
|
|
|
|
if ($el.data('blockUI.static')) {
|
|
$el.css('position', 'static'); // #22
|
|
}
|
|
|
|
if (typeof opts.onUnblock == 'function')
|
|
opts.onUnblock(el,opts);
|
|
|
|
// fix issue in Safari 6 where block artifacts remain until reflow
|
|
var body = $(document.body), w = body.width(), cssW = body[0].style.width;
|
|
body.width(w-1).width(w);
|
|
body[0].style.width = cssW;
|
|
}
|
|
|
|
// bind/unbind the handler
|
|
function bind(b, el, opts) {
|
|
var full = el == window, $el = $(el);
|
|
|
|
// don't bother unbinding if there is nothing to unbind
|
|
if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
|
|
return;
|
|
|
|
$el.data('blockUI.isBlocked', b);
|
|
|
|
// don't bind events when overlay is not in use or if bindEvents is false
|
|
if (!full || !opts.bindEvents || (b && !opts.showOverlay))
|
|
return;
|
|
|
|
// bind anchors and inputs for mouse and key events
|
|
var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';
|
|
if (b)
|
|
$(document).bind(events, opts, handler);
|
|
else
|
|
$(document).unbind(events, handler);
|
|
|
|
// former impl...
|
|
// var $e = $('a,:input');
|
|
// b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
|
|
}
|
|
|
|
// event handler to suppress keyboard/mouse events when blocking
|
|
function handler(e) {
|
|
// allow tab navigation (conditionally)
|
|
if (e.keyCode && e.keyCode == 9) {
|
|
if (pageBlock && e.data.constrainTabKey) {
|
|
var els = pageBlockEls;
|
|
var fwd = !e.shiftKey && e.target === els[els.length-1];
|
|
var back = e.shiftKey && e.target === els[0];
|
|
if (fwd || back) {
|
|
setTimeout(function(){focus(back);},10);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
var opts = e.data;
|
|
var target = $(e.target);
|
|
if (target.hasClass('blockOverlay') && opts.onOverlayClick)
|
|
opts.onOverlayClick();
|
|
|
|
// allow events within the message content
|
|
if (target.parents('div.' + opts.blockMsgClass).length > 0)
|
|
return true;
|
|
|
|
// allow events for content that is not being blocked
|
|
return target.parents().children().filter('div.blockUI').length === 0;
|
|
}
|
|
|
|
function focus(back) {
|
|
if (!pageBlockEls)
|
|
return;
|
|
var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
|
|
if (e)
|
|
e.focus();
|
|
}
|
|
|
|
function center(el, x, y) {
|
|
var p = el.parentNode, s = el.style;
|
|
var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
|
|
var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
|
|
if (x) s.left = l > 0 ? (l+'px') : '0';
|
|
if (y) s.top = t > 0 ? (t+'px') : '0';
|
|
}
|
|
|
|
function sz(el, p) {
|
|
return parseInt($.css(el,p),10)||0;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*global define:true */
|
|
if (typeof define === 'function' && define.amd && define.amd.jQuery) {
|
|
define(['jquery'], setup);
|
|
} else {
|
|
setup(jQuery);
|
|
}
|
|
|
|
})(); |