var xmlHttp;
var serverSideFile = 'http://polls.businessweek.com/polls/ajaxresponse.php';
var voteCenterImage = 'http://polls.businessweek.com/polls/images/progress.gif'; //images/graph_middle_1.gif

var graphMaxWidth = 130;	// It will actually be a little wider than this because of the rounded image at the left and right
var graphMinWidth = 15;	// Minimum size of graph
var pollScrollSpeed = 1;	// Lower = faster
var useCookiesToRememberCastedVotes = false;	// Use cookie to remember casted votes
var txt_totalVotes = 'Total number of votes: ';

var ajaxObjects = new Array();
var pollVotes = new Array();
var pollVoteCounted = new Array();
var totalVotes = new Array();

var cres = "";

/* Preload images */

var preloadedImages = new Array();
preloadedImages[0] = new Image();
preloadedImages[0].src = voteCenterImage;

//Gets the browser specific XmlHttpRequest Object
function getXmlHttpRequestObject() 
{
	if (window.XMLHttpRequest) 
	{
		return new XMLHttpRequest(); //Mozilla, Safari …
	} 
	else if (window.ActiveXObject) 
	{
		return new ActiveXObject("Microsoft.XMLHTTP"); //IE
	} 
	else 
	{
		//Display our error message
		alert("Your browser doesn’t support the XmlHttpRequest object.");
	}
}

//Our XmlHttpRequest object
var receiveReq = getXmlHttpRequestObject();

function Poller_Get_Cookie(name) { 
   var start = document.cookie.indexOf(name+"="); 
   var len = start+name.length+1; 
   if ((!start) && (name != document.cookie.substring(0,name.length))) return null; 
   if (start == -1) return null; 
   var end = document.cookie.indexOf(";",len); 
   if (end == -1) end = document.cookie.length; 
   return unescape(document.cookie.substring(len,end)); 
} 
// This function has been slightly modified
function Poller_Set_Cookie(name,value,expires,path,domain,secure) { 
	expires = expires * 60*60*24*1000;
	var today = new Date();
	var expires_date = new Date( today.getTime() + (expires) );
    var cookieString = name + "=" +escape(value) + 
       ( (expires) ? ";expires=" + expires_date.toGMTString() : "") + 
       ( (path) ? ";path=" + path : "") + 
       ( (domain) ? ";domain=" + domain : "") + 
       ( (secure) ? ";secure" : ""); 
    document.cookie = cookieString; 
}

