;(function($) 
{
	function methods($inst, setts)
	{
		var	$instance = null;
		var	settings = {};
			
	//--- ojbects ---
		var	$divScroller= null;
		var	$divScrollContent= null;
		var	$divOrgImages= null;
		var	$divControlsContainer= null;
		var	$divBtnClose= null;
		var	$divBtnLeft= null;
		var	$divBtnRight= null;
		var	$divNumbering= null;
		var	$divCaption= null;
			
	//--- Scroller working vars ---
		var	currentPic = 0;
		var	picLength = 0;
			
	//--- Private Methods ---		
		function _showPicture(noAnimation)
		{
			var animTime = settings.animateScrollTime;
			var fadeTime = settings.fadePictureTime;
			
			var doAnimation = (noAnimation==undefined)?true:false;
			if (picLength==0)
			{
				$divControlsContainer.hide();
				return;
			}
						
			if (!doAnimation)
			{
				fadeTime = 0;
				animTime = 0;
			}
			
			var c = $(".currentPhoto:first", $divScrollContent);
			if (c.length!=0)
			{
				if (settings.useInHome)
				{
					c.css("cursor", "");
				} else {
					c.removeClass("zoomCursor");
				}
				
				c.removeClass("currentPhoto")
					.find("img:first")
					.stop(true,true).clearQueue().fadeTo(fadeTime, settings.initPhotosOpacity );
					
				
			}
			
			var pic = $(".img:nth-child(" + (currentPic+1)+ ")", $divScrollContent);
			
			var sW = parseInt( $divScrollContent.width() );
			var mW = parseInt( $divScroller.width() );
			
			xOffs = -parseInt(pic.position().left);
			if (sW<=mW)
			{
				xOffs = 0;
			}
			else if (sW + xOffs < mW && currentPic!=0 && sW>mW)
			{
				xOffs = -sW+mW;
			} 
			
			if (xOffs == $divScrollContent.position().left)
				animTime = 0;
			
			$divScrollContent
				.stop(true,true)
				.clearQueue()
				.animate({left: xOffs+"px"}, animTime, "easeInOutQuart");
			
			if (animTime-200<0)
				pic.addClass("currentPhoto").find("img:first").fadeTo(fadeTime, 1);
			else
				pic.addClass("currentPhoto").find("img:first").delay(animTime-200).fadeTo(fadeTime, 1);
			
			if (!settings.useInHome)
				pic.addClass("zoomCursor");
			
			//set label - caption
			$divNumbering.html( (currentPic+1) + " | " + picLength );
			
			if (!settings.useInHome)
				$divCaption.html( pic.find("img:first").attr("alt") );
			
			//action
			if (settings.useInHome)
			{
				if (pic.attr("link")!="") { pic.css("cursor", "pointer"); };
			} else {
				
			}
		};
		function _bindControlEvents()
		{
			$divBtnLeft.hover(
					function(e) { $(e.currentTarget).addClass("btnLeftHover"); },
					function(e) { $(e.currentTarget).removeClass("btnLeftHover"); }
				).click( _animateScrollerLeft );
			
			$divBtnRight.hover(
					function(e) { $(e.currentTarget).addClass("btnRightHover"); },
					function(e) { $(e.currentTarget).removeClass("btnRightHover"); }
				).click( _animateScrollerRight );
			
			if (settings.btnClose)
			{
				$divBtnClose.hover(
						function(e) { $(e.currentTarget).addClass("btnCloseHover"); },
						function(e) { $(e.currentTarget).removeClass("btnCloseHover"); }
					).click(
						settings.closeCallback
					);
			}
			
			if (!settings.useInHome)
			{
				//bind pic click events
				$(".img", $divScrollContent).click( function(e){
					if (!$(e.currentTarget).hasClass("currentPhoto")) return;
					
					var img = $(e.currentTarget).find("img:first").attr("src").replace('.scaled', '');
					$.avaxPanner(img);
				});
			}
			
		};
		function _animateScrollerLeft()
		{			
			if ( $divScrollContent.is(":animated") ) return;
			
			if ( currentPic-1<0 ) return;

			currentPic--;
			_showPicture();
		};
		function _animateScrollerRight()
		{			
			if ( $divScrollContent.is(":animated") ) return;
			if ( currentPic+1>=picLength ) return;

			currentPic++;			
			_showPicture();
		};
		function _gotoToLink(e)
		{
			var o = $(e.currentTarget);
			if (o.attr("link")=="" || !o.hasClass("currentPhoto") ) return;
			
			location.href = o.attr("link");
		};
		
		this._moveTo = function(idx, animate)
		{ 
			currentPic = idx;			
			_showPicture(animate);
		};
		
		function _init(setts) 
		{
			settings = $.extend( $.fn.avaxScalledImagePanner.defaults, setts );
					
					
			//console.log( settings );
			picLength = 0;
			
			//create proper divs
			$divScroller = $('<div />').addClass("avxScroller");
			
			$divScrollContent = $('<div />').addClass("scrollContent");
			$divControlsContainer = $('<div />').addClass("avxScrollerControls");
			
			//set css
			$divScroller.css({height: settings.height, width: settings.width});
			$divControlsContainer.css({bottom: settings.controlsBottom });
			
			//put controls
			$divBtnClose 	= $('<div />').addClass("btnClose button");
			$divBtnLeft 	= $('<div />').addClass("btnLeft button");
			$divBtnRight 	= $('<div />').addClass("btnRight button");
			$divNumbering 	= $('<div />').addClass("lblNumbering");
			$divCaption 	= $('<div />').addClass("lblCaption");
			
			if (settings.btnClose)
				$divControlsContainer.append($divBtnClose);
				
			$divControlsContainer.append($divBtnLeft, $divNumbering, $divBtnRight, $divCaption );
			
			$divOrgImages = $('.imgs:first', $instance);
			$divOrgImages.hide();
			
			//get images
			var scrollerWidth = 0;
			$(".img", $instance).each(function(i,el)
			{
				var img = $(el);
				img.css({width: img.attr("w")+"px", height: settings.imageHeight})
					.find("img:first").fadeTo(0, settings.initPhotosOpacity);
				
				if (settings.useInHome && $(el).attr("link")!="")
					img.bind("click", _gotoToLink);
				
				scrollerWidth += parseInt( img.attr("w") );
				picLength++;
				
				$divScrollContent.append(img);
			});
			
			$divScrollContent.css({width: scrollerWidth+"px", height: settings.imageHeight});			
			
			//place objects
			$divScroller.append($divScrollContent, $divControlsContainer);
			$instance.append( $divScroller );
			
			currentPic = settings.initPicIdx;
			
			_bindControlEvents();
			_showPicture(false);
			
		}
		
		$instance = $inst;
		_init(setts);
		
		return this;
	};

	//--- Public Methods / Plugin-ize ---
	$.fn.avaxScalledImagePanner = function( method ) 
	{
		var $inst;
		
		if ( method=="moveTo" ) 
		{
			var d = $(this).data('avaxScalledImagePanner');
			d.api._moveTo(arguments[1], arguments[2]);
		} 
		else if ( typeof method === 'object' || ! method ) 
		{
			$inst = $(this);
			$avxApi = new methods( $inst, method );
			$(this).data('avaxScalledImagePanner', {instance: $(this), api: $avxApi } );
		}
	};

	$.fn.avaxScalledImagePanner.defaults = {
		"height":"400px",
		"width":"100%",
		"controlsBottom":"2px",
		"btnClose": false,
		"initPhotosOpacity": 0.2,
		"initPicIdx":0,
		"imageHeight":"400px",
		"useInHome":false,
		"animateScrollTime": 800,
		"fadePictureTime": 300,
		"closeCallback": function() {  }
		
	};

})(jQuery);
