
var global_columnLength = 0;

function getPlayerUrl(playerId) {
    while (playerId.length < 6) {
        playerId = '0' + playerId;
	}
	
	return playerId.substring(0, 2) + '/' + playerId.substring(2, 4) + '/' + playerId.substring(4, 6);
}


function itemLocationInArray(myarray, item){
	for( var a = 0; a < myarray.length; a++ ) {
		if( myarray[a] == item ) {
			return a;
		}
		else if( myarray[a] instanceof Array ) {
			return itemLocationInArray(myarray[a], item );
		}
	}
	return -1;
}



// headers & columns: order and labels

var lbOrder=["money_rank","current_pos","start_pos","country","first_name","today","thru","to_par","r1","r2","r3","r4","r5","r6","total"];

//var pbpOffTournaments=["h084","h077","h078"];
var pbpOffTournaments=[];

var lbH=[];
lbH["money_rank"]="$";

if(isFedexCup == 'Yes'){
	lbH["money_rank"]="FC";
}

lbH["current_pos"]="Pos";
lbH["start_pos"]="Start";
lbH["country"]="Ctry";
lbH["first_name"]="First Name";
lbH["last_name"]="Last Name";
lbH["today"]="Today";
lbH["thru"]="Thru";
lbH["to_par"]="To Par";
lbH["r1"]="R1";
lbH["r2"]="R2";
lbH["r3"]="R3";
lbH["r4"]="R4";
lbH["r5"]="R5";
lbH["r6"]="R6";
lbH["total"]="Total";

var lbHTitle=[];

// player prefs
var preflist="~f132573~p464970~p149679~p291587~p401298";

// player groups
var player_groups = [""];
var show_player_groups = 0;

var player_groups_init = 0;
var player_groups_css = new Object();

function createGroupObj(id, rowclass){
	player_groups_css[id] = rowclass;
}

// highlight preferences
var hlist=""; //delimited vals or empty

// column widths
var lbcol=[];
lbcol["money_rank"]=15;
lbcol["current_pos"] = lbcol["start_pos"]=35;
lbcol["country"]=30;
lbcol["first_name"]=190;
lbcol["last_name"] = lbcol["today"] = lbcol["thru"] = lbcol["to_par"]=50;
var default_cWidth="40px";

// column colspan - varies by tour & id
// GENERATED var nameColSpan=]]><xsl:value-of select="pgat:getColSpan()"/><![CDATA[;
if (itemLocationInArray(pbpOffTournaments,lb_tour+lb_tournId) == -1) {
	var cut_nameColSpan=nameColSpan-1;
}
else {
	nameColSpan--;
	var cut_nameColSpan=nameColSpan;
}

// Dynamic childnode row count
var lbCol_total;
var msgCol_total;

// Cut lines
var actual_cut_init=0;
var actual_cut_text="The following players failed to make the Cut:";
var projected_cut_init=0;
var projected_cut_text="Projected cut:";

// Global container vars
var players_currhole=[]; //current hole
var player_names=[];
var player_names_init=0;
var player_amateur=[];
var players_coursecode=[]; //player course code


/*********************************************************\
 Top ten message - topten_total_msgs, topten_msgs
\*********************************************************/


// GENERATED topten_total_msgs = ]]><xsl:value-of select="pgat:getTextAdsCount()"/><![CDATA[;
// GENERATED topten_msgs = []]><xsl:value-of select="pgat:getTextAds()"/><![CDATA[]



function get_topten_msg(){
	var topten_time=new Date();
	var topten_seconds=topten_time.getSeconds();
	var index=topten_seconds % topten_total_msgs;
	return topten_msgs[index];
}




