/**
 * @author FlipZoom Media Inc.
 * @copyright 2011
 * @created 8.4.2011
 * @license THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
 * APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
 * HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
 * OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
 * IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
 * ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
 */

var mapAI		= 'tictac_AI';
var mapCU		= 'tictac_CU';
var mapDI		= 'tictac_DI';
var mapFields	= 9;
var mapActions	= 0;
var lastMap		= 1;		
var mapWin		= new Array([0,2,1],[0,1,2],[0,6,3],[0,3,6],[0,8,4],[0,4,8],
							[1,0,2],[1,2,0],[1,7,4],[1,4,7],
							[2,0,1],[2,1,0],[2,8,5],[2,5,8],[2,6,4],[2,4,6],
							[3,0,6],[3,6,0],[3,5,4],[3,4,5],
							[4,1,7],[4,7,1],[4,3,5],[4,5,3],[4,0,8],[4,8,0],[4,2,6],[4,6,2],
							[5,2,8],[5,8,2],[5,3,4],[5,4,3],
							[6,0,3],[6,3,0],[6,8,7],[6,7,8],[6,2,4],[6,4,2],
							[7,6,8],[7,8,6],[7,1,4],[7,4,1],
							[8,6,7],[8,7,6],[8,2,5],[8,5,2],[8,0,4],[8,4,0]);					
$(function(){
	tictac.init();
});
var tictactoe	= function() {
	this.init	= function() {
		mapActions 	= 0;
		lastMap		= 0;
		for(var i = 0; i < mapFields; i++) {
			$('#tictactoe').append('<div id="tictac_'+i+'" class="tictac_field"></div>');
			$('.tictac_field').click(function(){
				tictac.CU($(this));
			});
		}
		var id	= Math.floor(Math.random() * mapFields);
		var obj	= $('#tictac_'+id);
		obj.addClass(mapAI);
	}
	this.shuffle= function(o){
		for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
		return o;
	}
	this.AI		= function() {
		var mapObj		= $('div.' + mapAI + ':eq(' + lastMap + ')');
		var mapSets		= mapObj.size();
		var mapSet		= mapObj.attr('id');
		var mapStart 	= mapSet.split('_');
		var mapHold		= parseInt(mapStart[1]);
		var reality		= 0;
		mapWin			= this.shuffle(mapWin);
		
		for(var i = 0; i < mapWin.length; i++) {
			var CUmap1	= $('#tictac_' + mapWin[i][1]);
			var CUmap2	= $('#tictac_' + mapWin[i][2]);
			if(mapWin[i][0] == mapHold && !CUmap1.hasClass(mapCU) && !CUmap2.hasClass(mapCU)) {
				if($('#tictac_' + mapWin[i][1]).hasClass(mapAI)) {
					$('#tictac_' + mapWin[i][2]).addClass(mapAI)
				} else {
					$('#tictac_' + mapWin[i][1]).addClass(mapAI)
				}
				reality++;
				break;
			}
		}
		if(this.win(mapAI)) {
			this.dialog('<span style="color:#39a9dc">Oops</span>, the computer won. :-(<br /><a href="javascript:;" onclick="tictac.reset()">Restart</a>');
		} else {
			if(mapActions == mapFields - 3) {
				$('.tictac_field').each(function(){
					var obj = $(this);
					if(!obj.hasClass(mapAI) || !obj.hasClass(mapCU)) {
						obj.addClass(mapAI);
					}
				});
				this.dialog('<span style="color:#39a9dc">Draw!</span> Try the same again.<br /><a href="javascript:;" onclick="tictac.reset()">Restart</a>');
			} else if(reality == 0 && mapActions != mapFields - 3) {
				lastMap++;
				this.AI();
			} else {
				this.count();
			}
		}
	}
	this.CU	= function(object) {
		if(!object.hasClass(mapAI) && !object.hasClass(mapCU) && !object.hasClass(mapDI)) {
			object.addClass(mapCU);
			if(this.win(mapCU)) {
				this.dialog('<span style="color:#39a9dc">Congratulations!</span> You win.<br /><a href="javascript:;" onclick="tictac.reset()">Restart</a>');
			} else {
				this.AI();
			}
		}
	}
	this.win	= function(map) {
		for(var i = 0; i < mapWin.length; i++) {
			if( $('#tictac_'+mapWin[i][0]).hasClass(map) && 
				$('#tictac_'+mapWin[i][1]).hasClass(map) && 
				$('#tictac_'+mapWin[i][2]).hasClass(map)) {
				this.blink($('#tictac_'+mapWin[i][0]));
				this.blink($('#tictac_'+mapWin[i][1]));
				this.blink($('#tictac_'+mapWin[i][2]));
				return true;
			}
		}
		return false;
	}
	this.count	= function() {
		mapActions += 2;
		if(mapActions >= mapFields) {
			this.dialog('<span style="color:#39a9dc">Draw!</span> Try the same again.<br /><a href="javascript:;" onclick="tictac.reset()">Restart</a>');
		}
	}
	this.reset	= function() {
		$('#tictactoe div').remove();
		$('#tictac_message').fadeOut(250,function(){
			$(this).html('Feel free to play a game while you wait. ;-)').fadeIn();
		});
		this.init();
	}
	this.dialog	= function(message) {
		$('.tictac_field').addClass(mapDI);
		$('#tictac_message').fadeOut(250, function(){
			$(this).html(message).fadeIn();
		});
	}
	this.blink	= function(obj) {
		setInterval(function() {
			if($(obj).css("visibility") == "visible") {
				$(obj).css('visibility','hidden');
			} else {
				$(obj).css('visibility','visible');
			}
		}, 350);
	}
}
var tictac	= new tictactoe();
