function Results(resultsElement) {
    this.updateResults = function(apiRequest) {
        showLoader();
        performQuery(apiRequest);
    }

    function showLoader() {
       resultsElement.html('<div class="loader"><img src="/img/ajax-loader.gif"/></div>');
    }

    function showResults(apiRequest, response) {
        if (response.response && response.response.status == "error") {
            displayError(response.response.message);
        } else {
            var format = apiRequest.getParam("format");
            var brushType = format === "xml" ? "xml" : "js";
            // display results
            var formatted = prettyPrint(response, format);
            resultsElement.html("<pre class=\"brush: " + brushType + "\"></pre>");
            if (brushType === "xml") {
                resultsElement.find("pre").html(formatted)
            } else {
                resultsElement.find("pre").text(formatted)
            }
            SyntaxHighlighter.highlight();

            // make API links in results perform a new search in the explorer as opposed to link to the API
            $(".apiLink").attr('title', 'Open in api explorer');
            $(".apiLink").tooltip();

            $(".apiLink").click(function() {
                return convertToApiLink($(this));
            });
        }
    }

    function convertToApiLink(anchor) {
         var href = anchor.attr("href");
         var newQuery = new ApiQuery();
         newQuery.updateFromApiUrl(href);

        // we're already on this page
        if (newQuery.toString() == $.param.fragment()) return false;

        anchor.attr("href", "#" + newQuery.getPath());

        return true;
    }

    function handleError(XMLHttpRequest, textStatus, errorThrown) {
        displayError(XMLHttpRequest.status + ": " + XMLHttpRequest.statusText);
    }

    function performQuery(apiQuery) {
        $("#queryInput").val($.URLDecode(apiQuery.toString()));
        apiQuery.getResults(showResults, handleError);
    }

    function prettyPrint(response, format) {
       switch(format) {
            case "xml":
                return prettyPrintXML(response.xml);
                break;
            case "json":
                return JSON.stringify(response, null, "  ");
                break;
            default:
                return null;
        }
    }

    function prettyPrintXML(xml) {
        var formatted = '';
        var reg = new RegExp("(>)(<)(\/*)", "g");
        xml = xml.replace(reg, '$1\r\n$2$3');
        var pad = 0;
        $.each(xml.split('\r\n'), function(index, node) {
            var indent = 0;
            if (node.match( /.+<\/\w[^>]*>$/ )) {
                indent = 0;
            } else if (node.match( /^<\/\w/ )) {
                if (pad != 0) {
                    pad -= 1;
                }
            } else if (node.match( /^<\w[^>]*[^\/]>.*$/ )) {
                indent = 1;
            } else {
                indent = 0;
            }

            var padding = '';
            for (var i = 0; i < pad; i++) {
                padding += '  ';
            }

            formatted += padding + node + '\r\n';
            pad += indent;
        });

        return formatted;
    }


    function displayError(msg) {
        resultsElement.text("Error: " + msg);
    }

    SyntaxHighlighter.config.clipboardSwf = 'lib/syntaxhighlighter/scripts/clipboard.swf';
    SyntaxHighlighter.defaults['gutter'] = false;
    SyntaxHighlighter.defaults['auto-links'] = true;

    // Hook into the Syntaxhiglighter library so we can do something special with API links
    SyntaxHighlighter.defaults['post-process-links'] = function(link) {
        var link = $(link);
        // link is to API domain -> it's an api link
        if (link.attr("href").indexOf(Config.apiDomain) != -1 ) {
            link.addClass("apiLink");
        }
        return $('<div>').append($(link).clone()).remove().html();
    };
}
