/*
history:
07 02 2011 :  added options ,user can specify option without xml configura
15 02 2011 :  isZoomable bug fixed
17 03 2011 :  removed xml 
21 03 2011 :  removed cursors from touch version, removed zoom button from desktop version
*/



(function ($) {
    $.fn.extend({
        //pass the options variable to the function  
        rotate: function (options) {
            //Set the default values, use comma to separate the settings, example:  
            var defaults =
	 			{
	 			    xmlFile: "",
	 			    ldImageWidth: 400,
	 			    ldImageHeight: 400,
	 			    isZoomable: false,
	 			    panoramaUrl: "pano_360.jpg",
	 			    hdImageWidth: 1200,
	 			    hdImageHeight: 1200,
	 			    numberOfImages: 36,
	 			    basename: "sc_"
	 			}

            var options = $.extend(defaults, options);
            return this.each(function () {

                var elementID = $(this).attr('id');

                var zzid = "#" + elementID;

                var zoomButtonWidth = 40;

                var zoomButtonHeight = 40;

                var cursors = new Array("url(http://scancube.fr/Jrotator/zoomin.cur),-moz-zoom-in", "url(http://scancube.fr/Jrotator/zoomout.cur),-moz-zoom-out");


                var ldImageWidth = options.ldImageWidth;
                var ldImageHeight = options.ldImageHeight;
                var hdImageWidth = options.hdImageWidth;
                var hdImageHeight = options.hdImageHeight;
                var numberOfImages = options.numberOfImages;
                var panoramaUrl = options.panoramaUrl;
                var basename = options.basename;
                var isZoomable = options.isZoomable;

                var current = 0;
                var mouseDown = 0;

                var mouseDownX = 0;

                var mouseDownY = 0;
                var masc = 0;

                var isLoadingZoom = false;
                var TouchDown = false;

                var TouchDownX = 0;
                var TouchDownY = 0;

                var lastposX = 0;
                var lastposY = 0;

                var mzo = 0;
                if ($.browser.msie)
                    mzo = 1;

                $(zzid).html('<a id="zoomScancubeZ"></a> <img src="http://scancube.fr/Jrotator/preloader.gif" id="preloadscancubeZ" >  ');
                $('#preloadscancubeZ').css('margin-left', (ldImageWidth / 2 - 10) + 'px');
                $('#preloadscancubeZ').css('margin-top', (ldImageHeight / 2 - 10) + 'px');
                if (window.Touch) //testing only
                {
                    $('#zoomScancubeZ').css('position', 'absolute');
                    $('#zoomScancubeZ').css('display', 'block');
                    $('#zoomScancubeZ').css('width', zoomButtonWidth + 'px');
                    $('#zoomScancubeZ').css('height', zoomButtonHeight + 'px');
                    $('#zoomScancubeZ').css('backgroundImage', 'url(http://scancube.fr/Jrotator/zoom360.png)');   //TODO:change this please
                    $('#zoomScancubeZ').css('backgroundPosition', '0px 0px');
                    $('#zoomScancubeZ').css('left', (ldImageWidth - zoomButtonWidth - mzo) + 'px');
                    $('#zoomScancubeZ').css('top', (ldImageHeight - zoomButtonHeight - mzo) + 'px');
                    $('#zoomScancubeZ').css('border', '0px');
                    $('#zoomScancubeZ').css('margin', '0px 0px 0px 0px');
                }
                else {
                    $('#zoomScancubeZ').css('display', 'none');

                }



                $(zzid).css('display', 'block');
                $(zzid).css('position', 'relative');
                $(zzid).css('background-size', '100%');
                if ($(zzid).css("backgroundImage") != 'none') {
                $(zzid).unbind('mousemove', mousemoveHandler);
                $(zzid).unbind('mousedown', mousedownHandler);
                $(zzid).unbind('mouseup', mouseupHandler);
                $(zzid).unbind('click', clickHandler);

                }

                var mousemoveHandler = function (e) {
                    if (isLoadingZoom == true)
                        return;

                    var offset = $(zzid).offset();
                    var xx;
                    var yy;
                    xx = e.pageX - offset.left;
                    yy = e.pageY - offset.top;
                    // console.log(xx.toString());

                    if (mode == 0)    // spin mode
                    {
                        if (masc == 5) {
                            if (mouseDown != 5) {
                                var dx = xx; //- mouseDownX;
                                var percent = 2 * (dx / ldImageWidth);
                                var togo = Math.floor(percent * numberOfImages);
                                if (togo != 0) {  //current -= togo * ldImageHeight;
                                    current = -togo * ldImageHeight;
                                    if (current <= -numberOfImages * ldImageHeight)
                                        current += numberOfImages * ldImageHeight;
                                    if (current > 0)
                                        current -= numberOfImages * ldImageHeight;
                                    $('#blue').html(togo);
                                    $(zzid).css("backgroundPosition", "0px " + current + "px");
                                    $('#red').html($(zzid).css("backgroundPosition"));
                                    mouseDownX = xx;
                                }
                                masc = 0;
                            }
                        }
                        else {
                            masc++;
                        }
                    }
                    else 
                    {    // mode = zoom 
                        var xpercent = xx / ldImageWidth;
                        var ypercent = yy / ldImageHeight;
                        var xpos = -(xpercent * hdImageWidth) + ldImageWidth / 2;
                        var ypos = -(ypercent * hdImageHeight) + ldImageHeight / 2;

                        if (xpos > 0) xpos = 0;
                        if (ypos > 0) ypos = 0;
                        if (xpos + hdImageWidth < ldImageWidth)
                            xpos = ldImageWidth - hdImageWidth;
                        if (ypos + hdImageHeight < ldImageHeight)
                            ypos = ldImageHeight - hdImageHeight;
                        xpos = Math.floor(xpos);
                        ypos = Math.floor(ypos);
                        lastposX = xpos;
                        lastposY = ypos;
                        $(zzid).css("backgroundPosition", xpos + "px " + ypos + "px");
                    }
                }
                var dblclickHandler = function () 
                {
                  return;
                }

                var clickHandler = function () 
                {
                    if (isZoomable != true)
                         return;
                    if (isLoadingZoom == true)
                    {
                         return;
                    }
                    if (mode == 0)     // spinMode
                    {
                        var c = -current / ldImageHeight;
                        var st = "";
                        if (c < 10)
                            st = "000" + c;
                        else
                            if (c < 100)
                                st = "00" + c;
                            else
                                if (c < 1000)
                                    st = "0" + c;

                            img.onload = function ()
                            {
                            $("#preloadscancubeZ").hide();
                            var stz = "url(" + basename + st + ".jpg)";
                            //$('#blue').html("loading");
                            $(zzid).css("backgroundImage", stz);
                            $(zzid).css("background-size", "auto");
                            if (!window.Touch&&isZoomable)
                                $(zzid).css("cursor", cursors[1]);
                            //$(zzid).css("backgroundPosition","0px 0px");
                            $(zzid).css("backgroundPosition", (ldImageWidth - hdImageWidth) / 2 + "px " + (ldImageHeight - hdImageHeight) / 2 + "px");
                            isLoadingZoom = false;
                            this.disabled = false;
                        }
                        isLoadingZoom = true;
                        $('#preloadscancubeZ').show();
                        img.src = basename + st + ".jpg";
                        if (img.complete) //if it is cached for ie
                        {
                            img.onload();
                        }
                    }
                    else   // zoom mode 
                    {
                        var zimg = new Image();
                        zimg.onload = function () {
                            $('#preloadscancubeZ').hide();
                        }
                        $("#preloadscancubeZ").show();
                        zimg.src = panoramaUrl;
                        isLoadingZoom = false;
                        $(zzid).css("backgroundImage", "url(" + panoramaUrl + ")");
                        $(zzid).css("background-size", "100%");
                        if (!window.Touch&&isZoomable)
                            $(zzid).css("cursor", cursors[0]);
                        $(zzid).css("backgroundPosition", "0px " + current + "px");
                    }
                    mode = 1 - mode;
                    $('#zoomScancubeZ').css('backgroundPosition', (mode * zoomButtonWidth) + 'px ' + (mode * zoomButtonHeight) + 'px');
                }

                var touchEndHandler = function (e) {
                    TouchDown = false;
                }

                var touchStartHandler = function (e) {
                    if (isLoadingZoom == true)
                        return;
                    if (e.touches.length == 1) {  // only one finger 
                        e.preventDefault();
                        touchDownX = e.touches[0].pageX - this.offsetLeft;
                        touchDownY = e.touches[0].pageY - this.offsetTop;
                        mouseDownX = e.touches[0].pageX - this.offsetLeft;
                        mouseDownY = e.touches[0].pageY - this.offsetTop;
                        TouchDown = true;
                        if (touchDownX > (ldImageWidth - zoomButtonWidth-10))
                        {
                            if (touchDownY > (ldImageHeight - zoomButtonHeight-10))
                               clickHandler();
                        
                        }
                      }
                }


                var touchMoveHandler = function (e) {
                    if (isLoadingZoom == true)
                        return;
                    if (e.touches.length == 1) {
                        var xx = e.touches[0].pageX - this.offsetLeft;
                        var yy = e.touches[0].pageY - this.offsetTop; ;

                        if (mode == 0)    // spin mode
                        {
                            if (masc == 3) {
                                if (mouseDown != 3) {
                                    var dx = xx - mouseDownX;
                                    var percent = (dx / ldImageWidth);
                                    var togo = Math.floor(percent * numberOfImages);
                                    if (togo != 0) {
                                        current -= togo * ldImageHeight;
                                        if (current <= -numberOfImages * ldImageHeight)
                                            current += numberOfImages * ldImageHeight;
                                        if (current > 0)
                                            current -= numberOfImages * ldImageHeight;
                                        $('#blue').html(togo);
                                        $(zzid).css("backgroundPosition", "0px " + current + "px");
                                        $('#red').html($(zzid).css("backgroundPosition"));
                                        mouseDownX = xx;
                                    }
                                    masc = 0;
                                }
                            }
                            else {
                                masc++;
                            }

                        }

                        else  //mode == 1 zoom mode
                        {
                            var offset = $(zzid).offset();
                            var dx = -(touchDownX - (e.touches[0].pageX - offset.left))      /* hdImageWidth/ldImageWidth */;
                            var dy = -(touchDownY - (e.touches[0].pageY - offset.top))   /* * hdImageHeight/ldImageHeight */;

                            $('#z1').html('dx=' + dx);
                            $('#z2').html('dy=' + dy);

                            touchDownX = e.touches[0].pageX - offset.left;
                            touchDownY = e.touches[0].pageY - offset.top;

                            /*$('#z3').html('tDX='+touchDownX);
                            $('#z4').html('tDY='+touchDownY);	*/

                            var mx = $(zzid).css("backgroundPositionX");
                            var my = $(zzid).css("backgroundPositionY");

                            $('#z3').html($(zzid).css("backgroundPosition"));
                            //$('#z4').html('my='+my);

                            var rezki = $(zzid).css("backgroundPosition");
                            var sp = rezki.split(' ', 2);

                            mx = sp[0];
                            my = sp[1];

                            mx = mx.substr(0, mx.length - 2);
                            my = my.substr(0, my.length - 2);

                            var xpos = parseInt(mx) + dx;
                            var ypos = parseInt(my) + dy;
                            //console.log("mxx=="+mxx) ;

                            if (xpos > 0) xpos = 0;
                            if (ypos > 0) ypos = 0;
                            if (xpos + hdImageWidth < ldImageWidth)
                                xpos = ldImageHeight - hdImageWidth;
                            if (ypos + hdImageHeight < ldImageHeight)
                                ypos = ldImageHeight - hdImageHeight;

                            $(zzid).css("backgroundPosition", xpos + "px " + ypos + "px");
                            //console.log(xpos);
                        }

                    }
                }

                var mousedownHandler = function (e) {
                    // mouseDown = 1;
                    if (detectTouchdevice()) {
                        if (e.touches.length == 1) {
                            e.preventDefault();
                            mouseDownX = e.touches[0].pageX - this.offsetLeft;
                            mouseDownY = e.touches[0].pageY - this.offsetTop;
                            mouseDown = 1;
                            FirstTouch = true;
                        }
                        else {
                            //alert("two fingers");
                        }
                    }
                    else {
                        mouseDownX = e.pageX - this.offsetLeft;
                        mouseDownY = e.pageY - this.offsetTop;
                        mouseDown = 1;
                    }
                }

                var mouseupHandler = function () {
                    mouseDown = 0;
                }

                var mode = 0;    // 0 == spin   1==zoom
                var img = new Image();
                img.onload = function () {
                    $('#blue').html("finished loading");
                    $('#preloadscancubeZ').hide();
                }
                img.src = panoramaUrl;
                $(zzid).css("width", ldImageWidth.toString());
                $(zzid).css("height", ldImageHeight.toString());
                $(zzid).css("backgroundImage", "url(" + panoramaUrl + ")");
                //$(zzid).css("cursor", "w-resize");
                if (!window.Touch&&isZoomable)
                    $(zzid).css("cursor", cursors[0]);
                $(zzid).css("background-position", "0px 0px");
                $(zzid).css("background-repeat", "no-repeat");

                $(zzid).mousedown(function (e) {
                    mouseDown = 1;
                    mouseDownX = e.pageX - this.offsetLeft;
                    mouseDownY = e.pageY - this.offsetTop;
                })
                $(zzid).mouseup(function () {
                    mouseDown = 0;
                })
                if (detectTouchdevice()) {
                    //alert("window touch is true") ;
                    var uagent = navigator.userAgent.toLowerCase();
                    var element = document.getElementById(elementID);


                    element.ontouchstart = touchStartHandler;
                    element.ontouchmove = touchMoveHandler;
                    element.ontouchend = touchEndHandler;
                    var zoomID = "zoomScancubeZ";
                    // document.getElementById(zoomID).onclick = clickHandler;
                    // document.getElementById(zoomID).ondblclick = dblclickHandler;

                }
                else {

                    $(zzid).bind('mousedown', mousedownHandler);
                    $(zzid).bind('mouseup', mouseupHandler);
                    $(zzid).bind('click', clickHandler);
                    $(zzid).bind('dblclick', dblclickHandler);
                    $(zzid).bind('mousemove', mousemoveHandler);
                    var zoomID = "zoomScancubeZ";
                    document.getElementById(zoomID).onclick = clickHandler;
                    document.getElementById(zoomID).ondblclick = dblclickHandler;
                }


                function detectAndroid() {
                    var uagent = navigator.userAgent.toLowerCase();
                    if (uagent.search("android") > -1)
                        return true;

                    return false;
                }


                function detectwebkit() {
                    var uagent = navigator.userAgent.toLowerCase();
                    if (uagent.search("webkit") > -1)
                        return true;
                    else
                        return false;

                }
                function detectTouchdevice() {
                    return window.Touch || detectAndroid();
                }


            });
        }
    });

})(jQuery);
