var usingStateManager = false;
var jsonPath = '/ELECTION/2008/primary/json/scorecard/';
var scorecardPath = '/ELECTION/2008/primaries/results/scorecard/';
var candidatePath = '/ELECTION/2008/primaries/results/candidates/';
var notePath = '/.element/ssi/www/sect/2.0/ELECTION/primaries/notes/scorecard/';
var imgPath ='/.element/img/2.0/sect/election/primaries/results/';
var imgHost = 'http://i.cdn.turner.com/cnn';

var today = new Date();
var months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');

var cnnSCObj = {
	party: '',
	partyLetter: '',
	candidates: [],
	stateData: [],
	electionDates: [],
	contestDate: '',
	nationData: [],
	loadingResults: false,
	totalDelegates: 0,
	delegatesToWin: 0,
	delegatesAtStake: 0,
	reset: function()
	{
		this.candidates = [];
		this.stateData = [];
		this.nationData = [];
		this.electionDates = [];
		this.contestDate = '';
		this.totalDelegates = 0;
		this.delegatesToWin = 0;
		this.delegatesAtStake = 0;
	},
	inclusions: {
		"155": "Hunter",
		"1701": "McCain",
		"751": "Tancredo",
		"893": "Romney",
		"57302": "Thompson",
		"1187": "Huckabee",
		"32884": "Giuliani",
		"302": "Paul",
		"1036": "Biden",
		"1918": "Obama",
		"1358": "Richardson",
		"1746": "Clinton",
		"1803": "Edwards",
		"1380": "Kucinich",
		"57266": "Gravel",
		"1707": "Dodd"
	}
};

function CandidateBox(obj)
{
	var c = cnnSCObj.candidates[obj.id];
	this.last = c.last;
	this.first = c.first;
	this.image = c.image;
	this.link = c.link;
	this.delegates = obj.tcdelegates;
	this.percentage = obj.vpct;
	this.winner = obj.winner;
	this.superdel = obj.udelegates;
	this.pledgeddel = obj.edelegates;

}

CandidateBox.prototype = {
	html:function(lastBox)
	{
		var html = [];
		html.push('<div class="cnnElexDSCCand">');
		html.push('<div class="c_img"><a href="'+this.link+'"><img src="'+this.image+'" width="52" height="52" alt="'+this.last+'" border="0"></a></div>');
		html.push('<div class="c_data">');
		html.push('<div class="c_name"><a href="'+this.link+'">'+this.first+' '+this.last+'</a></div>');
		html.push('<div class="c_pledged">Pledged: <span>'+this.pledgeddel+'</span></div>');
		html.push('<div class="c_superdel">');
		if( cnnSCObj.partyLetter == 'D') { html.push( 'Superdelegates' ); }
		else { html.push( 'Unpledged RNC*' ); }
		html.push(': <span>'+this.superdel+'</span></div>');
		html.push('<div class="c_total">Total: <span>'+this.delegates+'</span></div>');
		html.push('</div>');
		html.push('</div>');
		return ( html.join('') );
	}
};

function State( obj )
{
	this.name = obj.name;
	this.image = obj.image;
	this.type = obj.type;
	this.link = obj.link;
	this.results = obj.results;
	this.lts = obj.lts;
	this.date = obj.date;

	//var test = new Date( Date.UTC(today.getFullYear(), today.getMonth(), today.getDate(), today.getHours() + 5, today.getMinutes(), 0, 0) );
	//var timeStampText = getElectionTimestamp(test.getTime(),true,false);

	var timeStampText = getElectionTimestamp(obj.lts,true,false);
	this.updated = timeStampText;
}

