var tilpcJSON = '/ELECTION/2008/primary/json/homepage/homepage_superT.html';
var liveJsonPath = '/ELECTION/2008/primary/json/homepage/homepage_superT.html';

var currentDemPage = 1;
var currentRepPage = 1;
var currentDemMax = 5;
var currentRepMax = 5;

var liveResultsDemObj;
var liveResultsRepObj;
var initialLiveLoad = true;

var usePagination = false;
var maxRowsPerPage = 5;
var totalDemRaces = 0;
var totalRepRaces = 0;

function loadDelegateResults(){
 CSIManager.getInstance().call(tilpcJSON,'',['cnnPrimaryResults'], [loadDelegateResultsHandler], true);

	
}

function loadDelegateResultsHandler(obj){try{
	return getDelegateResultsTable(obj);
}catch(e){return '<div style="display:none">'+ 'Error name: "' + e.name + '" Message: '+ e.message + ' [ ' + e.number + ' ]</div>';}}




function getDelegateResultsTable(obj) {
var returnHTML = '';
var parties = obj['parties'];
var nomFlipped = false;


if(typeof($(parties[0]))!= 'undefined' ){

		returnHTML += '<div class="cnnSubHead">The Race for Delegates</div>';
		
		for (var j=0;j<parties.length;j++) {
		var partyObj = parties[j];
		var partyName = ( partyObj.party == 'D' || partyObj.party.toUpperCase() == 'DEM' ) ? 'Democrats' : 'Republicans';
		var partyNameHeader = ( partyObj.party == 'D' || partyObj.party.toUpperCase() == 'DEM' ) ? 'Democrats' : 'Republicans';
		var partyinitial = ( partyObj.party == 'D' || partyObj.party.toUpperCase() == 'DEM' ) ? 'D' : 'R';
		var partyURL = '/ELECTION/2008/primaries/results/scorecard/#'+ partyinitial;
		var deltowin = partyObj.ctdelegatestowin;
		var candidatelname = partyObj.lname;
		
		if (partyinitial == 'D'){
		var delHeader = 'Superdels.' ;
		}else if (partyinitial == 'R'){
		var delHeader = 'Unpl. RNC' ;
		}
		
		returnHTML += '<div class="cnnElexPrimary"><a href="'+partyURL+'">'+partyName+'</a> <span>Needed to Win = '+deltowin+'</span></div>';
		returnHTML += '<div class="cnnElexRBox"><div class="cnnElexRHeadRow"><div class="cnnElexResL">Candidate</div><div class="cnnElexResC">Pledged</div><div class="cnnElexResCl">'+delHeader+'</div><div class="cnnElexResR">Total</div></div>';
		for (var k=0;k<partyObj.candidates.length;k++) {
		var candidateObj = partyObj.candidates[k];
		var candidatelname = candidateObj.lname ;
		var candidateid = candidateObj.id ;
		var candidateURL = '/ELECTION/2008/primaries/results/candidates/#'+ candidateid;
		var pledgedDelegates = candidateObj.edelegates_all ;
		var unpledgedDelegates = candidateObj.udelegates_all ; 
		var totalDelegates = candidateObj.tdelegates_all ;
		var icon = (candidateObj.nominee) ? '<img src="http://i.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/icon_nominee.gif" width="10" height="10" style="vertical-align:-1px;" border="0" alt="Projected Nominee">' : '';
		
		if (candidateObj.nominee) {
			nomFlipped = true;
		}
		
        returnHTML += '<div class="cnnElexRRow">';
		returnHTML += '<div class="cnnElexResL"><a href="'+candidateURL+'">'+candidatelname+'</a> '+icon+'</div>';
		returnHTML += '<div class="cnnElexResC">'+pledgedDelegates+'</div>';
		returnHTML += '<div class="cnnElexResCl">'+unpledgedDelegates+'</div>';
		returnHTML += '<div class="cnnElexResR">'+totalDelegates+'</div>';
		returnHTML += '</div>';
		}
		returnHTML += '</div>';	
		}
        var key = (nomFlipped) ? '<img src="http://i.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/key_presum.nominee.gif" id="cnnNom" width="103" height="10" border="0" alt="Projected Nominee" style="position: absolute; left: 20px; top: 5px;">' : '';

		returnHTML += '<div class="cnnElexRFoot"><a href="javascript:cnnShowElexDelMat();">Delegate Definitions</a> '+key+'<div class="clear"></div></div></div>';
		
		
		returnHTML += delegateDefinitions;
		}

return returnHTML;
}

function cnnShowElexDelMat() {
	$('cnnElexDelMat').style.display = "block";
}

function cnnHideElexDelMat() {
	$('cnnElexDelMat').style.display = "none";
}

function initializeLiveResults(){
	CSIManager.getInstance().call(liveJsonPath,'',['makeCSIhappy'], [initializeLiveResultsHandler], true);
}