/*********************************************************\
 Build initial leaderboard table without expansion rows
 and highlights
\*********************************************************/
function getColumns(data){

	//*** Header row ***//
	if(!init){
		rounds=data[0]['total_rounds'];
		var myThead=getEl("lbHead");
		var hRow, hCell;

		hRow=document.createElement('tr');
		hRow.id="tr_header";
		hRow.className="header";
		hRow.align="center";

		for(var j in lbOrder){
			var k=lbOrder[j];
			var col_id='td_'+k; //target col ids as 'td_money_rank' to prevent duplicate objects
			var cWidth= (lbcol[k]) ? lbcol[k]+"px" : default_cWidth; //cell width for each data type
			switch (k){
				case "first_name":
				hCell=document.createElement('td');
				hCell.id=k;
				hCell.className="header";
				// sdengler: -1 to remove color column
				hCell.colSpan=nameColSpan - 1;
				var w=(lb_tour!=="r") ? parseInt(cWidth)+15 : cWidth;
				//if(rounds==2) hCell.width=w+80;
				//if(rounds==3) hCell.width=w+40;
				hCell.innerHTML="<a href=\"javascript:sort_lb(\'"+k+"\');\">"+lbH['first_name']+"</a>"+" / "+"<a href=\"javascript:sort_lb(\'last_name\');\">"+lbH['last_name']+"</a>";
				break;

				case "today":
				hCell=document.createElement('td');
				hCell.id=k;
				hCell.className="header";
				//hCell.width=cWidth;
				var today_text=(lbState.state=="Official") ? "Rnd"+lb_round : lbH[k];
				hCell.innerHTML="<a href=\"javascript:sort_lb(\'"+k+"\');\">"+today_text+"</a>";
				break;

				case "to_par":
				hCell=document.createElement('td');
				hCell.id=k;
				hCell.className="header";
				//hCell.width=cWidth;
				var topar_text=(lbState.scoringFormat=="FTS") ? "Points" : lbH[k];
				hCell.innerHTML="<a href=\"javascript:sort_lb(\'"+k+"\');\">"+topar_text+"</a>";
				hRow.appendChild(hCell);
				hCell=document.createElement('td');
				hCell.className="border";
				//hCell.width="2px";
				break;

				case "r1":
				case "r2":
				case "r3":
				case "r4":
				case "r5":
				case "r6":
				var rnum = k.replace(/r/,'');
				if(rounds < rnum) continue;
				hCell=document.createElement('td');
				hCell.id=k;
				hCell.className="header";
				//hCell.width=cWidth;
				hCell.innerHTML= (rnum <= lb_round) ? "<a href=\"javascript:sort_lb(\'"+k+"\');\">"+lbH[k]+"</a>" : lbH[k];
				if(rounds==rnum){//border column
					hRow.appendChild(hCell);
					hCell=document.createElement('td');
					hCell.className="border";
					//hCell.width="2px";
					}
				break;

				default:
				hCell=document.createElement('td');
				hCell.id=k;
				hCell.className="header";
				//hCell.width=cWidth;
				hCell.innerHTML="<a href=\"javascript:sort_lb(\'"+k+"\');\">"+lbH[k]+"</a>";
				break;
				}
				hRow.appendChild(hCell);
			}
		myThead.appendChild(hRow);
		init=1;
		global_columnLength = hRow.childNodes.length;
		}

	msgCol_total = global_columnLength -1 + nameColSpan;
	//alert('msgCol_total -- > ' + msgCol_total);
	clearChildNodes("lbBody");

	//*** Player rows ***//
	var myTBody=getEl("lbBody");

	//playerlist prefs
	var preflist=new String("~f132573~p464970~p149679~p291587~p401298");

	// define cut values
	var actual_cut_value=data[0]['actual_cut'];
	var projected_cut_value=data[0]['projected_cut'];

	var rowClass="odd";
	var z=data.length;
	var player_count=1;
	for(var i=0;i<z;i++){
		var player_id=data[i]['player_id'];
		var rowData=data[i];
		
		//player names
		if(!player_names_init){
			player_names[player_id]=rowData['first_name']+" "+rowData['last_name'];
			}
		//current hole
		if(rowData['current_hole']=="F"){
			players_currhole[player_id]=(rowData['back_nine']==1) ? 9 : 18;
			}
		else{
			players_currhole[player_id]=rowData['current_hole'];
			}

		//course code
		if(rowData['course_code']){
			players_coursecode[player_id]=rowData['course_code'];
			}

		//Cuts - only show for default sorts
		if(showDefaultSort(sort_pref)){
			var topar=rowData['to_par'].replace(/E/,0);
			if(actual_cut_init==0 && rowData['current_pos']=='-' && actual_cut_value !=' '){
				var cutRow=document.createElement('tr');
				cutRow.id="cutline"
				cutRow.align="center";
				cutRow.className="msg";
				var cutCell=document.createElement('td');
				//cutCell.colSpan=lbCol_total;
				cutCell.colSpan=msgCol_total;
				var valCut=(actual_cut_value=="0") ? "E" : actual_cut_value;
				cutCell.innerHTML="<b>"+actual_cut_text+"&nbsp;"+valCut+"</b>";
				cutRow.appendChild(cutCell);
				myTBody.appendChild(cutRow);
				actual_cut_init=1;

			if(typeof cut_row_ad != "undefined"){
				var msgRow=document.createElement('tr');
				msgRow.id="ad_message2";
				msgRow.align="center";
				msgRow.className="msg";
				var msgCell=document.createElement('td');
				msgCell.colSpan=msgCol_total;
				msgCell.innerHTML = "<div id='cut_row_ad' style='width:668px'></div>";
				msgRow.appendChild(msgCell);
				myTBody.appendChild(msgRow);
				//clean up
				msgRow=msgCell=null;
				}

			}
			else if(projected_cut_init==0){
				if(lbState.scoringFormat=="FTS"){
					if(topar=='-' || topar=='') topar=-100;
					if(parseInt(topar) < parseInt(projected_cut_value) && projected_cut_value !=' '){
						var cutRow=document.createElement('tr');
						cutRow.id="cutline"
						cutRow.align="center";
						cutRow.className="msg";
						var cutCell=document.createElement('td');
						cutCell.colSpan=msgCol_total;
						var val=(projected_cut_value=="0") ? E : projected_cut_value;
						cutCell.innerHTML="<b>"+projected_cut_text+"&nbsp;"+val+"</b>";
						cutRow.appendChild(cutCell);
						myTBody.appendChild(cutRow);
						projected_cut_init=1;
						}

				if(typeof cut_row_ad != "undefined"){
					var msgRow=document.createElement('tr');
					msgRow.id="ad_message2";
					msgRow.align="center";
					msgRow.className="msg";
					var msgCell=document.createElement('td');
					msgCell.colSpan=msgCol_total;
					msgCell.innerHTML = "<div id='cut_row_ad' style='width:668px'></div>";
					msgRow.appendChild(msgCell);
					myTBody.appendChild(msgRow);
					//clean up
					msgRow=msgCell=null;
					}
					}
				else if(parseInt(topar) > parseInt(projected_cut_value) && projected_cut_value !=' '){
					var cutRow=document.createElement('tr');
					cutRow.id="cutline"
					cutRow.align="center";
					cutRow.className="msg";
					var cutCell=document.createElement('td');
					cutCell.colSpan=msgCol_total;
					var val=(projected_cut_value=="0") ? "E" : projected_cut_value;
					cutCell.innerHTML="<b>"+projected_cut_text+"&nbsp;"+val+"</b>";
					cutRow.appendChild(cutCell);
					myTBody.appendChild(cutRow);
					projected_cut_init=1;

				if(typeof cut_row_ad != "undefined"){
					var msgRow=document.createElement('tr');
					msgRow.id="ad_message2";
					msgRow.align="center";
					msgRow.className="msg";
					var msgCell=document.createElement('td');
					msgCell.colSpan=msgCol_total;
					msgCell.innerHTML = "<div id='cut_row_ad' style='width:668px'></div>";
					msgRow.appendChild(msgCell);
					myTBody.appendChild(msgRow);
					//clean up
					msgRow=msgCell=null;
					}
					}
				}
			}

		var prefRowClass=null;

		//player group prefs: only test once and store
		if(show_player_groups && !player_groups_init){
			var re=/[A-Z]/;//regexp:custom highlights
			if(!hlist.match(re+player_id)){ //only process if playerid not found in highlight group obj
				for(var p in player_groups){
					var c=Number(p)+1;
					switch(player_groups[p]){
						case "top_10_money":
							if((rowData['money_rank'] > 0 && rowData['money_rank'] <= 10)) prefRowClass='playergroup'+c;
							break;
						case "am":
							if(rowData['amateur']==1) prefRowClass='playergroup'+c;
							break;
						case "int":
							if((rowData['country']!="USA" && rowData['country']!="UNKNOWN")) prefRowClass='playergroup'+c;
							break;
						case "top_10_wgr":
							if(rowData['top10_wg_rank']==1) prefRowClass='playergroup'+c;
							break;
						case "rook":
							if(rowData['rookie']==1) prefRowClass='playergroup'+c;
							break;
						case "top_20_nat":
							if(rowData['top20_nwtour']==1) prefRowClass='playergroup'+c;
							break;
						case "nat_grads":
							if(rowData['nw_grad']==1) prefRowClass='playegroup'+c;
							break;
						case "qschool":
							if(rowData['qschool']==1) prefRowClass='playergroup'+c;
							break;
						}
					if(prefRowClass != null) break;
				}
			}

		}
		// player prefs
		if(preflist.match('f' + player_id)) { prefRowClass="bgF"; }
		else if(preflist.match('p' + player_id)) { prefRowClass="bgP"; }
		
		if(prefRowClass != null){
			new createGroupObj(player_id,prefRowClass);
			}

		// Start player row:
		var pRow, pCell;
		pRow=document.createElement('tr');
		pRow.id="tr_"+player_id;
		
		if(player_groups_init){
			if(player_groups_css[player_id]) prefRowClass=player_groups_css[player_id];
		}
		pRow.className=(prefRowClass) ? prefRowClass : rowClass;
		pRow.align="center";

		var backnine=(rowData['back_nine']==1) ? '&nbsp;*' : '';

		var tmp;
		//loop through lb column order
		for(var j in lbOrder){
			var k=lbOrder[j];
			switch (k){
				case "money_rank":
				pCell=document.createElement('td');
				pCell.id="player"+player_count;
				tmp=rowData[k];
				if(tmp=="n/a" || tmp==0) pCell.className="";
				if(isFedexCup == 'Yes'){
					if (tmp>125) pCell.className="";
					else if(tmp>100) pCell.className="fcr3";
					else if(tmp>70) pCell.className="mrx";
					else if(tmp>30) pCell.className="fcr2";
					else if(tmp>=1) pCell.className="fcr1";
				}
                else if(lb_tour=="h"){
                    if(tmp>=101)     pCell.className="";
                    else if(tmp>=61) pCell.className="mr5";
                    else if(tmp>=26) pCell.className="mr2";
                    else if(tmp>=1)  pCell.className="mr1";
                }
                else if(lb_tour=="s"){
					if(tmp>=176)      pCell.className="mr5";
					else if(tmp>=151) pCell.className="mr4";
					else if(tmp>=126) pCell.className="mr3";
					else if(tmp>=31)  pCell.className="mr2";
					else if(tmp>=1)   pCell.className="mr1";
                }				
				else{
					if(tmp>=176)      pCell.className="";
					else if(tmp>=126) pCell.className="";
					else if(tmp>=1)   pCell.className="money1";
					}
				pCell.innerHTML= (tmp=='' || tmp=='0') ? '-' : tmp;
				break;

				case "current_pos":
				case "start_pos":
				pCell=document.createElement('td');
				tmp=rowData[k] || "&nbsp;";
				pCell.vAlign="top";
				pCell.innerHTML=tmp;
				break;

				case "country":
				pCell=document.createElement('td');
				tmp= (rowData[k] && rowData[k] != ' ') ? rowData[k] : "UNKNOWN";
				pCell.vAlign="top";
				// country image
				pCell.innerHTML='<img src=\"http://i.pgatour.com/pgatour/.element/img/1.0/main/leaderboard/country_icons/' +tmp +'.gif\" height="15" width="15" alt=\"' +tmp +'\" border="0" title=\"'+rowData["countryname"]+'\">';
				break;

				case "first_name":
				var b_width = "15px"; //button width
				
				//custom highlight selector
				pCell=document.createElement('td');
				pCell.className='customizebutton';
				pCell.id='C'+player_id;
				pCell.pid=player_id;
				pCell.title='Customize Player Highlight';
				//pCell.width=b_width;
				pCell.onclick=function(){customColorRow(this.pid);return false;};
				pCell.innerHTML="C";
				//sdengler
				//pRow.appendChild(pCell);
				
				//show course code in parenthesis next to player name - only multiple course tournaments
				var course='';
				if(show_multiple_course==1){
					var show_course= (rowData['course_code']=='null' || rowData['course_code']=='') ? 0 : 1;
					course= (show_course) ? "&nbsp;("+rowData['course_code']+")" : '';
				}
				// player name cell
				pCell=document.createElement('td');
				//pCell.width="160px";
				// td cell colspan
				if(actual_cut_init==1){
					if(rowData['current_pos']=='DNS' || (nameColSpan - 2)==0){
						pCell.colSpan=nameColSpan-1;
						}
					else{
						pCell.colSpan=nameColSpan-2;
						}
					}
				if(rowData['current_pos']=='DNS'){
						pCell.colSpan=nameColSpan-1;
						}
				var player_name=rowData['first_name']+' '+rowData['last_name'];
				if(rowData['current_pos']=='DNS'){
					tmp=player_name;
					}
				else{
					//tmp='<a href="/players/'+getPlayerUrl(player_id)+'/" title="Player Information">'+player_name+'</a>';
					//tmp='<a href="/scoring/'+ lb_tour + lb_year + lb_tournId +'/'+getPlayerUrl(player_id)+'/scorecard.html" title="Player Information">'+player_name+'</a>';
					tmp='<a href="/players/'+ getPlayerUrl(player_id) + '/scorecards/' + lb_year + '/' + lb_tour + lb_tournId +'.html" title="Player Information">'+player_name+'</a>';
					}
				pCell.className="name";
				pCell.innerHTML=tmp+course;
				pRow.appendChild(pCell);
				
				// Expansion row buttons
				// FedExCup Button
				if(actual_cut_init==0){
					if (rowData['current_pos'] != 'DNS' && isFcExpRow == 'y'){
						pCell=document.createElement('td');
						pCell.className='button';
						pCell.layout='FC';
						pCell.id='FC'+player_id;
						pCell.pid=player_id;
						pCell.title='FedExCup';
						//pCell.width=b_width;
						pCell.onclick=iconOnClick;
						pCell.innerHTML="FC";
						pRow.appendChild(pCell);
					}
				}
				
				// scorecard button - not displayed for players that didn't start...
				if (rowData['current_pos'] != 'DNS' && isScExpRow == 'y'){
					pCell=document.createElement('td');
					pCell.className='button';
					pCell.layout='SC';
					pCell.id='SC'+player_id;
					pCell.pid=player_id;
					pCell.title='View Scorecard';
					//pCell.width=b_width;
					pCell.onclick=iconOnClick;
					pCell.innerHTML="SC";
					pRow.appendChild(pCell);
				}
				
				if(actual_cut_init==0){ // buttons shown only above cut line
					if (rowData['current_pos']=='DNS') continue;
					if(isPbpExpRow == 'y'){
						pCell=document.createElement('td');
						pCell.className='button';
						pCell.layout='P';
						pCell.id='P'+player_id;
						pCell.pid=player_id;
						pCell.title='View Play-by-Play';
						//pCell.width=b_width;
						pCell.onclick=iconOnClick;
						pCell.innerHTML="P";
						pRow.appendChild(pCell);
						}
                        
                        // PENDING: ???
                        
					if (isSExpRow == 'y'){
						pCell=document.createElement('td');
						pCell.className='button';
						pCell.layout='S';
						pCell.id='S'+player_id;
						pCell.pid=player_id;
						pCell.title='View Key Stats';
						//pCell.width=b_width;
						pCell.onclick=iconOnClick;
						pCell.innerHTML="S";
						pRow.appendChild(pCell);
						}
                        
                        // PENDING: ??? 
                        
				 	if (isHExpRow == 'y'){
						pCell=document.createElement('td');
						pCell.className='button';
						pCell.layout='H';
						pCell.id='H'+player_id;
						pCell.pid=player_id;
						pCell.title='View Hole Information';
						//pCell.width=b_width;
						pCell.onclick=iconOnClick;
						pCell.innerHTML="H";
						}
					}
				break;

				case "today":
				pCell=document.createElement('td');
				if(rowData['current_pos']=="WD"){
					pCell.colSpan=3;
					pCell.innerHTML="Withdrawn";
					}
				else if(rowData['current_pos']=="DQ"){
					pCell.colSpan=3;
					pCell.innerHTML="Disqualified";
				}
				else if(rowData['today'].indexOf(':') != -1){
					pCell.colSpan=2;
					tmp=rowData[k] || "&nbsp;";
					pCell.innerHTML=tmp+backnine;
				}
				else{
					tmp=rowData[k] || "&nbsp;";
					pCell.innerHTML=tmp;
					}
				break;

				case "thru":
				if(rowData['current_pos']=="WD") continue;
				if(rowData['current_pos']=="DQ") continue;
				if(rowData['today'].indexOf(':') != -1) continue;
//				var backnine=(rowData['back_nine']==1) ? '&nbsp;*' : '';
				pCell=document.createElement('td');
				tmp=rowData[k] || "&nbsp;";
				pCell.innerHTML=tmp+backnine;
				break;

				case "to_par":
				if(rowData['current_pos']!="WD" && rowData['current_pos']!="DQ"){
					pCell=document.createElement('td');
					tmp=rowData[k] || "&nbsp;";
					pCell.innerHTML=tmp;
					}
				pRow.appendChild(pCell);
				pCell=document.createElement('td');
				pCell.className="border";
				break;

				case "r1":
				case "r2":
				case "r3":
				case "r4":
				case "r5":
				case "r6":
				var rnum = k.replace(/r/,'');
				if(rounds < rnum) continue;
				pCell=document.createElement('td');
				//tmp=(Number(rowData[k])) ? rowData[k] : "&nbsp;";
				tmp=rowData[k] ;
				pCell.innerHTML=tmp;
				if(rounds==rnum){
					pRow.appendChild(pCell);
					pCell=document.createElement('td');
					pCell.className="border";
					}
				break;

				case "total":
				pCell=document.createElement('td');
				//tmp=(Number(rowData[k])) ? rowData[k] : "&nbsp;";
				tmp=rowData[k] ;
				pCell.innerHTML=tmp;
				break;

				default:
				pCell=document.createElement('td');
				tmp=(rowData[k]!="null" && typeof rowData[k]!="undefined") ? rowData[k] : "&nbsp;";
				pCell.innerHTML=tmp;
				break;
			}
			pRow.appendChild(pCell);
		}
		// keep track of how many columns this row has
		lbCol_total=pRow.childNodes.length;
		//var hRowLen = hRow.childNodes.length;
		//lbCol_total= hRowLen -1 + nameColSpan;
		//alert('lbCol_total -- > ' + lbCol_total);

		myTBody.appendChild(pRow);
		rowClass= rowClass=="odd" ? "even" : "odd";
		// Top ten message row
		if(player_count==10){

			if(typeof row_10_ad != "undefined"){
				var msgRow=document.createElement('tr');
				msgRow.id="ad_message";
				msgRow.align="center";
				msgRow.className="msg";
				var msgCell=document.createElement('td');
				msgCell.colSpan=msgCol_total;
				msgCell.innerHTML = "<div id='row_10_ad' style='width:668px'></div>";
				msgRow.appendChild(msgCell);
				myTBody.appendChild(msgRow);
				//clean up
				msgRow=msgCell=null;
				}
			}
		player_count++;
		if(player_names_init=0) player_names_init=1;
	}

	//clean up
	cutRow=cutCell=pRow=pCell=null;
	
	actual_cut_init=0;
	projected_cut_init=0;

	// change header cols classes
	var col_off=(previous_sort_pref=='last_name') ? 'first_name' : previous_sort_pref;
	var col_on=(sort_pref=='last_name') ? 'first_name' : sort_pref;
	getEl(col_off).className="header";
	getEl(col_on).className="sort";
	

	// get playoff players once we've determined we have their names from leaderboard file
	// FIXME: make flexible to use shot links
	//PGAreq.getPlayoff(playoff_callback, "2006", "r060");
	}

