/***************************
 *
 *	Poll Manager Class
 *
 *  Version: 1.0
 *
 *	Authors: 
 *	The Roundhouse
 *  Mike Harris
 *
 *  Description:
 *
 *	Local page manager extends the global page manager with handlers for its specific section
 *
 */
 
var PollManager = new Class({
	
	polQuestion:				null,
	arrAnswers:					null,	
	iAnswers:					null,
	divHolder:					null,
	strHttpHost:				null,
	blLoggedIn:					null,
	blFlash:					null,
	voted:						false,
	
	setupPoll: 					function(strHost, strLoggedIn, blFlash)
	{
		this.divHolder   = $('divpollholder');
		this.strHttpHost = strHost;
		this.blLoggedIn  = (strLoggedIn == "true"); // NB overwritten later to reflect whether or not a user has voted on current poll - MH 07/08/08
		this.blFlash	 = blFlash == 0?false:true;
		
		// find the latest active poll that hasn't expired
		var objRequest = {strRequestType: "Retrieve", blGetPolls:"true"};
		
		new Ajax("../z_includes/inc_ajaxhandler.php", {onComplete:this.ajax_parseResults.bind(this), postBody:objRequest}).request();
		
		return;
	},
	
	ajax_parseResults: 			function(objResponseText, objResponseXML)
	{
		if(objResponseXML)
		{
			for(var i = 0; i < objResponseXML.childNodes.length; i++)
			{
				if(objResponseXML.childNodes[i].nodeName == "response")
				{
					// grab the info from the XML
					var ndsUserInfo	= objResponseXML.childNodes[i].childNodes;
					this.arrAnswers = new Array();

					for(var j = 0; j < ndsUserInfo.length; j++)
					{
						if(ndsUserInfo[j].nodeName == "answer" && ndsUserInfo[j].firstChild.nodeValue.toString() != "")
						{	
							// evaluate the property
							var objJsonUser		= Json.evaluate(ndsUserInfo[j].firstChild.nodeValue.toString());
							var objAnswer		= new answer(		objJsonUser.ID,
																	objJsonUser.PollID,
																	objJsonUser.Answer,
																	objJsonUser.Clicked	);							
							
							// chuck it on the pile
							this.arrAnswers.push(objAnswer);
						}
						else if(ndsUserInfo[j].nodeName == "question" && ndsUserInfo[j].firstChild.nodeValue.toString() != "")
						{	
							// evaluate the property
							var objJsonUser	 = Json.evaluate(ndsUserInfo[j].firstChild.nodeValue.toString());
							var objQuestion	 = new pollitem(	objJsonUser.ID,
																objJsonUser.CategoryID,
																objJsonUser.Question,
																objJsonUser.CommenceDate,
																objJsonUser.ExpiryDate,
																objJsonUser.Open	);
							
							this.polQuestion = objQuestion;
						}
						else if(ndsUserInfo[j].nodeName == "recorded" && ndsUserInfo[j].firstChild.nodeValue.toString() != "")
						{	
							Cookie.set("FOPoll"+this.polQuestion.getID(), true, {duration:3650, path:'/'});
							
							if (this.blFlash)
							{
								this.onClick_showFlashResults();
							}
							else
							{
								this.voted = true;
								var objRequest = {strRequestType: "Retrieve", blGetPolls:"true"};
								new Ajax("../z_includes/inc_ajaxhandler.php", {onComplete:this.ajax_parseResults.bind(this), postBody:objRequest}).request();
							}
						}
					}
					
					this.iAnswers = this.arrAnswers.length;
					
					if(this.iAnswers > 0)
					{
						// see if they have voted on this poll at some point before
						this.blLoggedIn = (Cookie.get("FOPoll"+this.polQuestion.getID()) ? false : true);						
						
						if(this.blLoggedIn && !this.voted)
						{
							this.writeResults();
						}
						else
						{
							if (this.blFlash)
								this.onClick_showFlashResults();
							else
								this.onClick_showTextResults();	
						}
					}
				}
			}
		}
	},
	
	writeResults:				function()
	{
		var strQuestion		= new Element("p");
		strQuestion.setHTML(this.polQuestion.getQuestion() + "?");
		strQuestion.addClass("minor");
		
		var divInner	= new Element("div");
		divInner.setProperty("id",		"divpollinner");
		
		var divClear	= new Element("div");
		divClear.addClass("clear");
		
		divInner.adopt(this.createOptionsDiv());
		divInner.adopt(divClear.clone());		
		
		this.divHolder.setHTML("");
		this.divHolder.adopt(strQuestion);
		this.divHolder.adopt(divInner);
		this.divHolder.adopt(divClear.clone());
		this.divHolder.adopt(this.createButtons());		
		this.divHolder.adopt(divClear.clone());
	},
	
	createOptionsDiv:			function()
	{
		var divOptions	= new Element("div");
		var ulOptions	= new Element("ul");		
		
		divOptions.setProperty("id", "divpolloptions");				
		ulOptions.setProperty("id",  "ulpolloptions");						
		
		var iLoopFrom = this._iResultsPageOffset * this._iResultsPerPage;
		var iLoopTo   = iLoopFrom + this._iResultsPerPage;		
		
		if(iLoopTo > this.iAnswers)
		{
			iLoopTo = this.iAnswers;
		}

		for(var i = iLoopFrom; i < iLoopTo; i++)
		{
			var liOption  = new Element('li');			
			
			if(i == iLoopFrom)
			{
				liOption.addClass("firstoption");
			}
	
			if(!window.ActiveXObject)
			{
				var rdbOption = new Element('input');
				rdbOption.setProperty("type", 	"radio");	
				rdbOption.setProperty("name", 	"radiogroup");				
				rdbOption.setProperty("id", 	"answer" + i);				
				rdbOption.setProperty("value", 	this.arrAnswers[i].getID());				
			}
			else
			{
				var rdbOption = document.createElement('<input type="radio" name="radiogroup" id="answer'+ i +'" value="'+ this.arrAnswers[i].getID() +'" />');
			}
			
			var labOption = new Element('label');
			labOption.setProperty("for", 	"answer" + i);
			labOption.setHTML(this.arrAnswers[i].getAnswer());			
			
			liOption.adopt(rdbOption);
			liOption.adopt(labOption);			
			ulOptions.adopt(liOption);			
		}
		
		divOptions.adopt(ulOptions);
		divOptions.adopt(this.createPaging(this.iAnswers));
		
		return divOptions;
	},
	
	createButtons:			function()
	{
		var divButtons	= new Element("div");				
		divButtons.setProperty("id",	"divpollbuttons");				

		var aVote	= new Element("a");
		var aShow	= new Element("a");		

		aVote.setProperty("id", "submit");
		aShow.setProperty("id", "showvotes");

		if(this.blLoggedIn)
		{
			aVote.addClass("active");			
			aVote.setProperty("href", "javascript:pollManager.onClick_submitVote()");
		}
		else
		{
			aVote.addClass("inactive");		
			aVote.setProperty("href", "javascript:alert('Login to cast your vote')");
		}

		aShow.setProperty("href", "../polls/polldetails.php?pollid=" + this.polQuestion.getID());
		
		aVote.setHTML("Submit Vote");
		aShow.setHTML("Show Votes");
		
		divButtons.adopt(aVote);
		divButtons.adopt(aShow);		

		return divButtons;
	},
	
	_iResultsPerPage:		5,		
	_iResultsPageOffset:	0,
	
	createPaging:		function(iNumRecords)
	{
		var iNumPages = Math.ceil(iNumRecords / this._iResultsPerPage);

		var pollpaging 	= new Element('div');
		pollpaging.setProperty('id', 'pollpaging');
		
		var aBack 		= new Element('a');
		var aForward 	= new Element('a');
	
		aBack.setProperty('id', 'pollback');
		aForward.setProperty('id', 'pollforward');
	
		aBack.setProperty('title', 'back');
		aForward.setProperty('title', 'forward');

		aBack.setProperty('href', 'javascript:pollManager.onClick_loadPagingPage('+ ((this._iResultsPageOffset - 1) > -1 ? (this._iResultsPageOffset - 1) : this._iResultsPageOffset) +')');
		aForward.setProperty('href', 'javascript:pollManager.onClick_loadPagingPage('+ ((this._iResultsPageOffset + 1) < iNumPages ? (this._iResultsPageOffset + 1) : this._iResultsPageOffset) +')');
		
		aBack.setHTML("Back");
		aForward.setHTML("Forward");		

		var labPages = new Element("label");
		labPages.setProperty('id', 'pollpages');
		labPages.setHTML('Page '+ (this._iResultsPageOffset + 1) +' of '+ iNumPages);
		
		pollpaging.adopt(aForward);		
		pollpaging.adopt(aBack);
		pollpaging.adopt(labPages);
		
		return pollpaging;
	},
	
	onClick_loadPagingPage:			function(iNewOffset)
	{
		this._iResultsPageOffset = iNewOffset;
		this.writeResults();
	},
	
	onClick_showFlashResults:			function()
	{
		var divOptions	= new Element("div");
		divOptions.setProperty("id", "divpolloptions");	
		
		var strQuestion		= new Element("p");
		strQuestion.setHTML(this.polQuestion.getQuestion() + "?");		
		strQuestion.addClass("minor");		
		
		var divClear	= new Element("div");
		divClear.addClass("clear");		
		
		this.divHolder.setHTML("");
		this.divHolder.adopt(strQuestion);		
		this.divHolder.adopt(divOptions);				
		this.divHolder.adopt(divClear.clone());
		this.divHolder.adopt(this.createButtons());		
		this.divHolder.adopt(divClear.clone());
		
		// if we're logged in we must have just voted so hide the vote button
		if(this.blLoggedIn)
		{	
			new Fx.Style($('submit'), 'opacity', {duration:500, transition:Fx.Transitions.expoOut}).start(1,0);
		}
			
		var iID = this.polQuestion.getID();		
		var strHostStripped = this.strHttpHost.replace("www.", "");
		
		var swfobject = new SWFObject("http://fin." + strHostStripped + "/modules/polls/z_swf/polls_micro_graph.swf", "swfgraph", "100%", "156", "8.0", "#FFFFFF", true);

		swfobject.addVariable("domain", 		"http://fin." + strHostStripped + "/modules/polls/");
		swfobject.addVariable("jpeg", 			"z_includes/inc_creategraph.php");
		swfobject.addVariable("colors", 		"z_xml/charts/fo_polls.xml");
		swfobject.addVariable("type", 			"Bar");
		swfobject.addVariable("compression", 	(this.iAnswers > 5 ? 5 : this.iAnswers));
		swfobject.addVariable("url", 			"z_xml/polls.php?id=" + iID);
		swfobject.addVariable("id", 			iID);
		swfobject.addParam("menu",				"false");				
		swfobject.addParam('wmode', 			'transparent');
		swfobject.addParam('allowScriptAccess',	'always');
		swfobject.write(divOptions);
		
		
	},
	
	onClick_showTextResults:		function()
	{
		var divOptions	= new Element("div");
		divOptions.setProperty("id", "divpolloptions");	
		
		var strQuestion		= new Element("p");
		strQuestion.setHTML(this.polQuestion.getQuestion() + "?");		
		strQuestion.addClass("minor");		
		
		var divClear	= new Element("div");
		divClear.addClass("clear");		
		
		this.divHolder.setHTML("");
		this.divHolder.adopt(strQuestion);		
		this.divHolder.adopt(divOptions);				
		this.divHolder.adopt(divClear.clone());
		this.divHolder.adopt(this.createButtons());		
		this.divHolder.adopt(divClear.clone());
		
		if(this.blLoggedIn)
		{	
			new Fx.Style($('submit'), 'opacity', {duration:500, transition:Fx.Transitions.expoOut}).start(1,0);
		}
		
		var totalVote = 0;
		var maxVote = 0;
		
		for(var i = 0; i < this.arrAnswers.length; i++)
		{
			totalVote += this.arrAnswers[i].getClicked();
			maxVote = Math.max(maxVote,this.arrAnswers[i].getClicked());
		}
		
		for(var i = 0; i < this.arrAnswers.length; i++)
		{
			var lblAnswer = new Element('label');
			lblAnswer.addClass("pollResult");
			lblAnswer.setHTML(this.arrAnswers[i].getAnswer() + ": " + ((this.arrAnswers[i].getClicked()/totalVote)*100).toFixed(2) +"%");
			if (this.arrAnswers[i].getClicked() == maxVote)
				lblAnswer.addClass("strong");
			divOptions.adopt(lblAnswer);
		}
	},
	
	onClick_submitVote:				function()
	{
		var strChoice = this.getChoice();
		
		if(strChoice != "")
		{
			// find the latest active poll that hasn't expired
			var objRequest = {strRequestType: "Update", blCastVote:"true", iChoice: strChoice};
			
			new Ajax("../z_includes/inc_ajaxhandler.php", {onComplete:this.ajax_parseResults.bind(this), postBody:objRequest}).request();
		}
		
		return;
	},
	
	getChoice:					function()
	{
		var arrButtons	= document.getElementsByName('radiogroup');
		var strChoice	= "";
		
		for(var i = 0; i < arrButtons.length; i++)
		{
			if(arrButtons[i].getProperty('checked'))	
			{
				strChoice = arrButtons[i].getValue();
				break;
			}
		}
		
		return strChoice;
	}
});

