function XHConn() { var xmlhttp, bComplete = false; try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp = false; } } } if (!xmlhttp) return null; this.connect = function (sURL, sVars, fnDone) { if (!xmlhttp) return false; bComplete = false; try { xmlhttp.open("GET", sURL + '?' + sVars, true); sVars = ''; xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4 && !bComplete) { bComplete = true; fnDone(xmlhttp); xmlhttp.onreadystatechange = EmptyFunction; } }; xmlhttp.send(sVars); } catch (z) { return false; } return true; }; return this; } function EmptyFunction() {} function $(el) { return document.getElementById(el); } Array.prototype.copy = function () { var arr = new Array(this.length); for (var i = 0; i < this.length; i++) { arr[i] = this[i]; } return arr; } Array.prototype.equals = function (arr) { if (arr == null) return false; if (this.length != arr.length) return false; for (var i = 0; i < this.length; i++) { if (this[i] != arr[i]) return false; } return true; } /* Taken from the other */ function getCookie(_13) { if (window.widget) { var tmp = widget.preferenceForKey(_13); } if (tmp && tmp.length > 0) { return tmp; } else { return ""; } } function setCookie(_15, _16) { if (window.widget) { widget.setPreferenceForKey(String(_16), _15); } } /* :3 */ function JawBreaker() { var self = this; this.startClicks = 1; this.board = null; this.undoBoard = null; this.undoScore = 0; this.undoColor = null; this.undoPieces = 0; this.areaW = 13; this.areaH = 14; this.numColors = 5; this.colors = Array("white", "red", "blue", "green", "yellow", "purple"); this.gameScore = 0; this.selectedBlocks = null; this.uuid = null; this.Ajax = new XHConn(); this.pcount = Array(); this.jblocks = false; this.level = 1; this.levels = Array(0, 750, 3000, 6750, 12000, 18750, 27000, 36750, 48000, 60750, 75000, 90000, 105000, 120000, 135000, 150000, 165000, 180000, 205000, 99999999); this.lastScore = 0; this.save_score = [0,0,0,0,0,0,0]; // I have added this. this.load_score = false; // Also this. this.start = function (keepScore) { if (self.board == null) { self.board = new Array(self.areaH); self.undoBoard = new Array(self.areaH); var tbody = $('boardbody'); var x, y; for (y = 0; y < self.areaH; y++) { self.board[y] = new Array(self.areaW); self.undoBoard[y] = new Array(self.areaW); var row = document.createElement('TR'); for (x = 0; x < self.areaW; x++) { var cell = document.createElement('TD'); var link = document.createElement('A'); var img = document.createElement('DIV'); link.onclick = function (e) { self.mouseclick(e); } img.id = self.cid(y, x); link.appendChild(img); cell.appendChild(link); row.appendChild(cell); } tbody.appendChild(row); } self.saveScore(); } self.jblocks = (self.areaW == 14 && self.areaH == 9); if (self.jblocks) { $('bscore').innerHTML = self.numberFormat(self.levels[self.level]); } self.pcount["purple"] = 0; self.pcount["blue"] = 0; self.pcount["green"] = 0; self.pcount["red"] = 0; self.pcount["yellow"] = 0; var color; for (y = 0; y < self.areaH; y++) { for (x = 0; x < self.areaW; x++) { color = self.rnd(self.numColors); self.board[y][x] = color; self.pcount[color] += 1; self.draw(y, x); } } if (keepScore == undefined || keepScore == false) { self.gameScore = 0; self.lastScore = 0; self.score(0); } self.disable('m-undo'); var max = 0; for (x = 1; x < self.colors.length; x++) { color = self.colors[x]; if (self.pcount[color] > max) { max = self.pcount[color]; } } for (x = 1; x < self.colors.length; x++) { color = self.colors[x]; if (self.pcount[color] == max) { if (max > (self.areaH * self.areaW * 0.3)) $(color).innerHTML = "" + self.pcount[color] + ""; else $(color).innerHTML = "" + self.pcount[color] + ""; } else $(color).innerHTML = self.pcount[color]; } } this.disable = function (id) { $(id).disabled = true; $(id).style.color = '#999'; } this.enable = function (id) { $(id).disabled = false; $(id).style.color = '#000'; } this.saveScore = function (score) {/* var url = "score.php"; var p = "uuid=" + self.uuid + "&board=" + self.areaH + "x" + self.areaW; if (score) p += "&score=" + score; self.Ajax.connect(url, p, self.showScore);*/ var is_score = score; var i = 0; if (!this.load_score) { this.load_score = true; for (i=0;i<7;i++) { this.save_score[i] = getCookie("score_"+i); if (this.save_score[i] == "") this.save_score[i] = 0; } } var played = this.save_score[5]; var avg = this.save_score[6]; var scores = this.save_score.reverse().slice(2); // Get the scores if (!score) score = 0; scores = scores.concat(score).sort().slice(1).sort(function (a,b){return b-a;}); this.save_score = scores.concat(played,avg); if (is_score) { scores = this.save_score[6] * this.save_score[5]; scores += score; this.save_score[5] += 1; this.save_score[6] = scores / this.save_score[5]; } for (i=0;i<7;i++) { setCookie("score_"+i,this.save_score[i]); } self.showScore(0); } this.showScore = function (req) { var arr = []; var i = 0; for (i=0;i<7;i++) { if (i<5) { arr = arr.concat("userbest"+(i+1),this.save_score[i]); } if (i==5) { arr = arr.concat("usergames",this.save_score[i]); } if (i==6) { arr = arr.concat("useraverage", this.save_score[i].toFixed(2)); } } for (var i = 0; i < arr.length; i += 2) { try { if (arr[i] == "usergames" || arr[i] == "useraverage" || arr[i] == "userbest") { $(arr[i] + "1").innerHTML = arr[i + 1]; } else { $(arr[i]).innerHTML = arr[i + 1]; } } catch (e) {} } } this.getNeighbors = function (list, y, x, c) { if (y < 0 || y >= self.areaH || x < 0 && x >= self.areaW) { return list; } if (self.board[y][x] != c || self.board[y][x] == "white") { return list; } for (var i = 0; i < list.length; i++) { if (list[i] == self.cid(y, x)) { return list; } } list.push(self.cid(y, x)); self.getNeighbors(list, y - 1, x, c); self.getNeighbors(list, y + 1, x, c); self.getNeighbors(list, y, x - 1, c); self.getNeighbors(list, y, x + 1, c); return list; } this.mouseclick = function (e) { var el; if (!e) var e = window.event; if (e.target) el = e.target; else if (e.srcElement) el = e.srcElement; if (el.nodeType == 3) el = el.parentNode; var id = el.id; if (id.match(/r\d+c\d+/)) { var rc = self.rc(id); list = self.getNeighbors(new Array(), rc[0], rc[1], self.board[rc[0]][rc[1]]); list.sort(); if (list.equals(self.selectedBlocks)) { var color = self.board[rc[0]][rc[1]]; self.pcount[color] -= list.length; $(color).innerHTML = self.pcount[color]; self.undoColor = color; self.undoPieces = list.length; self.copyBoard(self.board, self.undoBoard); self.undoScore = self.removeBlocks(list); self.selectedBlocks = null; if (self.gameScore > 0) self.enable('m-undo'); } else { self.deselectBlocks() self.selectBlocks(list); } } } this.copyBoard = function (src, dst) { for (y = 0; y < self.areaH; y++) { for (x = 0; x < self.areaW; x++) { dst[y][x] = src[y][x]; } } } this.rc = function (id) { var rc = id.match(/r0?(\d+)c0?(\d+)/); return new Array(parseInt(rc[1]), parseInt(rc[2])) } this.cid = function (y, x) { if (y < 10) y = "0" + y; if (x < 10) x = "0" + x; return "r" + y + "c" + x; } this.selectBlocks = function (list) { if (list.length < 2) return; for (var i = 0; i < list.length; i++) { var rc = self.rc(list[i]); self.draw(rc[0], rc[1], true); } self.blockScore(list.length); self.selectedBlocks = list.copy(); } this.deselectBlocks = function () { if (self.selectedBlocks != null) { for (var i = 0; i < self.selectedBlocks.length; i++) { var rc = self.rc(self.selectedBlocks[i]); self.draw(rc[0], rc[1]); } } self.selectedBlocks = null; self.blockScore(0); } this.removeBlocks = function (list) { if (list.length < 2) { return 0; } var minx = 999999; var maxx = -1; var x; var y; for (var i = 0; i < list.length; i++) { var rc = self.rc(list[i]); y = rc[0]; x = rc[1]; if (x < minx) minx = x; if (x > maxx) maxx = x; self.board[y][x] = "remove"; } for (y = 0; y < self.areaH; y++) { for (x = minx; x <= maxx; x++) { if (self.board[y][x] == "remove") { for (var i = y; i > 0; i--) { self.board[i][x] = self.board[i - 1][x]; self.draw(i, x); } self.board[0][x] = "white"; self.draw(0, x); } } } for (x = 1; x < self.areaW; x++) { if (self.isColEmpty(x)) { for (var xx = x; xx > 0; xx--) { self.moveCols(xx); } } } var score = self.score(list.length); if (self.isGameOver()) { self.endGame(); } return score; } this.endGame = function () { var count = 0; for (var y = 0; y < self.areaH; y++) { for (var x = 0; x < self.areaW; x++) { if (self.board[y][x] != "white") count++; } } var pc = Math.round((1 - count / (self.areaH * self.areaW)) * 100); var bonus = 0; if (pc > 85) { if (self.jblocks) { var n = pc - 85; bonus = n * n * 25; } else { var max = Math.round((Math.pow(Math.pow(self.areaH, 2) * .21, 2) + 100) / 100) * 100; bonus = Math.round((Math.pow(max, Math.pow((pc - 50) / 50, 1.8)) + 4) / 10) * 10; } } self.gameScore += bonus; var msg = "Game Over!"; var score = self.gameScore; var needed = null; if (self.jblocks) { if (self.gameScore > self.levels[self.level]) { msg = "You completed level " + (self.level) + "!"; score = self.gameScore - self.lastScore; } else { needed = " but needed " + self.numberFormat(self.levels[self.level]) + " to advance."; } } msg += " You scored " + self.numberFormat(score) + " points"; if (needed != null) { msg += needed; } else if (bonus > 0) { msg += " which includes a bonus of " + self.numberFormat(bonus) + " for clearing " + pc + "% of the board!"; } else { msg += "."; } alert(msg); if (self.jblocks) { if (self.gameScore > self.levels[self.level]) { $('userscore').innerHTML = self.numberFormat(self.gameScore); self.level++; $('blevel').innerHTML = self.level; $('bscore').innerHTML = self.numberFormat(self.levels[self.level]); self.lastScore = self.gameScore; self.start(true); } else { self.level = 1; $('blevel').innerHTML = 1; $('bscore').innerHTML = self.levels[1]; self.saveScore(self.gameScore); self.start(); } } else { self.saveScore(self.gameScore); self.start(); } } this.moveCols = function (x) { for (var y = 0; y < self.areaH; y++) { self.board[y][x] = self.board[y][x - 1]; self.draw(y, x); self.board[y][x - 1] = "white"; self.draw(y, x - 1); } } this.numberFormat = function (n) { var str = '' + n; var r = /(\d+)(\d{3})/; while (r.test(str)) { str = str.replace(r, '$1' + ',' + '$2'); } return str; } this.isColEmpty = function (c) { for (var r = 0; r < self.areaH; r++) { if (self.board[r][c] != "white") { return false; } } return true; } this.isGameOver = function () { var list = new Array(); for (var y = 0; y < self.areaH; y++) { for (var x = 0; x < self.areaW; x++) { if (self.board[y][x] != "white") { list = self.getNeighbors(list, y, x, self.board[y][x]); if (list.length > 1) return false; list.pop(); } } } return true; } this.draw = function (y, x, selected) { var cn; if (selected) { cn = "blk s_"; } else { cn = "blk p_"; } var el = $(self.cid(y, x)); el['className'] = cn + self.board[y][x]; } this.redrawBoard = function () { for (var y = 0; y < self.areaH; y++) { for (var x = 0; x < self.areaW; x++) { var el = $(self.cid(y, x)); el['className'] = "blk p_" + self.board[y][x]; } } } this.rnd = function (max) { var n = Math.ceil(max * Math.random()); return self.colors[n]; } this.score = function (n) { var score = 0; if (n > 1) { if (self.jblocks) { score = n * n * 5; } else { score = n * (n - 1); } } self.gameScore += score; $('userscore').innerHTML = self.numberFormat(self.gameScore); self.blockScore(0); return score; } this.blockScore = function (n) { var score = 0; if (n > 1) { if (self.jblocks) { score = n * n * 5; } else { score = n * (n - 1); } } $('blockscore').innerHTML = self.numberFormat(score); $('blockcount').innerHTML = n; } this.undo = function () { self.copyBoard(self.undoBoard, self.board); self.redrawBoard(); self.gameScore -= self.undoScore; var color = self.undoColor; self.pcount[color] += self.undoPieces; $(color).innerHTML = self.pcount[color]; self.blockScore(0); $('userscore').innerHTML = self.numberFormat(self.gameScore); self.disable('m-undo'); } var helpWin = new Window("g-help"); var statWin = new Window("g-stats"); var optsWin = new Window("g-options"); $("m-start").onclick = function () { self.level = 1; helpWin.close(); statWin.close(); optsWin.close(); self.start(); this.blur(); } $("m-undo").onclick = function () { self.undo(); this.blur(); } $("m-help").onclick = function () { optsWin.close(); statWin.close(); helpWin.activate(); this.blur(); } $("m-stats").onclick = function () { optsWin.close(); helpWin.close(); statWin.activate(); this.blur(); } $("m-options").onclick = function () { helpWin.close(); statWin.close(); optsWin.activate(); this.blur(); } $("g-help-close").onclick = helpWin.close; $("g-stats-close").onclick = statWin.close; $("g-options-close").onclick = optsWin.close; function Window(id) { this.el = $(id); var self = this; this.activate = function () { self.el.style.display = (self.el.style.display == "block" ? "none" : "block"); } this.close = function () { self.el.style.display = "none"; } this.isActive = function () { return (self.display == "block"); } } }