var stateJsonUrl = '/ELECTION/2008/primary/json/state/';
var currentStateAbbr = '';
var currentStateName = '';
var currentHasDemMap = false;
var currentHasRepMap = false;
var cnnRaces = [];
var scheduledPrimaryQueue = [];
var mapWidth = 465;
var mapHeight = 386;
var mainSWF = 'smallMain.swf';
var countyflashxml='no' ;

//called by dropdown - if on state page
function loadStateByUrl(url)
{
	if(url) { YAHOO.util.History.navigate("val", getStateFromUrl(url)); }
	else { YAHOO.util.History.navigate("val", 'NH'); }
}

//makes state CSI calls - if no stateAbbr, URL will be parsed
function loadStateResults(stateAbbr)
{
	var stateAbbr = (stateAbbr == undefined) ? getStateFromUrl() : stateAbbr;	
	if(stateAbbr == '')
	{
		$('StateInformation').innerHTML = '<br/>'+getPlaceholderText();
		return;
	}
	scheduledPrimaryQueue = [];
	currentStateAbbr = stateAbbr;
	currentHasDemMap = getHasCountyMap(currentStateAbbr, 'DEM');
	currentHasRepMap = getHasCountyMap(currentStateAbbr, 'REP');
	setDropDown();
	CSIManager.getInstance().call(stateJsonUrl+stateAbbr+'.html','','StateResults', loadStateResultsHandler, true);
	CSIManager.getInstance().call(stateJsonUrl+'/blurb/'+stateAbbr+'.html','','StateInformation');
	
	if (stateAbbr.toUpperCase() == "TX" || stateAbbr.toUpperCase() == "WA" || stateAbbr.toUpperCase() == "WV" ) {
		CSIManager.getInstance().call(stateJsonUrl+'/blurb/'+stateAbbr+'_secondary.html','','secondaryStateInfo');	
	}
	CSIManager.getInstance().call('/.element/ssi/www/sect/2.0/ELECTION/primaries/notes/state/'+stateAbbr+'.html','','specialNotes');
	
}

function setDropDown()
{
	$('cnnDD_elexState_list').value = 'Default';
	cnnDD.buildDropdown('cnnDD_elexState', 86, 240, 10, 'cnnDDWire');
}

