var menuHome = 1,
		menuMyProfile = 2,
		menuSecondGuess = 3,
		menuTrends = 4,
		menuRegister = 5,
		menuLogin = 6,
		menuLogout = 7
		menuChoices = 8,
		menuAdmin = 9,
		currMenu = 0;
		
var	loadedUserProfile = 0,
		loadedMpSel = 0,
		loadedUserChoice = 0,
		loadedTrends = 0,
		loadedAdmin = 0,
		completedMpSel = 0,
		completedUserChoice = 0;
		
function loadOn(big) {
	if (big)
		dispEl ("loadingGifBig", 1);
	else {
		dispEl ("loginLogout", 0);
		dispEl ("loadingGifSmall", 1);
	}
} // loadOn();
function loadOff() {
	dispEl ("loadingGifBig", 0);
	dispEl ("loadingGifSmall", 0);
	dispEl ("loginLogout", 1);
} // loadOff();

function handleConfKeyup(evt) {
	if (!evt)
		evt = window.event;
    var charCode = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);
		debug ("charCode " + charCode, 1);
		if ((charCode>48) && (charCode<54))
			getEl("udsecondGuessSubmit").focus();
		return;
		/*
		return false;
    var charCode = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);
    if (charCode == 13 || charCode == 3) {
        if (validateForm(form)) {
            form.submit(  );
            return false;
        }
    }
    return true;
		*/
	/* */
	debug ("keydown event " + e + "   ");
	for (var i in e)
		debug (" " + i);
	debug ("", 1);
	// e.cancelBubble();
	/* */
}

// ------------------------------------------------------------------------------------------------------------ menu()

function displayStandardDivs(disp) {
	// display common divs, or not
	dispEl ("firefoxDiv", disp);
	dispEl ("footer", disp);
} // displayStandardDivs

function completeMenuLoadMyProfile (loggedIn) {
	// triggered when loading complete - different actions depending on whether logged in or not
	loadOff ();
	dispEl ("DOMuserProfile", 1);
	displayAbout (0);
	// fillUserChoices ();	
	if (userNo) {
		// getEL("udFormEmail").focus();			// *** get working
		fillUserProfile();
		dispEl("userNameDiv", 1);
		dispEl("userNameAndPw", 0);
		// dispEl ("messageBox", 1);
		displayUnamePw (0);
		/*
		dispEl("udFormName", 0);	/*	must do something about this in IE
		dispEl("udFormPw", 0);
		dispEl("udFormConfPw", 0);
		*/
	}
	else {
		displayUnamePw (1);
		getEl("userProfileForm").reset();
		dispEl("userNameDiv", 0);
		dispEl("userNameAndPw", 1);
		// getEL("udFormName").focus();		// *** get working
		// dispEl ("messageBox", 1);
	}
	setRadioStyles ("userProfileForm");
	displayStandardDivs(1);
} // completeMenuLoadMyProfile

function completeMenuLoadSecondGuess () {
	// triggered when loading complete
	displayAbout (0);
	debug ("completeMenuLoadSecondGuess",1);
	makeMpEls();
	completedMpSel = 1;
	clearMpDisplay();				// *** make more selective
	setupSecondGuessDisplay();
	showHeadTab(1);
	loadOff();
	dispEl ("DOMmpSel", 1);
	dispEl ("DOMsecondGuess", 1);
	// dispEl ("messageBox", 1);
	displayStandardDivs(1);
	clearSecGuessFields();				// clear the fields
	// getEl("submitSecondGuess").focus();	// traps the enter key? *** need to resolve
} // completeMenuLoadSecondGuess

function completeMenuLoadChoices () {
	// triggered when loading complete
	displayAbout (0);
	completedMpSel = 1;
	completedUserChoice = 1;
	clearMpDisplay();				// *** make more selective
	setupChoiceDisplay();
	showHeadTab(1);
	loadOff();
	fillUserChoices ();
	hiliteCurrUc(0);		// de-highlight
	dispEl ("DOMmpSel", 1);
	dispEl ("DOMuserChoices", 1);
	// dispEl ("messageBox", 1);
	setUserChoiceDisableState(true);
	displayStandardDivs(1);
} // completeMenuLoadChoices

function completeMenuLoadTrends() {
	loadedTrends = 1;
	loadOff();
	dispEl("innerMessageBox", 1);
	dispEl ("DOMtrends", 1);
} // completeMenuLoadTrends

function completeMenuLoadAdmin() {
	loadOff();
	dispEl ("DOMadminPage", 1);
}

