//create global GameManager

processMochiTAL = function (dom, data, bigChance) {
	if (dom.nodeType != 1) {
		return;
	}
	
	var attr;
	
	// handle repeat tags
	attr = getAttribute(dom, "mochi:repeat");
	if (attr) {
		dom.removeAttribute("mochi:repeat");
		var parent = dom.parentNode;
		attr = attr.split(" ");
		var name = attr[0];
		var lst = valueForKeyPath(data, attr[1]);
		
		if (!lst) {	
			return;
		}
		
		var length = lst.length;
		if (attr[2] != null)
			length = attr[2];
			
		for (var i=0; i<length; ++i) {
			data[name] = lst[i];
			var newDOM = dom.cloneNode(true);
			processMochiTAL(newDOM, data, bigChance);
			parent.insertBefore(newDOM, dom);
		}
		
		parent.removeChild(dom);
		return;
	}
	
	// handle size/width tag -- basically sort out the width compared with the probability
	
	attr = getAttribute(dom, "mochi:size");
	if (attr) {
		dom.removeAttribute("mochi:size");
		var smallChance  = valueForKeyPath(data, attr)
		var width = numberFormatter("#%")((smallChance * 0.7)/ bigChance)
		//dom.setAttribute("style", "width: " + width + ";");
		var myStyle = {"width": width};
		setStyle(dom, myStyle);
		//dom.style = {"width": width};
		return;
	}
	
	// handle content tags
	attr = getAttribute(dom, "mochi:content");
	if (attr) {
		dom.removeAttribute("mochi:content");
		replaceChildNodes(dom, valueForKeyPath(data, attr));
		return;
	}
	

	attr = getAttribute(dom, "mochi:formattedContent");
	if (attr) {
		dom.removeAttribute("mochi:formattedContent");
		var format = getAttribute(dom, "mochi:format");
		if (data != null) {
			if (format) {
				replaceChildNodes(dom, 	numberFormatter(format)(valueForKeyPath(data, attr)));
			} else {
				replaceChildNodes(dom, 	numberFormatter("#%")(valueForKeyPath(data, attr)));
			}		
		} else {
			replaceChildNodes(dom, getAttribute(dom, "mochi:default"));
		}
		return;
	}
	
	// make a shallow copy of the child nodes - in case it changes due to repeat attr
	var nodes = list(dom.childNodes);
	
	// now iterate through them and continue the processing
	for (var i=0; i<nodes.length; ++i) {
		processMochiTAL(nodes[i], data, bigChance);
	}	
};

var hiddenLinksGBL = null;
var subMenuHome = null;
var subMenuAway = null;

toggleDivTypeVisibility = function (ev) {
	ignoreEvent(ev);
	log ("toggle div vis");
	closeTeamPanels();
	var myListID = getAttribute(this, "mochi:listID");
	
	for (var i=0; i<hiddenLinksGBL.length; ++i) {
		if(getAttribute(hiddenLinksGBL[i], "mochi:parentID") == myListID) {
			// now toggle the attribute...
			var vis = hiddenLinksGBL[i].style;

			if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
				vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'block':'none';
			vis.display = (vis.display==''||vis.display=='block')?'none':'block';			
		} else {
			setStyle(hiddenLinksGBL[i], {"display": "none"});
		}

	}
};

toggleDivMidTypeVisibility = function (ev) {
	ignoreEvent(ev);
	log ("toggle div mid vis");
	closeTeamPanels();
	var myListID = getAttribute(this, "mochi:listID");
	var myParentsID = getAttribute(this, "mochi:parentID");
	
	for (var i=0; i<hiddenLinksGBL.length; ++i) {
		log (getAttribute(hiddenLinksGBL[i], "mochi:parentID"), myListID, myParentsID);
		
		if (getAttribute(hiddenLinksGBL[i], "mochi:parentID") == myListID){
			// now toggle the attribute...
			var vis = hiddenLinksGBL[i].style;

			if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
				vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'block':'none';
			vis.display = (vis.display==''||vis.display=='block')?'none':'block';			
		} else if (getAttribute(hiddenLinksGBL[i], "mochi:parentID") == myParentsID) {
			var vis = hiddenLinksGBL[i].style;

			vis.display = 'block';			
		} else {
			setStyle(hiddenLinksGBL[i], {"display": "none"});
		}

	}

};