//builds result html (callback) 
function loadStateResultsHandler(obj){try
{
	currentStateName = obj.state;
	cnnRaces = obj.races;

	if( currentStateName == 'West Virginia' || currentStateName == 'Puerto Rico' )
	{
		var numDem = 0;
		var numRep = 0;
		var repDate = ( currentStateName == 'West Virginia' ) ? '20080513' : '20080224';
		var demDate = ( currentStateName == 'West Virginia' ) ? '20080205' : '20080601';

		for( var k=0; k<cnnRaces.length; k++ )
		{
			if( currentStateName == 'Puerto Rico' && cnnRaces[k].party == 'REP' )
			{	
				cnnRaces.splice(k,1);
			}
			else if( cnnRaces[k].party == 'DEM' ) { numDem++; }
			else if( cnnRaces[k].party == 'REP' ) { numRep++; }
		}
		//if( (currentStateName == 'West Virginia' && numDem < 2) || (currentStateName == 'Puerto Rico' && numDem < 1) )
		if( (currentStateName == 'West Virginia' && numDem < 2) )
		{
			//Hard-coded dem caucus box for WV
			cnnRaces.push({"votelabel":"Votes","status":"scheduled","countyresults":false,"electiondate":demDate,"primarytype":"caucus","party":"DEM","ts":0,"pctsrep":0,"race":currentStateName+" Democratic Caucus-President","pollclose":0,"candidates":[],"polls":[],"xpoll":false,"polltype":"exit"});
		}
		if( (currentStateName == 'West Virginia' && numRep < 2) || (currentStateName == 'Puerto Rico' && numRep < 1) )
		{
			cnnRaces.push({"votelabel":"Votes","status":"scheduled","countyresults":false,"electiondate":demDate,"primarytype":"caucus","party":"REP","ts":0,"pctsrep":0,"race":currentStateName+" Republican Caucus-President","pollclose":0,"candidates":[],"polls":[],"xpoll":false,"polltype":"exit"});
		}
	}
	cnnRaces.sort( function(a,b)
	{
		if( a.race.indexOf("Washington") > -1 || a.race.indexOf('West Virginia') > -1)
		{
			if( a.electiondate && b.electiondate )
			{
				if( a.electiondate > b.electiondate ) { return -1; }
				else if( a.electiondate < b.electiondate ) { return 1; }
			}
			if( a.party == 'DEM' && b.party == 'REP' ) { return -1; }
			else if( a.party == 'REP' && b.party == 'DEM' ) { return 1; }
			else if( a.primarytype == 'primary' && b.primarytype == 'caucus') { return 1; }
			else if( b.primarytype == 'primary' && a.primarytype == 'caucus') { return -1; }
			else { return 0; }
		 } else if(a.race.indexOf("Texas") > -1 ) {
			//don't do any sorting, JSON should sort
			var thisCode = '';
			var thatCode = '';
			if(typeof(a.primarytype) != "undefined") {
				thisCode += (a.primarytype == "primary") ? 0 : 1;
			}
			if(typeof(b.primarytype) != "undefined") {
				thatCode += (b.primarytype == "primary") ? 0 : 1;
			}
			thisCode += a.party;
			thatCode += b.party;
			return (thisCode > thatCode) ? 1 : (thisCode < thatCode) ? -1 : 0;			
		 } else{
			if( a.party == 'DEM' && b.party == 'REP' ) { return -1; }
			else if( a.party == 'REP' && b.party == 'DEM') { return 1; }
			else if(a.party == b.party)
			{
				if(a.electiondate && b.electiondate)
				{
					if( a.electiondate > b.electiondate ) { return 1; }
					else if( a.electiondate < b.electiondate ) { return -1; }
				}
			}
			else { return 0; }
		}
	});

		if(obj.code && obj.code.toUpperCase() == "TX") { //effectively putting dummy data in json to put place holder box on page for Republican Caucus box.
			cnnRaces.push({"votelabel":"Votes","status":"scheduled","countyresults":false,"electiondate":"20080304","primarytype":"caucus","party":"REP","ts":0,"pctsrep":0,"race":"Texas Republican Caucus-President","pollclose":0,"candidates":[],"polls":[],"xpoll":false,"polltype":"exit"});
		}
		
		setTitles(obj);

		var secondaryBoxes = [];

		var html = '';
		for( var i=0; i<cnnRaces.length; i++ )
		{
			if( i > 1 && obj.code.toUpperCase() == 'WV' )
			{
				secondaryBoxes[ secondaryBoxes.length ] = cnnRaces[i];
			}
			else
			{
				var side = ( i == 0 || i % 2 == 0 ) ? 'left' : 'right';
				if( i> 0 && i % 2 == 0 ) { 
					html += '<div style="clear:both;height:10px;overflow:hidden;"><img src="http://i.cdn.turner.com/cnn/images/1.gif" width="1" height="10" alt="" border="0"/></div>'; 
					if (obj.code.toUpperCase() == "TX" || obj.code.toUpperCase() == "WA") {
						html += '<div id="secondaryStateInfo"></div><div style="clear:both;height:10px;overflow:hidden;"><img src="http://i.cdn.turner.com/cnn/images/1.gif" width="1" height="10" alt="" border="0"/></div>';
					}
				}
				html += getResultsTable( cnnRaces[i], side );
			}
	}
	if( obj.code.toUpperCase() == 'WV' )
	{
		secondaryBoxes.sort( function(a,b)
			{
				if( a.party == 'REP' && b.party == 'DEM' ) { return 1; }
				else if( b.party == 'REP' && a.party == 'DEM' ) { return -1; }
				else { return 0; }
			}
		);
	}
	var timeStampText = (obj.lts == 0) ? '' : getElectionTimestamp(obj.lts,false);
	if(timeStampText.indexOf('ago') > -1) { $('primaryTimeStamp').className='cnnHtTimestamp'; }
	else{ $('primaryTimeStamp').className='cnnElex_ts over_hour'; }
        $('primaryTimeStamp').innerHTML = timeStampText;
	//processPrimaryQueue(0);
	html += '<div style="clear:both;height:1px;overflow:hidden;"></div>';
	var countyResultsAreAvailableDEM = getIfCountyResultsAreAvailable(cnnRaces, 'DEM');
	var countyResultsAreAvailableREP = getIfCountyResultsAreAvailable(cnnRaces, 'REP');
	var mapRaceTypeDEM = getRaceTypeForMapOnState(cnnRaces, currentStateAbbr, 'DEM');
	var mapRaceTypeREP = getRaceTypeForMapOnState(cnnRaces, currentStateAbbr, 'REP');
	if(currentHasDemMap || currentHasRepMap)
	{
		var cnnFIPS = getFIPS(currentStateAbbr);
		html += '<div class="StateCountyMaps"><div class="cnnElexPrimST_left">';
		if(currentHasDemMap)
		{
			html += loadCountyMaps(currentStateAbbr, mapWidth, mapHeight, 'DEM', mainSWF, cnnFIPS, mapRaceTypeDEM);
		}
		else { html += '&nbsp;'; }
		html += '</div>';
		if(currentHasRepMap)
		{
			html += '<div class="cnnElexPrimST_right">'+loadCountyMaps(currentStateAbbr, mapWidth, mapHeight, 'REP', mainSWF, cnnFIPS, mapRaceTypeREP)+'</div>';
		}
		html += '</div>';
	}
	if( obj.code && obj.code.toUpperCase() == "WV")
	{
		html += '<div id="secondaryStateInfo"></div><div style="clear:both;height:10px;overflow:hidden;"><img src="http://i.cdn.turner.com/cnn/images/1.gif" width="1" height="10" alt="" border="0"/></div>';
		for( var j=0; j<secondaryBoxes.length; j++ )
		{
			var side = ( j == 0 || j % 2 == 0 ) ? 'left' : 'right';
			html += getResultsTable( secondaryBoxes[j], side );
		}
		html += '<div style="clear:both;height:10px;overflow:hidden;"><img src="http://i.cdn.turner.com/cnn/images/1.gif" width="1" height="10" alt="" border="0"/></div>';
	}
	processPrimaryQueue(0);
 	return html;

}catch(e){return 'This state has no data.';}}

