/**
 * Fanhandle
 *
 * @category   fhtool
 * @package    Fanhandle
 * @copyright  Copyright (c) 2009 Doug Book.
 */
	var targetLookback = {
		ppt: 17,
		touches: 17,
		points: 0
	};
	var playerList = Array();
	var allPlayers;
	var allPlayersDS;
	var playerDataTable;
	var playerListDataSource = Array();
	var playerInfoSlice;
	var playerListPosition = 'RB';
	var playerName;
	var currentPlayerPos = 'RB';
	var playerId;
	var playerInfo = null;
	var posInfo = null;
	var factorInfo = null;
	var haveNewPlayerInfo = false;
	var originalFactorInfo = null;
	var originalLookback = null;
	var originalFutureDepth = null;
	var rsFactorInfo = null;
	var rsLookback = null;
	var rsFutureDepth = null;
	var currentPlayerTableRecord;
	var slidersHaveChanged = false;
	var futureDepthHasChanged = false;
	var defaultForPosHasChanged = false;
	var forcedRedirect = null;
	var seasonEnd;
	var wideTeam = false;


	// NEWSLIDER
	var factorValueCounts = [ 1, 2, 2, 1 ];
	var chart;
	var chart2;
	var chart3;
	var Layout, Dom, Event, tabView, DDM, TabView;
	var WIDGET_ROOT = jsroot + "/Widgets/";
	var inSliderEvent = false;
	//var slider;
	//var slider2;
	var haveChart = false;
	var lastPlayer;
	var slidersLocked = true;
	var myAnim;
	//var leftAdj = 1;
	//var rightAdj = 1;
	//var thirdAdj = 1;
	var hideOrig = false;
	var hideNeut = true;
	var hideProj = false;
	var hideError = true;
	var useRealSystem = true;
	var lastRealSystem = true;
	var lastCurrentStat;
	//var limit = 7.99;
	var limit = 1000;
	var signif = 1;
	var currentStat = 'ppt';
	//var currentStat = 'touches';
	var yAxisLabels = {
		ppt: "Points<br>Per<br>Touch",
		touches: "Touches",
		points: "Points"
	};
	var projName = {
		ppt: "projPpt",
		touches: "projTouches",
		points: "projPts"
	};
	var futureName = {
		ppt: "futurePpt",
		touches: "futureTouches",
		points: "futurePts"
	};
	var legendNameActual = {
		ppt: "Fantasy Points per Touch   ",
		touches: "Touches   ",
		points: "Points"
	};
	var handleCancel = function() {
		this.cancel();
	};
	var handleSave = function() {
		savePlayer(dontLeaveDialog.pendingPlayer, false);
		this.cancel();
	};
	var handleConfirmSavePosDefSave = function() {
		savePlayer(null, true, true);
		this.cancel();
	};
	var handleDontSave = function() {
		slidersHaveChanged = false;
		futureDepthHasChanged = false;
		defaultForPosHasChanged = false;
		revertPlayer(false);
		selectPlayer(dontLeaveDialog.pendingPlayer);
		this.cancel();
	};
	var handleChangeDepth = function() {
		slidersHaveChanged = true;
		futureDepthHasChanged = true;
		var el = document.getElementById("stringSelect");
		playerInfo.data[el.wkIdx].string = parseInt(el.options[el.selectedIndex].value);
		playerInfo.data[el.wkIdx].dtch = playerInfo.fdtch[playerInfo.data[el.wkIdx].string - 1];
		computeChartValues();
		resortPlayerInList();
		chart.refreshData();
		if(formatid == 1) {
			chart2.refreshData();
			chart3.refreshData();
		}
		this.cancel();
	};
	var dontLeaveButtons = [ { text: "Save", handler: handleSave, isDefault: true },
							{ text: "Continue Without Saving", handler: handleDontSave },
							{ text: "Cancel", handler: handleCancel } ];
	var confirmSavePosDefButtons = [ { text: "Save as Position Default", handler: handleConfirmSavePosDefSave, isDefault: true },
										{ text: "Cancel", handler: handleCancel } ];
	var changeDepthButtons = [ { text: "Change Projected Depth", handler: handleChangeDepth, isDefault: true },
										{ text: "Cancel", handler: handleCancel } ];
	var dontLeaveDialog;
	var confirmSavePosDefDialog;
	var changeDepthDialog;
	var savePlayerInProgress = false;
	
	//var usingHomeFieldAdv = true;
	//var usingOpponentYdsPerRushAllowed = false;
	// Instantiate and configure Loader:
	var maxval = -1000;
	var fullDS;
	var partialDS;
	
	var requiredModules;
	if(premiumTool)
		$requiredModules = ["yahoo", "animation","charts", "dom", "event", "datatable", "datasource", /*"dragdrop", */"fonts", "grids", "layout",
							"container", "resize", /*"tabview",*/ "json", "slider", "button", "autocomplete", "PlayerTable", "MainCSS",
							"premiumtool", "premiumCSS"];
	else
		$requiredModules = ["yahoo", "animation","charts", "dom", "event", "datatable", "datasource", /*"dragdrop", */"fonts", "grids", "layout",
							"container", "resize", /*"tabview",*/ "json", "slider", "button", "autocomplete", "PlayerTable", "MainCSS",
							"freetool", "freeCSS"];
	var loader = new YAHOO.util.YUILoader({
		allowRollup: true,
		require: $requiredModules,
		loadOptional: true,
//		base: '/dbook/js/yui/build/',
		base: jsroot + 'yui/build/',
	    skin: {
	        defaultSkin: 'fanhandle',
			base: 'assets/skins/',
		    overrides: { 
				dragdrop: ['sam'],
				logger: ['sam'],
				menu: ['sam'],
				calendar: ['sam'],
				paginator: ['sam'],
				slider: ['sam']
			}
	    },
		// < php if ($config->showerrors == false){ ?> filter: "debug", <} 

		// The function to call when all script/css resources have been loaded
		onSuccess: function() {
			initToolTips();
			YAHOO.util.Event.onAvailable("x", function () {
															fixLayout();
														}, this);
			//if(premiumTool) {
				//myAnim = new YAHOO.util.Anim('colorlogo', {opacity: { to: 0.0 }}, 5, YAHOO.util.Easing.easeNone);
			//} else {
			YAHOO.util.Dom.removeClass("x", 'fanhandle-hide');
			if(formatid != 1) {
				buildLookbackMenu("lookbackMenu");
				buildSSMenu("SSMenu");
			} else {
				//buildSeasonEndMenu("seasonEndMenu");
			}
			//}
			var el;
			/*
			el = document.getElementById("origbox");
			el.checked = true;
			el = document.getElementById("projbox");
			el.checked = true;
			el = document.getElementById("neutbox");
			el.checked = false;
			*/
			if(el = document.getElementById("posLabelHilites"))
				el.style.display = "block";
			if(el = document.getElementById("errbox"))
				el.checked = false;
			if(el = document.getElementById("testbox"))
				el.checked = false;
			if(el = document.getElementById("pptradio"))
				el.checked = true;
			//computeChartValues();
			//sliderInit();
			//Dom = YAHOO.util.Dom;
			//Event = YAHOO.util.Event;
			//DDM = YAHOO.util.DragDropMgr;
			$dump = YAHOO.lang.dump;
			YAHOO.namespace("Fanhandle");
			
			//YAHOO.util.Dom.setStyle('x', 'backgroundColor', '#ffffd0');
			//YAHOO.util.Dom.setStyle('x', 'background', "url(http://dbook.massillusions.cme/footballfield.jpg)");
			/*
			exampleDS = new YAHOO.util.DataSource(example);
			exampleDS.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
			exampleDS.responseSchema =
				{
					fields: [ "gameno", "home", "source", "neutVal", "proj", "error" ]
				};
	
			makeDS();
			*/
			var el;
			//if(el = document.getElementById(playerName))
				//el.style.color='blue';
			//var firstPlayer = "";
			/*
			if(el = document.getElementById('playerSelect')) {
				var playerSelectOptions = "";
				for(var guy in playerData) {
					if(guy == 'fake') {
						playerSelectOptions += '<option value="' + guy + '">' + "Fake Data" + "</option>\n";
					}
					else if(guy == 'superfake') {
						playerSelectOptions += '<option value="' + guy + '">' + "Incredibly Fake Data" + "</option>\n";
					}
					else if(guy == 'superduperfake') {
						playerSelectOptions += '<option value="' + guy + '">' + "Super Incredibly Fake Data" + "</option>\n";
					} else {
						if(firstPlayer == "") {
							firstPlayer = guy;
							playerName = guy;
						}
						playerSelectOptions += '<option value="' + guy + '">' + guy + "</option>\n";
					}
				}
				el.innerHTML = playerSelectOptions;
				el.selectedIndex = 3;
				*/
			dontLeaveDialog = new YAHOO.widget.Dialog("dontLeaveDialog", { postmethod: "none", buttons: dontLeaveButtons, effect: {effect: YAHOO.widget.ContainerEffect.FADE, duration: 0.5}, modal: true });
			dontLeaveDialog.hide();
			//confirmSavePosDefDialog = new YAHOO.widget.Dialog("confirmSavePosDefDialog", { postmethod: "none", buttons: confirmSavePosDefButtons, effect: {effect: YAHOO.widget.ContainerEffect.FADE, duration: 0.5}, modal: true });
			//confirmSavePosDefDialog.hide();
			changeDepthDialog = new YAHOO.widget.Dialog("changeDepthDialog", { postmethod: "none", buttons: changeDepthButtons, effect: {effect: YAHOO.widget.ContainerEffect.FADE, duration: 0.5}, modal: true });
			changeDepthDialog.hide();
			selectPlayer();
		},
		
		onFailure: function(msg, xhrobj) { 
			var m = "LOAD FAILED: " + msg; 
			// if the failure was from the Connection Manager, the object 
			// returned by that utility will be provided. 
			if (xhrobj) 
			{ 
				m += ", " + YAHOO.lang.dump(xhrobj); 
			} 
			alert(m);     
		}
	});


	loader.addModule({
		name: "PlayerTable",
		type: "js",
	    fullpath: jsroot + "/playertable.js"
	});
	
	loader.addModule({
		name: "freetool",
		type: "js",
	    fullpath: jsroot + "/freetool.js"
	});
	
	loader.addModule({
		name: "premiumtool",
		type: "js",
	    fullpath: jsroot + "/premiumtool.js"
	});
	
	loader.addModule({
		name: "MainCSS",
		type: "css",
	    fullpath: cssroot + "main.css"
	});	
	
	loader.addModule({
		name: "freeCSS",
		type: "css",
	    fullpath: cssroot + "free.css"
	});	
	
	loader.addModule({
		name: "premiumCSS",
		type: "css",
	    fullpath: cssroot + "premium.css"
	});	
	
	
	loader.insert();
	
