;(function($) {

    $.fn.extend({
        sirscrolly: function(options,arg,arg2) {
			
			
            if (options && typeof(options) == 'object') {
                options = $.extend( {}, $.sirscrolly_defaults, options );
            }
			
			
            // this creates a plugin for each element in
            // the selector or runs the function once per
            // selector.  To have it do so for just the
            // first element (once), return false after
            // creating the plugin to stop the each iteration 
            this.each(function() {
			  
			  
			  
			  			  
				var obj = $(this);  
				var objData = obj.data("data")
				var refs = obj.data("refs")
				
				if (objData == null){
					// Create data container.
					obj.data( "data" , new Object() );	
					objData =obj.data("data")
				}				
				if (refs == null){
					// Create data container.
					obj.data( "refs" , new Object() );	
					refs = obj.data("refs")
					refs.eleObj = this;
				}		
				
				// Call a public method
				if (options && typeof(options) == 'string') {
					// Method call.
					this[options](arg,arg2);					
					return ;
				}
				
				
				
				
				
				
				
				
				
				/* SETUP PROPERTIES
				***************************************/				
				// Sync options to data object property
				for (var str_prop in options){					
					objData[str_prop] = options[str_prop]					
				}
				objData.randomId = Math.random();
				if (objData.backButtonOnImagePath == null || objData.nextButtonOnImagePath == null){
					objData.rollOverNextBackButtons = false;
				} else {
					objData.rollOverNextBackButtons = true;
				}
				if (objData.backNextBtnOnAlpha == null){
					objData.backNextBtnOnAlpha = 1;
				}
				if (objData.backNextBtnOffAlpha == null){
					objData.backNextBtnOffAlpha = 1;
				}
				objData.visibleScrollWidth = 0;  
				objData.totalItemsWidth = 0;
				objData.itemsVisibleAtOnce = 0;
				objData.scrollContainerMaxX = 0;
				objData.scrollContainerMinX = 0;
				objData.scrollPos = 0;
				objData.scrollPosMax = 0;
				objData.totalItems = 0;
				
				
				
				

				/* PUBLIC METHODS
				***************************************/
				this.goNext = function(){
					//----------------------------------
					var obj = $(this);  
					var objData =obj.data("data")
					var refs = obj.data("refs")
					var eventContainer = refs.eleObj
					//----------------------------------							
					eventContainer.setScrollPos(objData.scrollPos+1);
				}
				this.goNextPage = function(){
					//----------------------------------
					var obj = $(this);  
					var objData =obj.data("data")
					var refs = obj.data("refs")
					var eventContainer = refs.eleObj
					//----------------------------------
					var int_new_scrollpos =objData.scrollPos + objData.itemsVisibleAtOnce
					if (int_new_scrollpos >= objData.scrollPosMax + objData.itemsVisibleAtOnce){
						int_new_scrollpos =0;
					} else if (int_new_scrollpos > objData.scrollPosMax){
						int_new_scrollpos = objData.scrollPosMax
					}
					eventContainer.setScrollPos( int_new_scrollpos);						
				}
				this.goBack = function(){
					//----------------------------------
					var obj = $(this);  
					var objData =obj.data("data")
					var refs = obj.data("refs")
					var eventContainer = refs.eleObj
					//----------------------------------						
					eventContainer.setScrollPos(objData.scrollPos-1);	
				}
				this.goBackPage = function(){
					//----------------------------------
					var obj = $(this);  
					var objData =obj.data("data")
					var refs = obj.data("refs")
					var eventContainer = refs.eleObj
					//----------------------------------						
					var int_new_scrollpos = objData.scrollPos - objData.itemsVisibleAtOnce
					if ( int_new_scrollpos <= 0 - objData.itemsVisibleAtOnce ){
						int_new_scrollpos = objData.scrollPosMax;
					} else if (int_new_scrollpos < 0){
						int_new_scrollpos = 0
					}
					eventContainer.setScrollPos(int_new_scrollpos);		
				}
				this.setScrollPos = function(int_newscrollpos, bln_jump){			
					
					//----------------------------------
					var obj = $(this);  
					var objData =obj.data("data")
					var refs = obj.data("refs")
					var eventContainer = refs.eleObj
					//----------------------------------					
					
					objData.scrollPos = int_newscrollpos;
					if (objData.scrollPos == objData.scrollPosMax+1){
						objData.scrollPos = 0;	
					} else if (objData.scrollPos == -1){
						objData.scrollPos = objData.scrollPosMax;							
					} else if (objData.scrollPos > objData.scrollPosMax){
						objData.scrollPos = objData.scrollPosMax
					} else if (objData.scrollPos < 0){
						objData.scrollPos = 0;
					} 
										
					var int_target_x = objData.scrollContainerMaxX-objData.scrollPos * (objData.itemWidth + objData.interItemPadding);
					if (int_target_x < objData.scrollContainerMinX){
						int_target_x = objData.scrollContainerMinX
					} else if (int_target_x > objData.scrollContainerMaxX){
						int_target_x = objData.scrollContainerMaxX;
					}
					
					var int_time_milliseconds;
					if (bln_jump){
						int_time_milliseconds = 0
					} else {
						int_time_milliseconds = 600
					}
					
					//refs.scrollItemContainer.css("left", int_target_x);
					if(refs.scrollItemContainer!=null)
					{
						refs.scrollItemContainer.animate( { left: int_target_x}, int_time_milliseconds , "easeInOutSine" ,function(){});
					}
				}
				this.showButtonsOnHover = function(){		
					//----------------------------------
					var obj = $(this);  
					var objData =obj.data("data")
					var refs = obj.data("refs")
					var eventContainer = refs.eleObj
					//----------------------------------	
					clearTimeout(objData.buttonRolloutTimoutID);
					
					var int_current_opacity = Number(refs.backBtnObj.css("opacity"));
					var int_target_opacity = 1
					var int_time = Math.abs(int_target_opacity - int_current_opacity) * 500
					
					refs.backBtnObj.fadeTo(int_time, int_target_opacity);
					refs.nextBtnObj.fadeTo(int_time, int_target_opacity);						
					
				}
				this.hideButtonsOnRollOut = function(){			
					//----------------------------------
					var obj = $(this);  
					var objData =obj.data("data")
					var refs = obj.data("refs")
					var eventContainer = refs.eleObj
					//----------------------------------					
					
					objData.buttonRolloutTimoutID = setTimeout(function(){
																		
						//----------------------------------
						//var obj = $(this);  
						//var objData =obj.data("data")
						//var refs = obj.data("refs")
						//var eventContainer = refs.eleObj
						//----------------------------------	
						
						var int_current_opacity = Number(refs.backBtnObj.css("opacity"));
						var int_target_opacity = 0
						var int_time = Math.abs(int_target_opacity - int_current_opacity) * 500
						
						refs.backBtnObj.fadeTo(int_time, int_target_opacity);
						refs.nextBtnObj.fadeTo(int_time, int_target_opacity);																				
						},
						200);
				
				}
				
				
				
				
				
				
				
				/* BUILD PLUGIN
				***************************************/
				if (objData.forceTotalItemsVisible != null){
					objData.width = (objData.forceTotalItemsVisible * (objData.itemWidth + objData.interItemPadding) ) - objData.interItemPadding;
					
					if (!objData.hoverButtonsOverContent){
							objData.width = objData.width + objData.backNextBtnWidth*2;
					}
					
				}				
				
				objData.totalItems = obj.find('li').size();
				objData.totalItemsWidth = objData.totalItems * (objData.itemWidth + objData.interItemPadding) - objData.interItemPadding;  // Last item doesn't need padding
				 
				// DO WE NEED THIS PLUGIN? 
				if (objData.totalItemsWidth <= objData.width ) {
					return;
				}
				
				// ADD BUTTONS
				obj.append(  
				'<div class="sirscrolly-back" ><img src="'+ objData.backButtonOffImagePath+'" width="'+ objData.backNextBtnWidth+'" height="'+ objData.height+'" alt="<" ></div>'  
				);  
				
				obj.append(  
				'<div class="sirscrolly-next" ><img src="'+ objData.nextButtonOffImagePath+'" width="'+ objData.backNextBtnWidth+'" height="'+ objData.height+'" alt=">" ></div>'  
				);
				
				refs.backBtnObj = obj.find('.sirscrolly-back');
				refs.nextBtnObj = obj.find('.sirscrolly-next');				
				refs.scrollItemContainer = obj.find('.sirscrolly-items')
				
				if (objData.hoverButtonsOverContent){
					
					objData.visibleScrollWidth = objData.width;
					objData.scrollContainerMaxX = 0;
					
				} else {
					
					objData.visibleScrollWidth = objData.width - objData.backNextBtnWidth - objData.backNextBtnWidth;
					objData.scrollContainerMaxX = objData.backNextBtnWidth;
					
				}
				objData.itemsVisibleAtOnce = Math.floor((objData.visibleScrollWidth + objData.interItemPadding) / (objData.itemWidth + objData.interItemPadding));
				if(objData.shrinkWidthToFitToWholeItems){
					
					objData.visibleScrollWidth = objData.itemsVisibleAtOnce * (objData.itemWidth + objData.interItemPadding) - objData.interItemPadding
					
					if (objData.hoverButtonsOverContent){					
						objData.width = objData.visibleScrollWidth;						
					} else {
						objData.width = objData.visibleScrollWidth + objData.backNextBtnWidth*2
					}
				}
				
				objData.scrollContainerMinX = objData.scrollContainerMaxX + objData.visibleScrollWidth - objData.totalItemsWidth;
				objData.scrollPosMax = (objData.itemsVisibleAtOnce - objData.totalItems) * -1
				
				
				
				
				
				
				
				
				
				
				/* BUILD 
				***************************************/	
				
				if (objData.hoverButtonsOverContent){
					if (objData.showButtonsOnHoverOnly){
						refs.nextBtnObj.fadeTo(0,0);
						refs.backBtnObj.fadeTo(0,0);
					} else {
						refs.nextBtnObj.fadeTo(0,1);
						refs.backBtnObj.fadeTo(0,1);						
					}
				} else {
					refs.scrollItemContainer.css("left", objData.backNextBtnWidth);			
				}
				refs.scrollItemContainer.css("position", "absolute");
				refs.scrollItemContainer.css("width", objData.totalItemsWidth +  objData.interItemPadding ); // Allow room for one more padding		
				
				refs.nextBtnObj.css("left",  objData.width -  objData.backNextBtnWidth); 
				
				// Set the width and height of the 
				obj.css("width", objData.width ); 
				obj.css("height", objData.height); 
				
				obj.css("position", "relative"); 
				obj.css("overflow", "hidden");				
				
				refs.backBtnObj.find('img').fadeTo(0,objData.backNextBtnOffAlpha);
				refs.nextBtnObj.find('img').fadeTo(0,objData.backNextBtnOffAlpha);
				
				if (objData.backNextBtnBgCol != null){
					refs.backBtnObj.css("background-color"	, objData.backNextBtnBgCol);
					refs.nextBtnObj.css("background-color"	, objData.backNextBtnBgCol);					
				}
				
				
				//interItemPadding
				
				
				
				
				
				
				
				
				
				/* BUTTON EVENTS
				***************************************/							
				refs.nextBtnObj.click(function(event) { 
					//----------------------------------
					var obj = $(this).parent();  
					var objData =obj.data("data");
					var refs = obj.data("refs");
					var eventContainer = refs.eleObj;
					//----------------------------------	
					if (objData.scrollPageMode){
						eventContainer.goNextPage();
					} else {
						eventContainer.goNext();
					}
				}); 
				
				refs.backBtnObj.click(function(event) {  
					//----------------------------------
					var obj = $(this).parent();  
					var objData =obj.data("data");
					var refs = obj.data("refs");
					var eventContainer = refs.eleObj;
					//----------------------------------	
					if (objData.scrollPageMode){
						eventContainer.goBackPage();
					} else {
						eventContainer.goBack();
					}				
				}); 				
				
				if (objData.hoverButtonsOverContent && objData.showButtonsOnHoverOnly){
					obj.mouseover(function(event) {  
						//----------------------------------
						var obj = $(this);
						var objData =obj.data("data");
						var refs = obj.data("refs");
						var eventContainer = refs.eleObj;
						//----------------------------------				
						eventContainer.showButtonsOnHover();	
					}); 	
					
					obj.mouseout(function(event) {  
						//----------------------------------
						var obj = $(this);
						var objData =obj.data("data");
						var refs = obj.data("refs");
						var eventContainer = refs.eleObj;
						//----------------------------------				
						eventContainer.hideButtonsOnRollOut();	
					}); 				
				}
				
				/* Swap images on rollover
				**********************************/
				
				if (objData.rollOverNextBackButtons){
				
					refs.backBtnObj.mouseover(function(event) {  
						//----------------------------------
						var obj = $(this).parent();
						var objData =obj.data("data");
						var refs = obj.data("refs");
						// var eventContainer = refs.eleObj;
						//----------------------------------				
						var imageRef = refs.backBtnObj.find('img');
						imageRef.attr("src",objData.backButtonOnImagePath)
					}); 						
				
					refs.backBtnObj.mouseout(function(event) {  
						//----------------------------------
						var obj = $(this).parent();
						var objData =obj.data("data");
						var refs = obj.data("refs");
						// var eventContainer = refs.eleObj;
						//----------------------------------				
						var imageRef = refs.backBtnObj.find('img');
						imageRef.attr("src",objData.backButtonOffImagePath)
					}); 					
					
					refs.nextBtnObj.mouseover(function(event) {  
						//----------------------------------
						var obj = $(this).parent();
						var objData =obj.data("data");
						var refs = obj.data("refs");
						// var eventContainer = refs.eleObj;
						//----------------------------------				
						var imageRef = refs.nextBtnObj.find('img');
						imageRef.attr("src",objData.nextButtonOnImagePath)
					}); 						
				
					refs.nextBtnObj.mouseout(function(event) {  
						//----------------------------------
						var obj = $(this).parent();
						var objData =obj.data("data");
						var refs = obj.data("refs");
						// var eventContainer = refs.eleObj;
						//----------------------------------				
						var imageRef = refs.nextBtnObj.find('img');
						imageRef.attr("src",objData.nextButtonOffImagePath)
					}); 						
					
				}
				
				if (objData.backNextBtnOnAlpha != objData.backNextBtnOffAlpha){
			
					refs.backBtnObj.mouseover(function(event) {  
						//----------------------------------
						var obj = $(this).parent();
						var objData =obj.data("data");
						var refs = obj.data("refs");
						// var eventContainer = refs.eleObj;
						//----------------------------------	
						var imageRef = refs.backBtnObj.find('img');
						imageRef.fadeTo(0,objData.backNextBtnOnAlpha);
					}); 						
				
					refs.backBtnObj.mouseout(function(event) {  
						//----------------------------------
						var obj = $(this).parent();
						var objData =obj.data("data");
						var refs = obj.data("refs");
						// var eventContainer = refs.eleObj;
						//----------------------------------	
						var imageRef = refs.backBtnObj.find('img');
						imageRef.fadeTo(0,objData.backNextBtnOffAlpha);
					}); 					
					
					refs.nextBtnObj.mouseover(function(event) {  
						//----------------------------------
						var obj = $(this).parent();
						var objData =obj.data("data");
						var refs = obj.data("refs");
						// var eventContainer = refs.eleObj;
						//----------------------------------		
						var imageRef = refs.nextBtnObj.find('img');
						imageRef.fadeTo(0,objData.backNextBtnOnAlpha);
					}); 						
				
					refs.nextBtnObj.mouseout(function(event) {  
						//----------------------------------
						var obj = $(this).parent();
						var objData =obj.data("data");
						var refs = obj.data("refs");
						// var eventContainer = refs.eleObj;
						//----------------------------------	
						var imageRef = refs.nextBtnObj.find('img');
						imageRef.fadeTo(0,objData.backNextBtnOffAlpha);
					}); 						
					
				}		






				/* INITIALIZE
				***************************************/
				this.setScrollPos(objData.startingScrollPos,true);




				
            });
			
            return;
			
        }
    });



	


    $.sirscrolly_defaults = {  
		height:130,
		width:350,      
		itemWidth: 130,
		interItemPadding: 10,
		hoverButtonsOverContent:false,
		showButtonsOnHoverOnly: true,
		scrollPageMode: false,
		backButtonOffImagePath:"img/back-btn.jpg",
		backButtonOnImagePath:null,
		nextButtonOffImagePath:"img/next-btn.jpg",
		nextButtonOnImagePath:null,   
		backNextBtnWidth:20,
		backNextBtnOnAlpha:null,
		backNextBtnOffAlpha:null,
		backNextBtnBgCol:null,
		startingScrollPos:0,
		shrinkWidthToFitToWholeItems:false,
		forceTotalItemsVisible:null
	};  

})(jQuery);




