var ready_done = false,
ready = function() {
if (ready_done)
return;
ready_done = true;
loadSol();
if (isChallenge)
challengeLoad();
}
if (document.readyState === 'complete')
ready();
else if (document.addEventListener) { // gecko, webkit, opera, IE 9
document.addEventListener("DOMContentLoaded", ready, false);
window.addEventListener("load", ready, false);
}
else if (document.attachEvent) { // IE 8-
document.attachEvent("onreadystatechange", ready);
window.attachEvent("onload", ready);
}
var isChallenge = false;
var challengeID = false;
var solution = new Array();
var blocks = new Array();
var count = new Array();
var mapdata = new Array();
var mapjson = new Array();
var htmlscores = '';
var htmlnotification = '';
var jsonmapdata = new Object;
//var jsonmapdata.solutions = new Array();
// function loadAllSolutions() {
// for(var i in jsonmapdata.solutions) {
// }
// }
function loadSol(sol, moves) {
if (sol == null)
if (document.getElementById('mapsol') != undefined)
sol = document.getElementById('mapsol').innerHTML;
if (sol) {
tmp = sol.split(':');
position = tmp[1].split('.');
mapid = tmp[0];
clearwalls(mapid);
for(var i in position) {
if (document.getElementById(mapid+','+position[i]) != undefined) {
object = document.getElementById(mapid+','+position[i]);
grid_click(object);
}
}
}
if (moves && mapid) {
updateDsp(mapid, 'dspCount', moves+ " moves");
}
}
function showNotification(html) {
var div = document.createElement('div');
var pref = '
';
pref += '
';
pref += '
';
var suff = '
';
//var suff = ''
//suff += 'Close ';
div.innerHTML = pref+html+suff;
document.body.appendChild(div.firstChild);
}
function changeWallColor(newColor) {
playerWallColor = newColor;
loadSol(null);
}
function changeWallEmblem(newEmblem) {
playerWallEmblem = newEmblem;
loadSol(null);
}
function grid_click(obj) {
//Prepare data
tmp = obj.id.split(',');
mapid = tmp[0] - 0;
y = tmp[1];
x = tmp[2];
//The users solution - prepare it if it's not started
if (solution[mapid] == undefined) {
getmapdata(mapid);
}
//Is this placing a wall, or removing one?
var tmp = obj.id;
childdiv = document.getElementById('child_'+tmp);
if (obj.cv) {
//Removing a wall
obj.cv = false;
//Reset childdiv to it's default.
childdiv.removeAttribute("class");
childdiv.setAttribute("class", "grid_inner");
//childdiv.style.backgroundColor = 'transparent';
//return the td obj back to it's default.
obj.style.backgroundColor = '';
obj.style.backgroundImage = '';
obj.removeAttribute("class");
obj.setAttribute("class", "grid_td");
blocks[mapid]++;
//Remove wall
solution[mapid] = solution[mapid].replace('.'+y+','+x+'.', '.');
} else {
//Placing a wall
if (blocks[mapid] < 1) {
updateDsp(mapid, 'dspWalls', "OUT!");
return;
}
obj.cv = true;
childdiv.removeAttribute("class");
childdiv.setAttribute("class", "grid_td_walls");
if (typeof playerWallColor === 'undefined' || playerWallColor == '')
obj.style.backgroundColor = '#666666';
else
obj.style.backgroundColor = playerWallColor;
if (typeof playerWallEmblem === 'undefined')
'';
else
obj.style.backgroundImage="url(images/marks/"+playerWallEmblem+")";
//Add Wall
solution[mapid] += y+','+x+'.';
blocks[mapid]--;
}
//document.getElementById('blocksdisplay').innerHTML = ""+blocks[mapid]+" ";
if (isChallenge == true) {
challengeWall(mapid);
}
updateDsp(mapid, 'dspWalls', blocks[mapid]+" walls");
//document.getElementById(mapid+',dspWalls').innerHTML = " "+blocks[mapid]+" walls";
}
function updateDsp(mapid, element, data) {
if (mapdata[mapid] == undefined)
return;
//if (mapdata[mapid].example != true) {
if (document.getElementById(mapid+','+element) != undefined) {
handle = document.getElementById(mapid+','+element);
handle.innerHTML = data;
}
//}
}
function getmapdata(mapid) {
var rawjson = jsonmapdata[mapid];
if (typeof(JSON) == 'undefined') {
//text = document.getElementById(mapid+',mapdata').innerHTML;
text = rawjson;
mapdata[mapid] = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');
//mapdata[mapid] = eval(document.getElementById(mapid+',mapdata').innerHTML);
} else {
//mapdata[mapid] = JSON.parse(document.getElementById(mapid+',mapdata').innerHTML);
mapdata[mapid] = JSON.parse(rawjson);
}
blocks[mapid] = mapdata[mapid].walls;
solution[mapid] = '.';
updateDsp(mapid, 'dspWalls', blocks[mapid]+" walls");
//document.getElementById(mapid+',dspWalls').innerHTML = " "+blocks[mapid]+" walls";
//document.getElementById(mapid+',dspWalls').innerHTML = blocks[mapid];
}
function doSend(mapid) {
if (solution[mapid] == undefined) {
getmapdata(mapid);
}
reqstr = "&mapcode="+mapdata[mapid].code;
reqstr += "&mapid="+mapid;
reqstr += "&solution="+solution[mapid];
//document.getElementById('dispdo').innerHTML = "http://mazetd.4xg.net/do.php?r=getpath"+reqstr
ajax.requestFile = "do.php?challengeID="+challengeID+"&isChallenge="+isChallenge+"&r=getpath"+reqstr; //prepare strdata
ajax.onCompletion = request_path_done; // specify function to be executed on response
ajax.runAJAX();
var speedbox = document.getElementById(mapid+',speed'),
speed = speedbox.options[speedbox.selectedIndex].text,
mute = !checkSound(mapid);
mpq.track('click go', {
'speed': speed,
'mute': mute,
'mapid': mapid
});
}
function requestSol(mapID) {
ajax.requestFile = "do.php?r=getsol&mapID="+mapID; //prepare strdata
ajax.onCompletion = requestSolDone; // specify function to be executed on response
ajax.runAJAX();
}
function requestSolDone() {
if (typeof(JSON) == 'undefined') {
text = ajax.response;
var JO = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');
} else {
var JO = JSON.parse(ajax.response);
}
if (JO.solution == 'undefined')
return;
clearwalls(JO.mapid);
loadSol(JO.mapid + ":" + JO.solution, JO.moves);
}
function clearwalls(mapid) {
if (solution[mapid] == undefined) return;
walls = solution[mapid].split('.');
for(var i in walls) {
tmp = walls[i].split(',');
eid = mapid+','+tmp[0]+','+tmp[1];
if (document.getElementById(eid) != undefined) {
obj = document.getElementById(eid);
obj.cv = false;
childdiv = document.getElementById('child_'+obj.id);
//Reset childdiv to it's default.
childdiv.removeAttribute("class");
childdiv.setAttribute("class", "grid_inner");
//return the td obj back to it's default.
obj.style.backgroundColor = '';
obj.style.backgroundImage = '';
obj.removeAttribute("class");
obj.setAttribute("class", "grid_td");
}
}
solution[mapid] = undefined;
getmapdata(mapid);
}
function resetwalls(mapid) {
answer = confirm("Remove walls and start fresh?");
if (answer) {
clearwalls(mapid);
}
}
function request_path_done() {
//document.getElementById('mapdisplay').innerHTML = ajax.response;
//if (ajax.response == undefined) return;
if (typeof(JSON) == 'undefined') {
text = ajax.response;
var JO = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');
//mapdata[mapid] = eval(document.getElementById(mapid+',mapdata').innerHTML);
} else {
var JO = JSON.parse(ajax.response);
}
mapjson[JO.mapid] = JO;
if (JO.scores)
updateDsp(JO.mapid, 'dspScore', JO.scores);
for(var i in JO.error)
console.error('\n JO error ' + JO.error[i]);
if (JO.blocked) {
alert("The path is blocked!");
return;
}
var disptext = "Record: "+JO.best+" by "+JO.bestby;
updateDsp(JO.mapid, 'dspID', disptext);
animatePath(JO.path, JO.mapid, JO.start);
//Get score update.
ajax.requestFile = "do.php?checkachieve=true&r=getscores&mapid="+JO.mapid; //prepare strdata
ajax.onCompletion = request_scores_done; // Specify function to be executed on response.
ajax.runAJAX();// Do it!
}
function animatePath(path, mapid, start) {
tmp = start.split(',');
y = tmp[0];
x = tmp[1];
p = path;
//t = p.length;
t = '';
//count[mapid] = 0;
document.getElementById(mapid+',btn').disabled = true;
doanimate(x, y, p, t, mapid);
//setTimeout("doanimate("+x+","+y+",'"+p+"',"+t+")",500);
}
function animatePathDone(mapid) {
document.getElementById(mapid+',btn').disabled = false;
if (htmlscores) {
updateDsp(mapid, 'dspScore', htmlscores);
htmlscores = '';
}
if (htmlnotification) {
//setTimeout("showNotification('"+htmlnotification+"');", 300);
showNotification(htmlnotification);
if (checkSound(mapid)) {
soundManager.setVolume('achieve', 50);
setTimeout("soundManager.play('achieve');", 350);
}
htmlnotification = '';
}
if (isChallenge == true) {
challengeGo(mapid);
}
}
function request_scores_done() {
//Get scores.
if (typeof(JSON) == 'undefined') {
text = ajax.response;
var JO = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');
//mapdata[mapid] = eval(document.getElementById(mapid+',mapdata').innerHTML);
} else {
var JO = JSON.parse(ajax.response);
}
htmlscores = JO.scores;
htmlnotification = JO.notificationtext;
}
function checkSound(mapid) {
if (document.getElementById(mapid+',mute').checked) {
return false;
}
if (typeof(soundManager) != 'object') {
return false;
}
return true;
}
var snake = new Array();
var snakeeffected = new Array();
function doanimate(x, y, p, c, mapid) {
//x, y position
//p path string being trunicated.
//c current target code.
//t next target code.
t = p.substring(0, 1);
//Animate current square, and move to next one.
if (count[mapid] == undefined) {
count[mapid] = 0;
}
if (snake[mapid] == undefined) {
snake[mapid] = new Array();
snake[mapid]['color'] = '#ccc';
}
if (count[mapid] == 0) {
if (t == 'a') {
snake[mapid]['color'] = '#F777FF';
}
if (t == 'f') {
snake[mapid]['color'] = '#ccc';
}
}
//Display movecount
updateDsp(mapid, 'dspCount', count[mapid]+ " moves");
//document.getElementById(mapid+',dspCount').innerHTML = count[mapid]+ " moves";
//Get a handle on the element.
eid = mapid+','+x+','+y;
//Verify.
if (document.getElementById(eid) == undefined) {
console.error("Path exited field...?");
animatePathDone(mapid);
return;
}
handle = document.getElementById(eid);
//Maintain our original classname, no matter the cost!
origclass = handle.className;
if ( origclass == 'grid_td_path1' ||
origclass == 'grid_td_path2' ||
origclass == 'grid_td_path3' ||
origclass == 'grid_td_path4' ) {
// if (origclass == 'grid_td_animate' || origclass == 'grid_td_animate_pre' ) {
origclass = handle.classOrigName;
//setTimeout(handle.setAttribute('class', origclass), 850);
}
//handle.style.backgroundColor = snake[mapid]['color'];
handle.classOrigName = origclass;
//Animate.
switch(c) {
case 'f':
case 'a':
if (count[mapid] !== 0)
break;
count[mapid]--;
case '1': //1 - Up
case '2': //2 - Right
case '3': //3 - Down
case '4': //4 - Left
count[mapid]++;
//Starting;
switch(count[mapid]) {
case mapjson[mapid].best:
flashelement(mapid+',dspCount', 4, "#FF0000");
break;
case 500:
case 400:
case 350:
case 300:
case 250:
case 200:
case 150:
case 100:
case 50:
if (checkSound(mapid)) {
soundManager.play('charm');
}
//Flash
flashelement(mapid+',dspCount', 4);
break;
}
childdiv = document.getElementById('child_'+handle.id);
if (childdiv.className != 'grid_td_walls') {
childdiv.setAttribute('class', 'grid_td_path'+c);
handle.style.backgroundColor = snake[mapid]['color'];
var origColor = handle.style.backgroundColor;
string = "if (document.getElementById('"+'child_'+eid+"').className == 'grid_td_path"+c+"')";
string += "document.getElementById('"+'child_'+eid+"').removeAttribute('class');";
setTimeout(string, 855);
//Maintain disabled appearnce of checkpoints
if (handle.pressed == true) {
setTimeout("document.getElementById('"+eid+"').style.backgroundColor = '#dddddd';", 865);
} else {
setTimeout("document.getElementById('"+eid+"').style.backgroundColor = '';", 865);
}
}
break;
//Teleports
case 't':
//case 'u':
case 'm':
case 'g':
case 'i':
case 'k':
case 'q': //Teleport out;
case 'b': //Checkpoints
case 'c':
case 'd':
case 'e':
case 'r':
//handle.setAttribute('class', 'grid_td_pressed');
//handle.classOrigName = 'grid_td_pressed';
snakeeffected.push("document.getElementById('"+eid+"').style.backgroundColor = '';");
snakeeffected.push("document.getElementById('"+eid+"').pressed = false;");
handle.style.backgroundColor = '#dddddd';
setTimeout("document.getElementById('"+eid+"').style.backgroundColor = '#dddddd';", 865);
handle.pressed = true;
break;
}
//Sound effects
if (c == 'r') {
if (checkSound(mapid)) {
soundManager.setVolume('bling', 50);
soundManager.play('bling');
}
}
//Done messing with current target
//Now take pre-action regarding the next tile.
//Speaking of the next tile - does it exist?
//End of the line?
if (t == '') {
//Did we beat or tie any records?
//Saw someone do this, thought it was clever.
//Switch for range result.
var disptext = ""
var improvedScore = (count[mapid] > mapjson[mapid].mybest);
switch (true) {
case (count[mapid] > mapjson[mapid].best):
disptext = "Beat "+mapjson[mapid].bestby+"'s record of "+mapjson[mapid].best+" with "+count[mapid]+"!";
break;
case (count[mapid] == mapjson[mapid].best):
disptext = "Tied "+mapjson[mapid].bestby+"'s record of "+mapjson[mapid].best;
break;
case (count[mapid] > mapjson[mapid].mybest):
disptext = "Improved score "+mapjson[mapid].mybest+ " to "+count[mapid];
break;
case (count[mapid] == mapjson[mapid].mybest):
disptext = "Tied personal best of "+count[mapid];
break;
case (count[mapid] < mapjson[mapid].mybest):
disptext = "You got "+count[mapid]+". Your best is "+mapjson[mapid].mybest;
break;
}
//if anything worth mentioning happend let them know.
if (disptext != "") {
if (checkSound(mapid) && improvedScore) {
soundManager.setVolume('charm', 50);
soundManager.setVolume('sc', 50);
soundManager.play('charm');
soundManager.play('sc');
}
updateDsp(mapid, 'dspID', disptext);
flashelement(mapid+',dspID', 8, "#FF3377");
}
//This is the end, lets reset stuff to defaults.
count[mapid] = 0;
snake[mapid]['color'] = '#ffffff';
//Bring the color back to our checkpoints/teleports.
for(var i in snakeeffected) {
//eval(snakeeffected[i]);
setTimeout((snakeeffected[i]), 2000);
}
//Clear
snakeeffected = new Array();
//We're done,
animatePathDone(mapid);
return;
}
//The next tile exists, how fast should we get there?
rs = 84;
//How fast should we be going?
selectbox = document.getElementById(mapid+',speed');
selected = selectbox.options[selectbox.selectedIndex].value;
switch (selected) {
case '1':
rs =120;
break;
case '2':
rs =84;
break;
case '3':
rs =44;
break;
case '4':
rs =22;
break;
}
//The next path code.
switch(t) {
//Are we just moving someplace?
case '1': x--; break; //1 - Up
case '2': y++; break; //2 - Right
case '3': x++; break; //3 - Down
case '4': y--; break; //4 - Left
//Special codes within the path.
//Did we aquire a target?
//Checkpoint targets:
case 'a':
// rs = rs * 9;
snake[mapid]['color'] = '#F777FF';
break;
case 'b':
rs = rs + 500;
snake[mapid]['color'] = '#FFFF11';
//handle.style.backgroundColor = "#000000";
break;
case 'c':
rs = rs + 500;
snake[mapid]['color'] = '#FF4466';
break;
case 'd':
rs = rs + 500;
snake[mapid]['color'] = '#ff9911';
break;
case 'e':
rs = rs + 500;
snake[mapid]['color'] = '#00FFFF';
break;
//Finish target
case 'f':
rs = rs + 500;
snake[mapid]['color'] = '#ccc';
break;
//Hey, we've ran into a teleport.
case 'u': //tp1
case 'n': //tp2
case 'h': //tp3
case 'j': //tp4
case 'l': //tp5
//Get teleport coords
tmp = p.split(t);
loc = tmp[1].split(',');
y = loc[0];
x = loc[1];
//Flash teleport-out
//Teleport Element ID
tpEid = mapid+','+x+','+y;
if (checkSound(mapid)) {
soundManager.setVolume('ufoblip', 50);
soundManager.play('ufoblip');
}
document.getElementById(eid).style.backgroundColor='#CCCCCC';
document.getElementById(tpEid).style.backgroundColor='#CCCCCC';
flashelement(tpEid, 8, snake[mapid]['color']);
//The path once teleported - and an r to indicate to gray the teleport-out too.
p = 'q'+tmp[2];
//Slow down
rs = rs + 1500;
setTimeout("doanimate("+x+","+y+",'"+p+"','"+t+"',"+mapid+")",rs);
return;
break;
}
//Remove move from p
p = p.substring(1);
//rs = (10 * p.length) + 40;
setTimeout("doanimate("+x+","+y+",'"+p+"','"+t+"','"+mapid+"')",rs);
}
function flashelement(eid, times, color, speed) {
if (document.getElementById(eid) == undefined) return;
if (!color) {
color = "#FFFF44";
}
if (!speed) {
speed = 220;
}
speedon = speed * .5;
//document.getElementById(eid).setAttribute('class', 'no_transition');
var currentclass = document.getElementById(eid).className;
if (document.getElementById(eid).classOrigName != undefined)
currentclass = document.getElementById(eid).classOrigName;
var currentColor = document.getElementById(eid).style.backgroundColor;
document.getElementById(eid).className='no_transition '+currentclass;
document.getElementById(eid).style.backgroundColor = '#000000';
for (var i=0; i