var FULL_PAGE_NAVIGATOR_TEMPLATE = '' +
    '<table id="{id}" class="page_navigator" cellpadding="0" cellspacing="0">' +
        '<tr>' +
        '</tr>' +
    '</table>';

var LNG_PAGINATOR = new Object();
LNG_PAGINATOR.NEXT = "Next &raquo;";
LNG_PAGINATOR.PREV = "&laquo; Prev";

function changePage(formName, newPage)
{
    var form = document.getElementById(formName);
    form.page.value = newPage;
    form.submit();
}

var g_pageNavigators = new Object();

function InitPageNavigator(idPageNavigator, idPrevPage, idNextPage, idPageLabel, changePageHandler, showHandler, hideHandler)
{
    var pageNavigator = new Object();
    pageNavigator.id = idPageNavigator;
    pageNavigator.prevPage  = idPrevPage;
    pageNavigator.nextPage  = idNextPage;
    pageNavigator.pageLabel = idPageLabel;
    pageNavigator.onChange  = changePageHandler;
    pageNavigator.onShow    = showHandler;
    pageNavigator.onHide    = hideHandler;
    pageNavigator.page      = 1;
    
    GetElement(idPrevPage).onclick = function(){ OnGotoPrevPage(idPageNavigator); return false; };
    GetElement(idNextPage).onclick = function(){ OnGotoNextPage(idPageNavigator); return false; };
    
    g_pageNavigators[idPageNavigator] = pageNavigator;
}

function SetPageItems(idPageNavigator, countItems, itemsPerPage)
{
    var pageNavigator = g_pageNavigators[idPageNavigator];
    
    pageNavigator.countItems   = countItems;
    pageNavigator.itemsPerPage = itemsPerPage;
    
    UpdatePage(idPageNavigator, pageNavigator.page);
}

function OnGotoPrevPage(idPageNavigator)
{
    var pageNavigator = g_pageNavigators[idPageNavigator];
    OnChangePage(idPageNavigator, pageNavigator.page - 1);
}

function OnGotoNextPage(idPageNavigator)
{
    var pageNavigator = g_pageNavigators[idPageNavigator];
    OnChangePage(idPageNavigator, pageNavigator.page + 1);
}

function OnChangePage(idPageNavigator, page)
{
    UpdatePage(idPageNavigator, page);

    var pageNavigator = g_pageNavigators[idPageNavigator];
    pageNavigator.onChange(page);
}

function UpdatePage(idPageNavigator, page)
{
    var pageNavigator = g_pageNavigators[idPageNavigator];
    pageNavigator.page = page;
    
    var countItems   = pageNavigator.countItems;
    var itemsPerPage = pageNavigator.itemsPerPage;
    
    var countPages = Math.ceil(countItems / itemsPerPage);
    if (countPages == 0)
        countPages = 1; 
        
    if (pageNavigator.pageLabel)
    {
        var beginIndex = (page - 1) * itemsPerPage + 1;
        var endIndex   = page * itemsPerPage;
        if (endIndex > countItems)
            endIndex = countItems;
    
        GetElement(pageNavigator.pageLabel).innerHTML = beginIndex + "-" + endIndex + " of " + countItems;
        GetElement(pageNavigator.pageLabel).style.visibility = (countPages == 1 ? "hidden" : "");
    }
    
    GetElement(pageNavigator.prevPage).style.visibility = (page == 1 ? "hidden" : "");
    GetElement(pageNavigator.nextPage).style.visibility = (page == countPages ? "hidden" : "");
    
    if (pageNavigator.onShow && countPages > 1)
    {
    	pageNavigator.onShow();
    }
    
    if (pageNavigator.onHide && countPages == 1)
    {
    	pageNavigator.onHide();
    }
}

function GetPage(idPageNavigator)
{
    var pageNavigator = g_pageNavigators[idPageNavigator];
    return pageNavigator.page;
}

function CreateFullPageNavigator(idContainer, idPageNavigator, countPages, changePageHandler)
{
    GetElement(idContainer).innerHTML = ParseTemplate(FULL_PAGE_NAVIGATOR_TEMPLATE, {id:idPageNavigator});
    var pageNavigator = GetElement(idPageNavigator);
    pageNavigator.visiblePages = 6;
    pageNavigator.countPages   = countPages;
    pageNavigator.onChange     = changePageHandler;
    
    UpdateFullPageNavigator(idPageNavigator, 1);

    return pageNavigator;
}

