function FlippingBook() {
    this.pages = [];
    this.zoomPages = [];
    this.printPages = [];
    this.contents = [];

    this.stageWidth = "991";
    this.stageHeight = "507";

    this.settings = {
        bookWidth: 980,
        bookHeight: 480,
        pagesSet: this.pages,
        zoomPagesSet: this.zoomPages,
        printPagesSet: this.printPages,
        scaleContent: true,
        preserveProportions: false,
        centerContent: true,
        hardcover: false,
        hardcoverThickness: 3,
        hardcoverEdgeColor: 0xFFFFFF,
        highlightHardcover: true,
        frameWidth: 1,
        frameColor: 0xcccccc,
        frameAlpha: 100,
        firstPageNumber: 1,
        autoFlipSize: 50,
        navigationFlipOffset: 30,
        flipOnClick: true,
        handOverCorner: true,
        handOverPage: true,
        alwaysOpened: false,
        staticShadowsType: "Asymmetric", // Asymmetric, Symmetric, Default
        staticShadowsDepth: 1,
        staticShadowsLightColor: 0xFFFFFF, // works for "Symmetric" shadows only
        staticShadowsDarkColor: 0xe9e9e9,
        dynamicShadowsDepth: 1,
        dynamicShadowsLightColor: 0xFFFFFF, // works for "dark" pages only
        dynamicShadowsDarkColor: 0xe9e9e9,
        moveSpeed: 2,
        closeSpeed: 3,
        gotoSpeed: 3,
        rigidPageSpeed: 5,
        flipSound: "",
        hardcoverSound: "",
        preloaderType: "Thin", // "Progress Bar", "Round", "Thin", "Dots", "Gradient Wheel", "Gear Wheel", "Line", "Animated Book", "None"
        pageBackgroundColor: 0xfcfcfc,
        loadOnDemand: true,
        allowPagesUnload: true,
        showUnderlyingPages: false,
        playOnDemand: true,
        freezeOnFlip: false,
        darkPages: false,
        smoothPages: false,
        rigidPages: false,
        flipCornerStyle: "first page only", // "first page only", "each page", "manually"
        flipCornerPosition: "bottom-right", // "bottom-right","top-right","bottom-left","top-left"
        flipCornerAmount: 50,
        flipCornerAngle: 20,
        flipCornerRelease: true,
        flipCornerVibrate: true,
        flipCornerPlaySound: false,
        zoomEnabled: true,
        zoomPath: "/movies/catalogue/Lovelinks/Large/",
        zoomImageWidth: 980,
        zoomImageHeight: 1165,
        zoomOnClick: true,
        zoomUIColor: 0xcccccc,
        zoomHint: "Double click to zoom.",
        zoomHintEnabled: false,
        centerBook: true,
        useCustomCursors: false,
        dropShadowEnabled: false,
        dropShadowHideWhenFlipping: true,
        backgroundColor: 0xffffff,
        //backgroundImage: "img/bookBackground.jpg",
        backgroundImagePlacement: "fit", //  "top left", "center", "fit"
        printEnabled: true,
        printTitle: "Print Pages",
        downloadURL: "",
        downloadTitle: "Download PDF",
        downloadSize: "Size: 4.7 Mb",
        downloadComplete: "Complete",
        extXML: ""
    };

    this.containerId = "catalogueContainer";
    this.forwardButtonId = "catalogueForwardButton";
    this.backButtonId = "catalogueBackButton";
    this.zoomButtonId = "catalogueZoomButton";
    this.printButtonId = "cataloguePrintButton";
    this.downloadButtonId = "catalogueDownloadButton";
    this.currentPagesId = "catalogueCurrentPages";
    this.totalPagesId = "catalogueTotalPages";
    this.contentsMenuId = "catalogueContentsMenu";
};

FlippingBook.prototype.create = function() {
    this.settings.pagesSet = this.pages;
    this.settings.zoomPagesSet = this.zoomPages;
    this.settings.printPagesSet = this.printPages;

    if (location.hash.substr(1) != "")
        this.settings.firstPageNumber = location.hash.substr(1);

    this.addLoadEvent(this.onWindowLoad);
    swfobject.embedSWF("/movies/catalogue/CatalogueViewer.swf", this.containerId, this.stageWidth, this.stageHeight, "8.0.0", "/js/catalogue/expressInstall.swf", this.settings, { allowScriptAccess: "always", bgcolor: "#" + this.settings.backgroundColor.toString(16) });
}

