/*

	StringBall ver2.1 for jQuery(gt Ver 1.3.2)
	Developped  by Coichiro Aso
	Added .ready-Handler for immediate start when the page opens (Fox NewMedia/huy)
	Copyright Codesign.verse 2009　http://codesign.verse.jp/
	Licensed under the MIT license:http://www.opensource.org/licenses/mit-license.php/

-------------------------------------------------------------------------------------------*/

/*note


------------------------------------------------------------------------------------------*/
(function($){

	$.fn.stringball=function(options){

		var defaults={
			camd:1000,
			radi:250,
			speed:20
		};

	var options = $.extend(defaults, options);

	var target=$(this);
	var elem=$("li" ,target);
	var scrz=1000; // 500
	var radi=options.radi;
	var camd=options.camd;
	var speed=options.speed;

	var offset=0;
	var accx=0;
	var accy=0;
	var roteang=0;
	var axang=0;
	var ac=0;
	var as=0;
	var rotec=0;
	var rotes=0;
	var looptimer=0;
	var itxpos = target.offset().left;
	var itw = target.width();
	var itypos=target.offset().top;
	var ith=target.height();

		function setini(){

			for(i=0;i<elem.length;i++){
			elem[i].anga=Math.PI*2/elem.length*Math.round(Math.random()*elem.length);
			elem[i].angb=Math.PI*2*Math.random();
			elem[i].fw=$(elem[i]).width();
			elem[i].fh=$(elem[i]).height();
			elem[i].xpos=radi*Math.cos(elem[i].angb)*Math.sin(elem[i].anga);
			elem[i].ypos=radi*Math.sin(elem[i].angb);
			elem[i].zpos=radi*Math.cos(elem[i].angb)*Math.cos(elem[i].anga);
			}
		}

		function setpos(){
			for(i=0;i<elem.length;i++){

				//
				ac=Math.cos(axang);
				as=Math.sin(axang);
				//
				rotec=Math.cos(roteang);
				rotes=Math.sin(roteang);
				//
				elem[i].xpos2=elem[i].xpos*(Math.pow(ac,2)+(1-Math.pow(ac,2))*rotec)+elem[i].ypos*(ac*as*(1-rotec))-elem[i].zpos*(as*rotes);
				elem[i].ypos2=elem[i].xpos*(ac*as*(1-rotec))+elem[i].ypos*(Math.pow(as,2)+(1-Math.pow(as,2))*rotec)+elem[i].zpos*(ac*rotes);
				elem[i].zpos2=elem[i].xpos*as*rotes-elem[i].ypos*ac*rotes+elem[i].zpos*rotec;
			/*	//
				elem[i].xpos3=elem[i].xpos2;
				elem[i].ypos3=elem[i].ypos2*Math.cos(camh)+elem[i].zpos2*Math.sin(camh);
				elem[i].zpos3=-elem[i].ypos2*Math.sin(camh)+elem[i].zpos2*Math.cos(camh);
			*/
				//
				elem[i].xpos=elem[i].xpos2;
				elem[i].ypos=elem[i].ypos2;
				elem[i].zpos=elem[i].zpos2;

				//
				elem[i].scale=scrz/(camd+elem[i].zpos2);
				//
				elem[i].rxpos=elem[i].xpos2*elem[i].scale+itw/2-elem[i].fw/2;
				elem[i].rypos=elem[i].ypos2*elem[i].scale+ith/2-elem[i].fh/2;
			}
			//
			for(i=0;i<elem.length;i++){
				elem[i].style.left=elem[i].rxpos+"px";
				elem[i].style.top=elem[i].rypos+"px";
				elem[i].style.fontSize=elem[i].scale*100+"%";
				//elem[i].style.opacity=elem[i].scale;  // tf: pixelig
			}
			//
			roteang=-(Math.max(Math.abs(accx),Math.abs(accy)))/100*speed;
			//
			return false;
		}

		//
		setini();
		setpos();

		target.hover(
		function(){
			clearInterval(looptimer); // comment for continuos rotation
			target.mousemove(function(e){
				accx = (e.clientX-itxpos-itw/2)/itw;
				accy = (e.clientY-itypos-ith/2)/ith;
				//
				axang=Math.PI/2+Math.atan2(accy,accx);
			});

			looptimer=setInterval(setpos,16);
			},

			function(){
			clearInterval(looptimer);
			}
		);

		target.ready(
		function(){
				//clearInterval(looptimer); // huy/tf: start immediately
				accx = 0.1;
				accy = 0.1;
				axang=Math.PI/2+Math.atan2(accy,accx);
				looptimer=setInterval(setpos,16);
			},
			function(){
			clearInterval(looptimer);
			}
		);

	}
})(jQuery);