//prevent circular closure due to IE memory leaks
function iconOnClick(){
	var pid=this.pid;
	var layout=this.layout;
	if(layout){
		tracker(this.pid,layout);return false;
		}
	else{
		customColorRow(this.pid);return false;
		}
	}

/********************\
 Playoff
\********************/
function buildPlayoff(data){

	var playoffObj=getEl('playoff');
	//clear table childnodes if table already exists
	if(playoffObj.childNodes.length > 0) clearChildNodes("playoff");
	var total_holes=data.length;
	var colspan_total=total_holes + 2;
	var colspan_pbp=total_holes + 1;
	var w_td=30;
	var w_table=735;
	var w_col0=110;
	var w_blank=w_table - (w_col0+(colspan_pbp * w_td));

	var newT=document.createElement('table');
	newT.id="playoffTBL";
	//newT.width=w_table;
	newT.cellSpacing=1;
	newT.cellPadding=2;
	var newTbody=document.createElement('tbody');
	newTbody.id="playoffBody"
	var newTR, newTD;
	newTR=document.createElement('tr');
	newTR.className="header";
	newTD=document.createElement('td');
	newTD.colSpan=colspan_total;
	newTD.align="center";
	newTD.innerHTML="Playoff (Sudden Death)";
	newTR.appendChild(newTD);
	newTbody.appendChild(newTR);
	newTR=document.createElement('tr');
	newTR.className="header";
	newTD=document.createElement('td');
	newTD.align="left";
	//newTD.width=w_col0;
	newTD.innerHTML="Playoff Hole #";
	newTR.appendChild(newTD);

	for(var i in data){
		newTD=document.createElement('td');
		newTD.align="center";
		newTD.innerHTML=data[i]['PlayoffHole'];
		newTR.appendChild(newTD);
	}
	newTD=document.createElement('td');
	//newTD.width=w_blank;
	newTD.innerHTML="&nbsp;"
	newTR.appendChild(newTD);

	newTbody.appendChild(newTR);
	newTR=document.createElement('tr');
	newTR.className="header";
	newTD=document.createElement('td');
	newTD.align="left";
	newTD.innerHTML="Course Hole #";
	newTR.appendChild(newTD);

	for(var i in data){
		newTD=document.createElement('td');
		newTD.align="center";
		newTD.innerHTML=data[i]['CourseHole'];
		newTR.appendChild(newTD);
	}
	newTD=document.createElement('td');
	//newTD.width=w_blank;
	newTD.innerHTML="&nbsp;"
	newTR.appendChild(newTD);

	newTbody.appendChild(newTR);
	newTR=document.createElement('tr');
	newTR.className="subheader";
	newTD=document.createElement('td');
	newTD.innerHTML="PAR";
	newTR.appendChild(newTD);

	for(var i in data){
		newTD=document.createElement('td');
		//newTD.width=w_td;
		newTD.innerHTML=data[i]['Par'];
		newTR.appendChild(newTD);
	}
	newTD=document.createElement('td');
	//newTD.width=w_blank;
	newTD.innerHTML="&nbsp;"
	newTR.appendChild(newTD);

	newTbody.appendChild(newTR);

	for(var j in data[0]){
		// get playoff players from first row headers
		if(j.match(/[0-9]/)){
			newTR=document.createElement('tr');
			newTR.id='p_'+j;
			newTR.className="odd";
			newTR.vAlign="top";
			newTD=document.createElement('td');
			var pid=j;
			pid=pid.toString();
			newTD.innerHTML=player_names[j];
			newTR.appendChild(newTD);

			for(var k=0;k<total_holes;k++){
				newTD=document.createElement('td');
				newTD.align="center";
				newTD.className="even";
				newTD.innerHTML=data[k][j];
				newTR.appendChild(newTD);
			}

			newTD=document.createElement('td');
			//newTD.width=w_blank;
			newTD.className="even";
			newTD.innerHTML="&nbsp;"
			newTR.appendChild(newTD);

			newTbody.appendChild(newTR);
		}
	}

	newT.appendChild(newTbody);
	playoffObj.appendChild(newT);
	//expAddPlayoffRow('460229','P');
}


