(function($) {
$.blockUI = function(msg, css) {
$.blockUI.impl.install(window, msg, css);
};
$.unblockUI = function() {
$.blockUI.impl.remove(window);
};
$.fn.block = function(msg, css) {
return this.each(function() {
if (!this.$pos_checked) {
if ($.css(this,"position") == 'static')
this.style.position = 'relative';
if ($.browser.msie) this.style.zoom = 1; // force 'hasLayout' in IE
this.$pos_checked = 1;
}
$.blockUI.impl.install(this, msg, css);
});
};
$.fn.unblock = function() {
return this.each(function() {
$.blockUI.impl.remove(this);
});
};
// override these in your code to change the default messages and styles
$.blockUI.defaults = {
// the message displayed when blocking the entire page
pageMessage: '
Cargando...
',
// the message displayed when blocking an element
elementMessage: '', // none
// styles for the overlay iframe
overlayCSS: { backgroundColor: '#000', opacity: '0.6' },
// styles for the message when blocking the entire page
pageMessageCSS: { width:'250px', margin:'-50px 0 0 -125px', top:'50%', left:'50%', textAlign:'center', color:'#fff', backgroundColor:'#101010', border:'1px solid #A33901' },
// styles for the message when blocking an element
elementMessageCSS: { width:'250px', padding:'10px', textAlign:'center', backgroundColor:'#fff'},
// allow body element to be stetched in ie6
ie6Stretch: 1
};
// the gory details
$.blockUI.impl = {
pageBlock: null,
op8: window.opera && window.opera.version() < 9,
ffLinux: $.browser.mozilla && /Linux/.test(navigator.platform),
ie6: $.browser.msie && typeof XMLHttpRequest == 'function',
install: function(el, msg, css) {
var full = (el == window), noalpha = this.op8 || this.ffLinux;
if (full && this.pageBlock) this.remove(window);
// check to see if we were only passed the css object (a literal)
if (msg && typeof msg == 'object' && !msg.jquery && !msg.nodeType) {
css = msg;
msg = null;
}
msg = msg ? (msg.nodeType ? $(msg) : msg) : full ? $.blockUI.defaults.pageMessage : $.blockUI.defaults.elementMessage;
var basecss = jQuery.extend({}, full ? $.blockUI.defaults.pageMessageCSS : $.blockUI.defaults.elementMessageCSS);
css = jQuery.extend(basecss, css || {});
var f = ($.browser.msie) ? $('')
: $('');
var w = $('');
var m = full ? $('')
: $('');
w.css('position', full ? 'fixed' : 'absolute');
if (msg) m.css(css);
if (!noalpha) w.css($.blockUI.defaults.overlayCSS);
if (this.op8) w.css({ width:''+el.clientWidth,height:''+el.clientHeight }); // lame
if ($.browser.msie) f.css('opacity','0.0');
$([f[0],w[0],m[0]]).appendTo(full ? 'body' : el);
if (full) this.pageBlock = m[0];
// ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
var expr = $.browser.msie && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
if (this.ie6 || expr) {
// stretch content area if it's short
if (full && $.blockUI.defaults.ie6Stretch && $.boxModel)
$('html,body').css('height','100%');
// fix ie6 problem when blocked element has a border width
if ((this.ie6 || !$.boxModel) && !full) {
var t = this.sz(el,'borderTopWidth'), l = this.sz(el,'borderLeftWidth');
var fixT = t ? '(0 - '+t+')' : 0;
var fixL = l ? '(0 - '+l+')' : 0;
}
// simulate fixed position
$.each([f,w,m], function(i,o) {
var s = o[0].style;
s.position = 'absolute';
if (i < 2) {
full ? s.setExpression('height','document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + "px"')
: s.setExpression('height','this.parentNode.offsetHeight + "px"');
full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
: s.setExpression('width','this.parentNode.offsetWidth + "px"');
if (fixL) s.setExpression('left', fixL);
if (fixT) s.setExpression('top', fixT);
}
else {
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;
}
});
}
this.bind(1, el);
m.append(msg).show();
if (msg.jquery) msg.show();
full ? setTimeout(this.focus, 200): this.center(m[0]);
},
remove: function(el) {
this.bind(0, el);
var full = el == window;
if (full) {
$('body').children().filter('.blockUI').remove();
this.pageBlock = null;
}
else $('.blockUI', el).remove();
},
// event handler to suppress keyboard/mouse events when blocking
handler: function(e) {
if (e.keyCode && e.keyCode == 9) return true;
if ($(e.target).parents('div.blockMsg').length > 0)
return true;
return $(e.target).parents().children().filter('div.blockUI').length == 0;
},
// bind/unbind the handler
bind: function(b, el) {
var full = el == window;
// don't bother unbinding if there is nothing to unbind
if (!b && (full && !this.pageBlock || !full && !el.$blocked)) return;
if (!full) el.$blocked = b;
var $e = full ? $() : $(el).find('a,:input');
$.each(['mousedown','mouseup','keydown','keypress','keyup','click'], function(i,o) {
$e[b?'bind':'unbind'](o, $.blockUI.impl.handler);
});
},
focus: function() {
if (!$.blockUI.impl.pageBlock) return;
var v = $(':input:visible:enabled', $.blockUI.impl.pageBlock)[0];
if (v) v.focus();
},
center: function(el) {
var p = el.parentNode, s = el.style;
var l = ((p.offsetWidth - el.offsetWidth)/2) - this.sz(p,'borderLeftWidth');
var t = ((p.offsetHeight - el.offsetHeight)/2) - this.sz(p,'borderTopWidth');
s.left = l > 0 ? (l+'px') : '0';
s.top = t > 0 ? (t+'px') : '0';
},
sz: function(el, p) { return parseInt($.css(el,p))||0; }
};
})(jQuery);