﻿

var searchType = 1;
var flashIsInstalled = false;

var selectedBookId = 0;
var selectedRegionId = 0;
var selectedLibraryId = 0;

var presetLibId = 0;
var doLoadLibs = false;
var _dropdownListIPadHeight = 45;

var _jQueryMapSWFPath = _domainName + '/map.swf';
var _jQueryMapSubSwfFilesPath = _domainName + '/flash/';
var _jQueryMapConfigXML = _domainName + '/config/worldmap.aspx';
var _flashMapLoaderSWF = _domainName + '/flash-sliders/whichbook-ui-loader-1.2.swf';
var _flashMapSliderXml = _domainName + '/config/sliderbarsconfig.ashx';
var _flashMapCharPlotXml = _domainName + '/config/characterplotconfig.ashx';
var _flashUiSWF = _domainName + '/flash-sliders/flash-sliders-1.2.swf';

var continents = new Array();

function doSimilarSearch(id) {
    $.WhichbookSearch({ query: "id=" + id, pageNumber: 1, searchType: 3 });
}

jQuery.extend({
    HistoryState: function () {
        $(window).bind('hashchange', function (e) {

            var url = $.param.fragment().toLowerCase();
            var params = parseHashParams(url);
            if (url == "") {

            }
            var cmd = "";
            var searchType = "";
            for (var i = 0; i < params.length; i++) {
                var frag = parseFrag(params[i]);
                if (frag[0] == "cmd")
                    cmd = frag[1];
                if (frag[0] == "search-type")
                    searchType = frag[1];
            }
            switch (cmd) {
                case "search":
                    handleSearch(params, searchType, url);
                    break;
            }
        })
        $(document).ready(function () {
            if (!flashIsInstalled)
                $(window).trigger('hashchange');
        });
        function handleSearch(params, searchType, url) {

            if ($('#sliders').length == 0) {
                window.location = '/#' + buildQueryString(params) + "cmd=search&search-type=" + searchType;
            }

            if (mainUiFlash == null) {
                setSearchPanels(searchType);
                if (searchType == "1") {

                    restoreSliders(params);
                    handleSliderSearch(params);

                }
                else if (searchType == "2") {

                    restoreCharacterPlot(params);
                    handlePlotSearch(params);

                } else if (searchType == "3") {

                    handleSimilarSearch(params);

                } else if (searchType == "4") {

                    handleExactSearch(params);
                }
            }
            else {
                if (searchType == "1") {

                    flSetSlidersRestore(params);
                    handleSliderSearch(params);

                } else if (searchType == "2") {

                    flCharacterPlotRestore(params);
                    handlePlotSearch(params);

                } else if (searchType == "3") {

                    handleSimilarSearch(params);

                } else if (searchType == "4") {

                    handleExactSearch(params);
                }
            }
        }

        function restoreSliders(params) {
            closeAllSliders();
            for (var i = 0; i < params.length; i++) {
                var frag = parseFrag(params[i]);
                if (frag[0].indexOf('q') == 0) {
                    setSlider(frag[0].replace('q', ''), frag[1]);
                }
            }
        }

        function buildQueryString(params) {

            var query = "";
            var pn = "1";
            var sliderCount = 0;

            for (var i = 0; i < params.length; i++) {

                var frag = parseFrag(params[i]);
                var key = frag[0].toLowerCase();

                if (key == "p")
                    pn = frag[1];

                if (key == "audio")
                    query += frag[0] + "=" + frag[1] + "&";

                if (key == "ebook")
                    query += frag[0] + "=" + frag[1] + "&";

                if (key == "lp")
                    query += frag[0] + "=" + frag[1] + "&";

                if (key.charAt(0).toLowerCase() == "q") {
                    query += frag[0] + "=" + frag[1] + "&";
                    sliderCount++;
                }
            }

            return query;
        }

        function handleSliderSearch(params) {

            var query = "";
            var pn = "1";
            var st = "1";
            var sliderCount = 0;

            for (var i = 0; i < params.length; i++) {

                var frag = parseFrag(params[i]);
                var key = frag[0].toLowerCase();

                if (key == "p")
                    pn = frag[1];

                if (key == "audio")
                    query += frag[0] + "=" + frag[1] + "&";

                if (key == "ebook")
                    query += frag[0] + "=" + frag[1] + "&";

                if (key == "lp")
                    query += frag[0] + "=" + frag[1] + "&";

                if (key.charAt(0).toLowerCase() == "q") {
                    query += frag[0] + "=" + frag[1] + "&";
                    sliderCount++;
                }
            }

            if (sliderCount > 0) {
                $.WhichbookSearch({ query: query, pageNumber: pn, searchType: 1 });
            }
            else {

            }
        }

        function handleExactSearch(params) {

            var id = 0;

            for (var i = 0; i < params.length; i++) {

                var frag = parseFrag(params[i]);
                var key = frag[0].toLowerCase();

                if (key == "id")
                    id = frag[1];
            }

            $.WhichbookSearch({ query: "id=" + id, pageNumber: 1, searchType: 4 });

        }

        function handleSimilarSearch(params) {

            var query = "";
            var pn = "1";
            var st = "1";
            var id = 0;

            for (var i = 0; i < params.length; i++) {

                var frag = parseFrag(params[i]);
                var key = frag[0].toLowerCase();

                if (key == "p")
                    pn = frag[1];

                if (key == "id")
                    id = frag[1];
            }

            $.WhichbookSearch({ query: "id=" + id, pageNumber: pn, searchType: 3 });

        }

        function handlePlotSearch(params) {
            var query = "";
            var pn = "1";
            var st = "1";
            var sliderCount = 0;

            for (var i = 0; i < params.length; i++) {
                var frag = parseFrag(params[i]);
                var key = frag[0].toLowerCase();

                if (key == "p")
                    pn = frag[1];

                if (key == "cont") {
                    key = "setting";
                    frag[0] = "setting";
                }
                if (key == "age" || key == "setting" || key == "gender" || key == "plot" || key == "race" || key == "sex" || key == "audio" || key == "ebook" || key == "lp") // gend
                    query += frag[0] + "=" + frag[1] + "&";

            }
            $.WhichbookSearch({ query: query, pageNumber: pn, searchType: 2 });
        }
        function parseHashParams(url) {
            return url.split('&');
        }
        function parseFrag(frag) {
            return frag.split('=');
        }
    }
});



