/**
 * @fileOverview Contains the collection of plugin to make Tray Gallery works.
 * @version 0.1
 * @author Gabriel de Oliveira Barbsoa <gbarbosa@tray.com.br> 
 */

/**
 * See (http://jquery.com/).
 * @name jQuery
 * @class 
 * See the jQuery Library  (http://jquery.com/) for full details.  This just
 * documents the function and classes that are added to jQuery by this plug-in.
 */


(function($){
	/**
	 * @module thumbnize
	 * @param {Object} options
	 * @param {Bollean} options.find_thumbs
	 * @param {Number} options.width
	 * @param {Number} options.height
	 * @example $("ul").thumbnize({find_thumbs:false});
	 */
	$.fn.thumbnize = function (options){
		
		var settings = {
			find_thumbs:true
		};
		
		if (options){
			$.extend( settings, options );
		}
		
		return this.each(function(){
			var li = $(this).find("li");
			li.each(function(){	
				var a = $(this).children("a");
				var img;
				var href = a.attr("href");
				//big image link
				var hrefParts = href.split("/");
				var imgName = hrefParts[hrefParts.length - 1];
				hrefParts.pop();//remove the last part
				
				var path = hrefParts;
			
				//expression to detect if link has thumbs by default
				var hasThumb = a.children("img").length > 0;
				if(!hasThumb){
					var thumbSrc;
					if(settings.find_thumbs){
						thumbSrc = path + "/" + "thumb_" + imgName;
					}
					else{
						thumbSrc = href;
					}
					img = new Image();
					$(img)
						.attr("src", thumbSrc)
						.load(function(){
							if(settings.width){
								$(this).css("width",settings.width);
							}
							if(settings.height){
								$(this).css("height",settings.height);
							}
							$(this).appendTo(a);
						})
						.error(function(){
							//TODO: if thumb fail, load big img and minimize it
							//if we have error by find a thumb file
							if(console.log){
								console.log("Impossible to load:", thumbSrc);
							}
						});
				}
				
			});
		});
	};
	
	
	/**
	 * @module OpenIn
	 * @param {Object} options
	 * @param {String} options.target
	 * TODO: event over or click
	 */
	$.fn.openIn = function(){
		return this.each(function(options){
			var settings = {
				target:"#target"
			};
			$.extend( settings, options );
			$(this).click(function(e){
				$(settings.target).html('<img src="' + $(this).attr("href") + '"/>');
				$(".open").removeClass("open");
				$(this).addClass("open");
				e.preventDefault();
			});
		});
	};
	
	
	/**
	 * @module Arrownize
	 * @param {Object} options
	 * @param {String} options.arrow_tag
	 * @param {String} options.arrow_class
	 * @param {String} options.prevText
	 * @param {String} options.nextText
	 * TODO: calllback on click or over
	 */
	$.fn.arrownize = function(options){
		var settings = {
			arrow_tag:"span",
			arrow_class:"arrownize-arrow",
			prevText:"prev",
			nextText:"next",
			event:"click",
			init:function(){
				
			},
			next:function(){
				console.log("should implement default");
			},
			prev:function(){
				console.log("should implement default");
			}
		};
		$.extend(settings,options);
		return this.each(function(){
			settings.init();
			$(this).wrap('<div class="arrownize-wrapper" />');
			
			//prev
			var $prev = $(document.createElement(settings.arrow_tag));
			$prev.addClass(settings.arrow_class);
			$prev.addClass("prev");
			$prev.text(settings.prevText);
			$prev.bind(settings.event,settings.prev);
			 
			//next
			var $next = $(document.createElement(settings.arrow_tag));
			$next.addClass(settings.arrow_class);
			$next.addClass("next");
			$next.text(settings.nextText);
			$next.bind(settings.event,settings.next);
			
			$(this).before($prev);
			$(this).after($next);
		});
	};
	
	
	/**
	 * @module Scrollize
	 * @param {Object} options
	 * @param {String} options.flow
	 * @param {Number} options.offset
	 */
	$.fn.scrollize = function(options){
		var settings = {
			flow:"horizontal",
			offset:50
		};
		$.extend(settings,options);
		return this.each(function(){
			var $ul = $(this);
			var totalItens = $ul.children("li").length;
			var prop;
			var maxProp;
			
			//utils
			function increment(value){ return "+=" + value; }
			function decrement(value){ return "-=" + value; }
			function getDistance(){ return parseInt($ul.css(prop),10); }
			
			if (settings.flow === "horizontal") {
				prop = "marginLeft";
				maxProp = "width";
			}
			else {
				prop = "marginTop";
				maxProp = "height";
			}
						
			var maxView = parseInt(settings[maxProp],10) / settings.offset;
			var maxDistance = (totalItens * settings.offset) - maxView * settings.offset;
			
			var flow = {};
			flow.prev = {};
			flow.next = {};
			flow.prev[prop] = decrement(settings.offset);
			flow.next[prop] = increment(settings.offset);
			
			
			
			$(this).arrownize({
				prev:function(){
					var distance = getDistance();
					if(distance < 0 ){
						$ul.animate(flow.next,150);
					}
				},
				next:function(){
					var distance = Math.abs(getDistance());
					if(distance < maxDistance){
						$ul.animate(flow.prev,150);
					}
				}
			});
			$(this).wrap('<div />').parent().css({
				width: settings.width || "auto",
				height:  settings.height || "auto",
				overflow: "hidden"
			});
		});
	};

})(jQuery);