/*
	function setupLayout()
	{
		Layout = new YAHOO.widget.Layout({
			units: [
				{ position: 'bottom', height: 25, resize: false, body: 'bottom1'},
				{ position: 'center', body: 'center1'}
			]
		});
		
		Layout.render();
	}
*/
	
/*
	function setupTabs()
	{
		//<?= $this->placeholder('tabSetup')->tabLayoutJs; ?>
	}
*/

	function dataTip(item, player, series) 
	{
		if(series.yField == "workaround")
			return null;
		var tip = series.displayName.replace(/ *$/, '') + ": ";
		var num = new Number(item[series.yField]);
		var dispVal = num.toFixed(3);
		tip += dispVal.replace(/\.000$/, '') + "\n";
		tip += player.year + " Week " + player.week + "\n";
		if(player.gameid == 'nogame') {
			tip += 'Bye Week or Did Not Play';
		} else {
			var teams = player.gameid.substr(9);
			var at = teams.indexOf("a");
			tip += teams.substr(0, at) + " at " + teams.substr(at + 2) + "\n";
			if(player.factorInfo[1] == 0)
				tip += "    Home\n";
			else
				tip += "    Away\n";
			if(player.factorInfo[2] == 0)
				tip += "    Grass\n";
			else
				tip += "    Artificial Turf\n";
			tip += playerInfo.name + " (" + player.team + "): " + player.pos + player.string;
			if(player.future && premiumTool && player.pos != 'K' && player.pos != 'DEF')
				tip += "\n\nCLICK DOT TO CHANGE PROJECTED PLAYER DEPTH";
		}
		//alert(playerInfo.data[index].week);
		//return "item: " + item[series.xField] + ", " + item[series.yField] + "; index: " + index + "; series: " + series.displayName;
		return tip;
	}
	
	function dataTipFull(item, index, series) 
	{
		return dataTip(item, playerInfo.data[index], series);
	}
	
	function dataTipPartial(item, index, series) 
	{
		return dataTip(item, playerInfoSlice[index], series);
	}
	
    var didSliderInit = false;
	function sliderInit() {
		if(!didSliderInit) {
			didSliderInit = true;
			//new oppYPCAllowedSlider();
			//new homeFieldAdvSlider();
			//new indoorOutdoorSlider();
			//var randSlider = new randomSlider();
			// NEWSLIDER
			// new playerAvgSlider();
			// new homeFieldAdvSlider();
			// new grassArtSlider();
			mySlider.setLayout(false /* not horizontal */);
			new mySlider("playerAvg", "Overall Average", FACTOR_OVERALL_AVERAGE, 'pptwgt', false);
			new mySlider("homeFieldAdv", "Home or Away", FACTOR_HOME_AWAY, 'pptwgt', false);
			new mySlider("grassArtAdv", "Grass or Artificial", FACTOR_GRASS_ART, 'pptwgt', false);
			new mySlider("oppStrength", "Opponent Strength", FACTOR_OPPONENT_STRENGTH, 'pptwgt', true);
			if(formatid == 1) {
				new mySlider("touchesPlayerAvg", "Overall Average", FACTOR_OVERALL_AVERAGE, 'tchwgt', false);
				new mySlider("touchesHomeFieldAdv", "Home or Away", FACTOR_HOME_AWAY, 'tchwgt', false);
				new mySlider("touchesGrassArtAdv", "Grass or Artificial", FACTOR_GRASS_ART, 'tchwgt', false);
				new mySlider("touchesOppStrength", "Opponent Strength", FACTOR_OPPONENT_STRENGTH, 'tchwgt', true);
			}
			mySlider.initAll();
			//randSlider.initRandom(playerData);
		}
	}
	
	var avgEl;
	var avgPptEl;
	var avgTouchesEl;
	var projInfoEl;
	var nextWeekEl;
	var remainingEl;
	