FlippingBook.prototype.getFlippingBookReference = function() {
    return this.getObjectReference(this.containerId);
}

FlippingBook.prototype.getObjectReference = function(id) {
    return document.getElementById(id);
}

FlippingBook.prototype.flipForward = function() {
    flippingBook.getFlippingBookReference().flipForward();
}

FlippingBook.prototype.flipBack = function() {
    flippingBook.getFlippingBookReference().flipBack();
}

FlippingBook.prototype.zoomButtonClick = function() {
    if (flippingBook.getFlippingBookReference().isZoomedIn())
        flippingBook.zoomOut();
    else
        flippingBook.zoomIn();
}

FlippingBook.prototype.zoomIn = function() {
    this.getFlippingBookReference().zoomIn();
}

FlippingBook.prototype.zoomOut = function() {
    this.getFlippingBookReference().zoomOut();
}

FlippingBook.prototype.print = function() {
    flippingBook.getFlippingBookReference().print();
}

FlippingBook.prototype.downloadFile = function() {
    if (flippingBook.settings.downloadURL)
        flippingBook.getFlippingBookReference().downloadFile();
}

FlippingBook.prototype.onWindowLoad = function() {
    var forwardButton = flippingBook.getObjectReference(flippingBook.forwardButtonId);
    if (forwardButton) {
        forwardButton.style.cursor = "pointer";
        forwardButton.onclick = flippingBook.flipForward;
    }

    var backButton = flippingBook.getObjectReference(flippingBook.backButtonId);
    if (backButton) {
        backButton.style.cursor = "pointer";
        backButton.onclick = flippingBook.flipBack;
    }

    var zoomButton = flippingBook.getObjectReference(flippingBook.zoomButtonId);
    if (zoomButton) {
        zoomButton.style.cursor = "pointer";
        zoomButton.onclick = flippingBook.zoomButtonClick;
    }

    var printButton = flippingBook.getObjectReference(flippingBook.printButtonId);
    if (printButton) {
        printButton.style.cursor = "pointer";
        printButton.onclick = flippingBook.print;
    }

    var downloadButton = flippingBook.getObjectReference(flippingBook.downloadButtonId);
    if (downloadButton) {
        downloadButton.style.cursor = "pointer";
        downloadButton.onclick = flippingBook.downloadFile;
    }

    flippingBook.buildContentsMenu();
}

FlippingBook.prototype.onPutPage = function(leftPageNumber, rightPageNumber) {
    this.updatePagination(leftPageNumber, rightPageNumber);
    this.updateContentsMenu(leftPageNumber, rightPageNumber);
}

FlippingBook.prototype.updatePagination = function(leftPageNumber, rightPageNumber) {
    var leftPageExists = (leftPageNumber != undefined);
    var rightPageExists = (rightPageNumber != undefined);

    var pageNumberString = leftPageNumber + "-" + rightPageNumber;
    if (!leftPageExists)
        pageNumberString = rightPageNumber;
    if (!rightPageExists)
        pageNumberString = leftPageNumber;

    $('#catalogueCurrentPages').html(pageNumberString);
    $('#catalogueTotalPages').html("/&nbsp;" + this.getFlippingBookReference().totalPages());
}

FlippingBook.prototype.buildContentsMenu = function() {
    var contentsSelect = this.getObjectReference(this.contentsMenuId);

    if (contentsSelect) {
        for (var i = 0; i < this.contents.length; i++)
            contentsSelect.options[i] = new Option(this.contents[i][0], this.contents[i][1]);

        contentsSelect.onchange = this.onContentsChange;
    }
}

FlippingBook.prototype.onContentsChange = function() {
    var contentsSelect = flippingBook.getObjectReference(flippingBook.contentsMenuId);
    var pageNumber = contentsSelect.options[contentsSelect.selectedIndex].value;

    if (pageNumber)
        flippingBook.getFlippingBookReference().flipGotoPage(pageNumber);
}

