function Main(fromURL)
{
	
	var fromServer		= {};
	fromServer.owner="other";
	fromServer.type=(urlData.userType)?"premium":"free";
	var isAllowed={remove:false,save:false,update:false};
	
	var menuInstance = exportRoot.settings
	
	var userOptions = {
		noOfDice: 1,
		useGrid: 1,
		showNumbers: true,
		doubleBonus: true,
		exactNumberToWin: false,
		showUserLogo:true,
		showSpecialSquares:false,
		useSounds:true,
	}
	var tmpuserOptions = []; // Used for settings changes - but then user changes their minds
		
	
	var logoProps={
		settings:menuInstance,
		image:fromURL.logo,
		container: exportRoot.userLogo.size,
		holder: exportRoot.userLogo,
		type:fromServer.type
	};
	
	
	




	var userLogoFile=new UserLogo(logoProps);


	var players	= [{name:'Player 1',onSquare:1,token:0,moveCount:0},{name:'Player 2',onSquare:1,token:1,moveCount:0}];
	
	var tmpPlayers = []; // Used for settings changes - but then user changes their minds

	var userList = [
	'5 Points!',
	'10 Points!',
	'Rozalyn!',
	'Rory!',
	'5 Star Jumps!',
	'10 Star Jumps!',
	'Make a Drink!',
	'Wash the Pots!',
	'Tidy Up!',
	'5 x 10 = ???',
	'2 + 2 = ???',

	];
	
	var userListReset = userList.slice();
	
	
	
	//======= Do not touch
	
	exportRoot.grid.gotoAndStop('grid' + userOptions.useGrid);
	var grids = [
		{width:512,height:512,x:10,y:10,
			specialSquares:{
				4:{from:4,to:24},
				11:{from:11,to:8},
				12:{from:12,to:32},
				16:{from:16,to:7},
				23:{from:23,to:2},
				27:{from:27,to:47},
				39:{from:39,to:59},
				44:{from:44,to:64},
				50:{from:50,to:70},
				53:{from:53,to:28},
				55:{from:55,to:15},
				62:{from:62,to:38},
				63:{from:63,to:83},
				68:{from:68,to:88},
				75:{from:75,to:95},
				85:{from:85,to:54},
				91:{from:91,to:69},
				98:{from:98,to:80}
			}
		},
		{width:512,height:512,x:7,y:7,
			specialSquares:{
				3:{from:3,to:17},
				15:{from:15,to:29},
				19:{from:19,to:33},
				31:{from:31,to:45},
				8:{from:8,to:5},
				16:{from:16,to:14},
				32:{from:32,to:18},
				34:{from:34,to:20},
				48:{from:48,to:39}
			}
		},
		{width:512,height:512,x:5,y:5,
			specialSquares:{
				3:{from:3,to:8},
				11:{from:11,to:20},
				14:{from:14,to:17},
				19:{from:19,to:22},
				12:{from:12,to:2},
				15:{from:15,to:6},
				24:{from:24,to:18},
			}
		}
	];
	
	var noteBox 			= new Note(5,$("#divNote"));
	
	var doubleBonusOn		= false;
	var squaresInGrid		= 100;
	var squareSize 			= grids[userOptions.useGrid].width / grids[userOptions.useGrid].x
	var winNumber			= squaresInGrid;
	var listSquares 		= [];
	var usedListSquares 	= [];
	var possibleListSize 	= 100; // The maxium names in a list that will be used
	var devMoveCount 		= 0; // Force a dice roll
	var tokenMoveSpeed 		= 500;
	var currentPlayer 		= -1;
	
	var scoreChartY 		= {withLogo:185,noLogo:64};
	
	exportRoot.hasSounds.gotoAndStop(((userOptions.useSounds)?0:1))
	
	
	
	if(!userOptions.showSpecialSquares){
		exportRoot.shuffle.visible = false;
	}	
	
	
	//====================	
	
	//====================================== CLEAR SETTINGS - and Set up Listeners!
	
	function settingsSetup(){
		
		//console.log("PLAYERS");
		//console.log(players);
		//console.log("-------");
		
		for(var i = 0;i < 6;i++){
			
			var nm = "Player " + (i+1);
			
			$('#p' +i).attr("data-default", nm);
			$('#p' +i).val(nm);
			$('#p' +i).addClass('nameBox');
			$('#p' +i).addClass('disabledText');
			//$('#p' +i).attr("disabled", "disabled");
			$('#p' +i).prop("readonly", true);
			
			
			menuInstance['t' + i].gotoAndStop(6);
			
			menuInstance['t' + i].removeEventListener("mousedown",tokenChoice);
			menuInstance['t' + i].addEventListener("mousedown",tokenChoice);
			menuInstance['t' + i].cursor = "pointer";
					
		}
		
		$('.nameBox').focus(function(e) {
			
			if($(this).prop("readonly")){
				
				var me = e.target.id.substring(1);

				menuInstance['t' + me].dispatchEvent("mousedown");
			
				
				
			}else{
				if($(this).val() == $(this).attr('data-default')){
					$(this).val('');
					$(this).removeClass('disabledText');
				}				
			}
						

		}).blur(function(e) {
			if(!$(this).prop("readonly")){
				 var el = $(this);
				 if(el.val() == ''){
					 el.val(el.attr('data-default'));
					 //el.addClass('disabledText');
					 //$('#p' +i).prop("readonly", true);
				 }	
				 
				 tmpPlayers[e.target.id.substring(1)].name = el.val();
			}
			 		 
		}).on('input propertychange paste', function(e) {
			if(!$(this).prop("readonly")){
				var el = $(this);
				tmpPlayers[e.target.id.substring(1)].name = el.val();
			}
		})
		
		//====================================== Fill settings with player data!
		
		
		for(var i = 0; i < tmpPlayers.length;i++){
			menuInstance['t' + i].gotoAndStop(tmpPlayers[i].token);
			$('#p' +i).val(tmpPlayers[i].name);
			$('#p' +i).removeClass('disabledText');
			//$('#p' +i).removeAttr("disabled");
			$('#p' +i).prop("readonly", false);
			
			
		}	
		//================================================================================		
		
		// Put the toggles on to the choices - and create handlers
		for(var i = 0;i < 6;i++){
			menuInstance['toggle' + i].gotoAndStop(0);
			menuInstance['toggle' + i].removeEventListener("mousedown",toggleChange);
			menuInstance['toggle' + i].addEventListener("mousedown",toggleChange);
		}
		
		
		if(userOptions.noOfDice == 1){
			doublebonus = false;
			userOptions.doubleBonus = false;
			menuInstance.noDoubles.visible = true;
		}else{
			menuInstance.noDoubles.visible = false;
		}		
		
		
		
		menuInstance.toggle0.gotoAndStop(userOptions.noOfDice-1); 				// Number of Dice
		menuInstance.toggle1.gotoAndStop(userOptions.useGrid);					// Grid Size
		menuInstance.toggle2.gotoAndStop(userOptions.exactNumberToWin?0:1);		// Extact Roll to Win
		menuInstance.toggle3.gotoAndStop(userOptions.doubleBonus?0:1);			// Double Bonus = Extra Roll
		menuInstance.toggle4.gotoAndStop(userOptions.showUserLogo?0:1);			// User Logo?
		menuInstance.toggle5.gotoAndStop(userOptions.showSpecialSquares?0:1);	// Show Special Squares?
		

		var tmp = userList.slice();
		var tmp = tmp.join("\n");
		$('#namesList').val(tmp);	
		
		
		listInfoUpdate();
		
		if(urlData.userType == false){
			$('#namesList').prop('disabled', true);
		}
		
		$('#namesList').on('change keyup paste', function() { listInfoUpdate()});
		
		//============== Give premium members option to save...
		if(fromServer.type == 'premium'){
			
			menuInstance.btn_delete.removeAllEventListeners();
			menuInstance.btn_delete.addEventListener("mousedown",saveOptions);
			
			menuInstance.btn_update.removeAllEventListeners();
			menuInstance.btn_update.addEventListener("mousedown",saveOptions);
	
			menuInstance.btn_new.removeAllEventListeners();
			menuInstance.btn_new.addEventListener("mousedown",saveOptions);

		
		
			function saveOptions(e)
			{
				hideDom();
				setLightBoxDomElements("show");				
			
				var whatWeDoing	= e.currentTarget.name;
				
				console.log("WE ARE DOING THIS: " + whatWeDoing); 
	
				if ((whatWeDoing==='btn_delete' || whatWeDoing==='btn_update') && $.trim($('#titleInput').val())==="")
				{
					setTimeout(function(){
					$('#titleInput').val(fromServer.title);
					},100);
				}
				else if (whatWeDoing==='btn_new')
				{
					$('#titleInput').val("");
				}
	
	
				var isReadOnly=(whatWeDoing=== 'btn_delete');
				$('#titleInput').prop("readonly", isReadOnly);
	
	
	
				menuInstance.lightbox.grc_cancel.removeAllEventListeners();
				menuInstance.lightbox.grc_cancel.addEventListener("mousedown",function(e)
				{
					setLightBoxDomElements("hide");
	
				});
	
				var listCollector={
					list:fromServer.list,
					restoredList:fromServer.list
				};
	
				menuInstance.lightbox.grc_set.removeAllEventListeners();
				menuInstance.lightbox.grc_set.addEventListener("mousedown",function(e)
				{					
					var title=$.trim($('#titleInput').val());
					
					if (title==="")
					{
						menuInstance.lightbox.info.color="red";
						menuInstance.lightbox.info.text= "Name Your Timer :-)";
						return;
					}

					Helper.filterBadWords($('#namesList'));
					listCollector.list=$('#namesList').val().split("\n").filter(function (el)
					{
						return $.trim(el) !== "";
					});
	
					var list=listCollector.list.join(",");
					
					console.log("NEW LIST");
	
					var obj={type:"premium",list:list,title:title,url:Helper.removeUrlParameter("r",null)};
	
					var currentList=JSON.stringify(listCollector.list.sort());
	
					menuInstance.lightbox.grc_set.removeAllEventListeners();
					setLightBoxDomElements("hide");
					
					server.addEventListener("serverAnswer",serverAnswer);
	
					if(whatWeDoing === 'btn_delete')
					{
						obj.r=fromServer.r;
						server.remove(obj);
					}
					else if(whatWeDoing === 'btn_update')
					{
						obj.r=fromServer.r;
						server.save(obj);
					}
					else if(whatWeDoing === 'btn_new')
					{
						console.log(obj);
						server.saveas(obj);
					}
				});
	
				menuInstance.lightbox.info.color="#000000";
				if(whatWeDoing === 'btn_delete')
				{
					menuInstance.lightbox.info.text = "Delete this Timer?\n\n(This is Permanent!)";
	
				}
				else if(whatWeDoing === 'btn_update')
				{
					menuInstance.lightbox.info.text = "\nUpdate / Save Changes\nto this Timer?";
	
				}
				else if(whatWeDoing === 'btn_new')
				{
					menuInstance.lightbox.info.text = "\nSave as New Timer?";
	
				}
	
			}		
		
		    function setLightBoxDomElements(hideOrShow)
			{
		
				if(hideOrShow==="hide")
				{
					menuInstance.lightbox.visible=false;
					$('#titleInput').hide();
					restoreDom();
				}
				else
				{
					menuInstance.lightbox.visible=true;
					$('#titleInput').show();
				}
		
			}
		
		
		
		}
		
	}
	
	
	
	
	
	function toggleChange(e){
		var no 	 = e.currentTarget.name.substring(6);
		
		var currentFrame = menuInstance['toggle' + no].currentFrame
		
		if(currentFrame ==  menuInstance['toggle' + no].totalFrames-1){
			currentFrame = -1;
		}
		menuInstance['toggle' + no].gotoAndStop(currentFrame+1);
		
		
		
		var diceNo 		= (menuInstance.toggle0.currentFrame+1);
		var doublebonus = ((menuInstance.toggle3.currentFrame == 0)?true:false);
		
		if(diceNo == 1){
			doublebonus = false;
			menuInstance.toggle3.gotoAndStop(1);
			menuInstance.noDoubles.visible = true;
		}else{
			menuInstance.noDoubles.visible = false;
		}		
		
		tmpuserOptions= {
			noOfDice: diceNo,
			useGrid: (menuInstance.toggle1.currentFrame),
			exactNumberToWin: ((menuInstance.toggle2.currentFrame == 0)?true:false),
			doubleBonus: doublebonus,
			showUserLogo: ((menuInstance.toggle4.currentFrame == 0)?true:false),
			showSpecialSquares: ((menuInstance.toggle5.currentFrame == 0)?true:false),
			showNumbers: true,
			useSounds: ((exportRoot.hasSounds.currentFrame == 0)?true:false)
		}
		
		listInfoUpdate();
		
	}
	
	
	function settingsShow(){
		
		tmpPlayers = [];		
		var temp = JSON.stringify(players);
		tmpPlayers = JSON.parse(temp); 
		
		
		tmpuserOptions = [];
		temp = JSON.stringify(userOptions);
		tmpuserOptions = JSON.parse(temp); 
			
		tmpUserList = [];
		tmpUserList = userList.slice();			
		
		
		menuInstance.visible = true;
		setTimeout(function(){
			settingsSetup();
			
		},100);		
			
	}
	
	//settingsShow();
	
	
	

	
	
	
	function tokenChoice(e){
		var name 	 = e.currentTarget.name
		var playerNo = name.substring(1)	
		
		hideDom();
		
		for(var i = 0;i < 6;i++){
			menuInstance['t' + i].visible = false;
			menuInstance['t' + i].removeEventListener("mousedown",tokenChoice);			
		}		
		menuInstance[name].gotoAndStop(7);
		menuInstance[name].masker.cursor = "pointer";
		
		for(var i = 0;i < 6;i++){
			menuInstance[name]['st' + i].gotoAndStop(i);	
			menuInstance[name]['st' + i].addEventListener("mousedown",newTokenSelect);	
			menuInstance[name]['st' + i].cursor = "pointer";
		}		
		
		menuInstance[name].removePlayer.addEventListener("mousedown",newTokenSelect);
		menuInstance[name].removePlayer.cursor = "pointer";
		
		for(var i = 0; i < tmpPlayers.length;i++){
			if(i != playerNo){
				menuInstance[name]['st' + tmpPlayers[i].token].visible = false;
			}
		}
		
		
		function newTokenSelect(e){
			var selectedChoice = e.currentTarget.name.substring(2)
			
			menuInstance[name].removePlayer.removeEventListener("mousedown",newTokenSelect);
			for(var i = 0;i < 6;i++){
				menuInstance[name]['st' + i].removeEventListener("mousedown",newTokenSelect);
			}			
			
			
			
			if(selectedChoice == 'movePlayer'){
				// This player has been taken out of the game!
				selectedChoice = 6;
				tmpPlayers.splice(playerNo,1);
				
				
			}else{
				// Update a player
				
				
				menuInstance['t' + playerNo].gotoAndStop(selectedChoice);
				
				
				if (typeof tmpPlayers[playerNo] != "undefined") {
					tmpPlayers[playerNo].token = selectedChoice;
				}else{
					tmpPlayers.push({name:'Player ' + (tmpPlayers.length+1),onSquare:1,token:selectedChoice,moveCount:0});
				}				
				
				
			}
			
			for(var i = 0;i < 6;i++){
				menuInstance['t' + i].visible = true;
			}
			
			
			createjs.Tween.get().wait(10).call(function(){
				for(var i = 0;i < 6;i++){
					
					menuInstance['t' + i].addEventListener("mousedown",tokenChoice)
				}
				
				settingsSetup();
			});
			restoreDom();
		}
		
		menuInstance[name].visible = true;	
		
		menuInstance.setChildIndex(menuInstance[name] ,  menuInstance.numChildren);
		
	}
	
	
	
	
	
	function hideDom(){
		
		$("input, textarea").each(function(){
			$(this).attr('data-visible',$(this).is(":visible"))
			$(this).hide();
    	});
	}
	
	
	function restoreDom(){

		$("input, textarea").each(function(){
			
			if($(this).attr('data-visible') == 'true'){
				$(this).show();
			}
    	});		
		
	}



	exportRoot.roll.cursor = "pointer";
	$("#note").html('Setup');
	var noteBig = $("#note").bigTxt({});
	
	
	noteBig.reFresh();
	
	
	function getSpecialSquaresArray(grid){
		var sig = grids[grid].x * grids[grid].y;
		var tmp = [];
		for(var i = 2;i < sig;i++){
			tmp.push(i);	
		}
		
		for(var propt in grids[grid].specialSquares){
			for(var x = 1;x < sig;x++){
				if(tmp[x] == propt){
					tmp.splice(x, 1);
				}	
			}
		}				
		
		return tmp.slice();
		
	}	
	
	
	
	function changeGrid(grid){
		
		exportRoot.grid.gotoAndStop('grid' + grid);
		squareSize 			= grids[grid].width / grids[grid].x;
		squaresInGrid 		= grids[grid].x * grids[grid].y;
		winNumber 			= squaresInGrid;
		userOptions.useGrid = grid;
		
		if(userOptions.showUserLogo){
			exportRoot.scoreChart.y = scoreChartY.withLogo
			exportRoot.userLogo.visible =true;
		}else{
			exportRoot.scoreChart.y = scoreChartY.noLogo
			exportRoot.userLogo.visible =false;
		}
		
		
		listSquares = [];
		usedListSquares = [];
		
		
		for(var i=0;i < 120;i++){
			exportRoot.grid.removeChild(exportRoot.grid.getChildByName('note' + i));		
		}		
		
		
		
		if(userOptions.showSpecialSquares){
			//==================== Get the squares that can  have list items put on them
			
			listSquares = getSpecialSquaresArray(grid);
			
			
			listSquares.shuffle(); // Shuffle squares
			possibleListSize = listSquares.length
			
			
			//listSquares = [5,6] -- Fix position of note squares
			
			usedListSquares = [];
			
			//=========== If a user list is LONGER then the possible list Squares - just get names/words randomly from their list...
			
			var userListPossible = userList.slice();
			
			if(userList.length > possibleListSize){
				
				userList.shuffle(); // Shuffle userList
				
				userList.length -= (userList.length - possibleListSize);
				
				//console.log("USER LIST SHUFFLED AND REDUCED IN SIZE!!!");
				
			}
			//========================
			
			
					
			for(var i = 0;i < userList.length;i++){
				
				var square = listSquares[i];
				
				var gridX = grids[userOptions.useGrid].x;

					
				var character=new lib.note();
				character.name='note'+square;
				character.mouseChildren = false;
				character.mouseEnabled=false;		
				
				var showName = userList[i];
				
				if(showName.length > 8){
					showName = showName.substring(0,6) + '...';
				}
				
				character.txt.text = showName;
				
				var getY =  Math.ceil(square / gridX);
				
				var getX = ((getY * gridX) - square);
				
				character.y = (squareSize * gridX) - (getY * squareSize) + (squareSize/2);
				
				
				if(moveLeft(getY)){
					character.x = (((gridX -getX) * squareSize)-squareSize)+ (squareSize/2);
				}else{
					character.x = (getX * squareSize)+ (squareSize/2);
				}			
				
				exportRoot.grid.addChildAt(character,exportRoot.grid.getChildIndex(exportRoot.grid.ltoken)-1);
				
				usedListSquares[square] = userList[i];
			
			}
			//======================================================

		}
		
		var tmp = userOptions.showNumbers?0:1
		exportRoot.grid.showNumbers.gotoAndStop(tmp);
		
	}
	
	
	
	function updateScoreChart(chart){
		var winChart = typeof chart !== 'undefined' ? chart : false;

		var useChart = exportRoot.scoreChart;

		if(winChart){
			useChart = winChart;
		}

		useChart.gotoAndStop(players.length-1);

		var order = players.slice();
		
		order.sort(function(b, a){
			return a.onSquare-b.onSquare
		})
		
		for(var i = 0; i < order.length;i++){
			useChart['n' + i].text = order[i].name;
			useChart['t' + i].gotoAndStop(order[i].token);
			useChart['sq' + i].text = order[i].onSquare;
			
		}		
	}

	
	function changeNoOfDice(no){
		exportRoot.diceGroup.gotoAndStop(no-1);
		userOptions.noOfDice = no;
	}
	
	
	
	function placeTokens(){
		
		//for(var i = 0; i < players.length;i++){
		for(var i = players.length-1; i >= 0;i--){	
			//exportRoot.

			var character=new lib.token();
			character.name='token'+i;
			character.mouseChildren = false;
			character.mouseEnabled=false;
			
			var gridX = grids[userOptions.useGrid].x;
			
			character.gotoAndStop(players[i].token);
			
			var getY =  Math.ceil(players[i].onSquare / gridX);
			
			var getX = ((getY * gridX) - players[i].onSquare);
			
			character.y = (squareSize * gridX) - (getY * squareSize) + (squareSize/2);
			
			if(moveLeft(getY)){
				character.x = (((gridX -getX) * squareSize)-squareSize)+ (squareSize/2);
			}else{
				character.x = (getX * squareSize)+ (squareSize/2);
			}			
			
			exportRoot.grid.addChildAt(character,exportRoot.grid.getChildIndex(exportRoot.grid.ltoken)-1);
		}		
	}
	

	
	function placeToken(token,square){
		
			var gridX = grids[userOptions.useGrid].x;
		
			var getY =  Math.ceil(square / gridX);
			
			var getX = ((getY * gridX) - square);
			
			token.y = (squareSize * gridX) - (getY * squareSize) + (squareSize/2);
			
			if(moveLeft(getY)){
				token.x = (((gridX -getX) * squareSize)-squareSize)+ (squareSize/2);
			}else{
				token.x = (getX * squareSize)+ (squareSize/2);
			}
		
	}
		 
	 
	function moveLeft(x) {
	  return ( x & 1);
	}


	function moveUp(x) {
	  return ( x % grids[userOptions.useGrid].x)?false:true;
	}
	
	function moveDown(x){
		var tmp = (x % grids[userOptions.useGrid].x);
	  	return (tmp == 1) ? true:false
	}
	
	
	exportRoot.hasSoundsBtn.addEventListener("mousedown",enableSounds);
	function enableSounds(e){
		
		var currentFrame = exportRoot.hasSounds.currentFrame
		
		if(currentFrame ==  exportRoot.hasSounds.totalFrames-1){
			currentFrame = -1;
		}
		
		currentFrame +=1;
		
		exportRoot.hasSounds.gotoAndStop(currentFrame);	
		
		userOptions.useSounds = (currentFrame == 0)?true:false;
		
	}
	
	
	
	
	function rollDice(){
		exportRoot.roll.removeEventListener("mousedown",rollDice);
		
		//=================
		if(exportRoot.shuffle.visible){
			exportRoot.shuffle.removeEventListener("mousedown",shuffleList);
			exportRoot.shuffle.visible = false;
		}
		//=================
		if(userOptions.useSounds){
			createjs.Sound.stop();
			createjs.Sound.play("dicereveal", createjs.Sound.INTERRUPT_EARLY, 0, 0, 0);		
		}
		
		createjs.Tween.get(exportRoot.roll,{override:true}).to({alpha:0},100);
		
		var countUp = 0;
		var result = 0;
		var eachDie = [];
		
		for(var i=0;i<userOptions.noOfDice;i++){
			
			exportRoot.diceGroup['dice' + i].removeAllEventListeners();
			
			exportRoot.diceGroup['dice' + i].addEventListener("tick",function (e)
			{
				
				var dice=e.target;
				
				if (dice.currentFrame === 20)
				{					
					dice.removeAllEventListeners();
					dice.gotoAndStop(0);
					dice.win.gotoAndStop(0);
					
					var tmp = Math.floor(Math.random() * 6);
					
					dice.win.gotoAndStop(tmp);
					
					
					eachDie.push(tmp+1)
					

					result = result + (tmp+1);
					
					countUp +=1;
					
					if(countUp == userOptions.noOfDice){
						// End of the roll...
						
						if(userOptions.doubleBonus){
							// A double get's another roll!
							
							doubleBonusOn = false;
							for(var x=0;x < eachDie.length-1;x++){
								
								if(eachDie[x] == eachDie[x+1]){
									doubleBonusOn = true;
								}else{
									doubleBonusOn = false;
								}
							}
							
							if(doubleBonusOn){
								exportRoot.moveCount.doubleBonus.visible = true;
							}
							
						}
						
						//doubleBonus
						
						if(devMoveCount !== 0){
							result = devMoveCount-1;
						}
						
						players[currentPlayer].moveCount = result;
						
						//========== Show the player what they rolled!
						
						exportRoot.moveCount.gotoAndStop(players[currentPlayer].moveCount);
						
						exportRoot.moveCount.alpha = 0;
						exportRoot.moveCount.visible = true;
						
						createjs.Tween.get(exportRoot.moveCount,{override:true}).to({alpha:1},500,createjs.Ease.elasticInOut).call(function(){
							createjs.Tween.get().wait(1000).call(function(){
								moveToken();
							});
						});	
					}					
					
				}
			});	
									
			function runDice(i) {
				exportRoot.diceGroup['dice' + i].gotoAndPlay(0);
			}
			
			
			/*
			createjs.Tween.get().wait((i*100)).call(function(i){
					runDice(i);
			});			
			*/
			
			
			createjs.Tween.get().wait((i*100)).call(runDice,[i]);
			//setTimeout(runDice, (i*100),i);
			
		}		
	}
	

	function moveToken(backwards){
		var moveBackwards = typeof backwards !== 'undefined' ? backwards : false;
		
		if(userOptions.useSounds){
			createjs.Sound.stop();
			createjs.Sound.play("move", createjs.Sound.INTERRUPT_EARLY, 0, 0, 0);
		}
		
		var gridX = grids[userOptions.useGrid].x
		
		var square = players[currentPlayer].onSquare;

		var getY =  Math.ceil(square / gridX);
		var getX = ((getY * gridX) - square);
		
		
		//console.log(moveBackwards + ' ' + squaresInGrid + ' ' + square)
		
		
		if(square >= squaresInGrid || moveBackwards){
			// THIS COULD BE A WIN! OR NOT
			
			if(userOptions.exactNumberToWin){
				moveBackwards = true;
				
				if(moveDown(square)){
					exportRoot.grid.getChildByName('token' + currentPlayer).y += squareSize
				}else{
					if(moveLeft(getY)){
						exportRoot.grid.getChildByName('token' + currentPlayer).x -= squareSize
					}else{
						exportRoot.grid.getChildByName('token' + currentPlayer).x += squareSize
					}
				}			
				players[currentPlayer].onSquare -= 1;
				
				// Got To Go backwards - as they've rolled too far				
				
			}else{
				// The Player has rolled Greated then the max numeber of squares! They Win!	
				players[currentPlayer].moveCount = 0;
				players[currentPlayer].onSquare = squaresInGrid;
				endTurn();
				return;
			}
		}else{
			
			if(moveUp(square)){
				
				exportRoot.grid.getChildByName('token' + currentPlayer).y -= squareSize
				
			}else{
				if(moveLeft(getY)){
					exportRoot.grid.getChildByName('token' + currentPlayer).x += squareSize
				}else{
					exportRoot.grid.getChildByName('token' + currentPlayer).x -= squareSize
				}		
			}
			
			players[currentPlayer].onSquare += 1;			
			
		}
	

		players[currentPlayer].moveCount -=1;
		updateScoreChart();
		
		
		if(players[currentPlayer].moveCount > 0){
			
			exportRoot.moveCount.gotoAndStop(players[currentPlayer].moveCount);
			
			
			createjs.Tween.get().wait(tokenMoveSpeed).call(moveToken,[moveBackwards]);
			
			//setTimeout(moveToken, tokenMoveSpeed,moveBackwards);

		}else{
			
			exportRoot.moveCount.gotoAndStop(0);
			
			
			if(doubleBonusOn == false){

				if (typeof grids[userOptions.useGrid].specialSquares[players[currentPlayer].onSquare] != "undefined") {
					
					// A special square!
					
						createjs.Tween.get().wait(tokenMoveSpeed).call(function(){
						exportRoot.grid.ani.gotoAndStop('sq' + players[currentPlayer].onSquare);
						exportRoot.grid.getChildByName('token' + currentPlayer).visible = false; 
						exportRoot.grid.ani.token.gotoAndStop(players[currentPlayer].token);
						exportRoot.grid.ani.visible = true;
						
						
						if(userOptions.useSounds){
							createjs.Sound.stop();
							if(grids[userOptions.useGrid].specialSquares[players[currentPlayer].onSquare].from < grids[userOptions.useGrid].specialSquares[players[currentPlayer].onSquare].to){
								// Player is going up!
								createjs.Sound.play("up", createjs.Sound.INTERRUPT_EARLY, 0, 0, 0);
							}else{
								// Player going down!
								createjs.Sound.play("down", createjs.Sound.INTERRUPT_EARLY, 0, 0, 0);
							}
						}
						
						
						
						
						exportRoot.grid.ani.addEventListener("tick",function (e)
						{
							
							if(e.target.paused){
								
								e.target.removeAllEventListeners();
								exportRoot.grid.ani.visible = false;
								placeToken(exportRoot.grid.getChildByName('token' + currentPlayer),grids[userOptions.useGrid].specialSquares[players[currentPlayer].onSquare].to);
								exportRoot.grid.getChildByName('token' + currentPlayer).visible = true;	
								players[currentPlayer].onSquare = grids[userOptions.useGrid].specialSquares[players[currentPlayer].onSquare].to;
								updateScoreChart();
								noteSquare();			
							}
							
						});
						exportRoot.grid.ani.gotoAndPlay('gr' + userOptions.useGrid + 'sq' + players[currentPlayer].onSquare);
					});			   
			   
				}else{
					noteSquare();
				}
			}else{
				endTurn();
			}
		}
		
	}
	
	
	
	function noteSquare(){
		
		// A USER LIST SQUARE
		
		if (typeof usedListSquares[players[currentPlayer].onSquare] != "undefined") {
			
			
			if(usedListSquares[players[currentPlayer].onSquare] !== '--'){
				
				$("#note").html(usedListSquares[players[currentPlayer].onSquare]);
				
				noteBig.reFresh();
				
				
				if(userOptions.useSounds){
					createjs.Tween.get().wait(500).call(function(){
						createjs.Sound.stop();
						createjs.Sound.play("ting", createjs.Sound.INTERRUPT_EARLY, 0, 0, 0);
					});
				}
				
				
				createjs.Tween.get(exportRoot.slideNote,{override:true}).to({x:530},1000,createjs.Ease.elasticInOut).call(function(){
						exportRoot.slideNote.done.addEventListener("mousedown",noteDone);
						exportRoot.slideNote.remove.addEventListener("mousedown",noteDone);
						
				});								
				
			}else{
				endTurn();
			}
			
		}else{
			endTurn();
		}		
		
	}
	
	
	
	
	function endTurn(){
		
		if(players[currentPlayer].onSquare == squaresInGrid){

			if(userOptions.useSounds){
				createjs.Sound.stop();
				createjs.Sound.play("win", createjs.Sound.INTERRUPT_EARLY, 0, 0, 0);
			}
			
			//alert( players[currentPlayer].name + ' wins!');
			
			exportRoot.endGame.alpha = 0;
			exportRoot.endGame.visible = true;
			updateScoreChart(exportRoot.endGame.scoreChart);
			
			//=== Allow Continue game or not?
				var stillNotFinished = 0;
				
				for(var i=0;i < players.length;i++){
					
					if(players[i].onSquare != squaresInGrid){
						stillNotFinished +=1;
					}
				}
				
				if(stillNotFinished !=0){
					exportRoot.endGame.continueGame.visible = true;	
				}else{
					exportRoot.endGame.continueGame.visible = false;
				}
			//================================			
			
			
			createjs.Tween.get(exportRoot.endGame,{override:true}).to({alpha:1},500).call(function(){
				

				
				
			});
			
		}else{
			
			createjs.Tween.get(exportRoot.moveCount,{override:true}).to({alpha:0},1000).call(function(){
				nextTurn();	
			});			
			
		}
		
		
		
		
	}
	
	
	
	function nextTurn(){
		
		
		if(doubleBonusOn){
			// This means the player has another roll - after getting a double!	
			exportRoot.moveCount.doubleBonus.visible = false;	
			exportRoot.roll.visible = true;	
			allowRollDice();
										
			
		}else{
			
			// Switch the player
			exportRoot.moveCount.doubleBonus.visible = false;
			exportRoot.nowPlayerHolder.visible = true;
			
			
			createjs.Tween.get(exportRoot.nowPlayerHolder,{override:true}).to({alpha:0},1000).call(function(){
				
				if(currentPlayer !== -1){
					console.log("Current Player: " + currentPlayer);
					console.log("last player : " + players[currentPlayer].name);
				}
				
				var foundNext = false;
				
				for(var i=currentPlayer+1;i < players.length;i++){
					if(players[i].onSquare !== squaresInGrid){
						foundNext = i;
						i = 99999999999;
					}
				}
				if(!foundNext){
					for(var i=0;i < players.length;i++){
						if(players[i].onSquare !== squaresInGrid){
							foundNext = i;
							i = 99999999999;
						}
					}
				}
				
				
				var data = [{onSquare: 25},{onSquare: 15},{onSquare: 18},{onSquare: 25},{onSquare: 25}];
				
				function some(currentPlayer, players, squaresInGrid)
				{
					for(var i=currentPlayer;i < players.length;i++)
					{
						if(players[i].onSquare !== squaresInGrid)
					   {
							return i;  
						}
					}
					return some(0, players, squaresInGrid);
					
				}
				//document.write(some(3, data, 25));			
				
				
				
				
				currentPlayer = foundNext;
				console.log("Current Player: " + currentPlayer);
				
				console.log("THIS PLAYER CAN TAKE A TURN : " + currentPlayer + ': ' + players[currentPlayer].name + ' as they are on square: ' + players[currentPlayer].onSquare);
				
				
				exportRoot.nowPlayerHolder.txt.text = players[currentPlayer].name
				
				exportRoot.roll.token.gotoAndStop(players[currentPlayer].token);
				
				// ====================== DEPTH - BRING CURRENT TO FRONT
				exportRoot.grid.setChildIndex( exportRoot.grid.getChildByName('token' + currentPlayer) ,  exportRoot.grid.numChildren-1);
				
				
				createjs.Tween.get(exportRoot.nowPlayerHolder,{override:true}).to({alpha:1},1000).call(function(){
				
					exportRoot.roll.visible = true;
						
					allowRollDice();
							
				});
				
			});				
			
		}
		
	}


	function allowRollDice(){
		exportRoot.roll.alpha = 0;
		createjs.Tween.get(exportRoot.roll,{override:true}).to({alpha:1},300).call(function(){
			exportRoot.roll.addEventListener("mousedown",rollDice);
		});	
	}


	exportRoot.endGame.continueGame.addEventListener("mousedown",continueGame);

	function continueGame(){
		createjs.Tween.get(exportRoot.endGame,{override:true}).to({alpha:0},500).call(function(){	
			doubleBonusOn = false;			
			createjs.Tween.get(exportRoot.moveCount,{override:true}).to({alpha:0},1000).call(function(){
				nextTurn();	
			});
		});
	}
	
	
	
	exportRoot.shuffle.addEventListener("mousedown",shuffleList);
	function shuffleList(){
		if(userOptions.useSounds){
			createjs.Sound.stop();
			createjs.Sound.play("shuffle", createjs.Sound.INTERRUPT_EARLY, 0, 0, 0);	
		}
		
		changeGrid(userOptions.useGrid);
	}	

	
	
	function noteDone(t){
		
		exportRoot.slideNote.done.removeEventListener("mousedown",noteDone);
		exportRoot.slideNote.remove.removeEventListener("mousedown",noteDone);		
		
		if(t.currentTarget.name == 'remove'){
			
			usedListSquares[players[currentPlayer].onSquare] = '--';
			
			exportRoot.grid.removeChild(exportRoot.grid.getChildByName('note' + players[currentPlayer].onSquare));
			
		}

		createjs.Tween.get(exportRoot.slideNote,{override:true}).to({x:1000},1000,createjs.Ease.elasticInOut).call(function(){
			endTurn();
		});
	}
	
	
	menuInstance.newGame.addEventListener("mousedown",newGameFromSettings);
	
	function newGameFromSettings(){
		
		players = [];		
		var temp = JSON.stringify(tmpPlayers);
		players = JSON.parse(temp); 
		
		
		userOptions = [];
		temp = JSON.stringify(tmpuserOptions);
		userOptions = JSON.parse(temp);
		
		
		exportRoot.moveCount.doubleBonus.visible = false;		
		doubleBonusOn = false;
		
		userList = [];
		userList = $('#namesList').val().split("\n");
		
			
		resetGame();
		
	}
	
	
	
	exportRoot.endGame.newGame.addEventListener("mousedown",resetGame);
	function resetGame(){
		
		hideDom();
		
		exportRoot.nowPlayerHolder.alpha = 100;
		exportRoot.nowPlayerHolder.visible = true;
		exportRoot.nowPlayerHolder.txt.text = "Let's Play..."
		
		exportRoot.roll.visible = false;		
		
		createjs.Tween.removeAllTweens();
		
		
		doubleBonusOn = false;
		exportRoot.moveCount.alpha = 0;		
		
		//=================
		exportRoot.shuffle.removeEventListener("mousedown",shuffleList);
		exportRoot.shuffle.visible = false;
		
		if(userOptions.showSpecialSquares){
			exportRoot.shuffle.addEventListener("mousedown",shuffleList);
			exportRoot.shuffle.visible = true;
		}
		//=================
		
		menuInstance.visible = false;
		

		for(var i=0;i < players.length;i++){
			players[i].onSquare = 1;
			exportRoot.grid.removeChild(exportRoot.grid.getChildByName('token' + i));		
		}
		
		currentPlayer = -1;
		
		changeNoOfDice(userOptions.noOfDice);
		changeGrid(userOptions.useGrid);
		updateScoreChart();
		
		
		placeTokens();	
			
		
		createjs.Tween.get(exportRoot.endGame,{override:true}).to({alpha:0},500).call(function(){	
			nextTurn();
		});		
		
		
	}


	exportRoot.back.addEventListener("mousedown",showSettings);
	function showSettings(){
		settingsShow();
		restoreDom();
	}
	
	menuInstance.returnToGame.addEventListener("mousedown",hideSettings);
	function hideSettings(){
		menuInstance.visible = false;
		hideDom();
	}	
	
	
	if(urlData.userType == false){
		$('#namesList').prop('disabled', true);
		console.log("DISABLD");
		
        menuInstance.btn_delete.visible=false;
        menuInstance.btn_update.visible=false;
		menuInstance.btn_new.visible=false;	
		
		menuInstance.mc_delete.addEventListener("mousedown",showPremium);
		menuInstance.mc_save.addEventListener("mousedown",showPremium);
		menuInstance.mc_update.addEventListener("mousedown",showPremium);		
		
		
	}
	
	
	
	menuInstance.premium1.on("mousedown",function(){window.open('https://www.online-stopwatch.com/premium/','_blank');});
    function showPremium()
    {
        menuInstance.mc_delete.removeEventListener("mousedown",showPremium);
        menuInstance.mc_save.removeEventListener("mousedown",showPremium);
        menuInstance.mc_update.removeEventListener("mousedown",showPremium);

        menuInstance.premium1.alpha = 0;
        menuInstance.premium1.visible = true;
        createjs.Tween.get(menuInstance.premium1).to({alpha:1},500);
    }
	
	
	createjs.EventDispatcher.initialize(Server.prototype);
	var server=new Server();
	
	
    createjs.EventDispatcher.initialize(Server.prototype);
    var server=new Server();
    server.addEventListener("serverAnswer",serverAnswer);



	function listInfoUpdate(){
		
        var txt = $('#namesList').val();
        txt = txt.trim().split("\n");
		var showLength = txt.length;	
		
		var tmpThis = [];
		
		tmpThis = getSpecialSquaresArray(tmpuserOptions.useGrid);
			
		var tmpLen = tmpThis.length
		
		
		if(showLength >= tmpLen){
			menuInstance.listInfo.text = 'Your List contains ' + showLength + ' items! Only ' + tmpLen + ' will fit on the board. They will be selected randomly!'
		}else{
			menuInstance.listInfo.text = '\n' +showLength + '/' + tmpLen;
		}
		
		
	}

    

    function serverAnswer(e)	{

		server.removeAllEventListeners();
		fromServer=e.data;
				
		if (fromServer.owner==="user")
		{
			isAllowed.remove=true;
			isAllowed.save=true;
			isAllowed.update=true;
			
			menuInstance.premium1.visible=false;
			
			menuInstance.btn_delete.visible=true;
			menuInstance.btn_update.visible=true;
			menuInstance.btn_new.visible=true;
			menuInstance.mc_delete.alpha=1;
			menuInstance.mc_update.alpha=1;	
			
			console.log("THIS USER CAN EDIT THE LIST!!!");	
			
		}
			
		if (fromServer.owner==="other")
		{
			isAllowed.remove=false;
			isAllowed.save=true;
			isAllowed.update=false;
					
			menuInstance.premium1.visible=false;
	
			menuInstance.btn_delete.visible=false;
			menuInstance.btn_update.visible=false;
			menuInstance.mc_delete.alpha=0.5;
			menuInstance.mc_update.alpha=0.5;
		}
		
		
		
		 console.log("ADDING URl : " + fromServer.r);
		 
		 if (typeof fromServer.r != "undefined") {
			 
			 Helper.addUrlParameter(null,"r",fromServer.r,true);
			 userList = fromServer.list.split(",");
			 
		 }else{

			 console.log("EMPTY R");
			 	
			 Helper.addUrlParameter(null,"r","",true);
			 userList = userListReset.slice();

		 }		
		
		loadApp();		
				
	};

	
	if (fromURL.r)
	{
		
		if(fromServer.r == 'default'){
			loadApp();
		}else{
			server.load({r:fromURL.r});
		}
		server.load({r:fromURL.r});
			
		
	}else{
		
		isAllowed.remove=false;
		isAllowed.save=true;
		isAllowed.update=false;
		
		menuInstance.premium1.visible=false;

		menuInstance.btn_delete.visible=false;
		menuInstance.btn_update.visible=false;
		menuInstance.mc_delete.alpha=0.5;
		menuInstance.mc_update.alpha=0.5;		
		
		
		loadApp();
	}
	
	function loadApp(){
		changeNoOfDice(userOptions.noOfDice);
		changeGrid(userOptions.useGrid);
		updateScoreChart();
		placeTokens();	
		nextTurn();		
		$("#loader").hide();
	}
	
	

}