/**
* Prize.BG AJAX Game API by Angel Kostdinov(angel@develop.bg)
*/
function AJAX()
{
	this.ob 	= null;
	this.domain = 'http://' + document.domain + '/';
	
	this.isAnswered = false;
	
	this.construct();
}
AJAX.prototype.construct = function()
{
	if( !window.XMLHttpRequest ) 
	{
		XMLHttpRequest = function()
		{
		  try { return new ActiveXObject("MSXML3.XMLHTTP") }catch(e){}
		  try { return new ActiveXObject("MSXML2.XMLHTTP.3.0") }catch(e){}
		  try { return new ActiveXObject("Msxml2.XMLHTTP") }catch(e){}
		  try { return new ActiveXObject("Microsoft.XMLHTTP") }catch(e){}
		  throw new Error("Could not find an XMLHttpRequest alternative.")
		}
	}
	this.ob = new XMLHttpRequest;
	
	this.disableSelection(document.body);
}
AJAX.prototype.token = function()
{
	var self = this;
	var url  = this.domain + 'security/token.php';
	var vars = '';
	
	self.ob.open("POST", url, true);
  	self.ob.onreadystatechange = function()
  	{
    	if (self.ob.readyState == 4 && self.ob.status == 200)
    	{
      		if (self.ob.responseText)
      		{
          		document.getElementById('ts').value = self.ob.responseText;
          		document.getElementById('load').style.display = 'block';
      		}
    	}
  	};
  	self.ob.send(vars);
}
AJAX.prototype.requestStart=function()
{
	document.getElementById('loading').style.visibility='visible';
}
AJAX.prototype.requestEnd=function()
{
	document.getElementById('loading').style.visibility='hidden';
}
AJAX.prototype.disableClock=function()
{
	document.getElementById('flashclock').innerHTML = '';
}
AJAX.prototype.enableClock=function()
{
	if (typeof so != 'undefined')
	{
		so.write('flashclock');
	}
}

AJAX.prototype.selectCheckbox=function( el )
{
	var pageImages = document.getElementsByTagName('IMG');
	
	for	(i=0;i<pageImages.length;i++)
	{
		if (pageImages[i].id == el.id)
		{
			el.src = this.domain + 'sm_templates/images/check.gif';
			document.getElementById('answer').value = el.id.toString().replace(/[^0-9]+/,'');
		}
		else 
		{
			if (pageImages[i].src.indexOf('check.gif') != -1)
			{
				pageImages[i].src = this.domain + 'sm_templates/images/checkbox.gif';
			}
		}
	}
}

AJAX.prototype.loadQuestion = function()
{
	/* Clear existing instances to prevent leaks and setRequestHeader exceptions type */
	this.ob = null; 
	/* Recreate the request object */
	this.construct();
	
	var self = this;
	
	var url = this.domain + 'server/question.php';
	var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
	var vars = 'ts=' + document.getElementById('ts').value + '&recipient_id=' + document.getElementById('recipient_id').value;
	
	document.getElementById('button').disabled = true;
	
	self.requestStart();
	
	self.ob.open("POST", url, true);
	
	self.ob.setRequestHeader("Content-Type", contentType);
	self.ob.setRequestHeader("Content-length", vars.length);
	self.ob.setRequestHeader("Connection", "close");
	
  	self.ob.onreadystatechange = function()
  	{
  		try {
	    	if (self.ob.readyState == 4 && self.ob.status == 200)
	    	{
	      		if (self.ob.responseText)
	      		{
	      			self.requestEnd();
	      			
	          		var QData = self.ob.responseText.split(/\~/);
	          		
	          		for(var row in QData)
	          		{
	          			var QRow = QData[row].split(/\^/);
	          			
	          			switch(QRow[0])
	          			{
	          				case 'c':
	          					var cat = QRow[1];
	          					break;
	          				case 'q':
	          					if (typeof cat == 'undefined') cat = '';
	          					
	          					var html = '<span style="color:#ff9600;">' + cat + '</span>';
	          					html += "<br /><br />";
	          					html += QRow[1];
	          					document.getElementById('question').innerHTML = html;
	          					break;
	          				default:
	          					var ctrl = QRow[0].toUpperCase();
	          					document.getElementById(ctrl + 'Text').innerHTML = QRow[1];
	          					break;
	          			}
	          		}
	          		
	          		document.getElementById('questionbox').style.display='none';
	      			document.getElementById('loadbox').style.display='block';
	      			
	      			/* Start cound down timer */
	      			so.write('flashclock');
	      			
	      			timer.countdown();
	      		}
	    	}
  		}
  		catch(e)
  		{
  			
  			ajaxobj.requestEnd();
  		}
    	
    	
  	};
  	self.ob.send(vars);
}

