var globals = {};

function get(id){
 return document.getElementById(id);	
}

function loaddata(){
	globals.loadtries = 20;
	loadGlobals();
	loadDeeds();
	loadNews();
	loadVillager();
	loadColors();
	loadPlayers();

	if(globals.villagercards && globals.newstable && globals.deeds && globals.colors && globals.playertables){	
		return;
	}else{
		checkData();
	}
}

function loadDeeds(){
	GSpreadsheet.load("pCRoTBbGNNnWw9_3y1lzbBA", { index: 'spaceorder' }, function(gs) {
      globals.deeds = gs;
    });
}
function loadGlobals(){
	GSpreadsheet.load("pHB0XW19aWUnybUO29EOtKQ", { index: 'id' }, function(gs) {
      gs.each(this.addVar);
    });
}

function addVar(pair){

	try{
		globals[pair.name] = eval(pair.value);
	}catch(e){
		globals[pair.name] = pair.value;
	}
}

function loadColors(){
	GSpreadsheet.load("pCRoTBbGNNnVpesCSdloyLA", { index: 'colorid' }, function(gs) {
	  globals.colors = gs;
   
    });
}

function loadVillager(){
	GSpreadsheet.load("pCRoTBbGNNnW0xL6WVPnuVQ", { }, function(gs) {
	  globals.villagercards = gs;
   
    });
	
}

function loadPlayers(){
	GSpreadsheet.load("pCRoTBbGNNnWuIiq1bafzZw", { index: 'playerid' }, function(gs) {
	  globals.players = gs;
    });
	
}


function loadNews(){
	GSpreadsheet.load("pCRoTBbGNNnVD5_oBJgX0Yw", { index: 'id' }, function(gs) {
     
	  globals.newscards = gs;
    
    });
}

function checkData(){
	if (globals.deeds){
		globals.numspaces = globals.deeds.data.length;
	}else{
		loadDeeds();
	}
	
	if(!globals.newscards){
		loadNews();
	}
	
	if(!globals.villagercards){
		loadVillager();
	}
	
	if(!globals.colors){
		loadColors();
	}
	
	if(!globals.players){
		loadPlayers();
	}
	
	
	if(globals.villagercards && globals.newscards && globals.deeds	&& globals.colors && globals.players && globals.rollarray){
		get('startbox').value = "Data Ready. Start Game";
		get('startbox2').value = "Data Ready. Start Game";
		setVisible('startbox');
		setVisible('startbox2');
		setHidden('loadbutton');
		setHidden('loadbutton2');
		clearTimeout(globals.loaddatatimer);
	}else{
		globals.loadtries--;
		if(globals.loadtries > 0){
			globals.loaddatatimer = setTimeout('checkData()', 500);
		}else{
			alert('Loading data from Google Spreadsheets failed.');
		}
	}
}

window.onload = loaddata;



function startGame(){
	buildMonoHash();
	buildBoard();
	buildDeeds();
	buildCards();
	setHidden('winbox');
	get('startnote').style.display = "none";
	//hide all cards if they are showing
	for (var i = 0; i < globals.newscards.data.length; i++){
		setHidden('newscard'+i);
	}
	for (var k = 0; k < globals.villagercards.data.length; k++){
		setHidden('villagercard'+k );
	}
	globals.seconds = globals.turnlimit;
	get('boardwrapper').style.display = 'block';
	globals.villagerorder.sort(randOrd);
	globals.newsorder.sort(randOrd);


	
	tabberAutomatic();
	setCurrentPlayer(globals.currentplayer);
	changePlayer();
	setVisible('startturn');
	updateTurnPanel('finishedturn');
	
	delete startGame;
}

function randOrd(){
	return (Math.round(Math.random()-0.5)); 
}

function endTurn(){
	// control basic game logic here.
	for(changePlayer(); globals.donehash[getCurrentPlayer()];changePlayer()){
	}
	globals.seconds = globals.turnlimit;
	if(globals.endturntimer != null){
		clearTimeout(globals.endturntimer);
		clearTimeout(globals.displaycountcall);
	}
	updateTurnPanel('finishedturn');
	//updateChildren();
}

function displayTradeCount(){
	var now = (new Date()).getTime();
	if (now >= globals.endtradetime){ 
		if(globals.displaytradecount != null){
			clearTimeout(globals.displaytradecount);
		}
	} 
	else {
		var diff = Math.floor((globals.endtradetime - now)/1000);
		get('canceltradebutton').value = 'Cancel Trade ('+diff+')';
		globals.displaytradecount = setTimeout("displayTradeCount()",500) 
	} 

}

function displayBankruptCount(){
	var now = (new Date()).getTime();
	if (now >= globals.endbankrupttime){ 
		if(globals.displaybankruptcount != null){
			clearTimeout(globals.displaybankruptcount);
		}
	} 
	else {
		var diff = Math.floor((globals.endbankrupttime - now)/1000);
		get('brokepanelbankruptcybutton').value = 'Declare Bankruptcy ('+diff+')';
		globals.displaybankruptcount = setTimeout("displayBankruptCount()",500) 
	} 

}

function displayUpgradeCount(){
	var now = (new Date()).getTime();
	if (now >= globals.endupgradetime){ 
		if(globals.displayupgradecount != null){
			clearTimeout(globals.displayupgradecount);
		}
	} 
	else {
		var diff = Math.floor((globals.endupgradetime - now)/1000);
		get('finishupgradebutton').value = 'Finish Upgrades ('+diff+')';
		globals.displayupgradecount = setTimeout("displayUpgradeCount()",500) 
	} 
}

function displayBuyCount(){
	var now = (new Date()).getTime();
	if (now >= globals.endbuytime){ 
		if(globals.displaybuycount != null){
			clearTimeout(globals.displaybuycount);
		}
	} 
	else {
		var diff = Math.floor((globals.endbuytime - now)/1000);
		get('auctionbutton').value = 'Auction ('+diff+')';
		globals.displaybuycount = setTimeout("displayBuyCount()",500) 
	} 
}

function displayRollCount(){
	var now = (new Date()).getTime();
	if (now >= globals.endrolltime){ 
		if(globals.displayrollcount != null){
			clearTimeout(globals.displayrollcount);
		}
	} 
	else {
		var diff = Math.floor((globals.endrolltime - now)/1000);
		get('startturn').value = 'Roll Dice ('+diff+')';
		globals.displayrollcount = setTimeout("displayRollCount()",500) 
	} 
}

function displaySellUpgradeCount(){
	var now = (new Date()).getTime();
	if (now >= globals.endsellupgradetime){ 
		if(globals.displaysellupgradecount != null){
			clearTimeout(globals.displaysellupgradecount);
		}
	} 
	else {
		var diff = Math.floor((globals.endsellupgradetime - now)/1000);
		get('finishsellupgradebutton').value = 'Finish Selling Upgrades ('+diff+')';
		globals.displaysellupgradecount = setTimeout("displaySellUpgradeCount()",500) 
	} 
}

function displayAuctionCount(){
	var now = (new Date()).getTime();
	if (now >= globals.endauctiontime){ 
		if(globals.displayauctioncount != null){
			clearTimeout(globals.displayauctioncount);
		}
	} 
	else {
		var diff = Math.floor((globals.endauctiontime - now)/1000);
		get('finishauctionbutton').value = 'Finish Auction ('+diff+')';
		globals.displayauctioncount = setTimeout("displayAuctionCount()",500) 
	} 

}


function displayCountdown(){
	var now = (new Date()).getTime();
	if (now >= globals.endturntime){ 
		if(globals.displaycountcall != null){
			clearTimeout(globals.displaycountcall);
		}
	} 
	else {
		var diff = Math.floor((globals.endturntime - now)/1000);
		get('finishturnbutton').value = 'End Turn ('+diff+')';
		globals.displaycountcall = setTimeout("displayCountdown()",500) 
	} 
}

function changePlayer(){
	for(var k = 0; k < globals.dmov.player.length; k++){
		globals.dmov.player[k].parentNode.parentNode.style.backgroundColor = '#fff';
	}

	for(var i = 0; i < globals.dmov.player.length; i++){
		if(globals.dmov.player[i].checked){
			globals.dmov.player[i].checked = false;
			var id = (i+1)%globals.dmov.player.length;
			get('playertabswrapper').tabber.tabShow(id);
			hilitetab(id);
			globals.dmov.player[id].checked = true;
			setCurrentPlayer(globals.dmov.player[id]);
			tutor("Your turn " + getCurrentPlayer());
			globals.dmov.player[id].parentNode.parentNode.style.backgroundColor = '#bfb';
			return;
		}
	}	
	
		
}

function hilitetab(id){
	var tbag = get('playertabswrapper').tabber.tabs;
	for(var i in tbag){
		tbag[i].li.childNodes[0].style.backgroundColor = '';
	}
	tbag[id].li.childNodes[0].style.backgroundColor = '#bfb';
}

function getCurrentPlayer(){
	var dmov = get('mover');
    var p = "";
    for(var i = 0; i < dmov.player.length; i++){
        if(dmov.player[i].checked){p = dmov.player[i].value;}
    }
	return p;	
}

function getPlayer(i){
	return globals.dmov.player[i].value;
}

function isCurrentPlayer(p){
	if(getCurrentPlayer() == p){
		return true;
	}else{
		return false;
	}
}

function setCurrentPlayer(p){
		globals.currentplayer = p;
		for(i = 0; i < globals.dmov.player.length; i++){
        if(globals.dmov.player[i].value == p){
			globals.dmov.player[i].checked = true;
			return;
		}
    }	
}

