/*
SNIPER PLUGIN
=============
Author:   Andrija Brljak (Binom)
Modified: 27.10.2010
Version:  1.0

OPTIONS PROPERTIES:
===================
.zoom      -> html element    -> container for magnified display
.bindEvent -> string          -> event name to be bound for triggering the plugin (e.g. "mouseover", "click")
.open      -> function(thumb) -> event callback for open
.close     -> function(thumb) -> event callback for close
.error     -> function(thumb) -> event callback for image load error

EXAMPLE USAGE:
==============
<a href="full.jpg" id="myThumb"><img src="thumb.jpg" alt="" /></a>
<div id="zoom"></div>
<script type="text/javascript">
	$("#myThumb").sniper({ zoom:"#zoom", bindEvent:"mouseover" });
</script>
*/
function SniperPlugin(options, thumb)
{
    var imgSrc = null;
	if($(thumb).is("a"))
	{
	    var Status = 0;
	    imgSrc = $(thumb).attr("href");
		var Img = $(document.createElement("img")).attr("src", $(thumb).attr("href")).css("position", "relative").error(function () { Status = -1; }).load(function () { Status = 1; });
		
		var Hide = function(e)
		{
			$(options.zoom).hide();
			if(options.onClose) options.onClose(thumb);
		}
		var Init = function (e)
		{
		    if ($(Img).attr("src") != imgSrc) $(Img).attr("src", imgSrc);
		    if (Status >= 0)
		    {
		        $(options.zoom).children("img").remove();
		        $(options.zoom).append(Img).show();
		        ZoomAt(e);
		        if (options.onOpen) options.onOpen(thumb);
		    }
		    else
		    {
		        if (options.onError) options.onError(thumb);
		    }
		};
		var ZoomAt = function(e)
		{
			if($(options.zoom).is(":visible"))
			{
				var imgWidth = $(Img).width();
				var imgHeight = $(Img).height();
				var zoomWidth = $(options.zoom).width();
				var zoomHeight = $(options.zoom).height();
				var left = (imgWidth * (e.pageX - $(ThumbImg).offset().left) / $(ThumbImg).width() - (zoomWidth * 0.5)) * -1;
				var top = (imgHeight * (e.pageY - $(ThumbImg).offset().top) / $(ThumbImg).height() - (zoomHeight * 0.5)) * -1;
				if (left > 0) left = 0;
				if (top > 0) top = 0;
				if (left < (imgWidth - zoomWidth) * -1) left = (imgWidth - zoomWidth) * -1;
				if (top < (imgHeight - zoomHeight) * -1) top = (imgHeight - zoomHeight) * -1;
				var zoomImg = $(options.zoom).children("img");
				$(zoomImg).css("left", left).css("top", top);
			}
		};
		$(options.zoom).css("overflow", "hidden").css("position", "relative").hide();
		var ThumbImg = $(thumb).children("img").load(function ()
		{
		    $(this).css("position", "relative").css("top", "50%").css("left", "50%").css("margin-left", $(this).width() * -0.5).css("margin-top", $(this).height() * -0.5);
		});
		$(ThumbImg).attr("src", $(ThumbImg).attr("src"));
		$(thumb).css("display", "block").css("overflow", "hidden").css("position", "relative").attr("href", "#").click(function(){return false;}).mousemove(ZoomAt).mouseout(Hide).bind(options.bindEvent != undefined ? options.bindEvent : "mouseover", function(e)
		{
			$(options.zoom).is(":visible") ? Hide(e) : Init(e);
		});
    }
    this.ChangeSrc = function (src)
    {
        imgSrc = src;
    }
}
(function($)
{
    $.fn.extend(
	{
		sniper: function(options)
		{
			return this.each(function()
			{
				$(this).data("sniper", new SniperPlugin(options, this));
			});
		}
    });
})(jQuery);