function getIfCountyResultsAreAvailable(cnnRaces, party){
	var countyResultsAreAvailable = false;
	for( var i=0; i<cnnRaces.length; i++ )
	{
		if(cnnRaces[i].party.toUpperCase() == party && cnnRaces[i].countyresults == true){
			countyResultsAreAvailable = true;
		}
	}
	return countyResultsAreAvailable;
}

//if the race is scheduled, make CSI call for each party - but wait for the div/id to exist
function processPrimaryQueue(i){try{
	if(i>=scheduledPrimaryQueue.length) return;
	var party 	= (scheduledPrimaryQueue[i].indexOf('DEM')>-1) ? 'DEM' : 'REP';
	var stateAbbr 	= scheduledPrimaryQueue[i].replace(/DEM/,'').replace(/REP/,'').replace(/scheduled/,'').replace(/left/,'').replace(/right/,'').replace(/_primary/,'').replace(/_caucus/,'');
	if( $(scheduledPrimaryQueue[i])==undefined )
	{
		setTimeout("processPrimaryQueue("+i+")",100);
	}
	else
	{
		if( stateAbbr == 'TX' || stateAbbr == 'WA' || stateAbbr == "WV")
		{
			var raceType = ( scheduledPrimaryQueue[i].indexOf('_primary') > -1 ) ? 'primary' : 'caucus';
			CSIManager.getInstance().call('/.element/ssi/www/sect/2.0/ELECTION/primaries/state/'+party+stateAbbr+'_'+raceType+'.html','',scheduledPrimaryQueue[i]);
		}
		else
		{
			CSIManager.getInstance().call('/.element/ssi/www/sect/2.0/ELECTION/primaries/state/'+party+stateAbbr+'.html','',scheduledPrimaryQueue[i]);
		}
		i++;
		if( scheduledPrimaryQueue[i] ) { setTimeout("processPrimaryQueue("+i+")",100); }
	}
}catch(e){return;}}