$(document).ready(function () {


    flashIsInstalled = swfobject.hasFlashPlayerVersion("9");
    if (_IsMobile)
        flashIsInstalled = false;

    $.HistoryState();

    $('.button').each(function () {
        $(this).bind('mouseover', onButtonOver);
        $(this).bind('mouseout', onButtonOut);
    });

    if (loadSearchUI) {
        if (flashIsInstalled) {
            $('#jquerySlidersUI').hide();
            loadFlashUI();
        }
        else {
            initializeJQuerySliders();
            initializeJQueryCharacterPlot();
            $('#jquerySlidersUI').show();
        }


    }

    $('body').click(function () {
        $("#cluetip-close").click();
    });

    initBorrowing();

});

function onButtonOver() {
    $(this).css('background-position-y', '-34px');
}

function onButtonOut() {
    $(this).css('background-position-y', 'top');
}


var mainUiFlash;
var hasMainUiFlashLoaded = false;
var flashCallBack = null;

function embedHandler(e) 
{
    mainUiFlash = document.getElementById("sliders");
    hasMainUiFlashLoaded = true;
    if (flashCallBack != null)
        flSetSlidersRestore(flashCallBack);
}

var queryHandle = 0;

function loadFlashUI() 
{
    $('#container').html('');
    $('#container').removeAttr('style');

    var flashvars = { slidersXmlConfig: _flashMapSliderXml, charPlotXmlConfig: _flashMapCharPlotXml, uiSWF: _flashUiSWF, smethod: smeth, id: cid };
    var params = { wmode: 'transparent', allowScriptAccess: 'always' };
    var attributes = { id: "sliders", name: "sliders", allowScriptAccess: 'sameDomain' };

    swfobject.embedSWF(_flashMapLoaderSWF, "container", "340", "620", "10.0.0", "expressInstall.swf", flashvars, params, attributes, embedHandler);
}

function flSliderLoaded() {
    $(window).trigger('hashchange');
}

function FlSliderSearch(sliders, audio, ebook, largeprint, mode) {

    var s = "";
    if (mode == 1) {
        for (var i = 0; i < sliders.length; i++) {
            s += sliders[i].id.replace('s', 'q') + "=" +
                                            sliders[i].value + "&";
        }
    }
    else {
        for (var i = 0; i < sliders.length; i++) {
            s += sliders[i].id + "=" + sliders[i].value + "&";
        }
    }
    queryHandle++;
    window.location = "#" + s + "cmd=search&search-type=" + mode + "&audio=" +
                              audio + "&ebook=" + ebook + "&lp=" + largeprint;
}

function flSetSlidersRestore(parms)
{
    if (!hasMainUiFlashLoaded) {
        flashCallBack = parms;
    }
    else
        mainUiFlash.SetSliders(parms);
}

function flCharacterPlotRestore(parms)
{
    if (!hasMainUiFlashLoaded)
        flashCallBack = parms;
    else
        mainUiFlash.SetSliders(parms);
}

function flShowSliders()
{
    mainUiFlash.showSliders();
}

function flShowCharacterPlot() {

}






function switchPanels() {

    closeAllSliders();

    $("#panel1").toggle();
    $("#panel2").toggle();

    if ($("#panel2").css('display') != 'none') {

        searchType = 2;
        $('#btnSCP div').text("close");

    } else {

        searchType = 1;
        $('#btnSCP div').text("change to character, setting, plot");

    }

    $('#search-type').val(searchType);

}

function setSearchPanels(type) {

    if (type == 1) 
    {
        $("#panel1").show();
        $("#panel2").hide();
        searchType = 1;
        $('#search-type').val(searchType);
        $('#btnSCP div').text("change to character, setting, plot");
    }
    else {

        $("#panel1").hide();
        $("#panel2").show();
        searchType = 2;
        $('#search-type').val(searchType);
        $('#btnSCP div').text("close");
    }
}


function doSearch() {

    var searchQuery = '';
    if (searchType == 1)
        searchQuery = getAllSliderValuesString();
    else
        searchQuery = getCharacterPlotValuesString();

    return '#' + searchQuery + 'cmd=search&search-type=' + searchType;

}

function doSearch2(url) {

    var searchQuery = '';
    if (searchType == 1)
        searchQuery = getAllSliderValuesString();
    else
        searchQuery = getCharacterPlotValuesString();

    return url + '?' + searchQuery + 'cmd=search&search-type=' + searchType;

}

function resetSearchOptions() {
    closeAllSliders();
    setSearchPanels(1);
}



var openSliders = new Array();

function setToolTipMessage(msg) {
    $('#toolsToolTip').html(msg);
}

function initializeJQuerySliders() {

    $('.slider').bind('click', function (e) {

        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;

        if (y < 25) {

            if ($(this).hasClass('closed')) {
                openSlider(this);
            } else {
                closeSlider(this);
            }

        }
        else {
            var id = $(this).attr('id').replace("s", "");
            var val = Math.round(x / (275 / 10));
            setSlider(id, val);
        }

    });

    $('.slider').bind('mouseover', function () {
        $(this).css('background-position', 'center -36px');
        $(this).find('.left').css('background-position', 'left -36px');
        $(this).find('.right').css('background-position', 'right -36px');

        if (openSliders.length < 4) {
            $('#toolsToolTip').html('Click to open this choice');
        }

    });

    $('.slider').bind('mouseout', function () {
        $(this).css('background-position', 'center top');
        $(this).find('.left').css('background-position', 'left top');
        $(this).find('.right').css('background-position', 'right top');
        $('#toolsToolTip').html('');
    });



    $('.slider').bind('mouseup', function () {
        $('#toolsToolTip').html('');
    });

    $('#sliders span.handle').draggable({
        axis: 'x', containment: 'parent', stop: function (event, ui) {
            var slider = $(event.target).parents('.slider');
            var id = slider.attr('id');
            var val = Math.round(ui.position.left / (slider.width() / 12));
            $('#' + id.replace('s', 'q')).val(getSliderValue(id));
        }
    });


    var startX = 0;
    var endX = 0;
    var touchId = "";
    var startPos = 0;

    $('.handle').bind('touchstart', function (e) {
        e.preventDefault();
        startX = event.targetTouches[0].clientX;
        startPos = $(event.targetTouches[0].target).position().left;
    });

    $('.handle').bind('touchcancel', function (e) {
        e.preventDefault();
    });

    $('.handle').bind('touchend', function (e) {
        e.preventDefault();
    });

    $('.handle').bind('touchmove', function (e) {
        e.preventDefault();
        touchId = $(event.targetTouches[0].target).parent().attr('id').replace('s', '');
        endX = event.targetTouches[0].pageX;
        var diff = endX - startX;
        var newPos = (startPos) + diff;
        if (newPos >= 275) newPos = 275;
        if (newPos <= 0) newPos = 0;
        $(this).css('left', newPos);
        var val = Math.round(newPos / (275 / 10));
        $('#q' + touchId).val(val);
    });

}