function displayAbout (showIt) {
	dispEl ("about2ndGuess", showIt);
	dispEl ("innerMessageBox", ((showIt) ? 0 : 1));
} // displayAbout

menu.currMen = 0;
menu.someUpdate = 0;
function menu(n) {
	// called when selecting menu item n
	if (n==menu.currMen)
		return;
	debug ("Menu " + n, 1);
	if (!loggedIn && ((n!=menuHome) && (n!=menuTrends) && (n!=menuRegister) && (n!=menuLogin))) {
		alert ("You will need to log in or register to view these pages");
		n = 1;
	}
	setStyle ("men" + menu.currMen, "");
	setStyle ("men" + n, "menCurr");
	menu.currMen = n;
	if (n!=5)
		getEl("registerFormSubmit").disabled = false;
	dispEl ("DOMmpSel", 0);
	dispEl ("DOMsummGrid", 0);
	dispEl ("DOMuserProfile", 0);
	dispEl ("DOMuserChoices", 0);
	dispEl ("DOMsecondGuess", 0);
	dispEl ("DOMtrends", 0);
	dispEl ("DOMadminPage", 0);
	clearMessage();
	// dispEl ("messageBox", 0);
	dispEl ("firefoxDiv", 0);
	displayAbout (1);
	displayStandardDivs(0);
	if (addOrDelUc.inAddOrChange)		// in middle of change - call event handler to cancel *** do better
		changeOrCancelUc(addOrDelUc.inAddOrChange);
	switch (n) {
		case 1 :						// menuHome
				if (summGridLoaded)						// don't display until loaded
					dispEl ("DOMsummGrid", 1);
				dispEl ("firefoxDiv", 1);
				displayStandardDivs(1);
				if (menu.someUpdate) {
					debug ("Updating stats after update");
					menu.someUpdate = 0;		// clear flag
					getHomePageStats(1);		// .. and do update
				}
				break;
		case 2 :						// menuMyProfile
				displayAbout (0);
				if (!loadedUserProfile) {
					loadOn(1);
					loadedUserProfile = 1;
					HTTP.getText("sg_userprofile_inject.php?user=" + userNo, domInject, "DOMuserProfile", completeMenuLoadMyProfile);
				}
				else
					completeMenuLoadMyProfile (0);
				break;
		case 3 :						// menuSecondGuess
				displayAbout (0);
				if (!loadedMpSel) {
					loadOn(1);
					loadedMpSel = 1;
					HTTP.getText("sg_mp_sel_inject.php", domInject, "DOMmpSel", completeMenuLoadSecondGuess);
				}
				else {
					loadOn();
					completeMenuLoadSecondGuess();
				}
				break;
		case 4 :						// menuTrends
				// displayAbout (0);
				displayStandardDivs(1);
				// dispEl ("DOMtrends", 1);
				// break;
				if (!loadedTrends) {
					loadOn(1);
					loadedTrends = 1;
					HTTP.getText("sg_trends_inject.php", domInject, "eventsMap", completeMenuLoadTrends);
				}
				else
					completeMenuLoadTrends();
				break;
		case 5 : 						// menuRegister
				userNo = 0;
				displayAbout (0);
				if (!loadedUserProfile) {
					loadOn(1);
					loadedUserProfile = 1;
					HTTP.getText("sg_userprofile_inject.php?user=" + userNo, domInject, "DOMuserProfile", completeMenuLoadMyProfile);
				}
				else
					completeMenuLoadMyProfile (0);
				break;
		case 6 :						// menuLogin
				displayStandardDivs(1);
				break;
		case 7 :						// menuLogout
				displayStandardDivs(1);
				HTTP.getText("sg_logout.php");		// no callback - simply destroys session
				break;
		case 8 :						// menuChoices
				displayAbout (0);
				if (loadedMpSel && loadedUserChoice) {	// go straight to it!
					loadOn();
					completeMenuLoadChoices();
				}
				else {
					if (!loadedUserChoice) {
						loadOn(1);
						loadedUserChoice = 1;
						HTTP.getText("sg_userchoices_inject.php", domInject, "DOMuserChoices", doneUserChoices);
					}
					if (!loadedMpSel) {
						loadOn(1);
						loadedMpSel = 1;
						HTTP.getText("sg_mp_sel_inject.php", domInject, "DOMmpSel", doneMpSel);
					}
				} // else
				break;
		case 9 :						// menuAdmin
				displayStandardDivs(1);
				if (!loadedAdmin) {
					loadOn(1);
					loadedAdmin = 1;
					HTTP.getText("sg_adminpage_inject.php", domInject, "DOMadminPage", completeMenuLoadAdmin);
				}
				else
					completeMenuLoadAdmin();
				break;
	} // switch
} // menu