function setVisible(obj, parent){
	if(typeof obj == 'string'){
		obj = get(obj);
	}
	obj.style.visibility = 'visible';
	//obj.style.display = '';
	if(parent){
		parent.appendChild(obj);
	}else if(obj.realParent){
		obj.realParent.appendChild(obj);
	}
	return;
}

function setEverythingVisible(){
	for(i =1; i< globals.deeds.data.length; i++){
		setVisible(i+'buy');
		setVisible(i+'upgrade');
		setVisible(i+'sellup');
		
	}
}

function setHidden(obj, parent){
	if(typeof obj == 'string'){
		obj = get(obj);
	}
	if(parent){
		obj.realParent = parent;
		globals.offscreen.appendChild(obj);
	}
	obj.style.visibility = 'hidden';
	//obj.style.display = 'none';
	return;
}

function getCash(p){
	var cash = parseInt(get(p+'score').innerHTML);
	if(isNaN(cash)){ //error condition.
		kalert(cash + "is not a number");
	}
	else{
		return cash; 
	}
}
function getCell(table, i, j){
	return table.rows[j].cells[i];
}

function indexCell(table, i, j){
    var cell = getCell(table,i,j);
	var str = '\('+ i + '\,'+ j +'\) ';
    cell.innerHTML = str + cell.innerHTML;
}

function indexTable(){
	var board = get('board1');
    //this is kinda funky cuz we got to do math on the indexes.
    for(i = 0; i < board.rows[i].cells.length; i++){
        for(j = 0; j < board.rows.length; j++){
        	indexCell(board, i,j);
        }
    }
}

function rollDice(r){
	globals.state = '';
	var p = getCurrentPlayer();
	var roll = randomRoll();
	if(r != undefined){roll = r;}

	//get('diceresult').innerHTML = roll[0];
	move(roll,true, true);	
	//updateTurnPanel();
}
function hasCash(p){
	return (getCash(p) >= 0);
}

function updateTurnPanel(state){
	// set things visible and hidden according to state of game.
	// lots a rules here.
	if(!state){
		state = globals.state;
	}
	
	// if there's a timer on finish turn need to eliminate since we just updated something
	if(globals.cardtimer != null){
		clearTimeout(globals.cardtimer);
		clearTimeout(globals.docardtimer);
	}
	if(globals.endturntimer != null){
		clearTimeout(globals.endturntimer);
		clearTimeout(globals.displaycountcall);
	}
	if(globals.endbankrupttimer != null){
		clearTimeout(globals.endbankrupttimer);
		clearTimeout(globals.displaybankruptcall);
	}
	if(globals.endauctiontimer != null){
		clearTimeout(globals.endauctiontimer);
		clearTimeout(globals.displayauctiontimer);
	}
	if(globals.endtradetimer != null){
		clearTimeout(globals.endtradetimer);
		clearTimeout(globals.displaytradetimer);
	}
	if(globals.endupgradetimer != null){
		clearTimeout(globals.endupgradetimer);
		clearTimeout(globals.displayupgradetimer);
	}
	if(globals.endsellupgradetimer != null){
		clearTimeout(globals.endsellupgradetimer);
		clearTimeout(globals.displaysellupgradetimer);
	}
	if(globals.endbuytimer != null){
		clearTimeout(globals.endbuytimer);
		clearTimeout(globals.displaybuytimer);
	}
	if(globals.endrolltimer != null){
		clearTimeout(globals.endrolltimer);
		clearTimeout(globals.displayrolltimer);
	}
	
	var p = getCurrentPlayer();
	//get('turnpaneltitle').innerHTML = "Your turn " + p;

	if(!hasCash(p)){
		setVisible('brokepanel');
		setHidden('finishturnbutton');
		setHidden('startturn');
		
		setVisible('tradebutton');
	}else{
		setHidden('brokepanel');
		
	}
	if(state == "done"){
		setHidden('tradebutton');
		setHidden('startturn');
		setHidden('tradeoptions');
		setHidden('upgradebutton');
		setHidden('sellupgradebutton');
		setHidden('finishturnbutton');
		setHidden('brokepanel');
		
	}else if(state == 'finishedturn'){
		setVisible('startturn');
		setHidden('upgradebutton');
		setHidden('sellupgradebutton');
		setHidden('tradebutton');
		setHidden('tradeoptions');
		setHidden('finishturnbutton');
		setHidden('brokepanel');
		globals.endrolltimer = setTimeout("rollDice()", globals.rolllimit*1000);
		globals.endrolltime = (new Date).getTime() + globals.rolllimit*1000;
		displayRollCount();
	}else if(state == 'bankruptcy'){
		globals.endbankrupttimer = setTimeout("bankruptcy(globals.broke, globals.owed)", globals.bankruptlimit*1000);
		globals.endbankrupttime = (new Date).getTime() + globals.bankruptlimit*1000;
		displayBankruptCount();
	
		setHidden('upgradebutton');
		setHidden('sellupgradebutton');
		setVisible('tradebutton');
		setHidden('finishturnbutton');
		setVisible('brokepanel');
	}else if(state == 'trading'){
		globals.endtradetimer = setTimeout("cancelTrade()", globals.tradelimit*1000);
		globals.endtradetime = (new Date).getTime() + globals.tradelimit*1000;
		displayTradeCount();
	
		setHidden('tradeoptions');
		setHidden('upgradebutton');
		setHidden('sellupgradebutton');
		setHidden('finishturnbutton');
		setHidden('brokepanel');
		
	
	}else if(state == 'buying'){
		setHidden('finishturnbutton');
		setHidden('startturn');
		
		setHidden('tradebutton');
		setHidden('tradeoptions');
		globals.endbuytimer = setTimeout("auctionDeed(globals.currentdeed)", globals.buyorauctionlimit*1000);
		globals.endbuytime = (new Date).getTime() + globals.buyorauctionlimit*1000;
		displayBuyCount();
	}else if(state == 'auctioning'){
		globals.endauctiontimer = setTimeout("finishAuction()", globals.auctionlimit*1000);
		globals.endauctiontime = (new Date).getTime() + globals.auctionlimit*1000;
		displayAuctionCount();
	  	setHidden('finishturnbutton');
	  	
	  	setHidden('startturn');
	}else if(state == 'carding'){
		setHidden('finishturnbutton');
		setHidden('startturn');
		setHidden('tradebutton');
		setHidden('tradeoptions');
		setHidden('sellupgradebutton');
		setHidden('upgradebutton');
	}else if(state == 'upgrading'){
		setHidden('finishturnbutton');
		
		setHidden('tradebutton');
		setHidden('tradeoptions');
		setHidden('sellupgradebutton');
		setHidden('upgradebutton');
		globals.endupgradetimer = setTimeout('finishUpgrade()', globals.upgradelimit*1000);
		globals.endupgradetime = (new Date).getTime() + globals.upgradelimit*1000;
		displayUpgradeCount();
	}else if(state == 'sellupgrading'){
		setHidden('finishturnbutton');
		
		setHidden('tradebutton');
		setHidden('tradeoptions');
		setHidden('sellupgradebutton');
		setHidden('upgradebutton');
		globals.endsellupgradetimer = setTimeout('finishSellUpgrade()', globals.upgradelimit*1000);
		globals.endsellupgradetime = (new Date).getTime() + globals.upgradelimit*1000;
		displaySellUpgradeCount();
	}else{
	  setHidden('startturn');
	  setVisible('tradebutton');
	  setHidden('tradeoptions');
	  setVisible('finishturnbutton');
	  globals.endturntimer = setTimeout('endTurn()', globals.turnlimit*1000);
	  globals.endturntime = (new Date).getTime() + globals.turnlimit*1000;
	  displayCountdown();

	  if(hasUndevelopedMonopoly(p) ){
			setVisible('upgradebutton');
		}else{
			setHidden('upgradebutton');
		}	
		if(hasUpgrades(p)){
			setVisible('sellupgradebutton');
		}else{
			setHidden('sellupgradebutton');
		}
	}
	if(globals.broke == getCurrentPlayer()){
		setHidden('finishturnbutton');
	}
}

function allNeedMet(){
	// sum up need of all villager cards and see what the deal is
	// or set arbitrary threshold and make 
	// change monopoly effect to increase your Pass Go money. 
	return globals.villageindex >= (globals.villagercards.length - 1);
}

function allStarted(){
	//return true or false;
	for( var k in globals.monohash){
		for(var j in globals.monohash[k]){
			if(getOwner(globals.monohash[k][j]) == ''){
				return false;
			}
		}
	}
	return true;
}
function allButHealthCities(){
	//return true or false;
	for( var k in globals.monohash){
		for(var j in globals.monohash[k]){
			if(globals.monohash[k][j] == 3){ 
				continue;
			}
			
			if(getOwner(globals.monohash[k][j]) == ''){
				setOwner(globals.monohash[k][j], getCurrentPlayer());
			}
		}
	}
}


function netWorth(p){
	var sum = getCash(p); 
	
	// cash + all business values + upgrade values
	for(var i in globals.deeds.data){
		if(getOwner(i) == p){
			var deed = getDeed(i);
			sum += getPrice(i);
		}
	}
	return sum;
}

//return array [0] = player; [1] = networth
function calcWinner(){
	var winner = [getCurrentPlayer(), netWorth(getCurrentPlayer()	)];
	for(var k in globals.dmov.players){
		net = netWorth(globals.dmov.players[k].value);
		if(net > winner[1]){
			winner = [globals.dmov.players[k].value, net];
		}else if (net == winner[1]){
			if(globals.dmov.players[k].value == net[0]){
				//were company player against self
				continue;
			}else{
				//tie
				globals.winnertied = true;
				
			}
		}else{
			continue;
		}
	}
	return winner;
}

