/* Preview Plugin */

var ImageLinkRegex = /.+\.(png|jpg|gif|jpeg)$/g;

var ___overlay = null;
var ___previewImageObj = null;
var ___waitingImage = null;
(function ($){

	jQuery.fn.center = function (options, cordinateName) {
		
		if(typeof options == 'string')
		{
			var optionsx = {};
			optionsx[options] = cordinateName ;
			options = optionsx;
		}
		
		var defaults = {
				"position": "absolute",
				animateTime: 500,
				"disableVertical": false,
				"disableHorizontal": false
		};			
		var animate = (options === true) ;
		
		var settings = $.extend(true, defaults, options);
		
		var offset = {top: 0, left: 0};
		
		if(settings.hasOwnProperty("position"))
		{
			
			switch(settings.position)
			{
				case "absolute": 
						this.css("position","absolute");
						if(settings.disableVertical == false)
						{
							offset.top = (($(window).height() - this.outerHeight()) / 2) + $(window).scrollTop() + "px";						
						}
						if(settings.disableHorizontal == false)
						{
							offset.left = (($(window).width() - this.outerWidth()) / 2) + $(window).scrollLeft() + "px";
						}
						break;
				case "fixed":
				default:
						this.css("position","fixed");
						if(settings.disableVertical == false)
						{
							offset.top = (($(window).height() - this.outerHeight()) / 2) + "px";
						}
						if(settings.disableHorizontal == false)
						{
							offset.left = (($(window).width() - this.outerWidth()) / 2) + "px";
						}
						break;
			}
		}
		if(typeof options === "string")
		{
			switch(options)
			{
				case "getCordinate": 
					if(typeof cordinateName === "string")
					{
						switch(cordinateName)
						{
							case "left": return offset.left;
								break;
							case "top": return offset.top;
								break;
							default:
								return null;
						}
					}
					break;
				default:
					return null;
					
			}
		}
		
		if(animate)
		{
			this.animate({"top": offset.top,"left": offset.left}, settings.animateTime);
		}
		else
		{
			this.css({"top": offset.top,"left": offset.left});
		}
		
		return this;
	}


	$.fn.preview = function (ignoreURL){
		___waitingImage = new Image();
		___waitingImage.src = "/images/ajax-loader.gif";
		___waitingImage = $(___waitingImage);
		
		$(window).resize(___resizeWindow);
		
		this.each(function (i,o){
			if(ignoreURL == undefined || ignoreURL == false || ignoreURL == null)
			{
				if(ImageLinkRegex.test($(o).attr("href")))
				{
					$(o).click(___previewImage);
					console.log("Valid URL [ " + $(o).attr("href") + " ]");
				}
				else
				{
					console.log("Skiping URL [ " + $(o).attr("href") + " ]");
				}
			}
			else
			{
				console.log("Ignoring URL [ " + $(o).attr("href") + " ]");
				$(o).click(___previewImage);
			}
		});
	};
	
	function ___previewImage(e)
	{
		e.preventDefault();
		console.log("link Clicked");
		var imgObj = $(e.target);
		var url = imgObj.attr("href");
		
		if(url == undefined && imgObj[0].tagName != 'a')
		{
			url = imgObj.parents("a").attr("href");
		}
		
		var Loader = new Image();
		
		$(Loader).load(___showImage);
		
		Loader.src = url;
		console.log("Loading Image");
		
		// Show Overlay
		if(___overlay == null)
		{
			___overlay = $("<div id='overlay'></div>");
			
			$(___overlay).css({
			
				backgroundColor: "black",
				opacity: 0.7,
				position: "fixed",
				top: 0,
				left: 0,
				width: $(window).width(),
				height: $(window).height()
			}).click(___hideImage).appendTo("body");
		}
		
		___waitingImage.appendTo("body").center();
		// Create ImagePalce holder
	}
	
	function ___resizeWindow()
	{
	
		if(!(___overlay == null && ___previewImageObj == null))
		{
			$(___overlay).css({
			
				backgroundColor: "black",
				opacity: 0.7,
				position: "fixed",
				top: 0,
				left: 0,
				width: $(window).width(),
				height: $(window).height()
			});
			
		}
	}
	
	function ___showImage(e)
	{
		
	
		___previewImageObj = $(e.target).unbind("load")
			.attr("style", "-webkit-box-shadow: 0px 0px 50px 0px #000000; -moz-box-shadow: 0px 0px 50px 0px #000000; box-shadow: 0px 0px 50px 0px #000000; ")
			.css({
				backgroundColor: "black",
				opacity: 1,
				position: "fixed",
				top: 0,
				left: 0
			}).appendTo("body").draggable().mousewheel(___Zoom).center();
			___waitingImage.remove();
	}

	function ___hideImage(e)
	{
		$("#overlay").remove();
		___previewImageObj.remove();
		___overlay = null;
	}

	function ___Zoom(e, delta)
	{
		console.log(delta);
		___previewImageObj.stop();
		if(delta > 0) // reduce size
		{
			___previewImageObj.animate({
				width: ___previewImageObj.width() - (___previewImageObj.width() * 0.25),
				height: ___previewImageObj.height() - (___previewImageObj.height() * 0.25),
				top: ___previewImageObj.center("getCordinate", "top"),
				left: ___previewImageObj.center("getCordinate", "left")},
				500);
		}
		else
		{
			___previewImageObj.animate({
				width: ___previewImageObj.width() + (___previewImageObj.width() * 0.25),
				height: ___previewImageObj.height() + (___previewImageObj.height() * 0.25),
				top: ___previewImageObj.center("getCordinate", "top"),
				left: ___previewImageObj.center("getCordinate", "left")},
				500);
		}
		
	}
	
})(jQuery);


