var hist = [];
var historyIndex = 0;
var historyFlag = false;
var scrollQuantum = 35;
var bookmarkMaxLen = 100;

var pages = new Array(0, 0, 1, 2, 3, 4);
var firstTimeShow = true;
var extra_h = 63; //поля, паддинги и бордеры на картинку
var down_count = 3;
var up_count = 2;
var center_pos = 2;
var total_count = 6;

var zoom = 100;
var zoomPercent = [50, 70, 90, 100, 120, 150, 175, 200, 250, 300];
var zoomIndex = 4;

var bookmarks = new Array(totalpages+1);
//массив прямого доступа с закладками
var visited = new Array(totalpages+1);
//посещённые страницы

var titleText = '';

var outerAction = false;
var showHint = true;

/*
 * Функция, которая вызывается по завершению загрузки страницы и инициализирует читалку
 */
function initReader() {

    var i;
    //Инициализируем опции для выбора зума
    for (i = 0; i < zoomPercent.length; i++) {
        var selected = zoomPercent[i] == 100 ? 'selected' : '';
        $("#tb_zoom").append("<option value='" + zoomPercent[i] + "'" + selected + ">" + zoomPercent[i] + "%</option>");
    }

    //Инициализируем закладки
    for (i = 0; i <= totalpages; i++) {
        bookmarks[i] = '';
        visited[i] = false;
    }

    //Задаем размеры читалки
    setReaderHeight();

    //Устанавливаем слайдер
    $("#right").slider({
        animate: 200,
        orientation: "vertical",
        range: "max",
        min: 1,
        max: totalpages,
        value: totalpages,
        slide: changePageTitle,
        create: changePageTitle,
        change: changeScrollbar,
        stop: function(event, ui) {
            var newPage = totalpages - ui.value + 1;
            if (newPage != pages[center_pos])
                setCentralPage(newPage, 'l', false);
        }
    });


    //Задаем реакцию на прокрутку мышью
    $("#center").mousewheel(function(event, delta) {
        var nou = 0;
        if ($.browser.opera) delta = -delta;
        if (delta > 0) {
            nou = -scrollQuantum;
        }
        else if (delta < 0) {
            nou = scrollQuantum;
        }

        checkPageChange(this, nou);
    });

    //Элемент управления слайдера. Нужно чтобы фокус переходил всегда на него! Реализуем это просто следующим образом:
    //по завершении работы с элементов управления (любым, что есть на странице - передаем фокус слайдеру)
    var sliderHead = $("#right > a.ui-slider-handle");

    //Определяем, что должно происходит по изменении соответствующих selectBox'ов
    $("select#tb_zoom").selectBox().change(function() {
        zoom = $(this).val();
        applyZoom();
        sliderHead.focus();
    });

    $("#tb_search").click(function(event) {
        event.stopPropagation();
    });

    $("#tb_search").change(function() {
        sliderHead.focus();
    });

    //Что происходит по изменении текста в инпут-поле для страницы
    $("#tb_page").change(function() {
        var page = $(this).val();
        page = parseInt(page);
        if (!isNaN(page)) {
            setCentralPage(page, "l", false);
        }
        else
        {
            page = pages[center_pos];
            $(this).val(page);
        }

        sliderHead.focus();
    });

    $("#tb_page").keyup(function(event)
    {
        if (event.keyCode == $.ui.keyCode.ESCAPE)
        {
            $(this).val(pages[center_pos]);
            sliderHead.focus();

        }       
    });

    var startDragY = 0;
    var startDragX = 0;
    $("#center").draggable({
        axis: "x",
        scroll: false,
        containment: "#center",
        cursor: "move",
        start: function(event, ui) {
            startDragY = event.clientY;
            startDragX = event.clientX;
        },
        drag: function(event, ui) {
            var differenceY = -(event.clientY - startDragY);
            var differenceX = event.clientX - startDragX;
            startDragY = event.clientY;
            startDragX = event.clientX;

            checkPageChange(this, differenceY);
            if (650*zoom/100 > $("#center").width())
            {
                var oldLeft = ui.helper.scrollLeft();
                var newLeft = oldLeft - differenceX;
                ui.helper.scrollLeft(newLeft);
            }
        }
    });
    
    if (showHint)
        $("#dialog-hint").dialog({position: ['left', 'bottom'], minHeight: 50, minWidth: 300, maxWidth: 300,
            draggable: false, resizable: false});

    //По нажатии на любой див фокус переходит слайдеру
    $("div").click(function(event){
        sliderHead.focus();
    });

    //Т.к. toolbar - div, то отменяем всплывание события по шелчку на "a"
    //т.к. "a" - это элемент selectBox'a. Он передает фокус по завершении работы с ним.
    $("#toolbar > a").click(function(event) {
        event.stopPropagation();
    });

    //C input'ом таже ситуация, что и с "a"
    $("#toolbar > input").click(function(event) {
        event.stopPropagation();
    });

    $("#read_header div.title span").click(function(event) {
        event.stopPropagation();
    })

    sliderHead.focus();
    $("#tiptip_holder").bind("mouseleave", function(){closeTiptip()});
    
    if (authorize) {
    $.post(ajaxURL+"Bookmark/List", {book: book}, function (data) {
        if (data != "Not authenticated") {
            bms = data;
            for (i = 0; i < bms.Bookmarks.length; i++) {
                normValue = bms.Bookmarks[i].Page;
                posValue = Math.max(normValue * 100 / totalpages - 0.3, 0);                
                addBookmark(normValue, posValue, bms.Bookmarks[i].Content);
            }
        } //получаем массив закладок        
    }, "json");
    }
    
    titleText = $("#title").text().trim();

    $(window).hashchange(function() {        
        var hash = location.hash;
        var pageNum = hash.substr(1); //maybe add some more preprocessing
        outerAction = true;
        setCentralPage(pageNum, 'l', true);
        outerAction = false;
    })
}