function fillInStats(response) {
	// initialise statistics
	// debug (response, 1);
	eval (response);
	// debug ("GOT sg_summgrid_update.php", 1);
	loadOff();
	getHomePageStats.timerId = setTimeout (getHomePageStats, ((isDev) ? (1000 * 60 * 1) : (1000 * 60 * 10)));
			// one minute for dev, 10 minute for the remainder
} // fillInStats

function getHomePageStats(update) {
	loadOn(0);
	setElHTML ("theWinnerName", "&iquest; Guess Who ?");
	if ((update > 0) && getHomePageStats.timerId) {
		clearTimeout (getHomePageStats.timerId);
		getHomePageStats.timerId = 0;
	}
	// debug ("getting sg_summgrid_update.php", 1);
	HTTP.get("sg_summgrid_update.php", null, fillInStats, null);			
} // getHomePageStats

function doneUserChoices () {
	completedUserChoice = 1;
	if (completedMpSel)
		completeMenuLoadChoices();
}
function doneMpSel () {
	// debug ("doneMpSel", 1);
	makeMpEls();					// make elements, for rapid access
	completedMpSel = 1;
	if (completedUserChoice)
		completeMenuLoadChoices();
}

function domInject(text, target, initFun) {
	// callback from HTTP.getText - target specifies target elementID for text, initFun is the initialisation function
	// debug ("domInject for " + target, 1);
	setElHTML (target, text);
	if (initFun) {
		// debug (" calling initFun " + initFun, 1);
		initFun();
	}
}

function fillUserChoices(n) {
	// called when user choices loaded.  If n, then just set that MP
		// now set up details
	var i, n;
	var mpN;  				
	var firstBlank = 1;
	selMp(0, 0);
	for (i = 0; i < 5; i++) {
		mpN = userChA[i];
		n = i+1;
		if (mpN) {
			setElHTML("ucName"+n, mpSelDisp(mpN));
			removeStyle ("ucName"+n, "mpHoverTextInstruction");
			setElHTML("ucAddOrDel"+n, "delete");
			setElHTML("ucChangeOrCancel"+n, "change");
			dispEl("ucChangeOrCancel"+n, 1);
			//dispEl("ucMoveUp"+n, boolToInt(n > 1));		// *** amend dispEl so it works, with or without boolToInt
			//dispEl("ucMoveUp"+n, boolToInt(n < 5));
			/* */
			if (n > 1)
				dispEl("ucMoveUp"+n, 1);
			else
				dispEl("ucMoveUp"+n, 0);
			if (n < 5)
				dispEl("ucMoveDown"+n, 1);
			else
				dispEl("ucMoveDown"+n, 0);
			/* */
		}
		else {
			if (firstBlank) {
				addStyle ("ucName"+n, "mpHoverTextInstruction");
			  setElHTML("ucName"+n, "<< double-click an MP name to complete this field >>");
				firstBlank = 0;
			}
			else {
				removeStyle ("ucName"+n, "mpHoverTextInstruction");
			  setElHTML("ucName"+n, "&nbsp;");
			}
			setElHTML("ucAddOrDel"+n, "add");
			dispEl("ucChangeOrCancel"+n, 0);
			dispEl("ucMoveUp"+n, 0);
			dispEl("ucMoveDown"+n, 0);
		}
	} // for i
	// setRadioStyles ("userProfileForm");
} // fillUserChoices

function loginResponse(response) {
	// debugText ("loginResponse: " + response, 1);
	eval(response);
	if (loggedIn) {
		dispEl("divLogin", 0);
		dispEl("divLoggedIn", 1);
		setElHTML("loggedInUserName", us_uname);
																																																				if (!isDev)
																																																					menu (menuMyProfile);		// this is the original
																																																				if (isDev)
																																																					menu(menuTrends);
	}
	else {
		dispEl("divLogin", 1);
		dispEl("divLoggedIn", 0);
		alert ("Bad user name or password");
	}
}