function showVoteResults(pollId)
{
	document.getElementById('poller_waitMessage' + pollId).style.display='none';
	document.getElementById('poller_question' + pollId).style.display='none';	
	document.getElementById('poller_results' + pollId).style.display='block';	

	var xml = xmlHttp.responseText;

	xml = xml.replace(/\n/gi,'');
	
	var reg = new RegExp("^.*?<pollerTitle>(.*?)<.*$","gi");
	var regTV = xml.split(/<totalvotes>/gi);
	var regQ = xml.split(/<qtitle>/gi);
	var pollerTitle = xml.replace(reg,'$1');
	var tvelem = regTV[1].split(/</gi);
	var tvotes = tvelem[0];
	var qelem = regQ[1].split(/</gi);
	var qtitle = qelem[0];
	
	var resultDiv = document.getElementById('poller_results' + pollId);
	
/*	var titleP = document.createElement('P');
	titleP.className='result_pollerTitle';
	titleP.innerHTML = pollerTitle;
	resultDiv.appendChild(titleP);	*/
	
	var titleQ = document.createElement('P');
	titleQ.className ='result_pollerTitle';
	titleQ.innerHTML = qtitle;
	resultDiv.appendChild(titleQ);	

	var options = xml.split(/<option>/gi);
	pollVotes[pollId] = new Array();
	totalVotes[pollId] = 0;

	for(var no=1;no<options.length;no++)
	{
		var elements = options[no].split(/</gi);
		var currentOptionId = false;

		for(var no2=0;no2<elements.length;no2++)
		{
			if(elements[no2].substring(0,1)!='/')
			{
				var key = elements[no2].replace(/^(.*?)>.*$/gi,'$1');
				var value = elements[no2].replace(/^.*?>(.*)$/gi,'$1');

				if(key.indexOf('optionText')>=0)
				{
					var pOption = document.createElement('P');
					pOption.className='result_pollerOption';
					pOption.innerHTML = value;
					resultDiv.appendChild(pOption);					
				}
				
				if(key.indexOf('optionId')>=0)
				{
					currentOptionId = value/1;
				}

				if(key.indexOf('votes')>=0)
				{
					var voteDiv = document.createElement('DIV');
					voteDiv.className='result_pollGraph';
					resultDiv.appendChild(voteDiv);	

					var numberDiv = document.createElement('IMG');
					numberDiv.className='result_pollGraph';
					numberDiv.src = voteCenterImage;
					numberDiv.id = 'result_voteTxt' + currentOptionId;
					//numberDiv.style.backgroundImage = 'url(\'' + voteCenterImage + '\')';
					voteDiv.appendChild(numberDiv);	
					
					var percDiv = document.createElement('DIV');
					percDiv.className='result_pollGraph';
					percDiv.id = 'result_perTxt' + currentOptionId;
					percDiv.innerHTML = '0%';
					voteDiv.appendChild(percDiv);						
					
					pollVotes[pollId][currentOptionId] = value;			
					totalVotes[pollId] = totalVotes[pollId]/1 + value/1;
				}
			}
		}
	}
	var totalVoteP = document.createElement('P');
	totalVoteP.className = 'result_totalVotes';
	totalVoteP.innerHTML = txt_totalVotes + tvotes;		//totalVotes[pollId];
	voteDiv.appendChild(totalVoteP);	
	
	setPercentageVotes(pollId);
	slideVotes(pollId,0);
}

function setPercentageVotes(pollId)
{
	for(var prop in pollVotes[pollId])
	{
		pollVotes[pollId][prop] =  Math.round( (pollVotes[pollId][prop] / totalVotes[pollId]) * 100);				
	}	
	
	var currentSum = 0;
	for(var prop in pollVotes[pollId])
	{
		currentSum = currentSum + pollVotes[pollId][prop]/1;			
	}
	pollVotes[pollId][prop] = pollVotes[pollId][prop] + (100-currentSum);
}

function slideVotes(pollId,currentPercent)
{
	currentPercent = currentPercent/1 + 1;
	for(var prop in pollVotes[pollId])
	{
		if(pollVotes[pollId][prop]>=currentPercent)
		{
			var obj = document.getElementById('result_voteTxt' + prop);
			obj.style.width = Math.max(graphMinWidth,Math.round(currentPercent/100*graphMaxWidth)) + 'px';
			var obj1 = document.getElementById('result_perTxt' + prop);
			obj1.innerHTML = currentPercent + '%';
		}			
	}
	
	if(currentPercent<100)setTimeout('slideVotes("' + pollId + '","' + currentPercent + '")',pollScrollSpeed);
}

function castMyVote(pollId,formObj)	
{	
	document.getElementById('poller_waitMessage' + pollId).style.display='block';
	if(document.getElementById('ECAPTCHA'))
	{
		if(document.getElementById('ECAPTCHA').value == "")
		{
			alert("Please enter the Characters seen in the Image");
			return false;	
		}
		else
		{
			if((navigator.appName.indexOf("Microsoft") != -1) || (navigator.userAgent.indexOf('Safari') != -1))
			{
				getParam(document.frmpreviewpoll);
			}
			else
			{
				cres = getParam(document.frmpreviewpoll);
				if(cres == "Invalid! Try Again")
				{
					document.getElementById('result').innerHTML = receiveReq.responseText;
					document.getElementById('ECAPTCHA').value = "";
					img = document.getElementById('imgCaptcha'); 
					img.src = 'http://polls.businessweek.com/polls/create_image.php?' + Math.random();
				}
			}
		}
	}
	var optionId = false;

	var elements = formObj.elements['IPOLLID0'];		 
	
	for(var no=0;no<elements.length;no++)
	{
		if(elements[no].checked)
			optionId = elements[no].value;
	}
	if(optionId == 0)
	{
		alert("Invalid Selection");
		return false;	
	}

	if((optionId) && (cres != "Invalid! Try Again"))
	{
		Poller_Set_Cookie('dhtmlgoodies_poller_' + pollId,'1',6000000);
		xmlHttp = GetXmlHttpObject();
		if (xmlHttp==null)
  		{
	  		alert ("Your browser does not support AJAX!");
		    return;
	  	} 
		var url = serverSideFile;
		url=url + "?pid=" + pollId + "&optionId=" + optionId;
		url=url + "&sid=" + Math.random();
		xmlHttp.onreadystatechange = stateChanged;
		xmlHttp.open("GET",url,true);
		xmlHttp.send(null);
	}	
}	

