jQuery.fn.beonoPopUp = function(options) 
{

	// If BullShit 7 and lower
	var isIE = false;
	if (jQuery.browser.msie) {
		if(parseInt(jQuery.browser.version) < 8) {
			var isIE = true;
		}
	}

	
	
	// Значения по умолчанию
	var settings = {
		faderOpacity : '0.7',
		faderShowTime : '200',
		popUpShowTime : '200',
		animatePosition : false,
		isIE : isIE,
		navigationEnabled : false,
		navigationCtrlDisable : false,
		cssClassName : false,
		css : false
	};
	
	settings = jQuery.extend(settings, options);

	$(this).click(beonoFocusStart);
		
	function beonoFocusStart (el)  
	{
		if($(el).attr("class")) {
			var $this = el;		
		} else {
			var $this = $(this);	
		}

		if($("div.beonoFocusFader").html() == null) {
			//$("body").append('<div class="beonoFocusFader"></div><div class="beonoFocusLoading"></div><div class="beonoFocusPopUp"><div class="beonoFocusPopUpWrapper"><div class="beonoFocusPopUpHeader"> <div class="beonoFocusPopUpHeaderWrapper"><span class="beonoFocusClose">—</span><div class="clear-both"></div></div></div><div class="beonoFocusPopUpContent"></div></div></div>');
			$("body").append(
				'<div class="beonoFocusFader"></div>'+
				'<div class="beonoFocusLoading"></div>'+
				'<table class="beonoFocusPopUp">'+
					'<tr>' +
						'<td>' +
							'<div class="beonoFocusPopUpWrapper">' +
								'<div class="beonoFocusPopUpHeader">' +
									'<div class="beonoFocusPopUpHeaderWrapper">' +
									'&nbsp;</div>' +
								'</div>' +
								'<div class="beonoFocusPopUpContent">' +
								'</div>' +
								'<a href="#" onclick="return false;" class="beonoFocusClose">&nbsp;</a>' +
								'<div class="beonoFocusPopUpFooter">' +
									'<div class="beonoFocusPopUpFooterWrapper">' +
									'&nbsp;</div>' +
								'</div>' +
							'</div>' +
						'</td>' +
					'</tr>' +
				'</table>'
			);
	
		}

		var $beonoFocusFader = $("div.beonoFocusFader");
		var $beonoFocusShadow = $("img.beonoFocusShadow");
		var $beonoFocusPopUp = $(".beonoFocusPopUp");
		var $beonoFocusPopUpContent = $("div.beonoFocusPopUpContent");
		var $beonoFocusLoading = $("div.beonoFocusLoading"); 
		var $beonoFocusPopUpHeaderWrapper = $("div.beonoFocusPopUpHeaderWrapper");
		var $beonoFocusPopUpFooterWrapper = $("div.beonoFocusPopUpFooterWrapper");
		
		
		// IE. We need to store html overflow to restore it on exit
		// TODO: Need to set overflow-x too;

		if (settings.isIE || (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8)) {
			var htmlOverflow = $("html").css("overflow-y");
			//$("html").css("overflow-y", "hidden");			
				
			$beonoFocusFader.css("position", "absolute");
			$beonoFocusLoading.css("position", "absolute");
			$beonoFocusPopUp.css("position", "absolute");

		}

		if (settings.navigationEnabled && $("div.beonoFocusPopUpAdditionalWrapper").size() == 0) {

	 		$beonoFocusPopUpContent.after('<div class="beonoFocusPopUpAdditional">' +
												'<div class="beonoFocusPopUpAdditionalWrapper">' +
												'</div>' +
											'</div>');			
		}

		var $beonoFocusPopUpAdditionalWrapper = $("div.beonoFocusPopUpAdditionalWrapper");

		if(settings.cssClassName) {
		
			$beonoFocusPopUp.addClass(settings.cssClassName);
		
		}
		
		// Show Fader
		beonoFocusFaderShow($beonoFocusFader, settings.faderOpacity, settings.faderShowTime);
		
		// :TODO: fix IE absolute position
		
		$beonoFocusLoading
			.css("z-index", ($beonoFocusFader.css("z-index") + 1))
			.animate({ opacity: "show"}, 100);
			
		if (settings.isIE) {
		
			if (!windowWidth || !windowHeight) {
				var windowSize = beonoGetPageSize();
				var windowWidth	 = windowSize[0];
				var windowHeight = windowSize[1];
			}

			if (document.documentElement.scrollTop) {
				var windowScrollTop = document.documentElement.scrollTop;	
			} else {			
				var windowScrollTop = document.body.scrollTop;
			}
			
			$beonoFocusLoading.css("top", windowScrollTop + (windowHeight/2) - ($beonoFocusLoading.height()/2));	
		}

		var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
		var urlType = $this.attr("href").toLowerCase().match(urlString);
	 		
	 	// If image
		if (urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp') {
	 			
	 		beonoFocusPopUpLoadImage($this.attr("href"), $beonoFocusPopUpContent, $beonoFocusPopUp, $beonoFocusLoading);
	 		
	 		if (!settings.navigationDisable) {
	 			beonoFocusPopUpNavigation($this, $beonoFocusPopUpAdditionalWrapper, $beonoFocusPopUp);
	 		}
	 			
	 	} else if($this.attr("href") != "#") {
	 	
	 		beonoFocusPopUpLoadUri($this.attr("href"), $beonoFocusPopUpContent, $beonoFocusPopUp, $beonoFocusLoading);
	 	
	 	} else {
	 	
	 		beonoFocusPopUpLoadElement(settings.popUpElement, $beonoFocusPopUpContent, $beonoFocusPopUp, $beonoFocusLoading);
	 			
		}
	 			
	 	$beonoFocusPopUpFooterWrapper.text($this.attr("title"));
				
		// On Esc press
		$(window).keydown(function(event){
			switch (event.keyCode) {
			  case 27:
			  	$(".beonoFocusClose").click();
			  	break;
			}
		});	 
		
		// On Close click
		$(".beonoFocusClose").click(function () 
		{
			$beonoFocusPopUp.animate({ opacity: "hide" }, settings.popUpShowTime);
			$beonoFocusFader.animate({ opacity: "hide" }, settings.faderShowTime);
			setTimeout('$(".'+$beonoFocusPopUpContent.attr("class")+'").html("")', settings.popUpShowTime);
			setTimeout('$(".beonoFocusPopUp").remove()', settings.popUpShowTime);
			setTimeout('$(".beonoFocusFader").remove()', settings.faderShowTime);
			setTimeout('$(".beonoFocusLoading").remove()', settings.faderShowTime);
 
			if (settings.isIE || (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8)) {
				$("html").css("overflow-y", htmlOverflow);
			}						
		});
		
		// On window resize redraw some elements
		$(window).resize(function(){
			beonoFocusPopUpInitPosition($beonoFocusPopUp, false, false, settings.animatePosition);	
			beonoFocusFaderInitSize($beonoFocusFader);					
		});
		
		// Apply user css
		if (settings.css) { 
			jQuery.each(settings.css, function(selector, properties) {		
				jQuery.each(properties[0], function(property, value) {
					//alert(property + value);
					$(selector).css(property, value);
				});
			});	
		}
		
		return false;
		
		// Doesn't work! See up! ↑
		function beonoFocusClose () {
		
			$beonoFocusPopUp.animate({ opacity: "hide" }, settings.popUpShowTime);
			$beonoFocusFader.animate({ opacity: "hide" }, settings.faderShowTime);
			$("."+$beonoFocusPopUpContent.attr("class")).html("");
			$beonoFocusPopUp.remove();
			$beonoFocusFader.remove();
			$beonoFocusLoading.remove();
	
			if (settings.isIE) {
				$("html").css("overflow-y", htmlOverflow);
			}
		
		}
			
				
		function beonoFocusPopUpNavigation ($this, $beonoFocusPopUpAdditionalWrapper, $beonoFocusPopUp) {
		
			var elementIndex = $("." + $this.attr("class")).index($this);
			var $prevElement = $("." + $this.attr("class")).eq(elementIndex-1);
			var $nextElement = $("." + $this.attr("class")).eq(elementIndex+1);
			
			if (!$prevElement.attr("href") && $nextElement.attr("href")) {
			
				$beonoFocusPopUpAdditionalWrapper.html(				
					'<div class="beonoFocusPopUpNavigation">' +
						'<span class="beonoFocusPopUpNavigationPrev">&larr; Предыдущая</span> <a title="'+ $nextElement.attr("title") +'" href="' + $nextElement.attr("href") + '" class="beonoFocusPopUpNavigationNext">Следущая &rarr;</a>' +
					'</div>'
				);
				
			} else if ($prevElement.attr("href") && !$nextElement.attr("href")) {
			
				$beonoFocusPopUpAdditionalWrapper.html(				
					'<div class="beonoFocusPopUpNavigation">' +
						'<a title="'+ $prevElement.attr("title") +'" href="'+ $prevElement.attr("href") +'" class="beonoFocusPopUpNavigationPrev">&larr; Предыдущая</a> <span class="beonoFocusPopUpNavigationNext">Следущая &rarr;</span>' +
					'</div>'
				);
			
			} else {
			
				$beonoFocusPopUpAdditionalWrapper.html(				
					'<div class="beonoFocusPopUpNavigation">' +
						'<a title="'+ $prevElement.attr("title") +'" href="'+ $prevElement.attr("href") +'" class="beonoFocusPopUpNavigationPrev">&larr; Предыдущая</a> <a title="'+ $nextElement.attr("title") +'" href="' + $nextElement.attr("href") + '" class="beonoFocusPopUpNavigationNext">Следущая &rarr;</a>' +
					'</div>'
				);
						
			}
			
			$(window).keydown(function(event){	
				if (event.ctrlKey || settings.navigationCtrlDisable) {
					switch (event.keyCode ? event.keyCode : event.which ? event.which : null) {
					  case 0x25:
					  	if ($("a.beonoFocusPopUpNavigationPrev").attr("href")) {
						  	$(window).unbind('keydown');
						  	$("a.beonoFocusPopUpNavigationPrev").click();
						}
						break;
					  	
					  case 0x27:
						if ($("a.beonoFocusPopUpNavigationNext").attr("href")) {
						  	$(window).unbind('keydown');
						  	$("a.beonoFocusPopUpNavigationNext").click();
						}
						break;
					}
				}				
			});					
			
			$("a.beonoFocusPopUpNavigationPrev").click(function () 
			{	
				$beonoFocusPopUp.hide();									
				var elementIndex = $("." + $this.attr("class")).index($this);
				var $prevElement = $("." + $this.attr("class")).eq(elementIndex-1);	
				//$(".beonoFocusClose").click();
				if (settings.isIE || (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8)) {
					$("html").css("overflow-y", htmlOverflow);
				}					
				beonoFocusStart($prevElement);	
				return false;
				
			});
			
			$("a.beonoFocusPopUpNavigationNext").click(function () 
			{	
				$beonoFocusPopUp.hide();						
				var elementIndex = $("." + $this.attr("class")).index($this);
				var $nextElement = $("." + $this.attr("class")).eq(elementIndex+1);	
				//$(".beonoFocusClose").click();
				if (settings.isIE || (jQuery.browser.msie && parseInt(jQuery.browser.version) < 8)) {
					$("html").css("overflow-y", htmlOverflow);
				}					
				beonoFocusStart($nextElement);					
				return false;
				
			});			
		
		}
				
		function beonoFocusPopUpLoadImage(imageSrc, $beonoFocusPopUpContent, $beonoFocusPopUp, $beonoFocusLoading) {
						
			$beonoFocusPopUpContent.html("<img />");
			$("."+$beonoFocusPopUpContent.attr("class")+" img").load(function () {
	
				$(this).animate({opacity: "1"}, 1000);
				beonoFocusPopUpShow($beonoFocusPopUp);
				$beonoFocusLoading.hide();
				
			
			}).attr("src", imageSrc);
						
		}
		
		function beonoFocusPopUpLoadUri(uri, $beonoFocusPopUpContent, $beonoFocusPopUp, $beonoFocusLoading) {
					
	
			$beonoFocusPopUpContent.html('<iframe frameborder="0"></iframe>');
			
			$("."+$beonoFocusPopUpContent.attr("class")+" iframe").load(function () {
					
				beonoFocusPopUpShow($beonoFocusPopUp);
				$beonoFocusLoading.hide();
			
			}).attr("src", uri);	
	
						
		}
		
		function beonoFocusPopUpLoadElement(popUpElement, $beonoFocusPopUpContent, $beonoFocusPopUp, $beonoFocusLoading) {
						
			$($($(popUpElement))).clone().appendTo($beonoFocusPopUpContent).show();
	
			beonoFocusPopUpShow($beonoFocusPopUp);
			$beonoFocusLoading.hide();
					
		}
		
		function beonoFocusPopUpFadeIn ($beonoFocusPopUp) {
		
			$beonoFocusPopUp.css("display", "block");
			$beonoFocusPopUp.css("opacity", "0");
			$beonoFocusPopUp.animate({ opacity:1 }, settings.popUpShowTime);
			setTimeout('$(".beonoFocusPopUp").css("opacity", "")', settings.popUpShowTime + 20);
		
		}
		
		function beonoFocusPopUpShow($beonoFocusPopUp){
		
			$beonoFocusPopUp.show();
			$beonoFocusPopUp.hide();
			$beonoFocusPopUp.css("z-index", ($("div.beonoFocusFader").css("z-index") + 2));	
			
			beonoFocusPopUpInitPosition($beonoFocusPopUp);	    
			beonoFocusPopUpFadeIn($beonoFocusPopUp);		
			
		}
	
		function beonoFocusPopUpInitPosition($beonoFocusPopUp, windowWidth, windowHeight, animatePosition) {
			
			if (!windowWidth || !windowHeight) {
				var windowSize = beonoGetPageSize();
				var windowWidth	 = windowSize[0];
				var windowHeight = windowSize[1];
			}
					
			beonoFocusPopUpLeft = (windowWidth - $beonoFocusPopUp.width())/2;
			beonoFocusPopUpTop 	= (windowHeight/2) - ($beonoFocusPopUp.height()/2);
			
			if (settings.isIE) {
			
				if (document.documentElement.scrollTop) {
					var windowScrollTop = document.documentElement.scrollTop;	
				} else {			
					var windowScrollTop = document.body.scrollTop;
				}
				
				beonoFocusPopUpTop = beonoFocusPopUpTop + windowScrollTop;		
			}
	
			// If window resized and PopUp already displayed then slide it to the position
			if ((parseInt($beonoFocusPopUp.css("left")) || parseInt($beonoFocusPopUp.css("top"))) && animatePosition) {
						
					$beonoFocusPopUp.animate({ left: beonoFocusPopUpLeft+"px", top: beonoFocusPopUpTop+"px"}, settings.faderShowTime);	
					//alert(animatePosition);
				
			} else {
			
				$beonoFocusPopUp.css("left", beonoFocusPopUpLeft);
				$beonoFocusPopUp.css("top", beonoFocusPopUpTop);
				
			}				
		}
						
		function beonoFocusFaderInitSize($beonoFocusFader, windowWidth, windowHeight){
		
			if (!windowWidth || !windowHeight) {
				var windowSize = beonoGetPageSize();
				var windowWidth	 = windowSize[0];
				var windowHeight = windowSize[1];
			}
			
			
			if (settings.isIE) {
			
				if (document.documentElement.scrollTop) {
					var windowScrollTop = document.documentElement.scrollTop;	
				} else {			
					var windowScrollTop = document.body.scrollTop;
				}
				
				$beonoFocusFader.css("top", windowScrollTop);	
			}
				
			if(parseInt($beonoFocusFader.css("width")) < windowWidth || parseInt($beonoFocusFader.css("height")) < windowHeight) {
				
				$beonoFocusFader.css("width", windowWidth);
				$beonoFocusFader.css("height", windowHeight);
			}	
		
		}
		
		function beonoFocusFaderShow($beonoFocusFader, opacity, time){
		
			if($beonoFocusFader.css("display") != "block") {
			
				beonoFocusFaderInitSize($beonoFocusFader);
				$beonoFocusFader.css("display", "block");
				$beonoFocusFader.css("opacity", "0");
				$beonoFocusFader.animate({opacity: opacity}, time);
			}
		
		}		
					
		function beonoGetPageSize(){
		
			var de = document.documentElement;
			var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
			var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
			arrayPageSize = [w,h];
			return arrayPageSize;
			
		}
	}
			
};