﻿var down = false;
var gesture = false;
var move = false;
var defaultMargins = new Array();
var mouseVector = 0;
var pointX1, pointX2, pointY1, pointY2;
var pages = null;
var backgroundWidth = 0;

if (document.addEventListener) {
    document.addEventListener('DOMContentLoaded', Init, false);
} else if (window.attachEvent) {
    window.attachEvent('onload', Init);
}

function Init() {
    if (window.navigator.msPointerEnabled) {
        document.body.addEventListener("MSPointerDown", TouchDown, false);
        document.body.addEventListener("MSPointerUp", TouchUp, false);
        document.body.addEventListener("MSPointerMove", PointerMove, false);
        document.body.addEventListener("selectstart", PointerSelect, false);  // Disables selection
    } else if (document.attachEvent) {
        document.body.attachEvent('onmousedown', MouseDown);
        document.body.attachEvent('onmouseup', MouseUp);
        document.body.attachEvent('onmousemove', PointerMove);
        document.attachEvent('onselectstart', PointerSelect);
    } else if (document.addEventListener) {
        document.body.addEventListener('mousedown', MouseDown, false);
        document.body.addEventListener('mouseup', MouseUp, false);
        document.body.addEventListener('mousemove', PointerMove, false);
        document.addEventListener('selectstart', PointerSelect, false);
    } else {
        document.body.onmousedown = MouseDown;
        document.body.onmouseup = MouseUp;
        document.body.onmousemove = PointerMove;
        document.onselectstart = PointerSelect;
    }

    try {
        pages = document.querySelectorAll('.page');
    } catch (e) {
        pages = document.getElementsByClassName('page');
    }

    LockLeftMargins();
    GetBackgroundWidth();
    PreventDrag();
}

