var usingStateManager = false;
var jsonPath = '/ELECTION/2008/primary/json/xpoll/';
var epollPath = '/ELECTION/2008/primaries/results/epolls/';
var noteDir = '/.element/ssi/www/sect/2.0/ELECTION/primaries/notes/xpolls/';
var imgDir ='/.element/img/2.0/sect/election/primaries/results/';
var imgHost = 'http://i.cdn.turner.com/cnn';

var numSlots = 9;
var defaultUncommittedIndex = numSlots - 2;
var defaultOtherIndex = numSlots - 1;

var loadingEpollResults = false;
var cnnEpollStateAbbr;
var cnnEpollPartyAbbr;
var cnnEpollParty;
var numPollsPerPage = 10;
var minUncommittedColWidth = 101;

var cnnEpollObj = {
	polls: [],
	candidates: [],
	currentPage: 0,
	totalPages: 0,
	useUniqueRespondentData: true,
	hasUncommittedData: false,
	hasOtherData: false,
	uncommittedIndex: defaultUncommittedIndex,
	otherIndex: defaultOtherIndex,
	reset: function()
        {
		this.polls = [];
		this.candidates = [];
		this.currentPage = 0;
		this.totalPages = 0;
		this.useUniqueRespondentData = false;
		this.hasUncommittedData = false;
		this.uncommittedIndex = defaultUncommittedIndex;
		this.hasOtherData = false;
		this.otherIndex = defaultOtherIndex;
		$('cnnCommonRespondents').innerHTML = '';
        },
	loadEpollPage: function( num, scroll )
	{
		$('cnnEpollTables').innerHTML = '';
		var retHtml = '';

		if( num == 'next' ) { num = this.currentPage + 1; }
		else if( num == 'prev' ) { num = this.currentPage - 1; }
		if( num > this.totalPages ) { num = this.totalPages; }
		else if( num < 1 ) { num = 1; }

		var numPolls = 0;
		var polls = this.polls;
		var candidates = this.candidates;
		var numCandidates = candidates.length;
		var pollIndex = ( num == 1 ) ? 0 : ( (num-1) * numPollsPerPage );

		if( scroll ) { window.scrollTo(0,540); }

		var candidatesWidth = 663;
		var colWidth = candidatesWidth / numCandidates;
		colWidth = colWidth.toFixed(0);
		var lastColWidth = colWidth;
		if( colWidth * numCandidates != candidatesWidth ) { lastColWidth = candidatesWidth - ( colWidth * (numCandidates - 1) ); }

		var tableHeader = '<div class="cnnElexExitPoll_Table">'
			+ '<table cellspacing="0" cellpadding="0" border="0" width="947">'
			+ '<colgroup><col width="176"/><col width="70"/>';

		if( this.hasOtherData && !this.hasUncommittedData )
		{
			this.otherIndex = this.uncommittedIndex;
		}

		for( var z = 0; z<numSlots; z++ )
		{
			if( z < numCandidates )
			{
				if( this.hasUncommittedData && z == this.uncommittedIndex )
				{
					tableHeader += '<col width="'+minUncommittedColWidth+'"/>';
				}
				else if(this.hasOtherData && z == this.otherIndex)
				{
					tableHeader += '<col width="61"/>';
				}
				else { tableHeader += '<col width="77"/>'; }
			}
			else if( z == this.uncommittedIndex )
			{
				tableHeader += '<col width="'+minUncommittedColWidth+'"/>';
			}
			else if( z == this.otherIndex )
			{
				tableHeader += '<col width="61"/>';
			}
			else { tableHeader += '<col width="77"/>'; }
		}
		tableHeader += '</colgroup>';

		var tableFooter = '</table><div class="bottom"></div></div>';

		for( var i = pollIndex; i < polls.length && numPolls < numPollsPerPage; i++ )
		{
			var poll = polls[i];
			var answers = poll.answers;

			if( this.useUniqueRespondentData ) { retHtml += '<div align="right">'+poll.respondents+'</div>'; }

			retHtml += tableHeader;
			retHtml += '<tr class="header';
			if( numPolls != 0) { retHtml += ' sm'; }
			retHtml += '"><td class="begin_left" colspan="2">'
				+ '<div><span>' + poll.question + '</span></div></td>';

			//Candidate row
			for( var j = 0; j < numSlots; j++ )
			{
				if( j < numCandidates )
				{
					var cand = candidates[j];

					retHtml += '<td';

					if( !linkableCandidate(cand) ) {retHtml += ' class="uncommitted"'; }

					retHtml += '><div><span';

					if( linkableCandidate(cand) ) { retHtml += '><a href="'+cand.link+'">'; }
					else { retHtml += '>'; }

					if( numPolls == 0 && linkableCandidate(cand) )
					{
						retHtml += '<img src="'+cand.image+'" width="52" height="52" alt="'+cand.last+'" border="0"><br/>';
					}
					retHtml += cand.last;
					if( linkableCandidate(cand) ) { retHtml += '</a>'; }
					retHtml += '</span></div></td>';
				}
				else
				{
					retHtml += '<td>&nbsp;</td>';
				}
			}
			retHtml += '</tr>';

			//Results data
			for( var k = 0; k < answers.length; k++ )
			{
				retHtml += '<tr';
				if( k % 2 != 1 ) { retHtml += ' class="alt"'; }
				retHtml += '>';

				retHtml += '<td class="title';
				if( numPolls != (polls.length-1) ) { retHtml += ' bord_b'; }
				retHtml += '">'+'<div><span><b>'+answers[k].name+'</b></span></div></td>';

				retHtml += '<td class="perc';
				if( numPolls != (polls.length-1) ) { retHtml += ' bord_b'; }
				retHtml += '">';
				retHtml += '<div><span>('+answers[k].pollPercent+'%)</span></div></td>';

				for( var m = 0; m < numSlots; m++ )
				{
					if( m < numCandidates )
					{
						var candID = candidates[m].id;

						retHtml += '<td';
						if( numPolls != (polls.length-1) )
						{
							retHtml += ' class="bord_b';
							if( answers[k].candPercents[ candID ].leader) { retHtml += ' dark'; }
							retHtml += '"';
						}
						else if( answers[k].candPercents[ candID ].leader ) { retHtml += ' class="dark"'; }
						retHtml += '>';
						retHtml += '<div><span>'+answers[k].candPercents[ candID ].pct+'</span></div></td>';
					}
					else
					{
						retHtml += '<td';
						if( numPolls != (polls.length-1) ) { retHtml += ' class="bord_b"'; }
						retHtml += '>&nbsp;</td>';
					}
				}
				retHtml += '</tr>';
			}
			retHtml += tableFooter;
			numPolls++;
		}
		if( !polls.length ) { retHtml = '<div id="loadingResultsTable"><div class="loading"><img src="http://i.l.cnn.net/cnn/ELECTION/2008/images/loading.gif" alt="Please wait while we retrieve your data" border="0"><br>Please wait while we retrieve the data.</div></div>'; }
		this.currentPage = num;
		this.renderPaginationLinks();
		loadingEpollResults = false;
		$('cnnEpollTables').innerHTML = retHtml;
		return retHtml;
	},
	renderPaginationLinks: function()
	{
		var topHtml = '<span style="font:normal 10px helvetica, arial;color:#949494;">'+createArrowWidget(1,this.currentPage,this.totalPages,false)+'</span>';

		var bottomHtml = '<table cellspacing="0" cellpadding="0" border="0" width="947"><tr valign="top"><td>&nbsp;</td><td align="right" style="font:normal 10px helvetica, arial;color:#949494;">'+createArrowWidget(2,this.currentPage,this.totalPages,true)+'</td></tr></table>';

		$('cnnPaginationTop').innerHTML = topHtml;
		$('cnnPaginationBottom').innerHTML = bottomHtml;
	}
};