function setSlider(sliderId, sliderValue) {

    var isAlreadyOpen = false;
    for (var i = 0; i < openSliders.length; i++) {
        if (openSliders[i] == "s" + sliderId) {
            isAlreadyOpen = true;
        }
    }

    if (openSliders.length < 4) {

        var slider = $('#s' + sliderId);
        var id = slider.attr('id');
        var handle = slider.find('.handle');

        if (slider.hasClass('closed')) {
            handle.show();
            centerHandle(id);
            slider.removeClass('closed');
            slider.addClass('open');
        }

        if (!isAlreadyOpen)
            openSliders.push(id);

        if (openSliders.length == 4) {
            FadeSlidersOut();
        }

        var barWidth = slider.width();
        var handleWidth = handle.width();

        var steps = (barWidth / 12);
        var expectedPosition = (steps * sliderValue);
        if (sliderValue < 5)
            expectedPosition = expectedPosition;
        else
            expectedPosition = expectedPosition + (handleWidth / 2);

        var actualPosition = handle.position().left;
        if ((actualPosition + barWidth > expectedPosition) || (actualPosition - barWidth < expectedPosition))
            handle.css('left', expectedPosition + 'px');

        $('#' + id.replace('s', 'q')).val(sliderValue);
    }

}

function openSlider(slider) {

    if (openSliders.length < 4) {

        var id = $(slider).attr('id');
        var handle = $(slider).find('.handle');
        handle.show();
        openSliders.push(id);

        if (openSliders.length == 4) {
            FadeSlidersOut();
        }

        $(slider).removeClass('closed');
        $(slider).addClass('open');
        centerHandle(id);
        $('#' + id.replace('s', 'q')).val(getSliderValue(id));

    }
    else {
        $('#toolsToolTip').html("<span style='color:red'>You can only have 4 sliders open!</span>");
    }
}

function closeAllSliders() {

    var doFadeIn = false;
    doFadeIn = (openSliders.length == 4);

    $('.slider').each(function () {
        closeSlider(this);
    });

    if (doFadeIn && (openSliders.length < 4))
        FadeSlidersIn();
}

function closeSlider(slider) {

    var doFadeIn = false;
    doFadeIn = (openSliders.length == 4);

    var id = $(slider).attr('id');
    var handle = $(slider).find('.handle');
    handle.hide();
    $.removeByElement(openSliders, id);
    $('#' + id.replace('s', 'q')).val('');
    $(slider).removeClass('open');
    $(slider).addClass('closed');

    if (doFadeIn && (openSliders.length == 3))
        FadeSlidersIn();

}

function FadeSlidersOut() {

    $('.slider').each(function () {
        if (!isInArray(openSliders, $(this).attr('id'))) {
            $(this).fadeTo(1, 0.6);
        }
    });

}

function FadeSlidersIn() {

    $('.slider').each(function () {
        $(this).fadeTo(1, 1);
    });

}

function centerHandle(id) {
    var barWidth = $('#' + id).width();
    var handleWidth = $('#' + id).find('.handle').width();
    $('#' + id + ' span.handle').css({
        'left': ((barWidth / 2) - (handleWidth / 2)) + 'px'
    });
}

function getSliderValue(id) {
    var slider = $('#' + id);
    var handle = slider.find('.handle');
    return Math.round(handle.position().left / (slider.width() / 11));

}

function getAllSliderValuesString() {

    var retval = "";
    for (var i = 1; i <= 12; i++) {
        if ($('#q' + i).val() != "")
            retval += "q" + i + "=" + $('#q' + i).val() + "&";
    }

    return retval;
}



function initializeJQueryCharacterPlot() {

    $('.optionbar').bind('click', function () {
        $(this).parents().find('.baritem').hide();
        $(this).find('.baritem').show();
    });

    $('.combobar').bind('click', function () {
        $(this).parents().find('.combo').hide();
        $('#' + $(this).attr('id')).find('.combo').toggle();
    });

    $('.combo div').bind('click', function () {
        var id = $(this).parentsUntil('.baritem').parent().attr('id');

        if ($(this).hasClass('comboselected')) {
            $(this).removeClass('comboselected');
            $('#' + id + '_value').val('');
        }
        else {
            $('#' + id + '_value').val($(this).find('.hiddenvalue').text());
            $('#' + id + ' .combo div').removeClass('comboselected');
            $(this).addClass('comboselected');
        }

        setCharacterTitleSelected(id);
    });

    $('.combo div').bind('mouseenter', function () {
        $(this).addClass('combobarover');
    });

    $('.combo div').bind('mouseleave', function () {
        $(this).removeClass('combobarover');
    });

    $('.checkbox').bind('click', function () {

        var id = $(this).parent().parent().attr('id');
        if (id == "")
            id = $(this).parent().attr('id');

        var isTicked = $(this).find('.tick').hasClass('ticked');
        $(this).parent().find('.tick').removeClass('ticked');
        if (!isTicked) {
            $(this).find('.tick').addClass('ticked');
            $('#' + id + '_value').val($(this).find('.hiddenvalue').text());
        }
        else
            $('#' + id + '_value').val('');

        setPlotTitleSelected();

    });


    $('#countries').click(function (e) {
        e.stopPropagation();
    });

    $('#continents').click(function (e) {
        e.stopPropagation();
    });

    if (flashIsInstalled) {

    }
    else {
        configWithoutFlash();
    }

}