/*

SCROLLER PLUGIN
===============
Author:   Andrija Brljak (Binom)
Modified: 28.10.2010
Version:  0.9

*/
function ScrollerPlugin(options, container)
{
	if(!options.speed) options.speed = 300;
	var offsetX = 0;
	var isStopped = true;
	var cssName = "binom_" + Math.round(Math.random() * 1000000000).toString();
	var Canvas = $(container).children(":first").css("position", "absolute").css("width", 5000).css("height", 5000);
	var OriginalItems = $(Canvas).children();
	var CenterRelative = function(e)
	{
		$(e).css("position", "relative").css("left", "50%").css("top", "50%");
	}
	var CenterGridItem = function(e)
	{
		if($(e).is("a"))
		{
			$(e).css("display", "block").css("overflow", "hidden").css("height", "100%").css("width", "100%").css("left", 0).css("top", 0);
			CenterRelative($(e).children(":first").css("margin-left", $(e).children(":first").width() * -0.5).css("margin-top", $(e).children(":first").height() * -0.5));
		}
		else
		{
			$(e).css("margin-left", $(e).width() * -0.5).css("margin-top", $(e).height() * -0.5);
		}
	};
	if(options.grid)
	{
		if(!options.grid.spacing) options.grid.spacing = 0;
		if(options.grid.x > 0 && options.grid.y > 0)
		{
			var boxWidth  = ($(container).width()  - ((options.grid.x - 1) * options.grid.spacing)) / options.grid.x;
			var boxHeight = ($(container).height() - ((options.grid.y - 1) * options.grid.spacing)) / options.grid.y;
			$(OriginalItems).each(function(i)
			{
				var wrapper = $(document.createElement("div"));
				$(wrapper).css("overflow", "hidden").css("width", boxWidth).css("height", boxHeight);
				$(wrapper).css("float", "left").css("margin-right", options.grid.spacing).css("margin-bottom", options.grid.spacing);
				CenterRelative(this);
				if($(this).is("img") && this.complete == false)
				{
					$(this).load(function() { CenterGridItem(this); });
				}
				else
				{
					CenterGridItem(this);
				}
				$(Canvas).append(wrapper);
				$(wrapper).append(this);
				
			});
		}
	}
	
	var Size = function(element) { return {x:$(element).position().left, y:$(element).position().top, width:$(element).outerWidth(true), height:$(element).outerHeight(true)}; };
	var Tween = function(callback)
	{
		$(Canvas).animate({marginLeft:offsetX}, options.speed, "swing", function()
		{
			isStopped = true;
			if(callback) callback();
			E_OnScrollComplete();
		});
	};
	var E_OnBeforeScroll   = function() { if(options.onBeforeScroll)   options.onBeforeScroll($(container).data("scroller")); }
	var E_OnScrollComplete = function() { if(options.onScrollComplete) options.onScrollComplete($(container).data("scroller")); }
	$(options.navLeft).click(function()
	{
		if(isStopped)
		{
			var doMove = false;
			var Items = $(Canvas).children();
			for(var i = 0; i < Items.length; i++)
			{
				if(Size($(Items[i])).x > $(container).width()) { doMove = true; break; }
			}
			if(doMove)
			{
				E_OnBeforeScroll();
				isStopped = false;
				var last = $(Canvas).children(":last");
				offsetX = 0;
				$(Canvas).css("margin-left", $(last).outerWidth(true) * -1).prepend(last);
				Tween();
			}
		}
		return false;
	});
	$(options.navRight).click(function()
	{
		if(isStopped)
		{
			var doMove = false;
			var Items = $(Canvas).children();
			for(var i = 0; i < Items.length; i++)
			{
				if(Size($(Items[i])).x + offsetX > $(container).width()) { doMove = true; break; }
			}
			if(doMove)
			{
				E_OnBeforeScroll();
				isStopped = false;
				var first = $(Canvas).children(":first");
				var dim = Size(first);
				offsetX = (dim.width + dim.x) * -1;
				Tween(function()
				{
					$(Canvas).append(first).css("margin-left", 0);
				});
			}
		}
		return false;
	});
	$(container).css("position", "relative").css("overflow", "hidden");
	$(container).addClass(cssName);
	if(options.onItemsReady) options.onItemsReady($(container).data("scroller"), options.grid ? $(Canvas).children("div").children() : $(Canvas).children());
}


(function($)
{
    $.fn.extend(
	{
		scroller: function(options)
		{
			return this.each(function()
			{
				$(this).data("scroller", new ScrollerPlugin(options, this));
			});
		}
    });
})(jQuery);