function expAddPlayoffRow(player,layout) {

	var plrRowName='p_'+player;
	var expRowName='pe_'+player;

	var tbl=getEl("playoffBody");

	// access player row obj for id and number of child columns
	var playerRow=getEl(plrRowName);
	var currentCells=playerRow.childNodes.length;

	// determine next row to insert new child row before
	var nextRow=getEl(plrRowName).nextSibling;

	// create new row, assign it an ID
	var newR=document.createElement('tr');
	newR.id=expRowName;
	newR.vAlign="top";
	newR.className=playerRow.className;

	// create expansion row content column
	var expCol=document.createElement('td');
	expCol.colSpan=currentCells;
	expCol.id='ptd_'+player; //designates an id to the TD cell to append to
	expCol.innerHTML="Loading data...";
	newR.appendChild(expCol);

	// add row before next player row or as last child in table
	if(playerRow.nextSibling){ tbl.insertBefore(newR,getEl(nextRow.id)); }
	else { tbl.appendChild(newR); }

	playerRow.cells[0].rowSpan=2; // column 1

	//build exp row shell, make player request
//	playerStat.buildExpRowShell( player, layout );
//	playerStat.expRowObj(player,layout);

	}

/*********************************************************\
 ccokie used to track expansion
\*********************************************************/
/* cookie will expire in x hours  */
var lbCookieHrs=72;

function lb_Expire() {
	var now=new Date(); var expire=new Date();
	expire.setHours(lbCookieHrs); expire.setMinutes(0); expire.setSeconds(0);
	var life=expire.getTime() - now.getTime();
	if(life<0) {expire.setDate(expire.getDate() + 1);}
	return expire.toGMTString();
	}

var lbCookieDie=lb_Expire();
var lbCookieName="lb_"+lb_id;


/*********************************************************\
 Player color highlights:
 - sets cookie and adds to HTML table 
\*********************************************************/
var hCookieName="lb_highlights";
var hSavedCookieName="lb_saved_highlights";
var hTrack=readCookie(hCookieName) || "";
var hSavedTrack=readCookie(hSavedCookieName) || "";
//var hTrack=cookie[hCookieName] || "";
//var hSavedTrack=cookie[hSavedCookieName] || "";

// this is used for unit testing since this cookie is provided by member services
//var hSavedTrack="A7457~B1968~C1920~D22046";   
var hIndex=["A","B","C","D"];

function customColorRow(pid){
	if(!document.createTextNode){return;}
	var hmax=4; //max css
	//selected player row class
	var rowObj=getEl('tr_'+pid);
	var playerClass=rowObj.className;

	var activeClass="highlight1"; //starting class
	var newTrack="";
	//if customized already, figure out next in sequence
	if(playerClass.indexOf("highlight") > -1){
		var n=playerClass.replace('highlight','');
		n=parseInt(n);
		
		var colorCode = "";
		if (n==1) {
			colorCode="A";
		}
		else if(n==2){
			colorCode="B";
		}
		else if(n==3){
			colorCode="C";
		}
		else {
			colorCode="D";
		}
		
		if (hTrack.indexOf('~'+colorCode+pid) == -1) {
			hTrack+='~'+colorCode+pid;
		}
		
		if(n==1){
			activeClass="highlight2";
			newTrack=hTrack.replace('~A'+pid,'~B'+pid);
			}
		else if(n==2){
			activeClass="highlight3"; 
			newTrack=hTrack.replace('~B'+pid,'~C'+pid);
			}
		else if(n==3){
			activeClass="highlight4"; 
			newTrack=hTrack.replace('~C'+pid,'~D'+pid);
			}
		else if(n==hmax){
			var index=rowObj.cells[0].id;
			index=index.replace(/player/,'');
			if(player_groups_css[pid]){
				activeClass=player_groups_css[pid];
				}
			else{
				activeClass=(index%2) ? "odd" : "even";
				}
			newTrack=hTrack.replace('~D'+pid,'');
		}
		hTrack=newTrack;
	}
	else{
		hTrack+='~A'+pid;
	}

	rowObj.className=activeClass;
	var expRowObj=getEl('te_'+pid);
	if(expRowObj) expRowObj.className=activeClass;

	hlist=hTrack; //reset lookup
	//draw('tracker',hTrack); //DEBUG
	
	//set highlight cookie
	document.cookie=(hCookieName +"="+hTrack+";expires="+lbCookieDie+";path=/");
	
}

function addHighlights(myTrack){
	var list=myTrack.split('~');
	for(var i in list){
		var hClass;
		var pid=list[i].substr(1);
		if (pid.substr(0, 1) == '0') pid = pid.substr(1, pid.length); // strip the leading zero that appears in the cookie data
		var playerRow=getEl('tr_'+pid);
		if(list[i].match('A')) { hClass="highlight1"; }
		else if(list[i].match('B')) { hClass="highlight2"; }
		else if(list[i].match('C')) { hClass="highlight3"; }
		else if(list[i].match('D')) { hClass="highlight4"; }
		var expRowObj=getEl('te_'+pid);
		playerRow.className=hClass;
		if(expRowObj) expRowObj.className=hClass;
	}
}

// PADDING

function padDigits(n, totalDigits) {
	n = n.toString(); 
    var pd = ''; 
    if (totalDigits > n.length) { 
    	for (i=0; i < (totalDigits-n.length); i++) { 
                pd += '0'; 
        } 
    } 
    return pd + n.toString(); 
} 


// PLAYER STAT



/*********************************************************\
 playerStat object methods to create expansion rows:
 initial shell template for scorecards, play-by-play,
 key stats and current hole information
\*********************************************************/
function playerStat() {}