function displayResultsWithoutVoting(pollId)
{
	xmlHttp = GetXmlHttpObject();
	if (xmlHttp==null)
  	{
		alert ("Your browser does not support AJAX!");
	    return;
	} 
	var url = serverSideFile;
	url=url + "?pid=" + pollId;
	url=url + "&sid=" + Math.random();
	xmlHttp.onreadystatechange = stateChanged;
	xmlHttp.open("GET",url,true);
	xmlHttp.send(null);
}

function makeRequest(url, param) 
{
	//If readystate is either not started or finished, initiate a new request
	if (receiveReq.readyState == 4 || receiveReq.readyState == 0) 
	{
   		//Set up the connection to captcha_test.html. True sets the request to asyncronous(default) 
		if((navigator.appName.indexOf("Microsoft") != -1) || (navigator.userAgent.indexOf('Safari') != -1))
		{
			receiveReq.open("POST", url, false);
		}
		else
		{
			receiveReq.open("POST", url, false);
		}
		
	//Set the function that will be called when the XmlHttpRequest objects state changes
		receiveReq.onreadystatechange = updatePage;
		receiveReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		receiveReq.setRequestHeader("Content-length", param.length);
		receiveReq.setRequestHeader("Connection", "close");
			
	//Make the request
		receiveReq.send(param);
	}
}

//Called every time XmlHttpRequest objects state changes
function updatePage() 
{
 //Check if response is ready
	if (receiveReq.readyState == 4) 
	{
		//Set the content of the DIV element with the response text
		document.getElementById('result').innerHTML = receiveReq.responseText;
		cres = receiveReq.responseText;
		if(cres == "Invalid! Try Again")
		{
			document.getElementById('ECAPTCHA').value = "";
		}
		//Get a reference to CAPTCHA image
		img = document.getElementById('imgCaptcha'); 
	   //Change the image
   		img.src = 'http://polls.businessweek.com/polls/create_image.php?' + Math.random();
 	}
}

function getParam(theForm) 
{
 //Set the URL
 var url = 'http://polls.businessweek.com/polls/captcha.php';

 //Set up the parameters of AJAX call
 var postStr = theForm.ECAPTCHA.name + "=" + encodeURIComponent(theForm.ECAPTCHA.value );
 //Call the function that initiate the AJAX request
makeRequest(url, postStr);
var str = receiveReq.responseText;

return str;
}

function stateChanged() 
{ 
	if (xmlHttp.readyState==4)
	{ 
		if(xmlHttp.responseText != "")
		{
			var xml = xmlHttp.responseText;
			xml = xml.replace(/\n/gi,'');
			var p_reg = new RegExp("^.*?<pollId>(.*?)<.*$","gi");
			var p_id = xml.split(/<pollId>/gi);
			var pidtemp = p_id[1].split(/</gi);
			var pid = pidtemp[0];
			showVoteResults(pid);
		}
	}
}

function GetXmlHttpObject()
{
	xmlHttp=null;
	try
	{
	  // Firefox, Opera 8.0+, Safari
	  xmlHttp = new XMLHttpRequest();
	}
	catch (e)
	{
	  // Internet Explorer
	  	try
		{
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
	  	catch (e)
		{
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return xmlHttp;
}