1)
this_cell.style.textAlign = 'center';
}
text_area.style.width = '100%';
var table_div = document.createElement('div');
table_div.className = "bodytable"+sufTheme;
text_area.rows[0].className = "tabHead"+sufTheme;
table_div.style.fontSize = "14px";
document.body.insertBefore(table_div,control_panel.nextSibling);
var header_hide_button = document.createElement('button');
table_div.appendChild(big_red_button);
table_div.appendChild(document.createTextNode(" "));
table_div.appendChild(header_hide_button);
table_div.appendChild(document.createTextNode(" "));
table_div.appendChild(reset_blocks);
table_div.appendChild(document.createTextNode(" "));
table_div.appendChild(include_button);
table_div.appendChild(document.createTextNode(" "));
table_div.appendChild(showButton);
table_div.appendChild(document.createTextNode(" "));
table_div.appendChild(btn01);
$("#show_TO_stuff_button").hide();
table_div.appendChild(document.createElement("P"));
var statusdiv = document.createElement("DIV");
statusdiv.className = "statusdiv"+sufTheme;
statusdiv.appendChild(progress_report);
statusdiv.appendChild(document.createElement("P"));
statusdiv.appendChild(document.createTextNode("Status messages: "));
statusdiv.appendChild(status_report);
table_div.appendChild(statusdiv);
if (document.getElementById('lnkWorkerSignin'))
{
var logged_out_warning = document.createElement("P");
logged_out_warning.style.color = "#ff3300";
logged_out_warning.innerHTML = "ATTENTION: SCRAPER IS RUNNING WHILE LOGGED OUT. SOME DATA WILL BE MISSING. GO TO REQUESTER'S LINK IN LOGGED-IN WINDOW FOR FORUM EXPORT. Click here to sign in";
table_div.appendChild(logged_out_warning);
table_div.appendChild(document.createElement("P"));
}
table_div.appendChild(text_area);
header_hide_button.textContent = "Hide Settings";
header_hide_button.className += " cpButtons"+sufTheme;
header_hide_button.onclick = function(){
if (header_hide_button.textContent == "Hide Settings"){
$('#control_panel').hide(300);
//$('#control_panel').hide();
btn01.style.display = 'none';
header_hide_button.textContent = "Show Settings";
}
else{
$('#control_panel').show(300);
btn01.style.display = 'initial';
//$('#control_panel').show();
header_hide_button.textContent = "Hide Settings";
}
};
}
/********HIT EXPORT ADDITIONS*****/
var EDIT = false;
var HIT;
var TO_BASE = "http://turkopticon.ucsd.edu/";
var API_BASE = "https://mturk-api.istrack.in/";
var API_URL = API_BASE + "multi-attrs.php?ids=";
var DEFAULT_TEMPLATE = '[table][tr][td][b]Title:[/b] [url={prev_link}][COLOR=blue]{title}[/COLOR][/url]\n';
DEFAULT_TEMPLATE += '[b]Requester:[/b] [url=https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&requesterId={rid}][COLOR=blue]{requester}[/COLOR][/url]';
DEFAULT_TEMPLATE += ' [{rid}] ([url='+TO_BASE+'{rid}][COLOR=blue]TO[/COLOR][/url])';
DEFAULT_TEMPLATE += '\n[b]TO Ratings:[/b]{to_stuff}';
DEFAULT_TEMPLATE += '\n[b]Description:[/b] {description}';
DEFAULT_TEMPLATE += '\n[b]Time:[/b] {time}';
DEFAULT_TEMPLATE += '\n[b]Hits Available:[/b] {hits}';
DEFAULT_TEMPLATE += '\n[b]Reward:[/b] [COLOR=green][b]{reward}[/b][/COLOR]';
DEFAULT_TEMPLATE += '\n[b]Qualifications:[/b] {quals}[/td][/tr][/table]';
var TEMPLATE;
var EASYLINK;
if (typeof GM_getValue === 'undefined')
TEMPLATE = null;
else {
TEMPLATE = GM_getValue('HITScraper Template');
EASYLINK = GM_getValue('HITScraper Easylink');
}
if (TEMPLATE == null) {
TEMPLATE = DEFAULT_TEMPLATE;
}
function buildXhrUrl(rai) {
var url = API_URL;
var ri = rai;
url += rai;
return url;
}
function makeXhrQuery(url) {
var xhr = new XMLHttpRequest();
try{
xhr.open('GET', url, false);
xhr.send(null);
return $.parseJSON(xhr.response);
}
catch(err){
return "TO DOWN";
}
}
function getNamesForEmptyResponses(rai, resp) {
for (var rid in rai) {
if (rai.hasOwnProperty(rid) && resp[rid] == "") {
resp[rid] = $.parseJSON('{"name": "' + rai[rid][0].innerHTML + '"}');
}
}
return resp;
}
function getKeys(obj) {
var keys = [];
for (var key in obj) {
keys.push(key);
}
return keys;
}
function export_sel_deleg(item,index,extype) {
//console.log(item);
if (extype == "vb") export_func(item);
else display(item, extype);
}
function block_deleg(item,index) {
//console.log(item);
block(item,index);
}
function block(hit,index){
var blockType = ["requester_strip","title"];
var blockThis = hit[blockType[index]].replace(/\s+/g," ").toLowerCase().trim();
var r = confirm("Do you really want to block hits matching requester/title \""+blockThis+"\"?");
if(r)
{
ignore_list.push(blockThis);
GM_setValue("scraper_ignore_list",ignore_list.join('^'));
}
}
function search_deleg(item,index) {
//console.log(item);
var searches = ["rid","title"];
search(item,searches[index]);
}
function hit_sort_func()
{
return function(a,b) {
if (a.date == b.date) {
if (a.requesterName < b.requesterName)
return -1;
if (a.requesterName > b.requesterName)
return 1;
if (a.title < b.title)
return -1;
if (a.title > b.title)
return 1;
if (a.status < b.status)
return -1;
if (a.status > b.status)
return 1;
}
if (a.date > b.date)
return 1;
if (a.date < b.date)
return -1;
};
}
function escapeRegExp(str) {
return str.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function search(item,search_type){
//return true;/*
var request = indexedDB.open("HITDB", v);
request.onsuccess = function(e) {
HITStorage.indexedDB.db = e.target.result;
var db = HITStorage.indexedDB.db;
var trans = db.transaction(["HIT"], HITStorage.IDBTransactionModes.READ_ONLY);
var store = trans.objectStore("HIT");
var req;
var results = [];
var index;
var range;
req = store.openCursor();
req.onsuccess = function(event) {
var cursor = event.target.result;
if (cursor) {
hit = cursor.value;
var keys = ['title', 'requesterId'];
var re = new RegExp(escapeRegExp(item[search_type]),"ig");
for (var k in keys)
{
if (hit[keys[k]] != null && re.test(hit[keys[k]].trim())){
results.push(cursor.value);
}
}
cursor.continue();
}
else {
//console.log(results);
results.sort(hit_sort_func());
show_results(results);
}
db.close();
};
request.onerror = HITStorage.indexedDB.onerror;/**/
};
}
function format_hit_line (hit, odd, status_color, new_day)
{
var line = '';
else
line += '">';
line += '' + hit.date + ' | ';
if (hit.requesterLink != null)
line += '' + hit.requesterName + ' | ';
else
line += '' + hit.requesterName + ' | ';
line += '' + hit.title + ' | ';
line += '$' + hit.reward.toFixed(2) + ' | ';
line += '' + hit.status + ' | ';
line += '' + hit.feedback + ' | ';
line += '
\n';
return line;
}
function status_color (status)
{
var color = "green";
if (status.match("Pending Approval"))
color = "orange";
else if (status.match("Rejected"))
color = "red";
return color;
}
function show_results (results){
var resultsWindow = window.open();
resultsWindow.document.write("Status Detail Search Results\n");
resultsWindow.document.write("HITs matching your search:
\n");
resultsWindow.document.write('\n');
resultsWindow.document.write('Date | Requester | HIT Title | Reward | Status | Feedback |
\n');
var odd = true;
var sum = 0;
var sum_rejected = 0;
var sum_approved = 0;
var sum_pending = 0;
var new_day = false;
for (var i=0; i0 && (results[i-1].date != results[i].date))
new_day = true;
else
new_day = false;
resultsWindow.document.write(format_hit_line(results[i], odd, status_color(results[i].status), new_day ));
}
resultsWindow.document.write(' | | | $' + sum.toFixed(2) + ' | | |
\n');
resultsWindow.document.write("
");
resultsWindow.document.write("Found " + results.length + " matching HITs. $" + sum_approved.toFixed(2) + " approved, " +
"$" + sum_rejected.toFixed(2) + " rejected and $" + sum_pending.toFixed(2) + " pending.
");
resultsWindow.document.write("");
resultsWindow.document.close();
}
// ---- vB
function export_func(item) {
HIT = item;
gedit_button.textContent = 'Edit Template';
apply_template(item);
gdiv.style.display = 'block';
gtextarea.select();
}
function apply_template(hit_data) {
var txt = TEMPLATE;
var vars = ['title', 'requester', 'rid', 'description', 'reward', 'quals', 'prev_link', 'time', 'hits', 'to_stuff', 'to_text'];
var resp = null;
if (txt.indexOf('{to_text}') >= 0 || txt.indexOf('{to_stuff}') >= 0){
var url = buildXhrUrl(hit_data["rid"]);
resp = getTOMulti(hit_data["rid"]);
//console.log(resp);
}
var toText = "";
var toStuff = "";
var toData = "";
var numResp = (resp == null || resp == "TO DOWN" ? "n/a" : resp[hit_data["rid"]].reviews);
if (resp == "TO DOWN"){
toStuff = " [URL=\""+TO_BASE+hit_data['rid']+"\"]TO down.[/URL]";
toText = toStuff;
}
else if (resp == null || resp[hit_data["rid"]].attrs == null && resp != "TO DOWN") {
toStuff = " No TO ";
toText = " No TO ";
toStuff += "[URL=\""+TO_BASE+"report?requester[amzn_id]=" + hit_data['rid'] + "&requester[amzn_name]=" + hit_data['requester'] + "\"]";
toStuff += "(Submit a new TO rating for this requester)[/URL]";
}
else {
for (var key in resp[hit_data["rid"]].attrs) {
//toText += "\n[*]"+key+": "+resp[hit_data["requesterId"]].attrs[key]+"\n";
var i = 0;
var color = "green";
var name = key;
var num = Math.floor(resp[hit_data["rid"]].attrs[key]);
switch (key){
case "comm":
name = "Communicativity";
break;
case "pay":
name = "Generosity";
break;
case "fast":
name = "Promptness";
break;
case "fair":
name = "Fairness";
break;
default:
name = key;
break;
}
switch (num){
case 0:
color = "red";
break;
case 1:
color = "red";
break;
case 2:
color = "orange";
break;
case 3:
color = "yellow";
break;
default:
break;
}
toText += (num > 0 ? "\n[color="+color+"]" : "\n");
for (i; i < num; i++){
toText += "[b]"+symbol+"[/b]";
}
toText += (num > 0 ? "[/color]" : "");
if (i < 5){
toText += "[color=white]";
for (i; i < 5; i++)
toText += "[b]"+symbol+"[/b]";
toText += "[/color]";
}
toText += " "+Number(resp[hit_data["rid"]].attrs[key]).toFixed(2)+" "+name;
toData += Number(resp[hit_data["rid"]].attrs[key]).toFixed(2) + ",";
}
//toText += "[/list]";
toText += (txt.indexOf('{to_stuff}') >= 0 ? "" : "\nNumber of Reviews: "+numResp+"\n[URL=\""+TO_BASE+"report?requester[amzn_id]=" + hit_data['rid'] + "&requester[amzn_name]=" + hit_data['requester'] + "\"](Submit a new TO rating for this requester)[/URL]");
toStuff = '\n[img]http://data.istrack.in/to/' + toData.slice(0,-1) + '.png[/img]';
toStuff += (txt.indexOf('{to_stuff}') >= 0 ? (txt.indexOf('{to_text}') >= 0 ? "" : toText) : "");
toStuff += "\nNumber of Reviews: "+numResp;
toStuff += "[URL=\""+TO_BASE+"report?requester[amzn_id]=" + hit_data['rid'] + "&requester[amzn_name]=" + hit_data['requester'] + "\"]";
toStuff += "\n(Submit a new TO rating for this requester)[/URL]";
}
for (var u = 0; u < vars.length; u++) {
var t = new RegExp('\{' + vars[u] + '\}', 'g');
if (vars[u] == "to_stuff") {
txt = txt.replace(t, toStuff);
}
else if (vars[u] == "to_text") {
txt = txt.replace(t, toText);
}
else if (vars[u] == "prev_link") {
txt = txt.replace(t,"https://www.mturk.com"+hit_data[vars[u]]);
}
else if (vars[u] == "acc_link") {
txt = txt.replace(t,"https://www.mturk.com"+hit_data[vars[u]]);
}
else
txt = txt.replace(t, hit_data[vars[u]]);
}
gtextarea.value = txt;
}
function export_irc(item) {
display(item);
}
function apply_template(hit_data) {
var txt = TEMPLATE;
var vars = ['title', 'requester', 'rid', 'description', 'reward', 'quals', 'prev_link', 'time', 'hits', 'to_stuff', 'to_text'];
var resp = null;
if (txt.indexOf('{to_text}') >= 0 || txt.indexOf('{to_stuff}') >= 0){
var url = buildXhrUrl(hit_data["rid"]);
resp = getTOMulti(hit_data["rid"]);
//console.log(resp);
}
var toText = "";
var toStuff = "";
var toData = "";
var numResp = (resp == null || resp == "TO DOWN" ? "n/a" : resp[hit_data["rid"]].reviews);
if (resp == "TO DOWN"){
toStuff = " [URL=\""+TO_BASE+hit_data['rid']+"\"]TO down.[/URL]";
toText = toStuff;
}
else if (resp == null || resp[hit_data["rid"]].attrs == null && resp != "TO DOWN") {
toStuff = " No TO ";
toText = " No TO ";
toStuff += "[URL=\""+TO_BASE+"report?requester[amzn_id]=" + hit_data['rid'] + "&requester[amzn_name]=" + hit_data['requester'] + "\"]";
toStuff += "(Submit a new TO rating for this requester)[/URL]";
}
else {
for (var key in resp[hit_data["rid"]].attrs) {
//toText += "\n[*]"+key+": "+resp[hit_data["requesterId"]].attrs[key]+"\n";
var i = 0;
var color = "green";
var name = key;
var num = Math.floor(resp[hit_data["rid"]].attrs[key]);
switch (key){
case "comm":
name = "Communicativity";
break;
case "pay":
name = "Generosity";
break;
case "fast":
name = "Promptness";
break;
case "fair":
name = "Fairness";
break;
default:
name = key;
break;
}
switch (num){
case 0:
color = "red";
break;
case 1:
color = "red";
break;
case 2:
color = "orange";
break;
case 3:
color = "yellow";
break;
default:
break;
}
toText += (num > 0 ? "\n[color="+color+"]" : "\n");
for (i; i < num; i++){
toText += "[b]"+symbol+"[/b]";
}
toText += (num > 0 ? "[/color]" : "");
if (i < 5){
toText += "[color=white]";
for (i; i < 5; i++)
toText += "[b]"+symbol+"[/b]";
toText += "[/color]";
}
toText += " "+Number(resp[hit_data["rid"]].attrs[key]).toFixed(2)+" "+name;
toData += Number(resp[hit_data["rid"]].attrs[key]).toFixed(2) + ",";
}
//toText += "[/list]";
toText += (txt.indexOf('{to_stuff}') >= 0 ? "" : "\nNumber of Reviews: "+numResp+"\n[URL=\""+TO_BASE+"report?requester[amzn_id]=" + hit_data['rid'] + "&requester[amzn_name]=" + hit_data['requester'] + "\"](Submit a new TO rating for this requester)[/URL]");
toStuff = '\n[img]http://data.istrack.in/to/' + toData.slice(0,-1) + '.png[/img]';
toStuff += (txt.indexOf('{to_stuff}') >= 0 ? (txt.indexOf('{to_text}') >= 0 ? "" : toText) : "");
toStuff += "\nNumber of Reviews: "+numResp;
toStuff += "[URL=\""+TO_BASE+"report?requester[amzn_id]=" + hit_data['rid'] + "&requester[amzn_name]=" + hit_data['requester'] + "\"]";
toStuff += "\n(Submit a new TO rating for this requester)[/URL]";
}
for (var u = 0; u < vars.length; u++) {
var t = new RegExp('\{' + vars[u] + '\}', 'g');
if (vars[u] == "to_stuff") {
txt = txt.replace(t, toStuff);
}
else if (vars[u] == "to_text") {
txt = txt.replace(t, toText);
}
else if (vars[u] == "prev_link") {
txt = txt.replace(t,"https://www.mturk.com"+hit_data[vars[u]]);
}
else if (vars[u] == "acc_link") {
txt = txt.replace(t,"https://www.mturk.com"+hit_data[vars[u]]);
}
else
txt = txt.replace(t, hit_data[vars[u]]);
}
gtextarea.value = txt;
}
function hide_func(div) {
if (EDIT == false)
div.style.display = 'none';
}
function edit_func() {
if (EDIT == true) {
EDIT = false;
TEMPLATE = gtextarea.value;
gedit_button.textContent = 'Edit Template';
apply_template(HIT);
}
else {
//console.log("Editing");
EDIT = true;
gedit_button.textContent = 'Show Changes';
gsave_button.disabled = false;
gtextarea.value = TEMPLATE;
}
}
function default_func() {
GM_deleteValue('HITScraper Template');
TEMPLATE = DEFAULT_TEMPLATE;
EDIT = false;
gedit_button.textContent = 'Edit Template';
apply_template(HIT);
}
function save_func() {
if (EDIT)
TEMPLATE = gtextarea.value;
GM_setValue('HITScraper Template', TEMPLATE);
}
var gdiv = document.createElement('div');
var gtextarea = document.createElement('textarea');
var gdiv2 = document.createElement('label');
gdiv.style.position = 'fixed';
gdiv.style.width = '500px';
gdiv.style.height = '235px';
gdiv.style.left = '50%';
gdiv.style.right = '50%';
gdiv.style.margin = '-250px 0px 0px -250px';
gdiv.style.top = '300px';
gdiv.style.padding = '5px';
gdiv.style.border = '2px';
gdiv.style.backgroundColor = 'black';
gdiv.style.color = 'white';
gdiv.style.zIndex = '100';
gtextarea.style.padding = '2px';
gtextarea.style.width = '500px';
gtextarea.style.height = '200px';
gtextarea.title = '{title}\n{requester}\n{rid}\n{description}\n{reward}\n{quals}\n{prev_link}\n{time}\n{hit}\n{to_stuff}\n{to_text}';
gdiv.textContent = 'Press Ctrl+C to copy to clipboard. Click textarea to close';
gdiv.style.fontSize = '12px';
gdiv.appendChild(gtextarea);
var gedit_button = document.createElement('button');
var gsave_button = document.createElement('button');
var gdefault_button = document.createElement('button');
var geasy_button = document.createElement('button');
gedit_button.textContent = 'Edit Template';
gedit_button.setAttribute('id', 'edit_button');
gedit_button.style.height = '18px';
gedit_button.style.width = '100px';
gedit_button.style.fontSize = '10px';
gedit_button.style.paddingLeft = '3px';
gedit_button.style.paddingRight = '3px';
gedit_button.style.backgroundColor = 'white';
gsave_button.textContent = 'Save Template';
gsave_button.setAttribute('id', 'save_button');
gsave_button.style.height = '18px';
gsave_button.style.width = '100px';
gsave_button.style.fontSize = '10px';
gsave_button.style.paddingLeft = '3px';
gsave_button.style.paddingRight = '3px';
gsave_button.style.backgroundColor = 'white';
gsave_button.style.marginLeft = '5px';
geasy_button.textContent = 'Change Adfly Url';
geasy_button.setAttribute('id', 'easy_button');
geasy_button.style.height = '18px';
geasy_button.style.width = '100px';
geasy_button.style.fontSize = '10px';
geasy_button.style.paddingLeft = '3px';
gdefault_button.textContent = ' D ';
gdefault_button.setAttribute('id', 'default_button');
gdefault_button.style.height = '18px';
gdefault_button.style.width = '20px';
gdefault_button.style.fontSize = '10px';
gdefault_button.style.paddingLeft = '3px';
gdefault_button.style.paddingRight = '3px';
gdefault_button.style.backgroundColor = 'white';
gdefault_button.style.marginLeft = '5px';
gdefault_button.title = 'Return default template';
gdiv.appendChild(gedit_button);
gdiv.appendChild(gsave_button);
gdiv.appendChild(gdefault_button);
gdiv.appendChild(geasy_button);
gsave_button.disabled = true;
gdiv.style.display = 'none';
gtextarea.addEventListener("click", function() {hide_func(gdiv);}, false);
gedit_button.addEventListener("click", function() {edit_func();}, false);
gsave_button.addEventListener("click", function() {save_func();}, false);
gdefault_button.addEventListener("click", function() {default_func();}, false);
document.body.insertBefore(gdiv, document.body.firstChild);
//Functions below were added for the irc export with the help of clickhappier and Cristo
var accountStatus = "loggedOut";
if ( !document.getElementById("lnkWorkerSignin") ) // if sign-in link not present
{
accountStatus = "loggedIn";
}
function getUrlVariable(url, variable)
{
var query = url.split('?');
var vars = query[1].split("&");
for ( var i=0; i 2) {
var toInfo = requestTO.responseText.split('{')[3].split('}')[0].split(',');
for (var t = 0; t < 4; t++) {
var arrTo = toInfo[t].split(':');
toComp.push(arrTo[1].substring(1,4));
}
}
else { toComp = ['-','-','-','-']; }
}
};
requestTO.open('GET', toUrl, false);
requestTO.send(null);
return toComp;
}
catch(err){ // if mirror unavailable, try main TO server
try{
requestTO.onreadystatechange = function () {
if ((requestTO.readyState ===4) && (requestTO.status ===200)) {
if (requestTO.responseText.split(':').length > 2) {
var toInfo = requestTO.responseText.split('{')[3].split('}')[0].split(',');
for (var t = 0; t < 4; t++) {
var arrTo = toInfo[t].split(':');
toComp.push(arrTo[1].substring(1,4));
}
}
else { toComp = ['-','-','-','-']; }
}
};
requestTO.open('GET', toUrl2, false);
requestTO.send(null);
return toComp;
}
catch(err){ // if both unavailable, return 'na's
toComp = ['na','na','na','na'];
return toComp;
}
}
}
function getTOMulti(f){
var toComp = {};
var toUrl2 = 'https://mturk-api.istrack.in/multi-attrs.php?ids='+f;
var toUrl = 'https://turkopticon.ucsd.edu/api/multi-attrs.php?ids='+f;
var rids = f.split(',');
var requestTO = new XMLHttpRequest();
try{ // first try Miku's TO mirror server (istrack.in)
requestTO.onreadystatechange = function () {
if ((requestTO.readyState ===4) && (requestTO.status ===200)) {
if (requestTO.responseText.split(':').length > 2)
toComp = $.parseJSON(requestTO.responseText);
else
toComp = null;
}
};
requestTO.open('GET', toUrl, false);
requestTO.send(null);
return toComp;
}
catch(err){ // if mirror unavailable, try main TO server
try{
requestTO.onreadystatechange = function () {
if ((requestTO.readyState ===4) && (requestTO.status ===200)) {
if (requestTO.responseText.split(':').length > 2)
toComp = $.parseJSON(requestTO.responseText);
else
toComp = null;
}
};
requestTO.open('GET', toUrl2, false);
requestTO.send(null);
return toComp;
}
catch(err){ // if both unavailable, return 'na's
toComp = "TO DOWN";
return toComp;
}
}
}
function sleep(ms){ // from http://www.digimantra.com/tutorials/sleep-or-wait-function-in-javascript/
var dt = new Date();
dt.setTime(dt.getTime() + ms);
while (new Date().getTime() < dt.getTime());
}
function ns4tShorten(url){ // mturk-only URL shortener on Tjololo's server ns4t.net
console.log("ns4tShorten function");
var shortUrl;
var urlT = "https://ns4t.net/yourls-api.php" + "?action=shorturl&url=" + encodeURIComponent(url) + "&format=simple&title=MTurk&username=publicuser&password=publicpass";
var requestNs4t = new XMLHttpRequest();
try{
requestNs4t.onreadystatechange = function () {
if (requestNs4t.readyState == 4) {
if (requestNs4t.status == 200) {
shortUrl = requestNs4t.responseText;
console.log("ns4t.net response: " + requestNs4t.status + " " + requestNs4t.statusText + " " + requestNs4t.responseText);
}
else {
console.log('ns4t.net unsuccessful: ' + requestNs4t.status + " " + requestNs4t.statusText);
}
}
};
requestNs4t.open('GET', urlT, false);
requestNs4t.send(null);
return shortUrl;
}
catch(err){
return shortUrl;
}
}
function tnyimShorten(url){ // Tny.im URL Shortener - http://tny.im/aboutapi.php - this is only possible this way because their server has the "Access-Control-Allow-Origin = *" headers enabled (the above TO mirror server does too)
console.log("tnyimShorten function");
var shortUrl;
var urlT = "https://tny.im/yourls-api.php" + "?action=shorturl&url=" + encodeURIComponent(url) + "&format=simple&title=MTurk";
var requestTnyim = new XMLHttpRequest();
try{
requestTnyim.onreadystatechange = function () {
if (requestTnyim.readyState == 4) {
if (requestTnyim.status == 200) {
shortUrl = requestTnyim.responseText;
console.log("tny.im response: " + requestTnyim.status + " " + requestTnyim.statusText + " " + requestTnyim.responseText);
}
else {
console.log('tny.im unsuccessful: ' + requestTnyim.status + " " + requestTnyim.statusText);
}
}
};
requestTnyim.open('GET', urlT, false);
requestTnyim.send(null);
return shortUrl;
}
catch(err){
return shortUrl;
}
}
function googlShorten(url){ // Goo.gl URL Shortener
console.log("googlShorten function");
var shortUrl;
var urlG = "https://www.googleapis.com/urlshortener/v1/url";
var requestGoogl = new XMLHttpRequest();
try{
requestGoogl.open("POST", urlG, false);
requestGoogl.setRequestHeader("Content-Type", "application/json");
requestGoogl.onreadystatechange = function() {
if (requestGoogl.readyState == 4) {
if (requestGoogl.status == 200) {
shortUrl = JSON.parse(requestGoogl.response).id;
console.log("goo.gl response: " + requestGoogl.status + " " + requestGoogl.statusText + " " + JSON.parse(requestGoogl.response).id );
}
else {
console.log('goo.gl unsuccessful: ' + requestGoogl.status + " " + requestGoogl.statusText);
}
}
};
var data = new Object();
data.longUrl = url;
requestGoogl.send(JSON.stringify(data));
return shortUrl;
}
catch(err){
return shortUrl;
}
}
function shortenUrl(url){
sleep(500); // milliseconds delay - wait some milliseconds (currently half a second) between shortens to reduce chance of hitting usage limits
var shortUrl;
shortUrl = ns4tShorten(url);
if ( shortUrl === undefined ) { // if you reached the ns4t.net URL shortener's temporary usage limits or the server is otherwise unavailable
shortUrl = tnyimShorten(url);
if ( shortUrl === undefined ) { // if you reached the tny.im URL shortener's temporary limits or the server is otherwise unavailable
shortUrl = googlShorten(url);
if ( shortUrl === undefined ) { // if you reached the Google URL shortener's temporary limits too or the server is otherwise unavailable
shortUrl = "(x)";
}
}
}
return shortUrl;
}
// output display box
// this is messy
// TODO: make it cleaner
var exportdiv = document.createElement('div');
var exporttextarea1 = document.createElement('textarea'); var exporttextarea2 = document.createElement('textarea');
var exporttextarea3 = document.createElement('textarea'); var exporttextarea4 = document.createElement('textarea');
var exporttextarea5 = document.createElement('textarea');
var exportclosebutton = document.createElement('button');var exporttitlebutton = document.createElement('button');var exporturlbutton = document.createElement('button');
var exportreqbutton = document.createElement('button');var exportpandabutton = document.createElement('button');var exporttobutton = document.createElement('button');
exportclosebutton.style.backgroundColor = 'black';
exportclosebutton.style.color = 'white';
//exportclosebutton.style.border = 'none';
exportclosebutton.style.width = '505px';
exportclosebutton.style.align = 'center';
exportclosebutton.textContent='Close';
exporttitlebutton.style.backgroundColor = 'black';
exporttitlebutton.style.color = 'white';
//exporttitlebutton.style.border = 'none';
exporttitlebutton.style.width = '101px';
exporttitlebutton.style.align = 'center';
exporttitlebutton.textContent='Title';
exporturlbutton.style.backgroundColor = 'black';
exporturlbutton.style.color = 'white';
//exporturlbutton.style.border = 'none';
exporturlbutton.style.width = '101px';
exporturlbutton.style.align = 'center';
exporturlbutton.textContent='URL';
exportreqbutton.style.backgroundColor = 'black';
exportreqbutton.style.color = 'white';
//exportreqbutton.style.border = 'none';
exportreqbutton.style.width = '101px';
exportreqbutton.style.align = 'center';
exportreqbutton.textContent='Req';
exportpandabutton.style.backgroundColor = 'black';
exportpandabutton.style.color = 'white';
//exportpandabutton.style.border = 'none';
exportpandabutton.style.width = '101px';
exportpandabutton.style.align = 'center';
exportpandabutton.textContent='PandA';
exporttobutton.style.backgroundColor = 'black';
exporttobutton.style.color = 'white';
//exporttobutton.style.border = 'none';
exporttobutton.style.width = '101px';
exporttobutton.style.align = 'center';
exporttobutton.textContent='TO';
exportdiv.style.position = 'fixed';
exportdiv.style.width = '505px';
exportdiv.style.height = '155px';
exportdiv.style.left = '50%';
exportdiv.style.right = '50%';
exportdiv.style.margin = '-250px 0px 0px -250px';
exportdiv.style.top = '300px';
exportdiv.style.padding = 'none'; // def 5px
exportdiv.style.border = 'none'; //def 2px
exportdiv.style.backgroundColor = 'black';
exportdiv.style.color = 'white';
exportdiv.style.zIndex = '1000';
exportdiv.style.display = 'none';
document.body.insertBefore(exportdiv, document.body.firstChild);
exporttextarea1.style.padding = 'none';
exporttextarea1.style.width = '500px';
exporttextarea2.style.padding = 'none';
exporttextarea2.style.width = '500px';
exporttextarea2.style.height = '30px';
exporttextarea2.style.overflow = 'hidden';
exporttextarea2.setAttribute('id','hwtf_url');
exporttextarea3.style.padding = 'none';
exporttextarea3.style.width = '500px';
exporttextarea3.style.height = '30px';
exporttextarea3.style.overflow = 'hidden';
exporttextarea3.setAttribute('id','hwtf_req');
exporttextarea4.style.padding = 'none';
exporttextarea4.style.width = '500px';
exporttextarea4.style.height = '30px';
exporttextarea4.style.overflow = 'hidden';
exporttextarea4.setAttribute('id','hwtf_panda');
exporttextarea5.style.padding = '2px';
exporttextarea5.style.width = '500px';
exporttextarea5.style.height = '20px';
exporttextarea5.style.overflow = 'hidden';
exporttextarea5.setAttribute('id','hwtf_to');
exportdiv.style.fontSize = '12px';
//exportdiv.style.display = 'block';
function display(hit, extype){
var thisReqName = hit["requester_strip"];
var thisReqId = "unavailable";
if ( accountStatus == "loggedIn" )
{
thisReqId = hit["rid"];
}
var thisTitle = hit["title"].replace(" (Requester link substituted)","");
var thisReward = hit["reward"];
var thisTimeLimit = hit["time"];
var thisHitsAvail = "??";
if ( accountStatus == "loggedIn" )
{
thisHitsAvail = hit["hits"];
}
var qualList = hit["quals"];
var qualColl = qualList.split(';');
var masterQual = '';
var locationStat = 'ICA';
var locationIndex = null;
for ( var m = 0; m < qualColl.length; m++ ) {
if ( qualColl[m].indexOf('Masters') > -1 ) {
masterQual = (extype == "irc") ? 'MASTERS • ' : ' [MASTERS]';
}
else if (qualColl[m].indexOf('is US') > -1) {
locationStat = ' US';
locationIndex = m;
}
else if (qualColl[m].match(/approval rate/)) {
qualColl[m] = qualColl[m].replace(/[A-Za-z ]+\(%\) is (?:not less than (\d+)|greater than (\d+))/, '>$1$2%');
}
else if (qualColl[m].match(/approved HITs/)) {
qualColl[m] = qualColl[m].replace(/Total approved HITs is (?:not less than (\d+)|greater than (\d+))/, '>$1$2');
qualColl[m] = qualColl[m].replace(/Total approved HITs is (?:not greater than (\d+)|less than (\d+))/, '<$1$2');
}
}
if (extype == "reddit" && locationIndex != null) qualColl.splice(locationIndex,1);
if (qualColl[0] == null) qualColl = "None";
var prevUrl = (thisReqId == "unavailable") ? "Unavailable due to logged out scraper" : LINK_BASE+hit["prev_link"];
var accUrl = (thisReqId == "unavailable") ? "Unavailable due to logged out scraper" : LINK_BASE+hit["acc_link"];
var thisPreviewUrl = (extype == "irc") ? shortenUrl(prevUrl) : prevUrl;
var thisPandaUrl = (extype == "irc") ? shortenUrl(accUrl) : accUrl;
var thisReqUrl = "(url n/a)";
if ( thisReqId != "unavailable")
{
if (extype == "irc")
thisReqUrl = shortenUrl('https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&requesterId=' + thisReqId);
else
thisReqUrl = 'https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&requesterId=' + thisReqId;
}
else if ( thisReqId == "unavailable") // handle 2015-07-20 loss of logged-out requester ids
{
if (extype == "irc")
thisReqUrl = shortenUrl('https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&searchWords=' + thisReqName.replace(/ /g, "+") ) + " (search)";
else
thisReqUrl = 'https://www.mturk.com/mturk/searchbar?selectedSearchType=hitgroups&searchWords=' + thisReqName.replace(/ /g, "+") + " (Requester search URL due to logged out scraper)";
}
var hitLinkUnav = '';
//if ( capGId == 'unavailable' ) { capUrl = capReqUrl; pandaUrl = ""; hitLinkUnav = " (preview link unavailable)"; } // handle logged-out export requests for HITs with no preview/notqualified links ** This is handled at line 647
if (hit["prev_link"].indexOf("requesterId") > -1)
{
hitLinkUnav = " (preview link unavailable)";
thisPandaUrl = "";
}
var thisTOUrl = "(url n/a)";
var thisTOStats = "??";
if ( thisReqId != "unavailable" )
{
thisTOUrl = (extype == "irc") ? shortenUrl(TO_BASE+thisReqId) : TO_BASE+thisReqId;
thisTOStats = getTO(thisReqId);
}
else if ( thisReqId == "unavailable") // handle 2015-07-20 loss of logged-out requester ids
{
thisTOUrl = (extype == "irc") ? shortenUrl('https://turkopticon.ucsd.edu/main/php_search?query=' + thisReqName.replace(/ /g, "+") ) + " (search)" : 'https://turkopticon.ucsd.edu/main/php_search?query=' + thisReqName.replace(/ /g, "+") +" (TO search URL due to logged out scraper)";
}
var shortUrlUnav = '';
if ( (thisPreviewUrl == "(x)") && (thisHitGroup != "unavailable") )
{
shortUrlUnav = " \r\n^ https://www.mturk.com/mturk/preview?groupId=" + thisHitGroup;
}
var exportOutput = "";
var loggedOutApology = " (Info missing since logged out.)";
var temp = [];
for (var i = 0; i < qualColl.length; i++)
{
var search = /b\](.*?)\[/.exec(qualColl[i]);
if (search)
temp[i] = search[1].trim();
else
temp[i] = qualColl[i].trim();
}
if (temp[0] != "None")
var qualString = temp.join(", ");
else
qualString = temp;
var exTitle = locationStat + ' - ' + thisTitle.replace(" (Preview link unavailable)","") + ' - ' + thisReqName + ' - ' + thisReward + '/' + 'COMTIME - ' + '(' + qualString + ')' + masterQual;
var exUrl = 'URL: ' + thisPreviewUrl +'\n\n';
var exReq = 'Req: ' + thisReqUrl +'\n\n';
var exTO = 'TO: ' + thisTOUrl +'\n\n';
var exPanda = 'PandA: ' + thisPandaUrl +'\n\n';
if ( accountStatus == "loggedIn" )
{
if (extype == "irc") {
exportOutput = masterQual + 'Requester: ' + thisReqName + ' ' + thisReqUrl + ' • ' + 'HIT: ' + thisTitle + ' ' + thisPreviewUrl + ' • ' + 'Pay: ' + thisReward + ' • ' + 'Avail: ' + thisHitsAvail + ' • ' + 'Limit: ' + thisTimeLimit + ' • ' + 'TO: ' + 'Pay='+thisTOStats[1] + ' Fair='+thisTOStats[2] + ' Comm='+thisTOStats[0] + ' ' + thisTOUrl + ' • ' + 'PandA: ' + thisPandaUrl + shortUrlUnav ;
exporttextarea1.value = exportOutput;
exporttextarea1.style.height = '130px';
exporttextarea1.setAttribute('id', 'ircexport_text');
exportdiv.textContent = 'IRC Export: Press Ctrl+C to (re-)copy to clipboard. Click textarea to close.';
exportdiv.appendChild(exporttextarea1);
exporttextarea1.addEventListener("click", function(){ exportdiv.style.display = 'none'; }, false);
exportdiv.style.display = 'block';
exporttextarea1.select();
if (GM_setClipboard) { GM_setClipboard(exportOutput); }
}
else if (extype == "reddit") {
exporttextarea1.value = exTitle;
exporttextarea2.value = exUrl;
exporttextarea3.value = exReq;
exporttextarea4.value = exPanda;
exporttextarea5.value = exTO;
exporttextarea1.style.height = '50px';
exporttextarea1.setAttribute('id','hwtf_title');
exportdiv.textContent = 'r/HitsWorthTurkingFor Export: Use the buttons for single-click copying.';
exportdiv.appendChild(exporttextarea1);
exportdiv.appendChild(exporttextarea2);
exportdiv.appendChild(exporttextarea3);
exportdiv.appendChild(exporttextarea4);
exportdiv.appendChild(exporttextarea5);
exportdiv.appendChild(exporttitlebutton);
exportdiv.appendChild(exporturlbutton);
exportdiv.appendChild(exportreqbutton);
exportdiv.appendChild(exportpandabutton);
exportdiv.appendChild(exporttobutton);
exportdiv.appendChild(exportclosebutton);
document.body.insertBefore(exportdiv, document.body.firstChild);
exportclosebutton.addEventListener("click", function(){ exportdiv.style.display = 'none'; }, false);
exporttitlebutton.addEventListener("click", function(){ exporttextarea1.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea1.value); } }, false);
exporturlbutton.addEventListener("click", function(){ exporttextarea2.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea2.value); } }, false);
exportreqbutton.addEventListener("click", function(){ exporttextarea3.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea3.value); } }, false);
exportpandabutton.addEventListener("click", function(){ exporttextarea4.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea4.value); } }, false);
exporttobutton.addEventListener("click", function(){ exporttextarea5.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea5.value); } }, false);
exportdiv.style.display = 'block';
//exporttextarea1.focus();
var tindex = exTitle.search(/COMTIME/);
exporttextarea1.setSelectionRange(tindex, tindex+7); // pre-select completion time
}
}
else if ( accountStatus == "loggedOut" )
{
if (extype == "irc") {
exportOutput = masterQual + 'Requester: ' + thisReqName + ' ' + thisReqUrl + ' • ' + 'HIT: ' + thisTitle + ' ' + thisPreviewUrl + ' • ' + 'Pay: ' + thisReward + ' • ' + 'Avail: ' + thisHitsAvail + ' • ' + 'Limit: ' + thisTimeLimit + ' • ' + 'TO: ?? ' + thisTOUrl + ' • ' + 'PandA: ' + thisPandaUrl + loggedOutApology + shortUrlUnav ;
exporttextarea1.value = exportOutput;
exporttextarea1.style.height = '130px';
exporttextarea1.setAttribute('id', 'ircexport_text');
exportdiv.textContent = 'IRC Export: Press Ctrl+C to (re-)copy to clipboard. Click textarea to close.';
exportdiv.appendChild(exporttextarea1);
exporttextarea1.addEventListener("click", function(){ exportdiv.style.display = 'none'; }, false);
exportdiv.style.display = 'block';
exporttextarea1.select();
if (GM_setClipboard) { GM_setClipboard(exportOutput); }
}
else if (extype == "reddit") {
exporttextarea1.value = exTitle;
exporttextarea2.value = exUrl;
exporttextarea3.value = exReq;
exporttextarea4.value = exPanda;
exporttextarea5.value = exTO;
exporttextarea1.style.height = '50px';
exporttextarea1.setAttribute('id','hwtf_title');
exportdiv.textContent = 'r/HitsWorthTurkingFor Export: Use the buttons for single-click copying.';
exportdiv.appendChild(exporttextarea1);
exportdiv.appendChild(exporttextarea2);
exportdiv.appendChild(exporttextarea3);
exportdiv.appendChild(exporttextarea4);
exportdiv.appendChild(exporttextarea5);
exportdiv.appendChild(exporttitlebutton);
exportdiv.appendChild(exporturlbutton);
exportdiv.appendChild(exportreqbutton);
exportdiv.appendChild(exportpandabutton);
exportdiv.appendChild(exporttobutton);
exportdiv.appendChild(exportclosebutton);
document.body.insertBefore(exportdiv, document.body.firstChild);
exportclosebutton.addEventListener("click", function(){ exportdiv.style.display = 'none'; }, false);
exporttitlebutton.addEventListener("click", function(){ exporttextarea1.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea1.value); } }, false);
exporturlbutton.addEventListener("click", function(){ exporttextarea2.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea2.value); } }, false);
exportreqbutton.addEventListener("click", function(){ exporttextarea3.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea3.value); } }, false);
exportpandabutton.addEventListener("click", function(){ exporttextarea4.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea4.value); } }, false);
exporttobutton.addEventListener("click", function(){ exporttextarea5.select(); if (GM_setClipboard) { GM_setClipboard(exporttextarea5.value); } }, false);
exportdiv.style.display = 'block';
//exporttextarea1.focus();
var tindex = exTitle.search(/COMTIME/);
exporttextarea1.setSelectionRange(tindex, tindex+7); // pre-select completion time
}
}
}