/**
 * PageData Class
 * Manages page meta data
 *
 * @static
 */
Core.createNamespace('nl.code.pager');
nl.code.pager.PageData = {
    /**
     * @var HistoryManager
     */
    history_manager: null,

    /**
     * Make a JSON request
     *
     * @param string, uri
     * @param Object
     * @param string, toQueryString() of a form object
     * @param Element, mostly an anchor
     * @return Request
     */
    request: function(uri, observer, data, trigger) {
        if (!$type(data)) {
            data = '';
        }

        // add a question mark
        if (uri.indexOf('?') == -1) {
            uri += '/?';
        }

        var request = new Request({
            url: uri +'ajax=true&pager_file='+ document.id(document.body).get('id'),
            onSuccess: function(responseText, responseXML) {
                nl.code.pager.PageData.requestSuccess(observer, responseText, trigger);
            }
        });

        request.send(data);

        return request;
    },

    /**
     * @param Observer object
     * @param string, text
     * @param Element
     * @return void
     */
    requestSuccess: function(observer, responseText, trigger) {
        if (observer == null) {
            return;
        }

        // remove newline characters
        var response = responseText.replace(/\n/g, '');
        response = response.replace(/\r/g, '');

        var json_object = JSON.decode(response);

        observer.setContent(json_object, response, trigger);
    },

    /**
     * @param Pager
     * @param root Element, the html element to scan for anchors
     * @return void
     */
    parseAjaxElements: function(pager, root) {
        if (! nl.code.pager.PageData.history_manager) {
            nl.code.pager.PageData.history_manager = new nl.code.pager.HistoryManager(pager);
        }

        nl.code.pager.PageData.parseAjaxLinks(root);
        nl.code.pager.PageData.parseAjaxForms(root);
    },

    /**
     * @param root Element, the html element to scan for anchors
     * @return void
     */
    parseAjaxForms: function(root) {
        var form_arr = root.getElements('form');

        for (var i = 0; i < form_arr.length; i++) {
            nl.code.pager.PageData.parseAjaxForm(form_arr[i]);
        }
    },

    /**
     * @param Element
     * @return void
     */
    parseAjaxForm: function(form) {
        var uri = form.get('action');

        var http_re = /^https?\:\/\//i;
        if (http_re.test(nl.code.pager.Uri.base_url)) {
            uri = uri.replace(nl.code.pager.Uri.base_url, '');
        }

        form.addEvent('submit', function(event) {
            event.stop();

            nl.code.pager.PageData.history_manager.addHistoryEntry(uri, this.toQueryString());
        });
    },

    /**
     * @param root Element, the html element to scan for anchors
     * @return void
     */
    parseAjaxLinks: function(root) {
        var anchor_arr = root.getElements('a');
        for (var i = 0; i < anchor_arr.length; i++) {
            var url = nl.code.pager.Uri.getAnchorUrl(anchor_arr[i]);
            var rel = anchor_arr[i].get('rel');

            if (! url) {
                continue;
            }

            if (rel && rel.indexOf('lightbox') != -1) {
                continue;
            }

            if (! nl.code.pager.Uri.isInternalUrl(url)) {
                continue;
            }

            nl.code.pager.PageData.parseAjaxLink(anchor_arr[i]);
        }
    },

    /**
     * @param Element
     * @return void
     */
    parseAjaxLink: function(anchor) {
        var href = nl.code.pager.Uri.getAnchorUrl(anchor);

        anchor.addEvent('click', function(event) {
            event.stop();

            nl.code.pager.PageData.history_manager.addHistoryEntry(href);
        });
    }
};