/*
 * 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
 */
jQuery(function($) {
	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 = {};
	var fixFF = false;
	var contentElt;
	var contentEltLast;
	var modal = {
		started : false,
		ready : false,
		dataReady : false,
		anim : false,
		animContent : false,
		loadingShown : false,
		transition : false,
		resizing : false,
		closing : false,
		error : false,
		blocker : false,
		blockerVars : null,
		full : null,
		bg : null,
		loading : null,
		tmp : null,
		content : null,
		wrapper : null,
		contentWrapper : null,
		scripts : new Array(),
		scriptsShown : new Array()
	};
	var resized = {
		width : false,
		height : false,
		windowResizing : false
	};
	var initSettingsSize = {
		width : null,
		height : null,
		windowResizing : true
	};
	var windowResizeTimeout;
	$.fn.nyroModal = function(settings) {
		if (!this)
			return false;
		return this.each(function() {
			var me = $(this);
			if (this.nodeName.toLowerCase() == 'form') {
				me.unbind('submit.nyroModal').bind('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.unbind('click.nyroModal').bind('click.nyroModal',
						function(e) {
							if (e.isDefaultPrevented())
								return false;
							e.preventDefault();
							processModal($.extend(settings, {
								from : this
							}));
							return false
						})
			}
		})
	};
	$.fn.nyroModalManual = function(settings) {
		if (!this.length)
			processModal(settings);
		return this.each(function() {
			processModal($.extend(settings, {
				from : this
			}))
		})
	};
	$.nyroModalManual = function(settings) {
		processModal(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)
					})
				}
			}
		}
	};
	$.nyroModalRemove = function() {
		removeModal()
	};
	$.nyroModalNext = function() {
		var link = getGalleryLink(1);
		if (link)
			return link.nyroModalManual(getCurrentSettingsNew());
		return false
	};
	$.nyroModalPrev = function() {
		var link = getGalleryLink(-1);
		if (link)
			return link.nyroModalManual(getCurrentSettingsNew());
		return false
	};
	$.fn.nyroModal.settings = {
		debug : false,
		blocker : false,
		windowResize : true,
		modal : false,
		type : '',
		forceType : null,
		from : '',
		hash : '',
		processHandler : null,
		selIndicator : 'nyroModalSel',
		formIndicator : 'nyroModal',
		content : null,
		bgColor : '#000000',
		ajax : {},
		swf : {
			wmode : 'transparent'
		},
		width : null,
		height : null,
		minWidth : 400,
		minHeight : 300,
		resizable : true,
		autoSizable : true,
		padding : 25,
		regexImg : '[^\.]\.(jpg|jpeg|png|tiff|gif|bmp)\s*$',
		addImageDivTitle : false,
		defaultImgAlt : 'Image',
		setWidthImgTitle : true,
		ltr : true,
		gallery : null,
		galleryLinks : '<a href="#" class="nyroModalPrev">Prev</a><a href="#"  class="nyroModalNext">Next</a>',
		galleryCounts : galleryCounts,
		galleryLoop : false,
		zIndexStart : 100,
		cssOpt : {
			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 : {
			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>'
		},
		title : null,
		titleFromIframe : true,
		openSelector : '.nyroModal',
		closeSelector : '.nyroModalClose',
		contentLoading : '<a href="#" class="nyroModalClose">Cancel</a>',
		errorClass : 'error',
		contentError : 'The requested content cannot be loaded.<br />Please try again later.<br /><a href="#" class="nyroModalClose">Close</a>',
		handleError : null,
		showBackground : showBackground,
		hideBackground : hideBackground,
		endFillContent : null,
		showContent : showContent,
		endShowContent : null,
		beforeHideContent : null,
		hideContent : hideContent,
		showTransition : showTransition,
		hideTransition : hideTransition,
		showLoading : showLoading,
		hideLoading : hideLoading,
		resize : resize,
		endResize : null,
		updateBgColor : updateBgColor,
		endRemove : null
	};
	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') {
			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') {
				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).unbind('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) {
				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) {
			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 {
		}
	}
	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)
			}
		}
	}
	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
		}
	}
	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
		}
	}
	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
		}
	}
	function setTitle() {
		var title = '';
	}
	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.bind('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();
			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).bind('keydown.nyroModal', keyHandler);
			modal.content.css( {
				width : 'auto',
				height : 'auto'
			});
			modal.contentWrapper.css( {
				width : 'auto',
				height : 'auto'
			});
			if (!currentSettings.blocker && currentSettings.windowResize) {
				$(window).bind(
						'resize.nyroModal',
						function() {
							window.clearTimeout(windowResizeTimeout);
							windowResizeTimeout = window.setTimeout(
									windowResizeHandler, 200)
						})
			}
		}
	}
	function windowResizeHandler() {
		$.nyroModalSettings(initSettingsSize)
	}
	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()
			})
		}
	}
	function clickBg(e) {
		if (!currentSettings.modal)
			removeModal()
	}
	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
			}
		}
	}
	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
	}
	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).unbind(
				'click.nyroModal').bind('click.nyroModal', removeModal);
		setMarginLoading();
		modal.loading.css( {
			marginTop : currentSettings.marginTopLoading + 'px',
			marginLeft : currentSettings.marginLeftLoading + 'px'
		})
	}
	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).unbind(
				'click.nyroModal').bind('click.nyroModal', removeModal);
		$(currentSettings.openSelector, modal.contentWrapper).nyroModal(
				getCurrentSettingsNew())
	}
	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
	}
	function wrapContent() {
		debug('wrapContent');
		var wrap = $(currentSettings.wrap[currentSettings.type]);
		modal.content.append(wrap.children().remove());
		modal.contentWrapper.wrapInner(wrap);
		if (currentSettings.gallery) {
			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
	}
	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) {
				if (currentSettings.type == 'image'
						|| currentSettings.type == 'swf') {
					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 {
					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) {
			$('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).unbind('keydown.nyroModal');
			if (!currentSettings.blocker)
				$(window).unbind('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 : ''
					});
				modal.wrapper.css( {
					overflow : 'hidden'
				});
				modal.content.css( {
					overflow : 'hidden'
				});
				$('iframe', modal.content).hide();
				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).unbind(
						'click.nyroModal').bind('click.nyroModal', removeModal);
				setMarginLoading();
				currentSettings.showLoading(modal, currentSettings, function() {
					modal.anim = false;
					showContentOrLoading()
				})
			}
		}
	}
	function ajaxLoaded(data) {
		debug('AjaxLoaded: ' + this.url);
		if (currentSettings.selector) {
			var tmp = {};
			var i = 0;
			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.unbind('load').contents().find(
				currentSettings.selector || 'body').not('script[src]');
		iframe.attr('src', 'about:blank');
		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) {
					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
	}
	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).unbind('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 : ''
		});
		fixFF = /mozilla/.test(userAgent)
				&& !/(compatible|webkit)/.test(userAgent)
				&& parseFloat(browserVersion) < 1.9
				&& currentSettings.type != 'image';
		if (fixFF)
			modal.content.css( {
				position : 'fixed'
			});
		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
			})
	}
	function getHash(url) {
		if (typeof url == 'string') {
			var hashPos = url.indexOf('#');
			if (hashPos > -1)
				return url.substring(hashPos)
		}
		return ''
	}
	function filterScripts(data) {
		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
	}
	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($.curCSS(elm, name, true));
		if (isNaN(ret))
			ret = 0;
		return ret
	}
	function debug(msg) {
		if ($.fn.nyroModal.settings.debug || currentSettings
				&& currentSettings.debug)
			nyroModalDebug(msg, modal, currentSettings || {})
	}
	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) {
		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) {
		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
			})
	}
	$($.fn.nyroModal.settings.openSelector).nyroModal()
});
var tmpDebug = '';
function nyroModalDebug(msg, elts, settings) {
	if (elts.full && elts.bg) {
		elts.bg.prepend(msg + '<br />' + tmpDebug);
		tmpDebug = ''
	} else
		tmpDebug += msg + '<br />'
}