//Создание красивых select'ов
function initBeautySelect() {
    $("SELECT").selectBox('destroy');
    $("SELECT").selectBox();
    $("SELECT").selectBox('settings', {
        'menuTransition': 'fade',
        'menuSpeed' : 'fast'
    });
}

function setBlackDiv(obj) {

    $(obj).parent().find("div.notLoad").remove();
    var page = $(obj).attr("page");
    var divWidthAdd = 44;
    var divWidth = 650*zoom/100 + divWidthAdd;
    var divLeft = ($("#center").width() - divWidth)/2;
    divLeft = divLeft > 0 ? divLeft : 0;
    var divHeight = Math.round(h[page - 1] * zoom / 100);
    var blackDiv = $('<div class="notLoad" style="left: ' + divLeft + 'px; width: ' + divWidth + 'px; height: ' + divHeight + 'px;"></div>');
    
    var innerBlackDivFirst = $("<div style='position: absolute;padding-left:20px;padding-right:20px;'>"+lang[$(obj).attr("errorType")]+"</div>");
    var innerBlackDivSecond = innerBlackDivFirst.clone();
    var innerBlackDivThird = innerBlackDivFirst.clone();

    innerBlackDivFirst.css("top", 25);
    innerBlackDivSecond.css("top", divHeight/2);
    innerBlackDivThird.css("bottom", 25);
    blackDiv.append(innerBlackDivFirst);
    if (zoom >= 90)
        blackDiv.append(innerBlackDivSecond);
    if (zoom >= 70)
        blackDiv.append(innerBlackDivThird);

    $(obj).parent().append(blackDiv);

}

function setReaderHeight() {
    var h = document.documentElement.clientHeight;
    var w = document.documentElement.clientWidth;
    
    $("#right").css("left", Math.max(w - 56, 973));
    $("#right").css("height", h - 130);
    $("#read_body").css("height", h - 115);

    $("#center").css("height", h - 105);
    $("#center").css("width", w - 329);

    $("#toolbar").css("width", Math.max($("#mainWrapper").width() - 200, 770));

    $(".transparent").css("width", $("#center").width()+5);
    $(".transparent-down").css("width", $("#center").width()+5);
    $("#track td").css("height", h - 120);

    var w2 = w - 210 - 458 - 85;
    $("#tb_search").css("width", Math.max(w2, 278));


    $('img.notLoad').each(function(){setBlackDiv(this);});

    initBeautySelect();
    closeTiptip();
    $(".visited").each(function(){
        visHeight = Math.ceil($(this).attr("hgh")*$("#right").height()/100);           
        if (visHeight < 2) visPixels = 0;
        else visPixels = visHeight;
        $(this).css("height", visPixels+"px");
    });
}

