Arquivos
AmadeusLMS/WebContent/js/jqueryNyroModal/jquery.nyroModal.custom.js
T
2014-11-19 20:16:09 -03:00

1673 linhas
48 KiB
JavaScript
Arquivo Executável

/*
* nyroModal v2.0.0
* Core
*
* Commit 15acdbfd58dae7610a5456d80fa2806c9ed4e0d7 (01/19/2012) *
*
* Included parts:
* - anims.fade
* - filters.title
* - filters.gallery
* - filters.link
* - filters.dom
* - filters.data
* - filters.image
* - filters.swf
* - filters.form
* - filters.formFile
* - filters.iframe
* - filters.iframeForm
* - filters.embedly
*/
/*
* nyroModal v2.0.0
* Core
*
*/
jQuery(function($, undefined) {
var $w = $(window),
$d = $(document),
$b = $('body'),
baseHref = $('base').attr('href'),
// nyroModal Object
_nmObj = {
filters: [], // List of filters used
callbacks: {}, // Sepcific callbacks
loadFilter: undefined, // Name of the filter used for loading
modal: false, // Indicates if it's a modal window or not
closeOnEscape: true, // Indicates if the modal should close on Escape key
closeOnClick: true, // Indicates if a click on the background should close the modal
useKeyHandler: false, // Indicates if the modal has to handle key down event
showCloseButton: true, // Indicates if the closeButonn should be added
closeButton: '<a href="#" class="nyroModalClose nyroModalCloseButton nmReposition" title="close">Close</a>', // Close button HTML
stack: false, // Indicates if links automatically binded inside the modal should stack or not
nonStackable: 'form', // Filter to not stack DOM element
header: undefined, // header include in every modal
footer: undefined, // footer include in every modal
// Specific confirguation for gallery filter
galleryLoop: true, // Indicates if the gallery should loop
galleryCounts: true, // Indicates if the gallery counts should be shown
ltr: true, // Left to Right by default. Put to false for Hebrew or Right to Left language. Used in gallery filter
// Specific confirguation for image filter
imageRegex: '[^\.]\.(jpg|jpeg|png|tiff|gif|bmp)\s*$', // Regex used to detect image link
selIndicator: 'nyroModalSel', // Value added when a form or Ajax is sent with a filter content
swfObjectId: undefined, // Object id for swf object
swf: { // Default SWF attributes
allowFullScreen: 'true',
allowscriptaccess: 'always',
wmode: 'transparent'
},
store: {}, // Storage object for filters.
errorMsg: 'An error occured', // Error message
elts: { // HTML elements for the modal
all: undefined,
bg: undefined,
load: undefined,
cont: undefined,
hidden: undefined
},
sizes: { // Size information
initW: undefined, // Initial width
initH: undefined, // Initial height
w: undefined, // width
h: undefined, // height
minW: undefined, // minimum Width
minH: undefined, // minimum height
wMargin: undefined, // Horizontal margin
hMargin: undefined // Vertical margin
},
anim: { // Animation names to use
def: undefined, // Default animation set to use if sspecific are not defined or doesn't exist
showBg: undefined, // Set to use for showBg animation
hideBg: undefined, // Set to use for hideBg animation
showLoad: undefined, // Set to use for showLoad animation
hideLoad: undefined, // Set to use for hideLoad animation
showCont: undefined, // Set to use for showCont animation
hideCont: undefined, // Set to use for hideCont animation
showTrans: undefined, // Set to use for showTrans animation
hideTrans: undefined, // Set to use for hideTrans animation
resize: undefined // Set to use for resize animation
},
_open: false, // Indicates if the modal is open
_bgReady: false, // Indicates if the background is ready
_opened: false, // Indicates if the modal was opened (useful for stacking)
_loading: false, // Indicates if the loading is shown
_animated: false, // Indicates if the modal is currently animated
_transition: false, //Indicates if the modal is in transition
_nmOpener: undefined, // nmObj of the modal that opened the current one in non stacking mode
_nbContentLoading: 0, // Counter for contentLoading call
_scripts: '', // Scripts tags to be included
_scriptsShown: '', //Scripts tags to be included once the modal is swhon
// save the object in data
saveObj: function() {
this.opener.data('nmObj', this);
},
// Open the modal
open: function() {
if (this._nmOpener)
this._nmOpener._close();
this.getInternal()._pushStack(this.opener);
this._opened = false;
this._bgReady = false;
this._open = true;
this._initElts();
this._load();
this._nbContentLoading = 0;
this._callAnim('showBg', $.proxy(function() {
this._bgReady = true;
if (this._nmOpener) {
// fake closing of the opener nyroModal
this._nmOpener._bgReady = false;
this._nmOpener._loading = false;
this._nmOpener._animated = false;
this._nmOpener._opened = false;
this._nmOpener._open = false;
this._nmOpener.elts.cont = this._nmOpener.elts.hidden = this._nmOpener.elts.load = this._nmOpener.elts.bg = this._nmOpener.elts.all = undefined;
this._nmOpener.saveObj();
this._nmOpener = undefined;
}
this._contentLoading();
}, this));
},
// Resize the modal according to sizes.initW and sizes.initH
// Will call size function
// @param recalc boolean: Indicate if the size should be recalaculated (useful when content has changed)
resize: function(recalc) {
if (recalc) {
this.elts.hidden.append(this.elts.cont.children().first().clone());
this.sizes.initW = this.sizes.w = this.elts.hidden.width();
this.sizes.initH = this.sizes.h = this.elts.hidden.height();
this.elts.hidden.empty();
} else {
this.sizes.w = this.sizes.initW;
this.sizes.h = this.sizes.initH;
}
this._unreposition();
this.size();
this._callAnim('resize', $.proxy(function() {
this._reposition();
}, this));
},
// Update sizes element to not go outsize the viewport.
// Will call 'size' callback filter
size: function() {
var maxHeight = this.getInternal().fullSize.viewH - this.sizes.hMargin,
maxWidth = this.getInternal().fullSize.viewW - this.sizes.wMargin;
if (this.sizes.minW && this.sizes.minW > this.sizes.w)
this.sizes.w = this.sizes.minW;
if (this.sizes.minH && this.sizes.minH > this.sizes.h)
this.sizes.h = this.sizes.minH;
if (this.sizes.h > maxHeight || this.sizes.w > maxWidth) {
// We're gonna resize the modal as it will goes outside the view port
this.sizes.h = Math.min(this.sizes.h, maxHeight);
this.sizes.w = Math.min(this.sizes.w, maxWidth);
}
this._callFilters('size');
},
// Get the nmObject for a new nyroModal
getForNewLinks: function(elt) {
var ret;
if (this.stack && (!elt || this.isStackable(elt))) {
ret = $.extend(true, {}, this);
ret._nmOpener = undefined;
ret.elts.all = undefined;
} else {
ret = $.extend({}, this);
ret._nmOpener = this;
}
ret.filters = [];
ret.opener = undefined;
ret._open = false;
return ret;
},
// Indicate if an element can be stackable or not, regarding the nonStackable setting
isStackable: function(elt) {
return !elt.is(this.nonStackable);
},
// key handle function.
// Will call 'keyHandle' callback filter
keyHandle: function(e) {
this.keyEvent = e;
this._callFilters('keyHandle');
this.keyEvent = undefined;
delete(this.keyEvent);
},
// Get the internal object
getInternal: function() {
return _internal;
},
// Internal function for closing a nyroModal
// Will call 'close' callback filter
_close: function() {
this.getInternal()._removeStack(this.opener);
this._opened = false;
this._open = false;
this._callFilters('close');
},
// Public function for closing a nyroModal
close: function() {
this._close();
this._callFilters('beforeClose');
var self = this;
this._unreposition();
self._callAnim('hideCont', function() {
self._callAnim('hideLoad', function() {
self._callAnim('hideBg', function() {
self._callFilters('afterClose');
self.elts.cont.remove();
self.elts.hidden.remove();
self.elts.load.remove();
self.elts.bg.remove();
self.elts.all.remove();
self.elts.cont = self.elts.hidden = self.elts.load = self.elts.bg = self.elts.all = undefined;
});
});
});
},
// Init HTML elements
_initElts: function() {
if (!this.stack && this.getInternal().stack.length > 1)
this.elts = this.getInternal().stack[this.getInternal().stack.length-2]['nmObj'].elts;
if (!this.elts.all || this.elts.all.closest('body').length == 0)
this.elts.all = this.elts.bg = this.elts.cont = this.elts.hidden = this.elts.load = undefined;
if (!this.elts.all)
this.elts.all = $('<div />').appendTo(this.getInternal()._container);
if (!this.elts.bg)
this.elts.bg = $('<div />').hide().appendTo(this.elts.all);
if (!this.elts.cont)
this.elts.cont = $('<div />').hide().appendTo(this.elts.all);
if (!this.elts.hidden)
this.elts.hidden = $('<div />').hide().appendTo(this.elts.all);
this.elts.hidden.empty();
if (!this.elts.load)
this.elts.load = $('<div />').hide().appendTo(this.elts.all);
this._callFilters('initElts');
},
// Trigger the error
// Will call 'error' callback filter
_error: function() {
this._callFilters('error');
},
// Set the HTML content to show.
// - html: HTML content
// - selector: selector to filter the content
// Will init the size and call the 'size' function.
// Will call 'filledContent' callback filter
_setCont: function(html, selector) {
if (selector) {
var tmp = [],
i = 0;
// Looking for script to store them
html = html
.replace(/\r\n/gi, 'nyroModalLN')
.replace(/<script(.|\s)*?\/script>/gi, function(x) {
tmp[i] = x;
return '<pre class=nyroModalScript rel="'+(i++)+'"></pre>';
});
var cur = $('<div>'+html+'</div>').find(selector);
if (cur.length) {
html = cur.html()
.replace(/<pre class="?nyroModalScript"? rel="?(.?)"?><\/pre>/gi, function(x, y, z) { return tmp[y]; })
.replace(/nyroModalLN/gi, "\r\n");
} else {
// selector not found
this._error();
return;
}
}
this.elts.hidden
.append(this._filterScripts(html))
.prepend(this.header)
.append(this.footer)
.wrapInner('<div class="nyroModal'+ucfirst(this.loadFilter)+'" />');
// Store the size of the element
this.sizes.initW = this.sizes.w = this.elts.hidden.width();
this.sizes.initH = this.sizes.h = this.elts.hidden.height();
var outer = this.getInternal()._getOuter(this.elts.cont);
this.sizes.hMargin = outer.h.total;
this.sizes.wMargin = outer.w.total;
this.size();
this.loading = false;
this._callFilters('filledContent');
this._contentLoading();
},
// Filter an html content to remove the script[src] and store them appropriately if needed
// - data: Data to filter
_filterScripts: function(data) {
if (typeof data != 'string')
return data;
this._scripts = [];
this._scriptsShown = [];
var start = 0,
stStart = '<script',
stEnd = '</script>',
endLn = stEnd.length,
pos,
pos2,
tmp;
while ((pos = data.indexOf(stStart, start)) > -1) {
pos2 = data.indexOf(stEnd)+endLn;
tmp = $(data.substring(pos, pos2));
if (!tmp.attr('src') || tmp.attr('rel') == 'forceLoad') {
if (tmp.attr('rev') == 'shown')
this._scriptsShown.push(tmp.get(0));
else
this._scripts.push(tmp.get(0));
}
data = data.substring(0, pos)+data.substr(pos2);
start = pos;
}
return data;
},
// Check if the nmObject has a specific filter
// - filter: Filter name
_hasFilter: function(filter) {
var ret = false;
$.each(this.filters, function(i, f) {
ret = ret || f == filter;
});
return ret;
},
// Remove a specific filter
// - filter: Filter name
_delFilter: function(filter) {
this.filters = $.map(this.filters, function(v) {
if (v != filter)
return v;
});
},
// Call a function against all active filters
// - fct: Function name
// return an array of all return of callbacks; keys are filters name
_callFilters: function(fct) {
this.getInternal()._debug(fct);
var ret = [],
self = this;
$.each(this.filters, function(i, f) {
ret[f] = self._callFilter(f, fct);
});
if (this.callbacks[fct] && $.isFunction(this.callbacks[fct]))
this.callbacks[fct](this);
return ret;
},
// Call a filter function for a specific filter
// - f: Filter name
// - fct: Function name
// return the return of the callback
_callFilter: function(f, fct) {
if (_filters[f] && _filters[f][fct] && $.isFunction(_filters[f][fct]))
return _filters[f][fct](this);
return undefined;
},
// Call animation callback.
// Will also call beforeNNN and afterNNN filter callbacks
// - fct: Animation function name
// - clb: Callback once the animation is done
_callAnim: function(fct, clb) {
this.getInternal()._debug(fct);
this._callFilters('before'+ucfirst(fct));
if (!this._animated) {
this._animated = true;
if (!$.isFunction(clb)) clb = $.noop;
var set = this.anim[fct] || this.anim.def || 'basic';
if (!_animations[set] || !_animations[set][fct] || !$.isFunction(_animations[set][fct]))
set = 'basic';
_animations[set][fct](this, $.proxy(function() {
this._animated = false;
this._callFilters('after'+ucfirst(fct));
clb();
}, this));
}
},
// Load the content
// Will call the 'load' function of the filter specified in the loadFilter parameter
_load: function() {
this.getInternal()._debug('_load');
if (!this.loading && this.loadFilter) {
this.loading = true;
this._callFilter(this.loadFilter, 'load');
}
},
// Show the content or the loading according to the current state of the modal
_contentLoading: function() {
if (!this._animated && this._bgReady) {
if (!this._transition && this.elts.cont.html().length > 0)
this._transition = true;
this._nbContentLoading++;
if (!this.loading) {
if (!this._opened) {
this._opened = true;
if (this._transition) {
var fct = $.proxy(function() {
this._writeContent();
this._callFilters('beforeShowCont');
this._callAnim('hideTrans', $.proxy(function() {
this._transition = false;
this._callFilters('afterShowCont');
this.elts.cont.append(this._scriptsShown);
this._reposition();
}, this));
}, this);
if (this._nbContentLoading == 1) {
this._unreposition();
this._callAnim('showTrans', fct);
} else {
fct();
}
} else {
this._callAnim('hideLoad', $.proxy(function() {
this._writeContent();
this._callAnim('showCont', $.proxy(function() {
this.elts.cont.append(this._scriptsShown);
this._reposition();
}, this));
}, this));
}
}
} else if (this._nbContentLoading == 1) {
var outer = this.getInternal()._getOuter(this.elts.load);
this.elts.load
.css({
position: 'fixed',
top: (this.getInternal().fullSize.viewH - this.elts.load.height() - outer.h.margin)/2,
left: (this.getInternal().fullSize.viewW - this.elts.load.width() - outer.w.margin)/2
});
if (this._transition) {
this._unreposition();
this._callAnim('showTrans', $.proxy(function() {
this._contentLoading();
}, this));
} else {
this._callAnim('showLoad', $.proxy(function() {
this._contentLoading();
}, this));
}
}
}
},
// Write the content in the modal.
// Content comes from the hidden div, scripts and eventually close button.
_writeContent: function() {
this.elts.cont
.empty()
.append(this.elts.hidden.contents())
.append(this._scripts)
.append(this.showCloseButton ? this.closeButton : '')
.css({
position: 'fixed',
width: this.sizes.w,
height: this.sizes.h,
top: (this.getInternal().fullSize.viewH - this.sizes.h - this.sizes.hMargin)/2,
left: (this.getInternal().fullSize.viewW - this.sizes.w - this.sizes.wMargin)/2
});
},
// Reposition elements with a class nmReposition
_reposition: function() {
var elts = this.elts.cont.find('.nmReposition');
if (elts.length) {
var space = this.getInternal()._getSpaceReposition();
elts.each(function() {
var me = $(this),
offset = me.offset();
me.css({
position: 'fixed',
top: offset.top - space.top,
left: offset.left - space.left
});
});
this.elts.cont.after(elts);
}
this.elts.cont.css('overflow', 'auto');
this._callFilters('afterReposition');
},
// Unreposition elements with a class nmReposition
// Exaclty the reverse of the _reposition function
_unreposition: function() {
this.elts.cont.css('overflow', '');
var elts = this.elts.all.find('.nmReposition');
if (elts.length)
this.elts.cont.append(elts.removeAttr('style'));
this._callFilters('afterUnreposition');
}
},
_internal = {
firstInit: true,
debug: false,
stack: [],
fullSize: {
w: 0,
h: 0,
wW: 0,
wH: 0,
viewW: 0,
viewH: 0
},
nyroModal: function(opts, fullObj) {
if (_internal.firstInit) {
_internal._container = $('<div />').appendTo($b);
$w.smartresize($.proxy(_internal._resize, _internal));
$d.on('keydown.nyroModal', $.proxy(_internal._keyHandler, _internal));
_internal._calculateFullSize();
_internal.firstInit = false;
}
return this.nmInit(opts, fullObj).each(function() {
_internal._init($(this).data('nmObj'));
});
},
nmInit: function(opts, fullObj) {
return this.each(function() {
var me = $(this);
if (fullObj)
me.data('nmObj', $.extend(true, {opener: me}, opts));
else
me.data('nmObj',
me.data('nmObj')
? $.extend(true, me.data('nmObj'), opts)
: $.extend(true, {opener: me}, _nmObj, opts));
});
},
nmCall: function() {
return this.trigger('nyroModal');
},
nmManual: function(url, opts) {
$('<a href="'+url+'"></a>').nyroModal(opts).trigger('nyroModal');
},
nmData: function(data, opts) {
this.nmManual('#', $.extend({data: data}, opts));
},
nmObj: function(opts) {
$.extend(true, _nmObj, opts);
},
nmInternal: function(opts) {
$.extend(true, _internal, opts);
},
nmAnims: function(opts) {
$.extend(true, _animations, opts);
},
nmFilters: function(opts) {
$.extend(true, _filters, opts);
},
nmTop: function() {
if (_internal.stack.length)
return _internal.stack[_internal.stack.length-1]['nmObj'];
return undefined;
},
_debug: function(msg) {
if (this.debug && window.console && window.console.log)
window.console.log(msg);
},
_container: undefined,
_init: function(nm) {
nm.filters = [];
$.each(_filters, function(f, obj) {
if (obj.is && $.isFunction(obj.is) && obj.is(nm)) {
nm.filters.push(f);
}
});
nm._callFilters('initFilters');
nm._callFilters('init');
nm.opener
.off('nyroModal.nyroModal nmClose.nyroModal nmResize.nyroModal')
.on({
'nyroModal.nyroModal': function(e) { nm.open(); return false;},
'nmClose.nyroModal': function() { nm.close(); return false;},
'nmResize.nyroModal': function() { nm.resize(); return false;}
});
},
_scrollWidth: (function() {
var scrollbarWidth;
if ($.browser.msie) {
var $textarea1 = $('<textarea cols="10" rows="2"></textarea>')
.css({ position: 'absolute', top: -1000, left: -1000 }).appendTo($b),
$textarea2 = $('<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>')
.css({ position: 'absolute', top: -1000, left: -1000 }).appendTo($b);
scrollbarWidth = $textarea1.width() - $textarea2.width();
$textarea1.add($textarea2).remove();
} else {
var $div = $('<div />')
.css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: -1000 })
.prependTo($b).append('<div />').find('div')
.css({ width: '100%', height: 200 });
scrollbarWidth = 100 - $div.width();
$div.parent().remove();
}
return scrollbarWidth;
})(),
_selNyroModal: function(obj) {
return $(obj).data('nmObj') ? true : false;
},
_selNyroModalOpen: function(obj) {
var me = $(obj);
return me.data('nmObj') ? me.data('nmObj')._open : false;
},
_keyHandler: function(e) {
var nmTop = $.nmTop();
if (nmTop && nmTop.useKeyHandler) {
return nmTop.keyHandle(e);
}
},
_pushStack: function(obj) {
this.stack = $.map(this.stack, function(elA) {
if (elA['nmOpener'] != obj.get(0))
return elA;
});
this.stack.push({
nmOpener: obj.get(0),
nmObj: $(obj).data('nmObj')
});
},
_removeStack: function(obj) {
this.stack = $.map(this.stack, function(elA) {
if (elA['nmOpener'] != obj.get(0))
return elA;
});
},
_resize: function() {
var opens = $(':nmOpen').each(function() {
$(this).data('nmObj')._unreposition();
});
this._calculateFullSize();
opens.trigger('nmResize');
},
_calculateFullSize: function() {
this.fullSize = {
w: $d.width(),
h: $d.height(),
wW: $w.width(),
wH: $w.height()
};
this.fullSize.viewW = Math.min(this.fullSize.w, this.fullSize.wW);
this.fullSize.viewH = Math.min(this.fullSize.h, this.fullSize.wH);
},
_getCurCSS: function(elm, name) {
var ret = parseInt($.curCSS(elm, name, true));
return isNaN(ret) ? 0 : ret;
},
_getOuter: function(elm) {
elm = elm.get(0);
var ret = {
h: {
margin: this._getCurCSS(elm, 'marginTop') + this._getCurCSS(elm, 'marginBottom'),
border: this._getCurCSS(elm, 'borderTopWidth') + this._getCurCSS(elm, 'borderBottomWidth'),
padding: this._getCurCSS(elm, 'paddingTop') + this._getCurCSS(elm, 'paddingBottom')
},
w: {
margin: this._getCurCSS(elm, 'marginLeft') + this._getCurCSS(elm, 'marginRight'),
border: this._getCurCSS(elm, 'borderLeftWidth') + this._getCurCSS(elm, 'borderRightWidth'),
padding: this._getCurCSS(elm, 'paddingLeft') + this._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;
},
_getSpaceReposition: function() {
var outer = this._getOuter($b),
ie7 = $.browser.msie && $.browser.version < 8 && !(screen.height <= $w.height()+23);
return {
top: $w.scrollTop() - (!ie7 ? outer.h.border / 2 : 0),
left: $w.scrollLeft() - (!ie7 ? outer.w.border / 2 : 0)
};
},
_getHash: function(url) {
if (typeof url == 'string') {
var hashPos = url.indexOf('#');
if (hashPos > -1)
return url.substring(hashPos);
}
return '';
},
_extractUrl: function(url) {
var ret = {
url: undefined,
sel: undefined
};
if (url) {
var hash = this._getHash(url),
hashLoc = this._getHash(window.location.href),
curLoc = window.location.href.substring(0, window.location.href.length - hashLoc.length),
req = url.substring(0, url.length - hash.length);
ret.sel = hash;
if (req != curLoc && req != baseHref)
ret.url = req;
}
return ret;
}
},
_animations = {
basic: {
showBg: function(nm, clb) {
nm.elts.bg.css({opacity: 0.7}).show();
clb();
},
hideBg: function(nm, clb) {
nm.elts.bg.hide();
clb();
},
showLoad: function(nm, clb) {
nm.elts.load.show();
clb();
},
hideLoad: function(nm, clb) {
nm.elts.load.hide();
clb();
},
showCont: function(nm, clb) {
nm.elts.cont.show();
clb();
},
hideCont: function(nm, clb) {
nm.elts.cont.hide();
clb();
},
showTrans: function(nm, clb) {
nm.elts.cont.hide();
nm.elts.load.show();
clb();
},
hideTrans: function(nm, clb) {
nm.elts.cont.show();
nm.elts.load.hide();
clb();
},
resize: function(nm, clb) {
nm.elts.cont.css({
width: nm.sizes.w,
height: nm.sizes.h,
top: (nm.getInternal().fullSize.viewH - nm.sizes.h - nm.sizes.hMargin)/2,
left: (nm.getInternal().fullSize.viewW - nm.sizes.w - nm.sizes.wMargin)/2
});
clb();
}
}
},
_filters = {
basic: {
is: function(nm) {
return true;
},
init: function(nm) {
if (nm.opener.attr('rev') == 'modal')
nm.modal = true;
if (nm.modal)
nm.closeOnEscape = nm.closeOnClick = nm.showCloseButton = false;
if (nm.closeOnEscape)
nm.useKeyHandler = true;
},
initElts: function(nm) {
nm.elts.bg.addClass('nyroModalBg');
if (nm.closeOnClick)
nm.elts.bg.off('click.nyroModal').on('click.nyroModal', function(e) {
e.preventDefault();
nm.close();
});
nm.elts.cont.addClass('nyroModalCont');
nm.elts.hidden.addClass('nyroModalCont nyroModalHidden');
nm.elts.load.addClass('nyroModalCont nyroModalLoad');
},
error: function(nm) {
nm.elts.hidden.addClass('nyroModalError');
nm.elts.cont.addClass('nyroModalError');
nm._setCont(nm.errorMsg);
},
beforeShowCont: function(nm) {
nm.elts.cont
.find('.nyroModal').each(function() {
var cur = $(this);
cur.nyroModal(nm.getForNewLinks(cur), true);
}).end()
.find('.nyroModalClose').on('click.nyroModal', function(e) {
e.preventDefault();
nm.close();
});
},
keyHandle: function(nm) {
// used for escape key
if (nm.keyEvent.keyCode == 27 && nm.closeOnEscape) {
nm.keyEvent.preventDefault();
nm.close();
}
}
},
custom: {
is: function(nm) {
return true;
}
}
};
// Add jQuery call fucntions
$.fn.extend({
nm: _internal.nyroModal,
nyroModal: _internal.nyroModal,
nmInit: _internal.nmInit,
nmCall: _internal.nmCall
});
// Add global jQuery functions
$.extend({
nmManual: _internal.nmManual,
nmData: _internal.nmData,
nmObj: _internal.nmObj,
nmInternal: _internal.nmInternal,
nmAnims: _internal.nmAnims,
nmFilters: _internal.nmFilters,
nmTop: _internal.nmTop
});
// Add jQuery selectors
$.expr[':'].nyroModal = $.expr[':'].nm = _internal._selNyroModal;
$.expr[':'].nmOpen = _internal._selNyroModalOpen;
});
// Smartresize plugin
(function($,sr){
// debouncing function from John Hann
// http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
var debounce = function (func, threshold, execAsap) {
var timeout;
return function debounced () {
var obj = this, args = arguments;
function delayed () {
if (!execAsap)
func.apply(obj, args);
timeout = null;
};
if (timeout)
clearTimeout(timeout);
else if (execAsap)
func.apply(obj, args);
timeout = setTimeout(delayed, threshold || 100);
};
};
// smartresize
jQuery.fn[sr] = function(fn){ return fn ? this.on('resize', debounce(fn)) : this.trigger(sr); };
})(jQuery,'smartresize');
// ucFirst
function ucfirst(str) {
// http://kevin.vanzonneveld.net
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + bugfixed by: Onno Marsman
// + improved by: Brett Zamir (http://brett-zamir.me)
// * example 1: ucfirst('kevin van zonneveld');
// * returns 1: 'Kevin van zonneveld'
str += '';
var f = str.charAt(0).toUpperCase();
return f + str.substr(1);
}
/*
* nyroModal v2.0.0
*
* Fade animations
*
* Depends:
*
*/
jQuery(function($, undefined) {
$.nmAnims({
fade: {
showBg: function(nm, clb) {
nm.elts.bg.fadeTo(250, 0.7, clb);
},
hideBg: function(nm, clb) {
nm.elts.bg.fadeOut(clb);
},
showLoad: function(nm, clb) {
nm.elts.load.fadeIn(clb);
},
hideLoad: function(nm, clb) {
nm.elts.load.fadeOut(clb);
},
showCont: function(nm, clb) {
nm.elts.cont.fadeIn(clb);
},
hideCont: function(nm, clb) {
nm.elts.cont.css('overflow', 'hidden').fadeOut(clb);
},
showTrans: function(nm, clb) {
nm.elts.load
.css({
position: nm.elts.cont.css('position'),
top: nm.elts.cont.css('top'),
left: nm.elts.cont.css('left'),
width: nm.elts.cont.css('width'),
height: nm.elts.cont.css('height'),
marginTop: nm.elts.cont.css('marginTop'),
marginLeft: nm.elts.cont.css('marginLeft')
})
.fadeIn(function() {
nm.elts.cont.hide();
clb();
});
},
hideTrans: function(nm, clb) {
nm.elts.cont.css('visibility', 'hidden').show();
nm.elts.load
.css('position', nm.elts.cont.css('position'))
.animate({
top: nm.elts.cont.css('top'),
left: nm.elts.cont.css('left'),
width: nm.elts.cont.css('width'),
height: nm.elts.cont.css('height'),
marginTop: nm.elts.cont.css('marginTop'),
marginLeft: nm.elts.cont.css('marginLeft')
}, function() {
nm.elts.cont.css('visibility', '');
nm.elts.load.fadeOut(clb);
});
},
resize: function(nm, clb) {
nm.elts.cont.animate({
width: nm.sizes.w,
height: nm.sizes.h,
top: (nm.getInternal().fullSize.viewH - nm.sizes.h - nm.sizes.hMargin)/2,
left: (nm.getInternal().fullSize.viewW - nm.sizes.w - nm.sizes.wMargin)/2
}, clb);
}
}
});
// Define fade aniamtions as default
$.nmObj({anim: {def: 'fade'}});
});
/*
* nyroModal v2.0.0
*
* Title filter
*
* Depends:
*
* Before:
*/
jQuery(function($, undefined) {
$.nmFilters({
title: {
is: function(nm) {
return nm.opener.is('[title]');
},
beforeShowCont: function(nm) {
var offset = nm.elts.cont.offset();
nm.store.title = $('<h1 />', {
text: nm.opener.attr('title')
}).addClass('nyroModalTitle nmReposition');
nm.elts.cont.prepend(nm.store.title);
},
close: function(nm) {
if (nm.store.title) {
nm.store.title.remove();
nm.store.title = undefined;
delete(nm.store.title);
}
}
}
});
});
/*
* nyroModal v2.0.0
*
* Gallery filter
*
* Depends:
* - filters.title
*
* Before: filters.title
*/
jQuery(function($, undefined) {
$.nmFilters({
gallery: {
is: function(nm) {
var ret = nm.opener.is('[rel]:not([rel=external], [rel=nofollow])');
if (ret) {
var rel = nm.opener.attr('rel'),
indexSpace = rel.indexOf(' '),
gal = indexSpace > 0 ? rel.substr(0, indexSpace) : rel,
links = $('[href][rel="'+gal+'"], [href][rel^="'+gal+' "]');
if (links.length < 2)
ret = false;
if (ret && nm.galleryCounts && !nm._hasFilter('title'))
nm.filters.push('title');
}
return ret;
},
init: function(nm) {
nm.useKeyHandler = true;
},
keyHandle: function(nm) {
// used for arrows key
if (!nm._animated && nm._opened) {
if (nm.keyEvent.keyCode == 39 || nm.keyEvent.keyCode == 40) {
nm.keyEvent.preventDefault();
nm._callFilters('galleryNext');
} else if (nm.keyEvent.keyCode == 37 || nm.keyEvent.keyCode == 38) {
nm.keyEvent.preventDefault();
nm._callFilters('galleryPrev');
}
}
},
initElts: function(nm) {
var rel = nm.opener.attr('rel'),
indexSpace = rel.indexOf(' ');
nm.store.gallery = indexSpace > 0 ? rel.substr(0, indexSpace) : rel;
nm.store.galleryLinks = $('[href][rel="'+nm.store.gallery+'"], [href][rel^="'+nm.store.gallery+' "]');
nm.store.galleryIndex = nm.store.galleryLinks.index(nm.opener);
},
beforeShowCont: function(nm) {
if (nm.galleryCounts && nm.store.title && nm.store.galleryLinks && nm.store.galleryLinks.length > 1) {
var curTitle = nm.store.title.html();
nm.store.title.html((curTitle.length ? curTitle+' - ' : '')+(nm.store.galleryIndex+1)+'/'+nm.store.galleryLinks.length);
}
},
filledContent: function(nm) {
var link = this._getGalleryLink(nm, -1),
append = nm.elts.hidden.find(' > div');
if (link) {
$('<a />', {
text: 'previous',
href: '#'
})
.addClass('nyroModalPrev')
.on('click', function(e) {
e.preventDefault();
nm._callFilters('galleryPrev');
})
.appendTo(append);
}
link = this._getGalleryLink(nm, 1);
if (link) {
$('<a />', {
text: 'next',
href: '#'
})
.addClass('nyroModalNext')
.on('click', function(e) {
e.preventDefault();
nm._callFilters('galleryNext');
})
.appendTo(append);
}
},
close: function(nm) {
nm.store.gallery = undefined;
nm.store.galleryLinks = undefined;
nm.store.galleryIndex = undefined;
delete(nm.store.gallery);
delete(nm.store.galleryLinks);
delete(nm.store.galleryIndex);
if (nm.elts.cont)
nm.elts.cont.find('.nyroModalNext, .nyroModalPrev').remove();
},
galleryNext: function(nm) {
this._getGalleryLink(nm, 1).nyroModal(nm.getForNewLinks(), true).click();
},
galleryPrev: function(nm) {
this._getGalleryLink(nm, -1).nyroModal(nm.getForNewLinks(), true).click();
},
_getGalleryLink: function(nm, dir) {
if (nm.store.gallery) {
if (!nm.ltr)
dir *= -1;
var index = nm.store.galleryIndex + dir;
if (nm.store.galleryLinks && index >= 0 && index < nm.store.galleryLinks.length)
return nm.store.galleryLinks.eq(index);
else if (nm.galleryLoop && nm.store.galleryLinks)
return nm.store.galleryLinks.eq(index<0 ? nm.store.galleryLinks.length-1 : 0);
}
return undefined;
}
}
});
});
/*
* nyroModal v2.0.0
*
* Link filter
*
* Depends:
*
* Before: filters.gallery
*/
jQuery(function($, undefined) {
$.nmFilters({
link: {
is: function(nm) {
var ret = nm.opener.is('[href]');
if (ret)
nm.store.link = nm.getInternal()._extractUrl(nm.opener.attr('href'));
return ret;
},
init: function(nm) {
nm.loadFilter = 'link';
nm.opener.off('click.nyroModal').on('click.nyroModal', function(e) {
e.preventDefault();
nm.opener.trigger('nyroModal');
});
},
load: function(nm) {
var ajax = $.extend(true, {}, nm.ajax || {}, {
url: nm.store.link.url,
data: nm.store.link.sel ? [{name: nm.selIndicator, value: nm.store.link.sel.substring(1)}] : undefined,
success: function(data) {
nm._setCont(data, nm.store.link.sel);
},
error: function() {
nm._error();
}
});
$.ajax(ajax);
}
}
});
});
/*
* nyroModal v2.0.0
*
* Dom filter
*
* Depends:
* - filters.link
*
* Before: filters.link
*/
jQuery(function($, undefined) {
$.nmFilters({
dom: {
is: function(nm) {
return nm._hasFilter('link') && !nm.store.link.url && nm.store.link.sel;
},
init: function(nm) {
nm.loadFilter = 'dom';
},
load: function(nm) {
nm.store.domEl = $(nm.store.link.sel);
if (nm.store.domEl.length)
nm._setCont(nm.store.domEl.contents());
else
nm._error();
},
close: function(nm) {
if (nm.store.domEl && nm.elts.cont)
nm.store.domEl.append(nm.elts.cont.find('.nyroModalDom').contents());
}
}
});
});
/*
* nyroModal v2.0.0
*
* Data filter
*
* Depends:
* - filters.link
*
* Before: filters.dom
*/
jQuery(function($, undefined) {
$.nmFilters({
data: {
is: function(nm) {
var ret = nm.data ? true : false;
if (ret) {
nm._delFilter('dom');
}
return ret;
},
init: function(nm) {
nm.loadFilter = 'data';
},
load: function(nm) {
nm._setCont(nm.data);
}
}
});
});
/*
* nyroModal v2.0.0
*
* Image filter
*
* Depends:
* - filters.link
*
* Before: filters.data
*/
jQuery(function($, undefined) {
$.nmFilters({
image: {
is: function(nm) {
return (new RegExp(nm.imageRegex, 'i')).test(nm.opener.attr('href'));
},
init: function(nm) {
nm.loadFilter = 'image';
},
load: function(nm) {
var url = nm.opener.attr('href');
$('<img />')
.load(function() {
nm.elts.cont.addClass('nyroModalImg');
nm.elts.hidden.addClass('nyroModalImg');
nm._setCont(this);
}).error(function() {
nm._error();
})
.attr('src', url);
},
size: function(nm) {
if (nm.sizes.w != nm.sizes.initW || nm.sizes.h != nm.sizes.initH) {
var ratio = Math.min(nm.sizes.w/nm.sizes.initW, nm.sizes.h/nm.sizes.initH);
nm.sizes.w = nm.sizes.initW * ratio;
nm.sizes.h = nm.sizes.initH * ratio;
}
var img = nm.loading ? nm.elts.hidden.find('img') : nm.elts.cont.find('img');
img.attr({
width: nm.sizes.w,
height: nm.sizes.h
});
},
close: function(nm) {
if (nm.elts.cont) {
nm.elts.cont.removeClass('nyroModalImg');
nm.elts.hidden.removeClass('nyroModalImg');
}
}
}
});
});
/*
* nyroModal v2.0.0
*
* SWF filter
*
* Depends:
* - filters.link
*
* Before: filters.image
*/
jQuery(function($, undefined) {
$.nmFilters({
swf: {
idCounter: 1,
is: function(nm) {
return nm._hasFilter('link') && nm.opener.is('[href$=".swf"]');
},
init: function(nm) {
nm.loadFilter = 'swf';
},
load: function(nm) {
if (!nm.swfObjectId)
nm.swfObjectId = 'nyroModalSwf-'+(this.idCounter++);
var url = nm.store.link.url,
cont = '<div><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="'+nm.swfObjectId+'" width="'+nm.sizes.w+'" height="'+nm.sizes.h+'"><param name="movie" value="'+url+'"></param>',
tmp = '';
$.each(nm.swf, function(name, val) {
cont+= '<param name="'+name+'" value="'+val+'"></param>';
tmp+= ' '+name+'="'+val+'"';
});
cont+= '<embed src="'+url+'" type="application/x-shockwave-flash" width="'+nm.sizes.w+'" height="'+nm.sizes.h+'"'+tmp+'></embed></object></div>';
nm._setCont(cont);
}
}
});
});
/*
* nyroModal v2.0.0
*
* Form filter
*
* Depends:
*
* Before: filters.swf
*/
jQuery(function($, undefined) {
$.nmFilters({
form: {
is: function(nm) {
var ret = nm.opener.is('form');
if (ret)
nm.store.form = nm.getInternal()._extractUrl(nm.opener.attr('action'));
return ret;
},
init: function(nm) {
nm.loadFilter = 'form';
nm.opener.off('submit.nyroModal').on('submit.nyroModal', function(e) {
e.preventDefault();
nm.opener.trigger('nyroModal');
});
},
load: function(nm) {
var data = {};
$.map(nm.opener.serializeArray(), function(d){
data[d.name] = d.value;
});
if (nm.store.form.sel)
data[nm.selIndicator] = nm.store.form.sel.substring(1);
var ajax = $.extend(true, { type : 'get', dataType : 'text' }, nm.ajax || {}, {
url: nm.store.form.url,
data: data,
type: nm.opener.attr('method') ? nm.opener.attr('method') : undefined,
success: function(data) {
nm._setCont(data, nm.store.form.sel);
},
error: function() {
nm._error();
}
});
$.ajax(ajax);
}
}
});
});
/*
* nyroModal v2.0.0
*
* Form file filter
*
* Depends:
*
* Before: filters.form
*/
jQuery(function($, undefined) {
$.nmFilters({
formFile: {
is: function(nm) {
var ret = nm.opener.is('form[enctype="multipart/form-data"]');
if (ret) {
nm._delFilter('form');
if (!nm.store.form)
nm.store.form = nm.getInternal()._extractUrl(nm.opener.attr('action'));
}
return ret;
},
init: function(nm) {
nm.loadFilter = 'formFile';
nm.store.formFileLoading = false;
nm.opener.off('submit.nyroModal').on('submit.nyroModal', function(e) {
if (!nm.store.formFileIframe) {
e.preventDefault();
nm.opener.trigger('nyroModal');
} else {
nm.store.formFileLoading = true;
}
});
},
initElts: function(nm) {
var inputSel;
if (nm.store.form.sel)
inputSel = $('<input />', {
'type': 'hidden',
name: nm.selIndicator,
value: nm.store.form.sel.substring(1)
}).appendTo(nm.opener);
function rmFormFileElts() {
if (inputSel) {
inputSel.remove();
inputSel = undefined;
delete(inputSel);
}
nm.store.formFileIframe.attr('src', 'about:blank').remove();
nm.store.formFileIframe = undefined;
delete(nm.store.formFileIframe);
}
nm.store.formFileIframe = $('<iframe name="nyroModalFormFile" src="javascript:\'\';" id="nyromodal-iframe-'+(new Date().getTime())+'"></iframe>')
.hide()
.load(function() {
if (nm.store.formFileLoading) {
nm.store.formFileLoading = false;
var content = nm.store.formFileIframe
.off('load error')
.contents().find('body').not('script[src]');
if (content && content.html() && content.html().length) {
rmFormFileElts();
nm._setCont(content.html(), nm.store.form.sel);
} else {
// Not totally ready, try it in a few secs
var nbTry = 0;
fct = function() {
nbTry++;
var content = nm.store.formFileIframe
.off('load error')
.contents().find('body').not('script[src]');
if (content && content.html() && content.html().length) {
nm._setCont(content.html(), nm.store.form.sel);
rmFormFileElts();
} else if (nbTry < 5) {
setTimeout(fct, 25);
} else {
rmFormFileElts();
nm._error();
}
};
setTimeout(fct, 25);
}
}
})
.error(function() {
rmFormFileElts();
nm._error();
});
nm.elts.all.append(nm.store.formFileIframe);
nm.opener
.attr('target', 'nyroModalFormFile')
.submit();
},
close: function(nm) {
nm.store.formFileLoading = false;
if (nm.store.formFileIframe) {
nm.store.formFileIframe.remove();
nm.store.formFileIframe = undefined;
delete(nm.store.formFileIframe);
}
}
}
});
});
/*
* nyroModal v2.0.0
*
* Iframe filter
*
* Depends:
* - filters.link
*
* Before: filters.formFile
*/
jQuery(function($, undefined) {
$.nmFilters({
iframe: {
is: function(nm) {
var target = nm.opener.attr('target') || '',
rel = nm.opener.attr('rel') || '',
opener = nm.opener.get(0);
return !nm._hasFilter('image') && (target.toLowerCase() == '_blank'
|| rel.toLowerCase().indexOf('external') > -1
|| (opener.hostname && opener.hostname.replace(/:\d*$/,'') != window.location.hostname.replace(/:\d*$/,'')));
},
init: function(nm) {
nm.loadFilter = 'iframe';
},
load: function(nm) {
nm.store.iframe = $('<iframe src="javascript:\'\';" id="nyromodal-iframe-'+(new Date().getTime())+'" frameborder="0"></iframe>');
nm._setCont(nm.store.iframe);
},
afterShowCont: function(nm) {
nm.store.iframe.attr('src', nm.opener.attr('href'));
},
close: function(nm) {
if (nm.store.iframe) {
nm.store.iframe.remove();
nm.store.iframe = undefined;
delete(nm.store.iframe);
}
}
}
});
});
/*
* nyroModal v2.0.0
*
* Iframe form filter
*
* Depends:
* - filters.iframe
*
* Before: filters.iframe
*/
jQuery(function($, undefined) {
$.nmFilters({
iframeForm: {
is: function(nm) {
var ret = nm._hasFilter('iframe') && nm.opener.is('form');
if (ret) {
nm._delFilter('iframe');
nm._delFilter('form');
}
return ret;
},
init: function(nm) {
nm.loadFilter = 'iframeForm';
nm.store.iframeFormLoading = false;
nm.store.iframeFormOrgTarget = nm.opener.attr('target');
nm.opener.off('submit.nyroModal').on('submit.nyroModal', function(e) {
if (!nm.store.iframeFormIframe) {
e.preventDefault();
nm.opener.trigger('nyroModal');
} else {
nm.store.iframeFormLoading = true;
}
});
},
load: function(nm) {
nm.store.iframeFormIframe = $('<iframe name="nyroModalIframeForm" src="javascript:\'\';" id="nyromodal-iframe-'+(new Date().getTime())+'"></iframe>');
nm._setCont(nm.store.iframeFormIframe);
},
afterShowCont: function(nm) {
nm.opener
.attr('target', 'nyroModalIframeForm')
.submit();
},
close: function(nm) {
nm.store.iframeFormOrgTarget ? nm.opener.attr('target', nm.store.iframeFormOrgTarget) : nm.opener.removeAttr('target');
delete(nm.store.formFileLoading);
delete(nm.store.iframeFormOrgTarget);
if (nm.store.iframeFormIframe) {
nm.store.iframeFormIframe.remove();
nm.store.iframeFormIframe = undefined;
delete(nm.store.iframeFormIframe);
}
}
}
});
});
/*
* nyroModal v2.0.0
*
* Embedly filter
*
* Depends:
* - filters.link
*
* Before: filters.iframeForm
*/
jQuery(function($, undefined) {
$.nmObj({
embedlyUrl: 'http://api.embed.ly/1/oembed',
embedly: {
key: undefined,
wmode: 'transparent',
allowscripts: true,
format: 'json'
/*
maxwidth: 400,
maxheight: 400,
width: 400,
nostyle: false,
autoplay: false,
videosrc: false,
words: 50,
chars: 100
*/
}
});
var cache = [];
$.nmFilters({
embedly: {
is: function(nm) {
if (nm._hasFilter('link') && nm._hasFilter('iframe') && nm.opener.attr('href') && nm.embedly.key) {
if (cache[nm.opener.attr('href')]) {
nm.store.embedly = cache[nm.opener.attr('href')];
nm._delFilter('iframe');
return true;
}
nm.store.embedly = false;
var data = nm.embedly;
data.url = nm.opener.attr('href');
$.ajax({
url: nm.embedlyUrl,
dataType: 'jsonp',
data: data,
success: function(data) {
if (data.type != 'error') {
nm.store.embedly = data;
cache[nm.opener.attr('href')] = data;
nm._delFilter('iframe');
nm.filters.push('embedly');
nm._callFilters('initFilters');
nm._callFilters('init');
}
}
});
}
return false;
},
init: function(nm) {
nm.loadFilter = 'embedly';
},
load: function(nm) {
if (nm.store.embedly.type == 'photo') {
nm.filters.push('image');
$('<img />')
.load(function() {
nm.elts.cont.addClass('nyroModalImg');
nm.elts.hidden.addClass('nyroModalImg');
nm._setCont(this);
}).error(function() {
nm._error();
})
.attr('src', nm.store.embedly.url);
} else {
nm._setCont('<div>'+nm.store.embedly.html+'</div>');
}
},
size: function(nm) {
if (nm.store.embedly.width && !nm.sizes.height) {
nm.sizes.w = nm.store.embedly.width;
nm.sizes.h = nm.store.embedly.height;
}
}
}
});
});