// ==UserScript==
// @name          Google Search Assist
// @namespace     http://www.grok.in/hacks/google-search-assist/
// @description	  The Yahoo! Search Assist for Google. Uses the Yahoo! web search and text extraction APIs.
// @include       http://google.*
// @include       http://www.google.*
// ==/UserScript==



(function() {

function Scope(o) {
    var scope = this;
    for (a in o)
        this[a] = o[a];

    this.callback = function(r) {scope.func.call(scope, r);};
}

function urlencode(text) {
    text= text.replace(/\//g,"%2F");
    text= text.replace(/\?/g,"%3F");
    text=  text.replace(/=/g,"%3D");
    text=   text.replace(/&/g,"%26");
    return text;
}

var obj = { };

function init() {
    obj.q = document.getElementsByName('q')[0];

    if (document.getElementById('logo'))
        obj.r = document.getElementById('logo').parentNode.parentNode;

    if (obj.q && obj.q.value)
        pingSearch();
}

function pingSearch() {

    var searchScope = new Scope({myVar:obj, func:pongSearch});
    GM_xmlhttpRequest({
        method:'GET',
        url:'http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=mYQiI5jV34EiImeu6QKN8tyLPxB4oJ82V6bJ53VfbC5BA_Pi1IZD2xZaH7pWM6A-&output=json&results=100&query=' + urlencode(obj.q.value),
        onload:searchScope.callback
    });
}

function pongSearch(response) {
    if (response.status != '200')
        return;

    z = eval('(' + response.responseText + ')');

    obj.context = '';
    for (var i = 0; i < z.ResultSet.Result.length; i++) {
        obj.context += ' ' + z.ResultSet.Result[i].Title + ' ' + z.ResultSet.Result[i].Summary;
    }

    if (obj.context)
        pingTermExtraction();
}

function pingTermExtraction() {

    var termExtractionScope = new Scope({myVar:obj, func:pongTermExtraction});
    GM_xmlhttpRequest({
        method:'POST',
        url:'http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction?appid=mYQiI5jV34EiImeu6QKN8tyLPxB4oJ82V6bJ53VfbC5BA_Pi1IZD2xZaH7pWM6A-&output=json&query=' + urlencode(obj.q.value),
        data:'context=' + urlencode(obj.context),
        headers:{'Content-type':'application/x-www-form-urlencoded'},
        onload:termExtractionScope.callback
    });
}

function pongTermExtraction(response) {
    if (response.status != '200')
        return;

    z = eval('(' + response.responseText + ')');

    form = document.createElement('form');

    select = document.createElement('select');
    select.style.float = 'right';
    select.size = '6';

    for (var i = 0; i < z.ResultSet.Result.length; i++) {
        var option = document.createElement('option');
        option.innerHTML = z.ResultSet.Result[i];
        option.setAttribute('ondblclick', "document.getElementsByName('q')[0].value += ' +\"" + z.ResultSet.Result[i] + "\"'; document.gs.submit()");
        select.appendChild(option);
    }

    obj.r.appendChild(select);
}

init();

})();
