/**
 *  Do job searches.
 *
 *  Synopsis:
 *
 *    var j = new AjaxJobSearcher();
 *    j.search($('jobSearchTarget'), {
 *        city: 'Redwood City',
 *        state: 'CA',
 *        keywords: 'Linux'
 *    });
 *
 *  Requires:
 *    prototype.js - for Ajax and utility methods
 */
AjaxJobSearcher = Class.create();
AjaxJobSearcher.prototype = {
        /** Constructor in the Prototype.js convention */
        initialize: function () {},
        /** Issue a job search to the server in an asynchronous ajaxy way.
         *
         *  @param result is an HTML element, typically a div,
         *    which will be updated to contain the search results.
         *  @param parameters is an object-as-hash that contains
         *    parameters to pass to the jobsearch API on the server
         */
        search: function (result, parameters) {
            var server = /https?:\/\/([^\/]+)\//.exec(window.location)[1];
            var url = 'http://' + server + '/jobsearch/simplyhired/feed.xml';
            var queryString = $H(parameters).inject($H(), function (h, pair) {
                // only works if parameters is not nested
                h['s['+pair.key+']'] = pair.value;
                return h;
            }).toQueryString();

            var me = this;
            var options = {
                parameters: queryString,
                onSuccess: function (xmlHttp) {
                    result.innerHTML = me.formatResponse(xmlHttp.responseXML);
                    result.className = (this.parameters.keywords.trim() != "") ? "search_results" : "";
                },
                onFailure: function (xmlHttp) {
                    result.innerHTML = me.formatFailureMessage(xmlHttp.responseXML);
                    result.className = "";
                }
            };
            //result.innerHTML = 'Loading.';
            //result.innerHTML = '<br>'+(url + '?' + queryString).escapeHTML();
            var r = new Ajax.Request(url, options);
        },
        formatResponse: function (xml) {
            var nodes = $A(xml.getElementsByTagName('job'));
            var me = this;

            if (nodes.length == 0) {
                return me.formatNoneFound();
            } else {
                return nodes.map(function (job) { return me.formatJob(job); })
                    .join("\n");
            }
        },
        formatJob: function (job) {
            var p = {};
            ['link', 'position', 'company', 'location'].each(function (n) {
                var elem = job.getElementsByTagName(n).item(0);
                p[n] = (elem.textContent // DOM 3
                        || elem.firstChild.nodeValue // IE
                        || '').escapeHTML();
            });
            return '<div class="job-search-result"><a class="position" href="'+p.link+'">'+p.position+'</a><br />'+
                '<span class="company">'+p.company+'</span> <span class="location">('+p.location+')</span></div>';
        },
        formatNoneFound: function () {
            return "<span style=\"font-size: 12px; font-style: italic;\">None found. Try expanding your search. Be sure to include your state name (not just your city).</span>";
        },
        formatFailureMessage: function (xml) {
            return '<span style="color: #888">Failed to load job search '+
                'results.</span>';
        }
};
