0,0 → 1,1709 |
/* |
* nyroModal - jQuery Plugin |
* http://nyromodal.nyrodev.com |
* |
* Copyright (c) 2010 Cedric Nirousset (nyrodev.com) |
* Licensed under the MIT license |
* |
* $Date: 2010-02-23 (Tue, 23 Feb 2010) $ |
* $version: 1.6.2+jquery1.8fix+bindfix+ff2fix |
*/ |
jQuery(function($) { |
|
// ------------------------------------------------------- |
// Private Variables |
// ------------------------------------------------------- |
|
var userAgent = navigator.userAgent.toLowerCase(); |
var browserVersion = (userAgent.match(/.+(?:rv|webkit|khtml|opera|msie)[\/: ]([\d.]+)/ ) || [0,'0'])[1]; |
|
var isIE6 = (/msie/.test(userAgent) && !/opera/.test(userAgent) && parseInt(browserVersion) < 7 && (!window.XMLHttpRequest || typeof(XMLHttpRequest) === 'function')); |
var body = $('body'); |
|
var currentSettings; |
var callingSettings; |
|
var shouldResize = false; |
|
var gallery = {}; |
|
// To know if the fix for the Issue 10 should be applied (or has been applied) |
var fixFF = false; |
|
// Used for retrieve the content from an hidden div |
var contentElt; |
var contentEltLast; |
|
// Contains info about nyroModal state and all div references |
var modal = { |
started: false, |
ready: false, |
dataReady: false, |
anim: false, |
animContent: false, |
loadingShown: false, |
transition: false, |
resizing: false, |
closing: false, |
error: false, |
blocker: null, |
blockerVars: null, |
full: null, |
bg: null, |
loading: null, |
tmp: null, |
content: null, |
wrapper: null, |
contentWrapper: null, |
scripts: new Array(), |
scriptsShown: new Array() |
}; |
|
// Indicate of the height or the width was resized, to reinit the currentsettings related to null |
var resized = { |
width: false, |
height: false, |
windowResizing: false |
}; |
|
var initSettingsSize = { |
width: null, |
height: null, |
windowResizing: true |
}; |
|
var windowResizeTimeout; |
|
|
// ------------------------------------------------------- |
// Public function |
// ------------------------------------------------------- |
|
// jQuery extension function. A paramater object could be used to overwrite the default settings |
$.fn.nyroModal = function(settings) { |
if (!this) |
return false; |
return this.each(function() { |
var me = $(this); |
if (this.nodeName.toLowerCase() == 'form') { |
me |
.off('submit.nyroModal') |
.on('submit.nyroModal', function(e) { |
if(e.isDefaultPrevented()) |
return false; |
if (me.data('nyroModalprocessing')) |
return true; |
if (this.enctype == 'multipart/form-data') { |
processModal($.extend(settings, { |
from: this |
})); |
return true; |
} |
e.preventDefault(); |
processModal($.extend(settings, { |
from: this |
})); |
return false; |
}); |
} else { |
me |
.off('click.nyroModal') |
.on('click.nyroModal', function(e) { |
if(e.isDefaultPrevented()) |
return false; |
e.preventDefault(); |
processModal($.extend(settings, { |
from: this |
})); |
return false; |
}); |
} |
}); |
}; |
|
// jQuery extension function to call manually the modal. A paramater object could be used to overwrite the default settings |
$.fn.nyroModalManual = function(settings) { |
if (!this.length) |
processModal(settings); |
return this.each(function(){ |
processModal($.extend(settings, { |
from: this |
})); |
}); |
}; |
|
$.nyroModalManual = function(settings) { |
processModal(settings); |
}; |
|
// Update the current settings |
// object settings |
// string deep1 first key where overwrite the settings |
// string deep2 second key where overwrite the settings |
$.nyroModalSettings = function(settings, deep1, deep2) { |
setCurrentSettings(settings, deep1, deep2); |
if (!deep1 && modal.started) { |
if (modal.bg && settings.bgColor) |
currentSettings.updateBgColor(modal, currentSettings, function(){}); |
|
if (modal.contentWrapper && settings.title) |
setTitle(); |
|
if (!modal.error && (settings.windowResizing || (!modal.resizing && (('width' in settings && settings.width == currentSettings.width) || ('height' in settings && settings.height == currentSettings.height))))) { |
modal.resizing = true; |
if (modal.contentWrapper) |
calculateSize(true); |
if (modal.contentWrapper && modal.contentWrapper.is(':visible') && !modal.animContent) { |
if (fixFF) |
modal.content.css({position: ''}); |
currentSettings.resize(modal, currentSettings, function() { |
currentSettings.windowResizing = false; |
modal.resizing = false; |
if (fixFF) |
modal.content.css({position: 'fixed'}); |
if ($.isFunction(currentSettings.endResize)) |
currentSettings.endResize(modal, currentSettings); |
}); |
} |
} |
} |
}; |
|
// Remove the modal function |
$.nyroModalRemove = function() { |
removeModal(); |
}; |
|
// Go to the next image for a gallery |
// return false if nothing was done |
$.nyroModalNext = function() { |
var link = getGalleryLink(1); |
if (link) |
return link.nyroModalManual(getCurrentSettingsNew()); |
return false; |
}; |
|
// Go to the previous image for a gallery |
// return false if nothing was done |
$.nyroModalPrev = function() { |
var link = getGalleryLink(-1); |
if (link) |
return link.nyroModalManual(getCurrentSettingsNew()); |
return false; |
}; |
|
|
// ------------------------------------------------------- |
// Default Settings |
// ------------------------------------------------------- |
|
$.fn.nyroModal.settings = { |
debug: false, // Show the debug in the background |
|
blocker: false, // Element which will be blocked by the modal |
|
windowResize: true, // indicates if the modal should resize when the window is resized |
|
modal: false, // Esc key or click backgrdound enabling or not |
|
type: '', // nyroModal type (form, formData, iframe, image, etc...) |
forceType: null, // Used to force the type |
from: '', // Dom object where the call come from |
hash: '', // Eventual hash in the url |
|
processHandler: null, // Handler just before the real process |
|
selIndicator: 'nyroModalSel', // Value added when a form or Ajax is sent with a filter content |
|
formIndicator: 'nyroModal', // Value added when a form is sent |
|
content: null, // Raw content if type content is used |
|
bgColor: '#000000', // Background color |
|
ajax: {}, // Ajax option (url, data, type, success will be overwritten for a form, url and success only for an ajax call) |
|
swf: { // Swf player options if swf type is used. |
wmode: 'transparent' |
}, |
|
width: null, // default Width If null, will be calculate automatically |
height: null, // default Height If null, will be calculate automatically |
|
minWidth: 400, // Minimum width |
minHeight: 300, // Minimum height |
|
resizable: true, // Indicate if the content is resizable. Will be set to false for swf |
autoSizable: true, // Indicate if the content is auto sizable. If not, the min size will be used |
|
padding: 25, // padding for the max modal size |
|
regexImg: '[^\.]\.(jpg|jpeg|png|tiff|gif|bmp)\s*$', // Regex to find images |
addImageDivTitle: false, // Indicate if the div title should be inserted |
defaultImgAlt: 'Image', // Default alt attribute for the images |
setWidthImgTitle: true, // Set the width to the image title |
ltr: true, // Left to Right by default. Put to false for Hebrew or Right to Left language |
|
gallery: null, // Gallery name if provided |
galleryLinks: '<a href="#" class="nyroModalPrev">Prev</a><a href="#" class="nyroModalNext">Next</a>', // Use .nyroModalPrev and .nyroModalNext to set the navigation link |
galleryCounts: galleryCounts, // Callback to show the gallery count |
galleryLoop: false, // Indicate if the gallery should loop |
|
zIndexStart: 100, |
|
cssOpt: { // Default CSS option for the nyroModal Div. Some will be overwritten or updated when using IE6 |
bg: { |
position: 'absolute', |
overflow: 'hidden', |
top: 0, |
left: 0, |
height: '100%', |
width: '100%' |
}, |
wrapper: { |
position: 'absolute', |
top: '50%', |
left: '50%' |
}, |
wrapper2: { |
}, |
content: { |
}, |
loading: { |
position: 'absolute', |
top: '50%', |
left: '50%', |
marginTop: '-50px', |
marginLeft: '-50px' |
} |
}, |
|
wrap: { // Wrapper div used to style the modal regarding the content type |
div: '<div class="wrapper"></div>', |
ajax: '<div class="wrapper"></div>', |
form: '<div class="wrapper"></div>', |
formData: '<div class="wrapper"></div>', |
image: '<div class="wrapperImg"></div>', |
swf: '<div class="wrapperSwf"></div>', |
iframe: '<div class="wrapperIframe"></div>', |
iframeForm: '<div class="wrapperIframe"></div>', |
manual: '<div class="wrapper"></div>' |
}, |
|
closeButton: '<a href="#" class="nyroModalClose" id="closeBut" title="close"></a>', // Adding automaticly as the first child of #nyroModalWrapper |
|
title: null, // Modal title |
titleFromIframe: true, // When using iframe in the same domain, try to get the title from it |
|
openSelector: '.nyroModal', // selector for open a new modal. will be used to parse automaticly at page loading |
closeSelector: '.nyroModalClose', // selector to close the modal |
|
contentLoading: '<a href="#" class="nyroModalClose">Cancel</a>', // Loading div content |
|
errorClass: 'error', // CSS Error class added to the loading div in case of error |
contentError: 'The requested content cannot be loaded.<br />Please try again later.<br /><a href="#" class="nyroModalClose">Close</a>', // Content placed in the loading div in case of error |
|
handleError: null, // Callback in case of error |
|
showBackground: showBackground, // Show background animation function |
hideBackground: hideBackground, // Hide background animation function |
|
endFillContent: null, // Will be called after filling and wraping the content, before parsing closeSelector and openSelector and showing the content |
showContent: showContent, // Show content animation function |
endShowContent: null, // Will be called once the content is shown |
beforeHideContent: null, // Will be called just before the modal closing |
hideContent: hideContent, // Hide content animation function |
|
showTransition: showTransition, // Show the transition animation (a modal is already shown and a new one is requested) |
hideTransition: hideTransition, // Hide the transition animation to show the content |
|
showLoading: showLoading, // show loading animation function |
hideLoading: hideLoading, // hide loading animation function |
|
resize: resize, // Resize animation function |
endResize: null, // Will be called one the content is resized |
|
updateBgColor: updateBgColor, // Change background color animation function |
|
endRemove: null // Will be called once the modal is totally gone |
}; |
|
// ------------------------------------------------------- |
// Private function |
// ------------------------------------------------------- |
|
// Main function |
function processModal(settings) { |
if (modal.loadingShown || modal.transition || modal.anim) |
return; |
debug('processModal'); |
modal.started = true; |
callingSettings = $.extend(true, settings); |
setDefaultCurrentSettings(settings); |
if (!modal.full) |
modal.blockerVars = modal.blocker = null; |
modal.error = false; |
modal.closing = false; |
modal.dataReady = false; |
modal.scripts = new Array(); |
modal.scriptsShown = new Array(); |
|
currentSettings.type = fileType(); |
if (currentSettings.forceType) { |
if (!currentSettings.content) |
currentSettings.from = true; |
currentSettings.type = currentSettings.forceType; |
currentSettings.forceType = null; |
} |
|
if ($.isFunction(currentSettings.processHandler)) |
currentSettings.processHandler(currentSettings); |
|
var from = currentSettings.from; |
var url = currentSettings.url; |
|
initSettingsSize.width = currentSettings.width; |
initSettingsSize.height = currentSettings.height; |
|
if (currentSettings.type == 'swf') { |
// Swf is transforming as a raw content |
setCurrentSettings({overflow: 'visible'}, 'cssOpt', 'content'); |
currentSettings.content = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+currentSettings.width+'" height="'+currentSettings.height+'"><param name="movie" value="'+url+'"></param>'; |
var tmp = ''; |
$.each(currentSettings.swf, function(name, val) { |
currentSettings.content+= '<param name="'+name+'" value="'+val+'"></param>'; |
tmp+= ' '+name+'="'+val+'"'; |
}); |
currentSettings.content+= '<embed src="'+url+'" type="application/x-shockwave-flash" width="'+currentSettings.width+'" height="'+currentSettings.height+'"'+tmp+'></embed></object>'; |
} |
|
if (from) { |
var jFrom = $(from).blur(); |
if (currentSettings.type == 'form') { |
var data = $(from).serializeArray(); |
data.push({name: currentSettings.formIndicator, value: 1}); |
if (currentSettings.selector) |
data.push({name: currentSettings.selIndicator, value: currentSettings.selector.substring(1)}); |
showModal(); |
$.ajax($.extend({}, currentSettings.ajax, { |
url: url, |
data: data, |
type: jFrom.attr('method') ? jFrom.attr('method') : 'get', |
success: ajaxLoaded, |
error: loadingError |
})); |
debug('Form Ajax Load: '+jFrom.attr('action')); |
} else if (currentSettings.type == 'formData') { |
// Form with data. We're using a hidden iframe |
initModal(); |
jFrom.attr('target', 'nyroModalIframe'); |
jFrom.attr('action', url); |
jFrom.prepend('<input type="hidden" name="'+currentSettings.formIndicator+'" value="1" />'); |
if (currentSettings.selector) |
jFrom.prepend('<input type="hidden" name="'+currentSettings.selIndicator+'" value="'+currentSettings.selector.substring(1)+'" />'); |
modal.tmp.html('<iframe frameborder="0" hspace="0" name="nyroModalIframe" src="javascript:\'\';"></iframe>'); |
$('iframe', modal.tmp) |
.css({ |
width: currentSettings.width, |
height: currentSettings.height |
}) |
.error(loadingError) |
.load(formDataLoaded); |
debug('Form Data Load: '+jFrom.attr('action')); |
showModal(); |
showContentOrLoading(); |
} else if (currentSettings.type == 'image') { |
debug('Image Load: '+url); |
var title = jFrom.attr('title') || currentSettings.defaultImgAlt; |
initModal(); |
modal.tmp.html('<img id="nyroModalImg" />').find('img').attr('alt', title); |
modal.tmp.css({lineHeight: 0}); |
$('img', modal.tmp) |
.error(loadingError) |
.load(function() { |
debug('Image Loaded: '+this.src); |
$(this).off('load'); |
var w = modal.tmp.width(); |
var h = modal.tmp.height(); |
modal.tmp.css({lineHeight: ''}); |
resized.width = w; |
resized.height = h; |
setCurrentSettings({ |
width: w, |
height: h, |
imgWidth: w, |
imgHeight: h |
}); |
initSettingsSize.width = w; |
initSettingsSize.height = h; |
setCurrentSettings({overflow: 'visible'}, 'cssOpt', 'content'); |
modal.dataReady = true; |
if (modal.loadingShown || modal.transition) |
showContentOrLoading(); |
}) |
.attr('src', url); |
showModal(); |
} else if (currentSettings.type == 'iframeForm') { |
initModal(); |
modal.tmp.html('<iframe frameborder="0" hspace="0" src="javascript:\'\';" name="nyroModalIframe" id="nyroModalIframe"></iframe>'); |
debug('Iframe Form Load: '+url); |
$('iframe', modal.tmp).eq(0) |
.css({ |
width: '100%', |
height: $.support.boxModel? '99%' : '100%' |
}) |
.load(iframeLoaded); |
modal.dataReady = true; |
showModal(); |
} else if (currentSettings.type == 'iframe') { |
initModal(); |
modal.tmp.html('<iframe frameborder="0" hspace="0" src="javascript:\'\';" name="nyroModalIframe" id="nyroModalIframe"></iframe>'); |
debug('Iframe Load: '+url); |
$('iframe', modal.tmp).eq(0) |
.css({ |
width: '100%', |
height: $.support.boxModel? '99%' : '100%' |
}) |
.load(iframeLoaded); |
modal.dataReady = true; |
showModal(); |
} else if (currentSettings.type) { |
// Could be every other kind of type or a dom selector |
debug('Content: '+currentSettings.type); |
initModal(); |
modal.tmp.html(currentSettings.content); |
var w = modal.tmp.width(); |
var h = modal.tmp.height(); |
var div = $(currentSettings.type); |
if (div.length) { |
setCurrentSettings({type: 'div'}); |
w = div.width(); |
h = div.height(); |
if (contentElt) |
contentEltLast = contentElt; |
contentElt = div; |
modal.tmp.append(div.contents()); |
} |
initSettingsSize.width = w; |
initSettingsSize.height = h; |
setCurrentSettings({ |
width: w, |
height: h |
}); |
if (modal.tmp.html()) |
modal.dataReady = true; |
else |
loadingError(); |
if (!modal.ready) |
showModal(); |
else |
endHideContent(); |
} else { |
debug('Ajax Load: '+url); |
setCurrentSettings({type: 'ajax'}); |
var data = currentSettings.ajax.data || {}; |
if (currentSettings.selector) { |
if (typeof data == "string") { |
data+= '&'+currentSettings.selIndicator+'='+currentSettings.selector.substring(1); |
} else { |
data[currentSettings.selIndicator] = currentSettings.selector.substring(1); |
} |
} |
showModal(); |
$.ajax($.extend(true, currentSettings.ajax, { |
url: url, |
success: ajaxLoaded, |
error: loadingError, |
data: data |
})); |
} |
} else if (currentSettings.content) { |
// Raw content not from a DOM element |
debug('Content: '+currentSettings.type); |
setCurrentSettings({type: 'manual'}); |
initModal(); |
modal.tmp.html($('<div/>').html(currentSettings.content).contents()); |
if (modal.tmp.html()) |
modal.dataReady = true; |
else |
loadingError(); |
showModal(); |
} else { |
// What should we show here? nothing happen |
} |
} |
|
// Update the current settings |
// object settings |
// string deep1 first key where overwrite the settings |
// string deep2 second key where overwrite the settings |
function setDefaultCurrentSettings(settings) { |
debug('setDefaultCurrentSettings'); |
currentSettings = $.extend(true, {}, $.fn.nyroModal.settings, settings); |
setMargin(); |
} |
|
function setCurrentSettings(settings, deep1, deep2) { |
if (modal.started) { |
if (deep1 && deep2) { |
$.extend(true, currentSettings[deep1][deep2], settings); |
} else if (deep1) { |
$.extend(true, currentSettings[deep1], settings); |
} else { |
if (modal.animContent) { |
if ('width' in settings) { |
if (!modal.resizing) { |
settings.setWidth = settings.width; |
shouldResize = true; |
} |
delete settings['width']; |
} |
if ('height' in settings) { |
if (!modal.resizing) { |
settings.setHeight = settings.height; |
shouldResize = true; |
} |
delete settings['height']; |
} |
} |
$.extend(true, currentSettings, settings); |
} |
} else { |
if (deep1 && deep2) { |
$.extend(true, $.fn.nyroModal.settings[deep1][deep2], settings); |
} else if (deep1) { |
$.extend(true, $.fn.nyroModal.settings[deep1], settings); |
} else { |
$.extend(true, $.fn.nyroModal.settings, settings); |
} |
} |
} |
|
// Set the margin for postionning the element. Useful for IE6 |
function setMarginScroll() { |
if (isIE6 && !modal.blocker) { |
if (document.documentElement) { |
currentSettings.marginScrollLeft = document.documentElement.scrollLeft; |
currentSettings.marginScrollTop = document.documentElement.scrollTop; |
} else { |
currentSettings.marginScrollLeft = document.body.scrollLeft; |
currentSettings.marginScrollTop = document.body.scrollTop; |
} |
} else { |
currentSettings.marginScrollLeft = 0; |
currentSettings.marginScrollTop = 0; |
} |
} |
|
// Set the margin for the content |
function setMargin() { |
setMarginScroll(); |
currentSettings.marginLeft = -(currentSettings.width+currentSettings.borderW)/2; |
currentSettings.marginTop = -(currentSettings.height+currentSettings.borderH)/2; |
if (!modal.blocker) { |
currentSettings.marginLeft+= currentSettings.marginScrollLeft; |
currentSettings.marginTop+= currentSettings.marginScrollTop; |
} |
} |
|
// Set the margin for the current loading |
function setMarginLoading() { |
setMarginScroll(); |
var outer = getOuter(modal.loading); |
currentSettings.marginTopLoading = -(modal.loading.height() + outer.h.border + outer.h.padding)/2; |
currentSettings.marginLeftLoading = -(modal.loading.width() + outer.w.border + outer.w.padding)/2; |
if (!modal.blocker) { |
currentSettings.marginLeftLoading+= currentSettings.marginScrollLeft; |
currentSettings.marginTopLoading+= currentSettings.marginScrollTop; |
} |
} |
|
// Set the modal Title |
function setTitle() { |
var title = $('h1#nyroModalTitle', modal.contentWrapper); |
if (title.length) |
title.text(currentSettings.title); |
else |
modal.contentWrapper.prepend('<h1 id="nyroModalTitle">'+currentSettings.title+'</h1>'); |
} |
|
// Init the nyroModal div by settings the CSS elements and hide needed elements |
function initModal() { |
debug('initModal'); |
if (!modal.full) { |
if (currentSettings.debug) |
setCurrentSettings({color: 'white'}, 'cssOpt', 'bg'); |
|
var full = { |
zIndex: currentSettings.zIndexStart, |
position: 'fixed', |
top: 0, |
left: 0, |
width: '100%', |
height: '100%' |
}; |
|
var contain = body; |
var iframeHideIE = ''; |
if (currentSettings.blocker) { |
modal.blocker = contain = $(currentSettings.blocker); |
var pos = modal.blocker.offset(); |
var w = modal.blocker.outerWidth(); |
var h = modal.blocker.outerHeight(); |
if (isIE6) { |
setCurrentSettings({ |
height: '100%', |
width: '100%', |
top: 0, |
left: 0 |
}, 'cssOpt', 'bg'); |
} |
modal.blockerVars = { |
top: pos.top, |
left: pos.left, |
width: w, |
height: h |
}; |
var plusTop = (/msie/.test(userAgent) ?0:getCurCSS(body.get(0), 'borderTopWidth')); |
var plusLeft = (/msie/.test(userAgent) ?0:getCurCSS(body.get(0), 'borderLeftWidth')); |
full = { |
position: 'absolute', |
top: pos.top + plusTop, |
left: pos.left + plusLeft, |
width: w, |
height: h |
}; |
} else if (isIE6) { |
body.css({ |
marginLeft: 0, |
marginRight: 0 |
}); |
var w = body.width(); |
var h = $(window).height()+'px'; |
if ($(window).height() >= body.outerHeight()) { |
h = body.outerHeight()+'px'; |
} else |
w+= 20; |
w += 'px'; |
body.css({ |
width: w, |
height: h, |
position: 'static', |
overflow: 'hidden' |
}); |
$('html').css({overflow: 'hidden'}); |
setCurrentSettings({ |
cssOpt: { |
bg: { |
position: 'absolute', |
zIndex: currentSettings.zIndexStart+1, |
height: '110%', |
width: '110%', |
top: currentSettings.marginScrollTop+'px', |
left: currentSettings.marginScrollLeft+'px' |
}, |
wrapper: { zIndex: currentSettings.zIndexStart+2 }, |
loading: { zIndex: currentSettings.zIndexStart+3 } |
} |
}); |
|
iframeHideIE = $('<iframe id="nyroModalIframeHideIe" src="javascript:\'\';"></iframe>') |
.css($.extend({}, |
currentSettings.cssOpt.bg, { |
opacity: 0, |
zIndex: 50, |
border: 'none' |
})); |
} |
|
contain.append($('<div id="nyroModalFull"><div id="nyroModalBg"></div><div id="nyroModalWrapper"><div id="nyroModalContent"></div></div><div id="nyrModalTmp"></div><div id="nyroModalLoading"></div></div>').hide()); |
|
modal.full = $('#nyroModalFull') |
.css(full) |
.show(); |
modal.bg = $('#nyroModalBg') |
.css($.extend({ |
backgroundColor: currentSettings.bgColor |
}, currentSettings.cssOpt.bg)) |
.before(iframeHideIE); |
modal.bg.on('click.nyroModal', clickBg); |
modal.loading = $('#nyroModalLoading') |
.css(currentSettings.cssOpt.loading) |
.hide(); |
modal.contentWrapper = $('#nyroModalWrapper') |
.css(currentSettings.cssOpt.wrapper) |
.hide(); |
modal.content = $('#nyroModalContent'); |
modal.tmp = $('#nyrModalTmp').hide(); |
|
// To stop the mousewheel if the the plugin is available |
if ($.isFunction($.fn.mousewheel)) { |
modal.content.mousewheel(function(e, d) { |
var elt = modal.content.get(0); |
if ((d > 0 && elt.scrollTop == 0) || |
(d < 0 && elt.scrollHeight - elt.scrollTop == elt.clientHeight)) { |
e.preventDefault(); |
e.stopPropagation(); |
} |
}); |
} |
|
$(document).on('keydown.nyroModal', keyHandler); |
modal.content.css({width: 'auto', height: 'auto'}); |
modal.contentWrapper.css({width: 'auto', height: 'auto'}); |
|
if (!currentSettings.blocker && currentSettings.windowResize) { |
$(window).on('resize.nyroModal', function() { |
window.clearTimeout(windowResizeTimeout); |
windowResizeTimeout = window.setTimeout(windowResizeHandler, 200); |
}); |
} |
} |
} |
|
function windowResizeHandler() { |
$.nyroModalSettings(initSettingsSize); |
} |
|
// Show the modal (ie: the background and then the loading if needed or the content directly) |
function showModal() { |
debug('showModal'); |
if (!modal.ready) { |
initModal(); |
modal.anim = true; |
currentSettings.showBackground(modal, currentSettings, endBackground); |
} else { |
modal.anim = true; |
modal.transition = true; |
currentSettings.showTransition(modal, currentSettings, function(){endHideContent();modal.anim=false;showContentOrLoading();}); |
} |
} |
|
// Called when user click on background |
function clickBg(e) { |
if (!currentSettings.modal) |
removeModal(); |
} |
|
// Used for the escape key or the arrow in the gallery type |
function keyHandler(e) { |
if (e.keyCode == 27) { |
if (!currentSettings.modal) |
removeModal(); |
} else if (currentSettings.gallery && modal.ready && modal.dataReady && !modal.anim && !modal.transition) { |
if (e.keyCode == 39 || e.keyCode == 40) { |
e.preventDefault(); |
$.nyroModalNext(); |
return false; |
} else if (e.keyCode == 37 || e.keyCode == 38) { |
e.preventDefault(); |
$.nyroModalPrev(); |
return false; |
} |
} |
} |
|
// Determine the filetype regarding the link DOM element |
function fileType() { |
var from = currentSettings.from; |
|
var url; |
|
if (from && from.nodeName) { |
var jFrom = $(from); |
|
url = jFrom.attr(from.nodeName.toLowerCase() == 'form' ? 'action' : 'href'); |
if (!url) |
url = location.href.substring(window.location.host.length+7); |
currentSettings.url = url; |
|
if (jFrom.attr('rev') == 'modal') |
currentSettings.modal = true; |
|
currentSettings.title = jFrom.attr('title'); |
|
if (from && from.rel && from.rel.toLowerCase() != 'nofollow') { |
var indexSpace = from.rel.indexOf(' '); |
currentSettings.gallery = indexSpace > 0 ? from.rel.substr(0, indexSpace) : from.rel; |
} |
|
var imgType = imageType(url, from); |
if (imgType) |
return imgType; |
|
if (isSwf(url)) |
return 'swf'; |
|
var iframe = false; |
if (from.target && from.target.toLowerCase() == '_blank' || (from.hostname && from.hostname.replace(/:\d*$/,'') != window.location.hostname.replace(/:\d*$/,''))) { |
iframe = true; |
} |
if (from.nodeName.toLowerCase() == 'form') { |
if (iframe) |
return 'iframeForm'; |
setCurrentSettings(extractUrlSel(url)); |
if (jFrom.attr('enctype') == 'multipart/form-data') |
return 'formData'; |
return 'form'; |
} |
if (iframe) |
return 'iframe'; |
} else { |
url = currentSettings.url; |
if (!currentSettings.content) |
currentSettings.from = true; |
|
if (!url) |
return null; |
|
if (isSwf(url)) |
return 'swf'; |
|
var reg1 = new RegExp("^http://|https://", "g"); |
if (url.match(reg1)) |
return 'iframe'; |
} |
|
var imgType = imageType(url, from); |
if (imgType) |
return imgType; |
|
var tmp = extractUrlSel(url); |
setCurrentSettings(tmp); |
|
if (!tmp.url) |
return tmp.selector; |
} |
|
function imageType(url, from) { |
var image = new RegExp(currentSettings.regexImg, 'i'); |
if (image.test(url)) { |
return 'image'; |
} |
} |
|
function isSwf(url) { |
var swf = new RegExp('[^\.]\.(swf)\s*$', 'i'); |
return swf.test(url); |
} |
|
function extractUrlSel(url) { |
var ret = { |
url: null, |
selector: null |
}; |
|
if (url) { |
var hash = getHash(url); |
var hashLoc = getHash(window.location.href); |
var curLoc = window.location.href.substring(0, window.location.href.length - hashLoc.length); |
var req = url.substring(0, url.length - hash.length); |
|
if (req == curLoc || req == $('base').attr('href')) { |
ret.selector = hash; |
} else { |
ret.url = req; |
ret.selector = hash; |
} |
} |
return ret; |
} |
|
// Called when the content cannot be loaded or tiemout reached |
function loadingError() { |
debug('loadingError'); |
|
modal.error = true; |
|
if (!modal.ready) |
return; |
|
if ($.isFunction(currentSettings.handleError)) |
currentSettings.handleError(modal, currentSettings); |
|
modal.loading |
.addClass(currentSettings.errorClass) |
.html(currentSettings.contentError); |
$(currentSettings.closeSelector, modal.loading) |
.off('click.nyroModal') |
.on('click.nyroModal', removeModal); |
setMarginLoading(); |
modal.loading |
.css({ |
marginTop: currentSettings.marginTopLoading+'px', |
marginLeft: currentSettings.marginLeftLoading+'px' |
}); |
} |
|
// Put the content from modal.tmp to modal.content |
function fillContent() { |
debug('fillContent'); |
if (!modal.tmp.html()) |
return; |
|
modal.content.html(modal.tmp.contents()); |
modal.tmp.empty(); |
wrapContent(); |
|
if (currentSettings.type == 'iframeForm') { |
$(currentSettings.from) |
.attr('target', 'nyroModalIframe') |
.data('nyroModalprocessing', 1) |
.submit() |
.attr('target', '_blank') |
.removeData('nyroModalprocessing'); |
} |
|
if (!currentSettings.modal) |
modal.wrapper.prepend(currentSettings.closeButton); |
|
if ($.isFunction(currentSettings.endFillContent)) |
currentSettings.endFillContent(modal, currentSettings); |
|
modal.content.append(modal.scripts); |
|
$(currentSettings.closeSelector, modal.contentWrapper) |
.off('click.nyroModal') |
.on('click.nyroModal', removeModal); |
$(currentSettings.openSelector, modal.contentWrapper).nyroModal(getCurrentSettingsNew()); |
} |
|
// Get the current settings to be used in new links |
function getCurrentSettingsNew() { |
return callingSettings; |
/* |
var currentSettingsNew = $.extend(true, {}, currentSettings); |
if (resized.width) |
currentSettingsNew.width = null; |
else |
currentSettingsNew.width = initSettingsSize.width; |
if (resized.height) |
currentSettingsNew.height = null; |
else |
currentSettingsNew.height = initSettingsSize.height; |
currentSettingsNew.cssOpt.content.overflow = 'auto'; |
return currentSettingsNew; |
*/ |
} |
|
// Wrap the content and update the modal size if needed |
function wrapContent() { |
debug('wrapContent'); |
|
var wrap = $(currentSettings.wrap[currentSettings.type]); |
modal.content.append(wrap.children().remove()); |
modal.contentWrapper.wrapInner(wrap); |
|
if (currentSettings.gallery) { |
// Set the action for the next and prev button (or remove them) |
modal.content.append(currentSettings.galleryLinks); |
|
gallery.links = $('[rel="'+currentSettings.gallery+'"], [rel^="'+currentSettings.gallery+' "]'); |
gallery.index = gallery.links.index(currentSettings.from); |
|
if (currentSettings.galleryCounts && $.isFunction(currentSettings.galleryCounts)) |
currentSettings.galleryCounts(gallery.index + 1, gallery.links.length, modal, currentSettings); |
|
var currentSettingsNew = getCurrentSettingsNew(); |
|
var linkPrev = getGalleryLink(-1); |
if (linkPrev) { |
var prev = $('.nyroModalPrev', modal.contentWrapper) |
.attr('href', linkPrev.attr('href')) |
.click(function(e) { |
e.preventDefault(); |
$.nyroModalPrev(); |
return false; |
}); |
if (isIE6 && currentSettings.type == 'swf') { |
prev.before($('<iframe id="nyroModalIframeHideIeGalleryPrev" src="javascript:\'\';"></iframe>').css({ |
position: prev.css('position'), |
top: prev.css('top'), |
left: prev.css('left'), |
width: prev.width(), |
height: prev.height(), |
opacity: 0, |
border: 'none' |
})); |
} |
} else { |
$('.nyroModalPrev', modal.contentWrapper).remove(); |
} |
var linkNext = getGalleryLink(1); |
if (linkNext) { |
var next = $('.nyroModalNext', modal.contentWrapper) |
.attr('href', linkNext.attr('href')) |
.click(function(e) { |
e.preventDefault(); |
$.nyroModalNext(); |
return false; |
}); |
if (isIE6 && currentSettings.type == 'swf') { |
next.before($('<iframe id="nyroModalIframeHideIeGalleryNext" src="javascript:\'\';"></iframe>') |
.css($.extend({}, { |
position: next.css('position'), |
top: next.css('top'), |
left: next.css('left'), |
width: next.width(), |
height: next.height(), |
opacity: 0, |
border: 'none' |
}))); |
} |
} else { |
$('.nyroModalNext', modal.contentWrapper).remove(); |
} |
} |
|
calculateSize(); |
} |
|
function getGalleryLink(dir) { |
if (currentSettings.gallery) { |
if (!currentSettings.ltr) |
dir *= -1; |
var index = gallery.index + dir; |
if (index >= 0 && index < gallery.links.length) |
return gallery.links.eq(index); |
else if (currentSettings.galleryLoop) { |
if (index < 0) |
return gallery.links.eq(gallery.links.length-1); |
else |
return gallery.links.eq(0); |
} |
} |
return false; |
} |
|
// Calculate the size for the contentWrapper |
function calculateSize(resizing) { |
debug('calculateSize'); |
|
modal.wrapper = modal.contentWrapper.children('div:first'); |
|
resized.width = false; |
resized.height = false; |
if (false && !currentSettings.windowResizing) { |
initSettingsSize.width = currentSettings.width; |
initSettingsSize.height = currentSettings.height; |
} |
|
if (currentSettings.autoSizable && (!currentSettings.width || !currentSettings.height)) { |
modal.contentWrapper |
.css({ |
opacity: 0, |
width: 'auto', |
height: 'auto' |
}) |
.show(); |
var tmp = { |
width: 'auto', |
height: 'auto' |
}; |
if (currentSettings.width) { |
tmp.width = currentSettings.width; |
} else if (currentSettings.type == 'iframe') { |
tmp.width = currentSettings.minWidth; |
} |
|
if (currentSettings.height) { |
tmp.height = currentSettings.height; |
} else if (currentSettings.type == 'iframe') { |
tmp.height = currentSettings.minHeight; |
} |
|
modal.content.css(tmp); |
if (!currentSettings.width) { |
currentSettings.width = modal.content.outerWidth(true); |
resized.width = true; |
} |
if (!currentSettings.height) { |
currentSettings.height = modal.content.outerHeight(true); |
resized.height = true; |
} |
modal.contentWrapper.css({opacity: 1}); |
if (!resizing) |
modal.contentWrapper.hide(); |
} |
|
if (currentSettings.type != 'image' && currentSettings.type != 'swf') { |
currentSettings.width = Math.max(currentSettings.width, currentSettings.minWidth); |
currentSettings.height = Math.max(currentSettings.height, currentSettings.minHeight); |
} |
|
var outerWrapper = getOuter(modal.contentWrapper); |
var outerWrapper2 = getOuter(modal.wrapper); |
var outerContent = getOuter(modal.content); |
|
var tmp = { |
content: { |
width: currentSettings.width, |
height: currentSettings.height |
}, |
wrapper2: { |
width: currentSettings.width + outerContent.w.total, |
height: currentSettings.height + outerContent.h.total |
}, |
wrapper: { |
width: currentSettings.width + outerContent.w.total + outerWrapper2.w.total, |
height: currentSettings.height + outerContent.h.total + outerWrapper2.h.total |
} |
}; |
|
if (currentSettings.resizable) { |
var maxHeight = modal.blockerVars? modal.blockerVars.height : $(window).height() |
- outerWrapper.h.border |
- (tmp.wrapper.height - currentSettings.height); |
var maxWidth = modal.blockerVars? modal.blockerVars.width : $(window).width() |
- outerWrapper.w.border |
- (tmp.wrapper.width - currentSettings.width); |
maxHeight-= currentSettings.padding*2; |
maxWidth-= currentSettings.padding*2; |
|
if (tmp.content.height > maxHeight || tmp.content.width > maxWidth) { |
// We're gonna resize the modal as it will goes outside the view port |
if (currentSettings.type == 'image' || currentSettings.type == 'swf') { |
// An image is resized proportionnaly |
var useW = currentSettings.imgWidth?currentSettings.imgWidth : currentSettings.width; |
var useH = currentSettings.imgHeight?currentSettings.imgHeight : currentSettings.height; |
var diffW = tmp.content.width - useW; |
var diffH = tmp.content.height - useH; |
if (diffH < 0) diffH = 0; |
if (diffW < 0) diffW = 0; |
var calcH = maxHeight - diffH; |
var calcW = maxWidth - diffW; |
var ratio = Math.min(calcH/useH, calcW/useW); |
calcW = Math.floor(useW*ratio); |
calcH = Math.floor(useH*ratio); |
tmp.content.height = calcH + diffH; |
tmp.content.width = calcW + diffW; |
} else { |
// For an HTML content, we simply decrease the size |
tmp.content.height = Math.min(tmp.content.height, maxHeight); |
tmp.content.width = Math.min(tmp.content.width, maxWidth); |
} |
tmp.wrapper2 = { |
width: tmp.content.width + outerContent.w.total, |
height: tmp.content.height + outerContent.h.total |
}; |
tmp.wrapper = { |
width: tmp.content.width + outerContent.w.total + outerWrapper2.w.total, |
height: tmp.content.height + outerContent.h.total + outerWrapper2.h.total |
}; |
} |
} |
|
if (currentSettings.type == 'swf') { |
$('object, embed', modal.content) |
.attr('width', tmp.content.width) |
.attr('height', tmp.content.height); |
} else if (currentSettings.type == 'image') { |
$('img', modal.content).css({ |
width: tmp.content.width, |
height: tmp.content.height |
}); |
} |
|
modal.content.css($.extend({}, tmp.content, currentSettings.cssOpt.content)); |
modal.wrapper.css($.extend({}, tmp.wrapper2, currentSettings.cssOpt.wrapper2)); |
|
if (!resizing) |
modal.contentWrapper.css($.extend({}, tmp.wrapper, currentSettings.cssOpt.wrapper)); |
|
if (currentSettings.type == 'image' && currentSettings.addImageDivTitle) { |
// Adding the title for the image |
$('img', modal.content).removeAttr('alt'); |
var divTitle = $('div', modal.content); |
if (currentSettings.title != currentSettings.defaultImgAlt && currentSettings.title) { |
if (divTitle.length == 0) { |
divTitle = $('<div>'+currentSettings.title+'</div>'); |
modal.content.append(divTitle); |
} |
if (currentSettings.setWidthImgTitle) { |
var outerDivTitle = getOuter(divTitle); |
divTitle.css({width: (tmp.content.width + outerContent.w.padding - outerDivTitle.w.total)+'px'}); |
} |
} else if (divTitle.length = 0) { |
divTitle.remove(); |
} |
} |
|
if (currentSettings.title) |
setTitle(); |
|
tmp.wrapper.borderW = outerWrapper.w.border; |
tmp.wrapper.borderH = outerWrapper.h.border; |
|
setCurrentSettings(tmp.wrapper); |
setMargin(); |
} |
|
function removeModal(e) { |
debug('removeModal'); |
if (e) |
e.preventDefault(); |
if (modal.full && modal.ready) { |
$(document).off('keydown.nyroModal'); |
if (!currentSettings.blocker) |
$(window).off('resize.nyroModal'); |
modal.ready = false; |
modal.anim = true; |
modal.closing = true; |
if (modal.loadingShown || modal.transition) { |
currentSettings.hideLoading(modal, currentSettings, function() { |
modal.loading.hide(); |
modal.loadingShown = false; |
modal.transition = false; |
currentSettings.hideBackground(modal, currentSettings, endRemove); |
}); |
} else { |
if (fixFF) |
modal.content.css({position: ''}); // Fix Issue #10, remove the attribute |
modal.wrapper.css({overflow: 'hidden'}); // Used to fix a visual issue when hiding |
modal.content.css({overflow: 'hidden'}); // Used to fix a visual issue when hiding |
$('iframe', modal.content).hide(); // Fix issue 359 |
if ($.isFunction(currentSettings.beforeHideContent)) { |
currentSettings.beforeHideContent(modal, currentSettings, function() { |
currentSettings.hideContent(modal, currentSettings, function() { |
endHideContent(); |
currentSettings.hideBackground(modal, currentSettings, endRemove); |
}); |
}); |
} else { |
currentSettings.hideContent(modal, currentSettings, function() { |
endHideContent(); |
currentSettings.hideBackground(modal, currentSettings, endRemove); |
}); |
} |
} |
} |
if (e) |
return false; |
} |
|
function showContentOrLoading() { |
debug('showContentOrLoading'); |
if (modal.ready && !modal.anim) { |
if (modal.dataReady) { |
if (modal.tmp.html()) { |
modal.anim = true; |
if (modal.transition) { |
fillContent(); |
modal.animContent = true; |
currentSettings.hideTransition(modal, currentSettings, function() { |
modal.loading.hide(); |
modal.transition = false; |
modal.loadingShown = false; |
endShowContent(); |
}); |
} else { |
currentSettings.hideLoading(modal, currentSettings, function() { |
modal.loading.hide(); |
modal.loadingShown = false; |
fillContent(); |
setMarginLoading(); |
setMargin(); |
modal.animContent = true; |
currentSettings.showContent(modal, currentSettings, endShowContent); |
}); |
} |
} |
} else if (!modal.loadingShown && !modal.transition) { |
modal.anim = true; |
modal.loadingShown = true; |
if (modal.error) |
loadingError(); |
else |
modal.loading.html(currentSettings.contentLoading); |
$(currentSettings.closeSelector, modal.loading) |
.off('click.nyroModal') |
.on('click.nyroModal', removeModal); |
setMarginLoading(); |
currentSettings.showLoading(modal, currentSettings, function(){modal.anim=false;showContentOrLoading();}); |
} |
} |
} |
|
// ------------------------------------------------------- |
// Private Data Loaded callback |
// ------------------------------------------------------- |
|
function ajaxLoaded(data) { |
debug('AjaxLoaded: '+this.url); |
|
if (currentSettings.selector) { |
var tmp = {}; |
var i = 0; |
// Looking for script to store them |
data = data |
.replace(/\r\n/gi,'nyroModalLN') |
.replace(/<script(.|\s)*?\/script>/gi, function(x) { |
tmp[i] = x; |
return '<pre style="display: none" class=nyroModalScript rel="'+(i++)+'"></pre>'; |
}); |
data = $('<div>'+data+'</div>').find(currentSettings.selector).html() |
.replace(/<pre style="display: none;?" class="?nyroModalScript"? rel="(.?)"><\/pre>/gi, function(x, y, z) { |
return tmp[y]; |
}) |
.replace(/nyroModalLN/gi,"\r\n"); |
} |
modal.tmp.html(filterScripts(data)); |
if (modal.tmp.html()) { |
modal.dataReady = true; |
showContentOrLoading(); |
} else |
loadingError(); |
} |
|
function formDataLoaded() { |
debug('formDataLoaded'); |
var jFrom = $(currentSettings.from); |
jFrom.attr('action', jFrom.attr('action')+currentSettings.selector); |
jFrom.attr('target', ''); |
$('input[name='+currentSettings.formIndicator+']', currentSettings.from).remove(); |
var iframe = modal.tmp.children('iframe'); |
var iframeContent = iframe.off('load').contents().find(currentSettings.selector || 'body').not('script[src]'); |
iframe.attr('src', 'about:blank'); // Used to stop the loading in FF |
modal.tmp.html(iframeContent.html()); |
if (modal.tmp.html()) { |
modal.dataReady = true; |
showContentOrLoading(); |
} else |
loadingError(); |
} |
|
function iframeLoaded() { |
if ((window.location.hostname && currentSettings.url.indexOf(window.location.hostname) > -1) |
|| currentSettings.url.indexOf('http://')) { |
var iframe = $('iframe', modal.full).contents(); |
var tmp = {}; |
if (currentSettings.titleFromIframe) { |
tmp.title = iframe.find('title').text(); |
if (!tmp.title) { |
// for IE |
try { |
tmp.title = iframe.find('title').html(); |
} catch(err) {} |
} |
} |
var body = iframe.find('body'); |
if (!currentSettings.height && body.height()) |
tmp.height = body.height(); |
if (!currentSettings.width && body.width()) |
tmp.width = body.width(); |
$.extend(initSettingsSize, tmp); |
$.nyroModalSettings(tmp); |
} |
} |
|
function galleryCounts(nb, total, elts, settings) { |
if (total > 1) |
settings.title+= (settings.title?' - ':'') +nb+'/'+total; |
} |
|
|
// ------------------------------------------------------- |
// Private Animation callback |
// ------------------------------------------------------- |
|
function endHideContent() { |
debug('endHideContent'); |
modal.anim = false; |
if (contentEltLast) { |
contentEltLast.append(modal.content.contents()); |
contentEltLast = null; |
} else if (contentElt) { |
contentElt.append(modal.content.contents()); |
contentElt= null; |
} |
modal.content.empty(); |
|
gallery = {}; |
|
modal.contentWrapper.hide().children().remove().empty().attr('style', '').hide(); |
|
if (modal.closing || modal.transition) |
modal.contentWrapper.hide(); |
|
modal.contentWrapper |
.css(currentSettings.cssOpt.wrapper) |
.append(modal.content); |
showContentOrLoading(); |
} |
|
function endRemove() { |
debug('endRemove'); |
$(document).off('keydown', keyHandler); |
modal.anim = false; |
modal.full.remove(); |
modal.full = null; |
if (isIE6) { |
body.css({height: '', width: '', position: '', overflow: '', marginLeft: '', marginRight: ''}); |
$('html').css({overflow: ''}); |
} |
if ($.isFunction(currentSettings.endRemove)) |
currentSettings.endRemove(modal, currentSettings); |
} |
|
function endBackground() { |
debug('endBackground'); |
modal.ready = true; |
modal.anim = false; |
showContentOrLoading(); |
} |
|
function endShowContent() { |
debug('endShowContent'); |
modal.anim = false; |
modal.animContent = false; |
modal.contentWrapper.css({opacity: ''}); // for the close button in IE |
fixFF = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) && parseFloat(browserVersion) < 1.9 && currentSettings.type != 'image'; |
|
if (fixFF) |
modal.content.css({position: 'fixed'}); // Fix Issue #10 |
modal.content.append(modal.scriptsShown); |
|
if(currentSettings.type == 'iframe') |
modal.content.find('iframe').attr('src', currentSettings.url); |
|
if ($.isFunction(currentSettings.endShowContent)) |
currentSettings.endShowContent(modal, currentSettings); |
|
if (shouldResize) { |
shouldResize = false; |
$.nyroModalSettings({width: currentSettings.setWidth, height: currentSettings.setHeight}); |
delete currentSettings['setWidth']; |
delete currentSettings['setHeight']; |
} |
if (resized.width) |
setCurrentSettings({width: null}); |
if (resized.height) |
setCurrentSettings({height: null}); |
} |
|
|
// ------------------------------------------------------- |
// Utilities |
// ------------------------------------------------------- |
|
// Get the selector from an url (as string) |
function getHash(url) { |
if (typeof url == 'string') { |
var hashPos = url.indexOf('#'); |
if (hashPos > -1) |
return url.substring(hashPos); |
} |
return ''; |
} |
|
// Filter an html content to remove the script[src] |
function filterScripts(data) { |
// Removing the body, head and html tag |
if (typeof data == 'string') |
data = data.replace(/<\/?(html|head|body)([^>]*)>/gi, ''); |
var tmp = new Array(); |
$.each($.clean({0:data}, this.ownerDocument), function() { |
if ($.nodeName(this, "script")) { |
if (!this.src || $(this).attr('rel') == 'forceLoad') { |
if ($(this).attr('rev') == 'shown') |
modal.scriptsShown.push(this); |
else |
modal.scripts.push(this); |
} |
} else |
tmp.push(this); |
}); |
return tmp; |
} |
|
// Get the vertical and horizontal margin, padding and border dimension |
function getOuter(elm) { |
elm = elm.get(0); |
var ret = { |
h: { |
margin: getCurCSS(elm, 'marginTop') + getCurCSS(elm, 'marginBottom'), |
border: getCurCSS(elm, 'borderTopWidth') + getCurCSS(elm, 'borderBottomWidth'), |
padding: getCurCSS(elm, 'paddingTop') + getCurCSS(elm, 'paddingBottom') |
}, |
w: { |
margin: getCurCSS(elm, 'marginLeft') + getCurCSS(elm, 'marginRight'), |
border: getCurCSS(elm, 'borderLeftWidth') + getCurCSS(elm, 'borderRightWidth'), |
padding: getCurCSS(elm, 'paddingLeft') + getCurCSS(elm, 'paddingRight') |
} |
}; |
|
ret.h.outer = ret.h.margin + ret.h.border; |
ret.w.outer = ret.w.margin + ret.w.border; |
|
ret.h.inner = ret.h.padding + ret.h.border; |
ret.w.inner = ret.w.padding + ret.w.border; |
|
ret.h.total = ret.h.outer + ret.h.padding; |
ret.w.total = ret.w.outer + ret.w.padding; |
|
return ret; |
} |
|
function getCurCSS(elm, name) { |
var ret = parseInt($.css(elm, name, true)); |
if (isNaN(ret)) |
ret = 0; |
return ret; |
} |
|
// Proxy Debug function |
function debug(msg) { |
if ($.fn.nyroModal.settings.debug || currentSettings && currentSettings.debug) |
nyroModalDebug(msg, modal, currentSettings || {}); |
} |
|
// ------------------------------------------------------- |
// Default animation function |
// ------------------------------------------------------- |
|
function showBackground(elts, settings, callback) { |
elts.bg.css({opacity:0}).fadeTo(500, 0.75, callback); |
} |
|
function hideBackground(elts, settings, callback) { |
elts.bg.fadeOut(300, callback); |
} |
|
function showLoading(elts, settings, callback) { |
elts.loading |
.css({ |
marginTop: settings.marginTopLoading+'px', |
marginLeft: settings.marginLeftLoading+'px', |
opacity: 0 |
}) |
.show() |
.animate({ |
opacity: 1 |
}, {complete: callback, duration: 400}); |
} |
|
function hideLoading(elts, settings, callback) { |
callback(); |
} |
|
function showContent(elts, settings, callback) { |
elts.loading |
.css({ |
marginTop: settings.marginTopLoading+'px', |
marginLeft: settings.marginLeftLoading+'px' |
}) |
.show() |
.animate({ |
width: settings.width+'px', |
height: settings.height+'px', |
marginTop: settings.marginTop+'px', |
marginLeft: settings.marginLeft+'px' |
}, {duration: 350, complete: function() { |
elts.contentWrapper |
.css({ |
width: settings.width+'px', |
height: settings.height+'px', |
marginTop: settings.marginTop+'px', |
marginLeft: settings.marginLeft+'px' |
}) |
.show(); |
elts.loading.fadeOut(200, callback); |
} |
}); |
} |
|
function hideContent(elts, settings, callback) { |
elts.contentWrapper |
.animate({ |
height: '50px', |
width: '50px', |
marginTop: (-(25+settings.borderH)/2 + settings.marginScrollTop)+'px', |
marginLeft: (-(25+settings.borderW)/2 + settings.marginScrollLeft)+'px' |
}, {duration: 350, complete: function() { |
elts.contentWrapper.hide(); |
callback(); |
}}); |
} |
|
function showTransition(elts, settings, callback) { |
// Put the loading with the same dimensions of the current content |
elts.loading |
.css({ |
marginTop: elts.contentWrapper.css('marginTop'), |
marginLeft: elts.contentWrapper.css('marginLeft'), |
height: elts.contentWrapper.css('height'), |
width: elts.contentWrapper.css('width'), |
opacity: 0 |
}) |
.show() |
.fadeTo(400, 1, function() { |
elts.contentWrapper.hide(); |
callback(); |
}); |
} |
|
function hideTransition(elts, settings, callback) { |
// Place the content wrapper underneath the the loading with the right dimensions |
elts.contentWrapper |
.hide() |
.css({ |
width: settings.width+'px', |
height: settings.height+'px', |
marginLeft: settings.marginLeft+'px', |
marginTop: settings.marginTop+'px', |
opacity: 1 |
}); |
elts.loading |
.animate({ |
width: settings.width+'px', |
height: settings.height+'px', |
marginLeft: settings.marginLeft+'px', |
marginTop: settings.marginTop+'px' |
}, {complete: function() { |
elts.contentWrapper.show(); |
elts.loading.fadeOut(400, function() { |
elts.loading.hide(); |
callback(); |
}); |
}, duration: 350}); |
} |
|
function resize(elts, settings, callback) { |
elts.contentWrapper |
.animate({ |
width: settings.width+'px', |
height: settings.height+'px', |
marginLeft: settings.marginLeft+'px', |
marginTop: settings.marginTop+'px' |
}, {complete: callback, duration: 400}); |
} |
|
function updateBgColor(elts, settings, callback) { |
if (!$.fx.step.backgroundColor) { |
elts.bg.css({backgroundColor: settings.bgColor}); |
callback(); |
} else |
elts.bg |
.animate({ |
backgroundColor: settings.bgColor |
}, {complete: callback, duration: 400}); |
} |
|
// ------------------------------------------------------- |
// Default initialization |
// ------------------------------------------------------- |
|
$($.fn.nyroModal.settings.openSelector).nyroModal(); |
|
}); |
|
// Default debug function, to be overwritten if needed |
// Be aware that the settings parameter could be empty |
var tmpDebug = ''; |
function nyroModalDebug(msg, elts, settings) { |
if (elts.full && elts.bg) { |
elts.bg.prepend(msg+'<br />'+tmpDebug); |
tmpDebug = ''; |
} else |
tmpDebug+= msg+'<br />'; |
} |