toggleTeamVisibility = function (ev) {
	ignoreEvent(ev);
	
	var hiddenLinks = subMenuHome;
	
	var myListID = getAttribute(this, "mochi:listID");
	var parentID = getAttribute(this, "mochi:parentID");

	log("ToggleTeamVis2", parentID, myListID, hiddenLinks.length);
	
	var htmlStrArr = PHP_teamHTMLArr[parentID][myListID];	

	
	for (var i=0; i<hiddenLinks.length; ++i) {
		log ("==>", getAttribute(hiddenLinks[i], "mochi:listID"));
		if(getAttribute(hiddenLinks[i], "mochi:listID") == myListID) {
			// now toggel the attribute...
			var vis = hiddenLinks[i].style;

			if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
				vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'block':'none';
			vis.display = (vis.display==''||vis.display=='block')?'none':'block';			
			
			if (vis.display == 'block') {
				// now lets make the damned link
				for (var j=0; j<htmlStrArr[1].length; ++j) {
					// write to the DOM
					var newDOM = A(htmlStrArr[2][j], htmlStrArr[1][j]);
					// append the fricking thing to this...
					newDOM.onclick = selectTeamAndSimulate;
					hiddenLinks[i].appendChild(newDOM);
				}
			} else {
				// kill the children
				replaceChildNodes(hiddenLinks[i]);
			}
		} else {
			setStyle(hiddenLinks[i], {"display": "none"});
			replaceChildNodes(hiddenLinks[i]);
		}
	}
	
	// now for away
	var hiddenLinks = subMenuAway;
	
	for (var i=0; i<hiddenLinks.length; ++i) {
		if(getAttribute(hiddenLinks[i], "mochi:listID") == myListID) {
			// now toggel the attribute...
			var vis = hiddenLinks[i].style;

			if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
				vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'block':'none';
			vis.display = (vis.display==''||vis.display=='block')?'none':'block';			

			if (vis.display == 'block') {
				// now lets make the damned link
				for (var j=0; j<htmlStrArr[1].length; ++j) {
					// write to the DOM
					var newDOM = A(htmlStrArr[2][j], htmlStrArr[1][j]);
					// append the fricking thing to this...
					newDOM.onclick = selectTeamAndSimulate;
					hiddenLinks[i].appendChild(newDOM);
				}
			} else {
				// kill the children
				replaceChildNodes(hiddenLinks[i]);
			}

		} else {
			setStyle(hiddenLinks[i], {"display": "none"});
			replaceChildNodes(hiddenLinks[i]);
		}
	}	
	
};


toggleTeamVisibility_old = function (ev) {
	ignoreEvent(ev);
	log("ToggleTeamVis");
	var hiddenLinks = subMenuHome;
	var myListID = getAttribute(this, "mochi:listID");
	
	for (var i=0; i<hiddenLinks.length; ++i) {
		if(getAttribute(hiddenLinks[i], "mochi:listID") == myListID) {
			// now toggel the attribute...
			var vis = hiddenLinks[i].style;

			if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
				vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'block':'none';
			vis.display = (vis.display==''||vis.display=='block')?'none':'block';			
		} else {
			setStyle(hiddenLinks[i], {"display": "none"});
		}
	}
	
	// now for away
	var hiddenLinks = subMenuAway;
	var myListID = getAttribute(this, "mochi:listID");
	
	for (var i=0; i<hiddenLinks.length; ++i) {
		if(getAttribute(hiddenLinks[i], "mochi:listID") == myListID) {
			// now toggel the attribute...
			var vis = hiddenLinks[i].style;

			if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
				vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'block':'none';
			vis.display = (vis.display==''||vis.display=='block')?'none':'block';			
		} else {
			setStyle(hiddenLinks[i], {"display": "none"});
		}
	}	
	
};

toggleNeutralVenue = function (ev) {
	log ("neutral Toggled");
	//ignoreEvent(ev);
	
	if (this.checked) 
		simManager.neutralState = 1;
	else
		simManager.neutralState = 0;
		
		
	simManager.simulateLastVars();
};