function getImageAddress(page, size) {
    if (1 > page || page > totalpages)
        return "";
    return "/page/"+book+","+page+","+size;
}
 
 var current_page_load = false;
 var current_page_error = false;
 //как выяснилось, по вместе с onerror возникает также и onload, поэтому current_page_load будет установлен
 //в true в любом случае, так что нужен дополнительный флаг
 
function setCentralPage(page, size, fromHistory, newScrollTop) {
    var prev = pages[center_pos];
    var first = pages[0];
    var last = pages[total_count - 1];
    page = parseInt(page);
    if (fromHistory)
        historyFlag = true;

    if (!isNaN(page)) {
        if (page > totalpages) page = totalpages;
        if (page < 1) page = 1;
    }
    else
    {
        page = pages[center_pos];
    }

   if (page == prev && !firstTimeShow) return;

    if (page != 0) {
    	firstTimeShow = false;
        pages[center_pos] = page;
        var new_size = 650 * (zoom / 100);

        var i;
        for (i = 1; i <= up_count; i++) {
            if (page - i > 0) pages[center_pos - i] = page - i;
            else pages[center_pos - i] = 0;
        }
        for (i = 1; i <= down_count; i++) {
            if (page + i <= totalpages) pages[center_pos + i] = page + i;
            else pages[center_pos + i] = 0;
        }

        var hp, hi, j;
        //устанавливаем страницы
        if (pages[center_pos] == prev + 1) {
            if (first > 0)
                $('#read_body > #center > div:first').remove();
            j = pages[center_pos + down_count];
            hp = (j > 0) ? h[j - 1] * zoom / 100 + extra_h : 0;
            hi = (j > 0) ? h[j - 1] * zoom / 100 : 0;
            if (j > 0)
                $('#read_body > #center').
                        append('<div style="height:'+hp+'px; min-height: ' + hp + 'px;"><img src="' + getImageAddress(j, size) + '" id="page' + j + '" style="width:' + new_size + 'px; height: ' + hi + 'px;" onerror="loadMiniPage(this, ' + j + ', 1)" /></div>');
        } //вперёд
        else if (pages[center_pos] == prev - 1) {
            if (last > 0)
                $('#read_body > #center > div:last').remove();
            j = pages[center_pos - up_count];
            hp = (j > 0) ? h[j - 1] * zoom / 100 + extra_h : 0;
            hi = (j > 0) ? h[j - 1] * zoom / 100 : 0;
            if (j > 0)
                $('#read_body > #center').
                        prepend('<div style="height:'+hp+'px; min-height: ' + hp + 'px;"><img src="' + getImageAddress(j, size) + '" id="page' + j + '" style="width:' + new_size + 'px; height: ' + hi + 'px;" onerror="loadMiniPage(this, ' + j + ', 1)" /></div>');
        } //назад
        else {
            $('#read_body > #center').html("");
            
            for (i = 0; i < total_count; i++) {
                j = pages[i];
                hp = (j > 0) ? h[j - 1] * zoom / 100 + extra_h : 0;
                hi = (j > 0) ? h[j - 1] * zoom / 100 : 0;
                if (j > 0)
                    $('#read_body > #center').
                            append('<div id="dynamic_'+j+'" style="height:'+hp+'px; min-height: ' + hp + 'px;"></div>');
            }

            j = pages[center_pos];
            hp = (j > 0) ? h[j - 1] * zoom / 100 + extra_h : 0;
            hi = (j > 0) ? h[j - 1] * zoom / 100 : 0;
            if (j > 0)
                $('#dynamic_'+j).
                    append('<img src="' + getImageAddress(j, size) + '" id="page' + j + '" style="width:' + new_size + 'px; height: ' + hi + 'px;" onerror="current_page_error=true;loadMiniPage(this, ' + j + ', 1)" onload="current_page_load=true;" />');
            time_interval = setInterval(function(){
                if (current_page_load && !current_page_error) {                     
                    clearInterval(time_interval);
                    current_page_load = false;
            
                    for (i = 1; i <= up_count; i++) {
                    j = pages[center_pos-i];
                    hp = (j > 0) ? h[j - 1] * zoom / 100 + extra_h : 0;
                    hi = (j > 0) ? h[j - 1] * zoom / 100 : 0;
                    if (j > 0)
                        $('#dynamic_'+j).
                            append('<img src="' + getImageAddress(j, size) + '" id="page' + j + '" style="width:' + new_size + 'px; height: ' + hi + 'px;" onerror="loadMiniPage(this, ' + j + ', 1)" />');
                    }
                    for (i = 1; i <= down_count; i++) {
                    j = pages[center_pos+i];
                    hp = (j > 0) ? h[j - 1] * zoom / 100 + extra_h : 0;
                    hi = (j > 0) ? h[j - 1] * zoom / 100 : 0;
                    if (j > 0)
                        $('#dynamic_'+j).
                            append('<img src="' + getImageAddress(j, size) + '" id="page' + j + '" style="width:' + new_size + 'px; height: ' + hi + 'px;" onerror="loadMiniPage(this, ' + j + ', 1)" />');
                    }
            }}, 40);/*
            for (i = 0; i < total_count; i++) {
                j = pages[i];
                hp = (j > 0) ? h[j - 1] * zoom / 100 + extra_h : 0;
                hi = (j > 0) ? h[j - 1] * zoom / 100 : 0;
                if (j > 0)
                    $('#read_body > #center').
                            append('<div style="height:'+hp+'px; min-height: ' + hp + 'px;"><img src="' + getImageAddress(j, size) + '" id="page' + j + '" style="width:' + new_size + 'px; height: ' + hi + 'px;" onerror="loadMiniPage(this, ' + j + ', 1)" /></div>');
            }*/
        } //по номеру

        var scrollTop = 0;
        for (i = 0; i < center_pos; i++) {
            scrollTop += (pages[i] > 0) ? h[pages[i] - 1] * (zoom / 100) + extra_h : 0;
        }

        if (newScrollTop == undefined)
            $("#read_body > #center").scrollTop(scrollTop);
        else
            $("#read_body > #center").scrollTop(newScrollTop);
        //пересчёт scrollTop

        //обновляем значения селектов, бегунков, заносим страницу в историю
        $("#tb_page").val(pages[center_pos]);
        $("#right").slider("value", totalpages - pages[center_pos] + 1);
        if (!fromHistory)
            addToHistory(pages[center_pos]);
        var oldLocation = $(location).attr('href');
        var newLocation = oldLocation.substr(0, oldLocation.indexOf('#')) + "#" + pages[center_pos];
        if (!outerAction) $(location).attr('href', newLocation);
    }
    if (!visited[page] && !bookmarks[page]) {
        visited[page] = true;
        vis_top = page;
        vis_down = page;
        while (visited[vis_top]) vis_top--;
        while (visited[vis_down]) vis_down++;
        vis_top++;
        vis_down--;
        if (vis_top != vis_down) {
            visTop = Math.min(Math.max(vis_top * 100 / totalpages - 0.3, 0),100);
            visDown = Math.min(Math.max(vis_down * 100 / totalpages, 0),100);
            visHeight = Math.ceil((visDown - visTop)*$("#right").height()/100);           
            if (visHeight < 2) visPixels = 0;
            else visPixels = visHeight;
            visHeight = visDown - visTop;
            visId = 0;
            for (i = vis_top; i <= vis_down; i++) {
                if ($("#visited"+i).length != 0) {
                    visId = i;
                    break;
                }
            }
            if (visId == 0)
                $(".ui-slider").append(
                    "<span class='visited' id='visited"+page+"' hgh='"+visHeight+"' style='top:"+visTop+"%;height:"+visPixels+"px'></span>");
            else
                $("#visited"+visId).css("top", visTop+"%").css("height", visPixels+"px").attr("hgh",visHeight);
        }
        /*
        if (visited[page-1] || visited[page+1]) {
            posValue = Math.min(Math.max(page * 100 / totalpages - 0.3, 0),100);
            $(".ui-slider").append("<span class='visited' style='top:" + posValue + "%'></span>");
        }*/
    }
    //отмечаем на слайдере
}
//установка центральной страницы