State.prototype = {
	isReady: function()
	{
		var elexDate = this.date;
		var elexYear = elexDate.substring(0,4);
		var elexMonth = elexDate.substring(4,6);
		var elexDay = elexDate.substring(6);

		//Linking to state results at 12:01 a.m. day of contest
		var elexHourEST = 0;
		var elexHourGMT = elexHourEST + 5;

		if( elexMonth.charAt(0) == '0' ) { elexMonth = elexMonth.charAt(1); }
		if( elexDay.charAt(0) == '0' ) { elexDay = elexDay.charAt(1); }

		var testDate= new Date(elexMonth + '/'+elexDay+'/'+elexYear+' '+elexHourGMT.toString()+':01:00 GMT');
		if( today.getTime() > testDate.getTime() )
		{
			return true;
		}
		else { return false; }
	},
	html:function(numRows)
	{
		var html = [];
		var useLiveData = false;
		var cand1;

		var defaultCandidate = {
			"first": "",
			"last": "",
			"image": "",
			"link": ""
		};

		//Sort by tdelegates, and get winner(s) on top (winner can have 0 delegates)
		this.results.sort( function( a,b )
		{
			if( a.winner )
			{
				if( b.winner )
				{
					if( a.tdelegates == b.tdelegates )
					{
						var candA = cnnSCObj.candidates[ a.id ];
						var candB = cnnSCObj.candidates[ b.id ];

						if( candA.last < candB.last ) { return -1; }
						else if( candA.last > candB.last ) { return 1; }
					}
					else { return b.tdelegates - a.tdelegates; }
				}
				else { return -1; }
			}
			else if( b.winner ) { return 1; }
			else
			{
				return b.tdelegates - a.tdelegates;
			}
		});

		if( this.results.length )
		{
			if( cnnSCObj.candidates[ this.results[0].id ] && ( this.results[0].tdelegates || this.results[0].winner ) )
			{
				cand1 = cnnSCObj.candidates[ this.results[0].id ];
				useLiveData = true;
			}
			else { cand1 = defaultCandidate; }

			html.push('<table cellspacing="0" cellpadding="0" border="0" width="382">');
			html.push('<colgroup><col width="63"><col width="125"><col width="119"><col width="75"><\/colgroup>');
			html.push('<tr valign="top">');
			html.push('<td rowspan="'+numRows+'">');
			html.push('<img src="'+this.image+'" width="62" height="66" alt="" border="0">');
			html.push('<\/td>');
			html.push('<td rowspan="'+numRows+'" class="state"><div class="stateCell">');
			if( this.isReady() )
			{
				html.push('<a href="'+this.link+'" class="name">');
				html.push('<b>'+this.name+'<\/b>');
				html.push('<\/a>');
			}
			else { html.push('<span class="name"><b>'+this.name+'<\/b><\/span>'); }
			html.push('<br>');
			if( this.name.toLowerCase() == 'washington' || this.name.toLowerCase() == 'texas' || this.name.toLowerCase() == 'west virginia' )
			{
				var type = ( this.type.toLowerCase() == 'primary' ) ? 'Primary': 'Caucuses';
				html.push(type);
			}

			if( this.updated.indexOf('ago') > -1)
			{
				html.push( '<div style="padding-right:5px;overflow:auto;">' );
				html.push( this.updated + '<\/div>' );
			}
			else { html.push(this.updated); }

			html.push('<\/div><\/td>');

			//First candidate
			html.push('<td class="cand bord_b');
			if( this.results[0].winner == true ) { html.push(' win'); }
			html.push('"><div>');
			html.push('<a href="'+cand1.link+'"><b>'+cand1.last+'<\/b><\/a><\/div><\/td>');
			html.push('<td class="total_del bord_b"><div>');
			if( this.results[0].winner ) { html.push('<b>'+addCommas(this.results[0].tdelegates)+'<\/b>'); }
			else if( this.results[0].tdelegates) { html.push( addCommas(this.results[0].tdelegates) ); }
			else { html.push('&nbsp;'); }
			html.push('<\/div><\/td><\/tr>');
			//Other Candidate Results
			for( var j=1; j<numRows; j++)
			{
				var cand = ( this.results[j] && this.results[j].id && cnnSCObj.candidates[ this.results[j].id ] && ( this.results[j].tdelegates || this.results[j].winner ) ) ? cnnSCObj.candidates[ this.results[j].id ] : defaultCandidate;
				html.push('<tr valign="top"><td class="cand');
				if( j != ( numRows - 1 ) ) { html.push(' bord_b'); }
				html.push('"><div>');

				if( cand.link != '' )
				{
					html.push( '<a href="'+cand.link+'">');
					html.push('<b>'+cand.last +'<\/b><\/a>');
				}
				else { html.push( '&nbsp;' ); }

				html.push('<\/div><\/td>');

				html.push('<td class="total_del');
				if( (j+1) != numRows ) { html.push(' bord_b'); }

				if( this.results[j] && this.results[j].winner ) { html.push(' win'); }
				html.push('"><div>');
				if( this.results[j] && this.results[j].winner ) { html.push('<b>'+addCommas(this.results[j].tdelegates)+'<\/b>'); }
				else if( this.results[j] && this.results[j].tdelegates ) { html.push( addCommas(this.results[j].tdelegates) ); }
				else { html.push('&nbsp;'); }

				html.push('<\/div><\/td><\/tr>');
			}
			html.push('<\/table>');
		}
		else
		{
			html.push('&nbsp;');
		}
		return ( html.join('') );
	}
};