playerStat.expRowObj=function( player, layout ){
	switch(layout){
		case "FC"://fedexcup
			playerStat.getImage( player, layout );
			var links="<img src='http://i.cdn.turner.com/pgatour/.element/img/3.0/sect/r/schedule/fedex_small.jpg' alt='FedExCup Points' align='middle' />";
			//draw('exp_'+player, "<table width=100% cellpadding=0 cellspacing=0 border=0><tr><td valign='middle'>"+links+"</td><td align=right onclick=\"javascript:tracker("+player+","+"'FC');\"><div class=closebutton title=Close>X</div></td></tr></table><div class=spacer5>&nbsp;</div>");
			draw('exp_'+player, "<table cellpadding=0 cellspacing=0 border=0><tr><td valign='middle'>"+links+"</td><td align=right onclick=\"javascript:tracker("+player+","+"'FC');\" class=closetd><div class=closebutton title=Close>X</div></td></tr></table><div class=spacer5>&nbsp;</div>");
			PGAreq.getFedexCupPoints(fc_callback, player, lb_year, lb_id);
			break;
		case "SC"://scorecards
			playerStat.getImage( player, layout );
		//	var links="<a href=/scoring/" + lb_tour + lb_year + lb_tournId + "/" + getPlayerUrl(player) + "/scorecard.html>Full Scorecard</a>";
			var links="Scorecard";
			//draw('exp_'+player, "<table width=100% cellpadding=0 cellspacing=0 border=0><tr><td>"+links+"</td><td align=right onclick=\"javascript:tracker("+player+","+"'SC');\"><div class=closebutton title=Close>X</div></td></tr></table><div class=spacer5>&nbsp;</div>");
			draw('exp_'+player, "<table cellpadding=0 cellspacing=0 border=0><tr><td>"+links+"</td><td align=right onclick=\"javascript:tracker("+player+","+"'SC');\" class=closetd><div class=closebutton title=Close>X</div></td></tr></table><div class=spacer5>&nbsp;</div>");
			PGAreq.getScorecard(sc_callback, player, lb_year, lb_id, lb_round);
			break;
		case "P"://play-by-play
			playerStat.getImage( player, layout );
			var pbp_id="pbphole"+player;
			//var pbp_text= (lbState.state=="Groupings Official") ? "Play has not started." : "";
			var pbp_text;
			if(lbState.state=="Groupings Official"){
				pbp_text = "Play has not started.";
			}
			/*else if(lbState.state=="In Progress"){
				pbp_text = "Player has not teed off.";
			}*/
			else{
				pbp_text = "";
			}
			//draw('exp_'+player, "<table width=100% cellpadding=0 cellspacing=0 border=0><tr><td><u>Play by Play<span id="+pbp_id+"></span></u></td><td align=right onclick=\"javascript:tracker("+player+","+"'P');\"><div class=closebutton title=Close>X</div></td></tr></table>"+pbp_text);
			draw('exp_'+player, "<table cellpadding=0 cellspacing=0 border=0><tr><td><span style=\"white-space:nowrap\"><u>Play by Play<span id="+pbp_id+"></span></u></span></td><td align=right onclick=\"javascript:tracker("+player+","+"'P');\" class=closetd><div class=closebutton title=Close>X</div></td></tr></table>"+pbp_text);
			PGAreq.getPlaybyPlay(pbp_callback, player, lb_year, lb_id , lb_round);
			break;
		case "S"://key stats
			playerStat.getImage( player, layout );
			//draw('exp_'+player, "<table width=100% cellpadding=0 cellspacing=0 border=0><tr><td>Key Stats for "+player_names[player]+"</td><td align=right onclick=\"javascript:tracker("+player+","+"'S');\"><div class=closebutton title=Close>X</div></td></tr></table>");
			draw('exp_'+player, "<table cellpadding=0 cellspacing=0 border=0><tr><td><span style=\"white-space:nowrap\">Key Stats for "+player_names[player]+"</span></td><td align=right onclick=\"javascript:tracker("+player+","+"'S');\" class=closetd><div class=closebutton title=Close>X</div></td></tr></table>");
			PGAreq.getKeyStats(ks_callback, player, lb_year, lb_id);
			break;
		case "H"://hole info
			var hole=players_currhole[player];
			var course_code=players_coursecode[player];
			PGAreq.getHoleData(h_callback, player, lb_year, lb_id, lb_round, hole, course_code);
			break;
		}
	}

playerStat.buildExpRowShell=function( pid, layout ){
	var imgSrc="http://i.pgatour.com/pgatour/.element/img/1.0/main/spacer.gif";

	var myId=getEl('td_'+pid);
	myId.className="expcell";
	myId.innerHTML='';
	var myT=document.createElement('table');
	myT.className="lbexprow"
	myT.cellSpacing="0px";
	myT.cellPadding="0px";
	//myT.width="100%";
	var myTB=document.createElement('tbody');
	var myR=document.createElement('tr');
	myR.vAlign="top";

	var myC=document.createElement('td');
	myC.id='tdImg_'+pid;
	//myC.width=(layout=="H") ? "190px" : "80px";
	var myImg=document.createElement('img');
	myImg.id='expImg'+pid;
	myImg.src=imgSrc;
	myImg.width=(layout=="H") ? 181 : 72;
	myImg.height=82;
	myImg.border="0px";
	myC.appendChild(myImg);
	myR.appendChild(myC);

	myC=document.createElement('td');
	myC.id='exp_'+pid;
	myR.appendChild(myC);

	myTB.appendChild(myR);
	myT.appendChild(myTB);
	myId.appendChild(myT);
	
	myT=myId=myTB=myT=myR=myC=null;
	}

playerStat.getImage=function( pid, layout ){
	var myImg=getEl('expImg'+pid);
	var currImgSrc=myImg.src;
	if(currImgSrc.indexOf("players")==-1 && layout!="H"){ //only change img source when needed
		// PENDING: Image url!
		var imageUrl = "http://i.pgatour.com/pgatour/players/" + getPlayerUrl(pid) + "/images/headshot-72x82.jpg";
		var newImgSrc="<img id=expImg" + pid + " src=" + imageUrl + " width=72 height=82 border=0>";
		draw('tdImg_'+pid, newImgSrc);
		}
	return;
}

playerStat.buildFedexCupPoints=function( data, pid ){
	//check if it has been drawn already:
	var myStatusObj=getEl('exp_fedexcup_'+pid);
	if(myStatusObj){
		return;
		}
	var myImgTD=getEl('tdImg_'+pid);
	//myImgTD.width="80px";

	var myId=getEl('exp_'+pid);

	var myDiv=document.createElement('div');
	myDiv.className="lbexprow";
	myDiv.id="exp_fedexcup_"+pid;
	var myT=document.createElement('table');
	myT.cellPadding="1px";
	myT.cellSpacing="1px";
	myT.className="border";
	//myT.width="100%";
	var myTB=document.createElement('tbody');
	var myR, myC;
	var size=2; //limit size: Hole, Par & Rnd #
	for(var i=0;i<size;i++){
		myR=document.createElement('tr');
		myR.vAlign="top";
		myR.align="center";
		for(var j in data[i]){
			myC=document.createElement('td');
			myC.innerHTML=data[i][j];
			//myC.width="15%";
			if(i == 0){
				myC.className="fecheader";
			}
			else{
				myC.className="shade";
			}
			
			myR.appendChild(myC);
		}
		myTB.appendChild(myR);
	}

	myT.appendChild(myTB);
	myDiv.appendChild(myT);
	myId.appendChild(myDiv);

	myDiv=myT=myTB=myR=myC=null;
}

playerStat.buildScorecard=function( data, pid ){
	//check if it has been drawn already:
	var myStatusObj=getEl('exp_scorecard_'+pid);
	if(myStatusObj){
		return;
		}
	var myImgTD=getEl('tdImg_'+pid);
	//myImgTD.width="80px";

	var myId=getEl('exp_'+pid);

	var myDiv=document.createElement('div');
	myDiv.className="lbexprow";
	myDiv.id="exp_scorecard_"+pid;
	var myT=document.createElement('table');
	myT.cellPadding="1px";
	myT.cellSpacing="1px";
	myT.className="border";
	//myT.width="100%";
	var myTB=document.createElement('tbody');

	var sc_css=[];
	sc_css[1]="ace";
	sc_css[2]="eag";
	sc_css[3]="bir";
	sc_css[4]="par";
	sc_css[5]="bog";
	sc_css[6]="dbo";

	var myR, myC;
	var show_par_css=(data.length==4) ? 1 : 0;
	var size=3; //limit size: Hole, Par & Rnd #
	for(var i=0;i<size;i++){
		myR=document.createElement('tr');
		myR.vAlign="top";
		myR.align="center";
		for(var j in data[i]){
			myC=document.createElement('td');
			myC.innerHTML=data[i][j].replace('Rnd', 'R');
			if(j=="descrip" || i == 0){
				myC.align="left";
				//myC.width=74;
				myC.className="shade";
				}
			else if(j!="descrip" && data[i]['descrip']=="Hole"){
				//myC.width=22;
				//myC.className="shade";
				//myC.innerHTML="<a href=#>"+data[i][j]+"</a>"; //explore the course links
				}
			//css highlights:
			else if(j!="descrip" && data[i]['descrip'].indexOf("Rnd") > -1){
				if(show_par_css) myC.className=sc_css[ (data[3][j] > 6) ? 6 : data[3][j] ];
				}
			myR.appendChild(myC);
		}
		myTB.appendChild(myR);
	}

	myT.appendChild(myTB);
	myDiv.appendChild(myT);
	myId.appendChild(myDiv);

	myDiv=myT=myTB=myR=myC=null;
	}

playerStat.buildPlaybyPlay=function( data, pid ){
	//check if it has been drawn already:
	var myStatusObj=getEl('exp_playbyplay_'+pid);
	if(myStatusObj){
		return;
		}
	var size=data.length;
	// Add par, yardage & hole # to title if available
	var par_yardage='';		//string to append
	var index=0;			//starting index for data (varies if par & yardage in data)
	if(data[0]['hole'] == 'null'){
		par_yardage=data[0]['shottext'];
		index=1;
	}
	
	//Rachana
	var plrRound = data[0]['round'];

	var pbphole=(data[index]['hole']) ? data[index]['hole'] : '';
	var pbpround=(data[index]['round']) ? data[index]['round'] : '';
	var pbp=holetext='';
	
//	if(pbpround==lb_round){ //make sure playbyplay matches current round to display
	if(pbpround==plrRound){ //make sure playbyplay matches player current round to display
		if(par_yardage){
			holetext= (pbphole) ? "&nbsp;for the "+par_yardage : '';
		}
		else{
			holetext= (pbphole) ? "&nbsp;for Hole No.&nbsp;"+pbphole+par_yardage : '';
		}
		
		draw("pbphole"+pid, holetext);
		for(var j=index;j<=size;j++){
			if(j<size){
				pbp +=data[j]['shottext']+"<br>";
			}
			//else if(j==size){
			//	pbp +="<a href=#>View Full Play-by-Play</a>";
			//	}
		}
	}
	else{
		holetext = " information will be available once the player has teed off.";
		draw("pbphole"+pid, holetext);
	}

	var myImgTD=getEl("tdImg_"+pid);
	//myImgTD.width="80px";

	var myId=getEl('exp_'+pid);

	var myDiv=document.createElement('div');
	myDiv.className="lbexprow";
	myDiv.id="exp_playbyplay_"+pid;

	if(!pbp && (lbState.state=="In Progress" || lbState.state=="Groupings Official")){
		myDiv.innerHTML += "Play has not started.";
		}
	else if(pbp){
		myDiv.innerHTML += pbp;
		}

	myId.appendChild(myDiv);
	myDiv=null;
	}

