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");
}
}
}