﻿/*

ImageBall ver2.1 for jQuery(gt Ver 1.3.2) 
Developped  by Coichiro Aso
Copyright Codesign.verse 2009�??http://codesign.verse.jp/
Licensed under the MIT license:http://www.opensource.org/licenses/mit-license.php/

------------------------------------------------------------------------------------------*/
(function ($) {

  $.fn.imgball = function (options) {

    var defaults = {
      camd: 1200,
      radi: 400,
      speed: 40,
      framerate: 30
    };

    var options = $.extend(defaults, options);

    var target = $(this);
    var elem = $("li", target);
    var scrz = 500;
    var radi = options.radi;
    var camd = options.camd;
    var speed = options.speed;
    var frn = Math.floor(1000 / options.framerate);

    var xpos = 0;
    var ypos = 0;
    var zpos = 0;
    var scale = 0;

    var maxscale = scrz / (camd - radi);
    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();
    var lbc = 0;

    function setini() {
      var anga = 0;
      var angb = 0;
      for (i = 0; i < elem.length; i++) {
        anga = Math.acos((2 * (i + 1) - 1) / elem.length - 1);
        angb = Math.sqrt(elem.length * Math.PI) * anga;
        elem[i].fw = $(elem[i]).width();
        elem[i].fh = $(elem[i]).height();
        elem[i].iw = $("img", elem[i]).width();
        elem[i].ih = $("img", elem[i]).height();
        elem[i].xpos = radi * Math.cos(angb) * Math.sin(anga);
        elem[i].zpos = radi * Math.cos(anga);
        elem[i].ypos = radi * Math.sin(angb) * Math.sin(anga);
      }
    }

    function setpos() {

      //軸の�?位�?��?�??�?��??�?�
      ac = Math.cos(axang);
      as = Math.sin(axang);
      //�??転距�?��?�?
      rotec = Math.cos(roteang);
      rotes = Math.sin(roteang);

      for (i = 0; i < elem.length; i++) {


        //軸ま�?��??の�??転�?��?
        xpos = 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);
        ypos = 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);
        zpos = elem[i].xpos * as * rotes - elem[i].ypos * ac * rotes + elem[i].zpos * rotec;

        //�?��?�位置�?��?�
        elem[i].xpos = xpos;
        elem[i].ypos = ypos;
        elem[i].zpos = zpos;

        //�?��?��?��?�簡�??�?�?
        scale = scrz / (camd - zpos);

        //�?��?��?��?��?�反�? 
        elem[i].style.left = xpos * scale + itw / 2 - elem[i].fw / 2 + "px";
        elem[i].style.top = ypos * scale + ith / 2 - elem[i].fh / 2 + "px";
        $("img", $(elem[i])).css("height", scale * elem[i].ih + "px").css("width", scale * elem[i].iw + "px");
        elem[i].style.opacity = scale / maxscale;
        elem[i].style.zIndex = Math.round(scale * 1000);
      }
      //�??転�?��??�?��??�?�?�??結�?�??な�?�?� �?�??�?��?�の�?�?��?�??�??
      roteang = (Math.max(Math.abs(accx), Math.abs(accy))) / 100 * speed;
      //�??�?��?��?��?��?��?��?��?��?��?��?�
      return false;
    }

    //�?��??設�?�?�?
    setini();
    setpos();

    target.hover(
		function () {
		  clearInterval(looptimer);
		  target.mousemove(function (e) {
		    accx = (e.pageX - itxpos - itw / 2) / itw;
		    accy = (e.pageY - itypos - ith / 2) / ith;
		    //任�?�の軸
		    axang = Math.PI / 2 + Math.atan2(accy, accx);
		  });
		  looptimer = setInterval(setpos, frn);
		},
		function () {
		  clearInterval(looptimer);
		});

    $("img", elem).click(function () {

      for (i = 0; i < elem.length; i++) {
        elem[i].style.zIndex = 1;
      }
    });

  }
})(jQuery);