function loadMiniPage(obj, page, trynum) {
    $(obj).removeAttr('onerror');
    $(obj).unbind('error');
    if (trynum == 1) {
        $(obj).error(function(){loadMiniPage(obj, page, 2)});
        obj.src = getImageAddress(page, "l");        
    } else if (trynum == 2) {
        setTimeout(function(){
            $(obj).attr("page", page).addClass('notLoad');     
            $(obj).error(function(){loadMiniPage(obj, page, 3)});
            obj.src = getImageAddress(page, "s");
            $(obj).attr("errorType", "not_show");
            setBlackDiv(obj);
            current_page_error = false;
        }, 1000);
    } else {
        $(obj).attr("page", page).addClass('notLoad');     
        $(obj).error(function(){});
        $(obj).attr("src", 'img/transparent.png');
        $(obj).attr("errorType", "cant_get");
        setBlackDiv(obj);
        current_page_error = false;
    }
    /*
        $(obj).attr("page", page).addClass('notLoad');     
        if (obj.src == getImageAddress(page, "s")) {
            obj.src = 'img/transparent.png';        
            $(obj).attr("src", 'img/transparent.png');
            $(obj).attr("errorType", "cant_get");
            setBlackDiv(obj);
        }
        else {
            obj.src = getImageAddress(page, "s");
            $(obj).attr("errorType", "not_show");
            setBlackDiv(obj);        
        }    
        current_page_error = false;
   */ 
}


