﻿/*

	FancyBox playground - just playing
	v.15 beta 1 - 24.08.2009

*/
(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 = {
	    ajax                :   {},
		padding				:	7,
		autoScale			:	true,
		autoDimensions      :   true,
		centerOnScroll		:	true,
		frameWidth			:	425,
		frameHeight			:	355,
		zoomOpacity			:	true,
		zoomSpeedIn			:	500,
		zoomSpeedOut		:	500,
		zoomSpeedChange		:	500,
		easingIn			:	'swing',
		easingOut			:	'swing',
		easingChange		:	'swing',
		overlayShow			:	true,
		overlayOpacity		:	0.5,
		hideOnContentClick	:	false,
		hideOnOverlayClick	:	true,
		callbackOnStart		:	null,
		callbackOnShow		:	null,
		callbackOnChange	:	null,
		callbackOnClose		:	null,
		showTitle			:	true
	};

	var origOpts, currOpts, itemArray = [], itemCurrent = 0, imagePreloader = new Image, imageRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i;
	var loadingTimer, loadingFrame = 1;
	var shdow_w = 66;
	var shdow_h = 80;
	
	var busy = false;
	
	$.fn.fancybox = function(options) {
		$(this).unbind('click.fb').bind('click.fb', function(e) {
			e.preventDefault();
			$.fancybox( $(this), options );
			return false;
		});

		return this;
    };

	/*

	Public functions

	*/
		 
    $.fancybox = function(obj, opts) {
        if (busy) {
			return;
		}
		
        busy = true;

		if ($("#fancybox_wrap").is(":visible") && $.isFunction(currOpts.callbackOnClose)) {
			var ret = currOpts.callbackOnClose(itemArray, itemCurrent);	

			if (ret == false) {
				busy = false;
				return ret;
			}
		};
			
    	origOpts = $.extend({}, opts);
		currOpts = $.extend({}, defaults, opts);

		itemArray	= [];
		itemCurrent	= 0;

		if (typeof currOpts.padding == 'number') {
			var tmp = {
				top		: currOpts.padding,
				right	: currOpts.padding,
				bottom	: currOpts.padding,
				left	: currOpts.padding
			};
			
			currOpts.padding = tmp;
		}

		if (obj.jquery) {
			if (!obj.attr('rel') || obj.attr('rel') == '' || obj.attr('rel') === 'nofollow') {
			    itemArray.push(obj[0]);

			} else {
	            itemArray	= $("a[rel=" + obj.attr('rel') + "]").get();
	            itemCurrent	= $.inArray( obj[0], itemArray);
			}

        } else {
            itemArray.push(obj);
		}
				
		if (currOpts.overlayShow) {
			if ($.browser.msie && parseInt($.browser.version.substr(0, 1)) < 7) {
				$('embed, object, select').css('visibility', 'hidden');
			}
			
			$("#fancybox_overlay").css({
				'height'	: $(document).height(),
				'opacity'	: currOpts.overlayOpacity
			}).show();
		}
		
		fb_start();
    };
    
    $.fancybox.next = function() {
    	 if (busy) {
			return;
		}
		
		if (itemArray.length > 1 && itemCurrent != (itemArray.length - 1)) {
			$(document).unbind("keydown.fb");
			itemCurrent++;
			fb_start();
		}
	};
 
	$.fancybox.prev = function() {
		 if (busy) {
			return;
		}
		
		if (itemCurrent > 0) {
			$(document).unbind("keydown.fb");
			itemCurrent--;
			fb_start();
		}
	};
 
	$.fancybox.pos = function(pos) {
		if (busy) {
			return;
		}

		pos = parseInt(pos);
		
		if (itemArray.length > pos) {
			itemCurrent = pos;
			fb_start();
		}
	};

	$.fancybox.close = function() {
		__cleanup = function() {
        	$("#fancybox_wrap").hide();
 
			$("#fancybox_content").empty();

			currOpts = $.extend({}, defaults);

			itemArray	= [];
			itemCurrent	= 0;

			$("#fancybox_content, #fancybox_wrap").unbind();

			if (currOpts.overlayShow) {
				if ($.browser.msie && parseInt($.browser.version.substr(0, 1)) < 7) {
					$('embed, object, select').css('visibility', 'visible');
				}

				$("#fancybox_overlay").unbind().fadeOut(function() {
					busy = false;	
				});
			} else {
				busy = false;
			}
		};
		
  		if (busy) {
			return;
		}
 
		busy = true;

		$("#fancybox_loading").hide();

		if ($("#fancybox_wrap").is(":visible") && $.isFunction(currOpts.callbackOnClose)) {
			var ret = currOpts.callbackOnClose(itemArray, itemCurrent);	

			if (ret == false) {
				busy = false;
				return ret;

			} else if (typeof ret == 'object') {
				currOpts = $.extend({}, currOpts, ret);
			}
		};

		$(document).unbind("keydown.fb");

		$("#fancybox_close, #fancybox_left, #fancybox_right, #fancybox_title").hide();


		var position_to	= fb_get_position_orig();

		if (position_to && currOpts.zoomSpeedOut > 0) {

			var itemOpts = {
				width	:	position_to.width	+ (currOpts.padding.left	+ currOpts.padding.right),
				height	:	position_to.height	+ (currOpts.padding.top		+ currOpts.padding.bottom),
				top		:	position_to.top,
				left	:	position_to.left
			};

			if (currOpts.zoomOpacity) {
				itemOpts.opacity = 'hide';
			}

			$("#fancybox_content").css('overflow', 'hidden');

			$("#fancybox_wrap").animate(itemOpts, {duration: currOpts.zoomSpeedIn, easing: 'swing',

   				step: function(now, fx) {
					if (fx.prop == "width") {
						$("#fancybox_content").css( fx.prop, (parseFloat(now) - (currOpts.padding.left	+ currOpts.padding.right)) + "px");
					}
 
					if (fx.prop == "height") {
						$("#fancybox_content").css( fx.prop, (parseFloat(now) - (currOpts.padding.top	+ currOpts.padding.bottom)) + "px");
					}
				},

				complete: __cleanup
			});

		} else {
			
			if (currOpts.overlayShow) {
				
				$("#fancybox_wrap").hide();
			 __cleanup();
			 
			} else {
				$("#fancybox_wrap").fadeOut("fast", __cleanup);
			}
		}

		return;
	};

	/*

	Inner functions

	*/

	function fb_get_type() {
		if (origOpts.type !== undefined) {
			return origOpts.type;
		}

	    var el = itemArray[ itemCurrent ];

		if (typeof el == 'string') {
			return el.match(/#/) ? 'element' : 'string';
		}

		var href = $.trim(el.href);

		if (href.match(imageRegExp)) {
		    return 'image';

		} else if (href.match("iframe") || (el.className !== undefined && el.className.indexOf("iframe") >= 0 )) {
		    return 'iframe';

		} else if (href.match(/#/)) {
            return 'element';

		} else {
            return 'ajax';
		}
	};

	function fb_start() {
	
	alert(itemArray[itemCurrent]);
		if ($.isFunction(currOpts.callbackOnStart)) {
			currOpts.callbackOnStart(itemArray, itemCurrent);
		};

		var href = itemArray[ itemCurrent ].href === undefined ? itemArray[ itemCurrent ] : itemArray[ itemCurrent ].href;
 
	    if (href == 'javascript:;') { 
			$(itemArray[ itemCurrent ]).trigger('click'); return;
		}

		busy = true;
				
		var tmp	= $("#fancybox_tmp"); tmp.empty();

		currOpts.type = fb_get_type();

	    switch (currOpts.type) {
			case 'image' :
				imagePreloader = new Image; imagePreloader.src = href;

				if (imagePreloader.complete) {
					fb_proceed_image();
 
				} else {
					fb_show_loading();
					
					$(imagePreloader).unbind().bind('load', fb_proceed_image);
				}

			break;

			case 'element' :
			    var element = href.substr(href.indexOf("#"));

			    $(element).clone(true).removeAttr("id").appendTo(tmp).css('display', 'block').wrap('<div id="fancybox_div">');

			    fb_proceed_inline();
			break;
 
			case 'string' :
			    tmp.html('<div id="fancybox_div">' + itemArray[ itemCurrent ] + '</div>');

			    fb_proceed_inline();
			break;

			case 'iframe' :
			    fb_show_loading();
			    $('<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 'ajax' :
			    fb_show_loading();
				$.ajax($.extend(true, currOpts.ajax, {
					url		: href,
					data	: currOpts.ajax.data || {},
					success	: function(data) {
						tmp.html('<div id="fancybox_div">' + data + '</div>');
			    		fb_proceed_inline();
					}
				}));

			break;
		}
	};

	function fb_proceed_image() {
		fb_preload_images();

		currOpts.frameWidth	 = imagePreloader.width;
		currOpts.frameHeight = imagePreloader.height;

		$("<img />").attr('src', imagePreloader.src).attr('id', 'fancybox_img').appendTo( $("#fancybox_tmp") );

		fb_show();
	};
	
	function fb_proceed_inline() {
 	    if ($.browser.msie && parseInt($.browser.version.substr(0, 1)) < 7) {
			$('embed, object, select', $('#fancybox_tmp')).css('visibility', 'visible');
		}

 		if (currOpts.autoDimensions) {
 			if (typeof origOpts.frameWidth == 'undefined') {
 				currOpts.frameWidth	 = $("#fancybox_tmp").width();
			}

			if (typeof origOpts.frameHeight == 'undefined') {
 				currOpts.frameHeight = $("#fancybox_tmp").height();
			}
		}

 		fb_show();
 	};

 	function fb_get_viewport() {
		return [ $(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop() ];
	};

	function fb_get_position_orig() {
		if (typeof itemArray[ itemCurrent ] == 'object') {

			if (itemArray[ itemCurrent ].orig) {
				var orig_item = $(itemArray[ itemCurrent ].orig);
			} else {
				var orig_item = $(itemArray[ itemCurrent ]).children("img:first").length ? $(itemArray[ itemCurrent ]).children("img:first") : $(itemArray[ itemCurrent ]);
			}

			if (orig_item.length) {
				var orig_pos = fb_get_position(orig_item);
 
				return { width : orig_item.width(), height: orig_item.height(), top : (orig_pos.top - (shdow_h / 2) - currOpts.padding.top), left: (orig_pos.left - (shdow_w / 2) - currOpts.padding.left) };
			}
		}

		return false;	
	}
	
	function fb_get_position_to() {
		var width, height, view = fb_get_viewport();

		var vertical_space		= shdow_h + (currOpts.padding.top	+ currOpts.padding.bottom);
		var horizontal_space	= shdow_w + (currOpts.padding.left	+ currOpts.padding.right);

	    if (currOpts.autoScale && (currOpts.frameWidth > (view[0] - horizontal_space) || currOpts.frameHeight > (view[1] - vertical_space))) {
	    	var ratio = Math.min(Math.min( view[0] - horizontal_space, currOpts.frameWidth) / currOpts.frameWidth, Math.min( view[1] - vertical_space, currOpts.frameHeight) / currOpts.frameHeight);

			width	= Math.round(ratio * currOpts.frameWidth);
			height	= Math.round(ratio * currOpts.frameHeight);

		} else {
			width	= currOpts.frameWidth;
			height	= currOpts.frameHeight;
		}

		var top		= (height + vertical_space)		> view[1] ? view[3] : (view[3] + Math.round((view[1] - height - vertical_space) / 2));
		var left	= (width + horizontal_space)	> view[0] ? view[2] : (view[2] + Math.round((view[0] - width - horizontal_space) / 2));

		return {width : width, height: height, top: top, left : left};
	};

	function fb_show() {

		$("#fancybox_loading, #fancybox_left, #fancybox_right, #fancybox_close, #fancybox_title").hide();

		$("#fancybox_content").css('overflow', 'hidden');
		
		if ($("#fancybox_wrap").is(":visible")) {
		    var position_to	= fb_get_position_to();
            fb_resize( position_to );
			
		} else {

			var position_from	= fb_get_position_orig();
			var position_to		= fb_get_position_to();

			if (position_from && currOpts.zoomSpeedIn > 0) {
				$("#fancybox_content").css({
					width		:	position_from.width,
					height		:	position_from.height,
					marginTop	: 	currOpts.padding.top,
					marginLeft	: 	currOpts.padding.left
				}).html( $("#fancybox_tmp").contents() );

				if ($.isFunction(currOpts.callbackOnReady)) {
					currOpts.callbackOnReady(itemArray, itemCurrent);
				};
 
				$("#fancybox_wrap").css({
					width	:	position_from.width		+ (currOpts.padding.left	+ currOpts.padding.right),
					height	:	position_from.height	+ (currOpts.padding.top		+ currOpts.padding.bottom),
					top		:	position_from.top,
					left	:	position_from.left
				});

				var itemOpts = {
					width	:	position_to.width	+ (currOpts.padding.left	+ currOpts.padding.right),
					height	:	position_to.height	+ (currOpts.padding.top		+ currOpts.padding.bottom),
					top		:	position_to.top,
					left	:	position_to.left
				};

				if (currOpts.zoomOpacity) {
					itemOpts.opacity = 'show';
				}
 
				$("#fancybox_wrap").animate(itemOpts, {duration: currOpts.zoomSpeedIn, easing: 'swing',
					   step: function(now, fx) {
						if (fx.prop == "width") {
							$("#fancybox_content").css( fx.prop, (parseFloat(now) - (currOpts.padding.left	+ currOpts.padding.right)) + "px");
						}

						if (fx.prop == "height") {
							$("#fancybox_content").css( fx.prop, (parseFloat(now) - (currOpts.padding.top	+ currOpts.padding.bottom)) + "px");
						}
					},

					complete: function() {
						if (currOpts.type !== 'image') {
							$("#fancybox_content").css('overflow', 'auto');
						}

	                    fb_update_details();
					}
				});

			} else {
				
				if ($.isFunction(currOpts.callbackOnReady)) {
					currOpts.callbackOnReady(itemArray, itemCurrent);
				};

				$("#fancybox_wrap").hide().css({
					width	:	position_to.width	+ (currOpts.padding.left	+ currOpts.padding.right),
					height	:	position_to.height	+ (currOpts.padding.top		+ currOpts.padding.bottom),
					top		:	position_to.top,
					left	:	position_to.left
				});
			
				$("#fancybox_content").css({
					width		:	position_to.width,
					height		:	position_to.height,
					marginTop	: 	currOpts.padding.top,
					marginLeft	: 	currOpts.padding.left
				}).html( $("#fancybox_tmp").contents() );
 
				$("#fancybox_wrap").fadeIn("normal", function() {
					if (currOpts.type !== 'image') {
						$("#fancybox_content").css('overflow', 'auto');
					}

			        fb_update_details();
				});
			}
		}
	};

	function fb_resize( position_to ) {
		_proceed = function () {
			$("#fancybox_content").css({
				width		:	position_to.width,
				height		:	position_to.height,
				marginTop	: 	currOpts.padding.top,
				marginLeft	: 	currOpts.padding.left,
				overflow 	:	( currOpts.type == 'image' ? 'hidden' : 'auto')
			}).html( $("#fancybox_tmp").contents() );

			if ($.isFunction(currOpts.callbackOnReady)) {
				currOpts.callbackOnReady(itemArray, itemCurrent);
			};
			
			$("#fancybox_content").fadeIn("normal", function() {
				fb_update_details();
			});
		}
 
		if ($.isFunction(currOpts.callbackOnChange)) {
			var ret = currOpts.callbackOnChange(itemArray, itemCurrent);	

			if (ret == false) {
				return false;
			}
		};

		$("#fancybox_content").fadeOut("normal", function() {
			$(this).empty();

			if ( $("#fancybox_wrap").width() == position_to.width	+ (currOpts.padding.left + currOpts.padding.right) && $("#fancybox_wrap").height() == position_to.height	+ (currOpts.padding.top + currOpts.padding.bottom)) {
				_proceed();

			} else {
				$("#fancybox_wrap").animate({
					width	:	position_to.width	+ (currOpts.padding.left + currOpts.padding.right),
					height	:	position_to.height	+ (currOpts.padding.top + currOpts.padding.bottom),
					top		:	position_to.top,
					left	:	position_to.left
				}, currOpts.zoomSpeedChange, currOpts.easingChange, _proceed);
			}
		});
	};

	function fb_update_details() {
		fb_set_keyboard();

		$("#fancybox_close").show();

		if ($.isFunction(currOpts.callbackOnShow)) {
			currOpts.callbackOnShow(itemArray, itemCurrent);
		};

		if (currOpts.showTitle && itemArray[ itemCurrent ].title !== undefined && itemArray[ itemCurrent ].title.length > 0) {
			var pos = $("#fancybox_inner").offset();
			
			$('#fancybox_title div').html( itemArray[ itemCurrent ].title);
			
			$('#fancybox_title').css({
				'top'	: pos.top + $("#fancybox_inner").height() + 10,
				'left'	: pos.left + ( ($("#fancybox_inner").width() / 2) - ( $('#fancybox_title').width() / 2 ) )
			}).show();
		}
			
		busy = false;
	};

	function fb_set_keyboard() {
		$(document).bind('keydown.fb', function(e) {
			if (e.keyCode == 27) {
				$.fancybox.close();

			} else if(e.keyCode == 37) {
				$.fancybox.prev();

			} else if(e.keyCode == 39) {
 				$.fancybox.next();
			}
		});
 
		if (currOpts.hideOnContentClick) {
			$("#fancybox_content").click( $.fancybox.close );
		} else {
			$("#fancybox_content").unbind();
		}
	
		if (currOpts.overlayShow && currOpts.hideOnOverlayClick) {
			$("#fancybox_overlay").click( $.fancybox.close );
		}
		
		if (itemArray.length > 1 && $.fn.mousewheel) {
			$("#fancybox_wrap").bind('mousewheel', function(e, delta) {
				e.preventDefault();
 
				if (busy || delta == 0) {
					return;
				}

				delta < 0 ? $.fancybox.prev() : $.fancybox.next();
			});
		}

		if (itemCurrent != 0) {
			$("#fancybox_left, #fancybox_left_ico").unbind().bind("click", function(e) {
				e.stopPropagation();
				$.fancybox.prev();
			});

			$("#fancybox_left").show();
		}

		if (itemCurrent != ( itemArray.length -1)) {
			$("#fancybox_right, #fancybox_right_ico").unbind().bind("click", function(e) {
				e.stopPropagation();
				$.fancybox.next();
			});

			$("#fancybox_right").show();
		}
	};
	
	function fb_preload_images() {
		if ((itemArray.length -1) > itemCurrent) {
			var href = itemArray[ itemCurrent + 1 ].href;

			if (href.match(imageRegExp)) {
				var objNext = new Image();
				objNext.src = href;
			}
		}

		if (itemCurrent > 0) {
			var href = itemArray[ itemCurrent - 1 ].href;

			if (href.match(imageRegExp)) {
				var objNext = new Image();
				objNext.src = href;
			}
		}
	};
	
	function fb_animate_loading() {
		if (!$("#fancybox_loading").is(':visible')){
			clearInterval(loadingTimer);
			return;
		}

		$("#fancybox_loading > div").css('top', (loadingFrame * -40) + 'px');

		loadingFrame = (loadingFrame + 1) % 12;
	};

	function fb_show_loading() {
		clearInterval(loadingTimer);

		var pos = fb_get_viewport();

		$("#fancybox_loading").css({'left': ((pos[0] - 40) / 2 + pos[2]), 'top': ((pos[1] - 40) / 2 + pos[3])}).show();
		$("#fancybox_loading").bind('click', $.fancybox.close);

		loadingTimer = setInterval(fb_animate_loading, 66);
	};

	
	function fb_get_position(el) {
		var pos = el.offset();

		el = el.jquery? el[0] : el;

		pos.top		+= parseFloat( $.curCSS(el, 'paddingTop',		true) ) || 0;
		pos.top		+= parseFloat( $.curCSS(el, 'borderTopWidth',	true) ) || 0;

		pos.left	+= parseFloat( $.curCSS(el, 'paddingLeft',		true) ) || 0;
		pos.left	+= parseFloat( $.curCSS(el, 'borderLeftWidth',	true) ) || 0;

		return pos;
	};

	function fb_init() {
		currOpts = $.extend({}, defaults);


		var preload = [];

		$('#fancybox_wrap').find('td').each(function() {
			preload.push( new Image() );
			preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1');
	    });
	    
		var html = '';

		html += '<div id="fancybox_overlay"></div>';

		html += '<div id="fancybox_wrap">';
		html += '<div id="fancybox_inner">';
		html += '<div id="fancybox_content"></div>';
		html += '<a href="javascript:;" id="fancybox_close"></a>';
		html += '<a href="javascript:;" id="fancybox_left"><span id="fancybox_left_ico"></span></a>';
		html += '<a href="javascript:;" id="fancybox_right"><span id="fancybox_right_ico"></span></a>';
		html += '<div class="fancybox_bg fancybox_bg_n"></div><div class="fancybox_bg fancybox_bg_ne"></div><div class="fancybox_bg fancybox_bg_e"></div><div class="fancybox_bg fancybox_bg_se"></div><div class="fancybox_bg fancybox_bg_s"></div><div class="fancybox_bg fancybox_bg_sw"></div><div class="fancybox_bg fancybox_bg_w"></div><div class="fancybox_bg fancybox_bg_nw"></div>';
		html += '</div>';
		html += '</div>';
		html += '<div id="fancybox_title"></div>';
		html += '<div id="fancybox_loading"><div></div></div>';
		html += ' <div id="fancybox_tmp"></div>';
    
		$(html).appendTo("body");
	    
	    $('<table cellspacing="0" cellpadding="0" border="0"><tr><td class="fancybox_title" id="fancybox_title_left"></td><td class="fancybox_title" id="fancybox_title_main"><div></div></td><td class="fancybox_title" id="fancybox_title_right"></td></tr></table>').appendTo('#fancybox_title');

	    if ($.browser.msie) {
			$(".fancybox_bg, #fancybox_overlay, #fancybox_close, #fancybox_left_ico, #fancybox_right_ico, .fancybox_title").fixPNG();
		}
		
		$("#fancybox_close").click( $.fancybox.close );
	};

	$(document).ready(function() {
		fb_init();
	});

})(jQuery);