//builds a single table (dem or rep)
function getResultsTable(race,side){
	var resultHTML = '<div class="cnnElexPrimST_'+side+'">';

	if(race.status.toLowerCase()=='scheduled'){
		//resultHTML += getRaceTitle(race);
		resultHTML += '<div class="waitingTableTop"><table><tr><td style="padding-top: 20px; padding-left: 20px;padding-right:20px; border-left:1px solid #DADADA; border-right:1px solid #DADADA; height:200px;">';
		resultHTML += '<div id="scheduled'+side+race.party+currentStateAbbr;
		if( race.race.indexOf('Texas') > -1 || race.race.indexOf('Washington') > -1 || race.race.indexOf('West Virginia') > -1 ) { resultHTML += '_'+race.primarytype; }
		resultHTML += '"></div>';
		resultHTML += '</td></tr>';
		resultHTML += '</table>';
		resultHTML += '<div class="bottom"></div>';
		if( currentStateAbbr.toUpperCase() == 'WA' || currentStateAbbr.toUpperCase() == 'TX' || currentStateAbbr.toUpperCase() == 'WV' )
		{
			scheduledPrimaryQueue[scheduledPrimaryQueue.length] = "scheduled"+side+race.party+currentStateAbbr+'_'+race.primarytype;
		}
		else
		{
			scheduledPrimaryQueue[scheduledPrimaryQueue.length] = "scheduled"+side+race.party+currentStateAbbr;
		}
	}else{
		resultHTML += getResultsTableHeader(race);
		resultHTML += addStateNameCell(race);
		resultHTML += addStatusCell(race);
		resultHTML += addCandidateRows(race);
		resultHTML += (race.polls.length > 0 && race.polls[0].answers.length > 0) ? generatePollGraphs(race) : '<div class="bottom"></div>';
	}
	return resultHTML + '</div></div>';
}

//generates state name cell
function addStateNameCell(race){
	var timestamp = (race.ts == 0) ? '' : getElectionTimestamp(race.ts,true);
	var raceCanShowMap = ( race.party == 'DEM' )?currentHasDemMap:currentHasRepMap;
	var stateNameHtml = '<tr valign="top"><td rowspan="'+race.candidates.length+'"><div class="state_name"><b>'+currentStateName+'</b><br><span style="font-size:11px;">'+timestamp+'</span></div>';
	if(race.countyresults && raceCanShowMap){
		stateNameHtml += '<br/><br/><div style="padding-top:7px; padding-left:7px;color:#949494;" align="left"><b>County:</b> <a href="/ELECTION/2008/primaries/results/county/#'+currentStateAbbr+race.party+race.primarytype+'"><b><span style="font-size:11px;">Table</span></b></a> | <a href="/ELECTION/2008/primaries/results/county/#'+currentStateAbbr+race.party+'MAP'+race.primarytype+'"><b><span style="font-size:11px;">Map</span></b></a></div>';
	} else if (race.countyresults) {
		stateNameHtml += '<br/><br/><div style="padding-top:7px; padding-left:7px;" align="left"><a href="/ELECTION/2008/primaries/results/county/#'+currentStateAbbr+race.party+race.primarytype+'"><b><span style="font-size:11px;">County Results</span></b></a></div>';
	}
	if(race.xpoll) {
		stateNameHtml += '<div style="padding-left:7px" align="left"><a href="/ELECTION/2008/primaries/results/epolls/index.html#'+currentStateAbbr+race.party+'"><b><span style="font-size: 11px;">'+setPollType(race.polltype)+' Poll</span></b></a></div><br/>';
	}
	return stateNameHtml+"</td>";
}

function setPollType(type) {
	switch(type) {
		case "entrance":
			return "Entrance";
		break;
		default:
			return "Exit";
	}
}

//generates status cell
function addStatusCell(obj){
	return '<td class="status"><img src="'+statusGraphicsArray[obj.status.toLowerCase()]+'" width="45" height="42" alt="" border="0" vspace="6"></td>';
}