function getNumRows( state )
{
	var numRows = 0;
	for( var i=0; i<state.results.length; i++ )
	{
		if( state.results[i] && cnnSCObj.candidates[ state.results[i].id ] && cnnSCObj.candidates[ state.results[i].id ] && ( state.results[i].tdelegates || state.results[i].winner ) )
		{
			numRows++;
		}
	}
	return numRows;
}

function csiPopulateStateTab( sortBy )
{
	var retHtml = '';

	if( cnnSCObj.stateData.length > 1 )
	{
		retHtml += '<div style="font:normal 11px/14px arial;padding:5px 0px 8px 10px;">Sort by: ';
		if( !sortBy || sortBy == 'abc' )
		{
			retHtml += '<b><a style="cursor:pointer" onclick="sortBy(\'time\');">Most recent race</a></b> | '
				+ '<b><a style="cursor:pointer" class="active">Alphabetical order</a></b>';
		}
		else
		{
			retHtml += '<b><a style="cursor:pointer" class="active">Most recent race</a></b> | '
				+ '<b><a style="cursor:pointer" onclick="sortBy(\'abc\')">Alphabetical order</a></b>';
		}
		retHtml += '</div>';
	}

	retHtml += '<div class="del_state_table">';

	retHtml += '<table cellspacing="0" cellpadding="0" border="0" width="764">'
		+ '<colgroup><col width="188"><col width="119"><col width="75">'
		+ '<col width="185"><col width="119"><col width="78"></colgroup>'
		+ '<tr class="header"><td class="begin_left"><div><span>Race</span></div></td>'
		+ '<td><div><span>Candidate</span></div></td><td class="row_mid">'
		+ '<div><span>Total<br/>Delegates*</span></div></td>'
		+ '<td class="cand_left"><div><span>Race</span></div></td>'
		+ '<td><div><span>Candidate</span></div></td>'
		+ '<td class="end_right"><div><span>Total<br/>Delegates*</span></div></td>'
		+ '</tr>';

	for(var i=0; i<cnnSCObj.stateData.length; i++)
	{
		var state = new State( cnnSCObj.stateData[i] );
		var state1Rows = getNumRows( cnnSCObj.stateData[i] );

		var state2Rows = 0;

		if( (i+1) < cnnSCObj.stateData.length )
		{
			state2Rows = getNumRows( cnnSCObj.stateData[i+1] );
		}

		var numRows = ( state1Rows > state2Rows ) ? state1Rows : state2Rows;
		if( numRows < 3 ) { numRows = 3; }
		retHtml += '<tr valign="top">';
		retHtml += '<td colspan="3" class="state_column col_left">';
		retHtml += state.html(numRows);
		retHtml += '</td>';

		retHtml += '<td colspan="3" class="state_column col_right">';

		//Go to next state
		i++;

		if( i < cnnSCObj.stateData.length )
		{
			state = new State( cnnSCObj.stateData[i] );
			retHtml += state.html(numRows);
		}
		else { retHtml += '&nbsp;'; }

		retHtml += '</td></tr>';

		//if we have another row coming, put in spacer
		if( i+1 < cnnSCObj.stateData.length )
		{
			retHtml += '<tr><td colspan="6"><div class="table_divider"><div></div></div></td></tr>';
		}
	}

	retHtml += '</table>';
	retHtml += '<div><img src="'+imgHost+imgPath+'scorecard/states/corner_764_bottom.gif" '
		+ 'width="764" height="7" alt="" border="0"></div></div>';

	return retHtml;
}

