Skip to content

Commit

Permalink
Data and aesthetic fixes
Browse files Browse the repository at this point in the history
-Use stringify from Crockford's JSON2.js
-Fix debug div formatting for firefox
  • Loading branch information
longouyang committed Nov 1, 2011
1 parent f6155e7 commit 7002b78
Showing 1 changed file with 37 additions and 27 deletions.
64 changes: 37 additions & 27 deletions mmturkey.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
// Bundle in Crockford's JSON2.js
var JSON;JSON||(JSON={});
(function(){function k(a){return a<10?"0"+a:a}function o(a){p.lastIndex=0;return p.test(a)?'"'+a.replace(p,function(a){var c=r[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function l(a,j){var c,d,h,m,g=e,f,b=j[a];b&&typeof b==="object"&&typeof b.toJSON==="function"&&(b=b.toJSON(a));typeof i==="function"&&(b=i.call(j,a,b));switch(typeof b){case "string":return o(b);case "number":return isFinite(b)?String(b):"null";case "boolean":case "null":return String(b);case "object":if(!b)return"null";
e+=n;f=[];if(Object.prototype.toString.apply(b)==="[object Array]"){m=b.length;for(c=0;c<m;c+=1)f[c]=l(c,b)||"null";h=f.length===0?"[]":e?"[\n"+e+f.join(",\n"+e)+"\n"+g+"]":"["+f.join(",")+"]";e=g;return h}if(i&&typeof i==="object"){m=i.length;for(c=0;c<m;c+=1)typeof i[c]==="string"&&(d=i[c],(h=l(d,b))&&f.push(o(d)+(e?": ":":")+h))}else for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(h=l(d,b))&&f.push(o(d)+(e?": ":":")+h);h=f.length===0?"{}":e?"{\n"+e+f.join(",\n"+e)+"\n"+g+"}":"{"+f.join(",")+
"}";e=g;return h}}if(typeof Date.prototype.toJSON!=="function")Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+k(this.getUTCMonth()+1)+"-"+k(this.getUTCDate())+"T"+k(this.getUTCHours())+":"+k(this.getUTCMinutes())+":"+k(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()};var q=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
p=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,e,n,r={"\u0008":"\\b","\t":"\\t","\n":"\\n","\u000c":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},i;if(typeof JSON.stringify!=="function")JSON.stringify=function(a,j,c){var d;n=e="";if(typeof c==="number")for(d=0;d<c;d+=1)n+=" ";else typeof c==="string"&&(n=c);if((i=j)&&typeof j!=="function"&&(typeof j!=="object"||typeof j.length!=="number"))throw Error("JSON.stringify");return l("",
{"":a})};if(typeof JSON.parse!=="function")JSON.parse=function(a,e){function c(a,d){var g,f,b=a[d];if(b&&typeof b==="object")for(g in b)Object.prototype.hasOwnProperty.call(b,g)&&(f=c(b,g),f!==void 0?b[g]=f:delete b[g]);return e.call(a,d,b)}var d,a=String(a);q.lastIndex=0;q.test(a)&&(a=a.replace(q,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return d=eval("("+a+")"),typeof e==="function"?c({"":d},""):d;throw new SyntaxError("JSON.parse");}})();

var turk = {};

(function() {
var hopUndefined = !Object.prototype.hasOwnProperty;

var param = function(url, name ) {
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
Expand All @@ -9,14 +20,16 @@ var turk = {};
return ( results == null ) ? "" : results[1];
}

var stringify = function(obj) {
// Give an HTML representation of an object
var htmlify = function(obj) {
if (obj instanceof Array) {
return "[" + obj.map(stringify).join(",") + "]";
return "[" + obj.map(function(o) { return htmlify(o) } ).join(",") + "]";
} else if (typeof obj == "object") {
var strs = [];
for(var key in obj) {
if (obj.hasOwnProperty(key)) {
strs.push("<li>"+stringify(key) + ": " + stringify(obj[key])+"</li>");
var str = "<li>" + htmlify(key) + ": " + htmlify(obj[key]) + "</li>";
strs.push(str);
}
}
return "{<ul>" + strs.join("") + "</ul>}";
Expand All @@ -26,6 +39,14 @@ var turk = {};
return obj.toString();
}
};

HTMLFormElement.prototype.addData = function(key,value) {
var input = document.createElement('input');
input.type = 'hidden';
input.name = key;
input.value = value;
this.appendChild(input);
}

var src = param(window.location.href, "assignmentId") ? window.location.href : document.referrer;

Expand All @@ -36,49 +57,38 @@ var turk = {};

turk.previewMode = (turk.assignmentId == "ASSIGNMENT_ID_NOT_AVAILABLE");

// TODO: what do you do if data is an array, rather than an object?
// Submit a POST request to Turk
turk.submit = function(data) {
turk.submit = function(object) {
var assignmentId = turk.assignmentId,
turkSubmitTo = turk.turkSubmitTo,
filteredData = {},
hopUndefined = !Object.prototype.hasOwnProperty,
rawData = {},
form = document.createElement('form');

document.body.appendChild(form);

if (assignmentId) {
filteredData["assignmentId"] = assignmentId;
if (assignmentId) {
rawData.assignmentId = assignmentId;
}

// Filter out non-own properties and things that are functions
for(var key in data) {
if ((hopUndefined || data.hasOwnProperty(key)) && (typeof data[key] != "function") ) {
filteredData[key] = data[key];
}
}

// TODO: some refactoring
for(var key in filteredData) {
if (hopUndefined || filteredData.hasOwnProperty(key)) {
var input = document.createElement('input');
input.type = "hidden";
input.name = key;
input.value = filteredData[key];
form.appendChild(input);
for(var key in object) {
if ((hopUndefined || object.hasOwnProperty(key)) && (typeof object[key] != "function") ) {
rawData[key] = object[key];
form.addData(key, JSON.stringify(object[key]));
}
}

var debugOutput = "<p><b>Debug mode</b></p>Here is the data that would have been submitted to Turk: <ul>" + stringify(filteredData) + "</ul>";

// If there's no turk info
if (!assignmentId || !turkSubmitTo) {
// Emit the debug output and stop
var div = document.createElement('div');
div.style.font = "14px HelveticaNeue-Light";
div.style.float = "right";
div.style.fontFamily = '"HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", sans-serif';
div.style.fontSize = "14px";
div.style.cssFloat = "right";
div.style.padding = "1em";
div.style.backgroundColor = "#dfdfdf";
div.innerHTML = debugOutput;
div.innerHTML = "<p><b>Debug mode</b></p>Here is the data that would have been submitted to Turk: <ul>" + htmlify(rawData) + "</ul>"
document.body.appendChild(div);
return;
}
Expand Down

0 comments on commit 7002b78

Please sign in to comment.