function SetFullPageNavigatorShowPrev(idPageNavigator, isShow)
{
    var pageNavigator = GetElement(idPageNavigator);
    if (pageNavigator)
        pageNavigator.showPrev = isShow;
}

function SetFullPageNavigatorShowNext(idPageNavigator, isShow)
{
    var pageNavigator = GetElement(idPageNavigator);
    if (pageNavigator)
        pageNavigator.showNext = isShow;
}

function SetFullPageNavigatorShowLastElement(idPageNavigator, isShow)
{
    var pageNavigator = GetElement(idPageNavigator);
    if (pageNavigator)
        pageNavigator.showLast = isShow;
}

function SetFullPageNavigatorCountVisiblePages(idPageNavigator, countVisiblePages)
{
	var pageNavigator = GetElement(idPageNavigator);
    if (pageNavigator)
    	pageNavigator.visiblePages = countVisiblePages;
}

function SetFullPageNavigatorCustomSettings(idPageNavigator, isShowPrev, isShowNext, isShowLast, alwaysShowPrev, alwaysShowNext)
{
    var pageNavigator = GetElement(idPageNavigator);
    if (pageNavigator)
    {
        pageNavigator.showPrev = isShowPrev;
        pageNavigator.showNext = isShowNext;
        pageNavigator.showLast = isShowLast;
        
        pageNavigator.alwaysShowPrev = alwaysShowPrev;
        pageNavigator.alwaysShowNext = alwaysShowNext;
    }
}

function UpdateFullPageNavigator(idPageNavigator, currentPage)
{
    var pageNavigator = GetElement(idPageNavigator);
    var visiblePages  = pageNavigator.visiblePages;
    var countPages    = pageNavigator.countPages;
    
    pageNavigator.currentPage = currentPage;

    var pages = new Array();
    pages.push(1);
    
    var startPage = Math.floor(currentPage - visiblePages / 2);
    startPage = startPage <= 1 ? 2 : startPage;
    
    var endPage = startPage + visiblePages;
    if (endPage >= countPages)
    {
        startPage = startPage - (endPage - (countPages - 1));
        startPage = startPage <= 1 ? 2 : startPage;

        endPage = countPages;
    }
    
    if (startPage != 2)
        pages.push(0);
    
    for (var i = startPage; i <= endPage; ++i)
        pages.push(i);
        
    if (endPage != countPages)
        pages.push(0);
        
    if(pageNavigator.showLast && endPage < countPages)
        pages.push(countPages);

    pageNavigator.deleteRow(0);
    var row = pageNavigator.insertRow(0);

    if (pageNavigator.showPrev && (currentPage > 1 || pageNavigator.alwaysShowPrev))
    {
        var td = row.insertCell(0);
        if (currentPage > 1)
        	td.innerHTML = '<a href="javascript:OnSelectPage(\'' + idPageNavigator + '\', ' + (currentPage - 1) + ')">' + LNG_PAGINATOR.PREV  + '</a>';
        else
        	td.innerHTML = '<span class="disabled">' + LNG_PAGINATOR.PREV + '</span>';
    }

    for (i = 0; i < pages.length; ++i)
    {
        var td = row.insertCell( row.cells.length );
        if (pages[i] == 0)
            td.innerHTML = "...";
        else if (pages[i] != currentPage)
            td.innerHTML = '<a href="javascript:OnSelectPage(\'' + idPageNavigator + '\', ' + pages[i] + ')">' + pages[i] + '</a>';
        else
        {
            td.className = "selected";
            td.innerHTML = pages[i];
        }
    }

    if (pageNavigator.showNext && (currentPage < countPages || pageNavigator.alwaysShowNext))
    {
        var td = row.insertCell( row.cells.length );
        if (currentPage < countPages)
        	td.innerHTML = '<a href="javascript:OnSelectPage(\'' + idPageNavigator + '\', ' + (currentPage + 1) + ')">' + LNG_PAGINATOR.NEXT  + '</a>';
        else
        	td.innerHTML = '<span class="disabled">' + LNG_PAGINATOR.NEXT + '</span>';
    }
}

function SetFullPageNavigatorCountPages(idPageNavigator, countPages)
{
    var pageNavigator = GetElement(idPageNavigator);
    pageNavigator.countPages = countPages;
    
    UpdateFullPageNavigator(idPageNavigator, pageNavigator.currentPage);
}

function OnSelectPage(idPageNavigator, page)
{
    var pageNavigator = GetElement(idPageNavigator);
    pageNavigator.currentPage = page;
    pageNavigator.onChange(page);
    
    UpdateFullPageNavigator(idPageNavigator, page);
}