function nextPage(newScrollTop) {
    if (pages[center_pos] < totalpages)
        setCentralPage(pages[center_pos + 1], "l", false, newScrollTop);
}

function prevPage(newScrollTop) {
    if (pages[center_pos] > 1)
        setCentralPage(pages[center_pos - 1], "l", false, newScrollTop);
}

//zoom

function applyZoom() {
    var zoom1 = zoom / 100;
    $('#read_body > #center > div > img').css("width", 650 * zoom1);
    var scrollTop = 0;
    var i;
    for (i = 0; i < center_pos; i++) {
        scrollTop += (pages[i] > 0) ? h[pages[i] - 1] * zoom1 + extra_h : 0;
    }
    for (i = 0; i < total_count; i++) {
        var p = pages[i];
        var hp = (p > 0) ? h[p - 1] * zoom1 + extra_h : 0;
        var hi = (p > 0) ? h[p - 1] * zoom1 : 0;
        $('#read_body > #center > div > img#page'+p).parent().css("height", hp);
        $('#read_body > #center > div > img#page'+p).parent().css("min-height", hp);
        $('#read_body > #center > div > img#page'+p).css("height", hi);
    }
    $("#center").scrollTop(scrollTop);

    if (650 * zoom1 > $("#center").width()) {
        var surplus = 650*zoom1 - $("#center").width();
        $("#center").scrollLeft(surplus/2);
    }
    else
        $("#center").scrollLeft(0);

    $('img.notLoad').each(function(){setBlackDiv(this);});

}

function zoomIn() {
    zoomIndex = zoomPercent.indexOf(parseInt(zoom));
    if (zoomIndex < zoomPercent.length - 1) {
        zoom = zoomPercent[zoomIndex + 1];
        $("select#tb_zoom").selectBox('value', zoom);
        applyZoom();
    }
}

function zoomOut() {
    zoomIndex = zoomPercent.indexOf(parseInt(zoom));
    if (zoomIndex > 0) {
        zoom = zoomPercent[zoomIndex - 1];
        $("select#tb_zoom").selectBox('value', zoom);
        applyZoom();
    }
}

function changePageTitle(event, ui) {
    $("#tb_page").val(totalpages - ui.value + 1);
}

function changeScrollbar(event, ui) {
    
}

function addToHistory(pageNum) {
    if (historyFlag) {
        while (hist.length - 1 > historyIndex) hist.pop();
        historyFlag = false;
    }

    hist.push(pageNum);
    historyIndex = hist.length - 1;

    if (hist.length > 1)
        if (hist[hist.length] == hist[hist.length - 1]) {
            hist.pop();
            historyIndex--;
        }
}

