/**
 * PageData Class
 * Manages page meta data
 *
 * @static
 */
Core.createNamespace('nl.code.pager');
nl.code.pager.PageData = {
    history_manager: null,

    show_loading: true,

    /**
     * Make a JSON request
     *
     * @param string, uri
     * @param Object
     * @param string, toQueryString() of a form object
     * @return void
     */
    request: function(uri, observer, data) {
        if (! $type(data)) {
            data = '';
        }

        var request = new Request({
            url: uri +'/?ajax=true&pager_file='+ $(document.body).get('id'),
            onSuccess: function(responseText, responseXML) {
                nl.code.pager.PageData.requestSuccess(observer, responseText, responseXML);
            }
        });

        if (nl.code.pager.PageData.show_loading) {
            nl.code.util.Loading.show();
        }

        request.send(data);
    },

    /**
     * @param Observer object
     * @param string, text
     * @param string, XML
     * @return void
     */
    requestSuccess: function(observer, responseText, responseXML) {
        var response = responseText.replace(/\n/g, '');
        response = response.replace(/\r/g, '');

        var json_object = JSON.decode(response);

        if (nl.code.pager.PageData.show_loading) {
            nl.code.util.Loading.hide();
        }

        observer.setContent(json_object, response);
    },

    /**
     * Make external links open in a new browser/tab
     *
     * @param root Element, the html element to scan for anchors, defaults to body
     * @param array, string of domains that do not have to open in a new window
     * @return void
     */
    parseExternalLinks: function(root, exception_arr) {
        nl.code.pager.Uri.parseExternalLinks(root, exception_arr);
    },

    /**
     * @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++) {
            if (anchor_arr[i].get('rel') == 'lightbox') {
                continue;
            }

            if (! nl.code.pager.Uri.isInternalLink(anchor_arr[i])) {
                continue;
            }

            nl.code.pager.PageData.parseAjaxLink(anchor_arr[i]);
        }
    },

    /**
     * @param Element
     * @return void
     */
    parseAjaxLink: function(anchor) {
        var href = nl.code.pager.Uri.getAnchorUri(anchor);

        anchor.addEvent('click', function(event) {
            event.stop();

            nl.code.pager.PageData.history_manager.addHistoryEntry(href);
        });
    }
};