function setCharacterTitleSelected(id) {

    var selectedTextObj = $('#characterSelected');
    selectedTextObj.text("");
    var emptyHeight = selectedTextObj.height();

    var selectedText = "";
    $('.comboselected').each(function () {
        selectedText += $(this).find('.text').text() + ", ";
    });

    if (selectedText.length > 0) {
        selectedText = selectedText.substring(0, selectedText.length - 2);
        selectedTextObj.text(selectedText);
        selectedTextObj.attr('title', selectedText);
        var fullHeight = selectedTextObj.height();
        if (fullHeight > 20) {
            selectedText = selectedText.substring(0, 16) + " ...";
            selectedTextObj.text(selectedText);
        }
    }
}

function setPlotTitleSelected(id) {

    var selectedTextObj = $('#plotSelected');
    selectedTextObj.text("");
    var emptyHeight = selectedTextObj.height();

    var selectedText = "";
    selectedText = $('#plot .ticked').next().text();

    if (selectedText.length > 0) {
        selectedTextObj.text(selectedText);
        selectedTextObj.attr('title', selectedText);
        var fullHeight = selectedTextObj.height();
        if (fullHeight > 24) {
            selectedText = selectedText.substring(0, 16) + " ...";
            selectedTextObj.text(selectedText);
        }
    }
}



function setCharacterPlotSetting(options) {

    var defaults = {
        race: 0,
        age: 0,
        sexuality: 0,
        gender: 0,
        plot: 0,
        continent: 0,
        country: 0
    };

    var settings = jQuery.extend(defaults, options);


    $('#race_value').val('');
    $('#age_value').val('');
    $('#sexuality_value').val('');
    $('#gender_value').val('');

    $('.characteroptions .tick').removeClass('ticked');
    $('.characteroptions .combo div').removeClass('comboselected');

    if (settings.race > 0) {
        $('#race_value').val(settings.race);
        $('#race').find(".hiddenvalue").each(function () {
            if ($(this).text() == settings.race) {
                $(this).parent().find('.text').parent().addClass('comboselected');
                $(this).parent().find('.tick').addClass('ticked');
            }
        });
    }
    if (settings.age > 0) {
        $('#age_value').val(settings.age);
        $('#age').find(".hiddenvalue").each(function () {
            if ($(this).text() == settings.age) {
                $(this).parent().find('.text').parent().addClass('comboselected');
                $(this).parent().find('.tick').addClass('ticked');
            }
        });
    }
    if (settings.sexuality > 0) {
        $('#sexuality_value').val(settings.age);
        $('#sexuality').find(".hiddenvalue").each(function () {
            if ($(this).text() == settings.sexuality) {
                $(this).parent().find('.text').parent().addClass('comboselected');
                $(this).parent().find('.tick').addClass('ticked');
            }
        });
    }
    if (settings.gender > 0) {
        $('#gender_value').val(settings.gender);
        $('#gender').find(".hiddenvalue").each(function () {
            if ($(this).text() == settings.gender) {
                $(this).parent().find('.text').parent().addClass('comboselected');
                $(this).parent().find('.tick').addClass('ticked');
            }
        });
    }
    setCharacterTitleSelected('');

    if (settings.plot > 0) {
        $('#plot_value').val(settings.plot);

        $('.plot .tick').removeClass('ticked');
        $('#plot').find(".hiddenvalue").each(function () {
            if ($(this).text() == settings.plot) {
                $(this).parent().find('.tick').addClass('ticked');
            }
        });

    }
    setPlotTitleSelected();
}

function restoreCharacterPlot(parts) {

    var race = 0;
    var age = 0;
    var sexuality = 0;
    var gender = 0;
    var plot = 0;
    var continent = 0;
    var country = 0;

    for (var i = 0; i < parts.length; i++) {

        var bits = parts[i].split('=');
        switch (bits[0]) {
            case "race":
                race = bits[1];
                break;
            case "age":
                age = bits[1];
                break;
            case "sex":
                sexuality = bits[1];
                break;
            case "gender":
                gender = bits[1];
                break;
            case "plot":
                plot = bits[1];
                break;
            case "cont":
                continent = bits[1];
                break;
            case "setting":
                continent = bits[1];
                break;
        }
    }

    setCharacterPlotSetting({ race: race, age: age, sexuality: sexuality, gender: gender, plot: plot, continent: continent });
}

function getCharacterPlotValuesString() {

    var query = "age=" + $('#age_value').val() + "&gender=" + $('#gender_value').val() + "&plot=" + $('#plot_value').val() + "&race=" +
                $('#race_value').val() + "&sex=" + $('#sexuality_value').val() + "&setting=" + $("#setting_value").val() + "&";

    return query;

}


var settingName = "";
var settingId = 0;

var selectedContinent = 0;
var selectedCountry = 0;
var countryToSelect = 0;
var flashMovie = null;

function configWithoutFlash() {

    if (continents == null)
        return;

    $('#myContent').hide();
    for (var i = 0; i < continents.length; i++) {
        $('#continents').get(0).options[$('#continents').get(0).options.length] = new Option(continents[i].name, continents[i].id);
    }

    $('#continents').change(function (e) {

        e.stopPropagation();

        selectedContinent = this.value;

        $('#setting_value').val(this.value);

        if (this.value == 9 || this.value == 95 || this.value == 0) {
            $('#countries').val('0');
            $('#countryHolder').hide();

            if (this.value == 9) {
                $('#setting_value').val(this.value);
                selectedCountry = this.value;
                var name = this.options[this.selectedIndex].text;
                if (name == "")
                    name = settingName;

                $('#settingSeleted').html(formatSettingString(name));
            }

        }
        else {
            populateCountries(this.value);
            $('#countryHolder').show();
        }
    });

    $('#countries').change(function (e) {
        e.stopPropagation();
        $('#setting_value').val(this.value);
        selectedCountry = this.value;
        var name = this.options[this.selectedIndex].text;
        if (name == "")
            name = settingName;

        $('#settingSeleted').html(formatSettingString(name));
    });

}

