var jsonPath = '/ELECTION/2008/primary/json/';
var firstLoad = true;
var cnnCalDefaults = {
	"DEM": { "text":"KY | OR", "date": "20080520" },
	"REP": { "text":"KY | OR", "date": "20080520" }
};

//upon load, call this function, but only once (shouldn't happen, but is safer)
function initElectionMain(){
	if(firstLoad){
		CSIManager.getInstance().call(jsonPath+'top_candidates.html','',['resultsBox'], [populateHero], true);
		CSIManager.getInstance().call(jsonPath+'ecmain.html','',['hiddenDiv'], [calendarHandler], true);
	}
}

//main population of hero widget
function populateHero(obj){try{
	setTimestampArea(obj.lts);
	var resultHTML = '<div id="cnnElexPHT_box">';
	var demObj = (obj.parties[0].party.toUpperCase() == "DEM") ? obj.parties[0] : obj.parties[1];
        var repObj = (obj.parties[1].party.toUpperCase() == "REP") ? obj.parties[1] : obj.parties[0];
	resultHTML += getHeroHeader();	
	resultHTML += getCandidateBars(demObj, repObj);
	resultHTML += getCandidateData(demObj, repObj);
	resultHTML += getHeroFooter(demObj,repObj);
	resultHTML += "</div>";
	return resultHTML;}catch(e){alert(e);}
}

function calendarHandler(obj){
	setCalendarArea(obj.ecmain);
	return '';
}

function getHeroHeader(){
	return '<div class="cnnElexWHTSBox" style="width:391px;"><div class="cnnBoxHeader"><div></div></div><div class="cnnBoxContent"><div style="float:right;padding:5px 10px 0px 0px;"><a href="javascript:cnnShowElexDelMat();">Delegate Definitions</a></div><div class="cnnElexPHT_title">TOTAL DELEGATES</div><div class="cnnElexGreyL"></div><table cellspacing="0" cellpadding="0" border="0" width="389" class="cnnElexPHT_table"><colgroup><col width="6"><col width="90"><col width="3"><col width="90"><col width="5"><col width="1"><col width="6"><col width="90"><col width="3"><col width="90"><col width="5"></colgroup><tr valign="top" class="header"><td bgcolor="#EBF4F9" colspan="5"><div><a href="/ELECTION/2008/primaries/results/scorecard/#D">Democrats &raquo;</a></div></td><td bgcolor="#DADADA"></td><td bgcolor="#F6E8E8" colspan="5"><div><a href="/ELECTION/2008/primaries/results/scorecard/#R">Republicans &raquo;</a></div></td></tr><tr valign="top"><td colspan="5"><div class="cnnElexGreyL"></div></td><td bgcolor="#DADADA"></td><td colspan="5"><div class="cnnElexGreyL"></div></td></tr><tr valign="top"><td colspan="5">&nbsp;</td><td bgcolor="#DADADA"></td><td colspan="5"></td></tr>';
}

function getCandidateBars(demObj, repObj){
	var resultHTML = "<tr validn='bottom'>";
	resultHTML += getCandidateBar(demObj,0)+getCandidateBar(demObj,1);
	resultHTML += "<td></td><td bgcolor='#DADADA'></td>";
	resultHTML += getCandidateBar(repObj,0)+getCandidateBar(repObj,1);
	resultHTML += "<td></td></tr>";
	return resultHTML;
}

function getCandidateBar(partyObj,index){
	var candObj = partyObj.candidates[index];
	var party = partyObj.party.toUpperCase();
	var headGraphic = "http://i2.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/candidates/big/"+candObj.lname.toLowerCase()+"_big.jpg";
	var totalDels = (party == "DEM") ? 4049 : 2380;
	//var totalDels = partyObj.candidates[0].tdelegates_all + partyObj.candidates[1].tdelegates_all;

	var superDelHeight = (Math.ceil((candObj.udelegates_all/totalDels)*100))+"px";
	var pledgedDelHeight = (Math.ceil((candObj.edelegates_all/totalDels)*100))+"px";
	var resultHTML = '<td></td><td valign="bottom"><div><a href="/ELECTION/2008/primaries/results/candidates/#'+candObj.id+'"><img src="'+headGraphic+'" border="0"/></a></div><div class="'+party.toLowerCase()+'_del_bar" style="height:'+pledgedDelHeight+';"></div><div class="'+party.toLowerCase()+'_supdel_bar" style="height:'+superDelHeight+';"></div></td>';
	return resultHTML;
}

