/**
 * @author Bojmir Martinec
 * v. 1.1.1
 */
(function($) {
   $.fn.frameAnimation = function(settings) {
     var config = {
				'endWithFrameOne': false,
				'delay': 50,
				'repeatIn': 1,
				'repeatOut': 1,  
				'mouseOut': true,
				'hoverMode': true,
				'reverse':true,  // if reverse is set to false, you have to specify imageHeight as a parameter
				'startFrame':1 
				};
 
    if (settings){ 
		$.extend(config, settings);
		
	}
	
		settings = config;
		
		
     this.each(function() {
		var step =  parseInt($(this).outerHeight());
		
		var limit =  parseInt(backgroundPosition($(this)).split('px')[1]);
		var offset = limit;
		if (settings.imageHeight != undefined){
			var height = settings.imageHeight;
			if (settings.reverse == true){
				limit = step - height;
				offset = settings.startFrame*step - height;
			}
			else{
				limit = step - height;
				offset = (settings.startFrame-1)*step;
			}
			$(this).css("backgroundPosition", "0px " + offset + "px");
			
		}
		
		var delay = settings.delay;
		var numRepeatOver = settings.repeatIn;
		var numRepeatOut = settings.repeatOut;
		if (settings.numRepeatOut != undefined)
			numRepeatOut = settings.numRepeatOut;
		var repet = 1;
		var t;
		var movingUp = false;
		var movingDown = false;
		var hoverMode = settings.hoverMode;

/*///////////////////////// FUNCTIONS ///////////////////////////////////////*/	
	
		function backgroundPosition(obj){
			bgPos = obj.css('background-position');
			if(typeof(bgPos) === 'undefined') { bgPos = obj.css('background-position-x') + ' ' + obj.css('background-position-y') };
			return bgPos;
		}	
			
		var moveDown = function(obj){
		
			offset += step;
			obj.css("backgroundPosition", "0px " + offset + "px");
		}
		
		var moveUp = function(obj){
			
			offset -= step;
			obj.css("backgroundPosition", "0px " + offset + "px");
		}
		
		var animateDown = function(obj, times){
			if (movingUp == true) return;
			
			offset = parseInt(backgroundPosition(obj).split('px')[1]);
			t = null;
			if (offset  >= 0) {
				
					offset = limit;
				if (repet == times){
					
					if (times < numRepeatOut && settings.hoverMode == true && settings.mouseOut == true) repet = numRepeatOut;
					if (settings.mouseOut == false){
						repet = 1;
						obj.css("backgroundPosition", "0px " + offset + "px");
					}
					if (settings.endWithFrameOne == true && hoverMode == false){
						obj.css("backgroundPosition", "0px " + offset + "px");
						repet = 0;
					}
					movingDown = false;
					
					return;
				}
				repet++;
			
			}
			if (movingUp == false)
				moveDown(obj);
			
			t = setTimeout(function(){animateDown(obj, times)}, delay);
		}
		
		var animateUp = function(obj, times){
			
			if (repet > times) {   // if numRepeatOver and numRepeatOut are set differently...
				repet = times;
			}
			
			if (movingDown == true) return;
			
			offset = parseInt(backgroundPosition(obj).split('px')[1]);
			t = null;
			if (offset  <= limit ) {
			
					offset = 0;
					

				if (repet <= 1){
					if (settings.mouseOut == false){
						repet = 1;
						obj.css("backgroundPosition", "0px " + offset + "px");
					}
					movingUp = false;
					return;
				}
			
				repet--;
			}
			if (movingDown == false)
				moveUp(obj);
			t = setTimeout(function(){animateUp(obj, times)}, delay);
		}
	
/*///////////////////////// LOGIC ///////////////////////////////////////*/	
		
	  if (hoverMode == true && settings.mouseOut != false){	
		if (settings.reverse == true){
			$(this).hover(function(evt){
				movingUp = false;
				movingDown = true;
				animateDown($(evt.target), numRepeatOver);
				return false;
			}, 	function(evt){
				movingDown = false;
				movingUp = true;
				animateUp($(evt.target), numRepeatOut);
				return false;
				}
			);
		}
		else if (settings.reverse == false && settings.imageHeight != undefined) {
			$(this).hover(function(evt){
				movingDown = false;
				movingUp = true;
				animateUp($(evt.target), numRepeatOut);
				return false;
			}, 	function(evt){
				movingUp = false;
				movingDown = true;
				animateDown($(evt.target), numRepeatOver);
				return false;
				}
			);
		}
	  }
	  else if (hoverMode == true && settings.mouseOut == false){
		if (settings.reverse==true){
			$(this).hover(function(evt){
			if (movingDown == false){
				movingDown = true;
				animateDown($(evt.target), numRepeatOver);
			}
			return false;
			}, 	function(evt){
				return false;
			}
			);
		}
		else if (settings.reverse == false && settings.imageHeight != undefined) {
			$(this).hover(function(evt){
			if (movingUp == false){
				movingUp = true;
				animateUp($(evt.target), numRepeatOver);
			}
			return false;
			}, 	function(evt){
				return false;
			}
			);
		}
	  }  //elsif
	  else {
		if (settings.reverse == true)
		 animateDown($(this), numRepeatOver);
		else if (settings.reverse == false && settings.imageHeight != undefined)
		 animateUp($(this), numRepeatOver);
	  }
		

		});
 
     return this;
 
   };
 
 })(jQuery);