function submitLogin(userNo) {
	// if userNo specified, login as a result of registration
	// if not, then get form values and submit
	var values;
	var loginForm;
	var i;
	debug ("submitLogin user " + userNo, 1);
	if (userNo) {
		values = "userNo=" + userNo;
	}
	else {
		loginForm = getEl("loginForm");
		debugText ("submitting login " + loginForm.name, 1);
		values = HTTP.encodeFormElements(loginForm);
	}
	// delete existing selections
	for (i in userChA)
		userChA[i] = 0;
	for (i in userChASav)
		userChASav[i] = 0;
	for (i in userSgA) {
		Mps[i].nominator = 0;
		Mps[i].nominee = 0;
		delete userSgA[i];
	}
	debugText (values, 1);
	HTTP.get("sg_login.php", values, loginResponse, null);
} // submitLogin

function submitLogout() {
	debug ("selMp.currNominator = " + selMp.currNominator, 1);
	if (selMp.currNominator) {
		alert ("You are in the middle of an update/n" + 
					 "Please complete this action, or press the Reset button");
		return;
	}
	dispEl ("menAdmin", 0);
	dispEl("divLogin", 1);
	dispEl("divLoggedIn", 0);
	loggedIn = 0;
	// deleteChildNodes("DOMuserProfile");		// keep it all now
	// loadedUserProfile = 0;
	// deleteChildNodes("DOMuserRegister");
	// loadedRegistration = 0;
	menu (menuHome);		// *** need to send message to server
	// getEl("loginFormName").focus();		// *** does not work, even though login displayed
	if (!isDev) {
		getEl("loginFormName").select();
		getEl("loginFormPw").value = "";
	}
} // submitLogout

function submitUserDetails(userNo) {
	// new registration if user 0, else update of details
	debug ("SUBMITTING user details", 1)
	var udForm = getEl("userProfileForm");
	// the following are required for Firefix - it does not pick up the attributes from the form
	// udForm.udFormEmail.optional = true;
	udForm.udFormEmail.email = true;
	// udForm.udFormAge.optional = true;
	udForm.udFormAge.min = 5;
	udForm.udFormAge.max = 110;
	
	getEl("udFormTownOrCountry").optional = true;		// need this for radio buttons
	getEl("udFormPolitics").optional = true;
	getEl("udFormGreatestPM").optional = true;
	getEl("udFormClass").optional = true;
	getEl("udFormSupportIraq").optional = true;
	getEl("udFormSupportChoiceInEducation").optional = true;
	getEl("udFormSupportPrivateNHS").optional = true;
	getEl("udFormSupportNuclearPower").optional = true;
	getEl("udFormSupportTrident").optional = true;
	getEl("udFormSocOrDem").optional = true;
	getEl("udFormDevOrEnv").optional = true;
	getEl("udFormTreatOrPreventIllness").optional = true;
	/*
	*/
	// end of firefox ;
	if (verify(udForm, setError, "udFormPw", "udFormConfPw")) {
		debugText ("submitting user details " + udForm.name, 1);
		var values = HTTP.encodeFormElements(udForm);
		if (userNo)	// logged in, so prepend userno details
			values = "udUserNo=" + userNo + "&" + values;
		debugText (values);
		loadOn(0);		// show updating
		menu.someUpdate = 1;		// signal reload
		HTTP.get("sg_userprofile_update.php", values, udResponse, null);
	} // if (verify)
} // submitUserDetails

function udResponse(response) {
	// user details response
	debugText ("udResponse: " + response, 1);
	// alert ("Response to user registration = " + response);
	var val = parseInt(trim(response));
	debug ("udResponse: val " + val, 1);
	if (userNo==0) {		// not yet logged in, so registration
		userNo = val;
		if (userNo==0)		// still 0
			setElHTML ("innerMessageBox", "This user name already exists - please try again");
		else {						// do a login
			submitLogin (userNo);
			// menu (menuMyProfile);
		}
	} // userNo == 0
	else {	// update
		if (val) {
			submitLogin (userNo);				// simplest way of updating user details
		}
		else {
			alert ("Your details could not be updated");
			getEl("userProfileForm").reset();
			debug ("val=" + val, 1);
		}
	}
	loadOff();
	return;
	eval(response);
	if (loggedIn) {
		dispEl("divLogin", 0);
		dispEl("divLoggedIn", 1);
		setElHTML("loggedInUserName", us_uname);
	}
	else {
		dispEl("divLogin", 1);
		dispEl("divLoggedIn", 0);
	}
} // udResponse

function submitRegister() {
	//if (getEl("registerFormSubmit").disabled)
	getEl("registerFormSubmit").disabled = true;
	menu(menuRegister);
} // submitRegister

