/* 
The slideTweener plugin manages a gallery in the following format:

<ul id = "gallery">
	<li><a href="#"><img src="homeimages/1.jpg" alt="1" title="one"></a></li>
	<li><a href="#"><img src="homeimages/2.jpg" alt="2" title="two"></a></li>
	<li><a href="#"><img src="homeimages/3.jpg" alt="3" title="three"></a></li>
</ul>


*/
(function( $ ){
	var defaults = {
		controlMode: 'DEFAULT', /*takes arguments 'DEFAULT',"APPENDCONTROLS", "IMAGE", */
		controls : {
				appendToContainer: '',
				prevId: 'prevBtn',
				nextId: 'nextBtn',
				prevBtn: 'previous',
				nextBtn: 'next',
				display: ""
			},
		autoplay: false,
		autoplayTimer: 3000,
		imgPaddingLeft : 0,
		imgPaddingRight: 0,
		alignment: "center",
		timeOut: 800,
		offOpacity: 0.5,
		startIndex: 1//!! 1 indexing
	}; 

	// global vars
	var debugLog;
	var options = $.extend(defaults);

	var slideTweener;
	var index;
	var slideTweenerUL;
	var totalSlides;
	var $controlInterface;
	var slideTimer;
	var methods = {
		/*init: sets up slideTweener container size. */
		init : function( options ) { 
			debugLog = $("#debugLog");
			options = $.extend(true,defaults, options);
			slideTweener=$(this);
			slideTweenerUL = slideTweener.find("ul");
			totalSlides = $("li", slideTweenerUL).size();
			setStyles();
			index = options["startIndex"]; 
			disableHyperlinks();
			
			if (totalSlides > 1){
				appendControls();
			}
			
			if (options["autoplay"]){
				startSlideShow();
			}

			function startSlideShow(){
				var counter = 0
				slideTimer = setInterval(function(){ methods.updateIndex(index+1)}, options["autoplayTimer"] );
			}


			function disableHyperlinks(){
				/* remove default hyperlinking. only hyperlink if the index matches the click */
				$("li", slideTweenerUL).find("a").click(function(event) {
					event.preventDefault();
					var identifier= $(this).parent().attr("class");
					if (identifier == index){
						var href = $(this).attr("href");
						$(location).attr('href', href);
					}
				})
			}
			function appendControls(){
				function controllerObserver(i){
					clearInterval(slideTimer);
					methods.updateIndex(i);
				}
				switch (options["controlMode"]){
					case "APPENDCONTROLS": 
					case "DEFAULT": 
						setButtonControls();
						break;
					/*TODO: link image clicking to tweening animation*/
					case "IMAGE":
						setImageControls();	
						break;
					case "IMAGE_AND_BUTTONS":
						setButtonControls();
						setImageControls();	
						break;
						
				}

				function setImageControls(){
					slideTweener.find("li").each(function(){
						var $slide = $(this);
						var newIndex=  $slide.attr("class");
						$slide.bind("click.slideTweener", function(){ controllerObserver(newIndex); }
						);
					})
				}

				function setButtonControls(){
					var pBtn, nBtn;
					var $controlContainer;
					if (options["controls"]["appendToContainer"] != ""){
						$controlContainer = $(options["controls"]["appendToContainer"]);
					}else{
						$controlContainer= slideTweener;
					}
					pBtn = $controlContainer.find("#"+options["controls"]["prevId"]);
					nBtn = $controlContainer.find("#"+options["controls"]["nextId"]);

					if (pBtn.length == 0){
						$controlContainer.append("<span id = '"+options["controls"]["prevId"]+"'>"+options["controls"]["prevBtn"]+"</span>");
						pBtn = $controlContainer.find("#"+options["controls"]["prevId"]);
					}
					if (nBtn.length == 0){
						$controlContainer.append("<span id = '"+options["controls"]["nextId"]+"'>"+options["controls"]["nextBtn"]+"</span>");
						nBtn = $controlContainer.find("#"+options["controls"]["nextId"]);
					}

					pBtn.bind("click.slideTweener", function(){ controllerObserver(index-1); });
					nBtn.bind("click.slideTweener", function(){ controllerObserver(index+1); });
					if(options["controls"]["display"] == "FRACTION"){ //display INDEX of TOTAL
						pBtn.after("<span class=\"interface\">"+index +" of "+totalSlides+ "</span>");
					}
					$controlInterface = $controlContainer.find("span.interface");
					
				}
				
				function controllerObserver(i){
					clearInterval(slideTimer);
					methods.updateIndex(i) 
				}
				
			}
			
			function setStyles(){
				var slideShowWidth = 0;
				var slideTweenerWidth = 0;
				slideTweenerUL.find("li").css({
									"float":"left",
									"list-style-type":"none"
				})
				
				slideTweenerUL.find("img").css({
									"border":"none",
									"padding-left": options["imgPaddingLeft"],
									"padding-right": options["imgPaddingRight"]
				})
				setHRsettings();
				function setHRsettings(){
					slideTweenerUL.find("img").each(function(){
						var width = $(this).width();
						$(this).parent().prev("hr").css({"width":width});
						$(this).prev("hr").css({"width":width});
					})
				}
				setULContainerWidth();
				setSlideTransparency();
				setULContainerPosition();//place ul container based on index.
				function setSlideTransparency(){
					// slideTweenerUL.find("li:not('."+1+"')").css("opacity", options["offOpacity"]);
					//TODO:delete custom setting for ciancimino and replace with above line
					slideTweenerUL.find("li:not('."+1+"')").css("opacity", options["offOpacity"]).find("hr").css({"opacity":0});
				}
				function setULContainerPosition(){
					var leftMargin=0;
					for (var i = 0; i< options["startIndex"]; i++) {
						var li =  i;
						leftMargin += getElementWidth(slideTweenerUL.find("li."+li)) * -1;
					}
					slideTweenerUL.css(
						{"margin-left": leftMargin}
					);
					slideTweenerUL.find("li:not('."+options['startIndex']+"')").css(
						{"opacity": options["offOpacity"]}
					).find("hr").css(//TODO:delete custom setting for ciancimino
						{"opacity": 0}
					)
					
					slideTweenerUL.find("li."+options['startIndex']).css(
						{"opacity": 1}
					).find("hr").css(//TODO:delete custom setting for ciancimino
						{"opacity": 1}
					)
				}
				function setULContainerWidth(){
					var assignedIndex = 1;
					
					slideTweenerUL.find("li").each(function(){
						var slide = $(this);
						var siw=$(this).find('img').width();
						slide.attr('class', assignedIndex.toString());
						assignedIndex++;
						slideTweenerWidth+=getElementWidth(slide);
					})

					slideTweener.css({"overflow":"hidden"});

					slideTweenerUL.css({
										"margin":"0px", 
										"padding":"0px",
										"overflow":"hidden",
										"width" : slideTweenerWidth+"px"
									});

				}
			}
		},
		updateIndex : function( newIndex ) {
			// set index to newIndex
			//tween to a new left margin.
			// var tweenDistance = checkNaN(sslideTweenerUL.css("margin-left"));
			index = newIndex;
			if(index < 1){
				index = totalSlides;
			}
			
			if(index > totalSlides){
				index = 1;
			}
			var leftMargin = 0;
			switch(options["controls"]["display"]){
				case "FRACTION": udpateInterface();
					break;
					
				case "" : break;
			}

			function udpateInterface(){
				$controlInterface.html(index + " of " +totalSlides);
			}


			for (var i = 0; i< index; i++) {
				var li =  i;
				leftMargin += getElementWidth(slideTweenerUL.find("li."+li)) * -1;
			}
			slideTweenerUL.animate(
				{"margin-left": leftMargin},
				{"duration": options["timeOut"]}
			);
			
			slideTweenerUL.find("li:not('."+index+"')").animate(
				{"opacity": options["offOpacity"]},
				{"duration": options["timeOut"]}
			).find("hr").animate(//TODO:delete custom setting for ciancimino
				{"opacity": 0},
				{"duration": options["timeOut"]}
			)
			
			slideTweenerUL.find("li."+index).animate(
				{"opacity": 1},
				{"duration": options["timeOut"]}
			).find("hr").animate(//TODO:delete custom setting for ciancimino
				{"opacity": 1},
				{"duration": options["timeOut"]}
			)

		}

	};// end public methods
	
	//utility methods.
	function checkNaN(numeric){
		if (isNaN(numeric)){
			return 0;
		} else {
			return numeric;
		}
	}
	function getElementWidth($element){
		var totalWidth, elementWidth, padLeft, padRight, margLeft,margRight;
		padLeft = checkNaN(parseInt($element.css("padding-left")));
		padRight = checkNaN(parseInt($element.css("padding-right")));
		margLeft = checkNaN(parseInt($element.css("margin-left")));
		margRight = checkNaN(parseInt($element.css("margin-right")));
		elementWidth = checkNaN(parseInt($element.find("img").width()));
		totalWidth = padLeft + padRight + margLeft + margRight + elementWidth;

		return totalWidth
	}
	
	$.fn.slideTweener = function( method ) {
		/* boilerplate plugin code */
		if ( methods[method] ) {
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
		} else if ( typeof method === 'object' || ! method ) {
			return methods.init.apply( this, arguments );
		} else {
			$.error( 'Method ' +  method + ' does not exist on jQuery.slideTweener' );
		}    
		
	}
})( jQuery );