function GetBackgroundWidth() {
    if (window.getComputedStyle) {
        var u = window.getComputedStyle(document.body, '').getPropertyValue('background-image');
        u = u.replace(/url\(\"/, '').replace(/\"\)/, '');
        var w = 0;
        var i = new Image();
        i.onload = function () { backgroundWidth = this.width; }
        i.src = u;
    }
}

function LockLeftMargins() {
    for (var i = 0; i < pages.length; i++) {
        defaultMargins[i] = parseInt(pages[i].style.marginLeft);
    }
}

function PointerSelect(e) {
    if (e.preventDefault) e.preventDefault();
    return false;
}

function Button(event) {
    if (event.which) return (event.which < 2) ? "LEFT" : ((event.which == 2) ? "MIDDLE" : "RIGHT");
    else if (event.button) return (event.button < 2) ? "LEFT" : ((event.button == 4) ? "MIDDLE" : "RIGHT");
    else return null;
}

function MouseDown(event) {
    if (event == undefined) var event = window.event;
    pointX1 = event.screenX || event.pageX;
    pointY1 = event.screenY || event.pageY;
    if (Button(event) == "LEFT") {
        TouchDown(event);
        return false;
    }
}

function MouseUp(event) {
    if (event == undefined) var event = window.event;
    if (Button(event) == "LEFT") {
        TouchUp(event);
    }
}

function PointerMove(event) {
    var X2 = event.screenX || event.pageX || event.currentPoint.rawPosition.x;
    var Y2 = event.screenY || event.pageY || event.currentPoint.rawPosition.y;
    if (down && !move) {
        mouseVector = X2 - pointX2;
        pointX2 = X2;
        pointY2 = Y2;
        if (mouseVector > 0 || mouseVector < 0) {
            gesture = true;
            for (var i = 0; i < pages.length; i++) {
                pages[i].style.marginLeft = (defaultMargins[i] + (pointX2 - pointX1)) + 'px';
                Background();
            }
        }
    }
}

function TouchDown(e) {
    down = true;
    if (e.preventMouseEvent) e.preventMouseEvent();
}

function TouchUp(event) {
    if (gesture) {
        setTimeout(function () { gesture = false; }, 100);
        if (!move) {
            LockLeftMargins();
            var vector = CalculateDirectionPage() || CalculateNearestEdge();
            StartAnimation(vector);
        }
    }
    down = false;
}

function CalculateDirectionPage() {
    var minScalar = null;
    var minVector = null;
    for (var i = 0; i < pages.length; i++) {
        var vector = parseInt(pages[i].style.marginLeft);
        var scalar = Math.abs(vector);
        if (mouseVector < 0 && vector > 0 || mouseVector > 0 && vector < 0) {
            if (minScalar == null || scalar < minScalar) {
                minScalar = scalar;
                minVector = vector;
            }
        }
    }
    return -minVector;
}

function CalculateNearestEdge() {
    var minScalar = null;
    var minVector = null;
    for (var i = 0; i < pages.length; i++) {
        var vector = parseInt(pages[i].style.marginLeft);
        var scalar = Math.abs(vector);
        if (minScalar == null || scalar < minScalar) {
            minScalar = scalar;
            minVector = vector;
        }
    }
    return -minVector;
}

function StartAnimation(vector) {
    move = true;
    var positions = (mouseVector > 0 || mouseVector < 0) ? Mathematica2(vector, 15) : Mathematica1(vector, 15);
    for (var i = 0; i <= positions.length; i++) {
        var time = 25 * (i + 1);
        if (i < positions.length) {
            setTimeout('Animate(' + positions[i] + ')', time);
        } else {
            setTimeout(function () { LockLeftMargins(); move = false; mouseVector = 0; }, time);
        }
    }
}

function Animate(position) {
    for (var i = 0; i < pages.length; i++) {
        pages[i].style.marginLeft = (defaultMargins[i] + position) + 'px';
    }
    Background();
}

function Mathematica1(width, count) {
    var positions = new Array();
    for (var x = 0; x <= count; x++) {
        positions.push(width / 2 * (1 - Math.cos(Math.PI * x / count)));
    }
    return positions;
}

function Mathematica2(width, count) {
    var positions = new Array();
    for (var x = 0; x <= count; x++) {
        positions.push(width * (Math.sin(Math.PI * x / count / 2)));
    }
    return positions;
}

function Jump(page) {
    var vector = (1 - page) * 862 - parseInt(pages[0].style.marginLeft);
    mouseVector = 0;
    StartAnimation(vector);
    /* Transition supported browser
    for (var i = 0; i < pages.length; i++) {
        pages[i].style.marginLeft = (defaultMargins[i] + (1 - page) * 862) + 'px';
    }
    Background();
    */
}

if (typeof document.getElementsByClassName == 'undefined') {
    document.getElementsByClassName = function () {
        if (document.hasChildNodes && arguments[0]) {
            var data = new Array();
            for (a = 0; a < document.getElementsByTagName("*").length; a++) {
                if (document.getElementsByTagName("*")[a].className == arguments[0]) {
                    data.push(document.getElementsByTagName("*")[a]);
                }
            }
            return data;
        }
    }
}

function Background() {
    if (window.getComputedStyle && backgroundWidth > document.body.clientWidth) {
        var widthB = backgroundWidth - document.body.clientWidth - parseInt(window.getComputedStyle(document.body, '').getPropertyValue('margin-left')) - parseInt(window.getComputedStyle(document.body, '').getPropertyValue('margin-right'));
        var widthP = document.getElementById('control1').clientWidth * (pages.length - 1);
        var posP = parseInt(pages[0].style.marginLeft);
        var posB = posP / widthP * widthB
        posB = Math.min(posB, 0);
        posB = Math.max(posB, -widthB);
        document.body.style.backgroundPosition = Math.round(posB) + 'px 0px';
    }
}

function PreventDrag() {
    var anchors = document.getElementsByTagName('a');
    
    for (var i = 0; i < anchors.length; i++) {
        var a = anchors[i];
        if (a.parentNode.className == 'hentry' || a.parentNode.className == 'centry') {
            a.ondrag = function() {
                return false;
            };
            a.onmousedown = function(e) {
                if (e.preventDefault) e.preventDefault();
            };
            a.onclick = function() {
                if (gesture) return false;
            };
        }
    }
    
}
