
function randomNum(iMin, iMax){
	return Math.round(Math.random()*(iMax - iMin) + iMin);
}

Array.prototype.shuffle = function() {
	var len = this.length;
	for (var i=0; i < len; i++) {
		var rand = Math.floor(Math.random()*len);
		var temp = this[i];
		this[i] = this[rand];
		this[rand] = temp;
	}
}

$(document).ready(function(){
	Fun.init({
		id: '#fun'
	})
})

Fun = {
	
	idShow: null,
	
	init: function(params){
		
		this._container = $(params.id);
		this.blocks = new Array();
		
		this._container.find('.manager').each(function(){
			Fun.blocks.push(new Block(this));
		})
		
		this.blocks.shuffle();
		
		this._position = this._container.find('.position');
		
		this.idShow = setInterval(function(){
			var show = true;
			for (var i=0; i < Fun.blocks.length; i++) {
				if(Fun.blocks[i].overed)
					show = false;
			};
			if(show){
				Fun.blocks[randomNum(0, Fun.opened-1)].preview();
			}
		}, 10000);

		this.closeAll();
		this.initControl();
		
	},
	
	change: function(prc){
		prc = Math.round(prc*100)/100;
		this._position.css({ opacity: prc });
		this.closeAll();
		for (var i=0; i < Math.ceil(this.blocks.length*prc); i++) {
			this.blocks[i].open();
			this.opened = Math.ceil(this.blocks.length*prc);
		};
	},
	
	initControl: function(){
		var oThis = this;
		this._control = (new Ellipse()).init({
			oPtr: this._container.find('.control'),
			r1: 330,
			r2: 310,
			callback: function(prc){
				oThis.change(prc);
			}
		});
	},
	
	show: function(oParams){
		var prc = Math.round(oParams.prc*100)/100;
		this.closeAll();
		for (var i=0; i < Math.ceil(this.blocks.length*prc); i++) {
			this.blocks[i].openAni();
			this.opened = Math.ceil(this.blocks.length*prc);
		};
		this._position.animate({ opacity: prc }, 500);
	},
	
	hideAll: function(){
		for (var i=0; i < Fun.blocks.length; i++) {
			if(Fun.blocks[i].overed)
				Fun.blocks[i].hide();
		}
	},

	closeAll: function(){
		for (var i=0; i < Fun.blocks.length; i++) {
			Fun.blocks[i].close();
		}
	}
	
}



function Block(obj){
	this._obj = $(obj);
	this.init();
}

Block.prototype.init = function() {
	
	this._text = this._obj.find('.text');
	this._img = this._obj.find('img');
	
	this.idAni = false;
	
	this.attachEvents();
	
};

Block.prototype.attachEvents = function() {
	var _my = this;
	this._img.mouseover(function(){
		if(_my.idAni){
			clearTimeout(_my.idAni);
		} else {
			Fun.hideAll();
			_my.show();
		}
	});

	this._img.mouseout(function(){
		clearTimeout(_my.idAni);
		_my.hide();
	});

	this._text.mouseover(function(){
		clearTimeout(_my.idAni);
	});

	this._text.mouseout(function(){
		_my.hide();
	});


};

Block.prototype.preview = function() {
	var _my = this;
	this.show();
	this.idAni = setTimeout(function(){
		_my.hide();
	}, 4000);
};

Block.prototype.show = function() {
	this.overed = true;
	this._text.css({ opacity: 0 }).show().animate({ opacity: 1 }, 300);
};

Block.prototype.hide = function() {
	var _my = this;
	this.idAni = setTimeout(function(){
		_my._text.animate({ opacity: 0 }, 300, function(){
			$(this).hide();
			_my.idAni = false;
			_my.overed = false;
		});
	}, 100);
};


Block.prototype.close = function() {
	this._obj.hide();
};

Block.prototype.open = function() {
	this._obj.show();
};

Block.prototype.openAni = function() {
	this._obj.css({ opacity: 0 }).show().animate({ opacity: 1 }, 500, function(){
		$(this).css('overflow', '').css('filter', '');
	});
};



function Ellipse(){}

Ellipse.prototype = {
	bIsMove: false,
	bApplyBack: false,
	
	init: function(hParams){
		var oThis = this;
		
		this.oPtr = hParams.oPtr;
		this.r1 = hParams.r1;
		this.r2 = hParams.r2;
		this.fCall = hParams.callback;
		
		this.fun = Fun._container.find('.wrapper');
		
		_ofs = this.fun.offset();
		this.oCoords = this.oPtr.offset();
		this.oCoords = { left: this.oCoords.left-_ofs.left, top: this.oCoords.top-_ofs.top };
		this.oCoordsCenter = { left: oThis.oCoords.left - oThis.oPtr.width()/2, top: oThis.oCoords.top - oThis.oPtr.height()/2 }
		this.attachEvents();
		this.setPositionByAngle(-56);
		this.t = 0;
		this.k = false;
		
		window.onload = function(){
			oThis.iAni = setInterval(function(){
				oThis.t += 0.05;
				var k = Math.pow(0.8,oThis.t);
				if(k < 0.05){
					k = 0.05;
					if(!oThis.k){
						oThis.k = true;
						Fun.show(oThis.getPercentByAngle(-56*(Math.sin(1-oThis.t)*k)));
					}
				}
				var f = -56*(Math.sin(1-oThis.t)*k);
				oThis.setPositionByAngle(f);
			}, 20)
		}

		return this;
	},
	
	attachEvents: function(){
		var oThis = this;
		this.oPtr.
			mousedown(function(){
				oThis.prepareMove();
			});
			
		$(document).mouseup(function(){
			oThis.cancelMove();
		}).
		mousemove(function(oEvt){
			oThis.onMove(oEvt);
		});
		
	},
	
	setPositionByAngle: function(iAngle){
		var oParams = this.getPercentByAngle(iAngle);;
		var prc = oParams.prc;
		var k = oParams.k;
		var t = this.oCoordsCenter.top;
		if(!$.browser.msie){
			t-=20;
		}
		
		this.oPtr.css({ left: this.oCoordsCenter.left + this.r1*Math.sin(this.toRad(k)), top: t + this.r2*Math.cos(this.toRad(k)) })
		this.alpha = k;
		
		if(this.bApplyBack)
			this.fCall.apply(Fun, [prc])
		
	},
	
	getPercentByAngle: function(iAngle){
		var k = iAngle + 56;
		if(iAngle > 180){
			k = k-360;
		}
		if(k<0)
			k = 0;
		if(k>136)
			k = 136;
		
		var prc = k/136
			
		k -= 56;
		if(iAngle > 180){
			k+= 360;
		}
		
		return { prc: prc, k: k };
	},

	onMove: function(oEvt){
		if(this.bIsMove){
			_ofs = this.fun.offset();
			var _x = oEvt.pageX-_ofs.left - this.oCoords.left;
			var _y = oEvt.pageY-_ofs.top - this.oCoords.top;
			var _angle = Math.atan(Math.tan(Math.atan(_x/_y))/(this.r1/this.r2))*180/3.14;
			if ((_x >= 0 && _y < 0) || (_x < 0 && _y < 0)) {
				_angle = 180+_angle;
			} else if (_x < 0 && _y >= 0) {
				_angle = 360+_angle;
			}
			this.setPositionByAngle(_angle);
		}
	},
	
	prepareMove: function(oEvt){
		this.bIsMove = true;
		this.bApplyBack = true;
		clearInterval(this.iAni);
	},

	cancelMove: function(){
		this.bIsMove = false;
	},
	
	toRad: function(iGrad){
		return iGrad*3.14/180;
	}
	
}