playerStat.buildHoleInfo=function( data, param ){
	var arr=param.split('~'); //'8~53200'
	var pid=arr[0];
	var hole=arr[1];
	if(hole < 10) hole="0"+hole;
	
	//check if it has been drawn already:
	var myStatusObj=getEl('exp_holeinfo_'+pid);
	if(myStatusObj){
		return;
		}
	
	var info;
	if(data){
		info=data.replace(/Hole Number:/g, 'Hole ');
		info=info.replace(/\nHole Par:/g, ' - Par');
		info=info.replace(/\nHole Yardage:/g, ' - ');
		info=info.replace(/\nHole Difficulty/g, ' Yards\nHole Difficulty');
		info=info.replace(/\n/g, '<br>');
		}
	else if(lbState.state=="Groupings Official" || lbState.state=="In Progress"){
		info="Hole information will be available once "+player_names[pid]+" has teed off.";
		} 
	else{ info="Hole Information not available."; }

	var show_hole=(hole!="F" && hole!="-") ? 1 : 0;
	var myImgTD=getEl("tdImg_"+pid);
	var myImgId=getEl('expImg'+pid);
	
	if(show_hole){
		var spacerImg="http://i.pgatour.com/pgatour/.element/img/1.0/main/spacer.gif";
		var coursecode=players_coursecode[pid];
		
		var holeImg;
		
		/*if(show_multiple_course==0){
			holeImg="http://i.pgatour.com/courses/"+lb_id+"_"+hole+"_h.gif";
			}
		else{
			//tournaments with multiple courses
			if(lb_id=="r002"){
				//only one set of hole images for Classic Course for specific tourn id,
				//use default spacer gif for other courses with no available images
				holeImg=(coursecode != "CC") ? spacerImg : holeImg;
				}
			else{
				holeImg="http://i.pgatour.com/pgatour/courses/"+coursecode+"_"+lb_id+"_"+hole+"_h.gif";
				}
		}*/
		holeImg = "http://i.pgatour.com/pgatour/courses/" + lb_tour.toLowerCase() + courseIdToNumber[coursecode] + "/hole-images/" + lb_year + "/hole-" + arr[1] + "-full-181x82.jpg";
		
		//myImgTD.width="190px";
		myImgId.width=181;
		myImgId.height=82;
		myImgId.border=1;
		myImgId.src=holeImg;
		
		}
	else{
		//myImgTD.width="1px";
		myImgId.src="http://i.pgatour.com/pgatour/.element/img/1.0/main/spacer.gif";
		myImgId.width=1;
		myImgId.height=1;
		myImgId.border=0;
		}

	var myId=getEl('exp_'+pid);
	myId.innerHTML='';
	var myT=document.createElement('table');
	myT.id="exp_holeinfo_"+pid;
	//myT.width="100%";
	myT.className="lbexprow1";
	myT.cellSpacing="0px";
	var myTB=document.createElement('tbody');
	var myR=document.createElement('tr');
	myR.vAlign="top";

	var myC;
	myC=document.createElement('td');
	myC.className="lbexphole";
	myC.innerHTML=info;
	//myC.innerHTML=info + "<div class=closebutton title=\"Close\" onclick=\"javascript:tracker("+pid+","+"'H');\">X</div>";
	myR.appendChild(myC);

	myC=document.createElement('td');
	myC.width="10px";
	myC.innerHTML="<div class=closebutton title=\"Close\" onclick=\"javascript:tracker("+pid+","+"'H');\">X</div>";
	myR.appendChild(myC);

	myTB.appendChild(myR);
	myT.appendChild(myTB);
	myId.appendChild(myT);
	
	myT=myTB=myR=myC=null;
	}

var ksLabel=[];
ksLabel['DrivDist']="Driving Distance";
ksLabel['DrivAcc']="Driving Accuracy";
ksLabel['GIR']="GIR";
ksLabel['PuttsPer']="Putts Per GIR";
ksLabel['GIRProx']="Avg. Proximity to Pin";
ksLabel['Scrambling']="Scrambling";

playerStat.buildKeyStats=function( data, pid ){
	//check if it has been drawn already:
	var myStatusObj=getEl('exp_keystat_'+pid);
	if(myStatusObj){
		return;
		}
	var myImgTD=getEl('tdImg_'+pid);
	//myImgTD.width="80px";

	var myId=getEl('exp_'+pid);

	var T=document.createElement('table');
	T.id="exp_keystat_"+pid;
	T.cellPadding="0px";
	T.cellSpacing="0px";
	T.align="left";
	var TB=document.createElement('tbody');
	var R=document.createElement('tr');
	var C=document.createElement('td');

	//stat table 1
	var myDiv=document.createElement('div');
	myDiv.className="lbexprow";
	var myT=document.createElement('table');
	myT.cellPadding="1px";
	myT.cellSpacing="1px";
	myT.className="border";
	myT.align="left";
	var myTB=document.createElement('tbody');

	var myR, myC;
	var j=0;
	for(var i in data[0]){
		myR=document.createElement('tr');
		myC=document.createElement('td');
		//myC.width="120px";
		myC.className="shade";
		myC.innerHTML=ksLabel[i];
		myR.appendChild(myC);
		
		myC=document.createElement('td');
		//myC.width="40px";
		myC.className="value";
		myC.innerHTML=data[0][i];
		myR.appendChild(myC);
		
		myTB.appendChild(myR);

		if(j==2 || j==5){
			myT.appendChild(myTB);
			myDiv.appendChild(myT);
			C.appendChild(myDiv);
			R.appendChild(C);
		}
		j++
/*
		if(j==3){
			myT.appendChild(myTB);
			myDiv.appendChild(myT);
			C.appendChild(myDiv);
			R.appendChild(C);

			C=document.createElement('td');
			//C.width="2px";
			R.appendChild(C);
			C=document.createElement('td');
			//stat table 2
			myDiv=document.createElement('div');
			myDiv.className="lbexprow";
			myT=document.createElement('table');
			myT.cellPadding="1px";
			myT.cellSpacing="1px";
			myT.className="border";
			myT.align="left";
			myTB=document.createElement('tbody');
		}
*/
	}

	C=document.createElement('td');
	//C.width="2px";
	R.appendChild(C);

	C=document.createElement('td');
	C.vAlign="bottom";
	C.innerHTML="&nbsp;"
	//C.innerHTML=player_names[pid]+" full<br> tournament stat page"; //FIXME

	R.appendChild(C);
	TB.appendChild(R);
	T.appendChild(TB);
	myId.appendChild(T);

	myDiv=myT=myTB=myR=myC=null;
	T=R=C=null;
	}



// ROW EXPANSION


/************************************\
 Open expansion rows
\************************************/
function expAddRow(player,layout) {

	var plrRowName='tr_'+player;
	var expRowName='te_'+player;

	//Rachana
	var tblHead=getEl("tr_header");
	var expColspan = tblHead.childNodes.length + nameColSpan - 5;
	//alert('headtRow.childNodes.length --> ' + expColspan);
	//Rachana

	// dynamically determine total column # based on first row cells
	var tbl=getEl("lbBody");
	var firstRowId=tbl.firstChild.id;
	var firstRow=getEl(firstRowId);
//	var expColspan=firstRow.childNodes.length - 4;

	// access player row obj for id and number of child columns
	var playerRow=getEl(plrRowName);

	// determine next row to insert new child row before
	var nextRow=playerRow.nextSibling;

	// create the new row, and assign it an ID
	var newR=document.createElement('tr');
	newR.id=expRowName;
	newR.vAlign="top";
	newR.className=playerRow.className;

	// money column
	var cell_a=document.createElement('td');
	cell_a.className="empty";
	cell_a.height="92px";
	cell_a.innerHTML="&nbsp;";
	newR.appendChild(cell_a);

	// and lastly, create the expansion row content column
	var expCol=document.createElement('td');
	expCol.colSpan=expColspan;
	expCol.id='td_'+player; //designates an id to the TD cell to append to
	expCol.innerHTML="Loading data...";
	newR.appendChild(expCol);

	// add row before next playerid row or as last child in table if nextsibling not found
	if(nextRow){ tbl.insertBefore(newR,getEl(nextRow.id)); }
	else { tbl.appendChild(newR); }

	// now cellSpan the 2nd-4th columns of the player row
	playerRow.cells[1].rowSpan=2;
	playerRow.cells[2].rowSpan=2;
	playerRow.cells[3].rowSpan=2;

	newR=cell_a=expCol=null;
	
	//build exp row shell, make player request
	playerStat.buildExpRowShell( player, layout );
	playerStat.expRowObj(player,layout);
	}

