﻿/**
 * 
 * jquery.animateimage.js
 * 
 */


(function($){

	$.fn.animateimage = function(options) {

		var setting = $.extend({
			imgDir : './common/images/js_animateimage/',
			imgBaseSrc : 'cart_base.gif',
			imgWalkLeftSrc : 'cart_left.gif',
			imgWalkRightSrc : 'cart_right.gif',
			imgStaySrc : 'cart_stay.gif',
			imgWidth : 13,
			imgHeight : 13,
			imgClass : 'js_anime',
			maxNum : 1,
			maxStaytime : 5,
			startPos : 0
		}, options);
		
		AnimeTargetManager = function(){ //マネージャー
			this.pool = [];
		};
		
		AnimeTargetManager.prototype = {

			setAnimeImage : function(stage){
				var animeImage = new AnimeTarget(stage);
				this.pool.push(animeImage);
			},

			setPluralAnimeImages : function(num, stage){
				var i;
				for(i = 0; i < num; i += 1){
					this.setAnimeImage(stage);
				};
			}

		};

		var AnimeTarget = function(stage){ //本体
			this.srcBase = setting.imgDir + setting.imgBaseSrc;
			this.srcWalkLeft = setting.imgDir + setting.imgWalkLeftSrc;
			this.srcWalkRight = setting.imgDir + setting.imgWalkRightSrc;
			this.srcStay = setting.imgDir + setting.imgStaySrc;
			this.width = setting.imgWidth;
			this.height = setting.imgHeight;
			this.klass = setting.imgClass;
			this.elem = $('<span class="' + this.klass + '"><a href="#"><img src="' + this.srcBase + '" width="' + this.width + '" height="' + this.height + '" /></a></span>');
			this.stage = $(stage);
			this.preload(this.srcWalkLeft, this.srcWalkRight, this.srcStay);
			this.setup();
			this.setEvent();
		};

		AnimeTarget.prototype = {

			setup : function(){ //要素を配置
				var self = this;
				var initPos = Math.floor(Math.random() * (self.stage.attr('offsetWidth') - self.width - setting.startPos) + 1 + setting.startPos);
				self.elem.hide();
				self.stage
					.css({
						position : 'relative'
					})
					.append(self.elem);
				self.elem
					.css({
						position : 'absolute',
						top : - self.height,
						left : initPos
					})
					.fadeIn(1000, function(){
						self.setMoving();
					});
			},

			setMoving : function(){ //要素の動きを決定する
				var self = this;
				var movingCollection = [
					function(){ //横移動(歩行)
						var currentPos = parseInt(self.elem.css('left'), 10);
						var targetPos = Math.floor(Math.random() * (self.stage.attr('offsetWidth') - self.width - setting.startPos) + 1 + setting.startPos);
						var transferAmount = Math.abs(targetPos - currentPos);
						var transferTime = transferAmount * 15;
						self.elem
							.delay(Math.floor(Math.random() * setting.maxStaytime * 1000 + 1))
							.queue(function(){
								if(currentPos < targetPos){
									self.setImage(self.srcWalkRight);
								}else if(currentPos > targetPos){
									self.setImage(self.srcWalkLeft);
								}else{
									self.setImage(self.srcBase);
								};
								self.elem.dequeue();
							})
							.animate({
								left : targetPos
							}, transferTime, 'linear', function(){
								self.setImage(self.srcBase);
								self.setRepeat();
							});
					},
					function(){ //しゃがむ(ストップして画像入れ替え)
						self.elem
							.queue(function(){
								self.setImage(self.srcStay);
								self.elem.dequeue();
							})
							.delay(Math.floor(Math.random() * setting.maxStaytime * 1000 + 1))
							.queue(function(){
								self.setImage(self.srcBase);
								self.elem.dequeue();
								self.setRepeat();
							});
					}
				];
				var nRandom = Math.floor(Math.random() * movingCollection.length);
				movingCollection[nRandom]();
			},

			setImage : function(nextImgSrc){
				this.elem.find('img').attr('src', nextImgSrc);
			},

			setRepeat : function(){ //繰り返し
				this.setMoving();
			},

			setEvent : function(){ //要素を削除
				var self = this;
				self.elem.find('a').click(function(){
					self.elem.remove();
					return false;
				});
			},
			
			preload : function(){
				var i;
				for(i = 0; i < arguments.length; i += 1){
					$('<img />').attr('src', arguments[i]);
				};
			}

		};

		var manager = new AnimeTargetManager();

		return this.each(function(){
			var mn = Math.floor(Math.random() * setting.maxNum + 1);
			manager.setPluralAnimeImages(mn, this);
		});

	};

})(jQuery);