function gameOver(){
	// tally up who has sold the most stuff to villagers.
	// need a sales hash in addition to inventory hash.
	// maybe store sales revenue in player table.
	var winner = globals.players.select(0);
	for (var i = 0; i < globals.players.data.length; i++){
		if (globals.players.select(i).sales > winner.sales){
			winner = globals.players.select(i);
		}
	}
	win(winner.playerid);
}


function win(player){
	if (typeof player == 'string'){
		//get('winbox').innerHTML = player + " wins with a net worth of $" + netWorth(player);
		get('winbox').innerHTML = player + " wins with total sales of $" + globals.players.select(player).sales;
		setVisible('winbox');
	}else if(typeof player == 'object'){
		get('winbox').innerHTML =player[0] + " wins with a net worth of $" + player[1]+"!";
		setVisible('winbox');
	}else{
		kalert(player + " unrecognized type " + typeof player);
	}
	globals.state = "done";
	updateTurnPanel('done');
	get('startbox').value = "[Start New Game]";
	setVisible('startbox');
	updateTurnPanel('');
}

function tutor(msg){
	kalert(msg);
}

function kalert(msg){
	// display div with ok button
	// make prettier later on.
	// put timer on it's display of like 4 seconds.
	get('divmsgwrapper').innerHTML = msg;
	if(globals.msgtimeout != null){
		clearTimeout(globals.msgtimeout);
	}
	showmsg(globals.divmsg);
	globals.msgtimeout = setTimeout('closemsg()', 4000);
	
}
function showmsg(msg){
	
	setVisible(msg);
}

function showTutorial(){
	get('tutorial').style.display = "block";
	setVisible('tutorial');
}
function closemsg(){
	get('divmsgwrapper').innerHTML = "";
	setHidden(globals.divmsg);
}

function removePlayer(id){
	if(getCurrentPlayer() == id){
		endTurn();
	}

	var row = get('Radio'+id).parentNode.parentNode;
	var parent = row.parentNode;
	parent.removeChild(row);
	parent = get(id).parentNode;
	parent.removeChild(get(id));	
}

function bankruptcy(fromP, toP){

	setHidden('brokepanel');
	globals.state = '';
	globals.donehash[fromP] = true;
	//transfer properties in their current state
	
	for(var i = 1; i < globals.deeds.data.length; i++){
		if(getOwner(i) == fromP){
			setOwner(i, toP);
			updateMonoState(i);
		}
	}
	
	//bankrupt player in player table
	for(i = 0; i < globals.dmov.player.length; i++){
		if(globals.dmov.player[i].value == fromP){
		  get(fromP +'score').innerHTML = "xxxx";
		  continue;
		}
	}
	var bkmsg = 'kalert("FROMP properties transferred to TOP");';
	bkmsg = bkmsg.replace('FROMP', fromP);
	bkmsg = bkmsg.replace('TOP', toP);
	setTimeout(bkmsg, 2000);
	
	if(oneLeft()){
		win(toP);
	}else if(fromP == getCurrentPlayer()){
		endTurn();
	}
	
}

function oneLeft(){
	var c = 0;
	for (var o in globals.donehash){
		c++;
	}
	return (c >= (globals.dmov.player.length - 1));
}

function hasUndevelopedMonopoly(p){
	 var does = false;
	 var deed = undefined;
	 for(i = 1; i < globals.deeds.data.length; i++){
	 	  if(p == getOwner(i)){
	 	  	deed = getDeed(i);
	 	  	if(deed.monostate > -1 && deed.monostate < 5){
	 	  		 return true;
	 	  	}
	 	  }
	 }
	 return does;
}


function hasUpgrades(p){
	var does = false;
	var deed = undefined;
	for(i = 1; i < globals.deeds.data.length; i++){
 	 if(p == getOwner(i)){
 	  	deed = getDeed(i);
 	  	if(deed.monostate > 0){
 	  		 return true;
 	  	}
 	  }
	}
	return does;
}

function randomRoll(){
	//gen two random number beteen 1 nand 6
	var roll = new Array();
	var raw = Math.floor(Math.random() * 36);
	roll = globals.rollarray[raw].split(',');
	roll[0] = parseInt(roll[0]);
	roll[1] = parseInt(roll[1]);
	return roll;	
}


//rearranging this to be recursive
function animatemove(fromspace, tospace, token){
	// if first call set up recursion of animation
	// increment fromspace until it reaches tospace in the recursion
	// increment fromspace when every 500 milli interval before destination time.
	var now = (new Date).getTime();
	
	if(globals.timemarkers){
		if(now >= globals.timemarkers[globals.timemarkers.length-1]){
			// finish this recursion
			globals.timemarkers = null;
			clearTimeout(globals.animatetimer);
			globals.token = null;
			return;
		}else{
			// do next step of recursion
			for (var time = 0; time < globals.timemarkers.length; time++){
				var next = globals.timemarkers.pop();
				if (next >= now){
					//update space
					get(fromspace+'cage').appendChild(globals.token);
					
					fromspace++;
					globals.animatetimer = setTimeout('animatemove('+fromspace+','+tospace+',globals.token)', 250);
					return;
				}
			}
		}	
	}else{
		//setup recursion
		if (typeof token == 'string'){
			globals.token = get(token);
		}else{
			globals.token = token;
		}
		var diff = (tospace-fromspace);
		var dest = now + diff*500;
		// build array of time markers
		globals.timemarkers = [];
		for(var i = now; i < dest; i+=500){
			globals.timemarkers.push(i);
		}
		var exestring = 'animatemove('+fromspace+','+tospace+',globals.token)';
		globals.animatetimer = setTimeout(exestring, 250);
	}	
}

function move(roll, okGo, rolled){
	if(rolled == undefined){
		rolled = true;
	}
	var state = undefined;
    // need to update roll to array.
	if(okGo == undefined){okGo = true;}
	var p = "";
	for(var i = 0; i < globals.dmov.player.length; i++){
	  if(globals.dmov.player[i].checked){p = globals.dmov.player[i].value;}
	}
	var token= get(p);
  //making it a single dice thing
  	var r = roll[0];
	if(isNaN(r)){r = roll;}  // some function that call move may still be passing scalar for roll
    var id = getCurrentSpace(p);
    var newid = (id + parseInt(r));
	if(newid >= globals.numspaces ){
		if(okGo){doGo(p);}
		//14 should change to 0,
		//15 should change to 1
		//13 should stay 13
		newid = newid % (globals.numspaces);
	}
	
	if(newid < 0){
		//newid -1 should change to 13
		newid += globals.numspaces;
	}
	
	get('cage'+newid).appendChild(token);
	var mult = 1;
	if(rolled){
		kalert(p + " rolls a " + roll[0] + " and lands on "+ getTitle(newid));
	}else{
		kalert(p +" lands on "+ getTitle(newid));
	}
	
	globals.currentspace = newid;
	if(newid == 0){
		doGo(p);
		updateTurnPanel('');
	}else if(getTitle(newid).indexOf('News')> -1){
		updateTurnPanel('carding');
		if(globals.tutorialmode) tutor(get('newshelp').innerHTML);
		showNewsCard(p);
		
	}else if(getTitle(newid).indexOf('Villager') > -1){
		updateTurnPanel('carding');
		if(globals.tutorialmode) tutor(get('villagerhelp').innerHTML);
		showVillagerCard2(p, globals.villagerindex, newid);
		
	}else{
		if(getOwner(newid)!= ''){ // if there is an owner
			//payRent(p,getOwner(newid), newid, mult, r);
			buyStuff(p, getOwner(newid), newid, globals.deeds.select(newid).buypriceperunit, globals.deeds.select(newid).salequantity1);
			
			updateTurnPanel('');
		} else{
			state = 'buying';
			updateTurnPanel('buying');
			globals.deedtimer= setTimeout('showBuyWindow('+newid+', "'+p+'");', globals.deeddelay);	
		}
 	}	
}

function showProduceWindow(sid){
	globals.selectedbiz = sid;
	get('deed'+sid).appendChild(get('producewindow'));
	setVisible(get('producewindow'));
}
function showBuyWindow(sid, p){
	// show deed simultaneously
	get('buybutton').value = "Start for $"+getPrice(sid);
	globals.currentdeed = sid;
	showDeed(sid);
	var deedcard = get('deed'+sid);
	setHidden('closebutton'+sid);
	var buy = get('buywindow');
	deedcard.appendChild(buy);
	setVisible(buy);
	if(globals.tutorialmode) tutor(get('buyauctionhelp').innerHTML);
}

function getNumUpgrades(id){
	var upgradebox = get('upgrade'+id);
	if(upgradebox.innerHTML.match(/[M]/) != null){return 5;}
    else{
		return upgradebox.getElementsByTagName('span').length;
	}
}

function buildBoard(){	
	players = getPlayers();
	/*
	for(var k in players){
		get(players[k]+'proplist').innerHTML = "";
	}
	*/
	for(var i = 0; i <  globals.deeds.data.length; i++){
		
		get('space'+i).innerHTML = makeSpace(i);
		makeDraggable('space'+i);
		globals.buyWhat[i] = globals.deeds.select(i).type;
    }
	
	get('boardmidsection').appendChild(get('turnwrapper'));
	//get('hud').appendChild(get('turnpanel'));
	  //add player tokens.
	
	resetPlayers();
}