FlippingBook.prototype.updateContentsMenu = function(leftPageNumber, rightPageNumber) {
    var contentsSelect = flippingBook.getObjectReference(flippingBook.contentsMenuId);

    if (contentsSelect) {
        var indexToSelect = 0;
        var lastPageNumber = contentsSelect.options[this.contents.length - 1].value;

        if (leftPageNumber >= lastPageNumber || rightPageNumber >= lastPageNumber) {
            indexToSelect = this.contents.length - 1;
        }
        else {
            for (var i = 0; i < this.contents.length - 1; i++) {
                var minPage = contentsSelect.options[i].value;
                var maxPage = contentsSelect.options[i + 1].value;
                var leftOK = false;
                var rightOK = false;

                //alert("min page:" + minPage + " max page:" + maxPage);
                if (minPage % 2 == 1) {
                    minPage = minPage - 1;
                }

                if (maxPage % 2 == 1) {
                    maxPage = maxPage - 1;
                }

                if (leftPageNumber)
                    leftOK = (Number(leftPageNumber) >= minPage && Number(leftPageNumber) <= maxPage);
                else
                    leftOK = true;

                if (rightPageNumber)
                    rightOK = (Number(rightPageNumber) >= minPage && Number(rightPageNumber) <= maxPage);
                else
                    rightOK = true;

                if (leftOK && rightOK) {
                    //alert("left ok right ok");
                    indexToSelect = i;
                    break;
                }
            }
        }

        contentsSelect.selectedIndex = indexToSelect;
        //alert(indexToSelect);
    }
}

/*
FlippingBook.prototype.updateContentsMenu = function(leftPageNumber, rightPageNumber) {
    testTomUpdateStuff(leftPageNumber, rightPageNumber);
}

function testTomUpdateStuff(leftPageNumber, rightPageNumber) {

    var contentsSelect = flippingBook.getObjectReference(flippingBook.contentsMenuId);

    if (contentsSelect) {
        for (var i = 0; i < this.contents.length - 1; i++) {
            var minPage = contentsSelect.options[i].value;
            var maxPage = contentsSelect.options[i + 1].value;
            var leftOK = false;
            var rightOK = false;

            if (leftPageNumber)
                leftOK = (Number(leftPageNumber) >= minPage && Number(leftPageNumber) <= maxPage);
            else
                leftOK = true;

            if (rightPageNumber)
                rightOK = (Number(rightPageNumber) >= minPage && Number(rightPageNumber) <= maxPage);
            else
                rightOK = true;

            if (leftOK && rightOK)
                break;
        }
        contentsSelect.selectedIndex = i;
    }
}*/

FlippingBook.prototype.getWindowHeight = function() {
    var windowHeight = 0;

    if (typeof (window.innerHeight) == 'number') {
        windowHeight = window.innerHeight;
    }
    else {
        if (document.documentElement && document.documentElement.clientHeight) {
            windowHeight = document.documentElement.clientHeight;
        }
        else {
            if (document.body && document.body.clientHeight) {
                windowHeight = document.body.clientHeight;
            }
        }
    }

    return windowHeight;
}

FlippingBook.prototype.addLoadEvent = function(fn) {
    if (typeof window.addEventListener != "undefined") {
        window.addEventListener("load", fn, false);
    }
    else if (typeof document.addEventListener != "undefined") {
        document.addEventListener("load", fn, false);
    }
    else if (typeof window.attachEvent != "undefined") {
        window.attachEvent("onload", fn);
    }
    else if (typeof window.onload == "function") {
        var fnOld = window.onload;
        window.onload = function() {
            fnOld();
            fn();
        };
    }
    else {
        window.onload = fn;
    }
}

FlippingBook.prototype.handleWheel = function(delta) {
    this.getFlippingBookReference().onWheelScroll(delta);
}

flippingBook = new FlippingBook();

function wheel(event) {
    var delta = 0;
    if (!event) event = window.event;
    if (event.wheelDelta) {
        delta = event.wheelDelta / 120;
        if (window.opera) delta = -delta;
    } else if (event.detail) {
        delta = -event.detail / 3;
    }
    if (delta)
        flippingBook.handleWheel(delta);
    if (event.preventDefault)
        event.preventDefault();
    event.returnValue = false;
}

if (window.addEventListener)
    window.addEventListener('DOMMouseScroll', wheel, false);
window.onmousewheel = document.onmousewheel = wheel;