function ucResponse(response) {
	// user choice response
	debugText ("ucResponse: " + response, 1);
	// alert ("Response to user choice = " + response);
	var val = parseInt(trim(response));
	debug ("ucResponse: val " + val, 1);
	if (val) {
		resetMpChoices();			// make sure right Mps are tagged
	}
	else {
		alert ("Your choices could not be updated");
		debug ("val=" + val, 1);
		// getEl("userProfileForm").reset();
	}
	fillUserChoices();
	loadOff();
} // ucResponse

function submitUserChoice() {
	// send and then do fresh login response
	debug ("submitUserChoice", 1);
	if (!userNo) 
		return;
	var values = "userChoices=1&userNo=" + userNo;

	squashChoices(); 
	
	for (var i = 0; i < 5; i++)  {
		userChASav[i] = userChA[i];		// set backup, now we have a whole new game!
		if (userChA[i])
			values += '&choice' + i + "=" + userChA[i];
	}
	
	debugText (values);
	// deleteChildNodes("DOMuserProfile");		// *** should not be necessary - update in situ
	// loadedUserProfile = 0;
	loadOn(0);		// show updating
	menu.someUpdate = 1;		// signal reload
	HTTP.get("sg_userchoices_update.php", values, ucResponse, null);
	setUserChoiceDisableState(true);
} // submitUserChoice

function deleteChildNodes (node) {
	var child;
	node = getEl (node);
	while (child = node.firstChild) {
		node.removeChild(child);
	}
} // deleteChildNodes

function sgResponse (response) {
	// second guess response
	debugText ("sgResponse: " + response, 1);
	// alert ("Response to second guess = " + response);
	var val = parseInt(trim(response));
	debug ("sgResponse: val " + val, 1);
	if (val) {
		var nee = selMp.currNominee;
		if (Mps[nee].rapidLookup == 0) {
			Mps[nee].rapidLookup = 1;
			setElHTML("nomineeLookup", getElHTML("nomineeLookup") + '<a href="javascript:void nullFunc(5)" id="mpNl' + nee +
																						'" onclick="selMp(' + nee + ',1);">' + mpSelDisp(nee, 1) + '</a><br />');
			addedToRecentMps = 1;		// record the fact
		}
		resetMpGuesses();
		selMp.currNominator = 0;	// *** check this OK
		selMp.currNominee = 0;
	} else {
		alert ("Your second guess could not be updated");
		debug ("val=" + val, 1);
		// getEl("userProfileForm").reset();
	}
	loadOff();
} // sgResponse

function resetSecondGuess() {
	// cancel second guess currently updating
	selMp.currNominator = 0;
	selMp.currNominee = 0;
	selMp.nomState = stateValNull;
	clearSecGuessFields();
} // resetSecondGuess

function submitSecondGuess(deleteIt) {
	// submit second guess to server
	var conf = 0;
	if (deleteIt) {
		delete userSgA[selMp.currNominator];			// should really come after reply from  server
		setStyle("mp"+selMp.currNominator, "");				// not done elsewhere  *** check use setStyle, not addStyle
	}
	else {
		conf = Math.round(parseInt(getEl("sgFormConf").value));
		addSecondGuess (selMp.currNominator, selMp.currNominee, conf);			// should really come after reply from  server
	}
	var values = ((deleteIt) ? "deleteSecondGuess" : "updateSecondGuess=1");
	if ((selMp.currNominator==0) || (selMp.currNominee==0)) {
		alert ("You must specify both nominator and nominee");
		return;
	}
	else if ((deleteIt==0) && ((!conf) || (conf < 1) || (conf > 5))) {
		alert ("You must specify a confidence rating in the range 1 to 5 (5 is the highest)");
		return;
	}
	else {
		values += "&userNo=" + userNo;
		values += "&sgNominator=" + selMp.currNominator;
		values += "&sgNominee=" + selMp.currNominee;
		values += "&sgWeight=" + conf;
		debug ("2ndGuess values - " + values, 1);
		loadOn(0);		// show updating
		menu.someUpdate = 1;		// signal reload
		debug ("sg_update2ndguess - vals: " + values, 1);
		HTTP.get("sg_2ndguess_update.php", values, sgResponse, null);
		clearSecGuessFields();
	}
} // submitSecondGuess

function popupNomorList(mp, cnt) {
	// mp mp, number of mps, cnt
	if (!cnt) cnt = 10;
	window.open("sg_popup_nominators.php?nominee=" + mp, "sponsors_for_" + mp, "width=580,height=" + (72 + 24*cnt) + ",resizable=yes, scrollbars=yes", true);
	// popup a nomination list for mp mp
}