function loadEpollResultInfo(val)
{
	if(loadingEpollResults) return;
	loadingEpollResults = true;

	//Return obj to default state
	cnnEpollObj.reset();

	cnnEpollStateAbbr = val.substring(0,2);
	cnnEpollPartyAbbr = val.substring(2);
	cnnEpollParty = ( cnnEpollPartyAbbr == 'DEM' ) ? 'democrat' : 'republican';
	var jsonFile = jsonPath+'xp'+val+'.html';

	if(cnnEpollStateAbbr == '' || cnnEpollPartyAbbr == ''){
                $('cnnEpollTables').innerHTML = '<br/>'+getPlaceholderText();
                return;
        }


	CSIManager.getInstance().call(jsonFile,'', ['cnnEpollTables','cnnEpollH1'], [csiLoadObj, csiPopulateEpollInfo], true);
	//Get 'How To Read Entrance/Exit Polls' note
	CSIManager.getInstance().call(noteDir+'howto/'+cnnEpollPartyAbbr+cnnEpollStateAbbr+'.html','','cnnEpollHowTo');

	//Get 'Special Notes' (bottom of page)
	CSIManager.getInstance().call(noteDir+cnnEpollPartyAbbr+cnnEpollStateAbbr+'.html','','specialNotes');
	var listBoxOrder = ( cnnEpollPartyAbbr == 'DEM' ) ? ['DEMOCRATS','REPUBLICANS'] : ['REPUBLICANS','DEMOCRATS'];
	rearrangeSelectBox('cnnDD_elexCand_list', listBoxOrder, true);
}

