var cur_str_chr;
function json_parse(text) {
	var at = 0;
	var ch = ' ';

	function error(m) {
		throw {
			name: 'JSONError',
			message: m,
			at: at - 1,
			text: text
		};
	}
	
	function next() {
		ch = text.charAt(at);
		at += 1;
		return ch;
	}
	
	function white() {
		while (ch !== '' && ch <= ' ') {
			next();
		}
	}
	
	function str() {
		var i, s = '', t, u;
	
		if (ch == '\'' || ch == '"') { //change " to ' for python
			cur_str_chr = ch;
			outer:          
				while (next()) {
					if (ch == cur_str_chr) {
						next();
						return s;
					} else if (ch == '\\') {
						switch (next()) {
							case 'b':
								s += '\b';
								break;
							case 'f':
								s += '\f';
								break;
							case 'n':
								s += '\n';
								break;
							case 'r':
								s += '\r';
								break;
							case 't':
								s += '\t';
								break;
							case 'u':
								u = 0;
								for (i = 0; i < 4; i += 1) {
									t = parseInt(next(), 16);
									if (!isFinite(t)) {
										break outer;
									}
									u = u * 16 + t;
								}
								s += String.fromCharCode(u);
								break;
							default:
								s += ch;
						}
					} else {
						s += ch;
					}
				}
			}
		error("Bad string");
	}
	
	function arr() {
		var a = [];
	
		if (ch == '[') {
			next();
			white();
			if (ch == ']') {
				next();
				return a;
			}
			while (ch) {
				a.push(val());
				white();
				if (ch == ']') {
					next();
					return a;
				} else if (ch != ',') {
					break;
				}
				next();
				white();
			}
		}
		error("Bad array");
	}
	
	function obj() {
		var k, o = {};
	
		if (ch == '{') {
			next();
			white();
			if (ch == '}') {
				next();
				return o;
			}
			while (ch) {
				k = str();
				white();
				if (ch != ':') {
					break;
				}
				next();
				o[k] = val();
				white();
				if (ch == '}') {
					next();
					return o;
				} else if (ch != ',') {
					break;
				}
				next();
				white();
			}
		}
		error("Bad object");
	}
	
	function num() {
		var n = '', v;
		if (ch == '-') {
			n = '-';
			next();
		}
		while (ch >= '0' && ch <= '9') {
			n += ch;
			next();
		}
		if (ch == '.') {
			n += '.';
			while (next() && ch >= '0' && ch <= '9') {
				n += ch;
			}
		}
		if (ch == 'e' || ch == 'E') {
			n += 'e';
			next();
			if (ch == '-' || ch == '+') {
				n += ch;
				next();
			}
			while (ch >= '0' && ch <= '9') {
				n += ch;
				next();
			}
		}
		if (ch == 'L')next();//for python long
			v = +n;
			if (!isFinite(v)) {
			error("Bad number");
		} else {
			return v;
		}
	}
	
	function word() {
		switch (ch) {
			case 't':
				if (next() == 'r' && next() == 'u' && next() == 'e') {
					next();
					return true;
				}
				break;
			case 'f':
				if (next() == 'a' && next() == 'l' && next() == 's' && next() == 'e') {
					next();
					return false;
				}
				break;
			case 'n':
				if (next() == 'u' && next() == 'l' && next() == 'l') {
					next();
					return null;
				}
				break;
		}
		error("Syntax error");
	}
	
	function val() {
		white();
		switch (ch) {
			case '{':
				return obj();
			case '[':
				return arr();
			case '\'':
			case '"':
				return str();
			case '-':
				return num();
			default:
				return ch >= '0' && ch <= '9' ? num() : word();
		}
	}
	
	return val();
}
	
xmlhttp = window.XMLHttpRequest?new XMLHttpRequest(): new ActiveXObject("Microsoft.XMLHTTP");

function loadFirstURL(url, ran) { 
	if (ran == 0) {
   		xmlhttp.open('GET', url, true);
    	xmlhttp.onreadystatechange = displayResults;
    	xmlhttp.send(null);
	}
}

function displayResults() {
	if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
		var json_data = json_parse(xmlhttp.responseText);
		tableHTML = json_data[0];
		document.getElementById("random_table").innerHTML = tableHTML;
	}
}

function launchIt() {
	ran = 0;
	rand = Math.random();
	loadFirstURL("/random_images.py?rand=" + rand, ran);
}