var S = "; ";
	function computeChartValues(firstIdx, lastIdx)
	{
		var pptlookback = targetLookback['ppt'];
		var tchlookback = targetLookback['touches'];
		if(!avgEl) {
			avgEl = document.getElementById("avg");
			avgPptEl = document.getElementById("avgppt");
			avgTouchesEl = document.getElementById("avgtouches");
			projInfoEl = document.getElementById("projInfo");
			nextWeekEl = document.getElementById("nextWeek");
			remainingEl = document.getElementById("remaining");
		}
		if(!useRealSystem) {
			computeChartValuesOld(firstIdx, lastIdx);
			return;
		}
		var stringIdx;
		var factorIdx;
		var factorValueIdx;
		if(playerInfo == undefined || playerInfo == null)
			return;
		var partial = false;
		if(lastIdx == undefined) {
			firstIdx = 0;
			lastIdx = playerInfo.data.length - 1;
		} else {
			partial = true;
		}
		var lastFutureIdx = lastIdx - (17 - seasonEnd);
		var weeks = lastIdx - firstIdx + 1;
		var errWeekCnt = 0;
		var errPointsWeekCnt = 0;
		var errPptWeekCnt = 0;
		var errTouchesWeekCnt = 0;
		var counts = Array();
		// Zero all counters
		var ppttouchesInit = 0;
		var pptgamesInit = 0;
		var avgpptInit = playerInfo.dppt[0][0];
		if(playerInfo.data[0].future == 1) {
			ppttouchesInit = playerInfo.dppt[0][0];
			pptgamesInit = playerInfo.dppt[0][0];
			avgpptInit = playerInfo.dppt[0][0];
		}
		for(stringIdx = 0; stringIdx < 4; stringIdx++) {
			counts[stringIdx] = Array();
			for(factorIdx in factorInfo[stringIdx]) {
				counts[stringIdx][factorIdx] = Array();
				for(factorValueIdx = 0; factorValueIdx < factorValueCounts[factorIdx]; factorValueIdx++) {
					counts[stringIdx][factorIdx][factorValueIdx] = { pts: 0, touches: 0, ppttouches: ppttouchesInit, pptgames: pptgamesInit, tchgames: 0, avgppt: avgpptInit, avgtouches: 0 };
				}
			}
		}
		// Compute projections for each week.
		var totErr = 0;
		var curErr;
		var totPointsErr = 0;
		var curPointsErr;
		var totPptErr = 0;
		var curPptErr;
		var totTouchesErr = 0;
		var curTouchesErr;
		var haveNext = false;
		var nextPts = 0;
		var totFuturePts = 0;
		var pctSlider;
		playerInfo.firstFutureIdx = -1;
		for(var wkIdx = firstIdx; wkIdx < lastIdx; wkIdx++) {
			stringIdx = playerInfo.data[wkIdx].string - 1;
			// Maintain running total of points, touches and games for each factor/factorValue combo.
			if(playerInfo.data[wkIdx].future == 0) {
				for(factorIdx in factorInfo[stringIdx]) {
					pctSlider = mySlider.isPctSlider(factorIdx);
					// factorId 0 is overall player average and doesn't have info in playerInfo.data.factorInfo.
					if(factorIdx == FACTOR_OVERALL_AVERAGE || pctSlider) {
						factorValueIdx = 0;
					} else {
						factorValueIdx = playerInfo.data[wkIdx].factorInfo[factorIdx];
					}
					if(factorValueIdx == undefined)
						continue;
					if(!pctSlider) {
						counts[0][factorIdx][factorValueIdx].pts += playerInfo.data[wkIdx].points;
						counts[stringIdx][factorIdx][factorValueIdx].touches += playerInfo.data[wkIdx].touches;
						if(playerInfo.data[wkIdx].touches > 0) {
							counts[0][factorIdx][factorValueIdx].ppttouches += playerInfo.data[wkIdx].touches;
							counts[0][factorIdx][factorValueIdx].pptgames++;
						}
						if(playerInfo.data[wkIdx].gameid != "nogame")
							counts[stringIdx][factorIdx][factorValueIdx].tchgames++;
						if(pptlookback != 0) {
							var elimIdx = (wkIdx - firstIdx) - pptlookback;
							if(elimIdx >= firstIdx) {
								var elimStringIdx = playerInfo.data[elimIdx].string - 1;
								var elimFactorValueIdx;
								if(factorIdx == FACTOR_OVERALL_AVERAGE || pctSlider) {
									elimFactorValueIdx = 0;
								} else {
									elimFactorValueIdx = playerInfo.data[elimIdx].factorInfo[factorIdx];
								}
								if(elimFactorValueIdx != undefined) {
									counts[0][factorIdx][elimFactorValueIdx].pts -= playerInfo.data[elimIdx].points;
									if(playerInfo.data[elimIdx].touches > 0) {
										counts[0][factorIdx][elimFactorValueIdx].ppttouches -= playerInfo.data[elimIdx].touches;
										counts[0][factorIdx][elimFactorValueIdx].pptgames--;
									}
									var tch = counts[0][factorIdx][elimFactorValueIdx].ppttouches;
									if(tch == 0) {
										counts[0][factorIdx][elimFactorValueIdx].avgppt = 0;
									} else {
										counts[0][factorIdx][elimFactorValueIdx].avgppt = counts[0][factorIdx][elimFactorValueIdx].pts / tch;
									}
									if(pptlookback >= 5 && (pptgames = counts[0][factorIdx][elimFactorValueIdx].pptgames) < 5) {
										// Average ppt is based on less than 5 games' data.  Blend the actual data with global defaults.
										counts[0][factorIdx][elimFactorValueIdx].avgppt = (counts[0][factorIdx][elimFactorValueIdx].avgppt * pptgames/5.0) +
																						(playerInfo.dppt[factorIdx][elimFactorValueIdx] * (5 - pptgames)/5.0);
									}
								}
							}
						}
						if(tchlookback != 0) {
							var elimIdx = (wkIdx - firstIdx) - tchlookback;
							if(elimIdx >= firstIdx) {
								var elimStringIdx = playerInfo.data[elimIdx].string - 1;
								var elimFactorValueIdx;
								if(factorIdx == FACTOR_OVERALL_AVERAGE || pctSlider) {
									elimFactorValueIdx = 0;
								} else {
									elimFactorValueIdx = playerInfo.data[elimIdx].factorInfo[factorIdx];
								}
								if(elimFactorValueIdx != undefined) {
									//counts[elimStringIdx][factorIdx][elimFactorValueIdx].pts -= playerInfo.data[elimIdx].points;
									counts[elimStringIdx][factorIdx][elimFactorValueIdx].touches -= playerInfo.data[elimIdx].touches;
									if(playerInfo.data[elimIdx].gameid != "nogame")
										counts[elimStringIdx][factorIdx][elimFactorValueIdx].tchgames--;
									var tchgames = counts[elimStringIdx][factorIdx][elimFactorValueIdx].tchgames;
									if(tchgames == 0) {
										//With insufficient data, use the teams average for that sting and position in the previous year.
										counts[elimStringIdx][factorIdx][elimFactorValueIdx].avgtouches = playerInfo.data[elimIdx].dtch;
//alert("elim: " + elimIdx + "(" + elimStringIdx + "): " + playerInfo.data[elimIdx].dtch);
										//counts[elimStringIdx][factorIdx][elimFactorValueIdx].avgtouches = 0;
									} else {
										counts[elimStringIdx][factorIdx][elimFactorValueIdx].avgtouches = counts[elimStringIdx][factorIdx][elimFactorValueIdx].touches / tchgames;
									}
								}
							}
						}
						// Recompute avgppt and avgtouches for each factor/factorValue.
						var tchgames = counts[stringIdx][factorIdx][factorValueIdx].tchgames;
						if(tchgames == 0) {
							//With insufficient data, use the teams average for that sting and position in the previous year.
							counts[stringIdx][factorIdx][factorValueIdx].avgtouches = playerInfo.data[wkIdx].dtch;
//alert("week: " + wkIdx + "(" + stringIdx + "): " + playerInfo.data[wkIdx].dtch);
							//counts[stringIdx][factorIdx][factorValueIdx].avgtouches = 0;
						} else {
							counts[stringIdx][factorIdx][factorValueIdx].avgtouches = counts[stringIdx][factorIdx][factorValueIdx].touches / tchgames;
						}
						var tch = counts[0][factorIdx][factorValueIdx].ppttouches;
						if(tch == 0) {
							counts[0][factorIdx][factorValueIdx].avgppt = 0;
						} else {
							counts[0][factorIdx][factorValueIdx].avgppt = counts[0][factorIdx][factorValueIdx].pts / tch;
						}
						if((pptlookback == 0 || pptlookback >= 5) && (pptgames = counts[0][factorIdx][factorValueIdx].pptgames) < 5) {
							// Average ppt is based on less than 5 games' data.  Blend the actual data with global defaults.
							counts[0][factorIdx][factorValueIdx].avgppt = (counts[0][factorIdx][factorValueIdx].avgppt * pptgames/5.0) +
																			(playerInfo.dppt[factorIdx][factorValueIdx] * (5 - pptgames)/5.0);
						}
					}
				}
			} else {
				if(playerInfo.firstFutureIdx == -1)
					playerInfo.firstFutureIdx = wkIdx;
			}
			var saveWkIdx = wkIdx;
			var hackStartIdx = wkIdx;
			if(wkIdx == 0 && playerInfo.data[0].future == 1)
				hackStartIdx--;
			for(wkIdx = hackStartIdx; wkIdx <= saveWkIdx; wkIdx++) {
				// Project next week's info based on current values in "counts", conditions of next week's game, and sliders.
				var totPpt = 0;
				var totWgtPpt = 0;
				var totTouches = 0;
				var totWgtTouches = 0;
				var nextWkFactorVal;
				var pptMultiplier = 1.0;
				var tchMultiplier = 1.0;
				for(factorIdx in factorInfo[stringIdx]) {
					if(factorIdx == FACTOR_OVERALL_AVERAGE || playerInfo.data[wkIdx + 1].factorInfo[factorIdx] != undefined){
						pctSlider = mySlider.isPctSlider(factorIdx);
						if(factorIdx == FACTOR_OVERALL_AVERAGE || pctSlider)
							nextWkFactorVal = 0;
						else
							nextWkFactorVal = playerInfo.data[wkIdx + 1].factorInfo[factorIdx];
						var nextWkStringIdx = playerInfo.data[wkIdx + 1].string - 1;
						var pptwgt = factorInfo[0][factorIdx].pptwgt;
						var tchwgt = factorInfo[nextWkStringIdx][factorIdx].tchwgt;
						if(pctSlider) {
							var multPpt = playerInfo.data[wkIdx + 1].factorInfo[factorIdx].pctppt;
							var diff = 1 - multPpt;
							diff *= pptwgt/100;
							pptMultiplier *= 1 - diff;
							
							var multTch = playerInfo.data[wkIdx + 1].factorInfo[factorIdx].pcttouches;
							diff = 1 - multTch;
							diff *= tchwgt/100;
							tchMultiplier *= 1 - diff;
						} else {
							totWgtPpt += pptwgt;
							totPpt += counts[0][factorIdx][nextWkFactorVal].avgppt * pptwgt;
							totWgtTouches += tchwgt;
							if(counts[nextWkStringIdx][factorIdx][nextWkFactorVal].tchgames == 0)
								totTouches += playerInfo.data[wkIdx + 1].dtch * tchwgt;
							else
								totTouches += counts[nextWkStringIdx][factorIdx][nextWkFactorVal].avgtouches * tchwgt;

	//if(wkIdx > 76 && nextWkStringIdx == 0)alert(playerInfo.data[wkIdx+1].gameid + " " + (wkIdx + 1) + ": " + nextWkStringIdx + "; " + factorIdx + "/" + nextWkFactorVal + ": " +  counts[nextWkStringIdx][factorIdx][nextWkFactorVal].avgtouches + " * " + tchwgt);
						}
					}
//if(factorIdx == 0 && playerInfo.data[wkIdx + 1].future == 1)alert(counts[0][0][0].avgppt + S + pptwgt);
//if(factorIdx == 0 && playerInfo.data[wkIdx + 1].future == 1)alert(counts[0][0][0].avgtouches + S + tchwgt);
				}
				//hack hack hack
				if(wkIdx == -1) {
					pptMultiplierAlt = pptMultiplier;
					tchMultiplierAlt = tchMultiplier;
					totWgtPptAlt = totWgtPpt;
					totPptAlt = totPpt;
					totWgtTouchesAlt = totWgtTouches;
					totTouchesAlt = totTouches;					
				}
			}
			wkIdx = saveWkIdx;
			//dbook should use default instead !!
			 if(playerInfo.data[wkIdx + 1].future) {
				saveWkIdx = wkIdx;
				hackStartIdx = wkIdx;
				if(wkIdx == 0 && playerInfo.data[0].future == 1)
					hackStartIdx--;
				for(wkIdx = hackStartIdx; wkIdx <= saveWkIdx; wkIdx++) {
					if(wkIdx == -1) {
						pptMultiplierAlt2 = pptMultiplier;
						tchMultiplierAlt2 = tchMultiplier;
						totWgtPptAlt2 = totWgtPpt;
						totPptAlt2 = totPpt;
						totWgtTouchesAlt2 = totWgtTouches;
						totTouchesAlt2 = totTouches;					
						pptMultiplier = pptMultiplierAlt;
						tchMultiplier = tchMultiplierAlt;
						totWgtPpt = totWgtPptAlt;
						totPpt = totPptAlt;
						totWgtTouches = totWgtTouchesAlt;
						totTouches = totTouchesAlt;					
					}
					if(wkIdx < lastFutureIdx) {
						if(playerInfo.data[wkIdx + 1].gameid == 'nogame' || playerInfo.data[wkIdx + 1].touches == 0)
							playerInfo.data[wkIdx + 1].futurePpt = 0;
						else
							playerInfo.data[wkIdx + 1].futurePpt = (totWgtPpt ? (totPpt / totWgtPpt) : 0) * pptMultiplier;
//alert("ppt: " + playerInfo.data[wkIdx + 1].futurePpt + S + totPpt + S + totWgtPpt + S + pptMultiplier);
						var futurePtsFrac;
						if(playerInfo.data[wkIdx + 1].gameid == 'nogame') {
							playerInfo.data[wkIdx + 1].futureTouches = 0;
							futurePtsFrac = 0;
						} else {
							var futureTouches = (totWgtTouches ? (totTouches / totWgtTouches) : 0) * tchMultiplier;
//alert("tch: " + futureTouches + S + totTouches + S + totWgtTouches + S + tchMultiplier);
							playerInfo.data[wkIdx + 1].futureTouches = futureTouches;
							if(futureTouches == 0)
								playerInfo.data[wkIdx + 1].futurePpt = 0;
							futurePtsFrac = playerInfo.data[wkIdx + 1].futurePpt * playerInfo.data[wkIdx + 1].futureTouches;
						}
						//playerInfo.data[wkIdx + 1].futurePts = Math.round(futurePtsFrac);
						playerInfo.data[wkIdx + 1].futurePts = futurePtsFrac;
						if(!haveNext) {
	//alert("ppt: " + playerInfo.data[wkIdx + 1].futurePpt + "; touches: " + playerInfo.data[wkIdx + 1].futureTouches);
							haveNext = true;
							nextPts = playerInfo.data[wkIdx + 1].futurePts;
						}
						totFuturePts += futurePtsFrac;
					} else {
						playerInfo.data[wkIdx + 1].futurePpt = undefined;
						playerInfo.data[wkIdx + 1].futureTouches = undefined;
						playerInfo.data[wkIdx + 1].futurePts = undefined;
						if(!haveNext) {
							haveNext = true;
							nextPts = 0;
						}
					}
					if(wkIdx == -1) {
						pptMultiplier = pptMultiplierAlt2;
						tchMultiplier = tchMultiplierAlt2;
						totWgtPpt = totWgtPptAlt2;
						totPpt = totPptAlt2;
						totWgtTouches = totWgtTouchesAlt2;
						totTouches = totTouchesAlt2;					
					}
				}
				wkIdx = saveWkIdx;
			} else {
				if(playerInfo.data[wkIdx + 1].gameid == 'nogame' || playerInfo.data[wkIdx + 1].touches == 0)
					playerInfo.data[wkIdx + 1].projPpt = 0;
				else
					playerInfo.data[wkIdx + 1].projPpt = (totWgtPpt ? (totPpt / totWgtPpt) : 0) * pptMultiplier;
				var projPtsFrac;
				if(playerInfo.data[wkIdx + 1].gameid == 'nogame') {
					playerInfo.data[wkIdx + 1].projTouches = 0;
					projPtsFrac = 0;
				} else {
					playerInfo.data[wkIdx + 1].projTouches = (totWgtTouches ? (totTouches / totWgtTouches) : 0) * tchMultiplier;
					projPtsFrac = playerInfo.data[wkIdx + 1].projPpt * playerInfo.data[wkIdx + 1].projTouches;
				}
				curPptErr = Math.abs(playerInfo.data[wkIdx + 1].projPpt - playerInfo.data[wkIdx + 1].ppt);
				curTouchesErr = Math.abs(playerInfo.data[wkIdx + 1].projTouches - playerInfo.data[wkIdx + 1].touches);
				curPointsErr = Math.abs(projPtsFrac - playerInfo.data[wkIdx + 1].points);
				switch(currentStat) {
					case 'ppt': 
						curErr = curPptErr;
						break;
						
					case 'touches': 
						curErr = curTouchesErr;
						break;
						
					case 'points': 
						curErr = curPointsErr;
						break;
				}
				playerInfo.data[wkIdx + 1].error = curErr;
				// if(wkIdx - firstIdx + 1 - lookback >= 0)
				//if(lookback == 0 || (wkIdx >= (lastIdx - lookback)))
				var lookback;
				if(currentStat == 'ppt') {
					lookback = pptlookback;
				}
				else if(currentStat == 'touches') {
					lookback = tchlookback;
				} else {
					lookback = Math.min(pptlookback, tchlookback);
					if(lookback == 0)
						lookback = Math.max(pptlookback, tchlookback);
				}
				if(lookback == 0 ||
					(wkIdx + 1 + lookback) >= lastIdx ||
					playerInfo.data[wkIdx + 1 + lookback].future == 1)
				{
					totErr += curErr;
					errWeekCnt++;
					totPptErr += curPptErr;
					errPptWeekCnt++;
					totTouchesErr += curTouchesErr;
					errTouchesWeekCnt++;
					totPointsErr += curPointsErr;
					errPointsWeekCnt++;
				}
				playerInfo.data[wkIdx + 1].projPts = projPtsFrac;
			}
		}
		var num;
		if(avgEl) {
			if(premiumTool)
				num = new Number(errPointsWeekCnt ? totPointsErr/errPointsWeekCnt : 0);
			else
				num = new Number(errWeekCnt ? totErr/errWeekCnt : 0);
			avgEl.innerHTML = num.toPrecision(3);
		}
		if(avgPptEl) {
			num = new Number(errPptWeekCnt ? totPptErr/errPptWeekCnt : 0);
			avgPptEl.innerHTML = num.toPrecision(3);
		}
		if(avgTouchesEl) {
			num = new Number(errTouchesWeekCnt ? totTouchesErr/errTouchesWeekCnt : 0);
			avgTouchesEl.innerHTML = num.toPrecision(3);
		}
		if(projInfoEl) {
			projInfoEl.innerHTML = "Next Week: " + Math.round(nextPts) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Remaining: " + Math.round(totFuturePts);
		}
		if(nextWeekEl) {
			nextWeekEl.innerHTML = Math.round(nextPts);
		}
		if(remainingEl) {
			remainingEl.innerHTML = Math.round(totFuturePts);
		}

		if(currentPlayerTableRecord != undefined  && currentPlayerTableRecord != null) {
			playerDataTable.updateCell(currentPlayerTableRecord, 'ptsnext', Math.round(nextPts));
			playerDataTable.updateCell(currentPlayerTableRecord, 'ptsleft', Math.round(totFuturePts));
			updateProjectedPoints(playerInfo.playerid, currentPlayerPos, Math.round(nextPts), Math.round(totFuturePts))
		}
	}
	
	function resetData(pid, sameSliders, force) {
		var el;
		var smallLabel;
		var adjusting = ((currentStat == 'ppt') ? 'pptwgt' : 'tchwgt');
		if(currentStat != 'points') {
			if(formatid != 1)
				mySlider.setAdjusting(adjusting);
			if(lastCurrentStat != undefined && lastCurrentStat != currentStat) {
				sameSliders = false;
			}
			lastCurrentStat = currentStat;
			smallLabel = 'Points';
			mySlider.unlockAllSliders();
		} else {
			//mySlider.lockAllSliders();
			if(lastCurrentStat == 'ppt') {
				smallLabel = 'Pts/Touch';
			} else {
				smallLabel = 'Touches';
			}
		}
		el = document.getElementById("lookbackSelect");
		targetLookback['points'] = Math.min(targetLookback['ppt'], targetLookback['touches']);
		if(targetLookback['points'] == 0)
			targetLookback['points'] = Math.max(targetLookback['ppt'], targetLookback['touches']);
		var lookbackIdx = targetLookback[currentStat];
		if(lookbackIdx == 0)
			lookbackIdx = 19;
		else if(lookbackIdx <= 17)
			lookbackIdx--;
		else {
			lookbackIdx = Math.floor(lookbackIdx/17);
			lookbackIdx += 15;
		}
		if(!premiumTool && lookbackIdx > 16)
			lookbackIdx = 16;
		if(el)
			el.selectedIndex = lookbackIdx;
		else if(formatid == 1) {
		/*
			var lblabel;
			if(lookbackIdx == 0)
				lblabel = "1 Week";
			else if(lookbackIdx < 17)
				lblabel = "" + (lookbackIdx + 1) + " Weeks";
			else if(lookbackIdx < 19)
				lblabel = "" + (lookbackIdx - 15) + " Years";
			else
				lblabel = "Career";
			setLookbackMenuLabel(lblabel);
		*/
		}
		else if(formatid != 3) {
			setLookbackMenuLabel(lookbackIdx + 1);
		}
		//if(lastRealSystem != useRealSystem) {
			//lastRealSystem = useRealSystem;
		mySlider.fixSliderInfos(adjusting);
		//}
		if(formatid == 1) {
			if(el = document.getElementById("chartActualLabel2")) {
				el.innerHTML = smallLabel;
			}
			if(el = document.getElementById("chartProjLabel2")) {
				el.innerHTML = 'Proj ' + smallLabel;
			}
			if(el = document.getElementById("chartFutureLabel2")) {
				el.innerHTML = 'Future ' + smallLabel;
			}
		} else {
			if(el = document.getElementById("legendppt")) {
				el.style.zIndex = 1;
			}
			if(el = document.getElementById("legendtouches")) {
				el.style.zIndex = 1;
			}
			if(el = document.getElementById("legendpoints")) {
				el.style.zIndex = 1;
			}
			if(el = document.getElementById("legend" + currentStat)) {
				el.style.zIndex = 2;
			}
		}
		haveChart = false;
		if(playerInfo == undefined || playerInfo == null)
			return;
		playerId = pid;
		if(el = document.getElementById("yAxisLabel"))
			el.innerHTML = yAxisLabels[currentStat];
		if(playerInfo.data[0].gameno == undefined) {
			for(var idx in playerInfo.data) {
				//var shortyear = substr("" + playerInfo.data[idx].year, 2);
				//var shortyear = ("" + playerInfo.data[idx].year).substr(2);
				playerInfo.data[idx].gameno = playerInfo.data[idx].year + "." + playerInfo.data[idx].week;
				//playerInfo.data[idx].gameno = shortyear + "." + playerInfo.data[idx].week;
			}
		}
		for(var idx in playerInfo.data) {
			playerInfo.data[idx].statsrc = playerInfo.data[idx][currentStat];
		}
		if(sameSliders == undefined || !sameSliders) {	
			mySlider.optimizing = true;
			sameSliders = false;
			for(var idx in mySlider.sliderList) {
				//mySlider.sliderList[idx].adj = 1;
				//mySlider.sliderList[idx].adj2 = 1;
				var sldr = mySlider.sliderList[idx];
				var newval = factorInfo[0][sldr.factorId][sldr.adjusting];
				if(formatid == 1)
					newval *= 0.5;
				else
					newval *= 0.3;
				sldr.slider.setValue(Math.round(-newval), true, true, false);
			}
			mySlider.optimizing = false;
			computeChartValues();
			//for(var idx in mySlider.sliderList) {
				//mySlider.sliderList[idx].slider.setValue(50, true, true, false);
			//}
		}
		// Need to wait till after the last "setValue(.....force)"  before locking sliders.
		if(currentStat == 'points')
			mySlider.lockAllSliders();
		if(sameSliders && force != undefined && force) {	
			computeChartValues();
		}
			var firstVisibleIdx = playerInfo.firstFutureIdx - 17;
			if(firstVisibleIdx < 0)
				firstVisibleIdx = 0;
			playerInfoSlice = playerInfo.data.slice(firstVisibleIdx);
			playerInfoSlice[0].workaround = 0.5;
			partialDS = new YAHOO.util.DataSource(playerInfoSlice);
			playerInfo.firstVisibleIdx = firstVisibleIdx;
		partialDS.responseType = YAHOO.util.LocalDataSource.TYPE_JSARRAY;
		partialDS.responseSchema =
			{
				//fields: [ "gameno", "home", "source", "neutVal", "projPpt", "futurePpt", "error", "points", "projPts", "projTouches", "futurePts", "futureTouches", "touches", "ppt" ]
				fields: [ "gameno", "projPpt", "futurePpt", "error", "points", "projPts", "projTouches", "futurePts", "futureTouches", "touches", "ppt", "statsrc", "workaround" ]
			};
		if(premiumTool) {
			playerInfo.data[0].workaround = 0.5;
			fullDS = new YAHOO.util.DataSource(playerInfo.data);
			fullDS.responseType = partialDS.responseType;
			fullDS.responseSchema = partialDS.responseSchema;
		}

		makeDS();
		//if(haveChart) {
			//chart.refreshData();
			//chart2.refreshData();
		// }
		//var el = document.getElementById(lastPlayer);
		//el.style.color='#ffffd0';
		
		//el = document.getElementById(pid);
		//el.style.color='blue';
		lastPlayer = pid;
	}

	function computeChartValuesOld(firstIdx, lastIdx)
	{
		var pptlookback = targetLookback['ppt'];
		var tchlookback = targetLookback['touches'];
		if(playerInfo == undefined || playerInfo == null)
			return;
		var pptRunning = Array();
		var ppttchRunning = Array();
		var tchRunning = Array();
		var pptgameCount = Array();
		var tchgameCount = Array();
		var ignoreCount = 0;
		var adj;
		var pptAvg = Array();
		var tchAvg = Array();
		var ppttchAvg = Array();
		var avgErr = 0;
		var partial = false;
		var curErr;
		var totErr = 0;
		var nextPts;
		var totFuturePts = 0;
		var haveNext = false;
		if(lastIdx == undefined) {
			firstIdx = 0;
			lastIdx = playerInfo.data.length - 1;
		} else {
			partial = true;
		}
		var weeks = lastIdx - firstIdx + 1;
		var errWeekCnt = 0;
		var pptAdj = 1;
		var tchAdj = 1;
		if(playerInfo.data[firstIdx].gameid != 'nogame')
			for(var sliderIdx in mySlider.sliderList) {
				adjustments = mySlider.sliderList[sliderIdx].adjust(playerInfo.data[firstIdx]);
				pptAdj *= adjustments.pptAdj;
				tchAdj *= adjustments.tchAdj;
//if(wkIdx == 0)alert(sliderIdx + ": " + adjustments.pptAdj + "; " + adjustments.tchAdj + "; " + pptAdj + "; " + tchAdj);
			}
		for(wkIdx = firstIdx; wkIdx <= lastIdx; wkIdx++) {
			var string = playerInfo.data[wkIdx].string;
			if(pptRunning[string] == undefined) {
				pptRunning[string] = 0;
				tchRunning[string] = 0;
				ppttchRunning[string] = 0;
				pptAvg[string] = 0;
				tchAvg[string] = 0;				
				ppttchAvg[string] = 0;				
			}
			//if(playerInfo.data[idx].source > limit)
				//playerInfo.data[idx].source = limit;
			if(playerInfo.data[wkIdx].future) {
				playerInfo.data[wkIdx].neutPpt = playerInfo.data[wkIdx - 1].neutPpt;
				playerInfo.data[wkIdx].neutTouches = playerInfo.data[wkIdx - 1].neutTouches;
			} else {
				playerInfo.data[wkIdx].neutPpt = playerInfo.data[wkIdx].ppt;
				playerInfo.data[wkIdx].neutTouches = playerInfo.data[wkIdx].touches;
			}
			if(!playerInfo.data[wkIdx].future) {
				playerInfo.data[wkIdx].neutPpt /= pptAdj;
				playerInfo.data[wkIdx].neutTouches /= tchAdj;
				//if(playerInfo.data[wkIdx].neutVal > limit)
					//playerInfo.data[wkIdx].neutVal = limit;
				//if(playerInfo.data[wkIdx].neutVal > maxval)
					//maxval = playerInfo.data[wkIdx].neutVal;
				pptRunning[string] += playerInfo.data[wkIdx].neutPpt;
				tchRunning[string] += playerInfo.data[wkIdx].neutTouches;
				if(pptgameCount[string] == undefined) {
					pptgameCount[string] = 1;
					tchgameCount[string] = 1;
				} else {
					pptgameCount[string]++;
					tchgameCount[string]++;
				}
				if(pptlookback) {
					var elimIdx = (wkIdx - firstIdx) - pptlookback;
					if(elimIdx >= firstIdx) {
					var elimString = playerInfo.data[elimIdx].string;
						pptRunning[elimString] -= playerInfo.data[elimIdx].neutPpt;
						//tchRunning[elimString] -= playerInfo.data[elimIdx].neutTouches;
						if(pptgameCount[elimString] == undefined)
							pptgameCount[elimString] = 1;
						else
							pptgameCount[elimString]--;
					}
				}
				if(tchlookback) {
					var elimIdx = (wkIdx - firstIdx) - tchlookback;
					if(elimIdx >= firstIdx) {
					var elimString = playerInfo.data[elimIdx].string;
						//pptRunning[elimString] -= playerInfo.data[elimIdx].neutPpt;
						tchRunning[elimString] -= playerInfo.data[elimIdx].neutTouches;
						if(tchgameCount[elimString] == undefined)
							tchgameCount[elimString] = 1;
						else
							tchgameCount[elimString]--;
					}
				}
				pptAvg[string] = pptRunning[string]/pptgameCount[string];
				tchAvg[string] = tchRunning[string]/tchgameCount[string];
			}
			if(wkIdx < lastIdx && pptAvg[playerInfo.data[wkIdx + 1].string] != undefined) {
				string = playerInfo.data[wkIdx + 1].string;
				pptAdj = 1;
				tchAdj = 1;
				if(playerInfo.data[wkIdx + 1].gameid != 'nogame')
					for(var sliderIdx in mySlider.sliderList) {
						adjustments = mySlider.sliderList[sliderIdx].adjust(playerInfo.data[wkIdx + 1]);
						pptAdj *= adjustments.pptAdj;
						tchAdj *= adjustments.tchAdj;
					}
				var ppt = pptAvg[string] * pptAdj;
				var tch = tchAvg[string] * tchAdj;
				var pts;
				if(playerInfo.data[wkIdx + 1].gameid == 'nogame')
					pts = 0;
				else
					pts = ppt * tch;
				if(playerInfo.data[wkIdx + 1].future) {
					playerInfo.data[wkIdx + 1].futurePpt = ppt;
					playerInfo.data[wkIdx + 1].futureTouches = tch;
					playerInfo.data[wkIdx + 1].futurePts = Math.round(pts);
					if(!haveNext) {
						haveNext = true;
						nextPts = playerInfo.data[wkIdx + 1].futurePts;
					}
					totFuturePts += pts;
				} else {
					playerInfo.data[wkIdx + 1].projPpt = ppt;
					playerInfo.data[wkIdx + 1].projTouches = tch;
					playerInfo.data[wkIdx + 1].projPts = pts;
					switch(currentStat) {
						case 'ppt': 
							curErr = Math.abs(playerInfo.data[wkIdx + 1].projPpt - playerInfo.data[wkIdx + 1].ppt);
							break;
							
						case 'touches': 
							curErr = Math.abs(playerInfo.data[wkIdx + 1].projTouches - playerInfo.data[wkIdx + 1].touches);
							break;
							
						case 'points': 
							curErr = Math.abs(pts - playerInfo.data[wkIdx + 1].points);
							break;
					}
					playerInfo.data[wkIdx + 1].error = curErr;
					//if(wkIdx - firstIdx + 1 - lookback >= 0) {
					var lookback;
					if(currentStat == 'ppt') {
						lookback = pptlookback;
					}
					else if(currentStat == 'touches') {
						lookback = tchlookback;
					} else {
						lookback = Math.min(pptlookback, tchlookback);
						if(lookback == 0)
							lookback = Math.max(pptlookback, tchlookback);
					}
					if(lookback == 0 ||
						(wkIdx + lookback) >= lastIdx ||
						playerInfo.data[wkIdx + lookback].future == 1)
					{
						totErr += curErr;
						errWeekCnt++;
					}
				}
			} else {
				if(wkIdx < lastIdx)
					playerInfo.data[wkIdx + 1].error = 0;
			}
			if(avgEl) {
				var num = new Number(errWeekCnt ? totErr/errWeekCnt : 0);
				if(premiumTool)
					avgEl.innerHTML = num.toPrecision(3) + "<br>Avg Err";
				else
					avgEl.innerHTML = num.toPrecision(3);
				}
			if(projInfoEl) {
				projInfoEl.innerHTML = "Next Week: " + Math.round(nextPts) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Remaining: " + Math.round(totFuturePts);
			}
			if(currentPlayerTableRecord != undefined  && currentPlayerTableRecord != null) {
				playerDataTable.updateCell(currentPlayerTableRecord, 'ptsnext', Math.round(nextPts));
				playerDataTable.updateCell(currentPlayerTableRecord, 'ptsleft', Math.round(totFuturePts));
				updateProjectedPoints(playerInfo.playerid, currentPlayerPos, Math.round(nextPts), Math.round(totFuturePts))
			}
/*
			if(count) {
				avg = running/count;
				playerInfo.data[idx].proj = avg * (1/adj);
//if(partial && idx == 2 && lastIdx == 2)alert("proj: " + playerInfo.data[idx].proj + "; avg: " + avg + "; adj: " + adj);
//debug
//if(partial && idx == 3 && lastIdx == 3)gooble = "proj: " + playerInfo.data[idx].proj + "; avg: " + avg + "; adj: " + adj;
				if(playerInfo.data[idx].gameno == 'Pj') {
					//var sum = 0;
					var totCount = count + ignoreCount;
					avgErr = toterr/(totCount - 1);
*/
					/*
					for(idx2 = 1; idx2 < totCount; idx2++) {
						var diff = playerInfo.data[idx2].error - avg;
						sum += (diff * diff);
					}
					var stddev = Math.sqrt(sum/(totCount - 1));
					playerInfo.data[idx].error = stddev;
					if(el = document.getElementById("stddev")) {
						var num = new Number(stddev);
						el.innerHTML = num.toPrecision(3) + "<br>Std Dev";
					}
					*/
/*
					if(el = document.getElementById("avg")) {
						var num = new Number(avgErr);
						el.innerHTML = num.toPrecision(3) + "<br>Avg";
					}
				} else {
					playerInfo.data[idx].error = Math.abs(playerInfo.data[idx].proj - playerInfo.data[idx].source);
					if(!partial || (idx != lastIdx)) {
						toterr += playerInfo.data[idx].error;
					}
				}
			}
			if(playerInfo.data[idx].touches >= signif) {
				count++;
				running += playerInfo.data[idx].neutVal;
			} else {
				ignoreCount++;
			}
		}
		if(partial) {
			var totCount = count + ignoreCount;
			if(totCount > 2)
				avgErr = toterr/(totCount - 2);
//if(lastIdx ==3) alert("count: " + count + "; totCount: " + totCount + "; toterr:  " + toterr + "; avgErr: " + avgErr);
*/
		}
		//return avgErr;
	}
