function Zar()
{
	this.reqWidgetQueue= new Array();//queue with the widgets that made a request through this con
	// troller object
	var self=this;
	
	this.letter = null;
	this.gameEnded = false;
	this.gameSuccess = false;
	
	this.textEffectInterval = null;
	this.arrowsEffectInterval = null;
	this.totalEffectInterval = null;
	
	this.playing = false;
	
	this.lastarrow = null;
	
	/**
	 * @param The manager index of the request 
	 * @desc This method is a handler for the completition of one request
	 */
	this.handleResponse=function (managerIndex)
	{		
		var code = RequestManager.getInstance().getRequestObj (managerIndex).getResponseErrorCode();
		var content = RequestManager.getInstance().getRequestObj (managerIndex).getResponseContent();
		switch(code)
		{
			//o spart prostu recordu
			case 3 :
				Zar.moveCursor(content.total_points);
				var zaruri = content.numbers.split(",");
				Zar.setText(5);
				setTimeout("Zar.setText(2)",1500);
				Zar.changeZar(1,zaruri[0]);
				Zar.changeZar(2,zaruri[1]);
				Zar.changeZar(3,zaruri[2]);
				Zar.setTotal(content.points);
				
				_e("my_points_c").innerHTML = content.total_points;
				_e("record_c").innerHTML = content.record;
				Zar.moveCursor(content.total_points);
			break;
//			a nimerit
			case 1 :
				
				Zar.moveCursor(content.total_points);
				var zaruri = content.numbers.split(",");
				Zar.setText(2);
				Zar.changeZar(1,zaruri[0]);
				Zar.changeZar(2,zaruri[1]);
				Zar.changeZar(3,zaruri[2]);
				Zar.setTotal(content.points);
				
				_e("my_points_c").innerHTML = content.total_points;
				_e("record_c").innerHTML = content.record;
				Zar.moveCursor(content.total_points);
				 
			break;
//			nu a nimerit
			case 2 :
				var zaruri = content.numbers.split(",");
				Zar.setText(4);
				Zar.changeZar(1,zaruri[0]);
				Zar.changeZar(2,zaruri[1]);
				Zar.changeZar(3,zaruri[2]);
				Zar.setTotal(content.points);
				
				_e("my_points_c").innerHTML = content.total_points;
				_e("record_c").innerHTML = content.record;
				Zar.moveCursor(content.total_points);
			break;
		}
	}
	
	this.arrowClicked = function (arrow)
	{
		if(this.playing == false)
		{
			this.playing = true;
			this.stopAllEffects();
			_e("my_points_c").innerHTML = "0";
			Zar.changeZar(1,1);
			Zar.changeZar(2,1);
			Zar.changeZar(3,1);
			Zar.setTotal(3);
			Zar.setText(3);
			if(arrow=="up")
			{
				Zar.arrowEffect(1);
			}
			else
			{
				Zar.arrowEffect(2);
			}
			this.startTextEffect("shake");
		}
		else
		{
			this.getNumbers(arrow);
		}
	}
	
	this.init = function ()
	{
		Zar.Effect();
		Zar.initShake();
		Zar.initCursor();
		
		Zar.moveCursor(0);
		
//		this.arrowsEffectInterval = setInterval("Zar.arrowEffect()",50);
		this.totalEffectInterval = setInterval("Zar.setTotal(Math.round(Math.random()*15)+3)",300);
		
		this.startTextEffect("shake");
	}
	
	this.startTextEffect = function (effect)
	{
		switch(effect)
		{
			case "shake" : 
				this.textEffectInterval = setInterval("Zar.shakeText()",50);
			break;
		}
	}
	
	this.stopAllEffects = function ()
	{
		if(this.textEffectInterval!=null)
		{
			clearInterval(this.textEffectInterval);
		}
		if(this.arrowsEffectInterval!=null)
		{
			clearInterval(this.arrowsEffectInterval);
		}
		if(this.totalEffectInterval!=null)
		{
			clearInterval(this.totalEffectInterval);
		}
	}
	
	/**
	 * @param object widget object
	 * @param array parameters of the request	
	 * @desc this method registers a widget with the controller object 
	 * @return number The index of the widget
	 */
	this.getNumbers=function(arrow)
	{
		this.lastarrow = arrow;
		var rqid=RequestManager.getInstance().createRequest(self,Config.APP_URL+"dy.php?action=get_numbers&arrow="+arrow);
		RequestManager.getInstance().startRequest(rqid);
		return rqid;
	}

	/**
	 * @param the index of the request 
	 * @desc Remove widget from the queue
	 */
	this.removeWidget=function (managerIndex)
	{
		RequestManager.getInstance().removeRequest(managerIndex);		
		self.reqWidgetQueue[managerIndex]=null;
	}
}