function historyForward() {
    if (historyIndex < hist.length - 1)
        historyIndex++;
    setCentralPage(hist[historyIndex], 'l', true);
}

function historyBackward() {
    if (historyIndex > 0)
        historyIndex--;
    setCentralPage(hist[historyIndex], 'l', true);
}

function checkPageChange(screenObject, diff)
{
    screenObject = $(screenObject);
    var returnValue = 0;
    var difference = diff + screenObject.scrollTop();
    var direction = diff/Math.abs(diff);

    //Проверяем смену страницы
    if (direction < 0) {
        var pagePosition = 0;
        for (i = 0; i < center_pos - 1; i++) {
            pagePosition += (pages[i] > 0) ? h[pages[i] - 1] * (zoom / 100) + extra_h : 0;
        }
        if (pagePosition > difference) {
            prevPage();
            returnValue = 1;
        }
        else
            screenObject.scrollTop(difference);
    }
    else if (direction > 0) {
        var pagePosition = 0;
        for (i = 0; i <= center_pos; i++) {
            pagePosition += (pages[i] > 0) ? h[pages[i] - 1] * (zoom / 100) + extra_h : 0;
        }
        //считаем высоту всех, считая текущую
        if (pagePosition <= difference) {
            nextPage();
            returnValue = -1;
        }
        else
            screenObject.scrollTop(difference);

    }

    if (returnValue != 0)
        return returnValue;

    //Проверяем смену счетчика страниц
    var eps = 50;
    var previousHeight = 0;
    var i;
    var curPagePos;
    var oldPos;
    if (direction > 0) {
        for(i = 0; i < center_pos; i++)
            previousHeight += (pages[i] > 0) ? h[pages[i] - 1] * (zoom / 100) + extra_h : 0;

        oldPos = screenObject.scrollTop();
        curPagePos = screenObject.scrollTop() - previousHeight;

        if (curPagePos >= (h[pages[center_pos] - 1] - eps)*(zoom/100)/4*3) {
            oldPos -= (pages[0] > 0) ? h[pages[0] - 1] * (zoom / 100) + extra_h : 0;
            nextPage(oldPos);
        }

    }
    else {
        for(i = 0; i < center_pos; i++)
            previousHeight += (pages[i] > 0) ? h[pages[i] - 1] * (zoom / 100) + extra_h : 0;

        oldPos = screenObject.scrollTop();
        curPagePos = -screenObject.scrollTop() + previousHeight;

        if ((curPagePos >= 0) && (curPagePos >= (h[pages[center_pos - 1] - 1] - eps)*(zoom/100)/2)){
            oldPos += (pages[0] > 1) ? h[pages[0] - 2] * (zoom / 100) + extra_h : 0;
            prevPage(oldPos);
        }
    }
    return returnValue;
}

function checkBookmarkLen()
{
    var dialogText = $("#dialog-modal-text");
    var textLen = dialogText.val().length;
    if (textLen > bookmarkMaxLen)
    {
        var text = dialogText.val().substr(0, bookmarkMaxLen);
        $("#dialog-modal-text").val(text);
        textLen = bookmarkMaxLen;
    }
    var leftSymbol = bookmarkMaxLen - textLen;
    $("#dialog-modal-leftSymbol").text(leftSymbol);
}

function addBookmarkDialog() {
     var dialog_modal_height;
     $( "#dialog:ui-dialog" ).dialog( "destroy" );
     $( "#dialog-modal" ).dialog({
        width: 500,
        height: 290,
        resizable: false,
        modal: true,
        open: function () {
            $(".ui-widget-overlay").bind("contextmenu", function(e){return false});
            tempValue = pages[center_pos];
            $("#dialog-modal-text").val(bookmarks[tempValue]);
            $("#dialog-modal-leftSymbol").text(bookmarkMaxLen);
            $("#bookmark_answer").text("");
            dialog_modal_height = $("#dialog-modal").css("height");
        },
        buttons: {
            "Ok": function() {
                normValue = pages[center_pos];
                posValue = Math.max(normValue * 100 / totalpages - 0.3, 0);
                var bookmarkText = $("#dialog-modal-text").val();
                answer = addBookmark(normValue, posValue, bookmarkText);
                //process ajax-query to add bookmark
                if (answer == lang['not_auth_bm']) {
                    $("#dialog-modal").css("height", 200);
                    $("#bookmark_answer").text(answer);
                }
                else $(this).dialog("close");
            },
            "Close": function() {
                $("#bookmark_answer").text("");
                $("#dialog-modal").css("height", dialog_modal_height);
                $(this).dialog("close");
                
            }
        }
    });
}