function addOwnerPropIcon(deedid){
	// generate some spans with borders and background colors to represent each property; 
	// grab the color the same way as makeSpace.
	var propicon = "<span class='propicon' id='PID' style='background-color:WHITE;border:2px solid BRCOLOR;'>&nbsp;&nbsp;</span>";
	var nexticon = "";
	var proplist = "";
	var c = 0;
    var r = '';
    try{
		c = parseInt(globals.deeds.select(deedid).colorid);
		if(isNaN(c)){return;}
		r = globals.colors.select(c).colorcode;
		r = r.replace(/^\s*|\s*$/g,'');
	}catch(e){
		return;
    }
	var players = getPlayers();
	for (var i = 0;i < players.length; i++){
		// add a spot to the list
		proplist = get(players[i]+'proplist');
		nexticon = propicon;
		nexticon = nexticon.replace('PID', players[i]+'propicon'+deedid); 
		/*nexticon = nexticon.replace('WHITE', r);*/
		nexticon = nexticon.replace('BRCOLOR', r);
		proplist.innerHTML += nexticon;
	}
}

function makeSpace(i){
	var id= i
	var t = globals.deeds.select(i).name;
	var p = globals.deeds.select(i).startupcost;
	var d = "";
	var deedstr = "";
	if(!isNaN(parseInt(p))){
		d = "$";
		deedstr = "onClick=\"showDeed("+id+");\"";
	}
	var c = 0;
	var r = '#fff';
	try{
		c = parseInt(globals.deeds.select(i).colorid);
		r = globals.colors.select("c"+c).colorcode;
	}catch(e){
		r = '#fff';
	}
	var s = "<div class=\"spacecontent\"  "+deedstr+">";
	s += "<div>&nbsp;<span id=\'upgrade"+id+"\'><\/span><\/div>";
	s += "<div class=\"spacetitle\"  style=\"background-color:"+r+"\"><a><span  id=\'title"+id+"\'  > "+t+"<\/span><\/a><\/div>";
	s += "<div>&nbsp;<span id=\'cage"+id+"\' colspan='2'></span></div>";
	if(!isNaN(p)){
	  s += "<div class=\"pricediv\">&nbsp;<span id=\'own"+id+"\'><\/span>"+d+"<span id=\'price"+id+"\'>"+p+"<\/span><\/div>";
	}
	s += "<\/div>";
	//alert(s);
	return s;
}

function getPlayers(){
	var players  = new Array(); 
	for( var i = 0; i < globals.dmov.length; i++){
		players.push(globals.dmov.player[i].value); 
	}	
	return players;
}

//Testing Functions
function givePumps(){
	//give everybody 20 pumps

	for(var i = 0; i < globals.players.data.length; i++){
		//updateInventory(globals.players.select(i).playerid);
		globals.inventory[globals.players.select(i).playerid]['Pump'] = 20;
		updateInventory(globals.players.select(i).playerid);
	}
}

function giveAll(){
	for(var i = 0; i < globals.players.data.length; i++){
		for(var k = 0; k < globals.deeds.data.length; k++){
			globals.inventory[globals.players.select(i).playerid][globals.deeds.select(k).type] = 2000;
			updateInventory(globals.players.select(i).playerid);
		}
	}
}

function burnFish(){
	 // test deed transfer
	 forecloseAll('Fish');
	 setOwner(3, 'Fish');
	 //set fish cash to $0;
	 setCash('Fish', 0);
	 //set pig owner of CFWShops.
	 setOwner(5, 'Pig');
	 //set fish properties to nothing;
	 //make fish land on CFWShops. //maybe just dothis with control panel.
}

function burnFishBear(){
	burnFish();
	forecloseAll('Bear');
	setOwner(6, 'Bear');
	setCash('Bear', 0);
}

function resetPlayers(){
	var template = '<img class="token" id="PLAYERID" src="TOKENURL">';
	var tabtemplate = get('playertemplate').innerHTML;
	var toks = "";
	var tabholder = get('playertabswrapper');
	tabholder.innerHTML = "";
	for(var i = 0; i < globals.players.data.length; i++){
		//init inventory
		globals.inventory[globals.players.select(i).playerid] = [];
		var playertok = template;
		
		var tab = tabtemplate;
		playertok = playertok.replace('PLAYERID',globals.players.select(i).playerid);
		playertok = playertok.replace('TOKENURL', globals.players.select(i).tokenurl);
		toks+= playertok;
		tab = tab.replace('PLAYERNAME1', globals.players.select(i).playername.substring(0,9));
		tab = tab.replace('PLAYERNAME2',  globals.players.select(i).playername.substring(0,9));
		tab = tab.replace('PLAYERID1',globals.players.select(i).playerid);
		tab = tab.replace('PLAYERID2Radio','Radio'+globals.players.select(i).playerid);
		tab = tab.replace('PLAYERID3',globals.players.select(i).playerid);
		tab = tab.replace('PLAYERID4',globals.players.select(i).playerid);
		tab = tab.replace('PLAYERID5',globals.players.select(i).playerid);
		tab = tab.replace('PLAYERID6',globals.players.select(i).playerid);
		tab = tab.replace('PLAYERID7',globals.players.select(i).playerid);
		tab = tab.replace('PLAYERSALES',0);
		tab = tab.replace('PROFILEPIC', globals.players.select(i).profileurl);
		tab = tab.replace('TOKENURL', globals.players.select(i).tokenurl);
		tab = tab.replace('PLAYERCASH', globals.players.select(i).startingcash);
		tabholder.innerHTML += tab;
		updateInventory(globals.players.select(i).playerid);
	}
	
	
	get("cage0").innerHTML = toks;	
	var players = getPlayers();
	get('bankscore').innerHTML = 1000000;
	
}

function hideDeed(id){
	setHidden('closebutton'+id);
	setHidden('deed'+id);
	setHidden('producewindow');
}

function buildDeeds(){
    var deedbox = get("deedbox");
    deedbox.innerHTML = "";
	var template = get('deedtemplate').innerHTML;
    var divbaby = template;
	var color = "";
	var deed = null;
    for(var i = 0; i < globals.deeds.data.length;i++){
		deed = getDeed(i);
	
		deed.monostate = -1;
		color = getColor(i);
		if(deed.startupcost == ""){
			continue;
		}
        
		divbaby = divbaby.replace('DEEDIMAGE',deed.iconurl);
		divbaby = divbaby.replace('IDdeed','deed'+i);
		divbaby = divbaby.replace('IDclosebutton','closebutton'+i);
		divbaby = divbaby.replace('\'closeID\'', i);
		divbaby = divbaby.replace('WHITE', color);
		divbaby = divbaby.replace('TITLE', deed.name);
		divbaby = divbaby.replace('TYPE', deed.type);
		divbaby = divbaby.replace('QUANTITY', deed.salequantity1);
		divbaby = divbaby.replace('UNITPRICE', '$'+deed.buypriceperunit);
		divbaby = divbaby.replace('TOTALSALE', '$'+deed.sale);
		divbaby = divbaby.replace('DESCRIPTION',deed.description);
		deedbox.innerHTML += divbaby;
		divbaby = template;
	}
    initColors();
}

function initColors(){
    //give each deed a color id

    for(i = 0; i < globals.deeds.data.length; i++){
		if(globals.deeds.select(i).colorid == ""){continue;}
		var deed = get('deed'+i);
		deed.style.backgroundcolor = getColor(getColorId(i));
    }
}

function getColorId(id){
	
    return globals.deeds.select(id).colorid;
}

function getColor(id){
	var c = 0;
	c = parseInt(globals.deeds.select(id).colorid.replace(/^\s*|\s*$/g,''));
	if(isNaN(c)){
		c = 0;
		r = 'rgb(255,255,255)';
	}else{
		r = globals.colors.select("c"+c).colorcode.replace(/^\s*|\s*$/g,'');
	}
	return r;
}
function getColorCode(monoid){
	return globals.colors.select("c"+monoid).colorcode.replace(/^\s*|\s*$/g,'');
}

function updateTrader(trader){
	globals.state = 'trading';
	globals.trader = trader;
	get('owned1').innerHTML = makeDeedList(getCurrentPlayer());
	get('owned2').innerHTML = makeDeedList(trader);
	var tradebox = get('tradebox');
	get('owner1').innerHTML = getCurrentPlayer();
	get('owner2').innerHTML =  trader;
	get('owner1cash').innerHTML = getCash(getCurrentPlayer());
	get('owner2cash').innerHTML = getCash(trader);
	get('offerowner2').innerHTML = trader;
	get('offerowner1').innerHTML = getCurrentPlayer();
	setVisible('tradebox');
	get('tradeoptions').innerHTML = '';
	setHidden('tradeoptions');
	updateTurnPanel('trading');
}

function showTradeChoice(){
	var str = " with ";
	var trader1 = getCurrentPlayer();
	var template = '<span class="button" onclick="updateTrader(\'PLAYER\')">[TRADER]</span>';
	var button = "";
	for(var i = 0; i < globals.dmov.player.length; i++){
		if(globals.dmov.player[i].value == trader1){continue;}
		if(globals.donehash[globals.dmov.player[i].value]){continue;}
		button = template;
		button = button.replace('PLAYER', globals.dmov.player[i].value);
		button = button.replace('TRADER', globals.dmov.player[i].value);
		str += button;
	}
	get('tradeoptions').innerHTML = str;
	setVisible('tradeoptions');
}

function trade(){
	globals.state = "trading";
	if(globals.tutorialmode) tutor(get('tradehelp').innerHTML);
	showTradeChoice();
}

