/*

	FancyBox playground - just playing
	v.1.3.0 - beta 13.11.09

*/
;(function($) {
	
	$.fn.fixPNG = function() {
		return this.each(function () {
			var image = $(this).css('backgroundImage');

			if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
				image = RegExp.$1;
				$(this).css({
					'backgroundImage': 'none',
					'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=" + ($(this).css('backgroundRepeat') == 'no-repeat' ? 'crop' : 'scale') + ", src='" + image + "')"
				}).each(function () {
					var position = $(this).css('position');
					if (position != 'absolute' && position != 'relative')
						$(this).css('position', 'relative');
				});
			}
		});
	};
	
	var defaults = {
	    padding             :	10,
	    margin				:	20,
		ajax				:   {},
		type				:	false,
		modal				:	false,
		autoScale			:	true,
		autoDimensions		:	true,
		frameWidth			:	500,
		frameHeight			:	300,
		zoomOpacity			:	false,
		zoomSpeedIn			:	0,
		zoomSpeedOut		:	0,
		zoomSpeedChange		:	300,
		easingIn			:	'swing',
		easingOut			:	'swing',
		easingChange		:	'swing',
		overlayShow			:	false,
		overlayOpacity		:	0.3,
		overlayColor		:	'#666',
		enableEscapeButton	:	true,
		showCloseButton		:	true,
		hideOnOverlayClick	:	true,
		hideOnContentClick	:	false,
		callbackOnStart		:	null,
		callbackOnCancel	:	null,
		callbackOnShow		:	null,
		callbackOnClose		:	null
	};
	
	var tmp, loading, overlay, wrap, outer, inner, content, close, nav_left, nav_right, elem, type;
	var currentOpts, currentArray = [], selectedIndex = 0, selectedOpts, selectedArray = [], currentIndex = 0;
	var ajaxLoader = null, imagePreloader = new Image, imageRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i;
	var loadingTimer, loadingFrame = 1;

	var selectedIndex;
	
	var busy = false, shadow = 20, fx = $.extend($('<div/>')[0], { prop: 0 });
	
	var IE6 = $.browser.msie && $.browser.version.substr(0,1) == 6 && !window.XMLHttpRequest;
	
	$.fn.fancybox = function(options) {
		$(this).unbind('click.pb').bind('click.pb', function(e) {
			e.preventDefault();
			$.fancybox( $(this), options );
			return false;
		});

		return this;
    };

	/*

	Public functions

	*/

	$.fancybox = function(obj, opts) {
		if (busy) return;
		
		if ($("#fancybox_wrap").is(":visible") && currentOpts && $.isFunction(currentOpts.callbackOnClose)) {
			var ret = currentOpts.callbackOnClose(currentArray, currentIndex);

			if (ret == false) return ret;
		};

		fancybox_abort();

		selectedOpts = $.extend({}, defaults, opts);

		if (selectedOpts.autoDimensions) {
			selectedOpts.frameWidth		= false;
			selectedOpts.frameHeight	= false;
		}

		if (selectedOpts.modal) {
			selectedOpts.hideOnOverlayClick	= false;
			selectedOpts.hideOnContentClick	= false;
			selectedOpts.enableEscapeButton	= false;
			selectedOpts.showCloseButton	= false;
		}

		selectedArray	= [];
		selectedIndex	= 0;
		
		if (obj.jquery) {
			if (!obj.attr('rel') || obj.attr('rel') == '' || obj.attr('rel') === 'nofollow') {
			    selectedArray.push(obj[0]);

			} else {
	            selectedArray	= $("a[rel=" + obj.attr('rel') + "]").get();
	            selectedIndex	= $.inArray( obj[0], selectedArray);
			}

        } else {
            $.isArray(obj) ? selectedArray = jQuery.merge(selectedArray, obj) : selectedArray.push(obj);
		}

		fancybox_start();
    };

    $.fancybox.showActivity = function() {
		clearInterval(loadingTimer);

		loading.show();
		loadingTimer = setInterval(fb_animate_loading, 66);
	};

	$.fancybox.close = function() {
		if (busy) return;
 
 		if (!wrap.is(':visible')) {
			return;	
		}
		
		busy = true;

		if (currentOpts && $.isFunction(currentOpts.callbackOnClose)) {
			var ret = currentOpts.callbackOnClose(currentArray, currentIndex);

			if (ret == false) {
				busy = false;
				return ret;
			}
		};
		
		fancybox_abort();
		
		$( close.add( nav_left ).add( nav_right ) ).hide();
		
		loading.hide();
		
		wrap.unbind();
		inner.unbind();
		overlay.unbind();
		
		$(document).unbind('keydown.fb');

		function _cleanup() {
			overlay.fadeOut('fast');
			
    		inner.css('overflow', 'hidden').empty();
    		
    		wrap.hide();
    		
    		busy = false;
		}

		if (currentOpts.zoomSpeedOut > 0) {
			start_pos = getZoomFrom();

			var pos = wrap.position();
 
 			final_pos = {
				top		:	pos.top ,
				left	:	pos.left,
				width	:	wrap.width(),
				height	:	wrap.height()
			};

			if (currentOpts.zoomOpacity) {
				final_pos.opacity = 1;
			}

			fx.prop = 1;

			$(fx).animate({ prop: 0 }, {
				 duration	: currentOpts.zoomSpeedOut,
				 easing		: currentOpts.easingOut,
				 step		: draw,
				 complete	: _cleanup
			});

		} else {
			wrap.fadeOut('fast', _cleanup);
		}
	};

	$.fancybox.prev = function() {
		return $.fancybox.pos( currentIndex - 1);
		
	};

	$.fancybox.next = function() {
		return $.fancybox.pos( currentIndex + 1);
	};
 
	$.fancybox.pos = function(pos) {
		if (busy) return;

		pos = parseInt(pos);
		
		if (pos > -1 && currentArray.length > pos) {
			fancybox_abort();
			fancybox_revert();
			
			selectedIndex = pos;
 
			fancybox_start();
		}
 
		return false;
	};
	
 	$.fancybox.cancel = function() {
 		if (busy) return;
 
		fancybox_abort();
 
		if (selectedOpts && $.isFunction(selectedOpts.callbackOnCancel)) {
			selectedOpts.callbackOnCancel(selectedArray, selectedIndex);
		};

		fancybox_revert();
	};
	
    /*

	Inner functions

	*/

	function fancybox_abort() {
		loading.hide();
		
		$(imagePreloader).unbind();

		if (ajaxLoader) ajaxLoader.abort();
		
		tmp.empty();
 
		if (!wrap.is(':visible')) {
			overlay.unbind().stop().hide();
		}
	};
	
	function fancybox_revert() {
		selectedIndex	= currentIndex;
		selectedArray	= currentArray;
		selectedOpts	= currentOpts;
	}

	function fancybox_get_type() {
		if (selectedOpts.type) {
			return selectedOpts.type;
		}

		if ((typeof elem == 'string' || typeof elem.href == 'undefined')) {
			elem = $.trim(elem);
			return elem.match(/#/) && $(elem).length ? 'element' : 'string';
		}

		var href = $.trim(elem.href);

		if (href.match("iframe") || (typeof elem.className !== 'undefined' && elem.className.indexOf("iframe") >= 0 )) {
		    return 'iframe';

		} else if (href.match(imageRegExp)) {
		    return 'image';

		} else if (href.match(/#/)) {
            return 'element';

		} else {
            return 'ajax';
		}
	};

    function fancybox_start() {
		if ($.isFunction(selectedOpts.callbackOnStart)) {
			selectedOpts.callbackOnStart(selectedArray, selectedIndex);
		};
 
		elem = selectedArray[ selectedIndex ];
 
		var href = typeof elem.href == 'undefined' ? elem : elem.href;

	    if (href == 'javascript:;') { 
			$(elem).unbind('click.pb').trigger('click'); return;
		}

		type = typeof elem !== 'object' || typeof elem.href !== 'undefined' || $(elem).is('a') ? fancybox_get_type() : 'obj';

	    switch (type) {
			case 'image' :
				imagePreloader = new Image; imagePreloader.src = href;

				if (imagePreloader.complete) {
					fb_proceed_image();

				} else {
					$.fancybox.showActivity();
					$(imagePreloader).unbind().one('load', fb_proceed_image);
				}

			break;

			case 'iframe' :
			   $.fancybox.showActivity();
			   
			    $('<iframe id="fancybox_frame" name="fancybox_frame' + Math.round(Math.random() * 1000) + '" frameborder="0" hspace="0" src="' + href + '"></iframe>').load(function() {
					$(this).unbind();
					fb_show();
				}).appendTo(tmp);

			break;
			
			case 'obj' :
			case 'element' :
				if (type == 'element') elem = href.substr(href.indexOf("#"));
 
				 $(elem).clone(true).removeAttr("id").appendTo(tmp).css('display', 'block');
 
				 fancybox_proceed_inline();
			break;

			case 'string' :
			    tmp.html('<div id="fancybox-content">' + elem + '</div>');

			    fancybox_proceed_inline();
			break;

			case 'ajax' :
				$.fancybox.showActivity();

				ajaxLoader = $.ajax($.extend(true, selectedOpts.ajax, {
					url		: href,
					data	: selectedOpts.ajax.data || {},
					success	: function(data) {
						tmp.html('<div id="fancybox-content">' + data + '</div>');
			    		fancybox_proceed_inline();
					}
				}));

			break;
		}
	};

	function fb_proceed_image() {
		selectedOpts.frameWidth	 = imagePreloader.width;
		selectedOpts.frameHeight = imagePreloader.height;

		$("<img />").attr('src', imagePreloader.src).attr('id', 'fancybox_img').appendTo( tmp );

		fancybox_show();
	};
		
	function fancybox_proceed_inline() {
		if ($.browser.msie && parseInt($.browser.version.substr(0, 1)) < 7) {
			$('embed, object, select', tmp).css('visibility', 'visible');
		}

		if (selectedOpts.autoDimensions) {
 			selectedOpts.frameWidth	 = tmp.width();
 			selectedOpts.frameHeight = tmp.height();
		}
	
 		fancybox_show();
	};

	function fancybox_show() {
		busy = true;
		
 		loading.hide();
 		
 		currentArray	= selectedArray;
 		currentIndex	= selectedIndex;
 		currentOpts		= selectedOpts;
 		
 		inner[0].scrollTop	= 0;
		inner[0].scrollLeft	= 0;
		
		if (currentOpts.overlayShow) {
			overlay.css({
				'background-color'	: currentOpts.overlayColor,
				'opacity'			: currentOpts.overlayOpacity
			}).unbind().show();
		}
		
		final_pos = getZoomTo();
 
		if (wrap.is(":visible")) {

			$( close.add( nav_left ).add( nav_right ) ).hide();
			
			inner.fadeOut("normal", function() {
				var pos = wrap.position();

				start_pos = {
					top		:	pos.top ,
					left	:	pos.left,
					width	:	wrap.width(),
					height	:	wrap.height()
				};
				
				function finish_resizing() {
					inner.html( tmp.contents() ).fadeIn(_finish);	
				}
 
				fx.prop = 0;

				$(fx).animate({ prop: 1 }, {
					 duration	: (start_pos.width == final_pos.width && start_pos.height == final_pos.height) ? 0 : currentOpts.zoomSpeedChange,
					 easing		: currentOpts.easingChange,
					 step		: draw,
					 complete	: finish_resizing
				});
			});
			
			return;	
		}

		 wrap.css('opacity', 1);
		 
		if (currentOpts.zoomSpeedIn > 0) {
			start_pos = getZoomFrom();

			inner.css({
				top			: currentOpts.padding,
				left		: currentOpts.padding,
				width		: start_pos.width	- (currentOpts.padding * 2) > 0 ? start_pos.width	- (currentOpts.padding * 2) : 1,
				height		: start_pos.height	- (currentOpts.padding * 2) > 0 ? start_pos.height	- (currentOpts.padding * 2) : 1 
			});
	
			inner.html( tmp.contents() );
 
 			wrap.css(start_pos).show();
 			
 			if (currentOpts.zoomOpacity) {
				final_pos.opacity = 0;
			}
			
			fx.prop = 0;

			$(fx).animate({ prop: 1 }, {
				 duration	: currentOpts.zoomSpeedIn,
				 easing		: currentOpts.easingIn,
				 step		: draw,
				 complete	: _finish
			});
			
		} else {
			inner.css({
				top			: currentOpts.padding,
				left		: currentOpts.padding,
				width		: final_pos.width	- (currentOpts.padding * 2) > 0 ? final_pos.width	- (currentOpts.padding * 2) : 1,
				height		: final_pos.height	- (currentOpts.padding * 2) > 0 ? final_pos.height	- (currentOpts.padding * 2) : 1
			});
 
			inner.html( tmp.contents() );
 
			wrap.css( final_pos ).fadeIn( _finish );
		}
	};
	
	function _finish() {
		if ($.browser.msie) {
			inner[0].style.removeAttribute('filter');
			wrap[0].style.removeAttribute('filter');
		}
		
		inner.css('overflow', type == 'image' ? 'hidden' : 'auto');
			
		currentOpts.hideOnContentClick ? inner.click( $.fancybox.close )	: inner.unbind();
 		currentOpts.hideOnOverlayClick ? overlay.click( $.fancybox.close )	: overlay.unbind();
 
 		currentOpts.showCloseButton ? close.show() : close.hide();
 
	    fb_set_navigation();
	    
	    if ($.isFunction(currentOpts.callbackOnShow)) {
			currentOpts.callbackOnShow(currentArray, currentIndex);
		}

	    busy = false;

	    fb_preload_images();
	};
 
	function fb_set_navigation() {
		$(document).unbind('keydown.fb').bind('keydown.fb', function(e) {
			if (e.keyCode == 27 && currentOpts.enableEscapeButton) {
				e.preventDefault();
				$.fancybox.close();

			} else if(e.keyCode == 37) {
				e.preventDefault();
				$.fancybox.prev();

			} else if(e.keyCode == 39) {
				e.preventDefault();
 				$.fancybox.next();
			}
		});
		
		wrap.unbind('mousewheel.fb');
		
		if (currentArray.length > 1 && $.fn.mousewheel) {
			wrap.bind('mousewheel.fb', function(e, delta) {
				e.preventDefault();
 
				if (busy || delta == 0) return;

				delta < 0 ? $.fancybox.prev() : $.fancybox.next();
			});
		}
		
		if (currentIndex != 0) {
			nav_left.show();
		}

		if (currentIndex != ( currentArray.length -1)) {
			nav_right.show();
		}
	};
	
	function getZoomTo() {
		var view	= getViewport();
		var to		= {};

		var margin = currentOpts.margin;
		var resize = currentOpts.autoScale;
 
		var horizontal_space	= (shadow + margin) * 2 ;
		var vertical_space		= (shadow + margin) * 2 ;

		if (currentOpts.frameWidth.toString().indexOf('%') > -1) {
			to.width = ((view[0] * parseFloat(currentOpts.frameWidth)) / 100) - (shadow * 2) ;
			
			resize = false;
 
		} else {
			to.width = currentOpts.frameWidth	+ (currentOpts.padding * 2);
		}
 
		if (currentOpts.frameHeight.toString().indexOf('%') > -1) {
			to.height = ((view[1] * parseFloat(currentOpts.frameHeight)) / 100) - (shadow * 2);

			resize = false;
		} else {
			to.height = currentOpts.frameHeight + (currentOpts.padding * 2);
		}
		
		if (resize && (to.width > (view[0] - horizontal_space) || to.height > (view[1] - vertical_space))) {
			var ratio = Math.min(Math.min( view[0] - horizontal_space, to.width) / to.width, Math.min( view[1] - vertical_space, to.height) / to.height);

			to.width	= Math.round(ratio * to.width);
			to.height	= Math.round(ratio * to.height);
		}

		to.top	= view[3] + ((view[1] - (to.height	+ (shadow * 2 ) ) 	)	* 0.5);
		to.left	= view[2] + ((view[0] - (to.width	+ (shadow * 2 ) )	)	* 0.5);
		
		if (currentOpts.autoScale == false) {
			to.top	= to.top	< view[3] ? view[3]  : to.top;
			to.left	= to.left	< view[2] ? view[2]  : to.left;
		}
		
		return to;	
	};
	
	function getZoomFrom() {
		var view	= getViewport();
		var from 	= {
			width	: 1,
			height	: 1,
			top		: view[3] + view[1] * 0.5,
			left	: view[2] + view[0] * 0.5
		};

		var isObject = currentArray[ currentIndex ].constructor == Object;
		
		if (typeof currentArray[ currentIndex ] == 'object') {
			if (currentArray[ currentIndex ].orig) {
				var orig_item = $(currentArray[ currentIndex ].orig);
				
			} else {
				var orig_item = $(currentArray[ currentIndex ]).children("img:first").length ? $(currentArray[ currentIndex ]).children("img:first") : $(currentArray[ currentIndex ]);
			}

			if (typeof orig_item !== 'undefined' && orig_item.length) {
				var pos = getThumbPos(orig_item);
 
				from.width	= pos.width		+ (currentOpts.padding * 2);
				from.height	= pos.height	+ (currentOpts.padding * 2);
				from.top	= pos.top		- currentOpts.padding - shadow;
				from.left	= pos.left		- currentOpts.padding - shadow;
			}
		}

		return from;
	};
	
	function getThumbPos(thumb) {
		var pos		= thumb.offset();

		pos.top		+= parseFloat( thumb.css('paddingTop') );
		pos.left	+= parseFloat( thumb.css('paddingLeft') );

		pos.top		+= parseFloat( thumb.css('border-top-width') );
		pos.left	+= parseFloat( thumb.css('border-left-width') );

		pos.width	= thumb.width();
		pos.height	= thumb.height();

		return pos;
	};
	
	function draw(pos) {
		var width	= Math.round(start_pos.width	+ (final_pos.width	- start_pos.width)	* pos);
		var height	= Math.round(start_pos.height	+ (final_pos.height	- start_pos.height)	* pos);

		var top		= Math.round(start_pos.top	+ (final_pos.top	- start_pos.top)	* pos);
		var left	= Math.round(start_pos.left	+ (final_pos.left	- start_pos.left)	* pos);

		$(wrap).css({
			'width'		: width		+ 'px',
			'height'	: height	+ 'px',
			'top'		: top		+ 'px',
			'left'		: left		+ 'px'
		});

		width	-= currentOpts.padding * 2;
		height	-= currentOpts.padding * 2;

		if (width > 0 && height > 0) {
			inner.css({
				'width'		: width		+ 'px',
				'height'	: height	+ 'px'
			});
		}

		if (typeof final_pos.opacity !== 'undefined') {
			var opacity = pos < 0.5 ? 0.5 : pos;

			wrap.css('opacity', opacity);
		}
	};
 
	function fb_animate_loading() {
		if (!loading.is(':visible')){
			clearInterval(loadingTimer);
			return;
		}

		$('div', loading).css('top', (loadingFrame * -40) + 'px');

		loadingFrame = (loadingFrame + 1) % 12;
	};

	function fb_preload_images() {
		if ((currentArray.length -1) > currentIndex) {
			var href = currentArray[ currentIndex + 1 ].href;
			
			if (typeof href !== 'undefined' && href.match(imageRegExp)) {
				var objNext = new Image();
				objNext.src = href;
			}
		}

		if (currentIndex > 0) {
			var href = currentArray[ currentIndex - 1 ].href;

			if (typeof href !== 'undefined' && href.match(imageRegExp)) {
				var objNext = new Image();
				objNext.src = href;
			}
		}
	};
	
	function getViewport() {
		return [ $(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop() ];
	};
	
	function init() {
		if ($("#fancybox-wrap").length) return;	

		tmp			= $('<div id="fancybox-tmp"></div>').appendTo("body");
		loading		= $('<div id="fancybox_loading"><div></div></div>').appendTo("body");
		overlay		= $('<div id="fancybox-overlay"></div>').appendTo("body");
		wrap		= $('<div id="fancybox-wrap"></div>').appendTo('body');

		outer	= $('<div id="fancybox-outer"></div>')
			.append('<div class="fancy_bg" id="fancy_bg_n"></div><div class="fancy_bg" id="fancy_bg_ne"></div><div class="fancy_bg" id="fancy_bg_e"></div><div class="fancy_bg" id="fancy_bg_se"></div><div class="fancy_bg" id="fancy_bg_s"></div><div class="fancy_bg" id="fancy_bg_sw"></div><div class="fancy_bg" id="fancy_bg_w"></div><div class="fancy_bg" id="fancy_bg_nw"></div>')
			.appendTo( wrap );

		inner	= $('<div id="fancybox-inner"></div').appendTo( outer );
		close	= $('<a id="fancybox-close"></a>').appendTo( outer );
		
		nav_left	= $('<a href="javascript:;" id="fancybox_left"><span class="fancy_ico" id="fancybox_left_ico"></span></a>').appendTo( outer );
		nav_right	= $('<a href="javascript:;" id="fancybox_right"><span class="fancy_ico" id="fancybox_right_ico"></span></a>').appendTo( outer );
		
		close.click( $.fancybox.close );
		loading.click( $.fancybox.cancel );
		
		nav_left.bind("click", function(e) {
			e.preventDefault();
			$.fancybox.prev();
		});

		nav_right.bind("click", function(e) {
			e.preventDefault();
			$.fancybox.next();
		});
			
		if ($.browser.msie) {
			outer.find('.fancy_bg').fixPNG();
		}

		if (IE6) {
			$(close.add( '.fancy_ico').add('div', loading) ).fixPNG();
		}
	};

	$(document).ready(function() {
		init();
	});

})(jQuery);