/*	
	function resetDataOld(pn, sameSliders, force) {
		haveChart = false;
		playerName = pn;
		example = playerData[playerName];
		var el = document.getElementById("yAxisLabel");
		el.innerHTML = yAxisLabels[currentStat];
		if(currentStat == "rushYds") {
			for(var idx in example) {
				example[idx].source = example[idx].ypc * example[idx].touches;
			}
		} else {
			for(var idx in example) {
				example[idx].source = example[idx][currentStat];
			}
		}
		if(sameSliders == undefined || !sameSliders) {	
			for(var idx in mySlider.sliderList) {
				mySlider.sliderList[idx].adj = 1;
				mySlider.sliderList[idx].adj2 = 1;
			}
			computeChartValues();
			for(var idx in mySlider.sliderList) {
				mySlider.sliderList[idx].slider.setValue(0, true, true, false);
			}
		}
		if(force != undefined && force) {	
			computeChartValues();
		}
		exampleDS = new YAHOO.util.DataSource(example);
		exampleDS.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
		exampleDS.responseSchema =
			{
				fields: [ "gameno", "home", "source", "neutVal", "proj", "error" ]
			};

		makeDS();
		if(haveChart)
			chart.refreshData();
		//var el = document.getElementById(lastPlayer);
		//el.style.color='#ffffd0';
		
		//el = document.getElementById(pn);
		//el.style.color='blue';
		lastPlayer = pn;
	}
*/
	function handleLoadedPlayer(retainSliders)
	{
		var el;
		//alert('success');
		//alert(playerInfo['name']);

		var recordIdx;
		var record;
		//currentPlayerPos = playerInfo.data[playerInfo.data.length - 1].pos;
		var pos = currentPlayerPos;
		if(allPlayers == undefined) {
						var trans = YAHOO.util.Get.script("/projections/playerlist/pos/all/formatid/" + formatid,
									{timeout: 10000,
									autopurge: true,
									onSuccess: function(o) {
												if(checkRedirect())
													return;
												initAllPlayersDS();
												if(formatid == 1)
													initPlayerTable();
												var maxResults = (formatid == 1) ? 42 : 27;
												var playerAutoComp = new YAHOO.widget.AutoComplete("playerinput","playercontainer", allPlayersDS);
												playerAutoComp.queryMatchContains = true;
												playerAutoComp.itemSelectEvent.subscribe(
																					function (oSelf, elItem, oData) {
																						el = document.getElementById("playerchoiceform");
																						el.submit();
																					});
												playerAutoComp.maxResultsDisplayed = maxResults;
												playerAutoComp.animVert = false;
												playerAutoComp.doBeforeExpandContainer = function(t,c,q,r)
																		{
																			var len = ((r.length < maxResults) ? r.length : maxResults);
																			el = document.getElementById("playercontainer");
																			if(formatid == 1)
																				el.style.top = (690 - (15*len)) + "px";
																			else
																				el.style.top = (405 - (15*len)) + "px";
																			return true;
																		};
												document.getElementById("playerinput").value = ((formatid == 1) ? "" : '  ') +  '--Enter player name--';
											},
									onFailure: function(o) {
												alert('failure');
											},
									onTimeout: function(o) {
												alert('timeout');
											}});
		}
		if(formatid == 1) {
			if(currentPlayerTableRecord && currentPlayerTableRecord != null) {
				for(recordIdx = 0, record = playerDataTable.getRecord(recordIdx); record; recordIdx++, record = playerDataTable.getRecord(recordIdx)) {
					if(record == currentPlayerTableRecord) {
						currentPlayerTableRecord = null;
						YAHOO.widget.DataTable.CLASS_HIGHLIGHTED = 'fanhandle-curplayer-highlight';
						playerDataTable.unhighlightRow(recordIdx);
						break;
					}
				}
			}
			if(playerList[pos] == undefined || futureDepthHasChanged || defaultForPosHasChanged) {
				getPlayerList(pos);
			} else {
				setPosShowing(pos);
				for(recordIdx = 0, record = playerDataTable.getRecord(recordIdx); record; recordIdx++, record = playerDataTable.getRecord(recordIdx)) {
					if(record.getData('playerid') == playerInfo.playerid) {
						currentPlayerTableRecord = record;
						YAHOO.widget.DataTable.CLASS_HIGHLIGHTED = 'fanhandle-curplayer-highlight';
						playerDataTable.highlightRow(recordIdx);
						break;
					}
				}
			}
		}
		if(retainSliders && rsFactorInfo) {
			factorInfo = Array();
			for(idx in rsFactorInfo) {
				factorInfo[idx] = Array();
				for(idx2 in rsFactorInfo[idx]) {
					factorInfo[idx][idx2] = {pptwgt: rsFactorInfo[idx][idx2].pptwgt, tchwgt: rsFactorInfo[idx][idx2].tchwgt};
				}
			}
			factorInfo[0][0].pptlkbk = targetLookback['ppt'];
			factorInfo[0][0].tchlkbk = targetLookback['touches'];
			//rsFutureDepth = Array();
			for(var wkIdx = playerInfo.data.length - 1; wkIdx >= 0 && playerInfo.data[wkIdx].future == 1; wkIdx--) {
				playerInfo.data[wkIdx].string = rsFutureDepth[playerInfo.data[wkIdx].week];
			}
		}
		sliderInit();
		targetLookback['ppt'] = factorInfo[0][0].pptlkbk;
		targetLookback['touches'] = factorInfo[0][0].tchlkbk;
		computeChartValues();
		resetData(playerInfo['playerid']);
		if(el = document.getElementById('choices')) {
			el.innerHTML = playerInfo['name'];
		}
		if(el = document.getElementById('playerPos')) {
			el.innerHTML = currentPlayerPos;
		}
		if(el = document.getElementById('playerTeam')) {
			el.innerHTML = playerInfo.data[playerInfo.data.length -1].team;
		}
		//make backup copy in case user reverts
		if(!(retainSliders && originalFactorInfo)) {
			originalFactorInfo = Array();
			for(var idx in factorInfo) {
				originalFactorInfo[idx] = Array();
				for(idx2 in factorInfo[idx]) {
					originalFactorInfo[idx][idx2] = {pptwgt: factorInfo[idx][idx2].pptwgt, tchwgt: factorInfo[idx][idx2].tchwgt};
				}
			}
			originalLookback = { ppt: targetLookback['ppt'], tch: targetLookback['touches'] };
			originalFutureDepth = Array();
			for(var wkIdx = playerInfo.data.length - 1; wkIdx >= 0 && playerInfo.data[wkIdx].future == 1; wkIdx--) {
				originalFutureDepth[playerInfo.data[wkIdx].week] = playerInfo.data[wkIdx].string;
			}
			slidersHaveChanged = false;
			futureDepthHasChanged = false;
			defaultForPosHasChanged = false;
		}
	}
	
	function getPlayerList(pos)
	{
		var trans = YAHOO.util.Get.script("/projections/playerlist/formatid/" + formatid + "/pos/" + pos + "/seasonEnd/" + seasonEnd,
								{timeout: 10000,
								autopurge: true,
								data: pos,
								onSuccess: function(o) {
											if(checkRedirect())
												return;
											mergePlayerList(o.data);
										},
								onFailure: function(o) {
											alert('failure');
										},
								onTimeout: function(o) {
											alert('timeout');
										}});
	}
	
	function makeFactorsBackup()
	{
		originalFactorInfo = Array();
		for(var idx in factorInfo) {
			originalFactorInfo[idx] = Array();
			for(idx2 in factorInfo[idx]) {
				originalFactorInfo[idx][idx2] = {pptwgt: factorInfo[idx][idx2].pptwgt, tchwgt: factorInfo[idx][idx2].tchwgt};
			}
		}
		originalLookback = { ppt: targetLookback['ppt'], tch: targetLookback['touches'] };
		originalFutureDepth = Array();
		for(var wkIdx = playerInfo.data.length - 1; playerInfo.data[wkIdx].future == 1; wkIdx--) {
			originalFutureDepth[playerInfo.data[wkIdx].week] = playerInfo.data[wkIdx].string;
		}
	}

	function verifySomethingHasChanged()
	{
		var idx, idx2;
		if(slidersHaveChanged) {
			if(originalLookback.ppt != targetLookback['ppt'] || originalLookback.tch != targetLookback['touches'])
				return true;
			for(var wkIdx = playerInfo.data.length - 1; wkIdx >= 0 && playerInfo.data[wkIdx].future == 1; wkIdx--) {
				if(originalFutureDepth[playerInfo.data[wkIdx].week] != playerInfo.data[wkIdx].string)
					return true;
			}
			for(idx in factorInfo) {
				for(idx2 in factorInfo[idx]) {
					if(originalFactorInfo[idx][idx2].pptwgt != factorInfo[idx][idx2].pptwgt ||
						originalFactorInfo[idx][idx2].tchwgt != factorInfo[idx][idx2].tchwgt)
					{
						return true;
					}
				}
			}
		}
		return false;
	}
	
	function setDontLeaveMessage(mess)
	{
		var el = document.getElementById("dontLeaveMessage");
		el.innerHTML = mess;
	}

	function setConfirmSavePosDefMessage(mess1, mess2)
	{
		var el = document.getElementById("posDefaultToSave");
		el.innerHTML = mess1;
		var el = document.getElementById("confirmSavePosDefMessage");
		el.innerHTML = mess2;
	}

	function setChangeDepthMessage(mess)
	{
		var el = document.getElementById("projDepthName");
		el.innerHTML = mess;
	}

	function selectPlayer(playerid, retainSliders)
	{
		if(savePlayerInProgress) {
			alert("Please wait until previous Save operation completes.");
			return;
		}
		if(formatid == 1 && verifySomethingHasChanged()) {
			dontLeaveDialog.render();
			dontLeaveDialog.center();
			setDontLeaveMessage("You have not saved your slider settings for " + playerInfo['name'] + ".\n");
			dontLeaveDialog.pendingPlayer = playerid;
			dontLeaveDialog.show();
			return;
		}
		//el = document.getElementById("playerSelect");
		if(playerid == undefined)
			playerid = 'current';
		if(retainSliders == undefined)
			retainSliders = false;
		if(retainSliders) {
			rsFactorInfo = Array();
			for(var idx in factorInfo) {
				rsFactorInfo[idx] = Array();
				for(idx2 in factorInfo[idx]) {
					rsFactorInfo[idx][idx2] = {pptwgt: factorInfo[idx][idx2].pptwgt, tchwgt: factorInfo[idx][idx2].tchwgt};
				}
			}
			rsLookback = { ppt: targetLookback['ppt'], tch: targetLookback['touches'] };
			rsFutureDepth = Array();
			for(var wkIdx = playerInfo.data.length - 1; wkIdx >= 0 && playerInfo.data[wkIdx].future == 1; wkIdx--) {
				rsFutureDepth[playerInfo.data[wkIdx].week] = playerInfo.data[wkIdx].string;
			}
		}
		var scoringSystem = 1;
		//if(formatid == 1) {
			//if(el = document.getElementById("ssSelect")) {
				//scoringSystem = el.options[el.selectedIndex].value;
			//}
		//} else {
		scoringSystem = getSSMenuValue();
		//}
		var trans = YAHOO.util.Get.script("/projections/playerdata/formatid/" + formatid + "/playerid/" + playerid + "/scoringSystem/" + scoringSystem,
								{timeout: 10000,
								autopurge: true,
								onSuccess: function(o) {
											if(checkRedirect())
												return;
											handleLoadedPlayer(retainSliders);
										},
								onFailure: function(o) {
											alert('failure');
										},
								onTimeout: function(o) {
											alert('timeout');
										}});
		//resetData(el.options[el.selectedIndex].value);
	}
	
	function usePosDefault()
	{
		for(idx in factorInfo) {
			for(idx2 in factorInfo[idx]) {
				factorInfo[idx][idx2] = {pptwgt: defaultFactorInfo[idx][idx2].pptwgt, tchwgt: defaultFactorInfo[idx][idx2].tchwgt};
			}
		}
		sliderInit();
		computeChartValues();
		resetData(playerId);
		slidersHaveChanged = true;
		resortPlayerInList();
	}

	function savePlayer(nextPlayerId, savePosDefault, noConfirm)
	{
		if(playerId == undefined) {
			alert('Error: No current Player()');
		}
		if(savePosDefault && (noConfirm == undefined || !noConfirm)) {
			confirmSavePosDefDialog.render();
			setConfirmSavePosDefMessage(currentPlayerPos, "This will change the sliders for ALL " + currentPlayerPos + "s that you have not set up individually.<br><br>It will use the current Points per Touch and Touches sliders settings.<br><br>Do you wish to continue?<br>");
			confirmSavePosDefDialog.center();
			confirmSavePosDefDialog.show();
			return;
		}
		if(savePlayerInProgress) {
			alert("Please wait until previous Save operation completes.");
			return;
		}
		savePlayerInProgress = true;
		for(var stringIdx in factorInfo) {
			for(var factorIdx in factorInfo[stringIdx]) {
				factorInfo[stringIdx][factorIdx].pptlkbk = targetLookback.ppt;
				factorInfo[stringIdx][factorIdx].tchlkbk = targetLookback.touches;
			}
		}
		jsonFactorInfo = YAHOO.lang.JSON.stringify(factorInfo);
		var futureDepth = Array();
		for(var wkIdx = playerInfo.data.length - 1; wkIdx >= 0 && playerInfo.data[wkIdx].future == 1; wkIdx--) {
			futureDepth[playerInfo.data[wkIdx].week] = playerInfo.data[wkIdx].string;
		}
		jsonFutureDepth = YAHOO.lang.JSON.stringify(futureDepth);
		var saveid;
		if(savePosDefault) {
			defaultForPosHasChanged = true;
			saveid = currentPlayerPos;
		} else {
			saveid = playerId;
		}
		var url = "/projections/saveplayer/formatid/" + formatid + "/playerid/" + saveid + 
					"/factors/" + jsonFactorInfo;
		if(!savePosDefault)
			url += "/futureDepth/" + jsonFutureDepth;
		if(nextPlayerId) {
			url += "/nextPlayerId/" + nextPlayerId;
		}
		savePlayerResult = 0;
		var trans = YAHOO.util.Get.script(url,
								{timeout: 10000,
								autopurge: true,
								onSuccess: function(o) {
											if(checkRedirect())
												return;
											savePlayerInProgress = false;
											if(savePlayerResult) {
												handleLoadedPlayer(false);
											} else {
												alert('FanHandle was unable to save this player\'s information.');
											}
										},
								onFailure: function(o) {
											alert('failure');
										},
								onTimeout: function(o) {
											alert('timeout');
										}});
	}
	
 	function revertPlayer(doReset)
	{
		slidersHaveChanged = false;
		futureDepthHasChanged = false;
		defaultForPosHasChanged = false;
		for(idx in factorInfo) {
			for(idx2 in factorInfo[idx]) {
				factorInfo[idx][idx2] = {pptwgt: originalFactorInfo[idx][idx2].pptwgt, tchwgt: originalFactorInfo[idx][idx2].tchwgt};
			}
		}
		targetLookback.ppt = originalLookback.ppt;
		targetLookback.touches = originalLookback.tch;
		for(var wkIdx = playerInfo.data.length - 1; wkIdx >= 0 && playerInfo.data[wkIdx].future == 1; wkIdx--) {
			playerInfo.data[wkIdx].string = originalFutureDepth[playerInfo.data[wkIdx].week];
		}
		sliderInit();
		computeChartValues();
		if(doReset)
			resetData(playerId);
		resortPlayerInList();
	}
	
	function fadelogo(start, sty)
	{
		if(myAnim == undefined)
			return;
		if(start) {
			myAnim.stop();
			sty.opacity=1.0;
		} else {
			myAnim.animate();
		}
	}
	
	function futureStringPopup(info, startingIdx, wkIdx)
	{
		var pos = info[wkIdx].pos;
		if(pos == 'K' || pos == 'DEF' || info[wkIdx].gameid == 'nogame')
			return;
		changeDepthDialog.render();
		var player = info[wkIdx];
		var info = "Current project depth for " + playerInfo.name + " is " + player.string + ".<br>";
		info += "Set depth for " + player.year + " week " + player.week + " to<br><br>";
		setChangeDepthMessage(info);
		var el = document.getElementById("stringSelect");
		el.selectedIndex = parseInt(player.string) - 1;
		el.wkIdx = startingIdx + wkIdx;
		changeDepthDialog.center();
		changeDepthDialog.show();
		if(false)
			alert('You just clicked on the projection for week ' + 
			info[wkIdx].week + ' of ' +
			info[wkIdx].year  +
				".\nThe string for this player is projected to be " + info[wkIdx].string +
				", but someday\nyou will be able to change it right here!!");
	}
	
	/*
	function plExpand(pos)
	{
		if(playerDataTable != undefined)
			return;
		var trans = YAHOO.util.Get.script("/projections/playerlist/formatid/" + formatid + "/pos/" + pos,
								{timeout: 10000,
								autopurge: true,
								onSuccess: function(o) {
											if(checkRedirect())
												return;
											initPlayerTable();
											for(recordIdx = 0, record = playerDataTable.getRecord(recordIdx); record; recordIdx++, record = playerDataTable.getRecord(recordIdx)) {
												if(record.getData('playerid') == playerInfo.playerid) {
													currentPlayerTableRecord = record;
													break;
												}
											}
										},
								onFailure: function(o) {
											alert('failure');
										},
								onTimeout: function(o) {
											alert('timeout');
										}});
	}
	*/
	
	/*
	CSS Browser Selector v0.3.2
	Rafael Lima (http://rafael.adm.br)
	http://rafael.adm.br/css_browser_selector
	License: http://creativecommons.org/licenses/by/2.5/
	Contributors: http://rafael.adm.br/css_browser_selector#contributors
	*/
	function css_browser_selector(u)
	{
		var ua = u.toLowerCase();
		var is = function(t)
		{
			return ua.indexOf(t)>-1;
		};
		var g = 'gecko';
		var w = 'webkit';
		var s ='safari';
		var h = document.getElementsByTagName('html')[0];
		var b = [(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3')?g+' ff3':is('gecko/')?g:/opera(\s|\/)(\d+)/.test(ua)?'opera opera'+RegExp.$2:is('konqueror')?'konqueror':is('chrome')?w+' chrome':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'', is('j2me')?'mobile':is('iphone')?'iphone':is('ipod')?'ipod':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win':is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js'];
		var c = b.join(' ');
		h.className += ' '+c;
		return c;
	}
	
	function isBrowser(b)
	{
		var browserList = css_browser_selector(navigator.userAgent);
		var regexp = new RegExp(b);
		return (browserList.search(regexp) != -1);
	}
	
 	function fixLayout()
	{
		switch(formatid) {
			case 1:
				if(isBrowser('ie7') || isBrowser('ie6')) {
					var el = document.getElementById('AllPlayersListContainer');
					if(el) {
						el.style.width = "251px";
						el.style.left = "4px";
						el.style.borderRight = "1px solid #268bc6";
						wideTeam = true;
					}
				}
				//if(isBrowser('ie6')) {
					//ie6pngfix();
				//}
				break;
				
			case 2:
			case 3:
				if(isBrowser('ie7') || isBrowser('ie6')) {
					YAHOO.util.Dom.addClass("radioForm", 'radioButtonIE');
					if(isBrowser('ie6')) {
						mySlider.addIE6Class();
					}
				}
				break;
			
			default:
				break;
		}
	}
	
	function checkRedirect()
	{
		if(forcedRedirect != null) {
			window.location = forcedRedirect;
			return true;
		}
		return false;
	}
