﻿/// <reference path="floorplan.js" />
var dragX, dragY;
var dragLeft, dragTop;
var isDragging;
var isAnimating;

function initializeMoveDiv() {
    $movecontainer.mousedown(function(e) {
        e.preventDefault();
        dragX = e.pageX;
        dragY = e.pageY;
        dragLeft = $movediv.position().left;
        dragTop = $movediv.position().top;
        log("Drag started %d, %d", dragX, dragY);
        isDragging = true;
    }).bind("mousewheel dblclick", function(e, delta) {
        e.preventDefault();
        var offset = $(this).offset();
        var zoomPointX = e.pageX - offset.left;
        var zoomPointY = e.pageY - offset.top;
        zoomInOut(delta == null || delta > 0 ? 1 : -1, zoomPointX, zoomPointY);
    });

    // cancel drag with global mouseup
    $().mouseup(function(e) {
        isDragging = false;
    }).mousemove(function(e) {
        if (isDragging) {
            dragLeft += e.pageX - dragX;
            dragTop += e.pageY - dragY;
            dragX = e.pageX;
            dragY = e.pageY;
            $movediv.css({ left: dragLeft, top: dragTop });
        }
    });

    $movecontainer.bind("dragstart selectstart", function() { return false; /* prevent drag and select in IE */ })
        .css("-moz-user-select", "none");

    centerMap();

    // zoom controls
    $("#zoomout").bind("click dblclick", function(e) { zoomInOut(-1); e.stopPropagation(); });
    $("#zoomin").bind("click dblclick", function(e) { zoomInOut(1); e.stopPropagation(); });
}

function centerMap() {
    zoomTo(kiosk ? 1 : 0, null, null, 0.5, 0.5);
}

function moveMap(x, y) {
    log("moveMap: x = " + x + "; y = " + y);
    var left = $movediv.position().left + x;
    var top = $movediv.position().top + y;
    zoomTo(currentIndex, left, top, null, null, null, null);
}

function zoomTo(index, left, top, xFactor, yFactor, zoomPointX, zoomPointY) {
    if (isAnimating || index < 0 || index > images.length - 1) {
        return;
    }
    isAnimating = true;

    var hideMovediv = currentIndex != index;
    currentIndex = index;
    currentImage = images[currentIndex];

    if (left == null || top == null) {
        var lt = getMoveDivLeftTop(xFactor, yFactor, zoomPointX, zoomPointY);
        left = lt.left;
        top = lt.top;
    }

    $moveimage.attr("src", currentImage.url);
    if (hideMovediv) $(".bo", $movediv).hide();

    $movediv.animate({ left: left, top: top, width: currentImage.width + "px", height: currentImage.height + "px" },
                    function() {
                        isAnimating = false;
                        setupZoomControls();
                        addMapZoomClass();
                        $(".bo", $movediv).show();
                        // special hack for IE6
                        $('body').toggleClass("somedummyclassname");
                    });
}

function zoomInOut(delta, zoomPointX, zoomPointY) {
    zoomTo(currentIndex + delta, null, null, null, null, zoomPointX, zoomPointY);
}

function setupZoomControls() {
    $("#zoomout")[currentIndex == 0 ? "addClass" : "removeClass"]("disabled");
    $("#zoomin")[currentIndex == images.length - 1 ? "addClass" : "removeClass"]("disabled");
}

function getMoveDivLeftTop(xFactor, yFactor, zoomPointX, zoomPointY) {
    log("getMoveDivLeftTop(%d, %d, %d, %d)", xFactor, yFactor, zoomPointX, zoomPointY);
    // null zoom point values mean center of map
    if (zoomPointX == null || zoomPointY == null) {
        zoomPointX = ($movecontainer.width() + $leftbar.width()) / 2;
        zoomPointY = ($movecontainer.height() + $topbar.height()) / 2;
    }

    // null factors mean that we need to calculate them from zoompoint
    if (xFactor == null || yFactor == null) {
        var centerX = zoomPointX - $movediv.position().left;
        var centerY = zoomPointY - $movediv.position().top;
        xFactor = centerX / $movediv.width();
        yFactor = centerY / $movediv.height();
    }

    // calculate newCenterX and newCenterY to be in the center of new image
    var newCenterX = currentImage.width * xFactor;
    var newCenterY = currentImage.height * yFactor;
    // calculate left/top
    var left = zoomPointX - newCenterX;
    var top = zoomPointY - newCenterY;
    //log("getMoveDivLeftTop(%d, %d, %d, %d)", xFactor, yFactor, zoomPointX, zoomPointY);
    log(left, top, newCenterX, newCenterY);
    return { left: left + "px", top: top + "px" };
}


function addMapZoomClass() {
    $movediv.removeClass("x1 x2 x3 x4 largest");
    $movediv.addClass("x" + (currentIndex + 1));
    if (currentIndex == images.length - 1)
        $movediv.addClass("largest");
}