function ePollNavigate(val)
{
	YAHOO.util.History.navigate("val", val);
}

function csiLoadObj(obj)
{
	var candidates = obj.candidates;
	candidates.sort( function(a,b)
	{
		if( a.lname.toLowerCase() == 'other' ) { return 1; }
		else if( b.lname.toLowerCase() == 'other' ) { return -1; }
		else if( !linkableCandidate(a) ) { return 1; }
		else if( !linkableCandidate(b) ) { return -1; }
		else
		{
			if(a.lname < b.lname) { return -1; }
			else if(a.lname > b.lname) { return 1; }
			else { return 0; }
		}
	});

	for( var i=0; i<candidates.length; i++ )
	{
		var c = candidates[i];
		if( !linkableCandidate(c) )
		{
			cnnEpollObj.hasUncommittedData = true;
			cnnEpollObj.uncommittedIndex = i;
		}
		else if( c.lname.toLowerCase() == 'other' )
		{
			cnnEpollObj.hasOtherData = true;
			cnnEpollObj.otherIndex = i;
		}
		cnnEpollObj.candidates[i] = {
			"id": c.id,
			"last": c.lname,
			"first": c.fname,
			"image": imgHost+imgDir+'main_page/candidates/52/'+c.lname.toLowerCase()+'_background.jpg',
			"link": '/ELECTION/2008/primaries/results/candidates/#'+c.id
		};
	}
	
	var numRespondents;
	var previousNum;
	
	for( var j=0; j<obj.polls.length; j++ )
	{
		if( j == 0 || ( j % numPollsPerPage == 0 ) ) { cnnEpollObj.totalPages++; }

		var poll = obj.polls[j];
		var answers = poll.answers;

		numRespondents = poll.numrespondents;
		if( numRespondents && previousNum && numRespondents != previousNum )
		{
			cnnEpollObj.useUniqueRespondentData = true;
		}
		previousNum = numRespondents;
		
		cnnEpollObj.polls[j] = {
			"question": poll.question,
			"answers": [],
			"respondents": poll.numrespondents,
			"lts": poll.lts
		};
		
		for( var k=0; k<answers.length; k++ )
		{
			var answer = answers[k];
			var cAnswers = answer.candidateanswers;
			cnnEpollObj.polls[j].answers[k] = {
				"name": answers[k].answer,
				"pollPercent": answers[k].pct,
				"candPercents": []
			};
			
			for( var l=0; l< cAnswers.length; l++ )
			{
				var candID = cAnswers[l].id;
				var candPct = ( cAnswers[l].pct.toString() == 'N/A' ) ? cAnswers[l].pct : cAnswers[l].pct + '%';
				cnnEpollObj.polls[j].answers[k].candPercents[ candID ] = { "pct": candPct, "leader": cAnswers[l].leader };
			}
		}
		
		if( cnnEpollObj.useUniqueRespondentData == false )
		{
			$('cnnCommonRespondents').innerHTML = cnnEpollObj.polls[0].respondents+' Respondents';
		}
	}
	var retHtml = cnnEpollObj.loadEpollPage(1);
	return retHtml;
}