function getCandidateData(demObj, repObj){
	var resultHTML = '<tr class="cand_data" height="25">';
	resultHTML += buildCandidateTData(demObj.candidates[0]);
	resultHTML += buildCandidateTData(demObj.candidates[1]);
	resultHTML += '<td></td><td bgcolor="#DADADA"></td>';
	resultHTML += buildCandidateTData(repObj.candidates[0]);
	resultHTML += buildCandidateTData(repObj.candidates[1]);
	resultHTML += "<td></td></tr>";
	resultHTML += '<tr class="del_values" bgcolor="#F2F2F2" height="20">';
	resultHTML += buildCandidateSmallDataRow("Pledged:",demObj.candidates[0].edelegates_all);
	resultHTML += buildCandidateSmallDataRow("Pledged:",demObj.candidates[1].edelegates_all);
	resultHTML += "<td></td><td bgcolor='#DADADA'></td>";
	resultHTML += buildCandidateSmallDataRow("Pledged:",repObj.candidates[0].edelegates_all);
        resultHTML += buildCandidateSmallDataRow("Pledged:",repObj.candidates[1].edelegates_all);
	resultHTML += "<td></td></tr><tr class='del_values' bgcolor='#F2F2F2' height='20'>";
        resultHTML += buildCandidateSmallDataRow("Superdels:",demObj.candidates[0].udelegates_all);
        resultHTML += buildCandidateSmallDataRow("Superdels:",demObj.candidates[1].udelegates_all);
        resultHTML += "<td></td><td bgcolor='#DADADA'></td>";
        resultHTML += buildCandidateSmallDataRow("Unpl. RNC:",repObj.candidates[0].udelegates_all);
        resultHTML += buildCandidateSmallDataRow("Unpl. RNC:",repObj.candidates[1].udelegates_all);
	resultHTML += "<td></td></tr>";
	return resultHTML;
}

function buildCandidateTData(candidate){
	var resultHTML = "<td></td><td><div class='del_total'><b>"+commify(candidate.tdelegates_all)+"</b></div>";
	resultHTML += "<a href='/ELECTION/2008/primaries/results/candidates/#"+candidate.id+"'><b>"+candidate.lname+"</b></a></td>";
	return resultHTML;
}

function buildCandidateSmallDataRow(title,number){
	number = commify(number);
	var resultHTML = "<td></td><td><div class='pdel_total'><b>"+number+"</b></div>"+title+"</td>";
	return resultHTML;
}

function buildCandidateSData(candidate, party){
	var voteTitle = (party == "DEM") ? "Superdels:" : "Unpl. RNC:";

}

function getHeroFooter(demObj,repObj){
	var resultHTML = '<tr valign="top"><td colspan="5"><div class="cnnElexGreyL"></div></td><td bgcolor="#DADADA"></td><td colspan="5"><div class="cnnElexGreyL"></div></td></tr><tr valign="top"><td colspan="5" align="center"><div style="padding:6px 0px 4px 0px;font-size:11px;">Needed to Win: <b>'+demObj.ctdelegatestowin+'</b></div></td><td bgcolor="#DADADA"></td><td colspan="5" align="center"><div style="padding:6px 0px 4px 0px;font-size:11px;">Needed to Win: <b>'+repObj.ctdelegatestowin+'</b></div></td></tr></table></div></div><div><img src="http://i.cdn.turner.com/cnn/.element/img/2.0/sect/election/main_page/bottom_corners.gif" width="397" height="11" alt="" border="0"></div>';
	return resultHTML;
}


function setTimestampArea(lts){
	var timeStampText = (lts == 0) ? '' : getElectionTimestamp(lts,false);
        if(timeStampText.indexOf('ago') > -1){
                $('primaryTimeStamp').className='cnnHtTimestamp';
        }
        $('primaryTimeStamp').innerHTML = timeStampText;
}

/*************** CALENDAR & COUNTDOWN FUNCTIONS **************************/

//calendar main function - builds calendar, fills in 'next election' stuff
function setCalendarArea(obj){
        initCalendar("012008","022008");
	setDaysLeft(obj);
}

//sets src of countdown graphics
function setDaysLeft(obj){
	var digitImgPath = "http://i2.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/numbers/";
	for(var i=0; i<obj.length; i++){
		var thisParty = obj[i].party.toUpperCase();
		var daysLeft = getDaysLeft(obj[i].currentContestDate);
		var electionArray = obj[i].currentContests;
		var electionDate = obj[i].currentContestDate;
		if(daysLeft < 0){
			daysLeft = getDaysLeft(obj[i].nextContestDate);
			electionDate = obj[i].nextContestDate;
			electionArray = obj[i].nextContests;
		}
		var digit1 = ( Math.floor(daysLeft/10) > 0 ) ? Math.floor(daysLeft/10) : 0;
		var digit2 = ( daysLeft % 10 > 0 ) ? daysLeft % 10 : 0;
		var thisColor = (thisParty == "DEM") ? "blue_" : "red_";
	
		$(thisParty.toLowerCase()+'Digit1').src = digitImgPath+thisColor+digit1+".gif";
		$(thisParty.toLowerCase()+'Digit2').src = digitImgPath+thisColor+digit2+".gif";
		//$(thisParty.toLowerCase()+'Digit1').src = digitImgPath+thisColor+"0"+".gif";
		//$("demDigit2").src = digitImgPath+"blue_"+"6"+".gif";
		//$("repDigit2").src = digitImgPath+"red_"+"3"+".gif";
	
		var nextLinkId = "next"+thisParty.substring(0,1).toUpperCase()+thisParty.substring(1,3).toLowerCase()+"PrimaryLink";
		setNextElectionLink(electionArray,nextLinkId,daysLeft,electionDate);
	}
}