function configWithFlash() {
    for (var i = 0; i < continents.length; i++) {
        $('#continents').get(0).options[$('#continents').get(0).options.length] = new Option(continents[i].name, continents[i].id);
    }

    $('#continents').change(function (e) {

        e.stopPropagation();


        selectedContinent = this.value;
        continentSelected();

        $('#setting_value').val(this.value);

        if (this.value == 9 || this.value == 95 || this.value == 0) {
            $('#countries').val('0');
            $('#countryHolder').hide();
        }
        else {
            populateCountries(this.value);
            $('#countryHolder').show();
        }
    });

    $('#countries').change(function (e) {
        e.stopPropagation();
        $('#setting_value').val(this.value);
        selectedCountry = this.value;
        countrySelected();

        var name = this.options[this.selectedIndex].text;
        if (name == "")
            name = settingName;

        $('#settingSeleted').html(formatSettingString(name));
    });
}

function countrySelected() {
    flashMovie.flash(
		            function () {

		                this.countrySelected(selectedCountry);
		                
		            }
	            );
}

function continentSelected() {
    flashMovie.flash(
		            function () {
		                this.continentSelected(selectedContinent);
		                
		            }
	            );
}



function populateCountries(continentId) {

    $("select[id$=countries] > option").remove();

    var countries = null;
    for (var i = 0; i < continents.length; i++) {
        if (continents[i].id == continentId) {
            countries = continents[i].countries;
        }
    }

    $('#countries').get(0).options[$('#countries').get(0).options.length] = new Option('', '0');
    for (var j = 0; j < countries.length; j++) {
        $('#countries').get(0).options[$('#countries').get(0).options.length] = new Option(countries[j].name, countries[j].id);
    }

    if (countryToSelect > 0) {
        $('#countries').val(countryToSelect);
        countryToSelect = 0;
    }

}

function LoadContinent(continentId, continentName) {
    $('#continents').val(continentId);
    $('#setting_value').val(continentId);
    populateCountries(continentId);
}

function ContinentClicked(continent, country, continentId, countryId) {
    countryToSelect = countryId;
    $('#continents').val(continentId);
    populateCountries(continentId);

    $('#setting_value').val(countryId);

    if (continentId == 9 || continentId == 95) {
        $('#countryHolder').hide();
        $('#setting_value').val(continentId);
    }
    else {
        $('#countryHolder').show();
    }
}

function CountryOver(countryName) {
    $('#mapHoverLabel').html(countryName);
    $('#settingSeleted').html(formatSettingString(countryName));
}

function formatSettingString(s) {
    if (s.length > 16)
        return s.subString(0, 16) + "..."
    else
        return s;
}

function OnMapHover(name, id) {
    if (name == "")
        name = settingName;

    $('#mapHoverLabel').html(name);
    $('#settingSeleted').html(formatSettingString(name));
}

function OnSettingSelectionMade(id, name) {

    settingName = name;
    settingId = id;

    $('#settingSeleted').html(formatSettingString(name));
    $('#mapHoverLabel').html(name);
    $('#setting_value').val(id);
}



var rank = -1;
var currentSearchWords = "";

var _CurrentSearchWords;
var _CurrentSearchSliders;

var _Query = '';