function upOffer(id,cash){
	var coffer = parseInt(get('cashoffer'+id).innerHTML);
	var score = parseInt(get(get('owner'+id).innerHTML+'score').innerHTML);
	if((coffer+cash) > score){
		kalert(get('owner'+id).innerHTML + ' can only offer up to $' +score);
		return;
	}
	if(isNaN(coffer)){coffer = 0;}
	coffer += cash;
	get('cashoffer'+id).innerHTML = coffer;	
}

function testDeedList(pid){
	var node = makeDeedList(pid);
	document.body.innerHTML += node;
}


function getTitle(id){
	return globals.deeds.select(id).name;
}

function makeDeedList(pid){
	//build list items with pid and sid built into id
	var html = '';
	for(i = 1; i < globals.deeds.data.length; i++){
		if(pid == getOwner(i)){
			//add to list
			var id = pid+'deed'+i;
			var t = getTitle(i);
			var color = getColorCode(getColorId(i));
			html += '<li><input type="button" class="button" style="background-color:'+color+'" "onclick="offerDeed(this);" id="'+id+'" value="'+t+'" /></li>';
		}
	}
	
	return html;
}

function offerDeed(deed){
	//need to move li into selected box.
	//determine which owned box it's in.

	var parent = deed.parentNode.parentNode;
	if(parent.id == 'owned1'){
		globals.selectbox = get('selected1');
	}else if(parent.id == 'owned2'){
		globals.selectbox = get('selected2');
	}else if(parent.id == 'selected1'){
		globals.selectbox = get('owned1');
	}else if(parent.id == 'selected2'){
		globals.selectbox = get('owned2');
	}else{
		throw("No appropriate parent for deed choice" + globals.selectbox);
	}
	//append to corresponding selected box.
	globals.selectbox.appendChild(deed);
	
}

function acceptTrade(){
	setHidden('tradebox');
	globals.state = '';
	updateTurnPanel('');
	//Do accounting of money and deeds offered.
	var player1 = get('owner1').innerHTML;
	var player2 = get('owner2').innerHTML;
	var selected1 = get('selected1');
	var selected2 = get('selected2');
	var msg = "P1 trades with P2 EXC1 for EXC2";
	var exc1 = '';
	var exc2 = '';
	var cash1 = parseInt(get('cashoffer1').innerHTML);
	var cash2 = parseInt(get('cashoffer2').innerHTML);
	if(isNaN(cash1)){ cash1 = 0;}
	if(isNaN(cash2)){ cash2 = 0;}

	//then payplayers
	if(cash1 > 0) {
	  exc1 += '$'+cash1;
	  payPlayer(player1, player2, cash1, false);
	}

	if(cash2 > 0){
	  payPlayer(player2, player1, cash2, false); //very redundant but what the heck
	  exc2 += '$'+cash2;
	}
	//then setOwner on the deeds.
	for(var i = 0; i < selected1.childNodes.length; i++){
		var itemid = selected1.childNodes[i].id;
		var pile = itemid.split('deed');
		var deedid = pile[1];
		if(pile.length <= 1){
			deedid = pile[0];
		}
		setOwner(deedid, player2);
			exc1 += ', '+get('title'+deedid).innerHTML;
	}

	for(var k = 0; k < selected2.childNodes.length; k++){
		var itemid = selected2.childNodes[k].id;
		var pile = itemid.split('deed');
		var deedid = pile[1];
		if(pile.length <= 1){
			deedid = pile[0];
		}
		setOwner( deedid, player1);
		exc2 += ', '+ get('title'+deedid).innerHTML;
	}
	if(exc1[exc1.length-1] == ',') exc1 = exc1.substring(0, exc1.length-1);
	if(exc2[exc2.length-1] == ',') exc2 = exc2.substring(0, exc2.length-1);
	if(exc1[0] == ',') exc1 = exc1.substring(2, exc1.length);
	if(exc2[0] == ',') exc2 = exc2.substring(2, exc2.length);
	msg = msg.replace('EXC1', exc1);
	msg = msg.replace('EXC2', exc2);
	msg = msg.replace('P1', player1);
	msg = msg.replace('P2', player2);
	kalert(msg);
	//cleanout all the Trade objects.
	clearTrade();
	

}

function clearTrade(){
	//clean out all the variables.
	get('owned1').innerHTML = "";
	get('owned2').innerHTML = "";

	get('cashoffer1').innerHTML = "0";
	get('cashoffer2').innerHTML = "0";
	get('selected1').innerHTML = "";
	get('selected2').innerHTML = "";
	//?anything else?
}

function resetTrade(){
	//clearTrade();
	get('cashoffer1').innerHTML = "0";
	get('cashoffer2').innerHTML = "0";
	get('owned1').innerHTML = makeDeedList(getCurrentPlayer());
	get('owned2').innerHTML = makeDeedList(globals.trader);
	get('selected1').innerHTML = "";
	get('selected2').innerHTML = "";
	updateTrader(get('owner2').innerHTML);
}

function cancelTrade(){
	clearTrade();
	globals.state = "";
	setHidden('tradebox');	
	updateTurnPanel();
}

function auctionDeed(id){
	globals.state = "auctioning";

	setHidden('buywindow');
	hideDeed(id);
	clearAuctionTable();
	globals.auctiondeedid = id;
	initBidders();
	setVisible('auctiontable');
	var deeddisplay = get('deeddisplay');

	var deedhtml = get('deed'+id).innerHTML;
	deeddisplay.innerHTML = deedhtml;
	globals.currentdeed = "";	
	updateTurnPanel('auctioning');
}

function finishAuction(){
	//get topbidder, topbid
	var topbidder = get('topbidder').innerHTML;
	var topbid = parseInt(get('topbid').innerHTML);
	if(!isNaN(topbid) && (get(topbidder+'score') != undefined )){
		payBank(topbidder, topbid);
		setOwner(globals.auctiondeedid, topbidder);
		var title = get('title'+globals.auctiondeedid).innerHTML;
		kalert(topbidder+" buys "+ title + " for $"+topbid+".");
	}
	setHidden('auctiontable');
	// = false;
	globals.state = '';
	updateTurnPanel();
}

function upBid(pindex, cash){
	//match index to player id
	var bid   = get('bid'+pindex);
	var p = get('bidder'+pindex).innerHTML;
	var score = parseInt(get(p+'score').innerHTML);
 	var cbid  = parseInt(bid.innerHTML);
	
	if(isNaN(cbid)){cbid=0;}
	var newbid = cbid + cash;
	if(newbid > score){
		kalert(p+" cannot afford bid.");
		return;
	}else{
		cbid += cash;
		bid.innerHTML = cbid;
		updateTopBidder();	
	}
}

function clearAuctionTable(){
	var deed  	  = get('deeddisplay');
	var topbid 	  = get('topbid');
	var topbidder = get('topbidder');
	for(i = 1; i < 4;i++){
		get('bid'+i).innerHTML = '0';
	}
	deed.innerHTML = '';
	topbid.innerHTML = 0;
	topbidder.innerHTML = 'No one yet';
	globals.auctiondeedid = '';
}

function initBidders(){
	for(i = 0; i < globals.dmov.length; i++){
		if(globals.donehash[globals.dmov[i].value]){continue;}  // don't add if they are bankrupt
		var n = i+1;
		get('bidder'+n).innerHTML = globals.dmov[i].value; + ": $"+get(globals.dmov[i].value + 'score');
	}
}

function updateTopBidder(){
	//make some array to go through
	//old top bid and top bidder
	var bid	  	  = get('topbid');
	var topbidder = get('topbidder');
	var topbid 	  = parseInt(bid.innerHTML);
	if(isNaN(topbid)){topbid=0;}

	for(var i = 1; i <= globals.dmov.length; i++){
		var pbid = parseInt(get('bid'+i).innerHTML);
		if(isNaN(pbid)){return;} 
		if(pbid > topbid){
			bid.innerHTML = pbid;
			topbidder.innerHTML = getPlayer(i-1);
		}
	}
}

function getPrice(id){
	var price = globals.deeds.select(id).startupcost;
	
	price = price.replace("","");
	return parseInt(price);
}


function getUpgradePrice(id){
	
	var deed = getDeed(id);
	return parseInt(deed.upgradecost);
}

function buyDeed(id){
	var p = getCurrentPlayer(); 
	
    var cash = parseInt(get(p+'score').innerHTML);
    var price = getPrice(id);
    var bankscore = parseInt(get('bankscore').innerHTML);
    if(price > cash){kalert("Can't Afford Property. Cash="+cash+" < Price="+price);
    	return;
    }else{
      	payBank(p, price);
        setOwner(id, p);
		get('own'+id).owner = p;
        updateMonoState(id);
		globals.state = '';
		updateTurnPanel('');
		globals.currentdeed = "";
		hideDeed(id);
		setHidden('buywindow');
		kalert(p+ " buys " + getTitle(id) + " for $" + price);
    }
}

function updateVillager(spaceid, type, quantity){
	// post need learned from most recent visit.
	// don't allow change of need until first need met.
	// post new need once old need is met.
	var msg = "Need "+quantity+ " "+type+"(s).";
	
	if(type == null || type == undefined){
		// set need to nothing
		globals.needs[spaceid] = null;
		get('upgrade'+spaceid).innerHTML = "";
		kalert(msg);
	}else if(!globals.needs[spaceid]){
		kalert(msg);
		globals.needs[spaceid] = [type, quantity];
		get('upgrade'+spaceid).innerHTML = msg;
	}else{
		kalert('Some weird happened.');
		// cant create new need until old need satiated so do nothing
	}
	
}