Zar.flipArrow = function (arrow)
{
	switch(arrow)
	{
		case "up" :
			var sEl = _e("up_arrow");
			if(sEl.src.indexOf("off")>0)
			{
				sEl.src = Config.IMAGES_URL+"zaruri/arrow_up_on.gif";
			}
			else
			{
				sEl.src = Config.IMAGES_URL+"zaruri/arrow_up_off.gif";
			}
		break;
		case "down" :
			var sEl = _e("down_arrow");
			if(sEl.src.indexOf("off")>0)
			{
				sEl.src = Config.IMAGES_URL+"zaruri/arrow_down_on.gif";
			}
			else
			{
				sEl.src = Config.IMAGES_URL+"zaruri/arrow_down_off.gif";
			}
		break;
	}
}

Zar.changeRandom = function (zarId)
{
	Zar.changeZar(zarId,Math.round(Math.random()*5)+1);
}

Zar.changeZar = function (zarId,Value)
{
	var zEl = _e("zar_"+zarId+"_c");
	
	zEl.src = Config.IMAGES_URL + "zaruri/zar_"+Value+".gif";
	
}

Zar.setTotal = function (val)
{
	var l1 = _e("letter1");
	var l2 = _e("letter2");
	
	var v1 = Math.floor(val/10);
	var v2 = val - v1*10;
	
	l1.src = Config.IMAGES_URL + "zaruri/l_"+v1.toString()+".gif";
	l2.src = Config.IMAGES_URL + "zaruri/l_"+v2.toString()+".gif";
}

Zar.TX = 0;
Zar.TY = 0;
Zar.CX = 0;
Zar.CY = 0;

Zar.initShake = function ()
{
	var tEl = _e("texte");
	
	var x1 = getLeft(tEl);
	var y1 = getTop(tEl);
	
	tEl.style.left = x1 +"px";
	tEl.style.top = y1 +"px";
	
	var x2 = getLeft(tEl);
	var y2 = getTop(tEl);
	
	var x = x1 -(x2 - x1);
	var y = y1 -(y2 - y1);
	
	tEl.style.left = x +"px";
	tEl.style.top = y +"px";
	
	Zar.TX = x;
	Zar.TY = y;
}

Zar.initCursor = function ()
{
	var tEl = _e("the_cursor");
	
	var x1 = getLeft(tEl);
	var y1 = getTop(tEl);
	
	tEl.style.left = x1 +"px";
	tEl.style.top = y1 +"px";
	
	var x2 = getLeft(tEl);
	var y2 = getTop(tEl);
	
	var x = x1 -(x2 - x1);
	var y = y1 -(y2 - y1);
	
	tEl.style.left = x +"px";
	tEl.style.top = y +"px";
	
	Zar.CX = x;
	Zar.CY = y;
}

Zar.shakeText = function ()
{
	var xrange = 3;
	var yrange = 3;
	var px = Math.round(Math.random()*xrange*2)-xrange;
	var py = Math.round(Math.random()*yrange*2)-yrange;
	
	var tEl = _e("texte");
	tEl.style.left = (Zar.TX+px) +"px";
	tEl.style.top = (Zar.TY+py) +"px";
}

Zar.Effect = function ()
{
	Zar.changeRandom(1);
	Zar.changeRandom(2);
	Zar.changeRandom(3);
}

Zar.arrowEffect = function ()
{
	var sEl1 = _e("up_arrow");
	var sEl2 = _e("down_arrow");
	var argv = arguments;
	var nr = Math.round(Math.random()*4); 
	if(argv.length==1)
	{
		nr = argv[0];
	}
	switch(nr)
	{
		case 0 :
			sEl1.src = Config.IMAGES_URL+"zaruri/arrow_up_off.gif";
			sEl2.src = Config.IMAGES_URL+"zaruri/arrow_down_off.gif";
		break;
		case 1 :
			sEl1.src = Config.IMAGES_URL+"zaruri/arrow_up_on.gif";
			sEl2.src = Config.IMAGES_URL+"zaruri/arrow_down_off.gif";
		break;
		case 2 :
			sEl1.src = Config.IMAGES_URL+"zaruri/arrow_up_off.gif";
			sEl2.src = Config.IMAGES_URL+"zaruri/arrow_down_on.gif";
		break;
		case 3 :
			sEl1.src = Config.IMAGES_URL+"zaruri/arrow_up_on.gif";
			sEl2.src = Config.IMAGES_URL+"zaruri/arrow_down_on.gif";
		break;
	}
}

Zar.MAX_POINTS = 500;
Zar.POINTS = 0;

Zar.moveCursor = function (val)
{
	var max = 510;
	var cEl = _e("the_cursor");
	
	var xp = Math.round((max/Zar.MAX_POINTS)*val);
	cEl.style.left = (Zar.CX + xp) + "px";
}

var increment = 1;
Zar.cursorEffect = function ()
{
	if(Zar.POINTS>(Zar.MAX_POINTS-1))
	{
		increment = -1;
	}
	if(Zar.POINTS<0)
	{
		increment = 1;
	}
	
	Zar.moveCursor(Zar.POINTS);
	Zar.POINTS += increment;
}

Zar.setText = function (textId)
{
	tEl = _e("text_img");
	tEl.src = Config.IMAGES_URL + "zaruri/texte/"+textId.toString()+".gif";
}

Zar.__instance__=null;

Zar.getInstance=function()
{
	if(Zar.__instance__==null)
	{
		Zar.__instance__=new Zar();
	}
	return Zar.__instance__;
}