function csiLoadObj(obj)
{
	//cnnSCObj.contestDate = obj.electiondate;
	cnnSCObj.totalDelegates = obj.totaldelegates;
	cnnSCObj.delegatesToWin = obj.tdelegatestowin;
	cnnSCObj.delegatesAtStake = obj.tdelegatesatstake;

	load_DelTracker();

	var candidates = obj.candidates;
	for( var i=0; i<candidates.length; i++ )
	{
		var c = candidates[i];
		var lastName = c.lname.replace(/'/,'');

		cnnSCObj.candidates[ c.id ] = {
			"last": c.lname,
			"first": c.fname,
			"image": imgHost+imgPath+'main_page/candidates/52/'+lastName.toLowerCase()+'_background.jpg',
			"link": candidatePath+'#'+c.id
		};
	}

	cnnSCObj.nationData = obj.nationraces;
	cnnSCObj.nationData.sort( sortByDelegates );

	var states = obj.stateraces;
	states.sort( function(a,b) {
		if( b.state < a.state ) { return 1; }
		else if( a.state < b.state ) { return -1; }
		else { return 0; }
	});
	for( var j=0; j<states.length; j++ )
	{
		var state = states[j];
		var candData = state.candidates;

		candData.sort( sortByDelegates );

		//Record election date
		cnnSCObj.electionDates[ state.electiondate ] = 1;

		cnnSCObj.stateData[j] = {
			"name": state.state,
			"type": state.primarytype,
			"image": imgHost+imgPath+'scorecard/states/'+state.code.toLowerCase()+'.gif',
			"link": '/ELECTION/2008/primaries/results/state/#'+state.code,
			"results": candData,
			"date": state.electiondate,
			"lts": state.lts
		};
	}

	$('cnnCalendarContainer').innerHTML = csiPopulateCalendar();
	sortBy('abc'); //sorts the data and calls csiPopulateStateTab()
	//loadUnpledgedDelegates();

	var retHtml = csiPopulateCandidateBoxes();
	cnnSCObj.loadingResults = false;
	return retHtml;
}

function loadScorecard(val)
{
	if( !val ) val = 'D';
	var jsonFile = jsonPath+val+'.html';
	if(cnnSCObj.loadingResults) { return; }

	cnnSCObj.reset();
	cnnSCObj.loadingResults = true;

	cnnSCObj.partyLetter = val;
	cnnSCObj.party = ( val == 'D') ? 'Democrat' : 'Republican';

	CSIManager.getInstance().call(jsonFile,'',['cnnScorecardHeader','elexDelScorecard_left'], [csiPopulateScorecardInfo, csiLoadObj], true);

	//Load general notes
	CSIManager.getInstance().call(notePath+val+'_general.html','','cnnScorecardGeneralInfo');

	//Load special notes (footer)
	CSIManager.getInstance().call(notePath+val+'.html','','cnnSpecialNote');

	embedModule(cnnSCObj.party.toLowerCase());

	var listBoxOrder = ( val == 'D' ) ? ['DEMOCRATS','REPUBLICANS'] : ['REPUBLICANS','DEMOCRATS'];
	rearrangeSelectBox('cnnDD_elexCand_list', listBoxOrder, true);
}

function csiPopulateScorecardInfo(obj)
{
	var retHtml = '';
	if(obj.party)
	{
		retHtml += '<h1>RESULTS: <b><a style="cursor:pointer" ';
		if(obj.party == 'D') { retHtml += 'class="active" '; }
		retHtml += 'onclick="cnnSCNavigate(\'D\');">'
			+ 'Democrats</a></b> <span style="color:#949494;"> | </span><b><a style="cursor:pointer" ';
		if(obj.party == 'R') { retHtml += 'class="active" '; }
		retHtml += 'onclick="cnnSCNavigate(\'R\');">'
			+ 'Republicans</a></b></h1>';
	}
	var timeStampText = getElectionTimestamp(obj.lts,false);

	if(timeStampText.indexOf('ago') > -1)
	{
		timeStampText = '<span class="cnnHtTimestamp">'+timeStampText+'</span>';
	}
	$('cnnScorecardTimeStamp').innerHTML = timeStampText;
	return retHtml;
}

function cnnSCNavigate(val){
        YAHOO.util.History.navigate("val", val);
}
var delegateDefinitions ='<a name="cnnElexDelMatArea"></a><div class="cnnMoPoBox"><div class="cnnMoPoBoxHeader"><div class="cnnMoPoBoxHeaderTL"></div><div class="cnnMoPoBoxHeaderTR"></div></div><div class="cnnMoPoBoxContent"><div class="cnnMoPoContent"><div class="cnnPad9"><!-- begin content --><div class="cnnMoPoHeader"><div class="cnnMoPoClose"><a href="javascript:cnnHideElexDelMat();"><img src="http://i.l.cnn.net/cnn/.element/img/2.0/sect/main/mopo_close.gif" border="0" alt=""></a></div><div class="cnnDefHead">Delegate Definitions</div></div><div style="height:100px;overflow:auto;overflow-x:auto;display:block;font-size:10px;"><div style="padding-bottom:10px;"><b style="font-size:11px;">Pledged delegates:</b> Won by candidates in primaries and caucuses; pledge to support their candidates at the national conventions.<br/><br/><b style="font-size:11px;">Superdelegates:</b> Democratic officeholders and party officials guaranteed national convention seats; can support the candidate of their choice.  <br/><br/><b style="font-size:11px;">Unpledged RNC member delegates:</b> Republican party officials guaranteed national convention seats; can support the candidate of their choice.</div><div class="cnnMore"><a href="/2008/POLITICS/01/02/delegate.explainer/index.html">Why delegates matter &raquo;</a></div></div><!-- end content --></div></div></div><div class="cnnMoPoBoxFooter"><div class="cnnMoPoBoxFooterBL"></div><div class="cnnMoPoBoxFooterBR"></div></div></div>';
function cnnShowElexDelMat() {
	$('cnnElexDelMat').innerHTML = delegateDefinitions;
}

function cnnHideElexDelMat() {
	$('cnnElexDelMat').innerHTML = "";
}
function csiPopulateCandidateBoxes()
{

	var retHtml = '<div class="cnnElexScCBTop"><div>TOTAL DELEGATES</div></div>';
	retHtml += '<div id="cnnElexDelMat"></div><div class="cnnElexScCBDef"><a href="javascript:cnnShowElexDelMat();">Delegate Definitions</a></div>';

	for( var i = 0; i < cnnSCObj.nationData.length; i++ )
	{
		var candID = cnnSCObj.nationData[i].id;
		if( cnnSCObj.inclusions[ candID ] )
		{
			var c = new CandidateBox( cnnSCObj.nationData[i] );
			var lastBox = ( (i+1) == cnnSCObj.nationData.length ) ? true : false;
			retHtml += c.html( lastBox );
		}
	}
	retHtml += '<div style="padding:9px 4px 0px 0px;font-size:11px;">'
		+ 'Delegates Needed to Win: '
		+ '<span style="font-size:14px; font-weight:bold;">'+addCommas(cnnSCObj.delegatesToWin)+'</span></div>';
	return retHtml;
}

function csiPopulateCalendar()
{
	var retHtml = '';

	var tYear = today.getFullYear();
	var tMonth = today.getMonth() + 1;
	tMonth = tMonth.toString();
	var tDayNum = today.getDate();
	var tDay = tDayNum.toString();

	if( tMonth.length == 1 ) { tMonth = '0'+tMonth; }
	if( tDay.length == 1 ) { tDay = '0'+tDay; }

	var calDate = tYear+tMonth+tDay;
	if( calDate <= '20080103' ) { calDate = '20080103'; }
	else
	{
		if( !cnnSCObj.electionDates[ calDate ] )
		{
			calDate = getPreviousElectionDate( calDate );
		}
	}
	cnnSCObj.contestDate = calDate;

	var dayOfMonth = calDate.substring(6);
	var month = calDate.substring(4,6);

	if( dayOfMonth.charAt(0) == '0' ) { dayOfMonth = dayOfMonth.charAt(1); }
	if( month.charAt(0) == '0' ) { month = month.charAt(1); }
	month = months[ month-1 ];

	retHtml += '<div id="elexDelCalander">'
		+ '<div class="cal_header"><table cellspacing="0" cellpadding="0" border="0" width="411">'
		+ '<colgroup><col width="124"/><col width="134"/><col width="87"/><col width="66"/>'
		+ '</colgroup><tr><td><div>Results through</div></td>'
		+ '<td><div>Race</div></td><td><div>Projected Winner<span style="font-size:13px;">*</span>'
		+ '</div></td><td class="end">'
		+ '<div>Pledged Delegates<span style="font-size:13px;">*</span></div></td></tr>'
		+ '</table></div>';
	retHtml += '<table cellspacing="0" cellpadding="0" border="0" width="411">'
		+ '<colgroup><col width="124"/><col width="288"/></colgroup><tr valign="top">'
		+ '<td><div class="cal_month_';

	if( cnnSCObj.partyLetter == 'D' ) { retHtml += 'dem'; }
	else { retHtml += 'rep'; }

	retHtml += '"><div><b>'+month+'</b></div></div>'
		+ '<div class="cal_day';

	if( calDate == '20080205' ) { retHtml += ' super'; }

	retHtml += '"><div>';
	if( cnnSCObj.electionDates[ calDate ] )
	{
		retHtml += '<a href="/ELECTION/2008/primaries/results/dates/#'+calDate+'">'+dayOfMonth+'</a>';
	}
	else { retHtml += dayOfMonth; }

	retHtml += '</div></div></td><td><div id="cal_primary_list">';


	retHtml += '<div style="height:150px;min-height:150px;">'
		+ '<table cellspacing="0" cellpadding="0" border="0" width="100%">'
		+ '<colgroup><col width="160"/><col width="87"/><col width="66"/></colgroup>';

	cnnSCObj.stateData.sort( function(a,b)
	{
		if( a.date < b.date ) { return -1; }
		else if( b.date < a.date ) { return 1; }
		else
		{
			if( a.name < b.name ) { return -1; }
			else if( a.name > b.name ) { return 1; }
			else { return 0; }
		}
	});

	for( var i = 0; i < cnnSCObj.stateData.length; i++ )
	{
		var state = cnnSCObj.stateData[i];
		if( state.date && state.date != '' && state.date <= calDate )
		{
			var leaderID;
			var leader = '&nbsp;';
			var delegates = '&nbsp;';
			var stateName = ( state.name == 'District of Columbia') ? 'D.C.' : state.name ;
			var contestType = ( state.type == 'caucus' ) ? state.type + 'es' : state.type;
			if( state.results.length )
			{
				for( var j=0; j<state.results.length; j++ )
				{
					if( state.results[j].winner == true )
					{
						leaderID = state.results[j].id;

						if( state.results[j].edelegates > 0 ) { delegates = addCommas( state.results[j].edelegates ); }
						leader = cnnSCObj.candidates[ leaderID ].last;
					}
				}
			}

			retHtml += '<tr valign="top"><td><div>'
				+ '<a href="'+state.link+'"><b>'+stateName+' '+contestType+'</b></a>'
				+ '</div></td><td style="padding-left:5px;"><div>'+leader+'</div></td>';
			retHtml += '<td class="list_del" align="center"><div>'+delegates+'</div></td></tr>';
		}
	}
	retHtml += '</table></div>';
	retHtml += '</div></td></tr></table></div>';
	return retHtml;
}

function sortBy(mode)
{
	cnnSCObj.stateData.sort( function(a,b) {
		if( a.name == 'Unallocated Delegates' ) { return 1; }
		else if( b.name == 'Unallocated Delegates' ) { return -1; }
		else if( mode == 'abc' )
		{
			if( b.name < a.name ) { return 1; }
			else if( a.name < b.name ) { return -1; }
			else { return 0; }
		}
		else
		{
			if( b.date > cnnSCObj.contestDate )
			{
				if( a.date > cnnSCObj.contestDate )
				{
					if( a.date > b.date ) { return -1; }
					else if( a.date < b.date ) { return 1; }
					else
					{
						if( b.name < a.name ) { return 1; }
						else if( a.name < b.name ) { return -1; }
						else { return 0; }
					}
				}
				else { return -1; }
			}
			else if( a.date > cnnSCObj.contestDate ) { return 1; }
			else if( a.date < b.date ) { return 1; }
			else if( a.date > b.date ) { return -1; }
			else
			{
				if( a.lts > b.lts ) { return -1; }
				else if( a.lts < b.lts ) { return 1; }
				else
				{
					if( b.name < a.name ) { return 1; }
					else if( a.name < b.name ) { return -1; }
					else { return 0; }
				}
			}
		}
	});
	$('del_tabcontent_state').innerHTML = csiPopulateStateTab( mode );
}

function getPreviousElectionDate( str )
{
	var prev = "20080103";
	for( var key in cnnSCObj.electionDates )
	{
		if( key <= str && key > prev )
		{
			prev = key;
		}
	}
	return prev;
}

/* Borrowed stuff */
function addCommas(nStr) {
	nStr += '';x = nStr.split('.');x1 = x[0];x2 = x.length > 1 ? '.' + x[1] : '';var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) { x1 = x1.replace(rgx, '$1' + ',' + '$2'); }
	return x1 + x2;
}