selectTeamAndSimulate = function (ev) {
	ignoreEvent(ev);
	
	var homeTeamID = getAttribute(this, "mochi:homeTeamID");
	var homeTeamName = getAttribute(this, "mochi:homeTeamName");
	var homeTeamType = getAttribute(this, "mochi:homeTeamType");
	var awayTeamID = getAttribute(this, "mochi:awayTeamID");
	var awayTeamName = getAttribute(this, "mochi:awayTeamName");
	var awayTeamType = getAttribute(this, "mochi:awayTeamType");
	
	if (homeTeamID) {
		simManager.homeTeamID = homeTeamID;
		simManager.homeTeamName = homeTeamName;
		simManager.homeTeamType = homeTeamType;
		for(var i=1; i<=4; ++i) { 
			var currAttr = document.getElementById('homeMenu'+i);
			setStyle(currAttr, {"background-color": "#ccc"});
		}
		setStyle(document.getElementById('homeDivisions'), {"color": "#000"});
	}
	
	if (awayTeamID) {
		simManager.awayTeamID = awayTeamID;
		simManager.awayTeamName = awayTeamName;
		simManager.awayTeamType = awayTeamType;
		for(var i=1; i<=4; ++i) { 
			var currAttr = document.getElementById('awayMenu'+i);
			setStyle(currAttr, {"background-color": "#ccc"});
		}
		setStyle(document.getElementById('awayDivisions'), {"color": "#000"});
	}
	
	// hide this panel now
	closeTeamPanels();
	
	// and simulate the game

	simManager.simulateGivenGame();
};

closeTeamPanels = function() {
	for (var i=0; i<subMenuHome.length; ++i) {
		if (subMenuHome[i].style.display != 'none') {
			setStyle(subMenuHome[i], {"display": "none"});
			replaceChildNodes(subMenuHome[i]);
			
		}
	}

	for (var i=0; i<subMenuAway.length; ++i) {
		if (subMenuAway[i].style.display != 'none') {
			setStyle(subMenuAway[i], {"display": "none"});
			replaceChildNodes(subMenuAway[i]);
		}
	}
};



changeResultPageLinks = function() {
	var links = getElementsByTagAndClassName(null, "changeResultPageBtn");
	
	for (var i=0; i<links.length; ++i) {
		var tempHref = links[i].getAttribute("mochi:link") + "?";
		tempHref = tempHref + "hid=" + simManager.homeTeamID + "&";
		tempHref = tempHref + "aid=" + simManager.awayTeamID + "&";
		tempHref = tempHref + "neu=" + simManager.neutralState + "&";
		tempHref = tempHref + "hty=" + simManager.homeTeamType + "&";
		tempHref = tempHref + "aty=" + simManager.awayTeamType;
		
		links[i].href = tempHref;
	}
};

changeResultPageLinksCustom = function(hAtk, hDef, aAtk, aDef) {
	var links = getElementsByTagAndClassName(null, "changeResultPageBtn");
	
	for (var i=0; i<links.length; ++i) {
		var tempHref = links[i].getAttribute("mochi:link") + "?";
		tempHref = tempHref + "hid=" + simManager.homeTeamID + "&";
		tempHref = tempHref + "aid=" + simManager.awayTeamID + "&";
		tempHref = tempHref + "neu=" + simManager.neutralState + "&"
		tempHref = tempHref + "hAtk=" +  hAtk + "&";
		tempHref = tempHref + "hDef=" +  hDef + "&";
		tempHref = tempHref + "aAtk=" +  aAtk + "&";
		tempHref = tempHref + "aDef=" +  aDef + "&";
		tempHref = tempHref + "hty=" + simManager.homeTeamType + "&";
		tempHref = tempHref + "aty=" + simManager.awayTeamType;
		
		links[i].href = tempHref;
	}
};

ignoreEvent = function(ev) {
	if (ev && ev.preventDefault) {
		ev.preventDefault();
		ev.stopPropagation();
	} else if (typeof(event) != 'undefined') {
		event.cancelBubble = false;
		event.returnValue = false;
	}
};

getAttribute = function (dom, key) {
	try {
		return dom.getAttribute(key);
	} catch (e) {
		return null;
	}
};

valueForKeyPath = function (data, keyPath) {
	var chunks = keyPath.split(".");
	while (chunks.length && data) {
		data = data[chunks.shift()];
	}
	
	return data;
};

SortTransforms = {
	"str": operator.identity,
	"isoDate": isoDate
};

DatabaseManager = function() {
	bindMethods(this);
};

DatabaseManager.prototype = {
	"initialize": function() {
		log ("database Initialize");
	},
	
	"getTeamNameFromID": function(id) {
		if (id == 0) 
			return "Team A";
		if (id == 1) 
			return "Team B";
		if (id == 2) 
			return "Team C";
		if (id == 3) 
			return "Team D";
		else	
			return "Team E";
	}
};

