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 htmlnotification = ''; var jsonmapdata = new Object; //var jsonmapdata.solutions = new Array(); var mapType; // 1 = simple, 2 = normal, ...; used for mixpanel tracking var pressedGoTime = 0; // 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 += '
[Close]
'; pref += '
'; var suff = '
'; //var suff = ''; 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"); } function doSend(mapid) { if (solution[mapid] == undefined) { getmapdata(mapid); } pressedGoTime = new Date().getTime(); reqstr = "&mapcode="+mapdata[mapid].code; reqstr += "&mapid="+mapid; reqstr += "&solution="+solution[mapid]; 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(); } 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() { var JO = decryptJSON(ajax.response); var mapid = JO.mapid; mapjson[mapid] = JO; var speedbox = document.getElementById(mapid+',speed'), speed = speedbox.options[speedbox.selectedIndex].text, mute = !checkSound(mapid); nowTime = new Date().getTime(); var responseTime = nowTime - pressedGoTime; mixpanel.track('click go', { 'speed': speed, 'mute': mute, 'mapid': JO.mapid, 'type': mapType, 'response time': responseTime }); 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.path1.path, JO.mapid, JO.path1.start); animatePath(JO.path2.path, JO.mapid, JO.path2.start); } function decryptJSON(text) { if (typeof(JSON) == 'undefined') { 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); } return JO; } 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) { // console.log('Animate Path Done', mapid); scoresRequestPage(mapid, currentPage[mapid]); document.getElementById(mapid+',btn').disabled = false; if (isChallenge == true) { challengeGo(mapid); } } 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 + 410; snake[mapid]['color'] = '#FFFF11'; //handle.style.backgroundColor = "#000000"; break; case 'c': rs = rs + 410; snake[mapid]['color'] = '#FF4466'; break; case 'd': rs = rs + 410; snake[mapid]['color'] = '#ff9911'; break; case 'e': rs = rs + 410; snake[mapid]['color'] = '#00FFFF'; break; //Finish target case 'f': rs = rs + 410; 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 + 1200; 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