(function($) {
$.fn.randomize = function(childElem) {
return this.each(function() {
var $this = $(this);
var elems = $this.children(childElem);
elems.each(function() {
$(this).data("sortIndex", Math.random());
});
elems.sort(function(a,b) { var as = $(a).data("sortIndex"); var bs = $(b).data("sortIndex"); return as < bs ? -1 : bs < as ? 1 : 0;});
$this.remove(childElem);
for(var i=0; i < elems.length; i++)
$this.append(elems[i]);
});
};
$.fn.fullclick = function(callback) {
var callbacks = this.data("fullclick-callbacks");
if (callbacks == null) {
callbacks = $.Callbacks();
this.data("fullclick-callbacks", callbacks);
var mousedown = false;
this.mousedown(function() {
mousedown = true;
});
this.mouseup(function() {
if (mousedown) {
callbacks.fireWith(this, arguments);
}
mousedown = false;
});
}
callbacks.add(callback);
return function() {
callbacks.remove(callback);
};
};
})(jQuery);
var startGame = (function () {
var timer;
var clickHandlers = [];
var sortableActive = false;
return function startGame(source, target, message) {
var $message = $(message);
var $source = $(source);
var $target = $(target);
var $both = $source.add($target);
$source.append($both.find("li"));
$source.randomize("li");
var areAllOver = function() {
return $source.find("li").size() == 0;
};
var areInOrder = function() {
var success = true;
$target.find("li").each(function(i, val) {
success = success && (i == $(val).data("index"));
});
return success;
};
var gameWon = function() {
return areAllOver() && areInOrder();
};
var startTime = new Date().getTime();
var elapsedTimeString = function() {
var currentTime = new Date().getTime();
var elapsedMillis = currentTime - startTime;
var elapsedSeconds = elapsedMillis / 1000;
var elapsedMinutes = elapsedSeconds / 60;
var elapsedHours = elapsedMinutes / 60;
var portion = function(value, base, sep) {
if (value < 1) return "";
value = Math.floor(value);
var modVal = "" + value;
var baseLen = 0;
if (base) {
baseLen = ("" + (base - 1)).length;
modVal = "" + (value % base);
}
while (modVal.length < baseLen)
modVal = "0" + modVal;
return modVal + sep;
};
return "" +
portion(elapsedHours, null, ":") +
portion(elapsedMinutes + 60, 60, ":") +
portion(elapsedSeconds + 60, 60, ".") +
portion(elapsedMillis, 1000, "");
};
var cleanUp = function() {
$message.text("");
$target.removeClass("success");
if (timer)
window.clearInterval(timer);
if (sortableActive)
$both.sortable("destroy");
sortableActive = false;
$both.removeClass("playing");
$.each(clickHandlers, function(index, item) {
if (item)
item();
});
clickHandlers = [];
};
var checkGameResult = function() {
if (gameWon()) {
cleanUp();
$message.html(elapsedTimeString() + "
" + "Well done!
");
$target.addClass("success");
}
};
cleanUp();
timer = window.setInterval(function() {
$message.text(elapsedTimeString());
}, 10);
clickHandlers.push($source.fullclick(function(event) {
if (event.target != $(source)[0] && !gameWon()) {
$target.append(event.target);
checkGameResult();
}
}));
clickHandlers.push($target.fullclick(function(event) {
if (event.target != $(target)[0] && !gameWon()) {
$source.append(event.target);
checkGameResult();
}
}));
$both.addClass("playing");
$both.sortable({
connectWith: ".bible-game",
update: function (event) {
checkGameResult();
}
});
sortableActive = true;
};
})();