AJAX.prototype.attachNullEvent=function(object,nullFunc)
{
	 if (typeof( window.addEventListener ) != "undefined" ) 
     {
        // Firefox way
        object.addEventListener("click", nullFunc, false);
     } 
     else 
     {
       // IE way
        object.attachEvent('onclick', nullFunc);
     }
}

AJAX.prototype.disableFurtherAnswerAttempts=function()
{
	var td = document.getElementsByTagName('TD');
	
	for (i=0;i<td.length;i++)
	{
		if (td[i].id.toString().match(/^A[1-4]Text$/))
		{
			this.attachNullEvent(td[i],function() { return false; });
		}
	}
}
AJAX.prototype.checkQuestion=function( answer )
{
	/* Stop futher events */
	
	this.disableFurtherAnswerAttempts();
	
	/* Create answer animation */
	
	/* Get user answer */
	var user_answer = parseInt(answer.id.match(/[0-9]+/));
	
	if (false === this.isAnswered)
	{
		this.isAnswered = true;
		this.disableClock();
		
		var self = this;
		var url = this.domain + 'question';
		var contentType = "application/x-www-form-urlencoded; charset=UTF-8";
		
		var vars = new Array();
		
		vars.push('ts=' + document.getElementById('ts').value);
		vars.push('answer=' + user_answer);
		vars.push('recipient_id=' + document.getElementById('recipient_id').value);
		
		var postParams = vars.join('&');

		
		self.ob.open("POST", url, true);
		self.ob.setRequestHeader("Content-Type", contentType);
	  	self.ob.onreadystatechange = function()
	  	{
	    	if (self.ob.readyState == 4 && self.ob.status == 200)
	    	{
	      		if (self.ob.responseText)
	      		{	
	      			if (self.ob.responseText.match(/^[0-9]+\:[0-9]\:[0-9]+\:[0-9]+$/))
	      			{
	      				var params = self.ob.responseText.split(/\:/);
	      				
	      				/* Check if response time is OK */
	      				if (params[0] <= 15)
	      				{
	      					timer.hideAnswers( answer,params[1] );
	      					
	      					/* Build stats */
	      					document.getElementById('_asked').innerHTML = params[2];
	      					document.getElementById('_guessed').innerHTML = params[3];
	      					document.getElementById('statistics').style.display='block';
	      				}
	      				else 
	      				{
	      					/* Answer has not been provided in time */
	      					/* Hide all possible answers */
	      				}
	      				
	      			}
	      			else 
	      			{
	      				/* Incorrect response */
	      				/* Hide all possible answers*/
	      			}	
	      		}
	      		else 
	      		{
	      			timer.hideAllAnswers();
	      		}
	    	}
	  	};
	  	self.ob.send(postParams);
	}
	else 
	{
		return false;
	}
}
AJAX.prototype.disableSelection=function(element)
{
	element.onselectstart = function() 
	{
		return false;
	};
	element.unselectable = "on";
	element.style.MozUserSelect = "none";
	element.style.cursor = "default";
}


var ajaxobj = new AJAX();