
EngineAJAX = new Object();

EngineAJAX._hashLoadingCallback = function(content) {
    content.update('Загрузка...');
}

EngineAJAX.setHashLoadingCallback = function(callback) {
    EngineAJAX._hashLoadingCallback = callback;
}

EngineAJAX.displayOne = function (contentID, parameters, callback) {
    parameters.EngineContentID = contentID;
    parameters.EngineContentDisplayType = 'one';

    new Ajax.Request('/EngineAJAX/', {
        method: 'get',
        parameters: parameters,
        onSuccess: function(transport) {
            callback(transport.responseText);
        }/*,
        onFailure: function(){
        alert('Something went wrong...'); // @todo
        }*/
    });
};

// по умолчанию контентом будет contentID
EngineAJAX._defaultContentID = 'content-id';

EngineAJAX.setDefaultContentID = function(contentID) {
    this._defaultContentID = contentID;
}

EngineAJAX._hashTimeout = 100;

EngineAJAX.hashCurrent = '';

EngineAJAX._initLinks = function() {
    var hashPattern = /^#(.*?)!(.*?)$/;
    // проходимся по всем ссылкам с классом .EngineAJAX
    // и проставляем им обработчик
    $$('a.EngineAJAX').each(function(e) {
        if (!e.getAttribute('href').match(hashPattern)) {
            e.setAttribute('href', '#!'+e.getAttribute('href'));
            e.removeClassName('EngineAJAX');
        }
    });
}

EngineAJAX._hashTimer = function() {
    if (EngineAJAX.hashCurrent != document.location.hash) {
        EngineAJAX.hashCurrent = document.location.hash;

        // хеш поменялся
        // alert('hashchange!');

        // проверяем, чтобы хеш попадал под маску #*!***
        var hashPattern = /^#(.*?)!(.*?)$/; // @todo: можно выносить
        var hashMatches = EngineAJAX.hashCurrent.match(hashPattern);
        if (hashMatches || !EngineAJAX.hashCurrent) {
            //alert(hashMatches);

            if (!EngineAJAX.hashCurrent) {
                // если хеш поменялся на пустой
                var urlHash = '';
                hashContainerID = EngineAJAX._defaultContentID;
            } else {
                var urlHash = hashMatches[2];
                var hashContainerID = hashMatches[1];
                if (!hashContainerID) {
                    hashContainerID = EngineAJAX._defaultContentID;
                }
            }

            this._hashLoadingCallback($(hashContainerID));

            new Ajax.Request('/EngineAJAX/hash/?hash='+urlHash, {
                method: 'get',
                onSuccess: function(transport) {
                    $(hashContainerID).update(transport.responseText);

                    $(document).fire('EngineAJAX:onSuccess', {});

                    // body поменяется само - нет смысла вызывать
                    // EngineAJAX._initLinks();
                }/*,
                onFailure: function(){
                alert('Something went wrong...'); // @todo
                }*/
            });
        }
    }

    setTimeout("EngineAJAX._hashTimer();", EngineAJAX._hashTimeout);
}

EngineAJAX._bodyCurrent = '';

EngineAJAX._bodyTimer = function() {
    if (EngineAJAX._bodyCurrent != $$('body')[0].innerHTML) {
        // поменялось содержимое body
        EngineAJAX._bodyCurrent = $$('body')[0].innerHTML;

        // инициируем ссылки
        EngineAJAX._initLinks();
    }

    setTimeout("EngineAJAX._bodyTimer();", EngineAJAX._hashTimeout);
}

// как только все загрузилось
document.observe("dom:loaded", function() {
    EngineAJAX._bodyCurrent = $$('body')[0].innerHTML;

    // запускаем таймер отслеживания изменения url.hash
    EngineAJAX._hashTimer();
    EngineAJAX._bodyTimer();

    // инициируем ссылки
    EngineAJAX._initLinks();
});

document.observe("click", function(event) {
    var e = Event.element(event);
    var hashPattern = /^#(.*?)!(.*?)$/; // @todo: можно выносить
    if (e.getAttribute("href")) {
        var hashMatches = e.getAttribute("href").match(hashPattern);
        if (hashMatches) {
            // это клик по ссылке - ускоряем операцию
            EngineAJAX._hashTimer();
            Effect.ScrollTo($$('body')[0], {duration: 0});
        }
    }
});
