forked from GNUsocial/gnu-social
271 lines
6.0 KiB
JavaScript
271 lines
6.0 KiB
JavaScript
|
/* Copyright (c) 2009 Alvaro A. Lima Jr http://alvarojunior.com/jquery/joverlay.html
|
||
|
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
||
|
* Version: 0.7.1 (JUN 15, 2009)
|
||
|
* Requires: jQuery 1.3+
|
||
|
*/
|
||
|
|
||
|
(function($) {
|
||
|
|
||
|
// Global vars
|
||
|
var isIE6 = $.browser.msie && $.browser.version == 6.0; // =(
|
||
|
var JOVERLAY_TIMER = null;
|
||
|
var JOVERLAY_ELEMENT_PREV = null;
|
||
|
|
||
|
$.fn.jOverlay = function(options) {
|
||
|
|
||
|
// Element exist?
|
||
|
if ( $('#jOverlay').length ) {$.closeOverlay();}
|
||
|
|
||
|
// Clear Element Prev
|
||
|
JOVERLAY_ELEMENT_PREV = null;
|
||
|
|
||
|
// Clear Timer
|
||
|
if (JOVERLAY_TIMER !== null) {
|
||
|
clearTimeout( JOVERLAY_TIMER );
|
||
|
}
|
||
|
|
||
|
// Set Options
|
||
|
var options = $.extend({}, $.fn.jOverlay.options, options);
|
||
|
|
||
|
// private function
|
||
|
function center(id) {
|
||
|
if (options.center) {
|
||
|
$.center(id);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var element = this.is('*') ? this : '#jOverlayContent';
|
||
|
var position = isIE6 ? 'absolute' : 'fixed';
|
||
|
var isImage = /([^\/\\]+)\.(png|gif|jpeg|jpg|bmp)$/i.test( options.url );
|
||
|
|
||
|
var imgLoading = options.imgLoading ? "<img id='jOverlayLoading' src='"+options.imgLoading+"' style='position:"+position+"; z-index:"+(options.zIndex + 9)+";'/>" : '';
|
||
|
|
||
|
$('body').prepend(imgLoading + "<div id='jOverlay' />"
|
||
|
+ "<div id='jOverlayContent' style='position:"+position+"; z-index:"+(options.zIndex + 5)+"; display:none;'/>"
|
||
|
);
|
||
|
|
||
|
// Loading Centered
|
||
|
$('#jOverlayLoading').load(function(){
|
||
|
center(this);
|
||
|
});
|
||
|
|
||
|
//IE 6 FIX
|
||
|
if ( isIE6 ) {
|
||
|
$('select').hide();
|
||
|
$('#jOverlayContent select').show();
|
||
|
}
|
||
|
|
||
|
// Overlay Style
|
||
|
$('#jOverlay').css({
|
||
|
backgroundColor : options.color,
|
||
|
position : position,
|
||
|
top : '0px',
|
||
|
left : '0px',
|
||
|
filter : 'alpha(opacity='+ (options.opacity * 100) +')', // IE =(
|
||
|
opacity : options.opacity, // Good Browser =D
|
||
|
zIndex : options.zIndex,
|
||
|
width : !isIE6 ? '100%' : $(window).width() + 'px',
|
||
|
height : !isIE6 ? '100%' : $(document).height() + 'px'
|
||
|
}).show();
|
||
|
|
||
|
// ELEMENT
|
||
|
if ( this.is('*') ) {
|
||
|
|
||
|
JOVERLAY_ELEMENT_PREV = this.prev();
|
||
|
|
||
|
$('#jOverlayContent').html(
|
||
|
this.show().attr('display', options.autoHide ? 'none' : this.css('display') )
|
||
|
);
|
||
|
|
||
|
if ( !isImage ) {
|
||
|
|
||
|
center('#jOverlayContent');
|
||
|
|
||
|
$('#jOverlayContent').show();
|
||
|
|
||
|
// Execute callback
|
||
|
if ( !options.url && $.isFunction( options.success ) ) {
|
||
|
options.success( this );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// IMAGE
|
||
|
if ( isImage ) {
|
||
|
|
||
|
$('<img/>').load(function(){
|
||
|
var resize = $.resize(this.width, this.height);
|
||
|
|
||
|
$(this).css({
|
||
|
width : resize.width,
|
||
|
height : resize.height
|
||
|
});
|
||
|
|
||
|
$( element ).html(this);
|
||
|
|
||
|
center('#jOverlayContent');
|
||
|
|
||
|
$('#jOverlayLoading').fadeOut(500);
|
||
|
$('#jOverlayContent').show();
|
||
|
|
||
|
// Execute callback
|
||
|
if ( $.isFunction( options.success ) ) {
|
||
|
options.success( this );
|
||
|
}
|
||
|
|
||
|
}).error(function(){
|
||
|
alert('Image ('+options.url+') not found.');
|
||
|
$.closeOverlay();
|
||
|
}).attr({'src' : options.url, 'alt' : options.url});
|
||
|
|
||
|
}
|
||
|
|
||
|
// AJAX
|
||
|
if ( options.url && !isImage ) {
|
||
|
|
||
|
$.ajax({
|
||
|
type: options.method,
|
||
|
data: options.data,
|
||
|
url: options.url,
|
||
|
success: function(responseText) {
|
||
|
|
||
|
$('#jOverlayLoading').fadeOut(500);
|
||
|
|
||
|
$( element ).html(responseText).show();
|
||
|
|
||
|
center('#jOverlayContent');
|
||
|
|
||
|
// Execute callback
|
||
|
if ($.isFunction( options.success )) {
|
||
|
options.success(responseText);
|
||
|
}
|
||
|
|
||
|
},
|
||
|
error : function() {
|
||
|
alert('URL ('+options.url+') not found.');
|
||
|
$.closeOverlay();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
}
|
||
|
|
||
|
// :(
|
||
|
if ( isIE6 ) {
|
||
|
|
||
|
// Window scroll
|
||
|
$(window).scroll(function(){
|
||
|
center('#jOverlayContent');
|
||
|
});
|
||
|
|
||
|
// Window resize
|
||
|
$(window).resize(function(){
|
||
|
|
||
|
$('#jOverlay').css({
|
||
|
width: $(window).width() + 'px',
|
||
|
height: $(document).height() + 'px'
|
||
|
});
|
||
|
|
||
|
center('#jOverlayContent');
|
||
|
|
||
|
});
|
||
|
|
||
|
}
|
||
|
|
||
|
// Press ESC to close
|
||
|
$(document).keydown(function(event){
|
||
|
if (event.keyCode == 27) {
|
||
|
$.closeOverlay();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Click to close
|
||
|
if ( options.bgClickToClose ) {
|
||
|
$('#jOverlay').click($.closeOverlay);
|
||
|
}
|
||
|
|
||
|
// Timeout (auto-close)
|
||
|
// time in millis to wait before auto-close
|
||
|
// set to 0 to disable
|
||
|
if ( Number(options.timeout) > 0 ) {
|
||
|
jOverlayTimer = setTimeout( $.closeOverlay, Number(options.timeout) );
|
||
|
}
|
||
|
|
||
|
// ADD CSS
|
||
|
$('#jOverlayContent').css(options.css || {});
|
||
|
};
|
||
|
|
||
|
// Resizing large images - orginal by Christian Montoya.
|
||
|
// Edited by - Cody Lindley (http://www.codylindley.com) (Thickbox 3.1)
|
||
|
$.resize = function(imageWidth, imageHeight) {
|
||
|
var x = $(window).width() - 150;
|
||
|
var y = $(window).height() - 150;
|
||
|
if (imageWidth > x) {
|
||
|
imageHeight = imageHeight * (x / imageWidth);
|
||
|
imageWidth = x;
|
||
|
if (imageHeight > y) {
|
||
|
imageWidth = imageWidth * (y / imageHeight);
|
||
|
imageHeight = y;
|
||
|
}
|
||
|
} else if (imageHeight > y) {
|
||
|
imageWidth = imageWidth * (y / imageHeight);
|
||
|
imageHeight = y;
|
||
|
if (imageWidth > x) {
|
||
|
imageHeight = imageHeight * (x / imageWidth);
|
||
|
imageWidth = x;
|
||
|
}
|
||
|
}
|
||
|
return {width:imageWidth, height:imageHeight};
|
||
|
};
|
||
|
|
||
|
// Centered Element
|
||
|
$.center = function(element) {
|
||
|
var element = $(element);
|
||
|
var elemWidth = element.width();
|
||
|
|
||
|
element.css({
|
||
|
width : elemWidth + 'px',
|
||
|
marginLeft : '-' + (elemWidth / 2) + 'px',
|
||
|
marginTop : '-' + element.height() / 2 + 'px',
|
||
|
height : 'auto',
|
||
|
top : !isIE6 ? '50%' : $(window).scrollTop() + ($(window).height() / 2) + 'px',
|
||
|
left : '50%'
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Options default
|
||
|
$.fn.jOverlay.options = {
|
||
|
method : 'GET',
|
||
|
data : '',
|
||
|
url : '',
|
||
|
color : '#000',
|
||
|
opacity : '0.6',
|
||
|
zIndex : 9999,
|
||
|
center : true,
|
||
|
imgLoading : '',
|
||
|
bgClickToClose : true,
|
||
|
success : null,
|
||
|
timeout : 0,
|
||
|
autoHide : true,
|
||
|
css : {}
|
||
|
};
|
||
|
|
||
|
// Close
|
||
|
$.closeOverlay = function() {
|
||
|
|
||
|
if (isIE6) { $("select").show(); }
|
||
|
|
||
|
if ( JOVERLAY_ELEMENT_PREV !== null ) {
|
||
|
if ( JOVERLAY_ELEMENT_PREV !== null ) {
|
||
|
var element = $('#jOverlayContent').children();
|
||
|
JOVERLAY_ELEMENT_PREV.after( element.css('display', element.attr('display') ) );
|
||
|
element.removeAttr('display');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$('#jOverlayLoading, #jOverlayContent, #jOverlay').remove();
|
||
|
|
||
|
};
|
||
|
|
||
|
})(jQuery);
|