/************************************\
 Switch content in expansion rows.
\************************************/
function expChangeRow(player,layout) {

	var expCell=getEl('exp_'+player);
	expCell.innerHTML="Loading data...";

	imgCell=getEl('tdImg_'+player);
	//imgCell.width=(layout=="H") ? "190px" : "80px";

	// get expansion row content
	playerStat.expRowObj(player,layout);
	}

/******************************************\
 Delete expansion rows.
\******************************************/
function expDeleteRow(player,layout){
	var plrRowName='tr_'+player;
	var expRowName='te_'+player;
	var killRow=getEl(expRowName);

	// reduce colspan
	var playerRow=getEl(plrRowName);
	playerRow.cells[1].rowSpan=1;
	playerRow.cells[2].rowSpan=1;
	playerRow.cells[3].rowSpan=1;
	
	var tbl=getEl("lbBody");
	tbl.removeChild(killRow);
	}




// COOKIE FUNCTIONALITY


/*********************************************************\
 Examine expansion row request, compare to current
 expansion rows and determines what action to take
\*********************************************************/
var expTrack=readCookie(lbCookieName) || "";
//var expTrack=cookie[lbCookieName] || "";

function tracker(expRow,layout){

	var expRowName='te_'+expRow;

	// if no rows exist, create this row
	if(!expTrack || expTrack==""){
		expTrack=expRowName+"|"+layout;
		expAddRow(expRow,layout);
		document.cookie=(lbCookieName+"="+expTrack+";expires="+lbCookieDie+";path=/");
		return;
		} 
	// else, if this row does not exist, add it
	else if(expTrack.indexOf(expRowName)==-1){
		expTrack +="|"+expRowName+"|"+layout;
		expAddRow(expRow,layout);
		document.cookie=(lbCookieName+"="+expTrack+";expires="+lbCookieDie+";path=/");
		return;
		}
	// else, if this row does exist, check its value
	else{
		var splitTrack=expTrack.split('|');
		var addPipe=0;
		newTrack="";

		var tracklength=splitTrack.length;

		for(i=0;i<tracklength;i+=2){
			if(splitTrack[i]==expRowName){
				// if this is the open row and value, then close it
				if(splitTrack[i+1]==layout){
					expDeleteRow(expRow,layout);
					splitTrack[i]=splitTrack[i+1]="";
					}
				else{
					splitTrack[i+1]=layout;
					expChangeRow(expRow,layout);
					}
				}
			}

		for(i=0;i<tracklength;i+=2){
			if(splitTrack[i]!=""){
				newTrack += splitTrack[i] +'|' +splitTrack[i+1] +'|';
				}
			}
		if(newTrack.charAt(newTrack.length-1)=="|"){
			newTrack=newTrack.substring(0,newTrack.length-1);
			}

		expTrack=newTrack;
		document.cookie=(lbCookieName +"="+expTrack+";expires="+lbCookieDie+";path=/");

		return;
		}
	}

function getExp(){
	var expanded=expTrack;
	var expandedRows=expanded.split('|');
	if(expanded!=""){
		var rowlength=expandedRows.length-1;
		for(var k=0;k<rowlength;k+=2){
			var pID=expandedRows[k].split('_');
			var param1=pID[1];
			var param2=expandedRows[k+1];
			expAddRow(param1,param2);
			}
		}
	}




// SORTING


/********************************\
 Sorting Array Object
\********************************/
var LBData=new Object();
var lookupLBData=new Array();

// GENERATED var sort_pref="r"+"]]><xsl:value-of select="@CurrentRound"/><![CDATA["; //column header preference for sorting.
// GENERATED var previous_sort_pref="r"+"]]><xsl:value-of select="@CurrentRound"/><![CDATA[";


function sortColumns(a,b){
	// compare array values indexed by column headers
	switch (sort_pref){
		case ("today"):
			aa=(a[sort_pref]).replace(/ET/,'');
			bb=(b[sort_pref]).replace(/ET/,'');
			aa=aa.replace(/E/,'0');
			bb=bb.replace(/E/,'0');
			if(lbState.scoringFormat=="FTS"){
				if (isNaN(aa) || a[sort_pref]=='') aa=-100;//bottom
				if (isNaN(bb) || b[sort_pref]=='') bb=-100;
				return parseFloat(bb) - parseFloat(aa);
			}
			else{
				if(aa.indexOf(':') > -1){
					aa=aa.replace(/:/,'');
					if( (Number(aa) >= 100) && (Number(aa) <= 500) ){
						aa=Number(aa)+2000;
					}
				}
				if(bb.indexOf(':') > -1){
					bb=bb.replace(/:/,'');
					if( (Number(bb) >= 100) && (Number(bb) <= 500) ){
						bb=Number(bb)+2000;
					}
				}
				if (isNaN(aa)) aa=1000;//bottom
				if (isNaN(bb)) bb=1000;
				if (a[sort_pref]=='') aa=10000; //WD bottom
				if (b[sort_pref]=='') bb=10000;
				return parseFloat(aa) - parseFloat(bb);
			}

			break;
		case ("money_rank"):
			//numbers or ''
			aa=Number(a[sort_pref]);
			if (isNaN(aa) || a[sort_pref]=='' || a[sort_pref]==0) aa=10000;//bottom
			bb=Number(b[sort_pref]);
			if (isNaN(bb) || b[sort_pref]=='' || b[sort_pref]==0) bb=10000;
			return aa-bb;
			break;
		case ("r1"):
			//numbers or ''
			aa=Number(a[sort_pref]);
			if (isNaN(aa) || a[sort_pref]=='' || a[sort_pref]==0) aa=-10000;//bottom
			bb=Number(b[sort_pref]);
			if (isNaN(bb) || b[sort_pref]=='' || b[sort_pref]==0) bb=-10000;
			return bb-aa;
			break;
		case ("r2"):
			//numbers or ''
			aa=Number(a[sort_pref]);
			if (isNaN(aa) || a[sort_pref]=='' || a[sort_pref]==0) aa=-10000;//bottom
			bb=Number(b[sort_pref]);
			if (isNaN(bb) || b[sort_pref]=='' || b[sort_pref]==0) bb=-10000;
			return bb-aa;
			break;
		case ("r3"):
			//numbers or ''
			aa=Number(a[sort_pref]);
			if (isNaN(aa) || a[sort_pref]=='' || a[sort_pref]==0) aa=-10000;//bottom
			bb=Number(b[sort_pref]);
			if (isNaN(bb) || b[sort_pref]=='' || b[sort_pref]==0) bb=-10000;
			return bb-aa;
			break;
		case ("r4"):
			//numbers or ''
			aa=Number(a[sort_pref]);
			if (isNaN(aa) || a[sort_pref]=='' || a[sort_pref]==0) aa=-10000;//bottom
			bb=Number(b[sort_pref]);
			if (isNaN(bb) || b[sort_pref]=='' || b[sort_pref]==0) bb=-10000;
			return bb-aa;
			break;
		case ("r5"):
			//numbers or ''
			aa=Number(a[sort_pref]);
			if (isNaN(aa) || a[sort_pref]=='' || a[sort_pref]==0) aa=-10000;//bottom
			bb=Number(b[sort_pref]);
			if (isNaN(bb) || b[sort_pref]=='' || b[sort_pref]==0) bb=-10000;
			return bb-aa;
			break;
		case ("r6"):
			//numbers or ''
			aa=Number(a[sort_pref]);
			if (isNaN(aa) || a[sort_pref]=='' || a[sort_pref]==0) aa=-10000;//bottom
			bb=Number(b[sort_pref]);
			if (isNaN(bb) || b[sort_pref]=='' || b[sort_pref]==0) bb=-10000;
			return bb-aa;
			break;
		case ("to_par"):
			aa=(a[sort_pref]).replace(/E/,'0');
			bb=(b[sort_pref]).replace(/E/,'0');
			if(lbState.scoringFormat=="FTS"){
				if (isNaN(aa) || a[sort_pref]=='') aa=-100;//bottom
				if (isNaN(bb) || b[sort_pref]=='') bb=-100;
				return parseFloat(bb) - parseFloat(aa);
			}
			else{
				if (isNaN(aa) || a[sort_pref]=='') aa=1000;//bottom
				if (isNaN(bb) || b[sort_pref]=='') bb=1000;
				return parseFloat(aa) - parseFloat(bb);
			}
			break;
		case ("thru"):
			//alphanum - number or 'F'
			aa=(a[sort_pref]).replace(/F/g,'1000');
			bb=(b[sort_pref]).replace(/F/g,'1000');
			if (isNaN(aa) || a[sort_pref]=='') aa=-1000;//bottom
			if (isNaN(bb) || b[sort_pref]=='') bb=-1000;
			return parseFloat(bb) - parseFloat(aa);
			break;
		case ("start_pos"):
			//alphanum - '3' or 'T3'
			aa=(a[sort_pref]).replace(/T/g,'');
			bb=(b[sort_pref]).replace(/T/g,'');
			if (isNaN(aa) || a[sort_pref]=='') aa=1000;//bottom
			if (isNaN(bb) || b[sort_pref]=='') bb=1000;
			return parseFloat(aa) - parseFloat(bb);
			break;
		case ("first_name"):
		case ("last_name"):
		case ("country"):
			//alpha strings
			if (a[sort_pref]<b[sort_pref]) return -1;
			if (a[sort_pref]>b[sort_pref]) return 1;
			break
	}
	return 0;
}

