// --------------------------------------------------------------------
//
// ==UserScript==
// @name            Opera mturk super-script
// @description     Combines selecting and submitting a HIT response in one click.  Also optimizes the UI to keep more information visible on-screen together.
// @include         http://www.mturk.com/mturk/*
// @include         http://www.mturk.com:80/mturk/*
// ==/UserScript==

var smallWidth  = 300;    // initial size of images
var bigWidth    = 720;    // "zoom" size
var columns     = 3;      // number of columns of images
var fontSize    = "20pt"; // size of name and address
var lineHeight  = "28pt"; // line height for name and address
var scrollX     = 0;      // amount to scroll right 
var scrollY     = 620;    // amount to scroll down
var scrollDelay = 500;    // milliseconds to wait after loading before scroll

function getElementsByClass(node,searchClass,tag) {
 var classElements = new Array();
 var els = node.getElementsByTagName(tag);
 var elsLen = els.length;
 var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
 for (i = 0, j = 0; i < elsLen; i++) {
    if ( pattern.test(els[i].className) ) {
      classElements[j] = els[i];
      j++;
    }
  }
  return classElements;
}

var form = document.forms[0];

var paragraphs
var numChoices
var radios
var images

function checkIt(img) {
  for (var i=0; i < numChoices; i++) {
    if (images[i]==img) {
      var radio = radios[i];
      radio.checked = true;
      return;
    }
  }
}

document.body.addEventListener( 'load',
function (e) {
	
  var pics = document.body.getElementsByTagName("img");
  for (var i=0; i < pics.length; i++) {
    var pic = pics[i];
    if (pic.src.match("accept_hit.gif")) {
      window.location.href = pic.parentNode.href;
      return;
    }
  }

  paragraphs = getElementsByClass(document.body, "radiobutton-wrapper", "p");
  numChoices = paragraphs.length;

  if (numChoices==0) return;

  setTimeout("scroll(scrollX, scrollY);", scrollDelay);

  var t1 = "";
  var t2 = "";
  var lastParent;
  var titles = getElementsByClass(document.body, "question", "p");
  for (i=0; i < titles.length; i++) {
    var kid = titles[i].childNodes[0];
    if (kid) {
      if (t1=="") {
        var re = new RegExp("Location of business: ([^,]+),.*");
        if(kid.nodeValue.match(re)) t1 = kid.nodeValue.replace(re, "$1");
      }
      if (t2==""){
        var re = new RegExp(" -- .*");
        if(kid.nodeValue.match(re)) t2 = kid.nodeValue.replace(re, "");
      }
    }
    lastParent = titles[i].parentNode;
    //lastParent.removeChild(titles[i]);
  }
  var gp = lastParent.parentNode;
  var par = document.createElement('p');
  var text2 = document.createTextNode(t2);
  var text1 = document.createTextNode(t1);
  var tab = document.createElement('table');
  var tr1 = document.createElement('tr');
  var td1 = document.createElement('td');
  var tr2 = document.createElement('tr');
  var td2 = document.createElement('td');
  td2.appendChild(text2);
  td1.appendChild(text1);
  td1.style.fontSize=fontSize;
  td2.style.fontSize=fontSize;
  td2.style.fontWeight="bold";
  td1.style.fontWeight="bold";
  td1.style.lineHeight=lineHeight;
  td2.style.lineHeight=lineHeight;
  tr1.appendChild(td1);
  tr2.appendChild(td2);
  tab.appendChild(tr2);
  tab.appendChild(tr1);
  var d = document.createElement('div');
  d.style.width = (3*smallWidth+75) + "px";
  d.align = "center";
  d.appendChild(tab);
  form.appendChild(d);

  radios = new Array(numChoices);
  images = new Array(numChoices);

  for (var i=0; i < numChoices; i++) {
    var inputs = paragraphs[i].getElementsByTagName('input');
    radios[i] = inputs[0];
    var pictures = paragraphs[i].getElementsByTagName('img');
    if (pictures.length > 0)
      images[i] = pictures[0];
    else {
      var img = document.createElement('img');
      img.src = "http://j4cbo.com/mturk/nota.gif";
      images[i] = img;
    }
  }

  for (var i=0; i < numChoices; i++) {
    images[i].width=smallWidth;
    images[i].addEventListener( 'click',
     function (e) {
       checkIt(this);
       form.submit();
     }, false);

    images[i].addEventListener( 'keypress', 
     function (e) {
      if (e.which==120) {
        if (this.width==smallWidth) this.width=bigWidth;
        else this.width=smallWidth;
      }
     }, false);
  }

  var newTable = document.createElement('table');
  var row = document.createElement('tr');
  for (var i=0; i < numChoices; i++) {
    var entry = document.createElement('td');
    entry.appendChild(radios[i]);
    entry.appendChild(images[i]);
    row.appendChild(entry);
    if ((i+1)%columns == 0){
      newTable.appendChild(row);
      row = document.createElement('tr');
    }
  }
  newTable.appendChild(row);
  form.appendChild(newTable);

}, false);