//depending on # of upcoming races, the url should point to either the state election, or the date election
function setNextElectionLink(obj,id,daysLeft,nextDate){
	var dayString = (daysLeft == 1) ? "Day" : "Days";

	//To be executed at 6/4/2008 12:01 a.m. after PR contest
	var theDate=new Date();
	theDate.setFullYear(2008,5,4);
	theDate.setHours(0);
	theDate.setMinutes(0);
	theDate.setSeconds(0);

	var todaysDate = new Date();
	if( todaysDate > theDate )
	{
		$('cnnDivToHide1').innerHTML = '';
		$('cnnHideRow2').innerHTML = '';
		$('cnnHideRow3').innerHTML = '';
		$('cnnHideGreyL').innerHTML = '';
	}
	else if(nextDate == "20080205" || dateToYYYYMMDD(getToday())=="20080205"){
		//super tuesday
		$(id).innerHTML = "<b>"+dayString+"</b> until: Super Tuesday";
	}
	//more than one contest
	else if(obj.length > 1){
		var text = "";
		for(var i=0; i<obj.length; i++){
			text += obj[i].code;
			text += (i == obj.length-1) ? "" : " | ";
		}
		$(id).innerHTML = "<b>"+dayString+"</b> until: "+text;
	}
	//only one contest
	else if(obj.length == 1){
		var text = obj[0].code+" "+obj[0].primarytype;
		$(id).innerHTML = "<b>"+dayString+"</b> until: "+text.replace(/caucus/,"caucuses");
	}
	else
	{
		var party = ( id.indexOf('Rep') > -1 ) ? "REP" : "DEM";
		var color = ( id.indexOf('Rep') > -1 ) ? "red" : "blue";

		if( cnnCalDefaults[party] )
		{
			var def = cnnCalDefaults[party];
			var days = getDaysLeft(def.date);
			if( days >= 10 ) {
				$(party.toLowerCase()+'Digit1').src = "http://i2.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/numbers/"+color+"_"+days.toString().charAt(0)+".gif";
				$(party.toLowerCase()+'Digit2').src = "http://i2.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/numbers/"+color+"_"+days.toString().charAt(1)+".gif";
			}
			else if( days < 0)
			{
				$(party.toLowerCase()+'Digit1').src = "http://i2.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/numbers/"+color+"_0.gif";
				$(party.toLowerCase()+'Digit2').src = "http://i2.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/numbers/"+color+"_0.gif";
			}
			else
			{
				$(party.toLowerCase()+'Digit1').src = "http://i2.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/numbers/"+color+"_0.gif";
				$(party.toLowerCase()+'Digit2').src = "http://i2.cdn.turner.com/cnn/.element/img/2.0/sect/election/primaries/results/main_page/numbers/"+color+"_"+days.toString().charAt(0)+".gif";
			}
			dayString = ( days == 1 ) ? "Day" : "Days";
			$(id).innerHTML = "<b>"+dayString+"</b> until: "+def.text;
		}
	}

}

//basic 'array contains' function, where 'yes' = true
function contains(array,val){
	for(var i=0; i<array.length; i++){
		if(array[i] == val){
			return true;
		}
	}
	return false;
}

//figures out the difference in days between now and a yyyymmdd value on an election object
function getDaysLeft(electiondate){
	var today = new Date(cnnCurrTime);
	var thisElectionDate = YYYYMMDDtoDate(electiondate);
	return Math.floor((thisElectionDate-today)/(1000*60*60*24));
}

//sorter for candidates - decending order
function sortByPercent(obj1,obj2){
	var cand1 = obj1.ttdelegatespercent;
	var cand2 = obj2.ttdelegatespercent;
	return (cand1 < cand2) ? 1 : (cand1 > cand2) ? -1 : sortByEDelegates(obj1,obj2);
}

//sorter for candidates - by edelegates
function sortByEDelegates(obj1,obj2){
        var cand1 = obj1.tdelegates_all;
        var cand2 = obj2.tdelegates_all;
        return (cand1 < cand2) ? 1 : (cand1 > cand2) ? -1 : sortAlphabetically(obj1,obj2);
}

//sort this way - if there's a tie
function sortAlphabetically(obj1, obj2){
	var cand1 = obj1.lname;
        var cand2 = obj2.lname;
        return (cand1 > cand2) ? 1 : (cand1 < cand2) ? -1 : 0;
}

Event.observe(window, 'load', initElectionMain);
