// Google Fool / April Foogle / Flickr Fool
//
// A Search-engine Mindreading Magic Trick / Practical Joke / April Fool
//
// YOU WON'T BE ABLE TO MAKE USE OF THIS WITHOUT CAREFULLY READING THE
// INSTRUCTIONS: http://www.krazydad.com/greasemonkey/googlefool.php
//
// Copyright 2005, Jim Bumgardner (krazydad.com, jbum.com)
//
// Release History:
// Version 1.4   2007-04-06
//     * Added Wikipedia support for 'Who am I thinking of' trick
//     * Fixed page to work when back button is used (which causes javascript to not reload)
//     * Fixed some more bugs with repeated searches
//
// Version 1.3   2007-04-05
//     * Fixed so it works on google result pages.
//     * Fixed for yahoo search results and other flickr pages.
//     * Fixed for multiple search fields on a single page.
//     * Display last 'faked' question in query form

// Version 1.2   2006-04-14
//     * Added some fixes to work with Greasemonkey 5 / Deerpark
//     * Added support for 2-letter playing-card codes from Bondoogle.
//       use 8H to get "eight of hearts" etc.
//
// Version 1.1.1 2005-03-30
//     * Fixed backspace during covert entry.
//     * Clear input field on page entry
//
// Version 1.1   2005-03-30
//     * Now works with Google image search, Yahoo and Flickr Tag Search, and many others.
//
// Version 1.0   2005-03-29
//     Based on my effect Bondoogle (http://www.krazydad.com/bondoogle/)
//
// ==UserScript==
// @name          Google Fool
// @description	  Modifies various search engines to do a great magic trick / april fool
// @include       http://www.google.com/*
// @include       http://images.google.com/*
// @include       http://news.google.com/*
// @include       http://www.flickr.com/*
// @include       http://www.yahoo.com/*
// @include       http://search.yahoo.com/*
// @include       http://www.wikipedia.com/*
// ==/UserScript==

// Edit this to provide your own fake question
//
var trickQuestion = "What is it that I am looking for?";

    // 4/14/06
    // Substitute in playing card from 2 letter code (e.g. 8H = eight of hearts)

var card_tab = {'a':'ace',
          '2':'two',      '3':'three',    '4':'four',
          '5':'five',      '6':'six',      '7':'seven',
          '8':'eight',    '9':'nine',      '1':'ten',
          't':'ten',      'j':'jack',      'q':'queen',    'k':'king'};

var suit_tab = {c:'clubs', h:'hearts', s:'spades', d:'diamonds'};

// Edit this to match other search forms you want to use
//
var searchParams = [{name:'q', question:'What is it that I am looking for?"'},  // used in Google, Flickr and a few others
                    {name:'p', question:'What is it that I am looking for?"'},
                    {name:'search_query', question:'What is it that I am looking for?"'}, // YouTube
                    {name:'search', question:'Who is it that we are thinking about?"'}]; // used in Yahoo

var NORMAL = 0;
var SECRET = 1;
var CODED = 2;

var mode = NORMAL;
var count = 0;
var lastQuery;
var lastEncoded;
var encodedLabel;
var fakeLabel = 'q' + Math.floor(Math.random()*100000000);
var isTricked = false;
var foundForm = false;

function mylog(s)
{
   // if (unsafeWindow.console)
   //  unsafeWindow.console.log(s);
}

function newsubmit(e) 
{
    e.stopPropagation();
    e.preventDefault();
    if (isTricked)
       GM_setValue('lastQuery', lastQuery);
    else
       GM_setValue('lastQuery', '');
    var frm = e.target;
    if (e.target.form)
      frm = e.target.form;
    var url = frm.action + '?';
    for (var i = 0; i < frm.elements.length; ++i)
    {
      var nam = frm.elements[i].name;
      if (nam == encodedLabel) {
        frm.elements[i].value = ''; // clear out the value so if we come back, via back button it works
        // don't add to url yet, we want to tack it on the end so it's not visibe in address bar
        continue;
      }
      // skip unused buttons
      if (frm.elements[i].type == 'submit' && frm.elements[i] != e.target) { 
        continue;
      }
      if (nam == fakeLabel)
        nam = 'qq';
      url += (i > 0? '&' : '') + nam + '=' + frm.elements[i].value;
    }
    url += '&xx=918273645&' + encodedLabel + '=' + lastEncoded;
    mylog('url: ' + url);
    isTricked = false;
    window.location.href = url;
    return false;
/*
    var target = event ? event.target : this;

    var myq = foolquery.value;
    mylog("sending " + myq);
    foolquery.parentNode.removeChild(foolquery);
    foolinput.name = foolinput.origName;
    foolinput.type = 'hidden';
    foolinput.value = myq;
*/
    // do anything you like here
    // alert("got submit");

    // call real submit function
    // this._submit();
}