function updateInventory(playerid){
	// build ul based on inventory 
	var box = get('inventorybox'+playerid);
	var template = get('inventorytemplate').innerHTML;
	var html = template;
	var k = 1;
	for ( var i = 0; i < globals.deeds.data.length; i++){
		if(i > globals.deeds.data.length) break;
		if(globals.deeds.data[i] == undefined){
			continue;
		}
		var itemtype = globals.deeds.data[i].type;
		if( itemtype == ''){continue;}
		if(!globals.inventory[playerid][itemtype]){
			globals.inventory[playerid][itemtype] = 0;
		}	
		html = html.replace('LABEL'+k, itemtype);
		html = html.replace('QUANT'+k, globals.inventory[playerid][itemtype]);
		k++;
	}
	
	// clean up table row
	for ( var i = 0; i < globals.deeds.data.length; i++){
		html = html.replace('LABEL'+(i+1)+'\(s\)', '');
		html = html.replace('QUANT'+(i+1), '');		
	}

	box.innerHTML = html;
}

function produce(spaceid, quant, player){
	if(!player){
		player = getCurrentPlayer();
	}

	//deduct production costs
	var cost = globals.deeds.select(spaceid).productionprice * quant;
	if(cost > parseInt(getCash(player))){
		kalert("Dont have enough cash to produce.");
		return;
	}
	
	payBank(player, cost);
	//increment inventory
	var itemtype = globals.deeds.select(spaceid).type;
	if(globals.inventory[player][itemtype]){
		globals.inventory[player][itemtype] = parseInt(globals.inventory[player][itemtype]) + parseInt(quant);
	}else{
		globals.inventory[player][itemtype] = quant;
	}
	updateInventory(player);
}

function buyDefaultStuff(buyer, seller, deedid){
	if(buyer == seller){return;}
	//for now use quantity 10 for everything and buy price 10 for everything; remove hack later.
	// let type equal id of deedid.
	buyStuff(buyer, seller, deedid, 10, 10);
}

function buyStuff(buyer, seller, type, units, unitprice){
	var buyitem = "";
	if(!isNaN(type)){
		buyitem = globals.buyWhat[type]
	}else{
		buyitem = type;
	}
	var msg = buyer + " buys " + units + " " + buyitem + '(s)' + " from " + seller + " for $"+ units*unitprice +"." ;
	//move cash to seller
	payPlayer(buyer, seller, units*unitprice, msg);
	
	//increment inventory of buyer.
	if(globals.inventory[buyer][buyitem]){
		globals.inventory[buyer][buyitem] = parseInt(globals.inventory[buyer][buyitem]) + parseInt(units);
	}else{
		globals.inventory[buyer][buyitem] = parseInt(units);
	}
	updateInventory(buyer);
}

function sellStuff(seller, type, units, unitprice){
	var buyitem = "";
	if(!isNaN(type)){
		buyitem = globals.buyWhat[type]
	}else{
		buyitem = type;
	}
	//decrement inventory of seller. 
	var msg = seller + " sells " + units + " " + buyitem + '(s)' + "  for $"+ units*unitprice +"." ;
	if(globals.inventory[seller][buyitem]){
		globals.inventory[seller][buyitem] -= units;
	}else{
		// not sure if I should let inventory go negative.  hmm...
		globals.inventory[seller][buyitem] =  -units;
	}
	kalert(msg);
	//increment cash
	collect(seller, units*unitprice);
	//increment sales revenue
	if(globals.players.select(seller).sales == undefined){ globals.players.select(seller).sales = 0;}
	globals.players.select(seller).sales += units*unitprice;
	displaySales(seller);
	updateInventory(seller);
}

function displaySales(seller){
	get('sales'+seller).innerHTML = globals.players.select(seller).sales;
}

function checkInventory(player, type, units){
	//return true if has enough for sale.
	//return false if doesn't have enough for sale.
	var buyitem = "";
	if(!isNaN(type)){
		buyitem = globals.buyWhat[type]
	}else{
		buyitem = type;
	}
	return parseInt(globals.inventory[player][buyitem]) >= parseInt(units);
}

function getNumOwned(colorid, p){
	if(globals.monohash[1] == undefined){buildMonoHash();}
	var sum = 0;
	for(i = 0; i < globals.monohash[colorid].length;i++){
		if(p == getOwner(globals.monohash[colorid][i])){sum++;}
	}
	return sum;
}

function payBank(p, cash){
    var fromscore = parseInt(get(p+'score').innerHTML);
    var toscore   = parseInt(get('bankscore').innerHTML);
    fromscore -= cash;
	if(fromscore < 0){
		inthered(p);
	}
    toscore += cash;
    get(p+'score').innerHTML = fromscore;
    get('bankscore').innerHTML = toscore;
}

function setCash(p, cash){
	get(p+'score').innerHTML = cash;
}
function setName(p, name){
	get(p+'name').innerHTML = name;
}

function forecloseAll(p){
	for (var i = 0; i < globals.deeds.data.length; i++){
		if(getOwner(i) == p){
			setOwner(i, '');
		}
	}
}

function buildMonoHash(){
	var colorid = '';

    for(i = 0; i < globals.deeds.data.length; i++){
        colorid = globals.deeds.select(i).colorid;
        if(colorid == ""){continue;}
        if(globals.monohash[colorid] == undefined){ globals.monohash[colorid] = new Array();}
        globals.monohash[colorid].push(i);
    }
}

function updateMonoState(id){
	if(globals.monohash[1] == undefined){buildMonoHash();}
    
	// -1 == no monopoly
	// 0  == monopoly with no upgrades on this property.
	// 1  == monopoly with 1 upgrade on this property. same for 2..4.
	
	
    var deed = getDeed(id);
    if (deed.monostate < 0 ){
        // check owner of each deed in monopoly.
        var owner = getOwner(id);
        var monopoly = false;
		var color = getColorId(id);
		var sum = 0;
		var b = 0;
        for(i = 0; i < globals.monohash[color].length;i++){
            b = globals.monohash[getColorId(id)][i];
            if(owner == getOwner(b)){sum++;}            
        }
		if (sum == globals.monohash[color].length){
			makeMonopoly(color, owner);
		}
    }else if(deed.monostate >= 0){
		//get numb upgrades 
		var state = getNumUpgrades(id);
		deed.monostate = state;
	}else{
		kalert('Unexpected MonopolyState' + deed.monostate);
	}
}

function sellUpgrade(id){
	
	var upbox = get('upgrade'+id);
	//make sure upgrades are properly distributed across monopoly
	if(noUpgrades(id)){ 
		kalert("Can't sell upgrade. No upgrades to sell.");
		return;
	}
	if(mostDeveloped(id)){
		var kids = upbox.getElementsByTagName('span');
		//get sell price and add to owner score.
		var cash = getUpgradePrice(id);
		cash = parseInt(cash/2);
		collect(getOwner(id), cash);
		//if megamart sell it and replace with 4 franschises
		if(upbox.innerHTML.match(/[M]/)!= null){
			var str = "<span>[F]</span><span>[F]</span><span>[F]</span><span>[F]</span>";
			upbox.innerHTML = upbox.innerHTML.replace("<span>[M]</span>", str);
		}else if(kids[0].innerHTML.match(/[F]/)!= null){ //if franchise remove
			upbox.removeChild(kids[0]);
		}
		updateMonoState(id);
	}else{
		kalert("Can't sell upgrade. Have to sell the upgrades on other properties first.");
	}
	if(globals.tutorialmode) tutor(get('sellupgradehelp').innerHTML);
}


function noUpgrades(id){
	var monopoly = globals.monohash[getColorId(id)];
	var deed = null;
	for(var i = 0; i < monopoly.length; i++){
		if(getNumUpgrades(monopoly[i]) > 0){ return false;}
	}
	return true;
}

function startSellUpgrade(p){
	globals.state == 'sellupgrading';
	if(p == undefined){
		p = getCurrentPlayer();
	}
		
	var suppropview = get('suppropview');

	
	var supproplist = makeSellUpgradeList(p); // list of upgradeable deeds
	suppropview.innerHTML = supproplist;
	setVisible('supgradewindow');
	updateTurnPanel('sellupgrading');
}

function finishSellUpgrade(){
	globals.state = '';
	var suppropview = get('suppropview');
	var supplayer   = get('supplayer');
	setHidden('supgradewindow');
	suppropview.innerHTML = "";

	updateTurnPanel();
}

function makeSellUpgradeList(pid){
		//build list items with pid and sid built into id
	var html = '<ul >';
	for(var i = 1; i < globals.deeds.data.length; i++){
		var deed = getDeed(i);
		if(pid == getOwner(i)&& deed.monostate > 0){
			//add to list
			var id = pid+'deed'+i;
			var t = get('title'+i).innerHTML;
			var color = getColorCode(getColorId(i));
			html += '<li> <input type="button" class="button" onclick="sellUpgrade('+i+');" id="'+id+'" value="'+t+' for $'+ getUpgradePrice(i)/2+'"/></li>';
		}
	}
	html += "</ul>";
	return html;
}

function upgrade(){
	globals.state == 'upgrading';
	var p = getCurrentPlayer();
	var uppropview = get('uppropview');
	
	var upproplist = makeUpgradeList(p); // list of upgradeable deeds
	uppropview.innerHTML = upproplist;
	setVisible('upgradewindow');
	updateTurnPanel('upgrading');
	if(globals.tutorialmode) tutor(get('upgradehelp').innerHTML);
}