function sort_lb(pref, data){
	
	var lbArray=(!data) ? LBData : data;
	var default_sort=showDefaultSort(pref);

	//initialize, on page load, default sort_pref already set
	if(!init){
		lbArray=(default_sort) ? lbArray : lbArray.sort(sortColumns)
		LBData=lbArray;
		}
	else if(pref!=sort_pref){ //user initiated sort change
		previous_sort_pref=sort_pref; //keep previous sort pref to change col header class
		sort_pref=pref; //new sort preference
		lbArray=(default_sort) ? lookupLBData : lbArray.sort(sortColumns);
		}
	else{ //no sort change, update has come in
		lbArray=(default_sort) ? lbArray : lbArray.sort(sortColumns);
		LBData=lbArray;
		}

	getColumns(lbArray);//build shell of table with players only
	getExp();			//get expansion rows
	addHighlights(hSavedTrack);
	addHighlights(hTrack);
}


// Get new data for a round
function sort_lb_round( round ){
	lb_round=round.replace(/r/,'');
	getEl(sort_pref).className="header";
	sort_pref="r"+lb_round; //reset sort preference
	draw('lbtitleround', lb_round);
	PGAreq.getLeaderBoard(lb_callback, lb_year, lb_id, lb_round);
	var today_text=(lbState.state=="Official") ? "Rnd"+lb_round : "Today"; 
	var today_link="<a href=\"javascript:sort_lb(\'today\');\">"+today_text+"</a>";
	if(lbState.state=="Official") draw('today',today_link);
	}

// No sorting of original data is done:
function showDefaultSort(pref){
	var x=pref;
	switch (x){
		case "current_pos":
		case "total":
		case "to_par":
		//case "r1":
		//case "r2":
		//case "r3":
		//case "r4":
		//case "r5":
		//case "r6":
			return true;
		break
		}
	if(pref == 'r'+lb_round){
		return true;
	}
	
	return false;
}



// MORE DATA REQUEST CALLS


/******************************************\
 Data Request Callbacks
\******************************************/
var lbt0;
function lb_callback( reply ) {
	//preserve array order in lookup object
	for(var i=0; i<reply.length; i++){
		lookupLBData[i]=reply[i];
		}
	sort_lb( sort_pref, reply );

    // update the 10th row ad
    if(typeof row_10_ad != "undefined" && typeof cnnad_tileID != "undefined") {
        var row10div = getEl("row_10_ad");
        //substitute tileid
		if (row10div) {
       	row10div.innerHTML=row_10_ad.replace("_tile_id_", cnnad_tileID);
    	}
    }
	
    // update the cut row ad
    if(typeof cut_row_ad != "undefined" && typeof cnnad_tileID != "undefined") {
        var cutrowdiv = getEl("cut_row_ad");
        //substitute tileid
		if (cutrowdiv) {
        	cutrowdiv.innerHTML=cut_row_ad.replace("_tile_id_", cnnad_tileID);
    	}
    }
	
	if (updatecount > 1) {
		if (document.referrer) s.referrer = "null";
		s.pageName = s.getPageName() + ":refresh"    // live scoring will have "pgatour : r : leaderboard : refresh";
		s.events="event8";
		void(s.t());

		if (typeof cnnad_tileID != "undefined") {
			cnnad_refreshAds();
		}
	}
	updatecount++;
	
	// update the tile_id
	//cnnad_tileID = cnnad_getID();
	}

//function playoff_callback( reply ){
//	buildPlayoff(reply);
//	}

function fc_callback( reply, id ) {
	playerStat.buildFedexCupPoints( reply, id );
	}
	
function sc_callback( reply, id ) {
	playerStat.buildScorecard( reply, id );
	}

function pbp_callback( reply, id ) {
	playerStat.buildPlaybyPlay( reply, id );
	}

function h_callback( reply, id ) {
	playerStat.buildHoleInfo( reply, id );
	}

function ks_callback( reply, id) {
	playerStat.buildKeyStats( reply, id );
	}

function t_callback( reply ) {
	draw('topData',reply);
	}

function leader_callback ( reply ) {
	draw('tourLBPlayerSpot',reply);
	}

function playoff_callback ( reply ) {
	draw('lbPlayoffContent',reply);
}

function message_callback ( reply ) {
	draw('lbMessageContent',reply);
	}

function weather_callback ( reply ) {
	draw('tourLBWeatherPod',reply);
}

function tourn_keystats_callback ( reply ) {
	draw('KeyStats',reply);
}

function createLBStateObj( reply ) {
	var tmparr=reply.split('\n');
	for (var i in tmparr) {
		var args=tmparr[i].split('=');
		var x=args[0];
		switch (x){
			case "state":
				lbState.state=args[1];
				break;
			case "currentRound":
				lbState.currRound=args[1];
				if(lbState.currRound > current_round){
					lb_round=lbState.currRound;
					draw('lbtitleround', lb_round);
					}
				break;
			case "playoffState":
				lbState.playoffState=args[1];
				break;
			case "scoringFormat":
				lbState.scoringFormat=args[1];
				break;
			}
		}
	}

// requests to ddr methods
function getLastUpdateTime( url ) {
	//var url = "/.element/ssi/sect/1.0/leaderboard/" + lb_year + "/" + lb_id + "/data/lastUpdated.html";
	var url = "/.element/ssi/auto/3.0/sdms/leaderboards/" + lb_id + "/data/" + lb_year + "/lastUpdated.html";
	PGAreq.getHtml( t_callback, url );
}

function getLeader() {
	//var url = "/.element/ssi/sect/1.0/leaderboard/" + lb_year + "/" + lb_id + "/body/leader.html";
	var url = "/.element/ssi/auto/3.0/sdms/leaderboards/" + lb_id + "/body/" + lb_year + "/leader.html";
	PGAreq.getHtml( leader_callback, url );
}

function getPlayoff() {
	//var url = "/.element/ssi/sect/1.0/leaderboard/" + lb_year + "/" + lb_id + "/body/playOff.html";
	var url = "/.element/ssi/auto/3.0/sdms/leaderboards/" + lb_id + "/body/" + lb_year + "/playOff.html";
	PGAreq.getHtml( playoff_callback, url );
}

function getMessage() {
	//var url = "/.element/ssi/sect/1.0/leaderboard/" + lb_year + "/" + lb_id + "/body/message.html";
	var url = "/.element/ssi/auto/3.0/sdms/leaderboards/" + lb_id + "/body/" + lb_year + "/message.html";
	PGAreq.getHtml( message_callback, url );
}

function getWeather() {
	//var url = "/.element/ssi/sect/1.0/tournaments/" + lb_id + "/body/leaderboardWeather.html";
	var url = "/.element/ssi/auto/3.0/sdms/leaderboards/" + lb_id + "/body/current/weather.html";
	PGAreq.getHtml( weather_callback, url );
}

function getTournKeyStats() {
	var url = "/.element/ssi/auto/3.0/sdms/leaderboards/" + lb_id + "/stats/current/keyStats_body.html";
	PGAreq.getHtml( tourn_keystats_callback, url );
}




//     INITIALIZATION
     


// update leaderboard after initialization
var lbArchive='0'; // is this an archived leaderboard?
var updatecount=1;
var myTimer=0;
function setLBUpdateInterval() {
	// Stop timer when state is Official
	//if(lbState.state=="Official" && lbState.playoffState=="Official") clearInterval(myTimer);
	
	// Get tournament info
	PGAreq.getLBState(createLBStateObj, lb_year, lb_id);
	
	// Current Leader or Winner
	getLeader();
	
	// Playoff
	getPlayoff();
	
	// Weather
	getWeather();
	
	// Message
	getMessage();
	
	// Tournament KeyStats
	getTournKeyStats();
	
	// Build leaderboard
	PGAreq.getLeaderBoard(lb_callback, lb_year, lb_id, lb_round);

	// update the leaderboard ad
	
	// Last update time
	getLastUpdateTime();
}

// Get data for the first time on page load
function initializeLeaderboard() {
	PGAreq.getLeaderBoard(lb_callback, lb_year, lb_id, lb_round);
	myTimer=setInterval("setLBUpdateInterval();", 150000);
	//myTimer=setInterval("setLBUpdateInterval();", 30000);
}

//var agt=ua.toLowerCase();
//var badMAC=( MAC && (agt.indexOf("msie 5.0")>0) )  ? 1 : 0;

//if (lbArchive=='0' && !badMAC) window.onload=initializeLeaderboard;
window.onload=initializeLeaderboard;