jQuery.extend({

    WhichbookSearch: function (options) {

        var defaults = {

            query: "",
            searchType: 1,
            pageNumber: 1,
            resultsId: 'results',
            pagerTopId: 'pagerTop',
            pagerBottomId: 'pagerBottom',
            pagerStyle: 'default'

        };

        var settings = jQuery.extend(defaults, options);
        currentSearchWords = "";

        if (settings.pageNumber == 1) {
            $('#homepage').html('');
            $("#results").html("<div id='resultsLoader'></div>");
            $('#pagerBottom').html('');
            $("#subscribeToSearch a").html('');
            rank = -1;
        }
        else
            $("#more_" + (settings.pageNumber)).html("Loading ...");

        $.ajax({

            url: '/findbooks/search/AjaxHandler.ashx',
            dataType: 'json',
            data: settings.query + "&search-type=" + settings.searchType + "&cmd=search&p=" + settings.pageNumber + "&csrf=" + csrf,
            type: "GET",
            beforeSend: function () {
                var loadingStr = "<div style='padding: 30px'><img src='/assets/ajax-loader.gif' /></div>";
                $('#results').html(loadingStr);
                $('#homepage').html(loadingStr);
            },
            error: function (data) {

                $('body').html(data.responseText);
            },
            success: function (data) {


                $('#homepage').remove();

                if ($('#bookDetails').length > 0)
                    $('#bookDetails').remove();

                if (settings.pageNumber == 1) {
                    $("#" + settings.resultsId).html('');
                    $('#' + settings.pagerTopId).html('');
                    $('#' + settings.pagerBottomId).html('');
                }

                if (data != null) {

                    var searchWords = data.SearchQueryWordsString;
                    recomendedMixName = searchWords;

                    document.title = "" + searchWords + " | Whichbook";
                    currentSearchWords = searchWords;

                    var alertText = ""; //<a id=\"search_alert_link\" href=\"javascript:SubscribeToSearch()\">Create an email alert for: " + searchWords + "</a><br />";
                    //alertText += "<a id=\"search_share_link\" href=\"javascript:ShareSearchResults()\">Share search results for: " + searchWords + "</a>";

                    if (_IsMobile) {
                        alertText = "";
                    }

                    if (ugi != "") {
                        _CurrentSearchWords = searchWords;
                        _CurrentSearchSliders = data.SearchParameters.Sliders;
                    }

                    if (data.Books.length == 0) {

                        $("#results").append("<p>No matches found</p>");
                        $('#pagerBottom').find('.more_results').find('a').bind('click', function () {
                            //alert();
                        });

                    }
                    else {


                        var saveHtml = "<div id='searchWords' class='searchOptions'>";

                        if (!_IsMobile) {
                            if (ugi != "" && settings.searchType != "3") {
                                saveHtml += "<a title=\"Create a new list containing these matches\" id='searchSave' class='searchOptions' rel=\"/findbooks/lists/savesearch.aspx?searchWords=" + $.URLEncode(currentSearchWords) + "&\">Save as a list</a>";
                            }

                            if (ugi != "" && settings.searchType == "3") {
                                saveHtml += "<a id='searchSave' class='searchOptions' rel=\"/findbooks/lists/savesearch.aspx?searchWords=" + $.URLEncode("Similar to: " + data.SimilarToTitleAuthor) + "&\">Save as a list</a>";
                            }
                        }

                        saveHtml += "</div>";

                        if (settings.searchType == "3") {
                            saveHtml += "<div class='similarTo'><div class=\"similarToIcon\"></div><div class='similarToTitle'>" + data.SimilarToTitleAuthor + "</div><div class='clear'></div></div>";
                        }

                        if (settings.searchType == "4") {
                            document.title = "" + data.SimilarToTitleAuthor + " | Whichbook ";
                        }

                        if (settings.searchType == "3") {
                            document.title = "Similar books to: " + data.SimilarToTitleAuthor + " | Whichbook ";
                        }

                        $("#results").append(saveHtml);

                        var bookCount = data.Books.length;

                        $.each(data.Books, function () {
                            var htmlString = getTemplate(this, settings.searchType);
                            $("#results").append($("<div class='resultItem result" + this["ContentID"] + "'></div>").html(htmlString));
                        });

                        _Query = settings.query + "&search-type=" + settings.searchType + "&cmd=search&p=" + (settings.pageNumber) + "&searchWords=" + $.URLEncode(searchWords);


                        if (!_IsMobile) {

                            if (ugi != "" && settings.searchType != "4") {
                                $('#searchSave').cluetip({
                                    width: '350px',
                                    height: '180px',
                                    cluetipClass: 'jtip',
                                    arrows: true,
                                    dropShadow: true,
                                    hoverIntent: false,
                                    sticky: true,
                                    mouseOutClose: false,
                                    clickThrough: false,
                                    activation: 'click',
                                    showTitle: false,
                                    closePosition: 'title',
                                    titleAttribute: 'Save results as a list',
                                    positionBy: 'bottomTop',
                                    closeText: '<img src="/assets/css/images/x.png" alt="close" />',
                                    cursor: 'pointer',
                                    onShow: function () {
                                        $('.searchSavePanel').click(function (e) {
                                            e.preventDefault();
                                            e.stopPropagation();
                                            return false;
                                        });
                                        $('.searchSaveButton').click(function (e) {

                                            createMix($('#saveMixName').val(), _Query, this);
                                        });
                                        $('.searchSaveCancel').click(function (e) {
                                            $("#cluetip-close").click();
                                        });
                                    }
                                });
                            }

                            $('.profileTT').cluetip({
                                width: '420px',
                                height: '280px',
                                cluetipClass: 'jtip',
                                arrows: true,
                                dropShadow: true,
                                hoverIntent: false,
                                sticky: true,
                                mouseOutClose: false,
                                activation: 'click',
                                showTitle: false,
                                closePosition: 'title',
                                positionBy: 'bottomTop',
                                cursor: 'pointer',
                                closeText: '<img src="/assets/css/images/x.png" alt="close" />'
                            });

                            $('.shareTT').cluetip({
                                width: '150px',
                                height: '70px',
                                cluetipClass: 'jtip',
                                arrows: true,
                                dropShadow: true,
                                hoverIntent: false,
                                sticky: true,
                                mouseOutClose: false,
                                activation: 'click',
                                showTitle: false,
                                closePosition: 'title',
                                positionBy: 'bottomTop',
                                cursor: 'pointer',
                                closeText: '<img src="/assets/css/images/x.png" alt="close" />'
                            });

                            $('.extraxtTT').cluetip({
                                width: '650px',
                                height: '250px',
                                cluetipClass: 'jtip',
                                arrows: true,
                                dropShadow: true,
                                hoverIntent: false,
                                sticky: true,
                                mouseOutClose: true,
                                activation: 'click',
                                showTitle: false,
                                closePosition: 'title',
                                cursor: 'pointer',
                                positionBy: 'bottomTop',
                                closeText: '<img src="/assets/css/images/x.png" alt="close" />'
                            });

                            $('.parallelTT').cluetip({
                                width: '300px',
                                height: '150px',
                                cluetipClass: 'jtip',
                                arrows: true,
                                dropShadow: true,
                                hoverIntent: false,
                                sticky: true,
                                mouseOutClose: true,
                                activation: 'click',
                                showTitle: false,
                                closePosition: 'title',
                                positionBy: 'bottomTop',
                                cursor: 'pointer',
                                closeText: '<img src="/assets/css/images/x.png" alt="close" />'
                            });

                            if (ugi != "") {

                                $(".addToListTT").each(function () {

                                    var id = $(this).attr("name").toString().split("_")[1];
                                    $(this).cluetip({
                                        width: '280px',
                                        cluetipClass: 'jtip',
                                        arrows: true,
                                        dropShadow: true,
                                        hoverIntent: false,
                                        sticky: true,
                                        mouseOutClose: true,
                                        activation: 'click',
                                        showTitle: false,
                                        cursor: 'pointer',
                                        mouseOutClose: false,
                                        closePosition: 'title',
                                        positionBy: 'bottomTop',
                                        closeText: '<img src="/assets/css/images/x.png" alt="close" />',
                                        ajaxSettings: {
                                            type: "POST",
                                            data: "id=" + id + ""
                                        },
                                        onShow: function () {
                                            $('.addToListPanel').click(function (e) {
                                                e.preventDefault();
                                                e.stopPropagation();
                                                return false;
                                            });
                                            $('.addToListSave').click(function (e) {
                                                addToList(this, id, $('#addtolist_listid').val());
                                            });
                                            $('.addToListCancel').click(function (e) {
                                                $("#cluetip-close").click();
                                            });

                                            $('.newListSave').click(function (e) {
                                                createNewList(this, id, $('#newListName'));
                                            });
                                            $('.newListCancel').click(function (e) {
                                                $("#cluetip-close").click();
                                            });

                                            $('.backToList').click(function (e) {
                                                $('.addToListUI').show();
                                                $('.createListUI').hide();
                                            });

                                            $('.createNewList').click(function (e) {
                                                $('.addToListUI').hide();
                                                $('.createListUI').show();
                                                $('.newListName').focus();
                                            });
                                        }
                                    });
                                });

                                if (settings.searchType == 1) {

                                    $("#subscribeToSearch").show();
                                    $("#subscribeToSearch").html(alertText);
                                }
                                else
                                    $("#subscribeToSearch").hide();
                            }
                        }

                        if (bookCount >= 10 && settings.searchType != "3") {
                            pager = "<div id=\"more_" + (parseInt(settings.pageNumber) + 1) + "\" class=\"more_results\" >";
                            if (parseInt(settings.pageNumber) > 1)
                                if ($("#more_" + (settings.pageNumber)) != null)
                                    $("#more_" + (settings.pageNumber)).remove();

                            settings.pageNumber = parseInt(settings.pageNumber) + 1;
                            pager += "   <a href=\"javascript:getMoreResults(this, '" + (settings.query) + "', '" + settings.searchType + "', '" + (parseInt(settings.pageNumber)) + "')\">More results ...</a> ";
                            pager += "</div> ";
                            $('#pagerBottom').append("<div class='pager'>" + pager + "<div class='clear'></div></div>");
                        }
                        var saveHtm = '';
                        if (ugi.length > 0 && settings.searchType != "3") {
                            saveHtm = "<a id=\"btnSaveSearch\" href=\"javascript: saveMix()\">Save results as a Mix</a> ";
                        }
                        $('#pagerTop').html(saveHtm + "<div class='clear'></div>");
                    }
                }
            }
        });

        function getImage(url) {

            if (url != null)
                if (url.length == 0)
                    return "<div class='bookCover'><img src='/assets/css/images/nocoverx118.gif' /></div>";

            return "<div class='bookCover'><img src='" + url + "' /></div>";
        }

        function formatParallel(title, author, id) {
            if (id > 0) {
                return "<p><a href='/book/?id=" + id + "'>" + title + " by " + author + "</a></p>";
            }
            else {
                return "<p>" + title + " by " + author + "</p>";
            }
        }


    }

});