//there must be 2 polls - for each set, the first poll must have 2 answers, the 2nd = 4 answers - any deviation will cause this to abort.
var haveBeenGraphs=false;
function generatePollGraphs(race){try{
	var poll1 = (race.polls[0].answers.length >= 2 && race.polls[0].answers.length<4) ? race.polls[0] : (race.polls[1].answers.length == 2 && race.polls[1].answers.length<4) ? race.polls[1] : '';
	var poll2 = (race.polls[1].answers.length >= 4) ? race.polls[1] : (race.polls[0].answers.length >= 4) ? race.polls[0] : '';
	var polltype = ( race.primarytype.toLowerCase() == 'caucus') ? 'entrance' : 'exit';
	var backgroundStyle = 'background:transparent url(http://i.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/state/'+polltype+'_poll_frame.gif) no-repeat scroll left top;';

	var linkpadding = (polltype == 'entrance') ? 'padding-left:44px' : '';

	if(poll1 == '' || poll2 == '') return '<div class="bottom"></div>'; //not going to deal with bad data

	if(poll1 == undefined || poll2 == undefined){ return '<div class="bottom"></div>';}
	var pollHtml = '<div class="exit_graph_area" style="'+backgroundStyle+'"><div class="exit_poll_link" style="'+linkpadding+'"><a href="/ELECTION/2008/primaries/results/epolls/#'+currentStateAbbr+race.party+'"><b>Full '+currentStateName+' '+partyToAdjective(race.party);
	pollHtml += ( race.primarytype.toLowerCase() == 'caucus' ) ? ' Entrance' : ' Exit';
	pollHtml += ' Poll &raquo;</b></a></div>';
	pollHtml += '<div class="graph_left_title">'+partyToAdjective(race.party)+' vote by <b>'+poll1.pollname+'</b></div>';
	pollHtml += '<div class="graph_right_title">'+partyToAdjective(race.party)+' vote by <b>'+poll2.pollname+'</b></div>';
	pollHtml += '<div class="graph_table"><table cellspacing="0" cellpadding="0" border="0" width="417">';
	pollHtml += '<colgroup><col width="60"><col width="20"><col width="60"><col width="57"><col width="40"><col width="20"><col width="40"><col width="20"><col width="40"><col width="20"><col width="40"></colgroup><tr valign="bottom" class="graph">';
	pollHtml += generateGraphBar('bar_mid',poll1.answers[0].pct).replace(/class/,"height=\"122\" class")+"<td></td>";
	pollHtml += generateGraphBar('bar_light',poll1.answers[1].pct)+"<td></td>";
	pollHtml += generateGraphBar('bar_mid',poll2.answers[0].pct)+"<td></td>";
	pollHtml += generateGraphBar('bar_light',poll2.answers[1].pct)+"<td></td>";
	pollHtml += generateGraphBar('bar_midlight',poll2.answers[2].pct)+"<td></td>";
	pollHtml += generateGraphBar('bar_dark',poll2.answers[3].pct);
	pollHtml += '</tr>';
	pollHtml += '<tr><td colspan="9"><div class="graph_spacer"></div></td></tr>';
	pollHtml += '<tr>';
	pollHtml += '<td>'+poll1.answers[0].answer+'</td><td></td>';
	pollHtml += '<td>'+poll1.answers[1].answer+'</td><td></td>';
	pollHtml += '<td>'+poll2.answers[0].answer+'</td><td></td>';
	pollHtml += '<td>'+poll2.answers[1].answer+'</td><td></td>';
	pollHtml += '<td>'+poll2.answers[2].answer+'</td><td></td>';
	pollHtml += '<td>'+poll2.answers[3].answer.replace(/ and Older/,'+')+'</td></tr>';
	pollHtml += '</table>';
	pollHtml += '</div></div>';
	haveBeenGraphs = true;
	return pollHtml;
}catch(e){return '<div class="bottom"></div>'}}

//generates a single bar graph
function generateGraphBar(barClass,value){
	return '<td class="'+barClass+'">'+value+'%<br/><div style="height:'+value+'px;"></div></td>'
}