//csiCallback function for building the info table
function csiPopulateEpollInfo(obj)
{
	var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	var retHtml = '';
	var epollState = obj.state;
	var epolltype = obj.polltype;
	if( epollState )
	{
		var retHtml = '';
		var epollDate = obj.electiondate;
		var epollYear = epollDate.substring(0,4);
		var epollMonth = epollDate.substring(4,6);
		var epollDay = epollDate.substring(6,8);
		
		if( epollMonth.charAt(0) ) { epollMonth = epollMonth.charAt(1); }

		var partyAdj = ( cnnEpollPartyAbbr == 'DEM' ) ? 'DEMOCRATIC' : 'REPUBLICAN';
		retHtml += '<div class="cnnElexPrim_head">'
			+ '<h1>' +epolltype.toUpperCase()+ ' POLLS: <b><a href="/ELECTION/2008/primaries/results/state/#'+cnnEpollStateAbbr+'">'
			+ epollState+'</a></b></h1></div>';
		retHtml += '<div class="cnnElexEPP_nav">';
		
		if( obj.opxpoll )
		{
			if( cnnEpollPartyAbbr == 'DEM')
			{
				retHtml += '<a class="active" style="cursor:pointer">'
					+ '<b>Democrats</b></a> | '
					+ '<a style="cursor:pointer" onclick="ePollNavigate(\''+cnnEpollStateAbbr+'REP\');">'
					+ '<b>Republicans</b></a>';
			} 
			else
			{
				retHtml += '<a style="cursor:pointer" '
					+ 'onclick="ePollNavigate(\''+cnnEpollStateAbbr+'DEM\');">'
					+ '<b>Democrats</b></a>'
					+ ' | <a style="cursor:pointer" class="active">'
					+ '<b>Republicans</b></a>';
			}
		}
		retHtml += '</div>';
		
		var titleHtml = '';
		titleHtml += '<div class="cnnElexPrimSTitle"><h2><img src="'+imgHost+imgDir+'common/icon_'+cnnEpollParty+'.gif" '
			+ 'width="18" height="15" alt="" border="0" style="margin-right:5px;">'
			+ partyAdj+' PARTY,  <span>'+months[epollMonth-1]+' '+epollDay+', '+epollYear+'</span></h2></div>';
		$('cnnEpollPartyTitle').innerHTML = titleHtml;
		
	}
	if( obj.lts )
	{
		var timeStampText = getElectionTimestamp(obj.lts,false);
		if(timeStampText.indexOf('ago') > -1){
			$('cnnEpollTimestamp').className='cnnHtTimestamp';
		}
		$('cnnEpollTimestamp').innerHTML = timeStampText;
	}
	return retHtml;
}

function loadEpollPage( num, scroll )
{
	return cnnEpollObj.loadEpollPage(num,scroll);
}

//builds the << page 1 of 15 >> widget - the 'num' is a unique id for enabling rollover effects (there are 2 widgets on the page)
function createArrowWidget(num,pageNum,total,scroll)
{
	var arrowWidget = createArrow('left',pageNum-1,total,num,scroll);
	arrowWidget += '&nbsp; '+pageNum+' of '+total+' &nbsp;';
	arrowWidget += createArrow('right',pageNum+1,total,num,scroll);
	return arrowWidget;
}

//creates a single arrow - called by createArrowWidget()
function createArrow(direction,pageNum,total,num,scroll)
{
	var imgPath = 'http://i2.cdn.turner.com/cnn/ELECTION/2008/primaries/images/county/';
	var arrowHTML = '<img src="'+imgPath+direction+'_gray.gif" width="29" height="22" style="vertical-align:middle;"/>';
	if((pageNum>0 && direction=='left') || (pageNum<=total && direction=='right'))
	{
		arrowHTML = '<a onclick="loadEpollPage('+pageNum+','+scroll+');" '
			+ 'onmouseover="document.images[\'nav_'+direction+'_top'+num+'\'].src=\''+imgPath+direction+'_red.gif\';" '
			+ 'onmouseout="document.images[\'nav_'+direction+'_top'+num+'\'].src=\''+imgPath+direction+'.gif\';">'
			+ '<img src="'+imgPath+direction+'.gif" width="29" '
			+ 'height="22" alt="" border="0" style="vertical-align:middle;" '
			+ 'name="nav_'+direction+'_top'+num+'"></a>';
	}
	return arrowHTML;
}

/////////render functions end

var cnnDocDomain = '';
if(location.hostname.indexOf('cnn.com')>0) {cnnDocDomain='cnn.com';}
if(location.hostname.indexOf('turner.com')>0) {if(document.layers){cnnDocDomain='turner.com:'+location.port;}else{cnnDocDomain='turner.com';}}
if(cnnDocDomain) {document.domain = cnnDocDomain;}
// DO NOT PUT ANYTHING BENEATH THIS!
