var pageChangeActive = true;        // flag to make page changes active
var bodyBackgroundPos = {           // initial (and current) body background pos (in pixels) for movement
    x: 0,
    y: 85
}

/**
 * Changes page (moves out current container, and moves new container instead of current )
 */
$.fn.changePage = function(settings) {
    if (!pageChangeActive) return;
    settings = $.extend({
        new_page_url:               '#',                        // url to load new page
        beforeSend:                 function(XMLHttpRequest) {},// function to execute before send
        cache:                      true,                       // cache ajax request (get new page)?
        oncomplete:                 function (XMLHttpRequest, textStatus) {},// function to execute on complete ajax request
        onerror:                    function (XMLHttpRequest, textStatus, errorThrown) {},// function to execute on wrong ajax request
        onsuccess:                  function (data, textStatus) {},// function to execute on successful ajax request
        data:                       {},                         // data to send
        dataType:                   'html',                     // response format
        type:                       'GET',                      // request method
        duration:                   500,                        // animation duration
        old_page_complete:          function() {},              // execute on old page animation stop
        new_page_complete:          function() {},              // execute on new page animation stop
        horizontal:                 'left',                     // horizontal move direction (left, none, right)
        vertical:                   'none',                     // vertical move direction (top, none, bottom)
        page_border:                300                         // additional border (for ensurence)))
    }, settings);

    pageChangeActive = false;

    var pageSize = getPageSize();
    var pageScroll = getPageScroll();

    var workContainer = $(this);
    var pageHolder = workContainer.parent();

    // don't use pageScroll - for absolute divs it isn't necessary
    $('#page_spinner').css({
        top: ((pageSize.window.height - $('#page_spinner').height()) / 2) + 'px'
    }).show();

    $.ajax({
        beforeSend:     settings.beforeSend,
        cache:          settings.cache,
        complete:       function (XMLHttpRequest, textStatus) {
            settings.oncomplete();
            pageChangeActive = true;
        },
        data:           settings.data,
        dataType:       settings.dataType,
        error:          settings.onerror,
        success:        function (data, textStatus) {
            $('body').addClass('suppress_overflow');

            /**
             * Firstly position new page under bottom-right corner of page
             * (100% invisible, even partly) and load data
             */
            var newPage = $('#new_page').css({
                left:       (pageSize.page.width + settings.page_border) + 'px',
                top:        (pageSize.page.height + settings.page_border) + 'px',
                'z-index':  500
            }).html(data);


            // start repostion and animations only when page is loaded...
            newPage.ready(function() {
                // temp vars
                var tempLeft;
                var tempTop;

                // hide spinner and counters
                $('#page_spinner').hide();
                $('#counters').hide();

                // step 1 - move new_page to its start position
                switch (settings.horizontal) {
                    case 'left':
                        tempLeft = pageSize.page.width + settings.page_border;
                        break;
                    case 'right':
                        tempLeft = -newPage.width() - settings.page_border;
                        break;
                    default:
                        tempLeft = workContainer.offset().left;
                }

                switch (settings.vertical) {
                    case 'top':
                        tempTop = pageSize.page.height + settings.page_border;
                        break;
                    case 'bottom':
                        tempTop = -newPage.height() - settings.page_border;
                        break;
                    default:
                        tempTop = workContainer.offset().top;
                }

                newPage.css({
                    left:   tempLeft + 'px',
                    top:    tempTop + 'px'
                });

                // step 2 - get background start position
                bodyBackgroundPos.x = workContainer.offset().left - tempLeft + bodyBackgroundPos.x;
                bodyBackgroundPos.y = workContainer.offset().top - tempTop + bodyBackgroundPos.y;

                // step 3 - move new page
                newPage.animate({
                    left:   workContainer.offset().left + 'px',
                    top:    workContainer.offset().top + 'px'
                }, {
                    duration: settings.duration,
                    complete: function() {
                        pageHolder.html(newPage.html());

                        newPage.removeAttr('style').html('');
                        if (globalPrepareDisplay != undefined && typeof(globalPrepareDisplay) == "function") {
                            globalPrepareDisplay();
                        };

                        // show counters on complete
                        $('#counters').show();

                        $('body').removeClass('suppress_overflow');

                        settings.new_page_complete();
                    }
                });

                // step 4 - move background
                var newBgPos = bodyBackgroundPos.x + 'px ' + bodyBackgroundPos.y + 'px';
                $('body').animate({
                    backgroundPosition: newBgPos
                }, {
                    duration: settings.duration
                });

                // step 5 - move current page
                switch (settings.horizontal) {
                    case 'left':
                        tempLeft = -workContainer.width() - settings.page_border;
                        break;
                    case 'right':
                        tempLeft = pageSize.page.width + settings.page_border;
                        break;
                    default:
                        tempLeft = workContainer.offset().left;
                }

                switch (settings.vertical) {
                    case 'top':
                        tempTop = -workContainer.height() - settings.page_border;
                        break;
                    case 'bottom':
                        tempTop = pageSize.page.height + settings.page_border;
                        break;
                    default:
                        tempTop = workContainer.offset().top;
                }

                workContainer
                    .css({                          // in two css command to execute in correct order
                        position:   'absolute',
                        left:       workContainer.offset().left + 'px',
                        top:        workContainer.offset().top + 'px',
                        'z-index':  300
                    })
                    .animate({
                        left:       tempLeft + 'px',
                        top:        tempTop + 'px'
                    }, {
                        duration: settings.duration,
                        complete: function() {
                            workContainer.remove();
                            settings.old_page_complete();
                        }
                    });

                settings.onsuccess(data, textStatus);
            }).show();
        },
        type:           settings.type,
        url:            settings.new_page_url
    });
};


/**
 * Moves page in one of possible directions on current link click (@see settings descr in function)
 */
$.fn.movePage = function(settings) {
    var container = $('#paged_container .page_paper_outer');

    $(this).click(function() {
        container.changePage(settings);
    });

    return this;
};
