
(function($) { 
	$.tools = $.tools || {version: {}};
$.tools.version.expose = '1.0.3';
function getWidth() {
var w = $(window).width();
if ($.browser.mozilla) { return w; }
var x;
if (window.innerHeight && window.scrollMaxY) {
x = window.innerWidth + window.scrollMaxX; 
 } else if (document.body.scrollHeight > document.body.offsetHeight) {
x = document.body.scrollWidth;
} else {
x = document.body.offsetWidth;
}
return x < w ? x + 20 : w; 
}
function Expose(els, opts) {
 var self = this, mask = null, loaded = false, origIndex = 0; 
 function bind(name, fn) {
$(self).bind(name, function(e, args) {
if (fn && fn.call(this) === false && args) {
args.proceed = false;
}
}); 
return self;
}
 $.each(opts, function(name, fn) {
if ($.isFunction(fn)) { bind(name, fn); }
});
 $(window).bind("resize.expose", function() {
if (mask) {
mask.css({ width: getWidth(), height: $(document).height()});
}
});
 $.extend(this, {
getMask: function() {
return mask;
},
getExposed: function() {
return els;
},
getConf: function() {
return opts;
}, 
isLoaded: function() {
return loaded;
},
load: function() {
 if (loaded) { return self;	}
origIndex = els.eq(0).css("zIndex"); 
 if (opts.maskId) { mask = $("#" + opts.maskId);	}
if (!mask || !mask.length) {
mask = $('<div/>').css({ 
position:'absolute',
top:0,
left:0,
width: getWidth(),
height: $(document).height(),
display:'none',
opacity: 0, 
zIndex:opts.zIndex
}); 
 if (opts.maskId) { mask.attr("id", opts.maskId); } 
$("body").append(mask);
 var bg = mask.css("backgroundColor");
if (!bg || bg == 'transparent' || bg == 'rgba(0, 0, 0, 0)') {
mask.css("backgroundColor", opts.color);
} 
 if (opts.closeOnEsc) { 
$(document).bind("keydown.unexpose", function(evt) { 
if (evt.keyCode == 27) {
self.close();
} 
}); 
}
 if (opts.closeOnClick) {
mask.bind("click.unexpose", function() {
self.close(); 
}); 
} 
} 
 var p = {proceed: true};
$(self).trigger("onBeforeLoad", p); 
if (!p.proceed) { return self; }
 $.each(els, function() {
var el = $(this);
if (!/relative|absolute|fixed/i.test(el.css("position"))) {
el.css("position", "relative"); 
} 
});
 els.css({zIndex:opts.zIndex + 1}); 
 var h = mask.height();
if (!this.isLoaded()) { 
mask.css({opacity: 0, display: 'block'}).fadeTo(opts.loadSpeed, opts.opacity, function() {
 if (mask.height() != h) { mask.css("height", h); } 
$(self).trigger("onLoad"); 
}); 
}
loaded = true;
return self;
},
close: function() {
if (!loaded) { return self; } 
var p = {proceed: true};
$(self).trigger("onBeforeClose", p); 
if (p.proceed === false) { return self; }
mask.fadeOut(opts.closeSpeed, function() {
$(self).trigger("onClose");
els.css({zIndex: $.browser.msie ? origIndex : null});
}); 
loaded = false;
return self;
},
onBeforeLoad: function(fn) {
return bind("onBeforeLoad", fn); 
},
onLoad: function(fn) {
return bind("onLoad", fn); 
},
onBeforeClose: function(fn) {
return bind("onBeforeClose", fn); 
},
onClose: function(fn) {
return bind("onClose", fn); 
}
});
}
	$.fn.expose = function(conf) {
var el = this.eq(typeof conf == 'number' ? conf : 0).data("expose");
if (el) { return el; }
var opts = {
 
 maskId: null,
loadSpeed: 'slow',
closeSpeed: 'fast',
closeOnClick: true,
closeOnEsc: true,
 zIndex: 9998,
opacity: 0.8,
color: '#456',
api: false
};
if (typeof conf == 'string') {
conf = {color: conf};
}
$.extend(opts, conf); 
 this.each(function() {
el = new Expose($(this), opts);
$(this).data("expose", el); 
}); 
return opts.api ? el: this; 
}; 
})(jQuery);
