
/*
 * Facebox (for jQuery) version: 1.2 (05/05/2008) @requires jQuery v1.2 or later
 *
 * Licensed under the MIT: http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright 2007, 2008 Chris Wanstrath [ chris@ozmm.org ]
 */

(function($) {
	$.facebox = function(data, klass) {
		$.facebox.loading();

		if (data.ajax)
			fillFaceboxFromAjax(data.ajax);
		else if (data.image)
			fillFaceboxFromImage(data.image);
		else if (data.div)
			fillFaceboxFromHref(data.div);
		else if ($.isFunction(data))
			data.call($);
		else
			$.facebox.reveal(data, klass);
	}

	/*
	 * Public, $.facebox methods
	 */

	$.extend($.facebox, {
		settings : {
			opacity : 0.65,
			overlay : true,
			loadingImage : '/_pic/loading.gif',
			closeImage : '/_pic/closelabel.gif',
			imageTypes : ['png', 'jpg', 'jpeg', 'gif'],
			faceboxHtml : '\
			<div id="facebox" style="display:none;"> \
				<div class="popup clearfix"> \
					<div class="c popup-body"> \
						<div class="popup-content"></div> \
					</div> \
				</div> \
				<div class="popup-close"><span>Закрыть</span></div> \
    		</div>'
		},

		loading : function() {
			init();

			if ($('#facebox .loading').length == 1) {
				return true;
			}

			showOverlay();

			$('#facebox').css({
				visibility: 'hidden'
			});

			$('#facebox .popup-content').empty();
			$('#facebox .popup-body').children().hide(); //.end().append('<div class="loading"><img src="' + $.facebox.settings.loadingImage + '"/></div>');

			$('#facebox').css({
				top : getPageScroll()[1] + (getPageHeight() / 10) + 'px',
				left : 10
			}).show();

			$(document).bind('keydown.facebox', function(e) {
				if (e.keyCode == 27) {
					$.facebox.close();
				}

				return true;
			});

			$(document).trigger('loading.facebox')
		},

		reveal : function(data, klass) {
			$(document).trigger('beforeReveal.facebox');

			if (klass) {
				$('#facebox .popup-content').addClass( klass );
			}

			$('#facebox .popup-content').append( data );
			//$('#facebox .loading').remove();
			//$('#facebox .popup-body').children().fadeIn('normal');

			$('#facebox .popup-body').children().show();
			//			alert($('#facebox').width(),$(window).width())
							re = /Firefox\/2/;
					osFirefox2 = re.test(navigator.userAgent);

					fBoxWidth = osFirefox2 ? $('#facebox .popup').width() : $('#facebox .popup').width() /2;

			$('#facebox').css({
				left: ($(window).width() / 2 - (fBoxWidth) + 'px'),
				visibility: 'visible'
			});

			$(document).trigger('reveal.facebox').trigger('afterReveal.facebox');

		},

		close : function() {
			$(document).trigger('close.facebox');
			return false;
		}
	})

	/*
	 * Public, $.fn methods
	 */

	$.fn.facebox = function(settings) {
		init(settings);

		function clickHandler() {
			$.facebox.loading(true);

			// support for rel="facebox.inline_popup" syntax, to add a class
			// also supports deprecated "facebox[.inline_popup]" syntax
			var klass = this.rel.match(/facebox\[?\.(\w+)\]?/);
			if (klass) {
				klass = klass[1];
			}

			fillFaceboxFromHref(this.href, klass);
			return false;
		}

		return this.click(clickHandler);
	}

	/*
	 * Private methods
	 */

	// called one time to setup facebox on this page
	function init(settings) {
		if ($.facebox.settings.inited) {
			return true;
		} else {
			$.facebox.settings.inited = true;
		}

		$(document).trigger('init.facebox');
		makeCompatible();

		var imageTypes = $.facebox.settings.imageTypes.join('|');
		$.facebox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i');

		if (settings) {
			$.extend($.facebox.settings, settings);
		}

		$('body').append($.facebox.settings.faceboxHtml);

		// Vii: adding iframe to hide select-elements
		if( $.browser.ie ) {
			$_frame = $('<iframe id="facebox_frame" scrolling="0" border="0"></iframe>').hide();

			$('#facebox').before( $_frame );
			$_frame.css({
				'width' : $(window).width(),
				'height' : $(window).height(),
				'opacity' : 0
			});
		}

		var preload = new Image();
		//preload.src = $.facebox.settings.closeImage;
		//preload[1].src = $.facebox.settings.loadingImage

		/*$('#facebox').find('.b:first, .bl, .br, .tl, .tr').each(function() {
			preload.push(new Image())
			preload.slice(-1).src = $(this).css('background-image').replace(
					/url\((.+)\)/, '$1')
		})*/

		$('#facebox .popup-close').click($.facebox.close);
	}

	// getPageScroll() by quirksmode.com
	function getPageScroll() {
		var xScroll, yScroll;

		if(self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if(document.documentElement && document.documentElement.scrollTop) {
			// Explorer 6 Strict
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if(document.body) {
			// all other Explorers
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;
		}

		//return new Array(xScroll, yScroll);
		return [xScroll, yScroll];
	}

	// Adapted from getPageSize() by quirksmode.com
	function getPageHeight() {
		var windowHeight;

		if(self.innerHeight) {
			// all except Explorer
			windowHeight = self.innerHeight;
		} else if(document.documentElement && document.documentElement.clientHeight) {
			// Explorer 6 Strict
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) {
			// other Explorers
			windowHeight = document.body.clientHeight;
		}

		return windowHeight;
	}

	// Backwards compatibility
	function makeCompatible() {
		var $s = $.facebox.settings;

		//$s.loadingImage = $s.loading_image || $s.loadingImage
		$s.closeImage = $s.close_image || $s.closeImage
		$s.imageTypes = $s.image_types || $s.imageTypes
		$s.faceboxHtml = $s.facebox_html || $s.faceboxHtml
	}

	// Figures out what you want to display and displays it
	// formats are:
	// div: #id
	// image: blah.extension
	// ajax: anything else
	function fillFaceboxFromHref(href, klass) {
		if(href.match(/#/)) {
			// div
			var url = window.location.href.split('#')[0],
			target = href.replace(url, '');

			$.facebox.reveal($(target).clone().show(), klass);
		} else if(href.match($.facebox.settings.imageTypesRegexp)) {
			// image
			fillFaceboxFromImage(href, klass);
		} else {
			// ajax
			fillFaceboxFromAjax(href, klass);
		}
	}

	function fillFaceboxFromImage(href, klass) {
		var image = new Image();

		image.onload = function() {
			$.facebox.reveal('<div class="pop-image"><img src="' + image.src + '" /></div>', klass);
		}

		image.src = href;
	}

	function fillFaceboxFromAjax(href, klass) {
		// Vii: no cache for request
		var random = new Date().getTime(),
		sQuerySep;

		href.lastIndexOf('?') != -1 ? sQuerySep = '&' : sQuerySep = '?';
		href += sQuerySep + 'dynamic=' + random;

		$.get(href, function(data) {
			$.facebox.reveal(data, klass);
		})
	}

	function skipOverlay() {
		return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null;
	}

	function showOverlay() {
		$('#facebox_frame').show();

		if (skipOverlay()) {
			return;
		}

		if ($('#facebox_overlay').length == 0) {
			$("body").append('<div id="facebox_overlay" class="facebox_hide"></div>');
		}

		$('#facebox_overlay').hide().addClass("facebox_overlayBG").css(
				'opacity', $.facebox.settings.opacity).click(function() {
					$(document).trigger('close.facebox')
				}).fadeIn(200);

		return false;
	}

	function hideOverlay() {
		$('#facebox_frame').hide();

		if (skipOverlay()) {
			return;
		}

		$('#facebox_overlay').fadeOut(200, function() {
			/*$("#facebox_overlay").removeClass("facebox_overlayBG");
			$("#facebox_overlay").addClass("facebox_hide")
			$("#facebox_overlay").remove()*/

			$("#facebox_overlay").removeClass("facebox_overlayBG")
				.addClass("facebox_hide")
				.remove();
		});

		return false;
	}

	/*
	 * Bindings
	 */

	$(document).bind('close.facebox', function() {
		$(document).unbind('keydown.facebox');

		$('#facebox').fadeOut(function() {
			$('#facebox .popup-content').removeClass().addClass('popup-content');
			hideOverlay();
			//$('#facebox .loading').remove()
		})
	})

})(jQuery);

jQuery(function(){
	jQuery('a[rel*=facebox]').facebox();
})