gnu-social/js/jquery.joverlay.js

314 lines
7.2 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.8 (OUT 19, 2009)
* Requires: jQuery 1.3+
*/
(function($) {
// Global vars
var isIE6 = $.browser.msie && $.browser.version == 6.0; // =(
var JOVERLAY_TIMER = null;
$.fn.jOverlay = function(options) {
// Element exist?
if ( $('#jOverlay').length ) {$.closeOverlay();}
// Clear Timer
if (JOVERLAY_TIMER !== null) {
clearTimeout( JOVERLAY_TIMER );
}
// Set Options
var options = $.extend({}, $.fn.jOverlay.options, options || {});
// success deprecated !!! Use onSuccess
var onSuccess = options.onSuccess || options.success;
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)+";'/>" : '';
// private function
function center(id) {
if (options.center) {
$.center(id);
} else if( isIE6 ) {
$.center('#jOverlayContent',{
'top' : $(window).scrollTop() + 'px',
'marginLeft' : '',
'marginTop' : '',
'left' : ''
});
}
}
$('body').prepend(imgLoading + "<div id='jOverlay' />"
+ "<div id='jOverlayContent' style='position:"+position+"; z-index:"+(options.zIndex + 5)+"; display:none;'/>"
);
// Cache options
$('#jOverlayContent').data('options', options);
// 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
'-khtml-opacity' : options.opacity,
'-moz-opacity' : options.opacity,
'zIndex' : options.zIndex,
'width' : !isIE6 ? '100%' : $(window).width() + 'px',
'height' : !isIE6 ? '100%' : $(document).height() + 'px'
}).show();
// INNER HTML
if ( $.trim(options.html) ) {
$(element).html(options.html);
}
// ELEMENT
if ( this.is('*') ) {
$('#jOverlayContent').data('jOverlayElementPrev', this.prev() );
$('#jOverlayContent').html(
this.show().data('display', options.autoHide ? 'none' : this.css('display') )
);
if ( !isImage ) {
center('#jOverlayContent');
$('#jOverlayContent').show();
// Execute callback
if ( !options.url && $.isFunction( onSuccess ) ) {
onSuccess( 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');
center('#jOverlayLoading');
$('#jOverlayLoading').fadeOut(500);
$('#jOverlayContent').show();
// Execute callback
if ( $.isFunction( onSuccess ) ) {
onSuccess( $(element) );
}
}).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( onSuccess ) ) {
onSuccess( 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
if ( options.closeOnEsc ) {
$(document).keydown(function(event){
if ( event.keyCode == 27 ) {
$.closeOverlay();
}
});
} else {
$(document).unbind('keydown');
}
// 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 ( options.timeout && Number(options.timeout) > 0 ) {
JOVERLAY_TIMER = window.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, css) {
var element = $(element);
var elemWidth = element.width();
element.css($.extend({},{
'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%'
}, css || {}));
};
// Options default
$.fn.jOverlay.options = {
'method' : 'GET',
'data' : '',
'url' : '',
'color' : '#000',
'opacity' : '0.6',
'zIndex' : 9999,
'center' : true,
'imgLoading' : '',
'bgClickToClose' : true,
'success' : null, // Deprecated : use onSuccess
'onSuccess' : null,
'timeout' : 0,
'autoHide' : true,
'css' : {},
'html' : '',
'closeOnEsc' : true
};
// Set default options (GLOBAL)
// Overiding the default values.
$.fn.jOverlay.setDefaults = function(options) {
$.fn.jOverlay.options = $.extend({}, $.fn.jOverlay.options, options || {});
};
// Close
$.closeOverlay = function() {
var content = $('#jOverlayContent');
var options = content.data('options');
var elementPrev = content.data('jOverlayElementPrev');
// Fix IE6 (SELECT)
if (isIE6) { $("select").show(); }
// Restore position
if ( elementPrev ) {
var contentChildren = content.children();
elementPrev.after( contentChildren.css('display', contentChildren.data('display') ) );
// Clear cache
contentChildren.removeData('display');
content.removeData('jOverlayElementPrev');
}
// Clear options cache
content.removeData('options');
// Remove joverlay elements
$('#jOverlayLoading, #jOverlayContent, #jOverlay').remove();
};
})(jQuery);