SimManager = function() {
	this.defaultHomeID = -1;
	this.defaultAwayID = -1;
	this.defaultNeutral = 0;
	this.scriptName = "/cgi-bin/new_site/GetEuroIntlSimulatedFast.pl";
	this.templates = [];
	this.deferred = null;
	this.data = null;
	this.homeTeamID = -1;
	this.awayTeamID = -1;
	this.neutralState = 0;
	this.homeTeamName = "Select Home Team";
	this.awayTeamName = "Select Away Team";
	this.databaseManager = null;
	this.homeTeamType = 0;
	this.awayTeamType = 0;
	
	this.lastHAtk = -1;
	this.lastHDef = -1;
	this.lastAAtk = -1;
	this.lastADef = -1;
	
	this.vsOn = SPAN({"id": "vs"}, "Vs");
	this.vsOff = SPAN({"id": "vs"}, "-");
	
	bindMethods(this);
};

SimManager.prototype = {
	"initialize": function() {
		log("initializing");

		// initialise the databaseManager first
		this.databaseManager = new DatabaseManager();
		this.databaseManager.initialize();

		// remove the examples
		log("Removing examples");
		var examples = getElementsByTagAndClassName("tr", "mochi-example");
		while (examples.length) {
			swapDOM(examples.pop(), null);
		}
		
		// grab the template divs, and then remove their temp class
		log ("Grab Templates");
		var templates = getElementsByTagAndClassName("div", "mochi-template");
		
		for (var i=0; i<templates.length; ++i) {
			var template = templates[i];
			var proto = template.cloneNode(true);
			removeElementClass(proto, "mochi-template");
			this.templates.push({"template": proto, "node": template});
		}

		// GLOBALS
		// go through and find the mochi-list links
		log ("Sort out globals");
		hiddenLinksGBL = new Array();

		log ("G: subMenus");
		subMenuHome = new Array();
		subMenuAway = new Array();
		var ul_items = getElementsByTagAndClassName("ul");

		log ("G: " + ul_items.length);		
		for (var i=0; i<ul_items.length; ++i) {
			if (ul_items[i].className == "submenu2h")
				subMenuHome[subMenuHome.length] = ul_items[i];
			else if (ul_items[i].className == "submenu2")
				subMenuAway[subMenuAway.length] = ul_items[i];
		}

		
		// go through and get the team links
		log("Grab links");
		var links = document.getElementsByTagName("a");
		
		for (var i=0; i<links.length; ++i) {
			// lets merge in the vislist...

			if (links[i].className == "mochi-visList_top") {
				var listID = getAttribute(links[i], "mochi:listID");

				if (listID) {
					links[i].onclick = toggleDivTypeVisibility;
				}	
			} else if (links[i].className == "mochi-visList_middle") {
				hiddenLinksGBL[hiddenLinksGBL.length] = links[i];

				var listID = getAttribute(links[i], "mochi:listID");

				if (listID) {
					links[i].onclick = toggleDivMidTypeVisibility;
				}			
				
			} else if (links[i].className == "mochi-visList_bottom") {
				hiddenLinksGBL[hiddenLinksGBL.length] = links[i];

				var listID = getAttribute(links[i], "mochi:listID");

				if (listID) {
					links[i].onclick = toggleTeamVisibility;
				}				
			}
			
			var homeTeamID = getAttribute(links[i], "mochi:homeTeamID");
			var awayTeamID = getAttribute(links[i], "mochi:awayTeamID");
			
			if (homeTeamID || awayTeamID) {
				links[i].onclick = selectTeamAndSimulate;
			}				

		}
		
		// set the neutral venue buttons
		log ("Neutral");
		var neutralCntl = getElementsByTagAndClassName(null,"mochi-neutralVenueCntl");
		
		for (var i=0; i<neutralCntl.length; ++i) {
			neutralCntl[i].onclick = toggleNeutralVenue;
		}
		
		log("setting from globals");
		
		if (PHP_getHomeID != -1) {
			this.homeTeamID = PHP_getHomeID;
			this.homeTeamName = PHP_getHomeName;
			this.homeTeamType = PHP_getHomeTeamType;
			for(var i=1; i<=4; ++i) { 
				currAttr=document.getElementById('homeMenu'+i);
				setStyle(currAttr, {"background-color": "#ccc"});
			}
			setStyle(document.getElementById('homeDivisions'), {"color": "#000"});
		} else
			this.homeTeamID = this.defaultHomeID;
		
		log ("safe?");
		if (PHP_getAwayID != -1) {
			this.awayTeamID = PHP_getAwayID;
			this.awayTeamName = PHP_getAwayName;
			this.awayTeamType = PHP_getAwayTeamType;
			for(var i=1; i<=4; ++i) { 
				var currAttr = document.getElementById('awayMenu'+i);
				setStyle(currAttr, {"background-color": "#ccc"});
			}
			setStyle(document.getElementById('awayDivisions'), {"color": "#000"});
		} else
			this.awayTeamID = this.defaultAwayID;
			
		if (PHP_getNeutral != -1)
			this.neutralState = PHP_getNeutral;
		else
			this.neutralState = this.defaultNeutral;
		
		var vsDOM = getElement("vs");
		
		if ((this.homeTeamID == -1) || (this.awayTeamID == -1)) {
			swapDOM(vsDOM, this.vsOff);
		} else {
			swapDOM(vsDOM, this.vsOn);
		}		
		
		log ("globals", PHP_getHomeAtk);
		
		if ((PHP_getHomeAtk != -1) &&
		  (PHP_getHomeDef != -1) &&
		  (PHP_getAwayAtk != -1) &&
		  (PHP_getAwayDef != -1))
			this.simulateWithVars(PHP_getHomeAtk, PHP_getHomeDef, PHP_getAwayAtk, PHP_getAwayDef);		
		else
			this.simulateGivenGame();		
		
	},
	
	"simulateLastVars": function() {
		log("sim with last vars");
		
		if ((this.lastHAtk != -1) &&
		  (this.lastHDef != -1) &&
		  (this.lastAAtk != -1) &&
		  (this.lastADef != -1)) 
			this.simulateWithVars(this.lastHAtk, this.lastHDef, this.lastAAtk, this.lastADef);
		else
			this.simulateGivenGame();
	},
	
	"simulateWithVars": function(hAtk, hDef, aAtk, aDef) {
		log("sim with vars", hAtk, hDef, aAtk, aDef);
		changeResultPageLinksCustom(hAtk, hDef, aAtk, aDef);
		
		if ((this.homeTeamID == -1) || (this.awayTeamID == -1)) {
			this.displayNotEnoughTeams();
		} else {
			this.lastHAtk = hAtk;
			this.lastHDef = hDef;
			this.lastAAtk = aAtk;
			this.lastADef = aDef;

			this.loadFromURL(this.scriptName,  {homeID: this.homeTeamID, 
				awayID: this.awayTeamID, 
				neutral: this.neutralState, 
				homeAtt: hAtk,
				homeDef: hDef,
				awayAtt: aAtk,
				awayDef: aDef,
				homeType: this.homeTeamType,
				awayType: this.awayTeamType}
			);
		}
	},
	
	"simulateDefaultVars": function() {
		changeResultPageLinks();
		
		this.lastHAtk = -1;
		this.lastHDef = -1;
		this.lastAAtk = -1;
		this.lastADef = -1;
	
		this.loadFromURL(this.scriptName, {homeID: this.homeTeamID, 
			awayID: this.awayTeamID, 
			neutral: this.neutralState,
			homeType: this.homeTeamType,
			awayType: this.awayTeamType}
		);
	},
		
	"simulateGivenGame": function() {
		log("standard Sim");
		// simulates the game with the ID's we're holding
		changeResultPageLinks();
		
		if ((this.homeTeamID == -1) || (this.awayTeamID == -1)) {
			this.displayNotEnoughTeams();
		} else if ((this.homeTeamType == 2 && this.awayTeamType != 2) || (this.homeTeamType != 2 && this.awayTeamType == 2)){
			this.displayCantSimMatch();
		} else {
			this.lastHAtk = -1;
			this.lastHDef = -1;
			this.lastAAtk = -1;
			this.lastADef = -1;
	
			this.loadFromURL(this.scriptName, {homeID: this.homeTeamID, awayID: this.awayTeamID, neutral: this.neutralState, 	homeType: this.homeTeamType,	awayType: this.awayTeamType});
		}
	},
	
	"loadFromURL": function(url, vars) {
		log("loadFromURL:" + url, "HID:" + vars.homeID, "AID:" + vars.awayID, "HType:" + vars.homeType, "AType:" + vars.awayType);

		// iterate through the vars
		var str = "";
		for (var prop in vars) {
			str = prop + ":" + vars[prop] + " ";
			log("Vars", str);
		}
		
		var d;
		if (this.deferred) {
			this.deferred.cancel();
		}
		
		d = loadJSONDoc(url, vars);
		
		this.deferred = d;
		var self = this;
		
		d.addBoth(function (res) {
			self.deferred = null;
			log('loadFromURL success');
			return res;
		});
		
		d.addCallback(this.initWithData);
		
		d.addErrback(function(err) {
			if (err instanceof CancelledError) {
				return;
			}
			
			logError(err);
		});
		return d;
	},
	
	"initWithData": function(data) {
		log("initWithData", data);
		log("values", data.AtkCurH, data.DefCurH, data.AtkCurA, data.DefCurA);
		
		// have to store goals in a nice array - so we can sort by chance
		// Also, we have to create a text of the goals, as well as a better chance variable
		
		var rows = data.goals;
		var outcomes = [];
		for (var i=0; i<rows.length; ++i) {
			var tempRow = {};
			tempRow.score = rows[i].homeGoal + " - " + rows[i].awayGoal;
			tempRow.pr = numberFormatter("#.#%")(rows[i].chance);

			tempRow.homeGoal = rows[i].homeGoal;		
			tempRow.awayGoal = rows[i].awayGoal;
			tempRow.chance = rows[i].chance;
			
			outcomes.push(tempRow);
		}

		// store data for later
		data.outcomes = outcomes;
		this.data = data;
		
		
		
		// display the rows
		this.sortOutcomes();
	},
	
	"sortOutcomes": function () {
		// sort out the sort columns
		var forward = false;
		// apply sort transform to imaginary column
		// then do the sort
		
		var sortfunc = operator.identity;
		if (!sortfunc) {
			throw new TypeError("unsupported sort style" + repr(sortstyle));
		}
		
		var outcomes = this.data.outcomes;
		for (var i=0; i<outcomes.length; ++i) {
			var outcome = outcomes[i];
			outcome.__sort__ = sortfunc(outcome["chance"]);
		}
		
		// now do the sort
		var cmp = (forward? keyComparator: reverseKeyComparator);
		outcomes.sort(cmp("__sort__"));
		
		// now get the largest value to scale against
		this.data.largestChance = outcomes[0].chance;
		
		this.displayBarChart();
		this.displayNames();
		this.setSliderMarks();
	},
	
	"displayBarChart": function () {
		log("displayBarChart");		
		for (var i=0; i<this.templates.length; ++i) {
			var template = this.templates[i];
			var dom = template.template.cloneNode(true);
			processMochiTAL(dom, this.data, this.data.largestChance);
			template.node = swapDOM(template.node, dom);
		}
	},
	
	"removeContent" : function () {		
		log("displayBarChart");		
		for (var i=0; i<this.templates.length; ++i) {
			var template = this.templates[i];
			var dom = template.template.cloneNode(true);
			processMochiTAL(dom, null, null);
			template.node = swapDOM(template.node, dom);
		}
	},
	
	"displayLabels": function () {
	}, 
	
	"displayNotEnoughTeams": function() {
		log ("not enough teams");
		this.displayNames();
		this.hideChart();
	},
	
	"displayCantSimMatch": function() {
		log ("Can't do match");
		this.displayNames();
		this.removeContent();		
		this.hideChart();
		this.displayIntlError();
	},
	
	"convertToSliderValue": function(str, prevMarks) {
		// normalises from 0.2 - 3.00 to 0 - 200
		var tmpVal = str - 0.2;
		tmpVal = tmpVal * 625 / 7;
		var fixedVal = Math.floor(tmpVal) * 1; //2;
		
		// the final conversion taking mark width into account
		var convertedVal = fixedVal + 4.5 - (prevMarks * 3);

		log ("conv to Slider", str, prevMarks, tmpVal, fixedVal, convertedVal);
		
		return convertedVal;
	},

	"convertToEurSliderValue": function(str, prevMarks) {
		// normalises from 0 - 5.6 to 0 - 200
		var tmpVal = str;
		tmpVal = tmpVal * 625 / 14;
		var fixedVal = Math.floor(tmpVal) * 1; //2;
		
		// the final conversion taking mark width into account
		var convertedVal = fixedVal + 4.5 - (prevMarks * 3);

		log ("conv to Euro Slider", str, prevMarks, tmpVal, fixedVal, convertedVal);
		
		return convertedVal;
	},
	
	"EngConvertToSliderKnob": function(str) {
		// 0.2-3.0 -> 1-100
		var tmpVal = str - 0.2;
		tmpVal = tmpVal * 250 / 7;
		
		log("Eng conv:", str, tmpVal);
		return tmpVal;
	},

	"EurConvertToSliderKnob": function(str) {
		// 0-5.6 -> 1-100
		var tmpVal = str;
		tmpVal = tmpVal * 250 / 14;
		
		log("Euro conv:", str, tmpVal);
		return tmpVal;
	},
	
	"setSliderMarks": function() {
	//this.data.AtkMinH = 5.6;
		log("marks1", this.data.AtkMinH, this.data.AtkMaxH);
		log("marks2", this.data.AtkMinA, this.data.AtkMaxA);
		log("marks3", this.data.DefMinH, this.data.DefMaxH);
		log("marks4", this.data.DefMinA, this.data.DefMaxA);

		
		if (this.homeTeamType == 0) {
			sHAtk.ConvSlidersToReal = EngConvSlidersToReal;
			sHDef.ConvSlidersToReal = EngConvSlidersToReal;
			sHAtk.convertToSliderKnob = this.EngConvertToSliderKnob;
			sHDef.convertToSliderKnob = this.EngConvertToSliderKnob;
			homeMarkerConv = this.convertToSliderValue;
		} else {
			sHAtk.ConvSlidersToReal = EurConvSlidersToReal;
			sHDef.ConvSlidersToReal = EurConvSlidersToReal;
			sHAtk.convertToSliderKnob = this.EurConvertToSliderKnob;
			sHDef.convertToSliderKnob = this.EurConvertToSliderKnob;
			homeMarkerConv = this.convertToEurSliderValue;
		}		

		if (this.awayTeamType == 0) {		
			sAAtk.ConvSlidersToReal = EngConvSlidersToReal;
			sADef.ConvSlidersToReal = EngConvSlidersToReal;
			sAAtk.convertToSliderKnob = this.EngConvertToSliderKnob;
			sADef.convertToSliderKnob = this.EngConvertToSliderKnob;
			awayMarkerConv = this.convertToSliderValue;
		} else {
			sAAtk.ConvSlidersToReal = EurConvSlidersToReal;
			sADef.ConvSlidersToReal = EurConvSlidersToReal;
			sAAtk.convertToSliderKnob = this.EurConvertToSliderKnob;
			sADef.convertToSliderKnob = this.EurConvertToSliderKnob;
			awayMarkerConv = this.convertToEurSliderValue;
		}
		
		
		// ***
		// set the sliders
		
		// attack Home
		/*		var atkLMin = getElement("homeAtk-leaWorstMark");
				tmpPos = this.convertToSliderValue("0.2", 0);
				tmpStr = tmpPos + "px";
				setStyle(atkLMin, {"left": tmpStr, "display": "block"});
		*/
		var atkHMin = getElement("homeAtk-minMark");
		var tmpPos = homeMarkerConv(this.data.AtkMinH, 0);
		var tmpStr = tmpPos + "px";
		setStyle(atkHMin, {"left": tmpStr, "display": "block"});

		var atkHMax = getElement("homeAtk-maxMark");
		tmpPos = homeMarkerConv(this.data.AtkMaxH, 1);
		tmpStr = tmpPos + "px";
		setStyle(atkHMax, {"left": tmpStr, "display": "block"});
		/*
				var atkLMax = getElement("homeAtk-leaBestMark");
				tmpPos = this.convertToSliderValue("3.0", 3);
				tmpStr = tmpPos + "px";		
				setStyle(atkLMax, {"left": tmpStr, "display": "block"});
		*/

				// defence home
		/*		var defLMax = getElement("homeDef-leaBestMark");
				tmpPos = this.convertToSliderValue("0.3", 0);
				tmpStr = tmpPos + "px";		
				setStyle(defLMax, {"left": tmpStr, "display": "block"});
		*/
		var defHMax = getElement("homeDef-maxMark");
		tmpPos = homeMarkerConv(this.data.DefMaxH, 0);
		tmpStr = tmpPos + "px";
		setStyle(defHMax, {"left": tmpStr, "display": "block"});

		var defHMin = getElement("homeDef-minMark");
		var tmpPos = homeMarkerConv(this.data.DefMinH, 1);
		var tmpStr = tmpPos + "px";
		setStyle(defHMin, {"left": tmpStr, "display": "block"});
		/*
				var defLMin = getElement("homeDef-leaWorstMark");
				tmpPos = this.convertToSliderValue("2.9", 3);
				tmpStr = tmpPos + "px";
				setStyle(defLMin, {"left": tmpStr, "display": "block"});
		*/	
		// ***
		// now for away team
		/*
				var atkLMin = getElement("awayAtk-leaWorstMark");
				tmpPos = this.convertToSliderValue("0.2", 0);
				tmpStr = tmpPos + "px";
				setStyle(atkLMin, {"left": tmpStr, "display": "block"});
		*/
		var atkAMin = getElement("awayAtk-minMark");
		var tmpPos = awayMarkerConv(this.data.AtkMinA,0);
		var tmpStr = tmpPos + "px";
		setStyle(atkAMin, {"left": tmpStr, "display": "block"});

		var atkAMax = getElement("awayAtk-maxMark");
		tmpPos = awayMarkerConv(this.data.AtkMaxA, 1);
		tmpStr = tmpPos + "px";
		setStyle(atkAMax, {"left": tmpStr, "display": "block"});
		/*
				var atkLMax = getElement("awayAtk-leaBestMark");
				tmpPos = this.convertToSliderValue("3.0", 3);
				tmpStr = tmpPos + "px";		
				setStyle(atkLMax, {"left": tmpStr, "display": "block"});
		*/		
		// defence away
		/*
				var defLMax = getElement("awayDef-leaBestMark");
				tmpPos = this.convertToSliderValue("0.3", 0);
				tmpStr = tmpPos + "px";		
				setStyle(defLMax, {"left": tmpStr, "display": "block"});
		*/		
		var defAMin = getElement("awayDef-minMark");
		var tmpPos = awayMarkerConv(this.data.DefMinA, 0);
		var tmpStr = tmpPos + "px";
		setStyle(defAMin, {"left": tmpStr, "display": "block"});

		var defAMax = getElement("awayDef-maxMark");
		tmpPos = awayMarkerConv(this.data.DefMaxA, 1);
		tmpStr = tmpPos + "px";
		setStyle(defAMax, {"left": tmpStr, "display": "block"});
		
		/*
				var defLMin = getElement("awayDef-leaWorstMark");
				tmpPos = this.convertToSliderValue("2.9", 3);
				tmpStr = tmpPos + "px";
				setStyle(defLMin, {"left": tmpStr, "display": "block"});
		*/		
		// ***
		// Now set the actual slider positions

		sHAtk.setValue(sHAtk.convertToSliderKnob(this.data.AtkCurH));
		sHDef.setValue(sHDef.convertToSliderKnob(this.data.DefCurH));
		sAAtk.setValue(sAAtk.convertToSliderKnob(this.data.AtkCurA));
		sADef.setValue(sADef.convertToSliderKnob(this.data.DefCurA));
		
	},
	
	"hideChart": function() {
		log("hiding chart");
		var rows = getElementsByTagAndClassName(null, "mochi-hide");
		
		for (var i=0; i<rows.length; ++i) {
			setStyle(rows[i], {"display": "none"});
		}
	},
	
	"displayIntlError" : function() {
		log("Disp Intl Error");
		var rows = getElement("mochi-intl-error");

		setStyle(rows, {"display": "table-row"});

	},
	
	"displayNames": function() {
		var homeTags = getElementsByTagAndClassName(null, "homeTeamName");
		var awayTags = getElementsByTagAndClassName(null, "awayTeamName");
		
		var homeTeamName = this.homeTeamName;
		var awayTeamName = this.awayTeamName;
		
		log (homeTeamName);
		for (var i=0; i<homeTags.length; ++i) {
			replaceChildNodes(homeTags[i], homeTeamName); 
			if(homeTeamName!='Select Home Team') {
				setStyle(homeTags[i], {"color": "#000"});
			}
		}
		
		for (var i=0; i<awayTags.length; ++i) {
			replaceChildNodes(awayTags[i], awayTeamName); 
			if(awayTeamName!='Select Away Team') {
				setStyle(awayTags[i], {"color": "#000"});
			}
		}

		var vsDOM = getElement("vs");
		
		if ((this.homeTeamID == -1) || (this.awayTeamID == -1)) {
			swapDOM(vsDOM, this.vsOff);
		} else {
			swapDOM(vsDOM, this.vsOn);
		}		
		
	}

};

simManager = new SimManager();
addLoadEvent(simManager.initialize);