/* Now let's make stuff up  */
function eff_EleObjs(e) { if(typeof(e)=='string') { if(document.getElementById) { e=document.getElementById(e); } else if(document.all) { e=document.all[e]; } else { e=null; } } return e; }
function WTPO_writeToLayer(code_string,layer_id){ eff_EleObjs(layer_id).innerHTML=code_string; }

function load_DelTracker()
{
	var blue_bar_html_str = '';
	var designed_bar_length = 300;
	var overall_delegate_total = cnnSCObj.delegatesAtStake;
	var curr_delegate_total = cnnSCObj.totalDelegates;
	var slider_color;

	if( cnnSCObj.partyLetter == 'D' )
	{
		slider_color = 'blue';
		$('delegate_tracker').className = 'dem_tracker';
		$('unpledged_chart_area').className = 'unpledged_chart_dem';
	}
	else
	{
		slider_color = 'red';
		$('delegate_tracker').className = 'rep_tracker';
		$('unpledged_chart_area').className = 'unpledged_chart_rep';
	}


	/* Determine ratios ... woohoo! */
	var rough_blue_bar_length = designed_bar_length * ( curr_delegate_total / overall_delegate_total );

	/* Be simple */
	var rounded_bbl = rough_blue_bar_length.toFixed(0);

	/* at least show something if there's one delegate */
	if((curr_delegate_total > 0) && (rounded_bbl <= 0)) { rounded_bbl = 1; }

	/* Colorful HTML for the masses */
	if(curr_delegate_total > 0) { blue_bar_html_str = '<div style="width:' + rounded_bbl + 'px;height:3px;background:transparent url(\''+imgHost+imgPath+'scorecard/'+slider_color+'_line.gif\') top left repeat-x;overflow:hidden;"></div>'; }

	var star_left_pos = 12 + rounded_bbl/ 1;

	var curr_del_html_str = '<div id="curr_del_holder" style="position:absolute;top:36px;left:18px;">'
		+ addCommas(curr_delegate_total) + '</div>';
	var star_html_str = '<div style="position:absolute;top:56px;left:'
		+ star_left_pos + 'px;"><img src="'+imgHost+imgPath+'scorecard/'+slider_color+'_slider.gif" width="12" height="13" alt="" border="0"></div>';

	var magicNumStr = '<div style="position:absolute; bottom:10px; right:10px;text-align:right;" class="';
	magicNumStr += ( cnnSCObj.partyLetter == 'D' ) ? 'dem' : 'rep';
	magicNumStr += '">' + addCommas(overall_delegate_total) + '</div>';

	WTPO_writeToLayer( magicNumStr, 'hey_give_me_magic_number');
	WTPO_writeToLayer(curr_del_html_str, 'hey_give_me_curr_del_data');
	WTPO_writeToLayer(blue_bar_html_str, 'hey_give_me_bar_data');
	WTPO_writeToLayer(star_html_str, 'hey_give_me_star_data');

	curr_del_width = eff_EleObjs('curr_del_holder').offsetWidth;
	eff_EleObjs('curr_del_holder').style.left = 18 + rounded_bbl / 1 - (curr_del_width / 2) + 'px';

}