function initializeLiveResultsHandler(obj){
	liveResultsDemObj = (obj.parties[0].party.toUpperCase() == "DEM") ? obj.parties[0].racepages : obj.parties[1].racepages;
	liveResultsRepObj = (obj.parties[0].party.toUpperCase() == "REP") ? obj.parties[0].racepages : obj.parties[1].racepages;

	//number of pages	
	currentDemMax = liveResultsDemObj.length;
	currentRepMax = liveResultsRepObj.length;
	
	for( var i=0; i<liveResultsDemObj.length; i++ )
	{
		totalDemRaces += liveResultsDemObj[i].races.length;
	}
	for( var j=0; i<liveResultsRepObj.length; j++ )
	{
		totalRepRaces += liveResultsRepObj[j].races.length;
	}

	if( totalRepRaces > maxRowsPerPage || totalDemRaces > maxRowsPerPage ) { usePagination = true;}
	else { maxRowsPerPage = ( totalRepRaces < totalDemRaces ) ? totalDemRaces : totalRepRaces; }
	
	//set the skeleton html
	$('demLiveModule').innerHTML = getLivePartyHtml("DEM");
	$('repLiveModule').innerHTML = getLivePartyHtml("REP");

	//sets the timestamp
        setTimestamp(obj.lts);

	//fill in data
	setThisPartyPage("DEM",1);
	setThisPartyPage("REP",1);
	
	initialLiveLoad = false;
	return '';
}

//sets the skeleton for a party's live table
function getLivePartyHtml(party, races){
	
	var resultsHTML = '<div class="cnnElexRHeadRow"><div class="cnnElexResL">Reporting</div><div class="cnnElexResC">1st Place</div><div class="cnnElexResR">2nd Place</div></div>';
	var numPerPage = (usePagination) ? 5 : maxRowsPerPage;
	for(var i=0; i<numPerPage; i++){
		resultsHTML += '<div class="cnnElexRRow" id="liveResultsRow'+party+i+'"></div>';
	}

	
	return resultsHTML;
}

var currentDirection = "";

//gets previous page for a party
function liveModulePrevPage(party){
	currentDirection = "left";
	if(party == "DEM" && currentDemPage > 1){
		currentDemPage--;
		setThisPartyPage("DEM",currentDemPage);
	}else if(party == "REP" && currentRepPage > 1){
		currentRepPage--;
		setThisPartyPage("REP",currentRepPage);
	}
}

//gets next page for a party
function liveModuleNextPage(party){
	currentDirection = "right";
        if(party == "DEM" && currentDemPage < currentDemMax){
                currentDemPage++;
                setThisPartyPage("DEM",currentDemPage);
        }else if(party == "REP" && currentRepPage < currentRepMax){
                currentRepPage++;
                setThisPartyPage("REP",currentRepPage);
        }
}

//update this party's arrow widget - handles logic for rollover effects + src swapping
function updateArrowWidget(party){
        var arrowGraphicPath = "http://i.cdn.turner.com/cnn/.element/img/2.0/content/in_the_news/";
        var thisMax = (party == "DEM") ? currentDemMax : currentRepMax;
        var thisPage = (party == "DEM") ? currentDemPage : currentRepPage;
        if(thisMax == 0) thisPage = 0;
        if( !usePagination )
        {
        	$('cnnDEMNav').innerHTML = '';
        	$('cnnREPNav').innerHTML = '';
        	return;
        }
	$(party.toLowerCase()+"LeftArrow").src = (thisPage < 2) ? arrowGraphicPath + "left_gray_btn.gif" : arrowGraphicPath + "left_red_btn.gif";
        $(party.toLowerCase()+"RightArrow").src = (thisPage == thisMax) ? arrowGraphicPath + "right_gray_btn.gif" : arrowGraphicPath + "right_red_btn.gif";
        if($(party.toLowerCase()+"LeftArrow").src.indexOf("gray")>-1){
		$(party.toLowerCase()+"LeftArrow").style.cursor = "default";
	}else{
		$(party.toLowerCase()+"LeftArrow").style.cursor = "pointer";
		if(currentDirection == "left") $(party.toLowerCase()+"LeftArrow").src = arrowGraphicPath + "left_red_over_btn.gif";
	}
	if($(party.toLowerCase()+"RightArrow").src.indexOf("gray")>-1){
		$(party.toLowerCase()+"RightArrow").style.cursor = "default";
        }else{
		$(party.toLowerCase()+"RightArrow").style.cursor = "pointer";
		if(currentDirection == "right") $(party.toLowerCase()+"RightArrow").src = arrowGraphicPath + "right_red_over_btn.gif";
        }
	$('livePageNum'+party).innerHTML = thisPage+" of "+thisMax;
}