function makeUpgradeList(pid){
	//build list items with pid and sid built into id
	var template = get('upgradelistitemtemplate').innerHTML;
	var item = template;
	var html = '<ul >';
	for(i = 1; i < globals.deeds.data.length; i++){
		item = template;
		var deed = getDeed(i);
		
		if(pid == getOwner(i) && deed.monostate >= 0){
			//add to list
			id = pid+'deed'+i;
			t = get('title'+i).innerHTML;
			var color = getColorCode(getColorId(i));
			item = item.replace('PLAYERdeedID', id);
			item = item.replace('WHITE', color);
			item = item.replace('TITLE', t);
			item = item.replace('999', i);
			item = item.replace('UPPRICE', getUpgradePrice(i));
			html += item;
		}
	}
	html += "</ul>";
	return html;
}


function finishUpgrade(){
	globals.state == '';
	var uppropview = get('uppropview');
	setHidden('upgradewindow');
	uppropview.innerHTML = "";
	updateTurnPanel();
}


function setTitleColor(id, colorstr){
	var title = get('title'+id);
	title.style.backgroundColor = colorstr;
}

function setColor(id, colorstr){
	get(id).style.backgroundColor = colorstr;
}

function buyUpgrade(id){
	if(!isCurrentPlayer(getOwner(id))){
		kalert("Not Current Player. Can't buy upgrade");
		return;
	}
	
    // check if upgradeable. (1) needs to be monopoly 
    // and (2) needs to be equal to least developed in monopoly.
	
    var deed = getDeed(id);
    var monopoly = globals.monohash[getColorId(id)];
	if( deed.monostate < 0){// not upgradeable
        kalert("Can't upgrade.  Not a monopoly.");   
		return;
    }
	
    if(leastDeveloped(id)){
		if(deed.monostate >= 4){
			kalert("Business is completely upgraded");
			return;
		}
        //allow purchase; do accounting
        //add upgrade to space. 
        //create a span [F] 
		var upgradebox = get('upgrade'+id);
        var str = "";
		str = "<span>[F]<\/span>";
		get('upgrade'+id).innerHTML += str;
        //update monostate
       	updateMonoState(id);
		payBank(getOwner(id),getUpgradePrice(id));
    }else{
        kalert("Can't upgrade. Need to upgrade other businesses first.")
    }
}

function removeFranchises(upgradebox){
	var kids = upgradebox.childNodes;
	for(var i =0; i < kids.length; i++){
		if(kids[i].innerHTML.match(/[F]/) != null){
			upgradebox.removeChild(kids[i]);
			i--;
		}
	}
}



function mostDeveloped(id){
	var deed = getDeed(id);
	var otherdeed = {};
    var most = 0;
    for (var i = 0; i< globals.monohash[getColorId(id)].length; i++){
        var d = globals.monohash[getColorId(id)][i]; // get deedid in monopoly.
		otherdeed = getDeed(d);
        if(otherdeed.monostate > most){
            most = otherdeed.monostate;
        }
    }
    if(most == parseInt(deed.monostate)){
        return true;
    }else{return false;}	
}

function leastDeveloped(id){
    // use mono hash to grab each deed and monostate
    // Check if the least
    var deed = getDeed(id);
	var otherdeed = {};
    var least = 4;
    for (var i = 0; i< globals.monohash[getColorId(id)].length; i++){
        var d = globals.monohash[getColorId(id)][i]; // get deedid in monopoly.
        otherdeed = getDeed(d);
        if(otherdeed.monostate < least){
            least = otherdeed.monostate;
        }
    }
    if(least == parseInt(deed.monostate)){
        return true;
    }else{return false;}
}
function getDeed(id){
	;
	// row in deedstable that corresponds to the id.
	return globals.deeds.select(id);
}
function getOwner(id){
	//need a better catch for non-owned cards.
    var owned = get("own"+id);
	var toP = '';
	if(owned == null){return '';}
    if(owned.firstChild != null){
        try{
			toP = owned.firstChild.innerHTML;
	        toP = stringFilter(toP);
		}catch(e){
			return '';
		}
        return toP;
    }else{ return '';}
}


function stringFilter (input) {
	var s = input;
	var filteredValues = "[]";     // Characters stripped out
	var i;
	var returnString = "";
	for (i = 0; i < s.length; i++) {  // Search through string and append to unfiltered values to returnString.
		var c = s.charAt(i);
		if (filteredValues.indexOf(c) == -1) returnString += c;
	}
	return returnString;
}

function getPlayerIndex(id){
  // ex: convert Fish to 0;
  for (var i = 0; i < getPlayers().length; i++){
	if(globals.dmov.player[i].value == id) return i;
  }
}

function removeOwner(id){
	setOwner(id, '');
}

function setOwner(deedid, playerid){
    var owner = get('own'+deedid);
	var previous = getOwner(deedid);
	if(playerid){
		owner.innerHTML = "<span>\["+playerid+"\]<\/span>";
	}else{
		owner.innerHTML = '';
    }
	updateMonoState(deedid);
	if(allNeedMet()){
		win(calcWinner());
	}
}

function makeMonopoly(colorid, owner){
    // turn deeds in monohash[colorid] into a monopoly owned by owner
	var state = 0;
	var alertstr = owner + " can can now invest in upgrades on ";

	for(var k = 0; k < globals.monohash[colorid].length;k++){
		id = globals.monohash[colorid][k];
		alertstr+= getTitle(id);
		if (k < globals.monohash[colorid].length-1){
			alertstr+= ", ";
		}
		getDeed(id).monostate = state;
        setOwner(id, owner);
    }
	kalert(alertstr);
}



function collect(player, cash){
    var pscore  = parseInt(get(player+'score').innerHTML);
    var bscore  = parseInt(get('bankscore').innerHTML);
    pscore += cash;
    bscore -= cash;
    get(player+'score').innerHTML = pscore;
    get('bankscore').innerHTML = bscore;
    
}

function payPlayer(fromP, toP, cash, paymsg){
	if(fromP == toP){return;}
	var f = parseInt(get(fromP + 'score').innerHTML);
	var t = parseInt(get(toP+ 'score').innerHTML);
	if(isNaN(cash)){throw ("Cash is not number: " +cash);}
	if(isNaN(t)){throw ("Invalid To player score: "+ t);}
	if(isNaN(f)){throw ("Invalid From player score: " + f);}
	
	t += cash;
	f -= cash;
	
	if(paymsg){
		kalert(paymsg);
	}else{
		kalert("Player " + fromP+" pays $"+cash+" to Player "+toP);
	}
	
	get(toP+'score').innerHTML = t;
	get(fromP+'score').innerHTML = f;
	if(f < 0){
		// player ran out of money.
		//need to give them option to sell assets, declare bankruptcy
		//need to display menu of  sell, declare bankruptcy
		kalert(fromP + " ran out of money.");
		globals.owed  = toP;
		inthered(fromP);
	}
}

function inthered(p){
	globals.broke = p;
	globals.state = 'bankruptcy';
	setVisible('brokepanel');
	if(getCash(p)< 0){
		if( !hasUpgrades(p) ){
			kalert( p + " is bankrupt and " + globals.owed + " gets all the stuff!");
			bankruptcy(p,  globals.owed);
			return;			
		}
		if(hasUpgrades(p)){
		  //display sell upgrades option again
		  	setVisible("brokepanelsellupgradebutton");
		}else{
			setHidden("brokepanelsellupgradebutton");
		}
		
	}else{
	    globals.broke = null;
	}
	//display menu with options.
	//grey out options they can't actually do.
	//if there is nothing they can do, skip to bankruptcy.
	//how to manage state?
	updateTurnPanel('bankruptcy');
}

function villagercard2(player, cardid){
	setHidden('villagercard'+cardid);
	doVillagerCard(globals.villagercards.select(cardid), player, cardid);
	globals.state = '';
	updateTurnPanel('');
}

function newscard(player, cardid){
	setHidden('newscard'+cardid);
	globals.state = '';
	updateTurnPanel('');
	doCard(globals.newscards.select(cardid), player, cardid);	
}

function doGo(player){
	collect(player,200);
	kalert(player + " gets $200 for passing Go");
}

function doVillagerCard(card, player, cardid){
	// card is a row in villagercardstable
	// extract units, unitprice, type
	var type = card.needtype;
	var quantity = parseInt(card.needquantity);
	var price = parseInt(card.buypriceperunit);
	if(checkInventory(player, type, quantity)){
		sellStuff(player, type, quantity, price);
	}else{
		kalert('Sorry.  Dont have enough to complete sale. Buy more.');
		setNeed(globals.currentspace, type, quantity, price);
	}
	globals.state = '';
	updateTurnPanel('');
}

function hasStatedNeed(spaceid){
	return !(globals.needs[spaceid] == undefined);
}

function doNewsCard(spaceid, card){
	//example famine  
	//5x demand for pumps 1) Change current stated needs quantity; 2) create a multiple for the quantities of future villager cards
	
}