//converts DEM or REP to Democratic or Republican
function partyToAdjective(party){
	return (party == 'DEM') ? 'Democratic' : 'Republican';
}

//generates the rows with the list of candidates for a table
function addCandidateRows(race){
	var candidates = race.candidates;
	var candidateHtml = '';
	for(var i=0; i<candidates.length; i++){
		var isLast = (i == candidates.length-1);
		var isFirst = (i == 0);
		candidateHtml += generateCandidateRow(candidates[i],isLast,isFirst);
		if(isFirst){
			candidateHtml += '<td rowspan="'+candidates.length+'" class="report"><div class="pad"><b>'+race.pctsrep+'%</b><br><span style="font-size:10px;">reporting</span></div></td></tr>';
		}
	}
	return candidateHtml+'</table>';
}

//builds a single row for a candidate
function generateCandidateRow(candidate,isLast,isFirst){
	var candidateClass = (isLast) ? '' : 'bord_b';
	var row = '<td class="cand '+candidateClass+'">';	
	row += '<div class="pad">';
	row += getCandidateLink(candidate);
	row += '</div></td>';
	row += '<td class="'+candidateClass+'"><div class="pad">'+candidate.cvotes+'</div></td>';
	row += '<td class="'+candidateClass+'"><div class="pad"><b>'+candidate.vpct+'%</b></div></td>';
	row += '<td class="'+candidateClass+'"><div class="pad"><b>'+candidate.edelegates+'</b></div></td>';
	if(!isFirst){
		row = '<tr valign="top"><td></td>'+row+'</tr>';
	}
	return row;
}

//starts the table with a lot of static html
function getResultsTableHeader(race){
	var partyClass  = (race.party == 'DEM') ? "democ" : "repub";
	var header1 = race.votelabel;
	var header2 = (race.primarytype.toLowerCase() == 'caucus')?'%':'Vote %';
	var headerHtml 	= ''
		//+ getRaceTitle(race)
		+'<div class="cnnElexPrimStateTable '+partyClass+'"><table cellspacing="0" cellpadding="0" border="0" width="465"><colgroup><col width="116"><col width="54"><col width="94"><col width="72"><col width="41"><col width="30"><col width="58"></colgroup><tr class="header"><td class="begin_left"><div><span>Race</span></div></td><td><div><span>Status</span></div></td><td class="cand_mid"><div><span>Candidate</span></div></td><td><div><span>' + header1 + '</span></div></td><td><div><span>' + header2 + '</span></div></td><td><div><span>Del*</span></div></td><td class="end_right"><div><span>Precincts</span></div></td></tr>';
	return headerHtml;
}

function getRaceTitle(race){

	var caucusSuffix = (race.primarytype.toLowerCase() == 'caucus') ? 'ES' : '';
    var icon        = getPartyIcon(race.party);
    var capTitle    = (race.party == 'DEM') ? "DEMOCRATIC" : "REPUBLICAN";
    var date        = (race.electiondate !='') ? getPrettyDate(race.electiondate): '';

        var headerHtml  = '<div class="cnnElexPrimSTitle"><h2><img src="'+icon+'" alt="" border="0" style="vertical-align:top;margin:0px 5px 0px 0px;">'+capTitle+' '+race.primarytype.toUpperCase()+caucusSuffix+' <span>'+date+'</span></h2></div>';
	return headerHtml;
}


//gets the appropraite party icon for DEM or REP
function getPartyIcon(party){
        var imgPath = 'http://i.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/state/';
        imgPath += (party=='DEM') ? 'icon_democrat.gif' : 'icon_republican.gif';
        return imgPath;
}

//updates document.title and the page title
function setTitles(obj){
	document.title = "Election Center 2008: Primary Results for " + obj.state + " - Elections & Politics news from CNN.com";
}

//tries to get the state from the url or passed in variable - any exception returns Iowa - naturally.
function getStateFromUrl(url){
	if(url==undefined){url=location.href;}
	try{return url.substring(url.indexOf('#')).replace(/#/,'');
	}catch(e){return "IA";}
}

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!