// capture the onsubmit event on all forms

function myswipe(e) 
{
  var whichkey;

  if (!e)
    e = window.event;
    
  if (e.which) 			whichkey = e.which;
  else if (e.keyCode)	whichkey = e.keyCode;

  var fi = e.target;
  var fq = e.target.nextSibling;

  // slashes are giving me 191 47
  if (whichkey == 191)
    return false;	// ignore it

  switch (mode) {
  case NORMAL:
    if (whichkey == 47) {
      mode = SECRET;
      count = 0;
      fi.value = trickQuestion.substring(0, ++count);
      fq.value = "";
      isTricked = true;
      // 4/14/06 jbum (Deerpark fix)
          // e.stopPropagation();
          e.preventDefault();
      return false;
    }
    else if (!isTricked) {
      if (whichkey != 13 && whichkey != 10)
        // fq.value += String.fromCharCode(whichkey);
        fq.value = fi.value + String.fromCharCode(whichkey);
    }
    break;
  case SECRET: // todo: add backspace support!!!
    // 4/1/05 allow backspacing
    if (whichkey == 8) {
      --count;
      fq.value = fq.value.substr(0,fq.value.length-1);
      return true;
    }
    fi.value = trickQuestion.substring(0, ++count);
    if (whichkey == 47) {
      mode = NORMAL;
      var val = (fq.value);
      // 4/14/06
      // Substitute in card from 2 letter code (e.g. 8H = 8 of hearts)
      if (val.length == 2) {
     var card = card_tab[val.charAt(0).toLowerCase()];
     var suit = suit_tab[val.charAt(1).toLowerCase()];
     fq.value = /* "\"" +  */ card + " of " + suit /*  + "\"" */;
      }
    }
    else {
      fq.value += String.fromCharCode(whichkey);
    }
    // 4/14/06 jbum (Deerpark fix)
    e.preventDefault();
    return false;
    break;
  case CODED:
    // mylog("keeping query: " + foolquery.value);
    break;
  }
  lastQuery = fi.value;
  lastEncoded = fq.value;
  return true;
}

// quickly clear 'em out
var inputs = document.getElementsByTagName('input');
var lq = GM_getValue('lastQuery','');
if (lq && lq != '')
{
    mylog("Got lq value: " + lq);
    for (var i = 0; i < inputs.length; ++i)
    {
        for (var j = 0; j < searchParams.length; ++j)
        {
            if (inputs[i].name == searchParams[j].name)
            {
              inputs[i].value  = lq;
            }
        }
    }     
}

// Find the (query) input in the search form and hijack it for the trick.
//
function mysetup()
{
    var inputs = document.getElementsByTagName('input');
    // alert('installing gf: inputs' + inputs.length);
    var lq = GM_getValue('lastQuery','');
    GM_setValue('lastQuery','');
    for (var i = 0; i < inputs.length; ++i)
    {
        for (var j = 0; j < searchParams.length; ++j)
        {
            if (inputs[i].name == searchParams[j].name && inputs[i].type != 'hidden')
            {
                encodedLabel = searchParams[j].name;
                trickQuestion = searchParams[j].question;
                var foolinput = inputs[i];
                foolinput.origName = foolinput.name;
                foolinput.name = fakeLabel;
                foolinput.addEventListener("keypress", myswipe, true);
                foolinput.autocomplete = 'off';
                if (lq && lq != '') {
                  mylog("Got lq value: " + lq);
                  foolinput.value = lq;
                }
                // mylog(getComputedStyle(foolinput,''));
                var foolquery = document.createElement('input');
                foolquery.name = foolinput.origName;
                foolquery.type = 'hidden';
                lastEncoded = foolquery.value = foolinput.value;
                foolquery.title = foolinput.title;
                foolinput.title = '';
                // foolinput.parentNode.appendChild(inp);
                foolinput.parentNode.insertBefore(foolquery,foolinput.nextSibling);

                // unsafeWindow.encodeURIComponent = false;
                mylog("updated search form: " + foolinput.origName);
                foundForm = true;
                window.addEventListener('submit', newsubmit, true);
                unsafeWindow.HTMLFormElement.prototype.submit = newsubmit;
            }
        }
    }
}
window.addEventListener("load", function(e) {  /* foolinput.value = ''; */ mylog("got load for " + window.location.host); mysetup(); }, false);