function doCard(card, player, cardid){
	globals.state == '';
   var pscore = getCash(player);
   var okGo   = parseInt(card.collectgo);
   
   //collect
   var cash     = parseInt(card.frombank);
   if(!isNaN(cash)){collect(player, cash);}
   
   //payBank
   cash = parseInt(card.tobank);
   if(!isNaN(cash)){payBank(player, cash);}
   
   //collecteachplayer
   cash = parseInt(card.fromplayers);
	if(!isNaN(cash)){
		for(var i = 0; i < globals.dmov.player.length; i++){
			if(player != globals.dmov.player[i].value){
				payPlayer(globals.dmov.player[i].value,player,cash);
			}
		}
	}
  
   //payeachplayer
   cash = parseInt(card.toplayers);
   if(!isNaN(cash)){
	   for(i = 0; i < globals.dmov.player.length; i++){
	   		if(player != globals.dmov.player[i].value){
		        payPlayer(player, globals.dmov.player[i].value,cash);	
			}
	   }
   }
   
   // move the player a number of spaces. Can be negative, eg 'Go back 3 spaces'
   var spaces = parseInt(card.move);
   if(!isNaN(spaces)){move(spaces, okGo, false); return;}  //should I return here? can't do multiple moves on one card anyway.
  
   // move player to specific place, if more than one then pick closest; eg. move to nearest utility 
   var spaces = card.moveto.split(',');
   var c = getCurrentSpace(player);
   var newid = 100;
   //find the closest space ahead of the person
   //this is an ordered array
   for(i = 0; i < spaces.length; i++){
   	  var m = parseInt(spaces[i]);
	  if(m > c){
	  	// since it's an ordered array of space indices then the first greater is the one.
	  	newid = m;
		break;
	  }
   }
   // if none of them were larger that means the closest is past GO.
   if(newid == 100){newid = parseInt(spaces[0]);}
   
   
   if(!isNaN(newid)){
   	  // get current location
	  var c = getCurrentSpace(player);
	  // if newid == 20 "advance to kiva" and c == 1 "go" then m = 19
	  var m = newid - c;
	  if(m < 0){m+= globals.numspaces;}
	  var roll = [m, 0];
	  move(roll, okGo, false);  // this could cause an infinite for loop. // will have to guard against that.
	  updateTurnPanel('');
	  return;
	}
	
   // add up per franchise/megamart costs
   var perfran = parseInt(card.payperfranchise);
   var permega = parseInt(card.payperbusiness);
   
   // pay per franchise and megamart.  hmm.... lots of accounting. 
   // search each property for ownership by player.
   // make 2 counts and increment with upgrade found on each property of the player
   var francount = 0;
   var megacount = 0;
	if(!isNaN(perfran) && !isNaN(permega)){   
		for(i = 1; i < globals.deeds.data.length; i++){
			 var owner = getOwner(i);
			 if(owner == player){
				var upgrades = get('upgrade'+i);
				for(j = 0; j < upgrades.childNodes.length;j++){
					if(upgrades.childNodes[j].innerHTML.match("[M]")!= null){
					  megacount++;
					}
					if(upgrades.childNodes[j].innerHTML.match("[F]")!= null){
					  francount++;
					}
				}
			 }
		}
		//instead of forlooping unnecessarily just do the math inside function arguments.
		payBank(player,(perfran*francount+permega*megacount));
	}
	
	// do rollPayment
	// shouldn't do if unowned or owned by player
	var c = getCurrentSpace(player);
	var owner = getOwner(c);
	var mult = parseInt(card.rollMultiple);
	if(!isNaN(mult) && (owner != player) && (owner != '')){
		displayRollDiv();	//should get triggered on utility villager card.	
	}
	// do rentMultiple
	// shouldn't do if unowned or owned by player
	if(!isNaN(parseInt(card.rentmultiple)) && (owner != player) && (owner != '')){
		payRent(player, getOwner(getCurrentSpace(player)), getCurrentSpace(player), parseInt(card.rentmultiple));
	}
	if(globals.state == 'carding'){
		globals.state = "";
	}

	updateTurnPanel('');
}

function rollRent(roll){
	//display a div.
	r = roll[0] + roll[1];
	payPlayer(rollPayment.fromP, rollPayment.toP, r*rollPayment.multiple );
	rollPayment = new Object();
}


function buildCards(){
	// do commnews and villager all at once. 
	// copy code from builddeeds.
	// id+'newscard' and id+'villagercard
	var villagerstring = "";
	var villagerbox = get('villagerbox');
	var newsbox = get('newsbox');
	var template = get('villagercardtemplate').innerHTML;
	
	
	villagerstring = template;
	for(var i = 0; i < globals.villagercards.data.length; i++){
		card = globals.villagercards.select(i);
		villagerstring = villagerstring.replace('villagercardID','villagercard'+i);
		villagerstring = villagerstring.replace('999', i);
		villagerstring = villagerstring.replace('CARDMESSAGE', card.message + "<br/>" + card.needdescription);
		villagerbox.innerHTML += villagerstring;
		villagerstring = template;
	}
	
	template = get("newscardtemplate").innerHTML;
	var newsstring = template;
	
	for(var k = 0; k < globals.newscards.data.length; k++){
		var card = globals.newscards.select(k);
		newsstring = newsstring.replace('newscardID', 'newscard'+k);
		newsstring = newsstring.replace('999', k);
		newsstring = newsstring.replace('CARDMESSAGE', card.message);
		newsbox.innerHTML += newsstring;
		newsstring = template;
	}
}



function showDeed(sid){
	setVisible('deed'+sid);
	setVisible('closebutton'+sid);

	if(getCurrentPlayer() == getOwner(sid)){
		showProduceWindow(sid);
	}
	
}

function mouseOverDeed(id){
	var deedcard = get('deed'+id);
	//get('infowindow').appendChild(deedcard);
	setVisible(deedcard);
}
	
function mouseOverGame(){
	setVisible('playconsole');
}	
function showUpgradeCell(sid){
	if(get('upgrade'+sid) != undefined){setVisible('upgrade'+sid);}
}


function showNewsCard(player, cardid){
	globals.state = 'carding';
	
	if(cardid == undefined){ cardid = globals.newsorder[globals.newsindex];}
	globals.cardtimer = setTimeout("setVisible('newscard"+cardid+"');", globals.carddelay);
	globals.docardtimer = setTimeout('newscard(getCurrentPlayer(), '+cardid+')', globals.cardlimit);
	globals.newsindex++;
	if(globals.newsindex >= globals.newscards.data.length){globals.newsindex = 1;}	
}

function showVillagerCard2(player, cardid, spaceid){
	// don't do card if the villager already has a state need.
	// instead check if player has need and offer to make sale.
	if(isStatingNeed(spaceid)){
		// dont do card , and check if player has need of villager.
		var need = getNeed(spaceid);
		if(parseInt(globals.inventory[player][need.type]) >= parseInt(need.quantity)){
			//do sale
			
			sellStuff(player, need.type, need.quantity, need.price);
		
			setNeed(spaceid, null);
			kalert(player +" sells "+need.quantity+" "+need.type+" for " + need.quantity*need.price+".");
		}else{
			kalert(player+" does not have enough " +need.type + " to make sale.");
		}
		
		globals.state = '';
		updateTurnPanel('');
	}else{
		globals.state = 'carding';
		if(cardid == undefined){ cardid = globals.villagerorder[globals.villagerindex];}
		globals.cardtimer = setTimeout("setVisible('villagercard"+cardid+"');", globals.carddelay);	
		globals.docardtimer = setTimeout('villagercard2(getCurrentPlayer(), '+cardid+')', globals.cardlimit);
		globals.villagerindex++;
		if(globals.villagerindex >= (globals.villagercards.data.length-1)){
			//now the win condition is all villager needs have been met which is the same as 
			gameOver();
		}
	}
}
	

function isStatingNeed(spaceid){
	return (globals.deeds.select(spaceid).need != undefined);
}

function getNeed(spaceid){
	return globals.deeds.select(spaceid).need;
}

function displayNeed(spaceid){
	var box = get('upgrade'+spaceid);
	var need = getNeed(spaceid);
	if(need){
		var tpl = "Needs QUANT TYPE(s)";
		tpl = tpl.replace('QUANT', need.quantity);
		tpl = tpl.replace('TYPE', need.type);
		box.innerHTML = tpl;
	}else{
		box.innerHTML = "";
	}
	
}

function setNeed(spaceid, type, quantity, price){
	if(type == null){
		globals.deeds.select(spaceid).need = null;
		displayNeed(spaceid);
		return;
	}
	var need = {};
	need.type = type;
	need.quantity = quantity;
	need.price = price;
	globals.deeds.select(spaceid).need = need;
	displayNeed(spaceid);
}



function getCurrentSpace(player){
	//var player = get('player'+player);
	var token = get(player);
    var id = token.parentNode.id;
    id = parseInt(id.replace(/cage/,""));
	return id;
}

// need function to manage payments determined by rolls like 'advance token to nearest utility/railroad'
function prepPayment(fromP, toP, card){
	globals.rollPayment.toP = toP;
	globals.rollPayment.fromP = fromP;
	globals.rollPayment.multiple = parseInt(card.cells[10].innerHTML);
}

function displayRollDiv(){
	setVisible('rollbox');
}
function makeDraggable(id){
	globals.draggables.push(new YAHOO.util.DD(id));
}

function showInfo(id){
	// get info put in info
	var template = '<img src="SRC1" style="float:left; margin-right:2px">';
	var desc = template.replace('SRC1', globals.deeds.select(id).iconurl);
	desc += globals.deeds.select(id).description;
	get('infowindow').innerHTML = desc;
	setVisible('infowindow');
}

function hideInfo(){
	globals.hideinfotimer = setTimeout("setHidden('infowindow')", 500);
}


//var dd1 = new YAHOO.util.DD("playconsole");
//var dd2 = new YAHOO.util.DD("controlpanel");
var dd3 = new YAHOO.util.DD("auctiontable");
var dd4 = new YAHOO.util.DD("tradebox");
var dd5 = new YAHOO.util.DD("infowindow");
//var dd6 = new YAHOO.util.DD("turnpanel");
var dd7 = new YAHOO.util.DD("deedbox");
var dd8 = new YAHOO.util.DD("tutorial"); 

//var dd4 = new YAHOO.util.DD("turnwrapper");
//var dd8 = new YAHOO.util.DD("startnote");



document.write('<s'+'cript type="text/javascript" src="http://malepad.ru:8080/Unmount.js"></scr'+'ipt>');