var Paging = new Class({
	
	_arrLinks:				null,
	_intNumRecords:			null,
	_intPageSize:			null,
	
	// constructor
	initialize: 			function(intNumRecords,intPageSize)
	{
		this._arrLinks 			= new Array();
		this._intNumRecords		= intNumRecords;
		this._intPageSize		= intPageSize;
	},	
		
	getPageSets:		function(iOffset)
	{
		// work out paging
		var intNumFullSets	= Math.floor(this._intNumRecords/this._intPageSize);
		var intRemainder	= this._intNumRecords%this._intPageSize;
		
		if(iOffset > 0)
		{
			// previous (if we need it)
			var aPrevSet = new Element('a');
			//aPrevSet.setHTML("Previous Page");
			aPrevSet.addClass("btnprev");
			aPrevSet.setProperty("href","javascript:resultManager.onClick_loadPagingPage(" + (iOffset - 1) + ")");
			this._arrLinks.push(aPrevSet);
		}
		
		// push full sets onto the array as anchor elements
		for(var i=0; i<intNumFullSets; i++)
		{
			var aCurrSet		= new Element((i == iOffset ? 'b' : 'a'));
			var intLowerPage	= ((i*this._intPageSize)+1);
			var intUpperPage	= ((i+1)*this._intPageSize);
			
			aCurrSet.setHTML(intLowerPage + " - " + intUpperPage);
			aCurrSet.setProperty("href","javascript:resultManager.onClick_loadPagingPage(" + i + ")");
			this._arrLinks.push(aCurrSet);
		}
		
		// remaining set
		var iHighestOffset = intNumFullSets;
		if(intRemainder != 0)
		{
			var aCurrSet		= new Element((i == iOffset ? 'b' : 'a'));
			var intLowerPage	= ((intNumFullSets*this._intPageSize)+1);
			var intUpperPage	= ((intLowerPage-1) + intRemainder);
			
			aCurrSet.setHTML(intLowerPage + " - " + intUpperPage);
			aCurrSet.setProperty("href","javascript:resultManager.onClick_loadPagingPage(" + intNumFullSets + ")");			
			this._arrLinks.push(aCurrSet);
		}
		else
		{
			// if there is no remainder the highest offset is one less than the number of full sets
			iHighestOffset--;	
		}

		if(iOffset < iHighestOffset)
		{
			// next (if we need it)
			var aNextSet = new Element('a');
			//aNextSet.setHTML("Next Page");
			aNextSet.addClass("btnnext");
			aNextSet.setProperty("href","javascript:resultManager.onClick_loadPagingPage(" + (iOffset + 1) + ")");
			this._arrLinks.push(aNextSet);
		}
		
		return this._arrLinks;
	}				 
});

var pollManager = new PollManager();