var selected_dtab = 'state';
//var selected_dtab = 'overview';

function showDTab(tab_id) {

	eff_EleObjs('del_tabcontent_' + selected_dtab).style.display = 'none';
	eff_EleObjs('del_tab_' + selected_dtab).className = eff_EleObjs('del_tab_' + selected_dtab).className.replace(' active','');

	eff_EleObjs('del_tabcontent_' + tab_id).style.display = 'block';
	eff_EleObjs('del_tab_' + tab_id).className += ' active';
	selected_dtab = tab_id;
}


var MAX_HEIGHT = 216;
var MAX_CANDIDATES = 8;

var un_chart_col_def = '';
var un_chart_bar_def = '';
var un_chart_title_def = '';

function loadUnpledgedDelegates()
{
	if( cnnSCObj.partyLetter == 'D' )
	{
		$('superdel_title').innerHTML = 'Superdelegates';
		$('superdel_legend').innerHTML = '<b>Superdelegates</b>&nbsp;';
		$('unpledged_chart_total').className = 'unpledged_total_dem';
		$('cnnUnpledgedLegendContainer').innerHTML = '<img src="'+imgHost+imgPath+'scorecard/unpledged/unpledged.gif" width="9" height="9" alt="" border="0" class="cnnPledgedLegend">';
		$('cnnPledgedLegendContainer').innerHTML = '<img src="'+imgHost+imgPath+'scorecard/unpledged/pledged.gif" width="9" height="9" alt="" border="0" class="cnnPledgedLegend">';
	}
	else
	{
		$('superdel_title').innerHTML = 'Unpledged RNC*';
		$('superdel_legend').innerHTML = '<b>Unpledged RNC<span style="font-size:14px;">*</span></b>&nbsp;';
		$('unpledged_chart_total').className = 'unpledged_total_rep';
		$('cnnUnpledgedLegendContainer').innerHTML = '<img src="'+imgHost+imgPath+'scorecard/unpledged/unpledged_rep.gif" width="9" height="9" alt="" border="0" class="cnnPledgedLegend">';
		$('cnnPledgedLegendContainer').innerHTML = '<img src="'+imgHost+imgPath+'scorecard/unpledged/pledged_rep.gif" width="9" height="9" alt="" border="0" class="cnnPledgedLegend">';
	}
	$('unpledged_chart_total').innerHTML = '<div>'+addCommas(cnnSCObj.delegatesToWin)+'</div>';

	var results = cnnSCObj.nationData;
	results.sort( sortByDelegates );

	var unp_full_html_table_data = '';
	var unp_col_html_data = '';
	var unp_bar_graph_data = '';
	var unp_bot_cand_text_data = '';

	for(var i=0; i < results.length && i<MAX_CANDIDATES; i++)
	{
		var cand = results[i];
		var lastName = cnnSCObj.candidates[ cand.id ].last;
		if( linkableCandidate(cand) )
		{

			unp_col_html_data += '<col width="74"><col width="13">';
			unp_bar_graph_data += '<td>';
			unp_bar_graph_data += '<div class="pledge_text"><span>';
			unp_bar_graph_data += ( cand.udelegates ) ? cand.udelegates : '0';
			unp_bar_graph_data += '</span> (';
			unp_bar_graph_data += ( cand.tdelegates ) ? get_unpledgedPerc(cand.tdelegates, cand.udelegates) : '0';
			unp_bar_graph_data += '%)</div>';

			if(cand.udelegates)
			{
				unp_bar_graph_data += '<div class="unpledged_bar';
				if( cnnSCObj.partyLetter == 'R' ) { unp_bar_graph_data += '_rep'; }
				unp_bar_graph_data += '" style="height:' + get_pledgedBarHeight(cand.udelegates) + 'px;"></div>';
			}
			if(cand.edelegates)
			{
				unp_bar_graph_data += '<div class="pledged_bar';
				if( cnnSCObj.partyLetter == 'R' ) { unp_bar_graph_data += '_rep'; }
				unp_bar_graph_data += '" style="height:' + get_pledgedBarHeight(cand.edelegates)+ 'px;"></div>';
			}
			unp_bar_graph_data += '</td><td></td>';
			unp_bot_cand_text_data += '<td><div><a href="'+candidatePath+'#'+cand.id+'">' + lastName+ '</a><br><b><em>';
			unp_bot_cand_text_data += ( cand.edelegates ) ? addCommas(cand.edelegates) : '0';
			unp_bot_cand_text_data += '</em></b></div></td><td></td>';
		}
	}

	unp_full_html_table_data = '<table cellspacing="0" cellpadding="0" border="0">';
	unp_full_html_table_data += '<colgroup>';
	unp_full_html_table_data += unp_col_html_data;
	unp_full_html_table_data += '</colgroup>';
	unp_full_html_table_data += '<tr valign="bottom" height="238">';
	unp_full_html_table_data += unp_bar_graph_data;
	unp_full_html_table_data += '</tr>';
	unp_full_html_table_data += '<tr valign="top" class="pledge_cand">';
	unp_full_html_table_data += unp_bot_cand_text_data;
	unp_full_html_table_data += '</tr>';
	unp_full_html_table_data += '</table>';

	WTPO_writeToLayer(unp_full_html_table_data, 'unpledged_chart_table');
}

function sortByDelegates(a, b)
{
	if( a.tdelegates < b.tdelegates ) { return 1; }
	else if( b.tdelegates < a.tdelegates ) { return -1; }
	else
	{
		var candA = cnnSCObj.candidates[ a.id ];
		var candB = cnnSCObj.candidates[ b.id ];
		if( candA.last > candB.last ) { return 1; }
		else if( candA.last < candB.last ) { return -1; }
		else { return 0; }
	}
}

function get_BarHeightRatio(numDelegates)
{
	var temp_height = MAX_HEIGHT * ( numDelegates / cnnSCObj.delegatesToWin );
	temp_height = temp_height.toFixed(0);

	if((temp_height < 1) && (numDelegates > 0)) { temp_height = 1; }

	return temp_height;
}

function get_pledgedBarHeight(numPledged)
{
	return get_BarHeightRatio(numPledged);
}

function get_unpledgedBarHeight(numUnpledged) { return get_BarHeightRatio(numUnpledged); }

function get_unpledgedPerc(numPledged, numUnpledged) {
	if(numPledged > 0) { var temp_perc = (numUnpledged / numPledged) * 100; }
	else { var temp_perc = 0; }
	return temp_perc.toFixed(0);
}