function getTemplate(data, searchType) {

    var imageUrl = data["ImageUrl"];
    var ASIN = data["ASIN"];
    var contentId = data["ContentID"];

    var html = [];

    html.push("<div class=\"resultItem result" + contentId + "\"><a name=\"book_" + contentId + "\"></a>");
    html.push("<div class=\"resultItemImage\">");

    if (imageUrl != "")
        html.push("<img src=\"/assets/images/big/" + contentId + ".jpg\" onerror=\"ImgError(this)\" />");
    else
        html.push("<img class=\"nocoverx118\" src='/assets/css/images/no-book-cover.gif' />");

    html.push("<div class=\"buyBorrowButton buttonBorrow\" onclick=\"borrow(" + contentId + ")\">Borrow</div>");

    if (ASIN != null) {
        html.push("<a class=\"buyBorrowButton buttonBuy\" target=\"_blank\" href=\"/findbooks/buy/?id=" + contentId + "\" onclick=\"buy(" + contentId + ")\">Buy</a>");
        html.push("<img src=\"http://www.assoc-amazon.co.uk/e/ir?t=whichbooknet-21&l=as2&o=2&a=" + ASIN + "\" width=\"1\" height=\"1\" ");
        html.push("     border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />");
    }

    html.push("</div>");

    html.push("<div class='book'>")

    if (data["Audio"] == "True" || data["EBook"] == "True" || data["LargePrint"] == "True") 
    {
        html.push("<div class=\"media\">");
        if (data["Audio"] == "True")
            html.push("<div class=\"audioBook\">audio</div>");
        if (data["EBook"] == "True")
            html.push("<div class=\"eBook\">ebook</div>");
        if (data["LargePrint"] == "True")
            html.push("<div class=\"largePrint\">large print</div>");
        html.push("</div>");
    }

    html.push("<h2 class='title' id='title_" + contentId + "'>" + data["Title"] + "</h2>");
    html.push("<h2 class=\"author\" id='author_" + contentId + "'>by " + data["Author"] + "</h2>");
    html.push("<div class='bookBar'></div>");


    //html.push("<h1 style='font-size: small; color: red;'>Audio=" + data["Audio"] + " | LargePrint=" + data["LargePrint"] + " | EBook=" + data["EBook"] + "</h1>");

    // /findbooks/book/profile/?id=9322

    html.push("<div class='review' id=\"review_" + contentId + "\">" + data["Review"] + "</div>");

    if (!_IsMobile) {
        html.push("<div class=\"bookLinkBar\">");

        html.push("<a class=\"extraxtTT\" href=\"/findbooks/extracts/default.aspx?id=" + contentId + "\" rel=\"/findbooks/extracts/default.aspx?id=" + contentId + "\">Extract</a> ");
        html.push(" ");

        html.push(" <a class=\"parallelTT\" href=\"/findbooks/book/parallels/snippet.aspx?id=" + contentId + "\" rel=\"/findbooks/book/parallels/snippet.aspx?id=" + contentId + "\" >Parallels</a>");
        html.push(" ");

        html.push(" <a class=\"profileTT\" href=\"/findbooks/book/profile/?id=" + contentId + "\" rel=\"/findbooks/book/profile/?id=" + contentId + "\" >Profile</a>");
        html.push(" ");

        if (ugi != "") {
            html.push("  <a class=\"addToListTT\" href=\"/findbooks/lists/addtolist.aspx\" rel=\"/findbooks/lists/addtolist.aspx\" name=\"addtolist_" + contentId + "\">Add to list</a>");
        }

        html.push(" <a href=\"#cmd=search&search-type=3&id=" + contentId + "\">Find similar</a>"); // javascript:doSimilarSearch(" + contentId + ")     showSimilarBooks
        html.push(" ");

        html.push("  <a class=\"shareTT\" href=\"/findbooks/share/shareoptions.aspx?id=" + contentId +
                    "\" rel=\"/findbooks/share/shareoptions.aspx?id=" + contentId + "\" id=\"share_" + contentId + "\">Share</a>");

        html.push("</div>");
    }
    html.push("</div>");
    html.push("<div class=\"clear\"></div>");
    html.push("</div>");

    var htmlString = html.join("");

    if (searchType == "1") {

        var rank2 = data["Rank"];
        var rankHtml = "";
        if (rank2 != rank) {
            if (rank2 < 3) {
                rankHtml = "<h2 class=\"rank rank_" + rank2 + "\">" + getRankName(rank2) + "</h2>";
                rank = rank2;
                htmlString = rankHtml + htmlString;
            }
        }
    }

    return htmlString;
}

