var smirkAnimatorStart;
var smirkAnimatorReload;

(function() {

	var smirkQueue = Array();
	var __frameDelay = 120;
	var animationRef = false;

	if (typeof(jQuery) == 'undefined') {
		var jq = document.createElement("script")
		jq.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js";
		document.documentElement.getElementsByTagName("HEAD")[0].appendChild(jq);
		var jqLoad = setInterval(function() {
			if (typeof(jQuery) != 'undefined') {
				jQuery.noConflict();
				clearInterval(jqLoad);
				smirkAnimatorLoad(jQuery);
			}
		}, 25);
	}
	else {
		smirkAnimatorLoad(jQuery);
	}
	
	function parseNvClasses(classValue) {
		var nvPairs = "{";
		var cls = classValue.split(/\s+/);
		jQuery(cls).each(function() {
			if (this.indexOf("-is-") > 0) {
				var a = this.split("-is-");
				if (nvPairs.length > 1) nvPairs += ",'"+a[0]+"' : '"+a[1]+"'";
				else nvPairs += "'"+a[0]+"' : '"+a[1]+"'";
			}
		});
		nvPairs += "}";
		return eval('('+nvPairs+')');
	}

  smirkAnimatorStart = function($) {
    
		$(".smirktacular").each(function() {
		
			var nv = parseNvClasses($(this).attr("class"));
			
			var sa = new smirkAnimation();
			sa.uuid = nv.uuid;
			sa.iid = (nv.iid) ? nv.iid : 0;
			sa.targetElement = this;
			sa.loop = nv.loop == 'true' ? true : false; // comes over as a string, not bool
			if (! sa.loop) { 
				var index = smirkQueue.length;
				sa.shouldAnimate = false;
				$(this)
					.bind("mouseover", function() {
						smirkQueue[index].shouldAnimate = true;
					})
					.bind("mouseout", function() {
						smirkQueue[index].shouldAnimate = false;
					});
			}
			$.getJSON("http://robo.to/smirks/jsonp?u="+sa.uuid+"&i="+sa.iid+"&jsoncallback=?", function(json) {
				
				if (json) var j = json.smirk;
				else return;
				
				if (j.iid) {
		
					imgBase = j.uri.split("smirk")[1];
					imgBase = "smirk" + imgBase.substring(0, imgBase.length-4);

					sa.imageBase = imgBase					
					sa.isS3 = j.is_s3;
								
					for (var i=0; i<sa.smirkFrames; i++) {
						
						imgStub = new Image();
						if (sa.isS3) imgStub.src = "http://s3.amazonaws.com/smirk/jpg/" +sa.imageBase+""+(i+1)+".jpg";					
						else imgStub.src = "http://robo.to/vids/" +sa.uuid[0]+sa.uuid[1]+"/"+ sa.uuid + "/" +sa.imageBase+""+(i+1)+".jpg";	
						imgStub.frameIndex = i;
						$(imgStub).load(function() {
						  						  
						  sa.imageObjects.splice(this.frameIndex,1,this);
						    
						  // check for first image
						  if (sa.imageObjects.length == 1) {
						  
						    if (sa.targetElement.nodeName.toLowerCase() == "img") {
      						$(sa.targetElement).attr("src", this.src);
      					}
      					else {
      						$(sa.targetElement).css({
      							background: "url("+this.src+") top left repeat", 
      							backgroundSize: "100%"
      						})
      					}
						  
						  }
						
						});
												
					}
					
					smirkQueue.push(sa);
				}
			
			});
			
		});
		
	}
	
  smirkAnimatorReload = function(smirk, uuid, target, loop) {
	
	  if (animationRef) clearInterval(animationRef);
	  smirkQueue = Array();
		if (typeof(smirkFrameDelay) != 'undefined') __frameDelay = smirkFrameDelay;
		
		var sa = new smirkAnimation();
		sa.uuid = uuid;
		sa.iid = 0;
		sa.targetElement = $(target).get(0);
		sa.loop = loop;
		if (! sa.loop) { 
			var index = smirkQueue.length;
			sa.shouldAnimate = false;
			$(target)
				.bind("mouseover", function() {
					smirkQueue[index].shouldAnimate = true;
				})
				.bind("mouseout", function() {
					smirkQueue[index].shouldAnimate = false;
				});
		}
					
		imgBase = smirk.uri.split("smirk")[1];
		imgBase = "smirk" + imgBase.substring(0, imgBase.length-4);

		sa.imageBase = imgBase					
		sa.isS3 = smirk.is_s3;
						
		for (var i=0; i<sa.smirkFrames; i++) {
			
			imgStub = new Image();
			if (sa.isS3) imgStub.src = "http://s3.amazonaws.com/smirk/jpg/" +sa.imageBase+""+(i+1)+".jpg";					
			else imgStub.src = "http://robo.to/vids/"+sa.uuid[0]+sa.uuid[1]+"/" + sa.uuid + "/" +sa.imageBase+""+(i+1)+".jpg";	
			
			imgStub.frameIndex = i;
						
		  $(imgStub).load(function() {
						  						  
				sa.imageObjects.splice(this.frameIndex,1,this);

			  // check for first image
			  if (sa.imageObjects.length == 1) {
			  
			    if (sa.targetElement.nodeName.toLowerCase() == "img") {
						$(sa.targetElement).attr("src", this.src);
					}
					else {
						$(sa.targetElement).css({
							background: "url("+this.src+") top left repeat", 
							backgroundSize: "100%"
						})
					}
			  
			  }
			
			});
									
		}
		
		smirkQueue.push(sa);
		
		
		// re-create the animator loop
		animationRef = setInterval(function() {
			for (var x = 0; x < smirkQueue.length; x++) {
			
				var sa = smirkQueue[x];
				if (sa.shouldAnimate) {
				
					if (sa.currentFrame > sa.imageObjects.length) {
					
						sa.currentFrame = sa.imageObjects.length - 1;
						sa.forwards = false;
						
					}
					
					else if (sa.currentFrame < 1) {
					
						sa.currentFrame = 2;
						sa.forwards = true;
						
					}
					
					if (typeof(sa.imageObjects[sa.currentFrame-1]) != 'undefined') {
						if (sa.targetElement.nodeName.toLowerCase() == "img") {
							$(sa.targetElement).attr("src", sa.imageObjects[sa.currentFrame-1].src);
						}
						else {
							$(sa.targetElement).css({
								background: "url("+sa.imageObjects[sa.currentFrame-1].src+") top left repeat"
							})
						}
					}
					if (sa.forwards) sa.currentFrame ++;
				  else sa.currentFrame --;
				}
			}
		
		}, __frameDelay);

		
	}
	
	function smirkAnimatorLoad($) {
	
		$(function() {
			if (typeof(smirkFrameDelay) != 'undefined') __frameDelay = smirkFrameDelay;
			
			// create the animator loop
			animationRef = setInterval(function() {
			
				for (var x = 0; x < smirkQueue.length; x++) {
				
					var sa = smirkQueue[x];
					if (sa.shouldAnimate) {
					
						if (sa.currentFrame > sa.imageObjects.length) {
						
							sa.currentFrame = sa.imageObjects.length - 1;
							sa.forwards = false;
							
						}
						
						else if (sa.currentFrame < 1) {
						
							sa.currentFrame = 2;
							sa.forwards = true;
							
						}
												
						if (typeof(sa.imageObjects[sa.currentFrame-1]) != 'undefined') {
							if (sa.targetElement.nodeName.toLowerCase() == "img") {
								$(sa.targetElement).attr("src", sa.imageObjects[sa.currentFrame-1].src);
							}
							else {
								$(sa.targetElement).css({
									background: "url("+sa.imageObjects[sa.currentFrame-1].src+") top left repeat"
								})
							}
						}
						if (sa.forwards) sa.currentFrame ++;
						else sa.currentFrame --;
					}
				}
			
			}, __frameDelay);
			
			smirkAnimatorStart($)
		});
	}
	
	function smirkAnimation() {
		this.imageObjects = Array();
		this.imageBase = "";
		this.smirkFrames = 25;
	  this.imageObjects = new Array(25); // total frames is 21 for now
		this.forwards = true;
		this.currentFrame = 1;
		this.isS3 = false;
		this.shouldAnimate = true;
		this.uuid = "";
		this.targetElement = "";
	}
	
})();