function addBookmark(page, pos, text, sendRequest) {
    var answer;
    if (text.length == 0) {
        bookmarks[page] = "";
        $("#bookmark"+page).remove();
        if (authorize) 
            $.post(ajaxURL+"Bookmark/Remove", {book: book, page: page}, function (data) {
                if (data == "Not authenticated") answer = lang['not_auth_bm'];
                else if (data == "ok") answer = lang['bm_remove_ok'];
            });
        else answer = lang['not_auth_bm'];
    } //удаление закладки
    else {
        if (bookmarks[page] != "") {
            bookmarks[page] = text;
            if (authorize)
                $.post(ajaxURL+"Bookmark/Edit", {book: book, page: page, content: text}, 
                    function (data) {
                        if (data == "Not authenticated") answer = lang['not_auth_bm'];
                        else if (data == "ok") answer = lang['bm_edit_ok'];
                    });
            else answer = lang['not_auth_bm'];
        } //изменение закладки       
        else {
            bookmarks[page] = text;
            $(".ui-slider").append(
                "<a href='#"+page+"' id='bookmark"+page+"' class='bookmark' style='top:" + pos + "%'></a>");
            $("#bookmark"+page).click(function(){setCentralPage(page, 'l', false)});
            if (authorize && (sendRequest == undefined))
                $.post(ajaxURL+"Bookmark/Add", {book: book, page: page, content: text}, 
                    function (data) {
                        if (data == "Not authenticated") answer = lang['not_auth_bm'];
                        else if (data == "ok") answer = lang['bm_add_ok'];
                    });
            else answer = lang['not_auth_bm'];
        }
    }
    $("#tiptip_holder").hide();
    return answer;
}

function showBookmarks(up, down) {
    $("#tiptip_holder").hide();
    $("#tiptip_content").html("");
    bm_count = 0;
    for (i = up; i <= down; i++) {
        if (bookmarks[i] != "") {
            bm_count++;
            $("#tiptip_content").append(
                "<a href='#"+i+"' onclick='setCentralPage("+i+", "+'"l"'+", false)'>"+bookmarks[i]+"</a>");
        }
    }
    if (bm_count > 0) {
        medium_count = Math.ceil(bm_count / 2.0);
        i = 0;
        j = up-1;
        while (i < medium_count) {
            j++;
            if (bookmarks[j] != "") i++;
        }
        medium = j;

        pos = $("#bookmark"+medium).offset();
        pos_right = $("#right").position();
        tt_h = $("#tiptip_holder").height() / 2;
        tt_w = $("#tiptip_holder").width();
        $("#tiptip_holder").css("top", pos.top - tt_h).css("left", pos.left-10-tt_w).show();
    }
    else {
        $("#tiptip_holder").hide();
    }
}

function closeTiptip() {
    $("#tiptip_holder").hide();
}

function proceedSpace() {
    var previousHeight = 0;
    var reader = $("#center");
    var eps = 50;

    for(var i = 0; i < center_pos; i++)
        previousHeight += (pages[i] > 0) ? h[pages[i] - 1] * (zoom / 100) + extra_h : 0;

    var curPagePos = reader.scrollTop() - previousHeight;

    if (curPagePos >= (h[pages[center_pos]] - eps)*(zoom/100)/2)
        setCentralPage(pages[center_pos] + 1, 'l', false);
    else {
        var newPagePos = previousHeight + h[pages[center_pos]]*(zoom/100)/2;
        reader.scrollTop(newPagePos);
    }
}

function titleCut()
{
    var title = $("#title");
    title.text(titleText);
    var toolbarWidth = $("#toolbar").width();

    if (title.width() <= toolbarWidth)
        return;
    
    for(var i = 0; title.width() > toolbarWidth; i++)
    {
        var newText = titleText.substr(0, titleText.length - i) + '...';
        title.text(newText);
    }
}