function getMoreResults(loader, query, type, pageNumber) {

    _Query = query + "search-type=" + type + "&cmd=search&p=" + (pageNumber) + "&searchWords=" + $.URLEncode(currentSearchWords);

    $.ajax({
        url: '/findbooks/search/AjaxHandler.ashx',
        dataType: 'json',
        data: query + "&search-type=" + type + "&cmd=search&p=" + pageNumber,
        type: "GET",
        beforeSend: function () {
            $(loader).html("Loading ...");
        },
        error: function (data) {
            $('body').html(data.responseText);
        },
        success: function (data) {

            if (data != null) {

                if (data.Books.length == 0) {

                    $("#results").append("<p>No matches found</p>");

                }
                else {

                    var bookCount = data.Books.length;

                    $.each(data.Books, function () {

                        var htmlString = getTemplate(this);

                        $("#results").append($("<div class='resultItem result" + this["ContentID"] + "'></div>").html(htmlString));

                    });

                    if (!_IsMobile) {

                        $('.shareTT').cluetip({
                            width: '150px',
                            height: '70px',
                            cluetipClass: 'jtip',
                            arrows: true,
                            dropShadow: true,
                            hoverIntent: false,
                            sticky: true,
                            mouseOutClose: true,
                            activation: 'click',
                            showTitle: false,
                            closePosition: 'title',
                            positionBy: 'bottomTop',
                            cursor: 'pointer',
                            closeText: '<img src="/assets/css/images/x.png" alt="close" />'
                        });

                        $('.profileTT').cluetip({
                            width: '420px',
                            height: '280px',
                            cluetipClass: 'jtip',
                            arrows: true,
                            dropShadow: true,
                            hoverIntent: false,
                            sticky: true,
                            mouseOutClose: false,
                            activation: 'click',
                            showTitle: false,
                            closePosition: 'title',
                            positionBy: 'bottomTop',
                            cursor: 'pointer',
                            closeText: '<img src="/assets/css/images/x.png" alt="close" />'
                        });

                        $('.extraxtTT').cluetip('destroy');
                        $('.extraxtTT').cluetip({
                            width: '650px',
                            height: '250px',
                            cluetipClass: 'jtip',
                            arrows: true,
                            dropShadow: true,
                            hoverIntent: false,
                            sticky: true,
                            mouseOutClose: true,
                            activation: 'click',
                            showTitle: false,
                            closePosition: 'title',
                            positionBy: 'bottomTop',
                            cursor: 'pointer',
                            closeText: '<img src="/assets/css/images/x.png" alt="close" />'
                        });

                        $('.parallelTT').cluetip('destroy');
                        $('.parallelTT').cluetip({
                            width: '300px',
                            height: '150px',
                            cluetipClass: 'jtip',
                            arrows: true,
                            dropShadow: true,
                            hoverIntent: false,
                            sticky: true,
                            mouseOutClose: true,
                            activation: 'click',
                            showTitle: false,
                            closePosition: 'title',
                            positionBy: 'bottomTop',
                            cursor: 'pointer',
                            closeText: '<img src="/assets/css/images/x.png" alt="close" />'
                        });


                        if (ugi != "") {

                            $(".addToListTT").each(function () {

                                var id = $(this).attr("name").toString().split("_")[1];

                                $(this).cluetip('destroy');

                                $(this).cluetip({
                                    width: '280px',
                                    cluetipClass: 'jtip',
                                    arrows: true,
                                    dropShadow: true,
                                    hoverIntent: false,
                                    sticky: true,
                                    mouseOutClose: true,
                                    activation: 'click',
                                    cursor: 'pointer',
                                    showTitle: false,
                                    closePosition: 'title',
                                    positionBy: 'bottomTop',
                                    closeText: '<img src="/assets/css/images/x.png" alt="close" />',
                                    ajaxSettings: {
                                        type: "POST",
                                        data: "id=" + id + ""
                                    },
                                    onShow: function () {
                                        $('.addToListPanel').click(function (e) {
                                            e.preventDefault();
                                            e.stopPropagation();
                                            return false;
                                        });
                                        $('.addToListSave').click(function (e) {
                                            addToList(this, id, $('#addtolist_listid').val());
                                        });
                                        $('.addToListCancel').click(function (e) {
                                            $("#cluetip-close").click();
                                        });

                                        $('.newListSave').click(function (e) {
                                            createNewList(this, id, $('#newListName'));
                                        });
                                        $('.newListCancel').click(function (e) {
                                            $("#cluetip-close").click();
                                        });

                                        $('.backToList').click(function (e) {
                                            $('.addToListUI').show();
                                            $('.createListUI').hide();

                                        });

                                        $('.createNewList').click(function (e) {
                                            $('.addToListUI').hide();
                                            $('.createListUI').show();
                                            $('.newListName').focus();
                                        });

                                    }
                                });

                            });

                        }
                    }

                    $("#more_" + pageNumber).remove();

                    if (bookCount >= 10) {

                        pager = "<div id=\"more_" + (parseInt(pageNumber) + 1) + "\" class=\"more_results\">";

                        if (parseInt(pageNumber) > 1)
                            if ($("#more_" + (pageNumber)) != null)
                                $("#more_" + (pageNumber)).remove();

                        pageNumber = parseInt(pageNumber) + 1;
                        pager += "   <a href=\"javascript:getMoreResults(this, '" + (query) + "', '" + type + "', '" + (parseInt(pageNumber)) + "')\">More results ...</a> ";
                        pager += "</div> ";

                        $("#pagerBottom").html('');
                        $("#pagerBottom").append("<div class='pager'>" + pager + "<div class='clear'></div></div>");

                    }

                }

            }
        }
    });

}

function urlEncode(s) {
    if (s != null)
        return decodeURIComponent(s.replace(/\+/g, '%20'));
    else
        return "";
}

function getRankName(rank) {
    switch (rank) {
        case 0:
            return "Best matches";
        case 1:
            return "Good matches";
        case 2:
            return "Fair matches";
        default:
            return "";
    }
}

function htmlEncode(value) {
    return $('<div/>').text(value).html().replace("'", "\\'");
}

function htmlDecode(value) {
    return $('<div/>').html(value).text(); //.replace("\'", "'");
}