//sets information for a party in module for a particular pageNum 
function setThisPartyPage(party,pageNum){
	updateArrowWidget(party);
	var thisObj = (party == "DEM") ? liveResultsDemObj : liveResultsRepObj;
	
	var thisPage;
	if( thisObj[pageNum-1] ) { thisPage = thisObj[pageNum-1].races; }
	else { return; }

	var currentI = 0;
	var thisMax = (party == "DEM") ? currentDemMax : currentRepMax;
	for(var i=0; i<thisPage.length; i++){
		var thisHTML = '';
		if( thisPage[i].hardcoded )
		{
			thisHTML = thisPage[i].hardcodedtext;

		}
		else
		{
			var stateRaceTypeAppended = '';
			if(thisPage[i].code == 'TX' && thisPage[i].primarytype.toUpperCase() == "PRIMARY") {
				stateRaceTypeAppended = ' (P)';
			} else if (thisPage[i].code == 'TX' && thisPage[i].primarytype.toUpperCase() == "CAUCUS"){
				stateRaceTypeAppended = ' (C)';
			} 
			var statePrentation = thisPage[i].code + stateRaceTypeAppended;
			thisHTML = '<div class="cnnElexResL"><a href="/ELECTION/2008/primaries/results/state/#'+thisPage[i].code+'">'+statePrentation+'</a> '+thisPage[i].pctsrep+'%</div>';
			if(thisPage[i].results || (thisPage[i].candidates.length>0)){
				var checkMark = '';
	            if(thisPage[i].candidates[0].winner == true){
					checkMark += '<img src="http://i.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/common/check.gif" border="0">';
				}
				thisHTML += '<div class="cnnElexResW">'+checkMark+'</div>';
				var pct0 = (getObjValue(thisPage[i].candidates[0],"lname")!='') ? thisPage[i].candidates[0].vpct+"%" : '';
				var pct1 = (getObjValue(thisPage[i].candidates[1],"lname")!='') ? thisPage[i].candidates[1].vpct+"%" : '';
		
				if(linkableCandidate(thisPage[i].candidates[0])){
					thisHTML += '<div class="cnnElexResC"><a href="/ELECTION/2008/primaries/results/candidates/#'+getObjValue(thisPage[i].candidates[0],"id")+'">'+getObjValue(thisPage[i].candidates[0],"lname")+'</a> '+pct0+'</div>';
				}else{
					thisHTML += '<div class="cnnElexResC">'+getObjValue(thisPage[i].candidates[0],"lname")+' '+pct0+'</div>';
				}
	
				thisHTML += '<div class="cnnElexResR"><a href="/ELECTION/2008/primaries/results/candidates/#'+getObjValue(thisPage[i].candidates[1],"id")+'">'+getObjValue(thisPage[i].candidates[1],"lname")+'</a> '+pct1+'</div>';
			}else{
				var thisPollClose = getEasternDate(thisPage[i].originalpollclose);
				//var thisPollClose = new Date(thisPage[i].originalpollclose);
				var thisHours = thisPollClose.getHours();
				var thisMinutes = thisPollClose.getMinutes();
				thisHours = (thisHours == 0) ? 12 : thisHours;
				thisMinutes = (thisMinutes<10) ? "0"+thisMinutes : thisMinutes+"";
				var amOrPm = (thisHours < 12) ? "A.M." : "P.M.";
				var closeTime = (thisHours > 12) ? (thisHours-12)+":"+thisMinutes+" "+amOrPm : thisHours+":"+thisMinutes+" "+amOrPm;
				closeTime = (thisPage[i].code == "MD") ? "9:30 P.M." : closeTime;
				thisHTML += '<div class="cnnElexResC">LAST POLLS CLOSE '+closeTime+' ET</div>';
			}	
		}

		$('liveResultsRow'+party+i).innerHTML = thisHTML;
		currentI = i+1;
	}
	//Why are we putting empty divs for the rest of the pages?
	for(var i = currentI; i<thisMax; i++){
		var thisHTML     = '<div class="cnnElexResL"></div>';
		thisHTML        += '<div class="cnnElexResW"></div>';
                thisHTML        += '<div class="cnnElexResC"></div>';
                thisHTML        += '<div class="cnnElexResR"></div>';
		$('liveResultsRow'+party+i).innerHTML = thisHTML;
	}
}

function setTimestamp(ts){try{
	var resultsHTML = getElectionTimestamp(ts,false);
	if(resultsHTML.indexOf('ago')==-1){
		$('liveResultsTimestamp').className = "cnnESLROld";
	}else{
		$('liveResultsTimestamp').className = "cnnESLRUpd";
	}
	$('liveResultsTimestamp').innerHTML = resultsHTML;}catch(e){}
}

//ensures the property is defined in the object - prevents errors/seeing 'undefined'
function getObjValue(obj,property){try{
        return (obj[property] != undefined || obj[property]==0) ? obj[property] : '';
        }catch(e){return '';}
}

