function Index() { }

var index = null;

function newindex() {
	index = new Index();
	
	index.userid = getUserID();
	index.username = getUserName();
	
	if (index.userid == null || index.userid == "null"){
    	index.userid = 0;
    }    
    if (index.username == null || index.username == "null"){
    	index.username = "";
    }
}

/**
 * User management functions
 */
 
/*
 * Show login screen
 */
function showLogin() {
	//build login form
	var loginPanel = new StringBuffer();
	loginPanel.append(
					"<form name='login'><h:form onkeypress='return event.keyCode != 13;'>"+
						"<table cellspacing='5'><tbody>"+
							"<tr>" +
								"<td><b>"+getUIString("Login")+"</b></td>" +
							"</tr>" +
							"<tr><td>"+getUIString("Email")+"</td><td><input type='text' name='email'></td></tr>" +
							"<tr style='text-align:right'>" +
								"<td>&nbsp;</td>" +
								"<td>" +
									"<input type='button' value='"+getUIString("Login")+"' onclick='javascript:userLogin(this.parentNode.parentNode.parentNode)'>" +
									"<input type='button' value='"+getUIString("CancelButton")+"' onclick='javascript:hideLogin()'>" +
								"</td>" +
							"</tr>" +
						"</tbody></table>" +
					"</form>");
	loginPanel.append(getUIString("NewUser")+" <span id='register' onclick='javascript:showRegister()' style='position: static; text-decoration: underline; color: blue; cursor: pointer;'>"+getUIString("Register")+".</span>");					
	loginPanel.append("</tr></tbody></table>");
	
	//render and display login form
	document.getElementById("loginPanel").innerHTML = loginPanel.toString();
	document.getElementById("loginPanel").style.display = "";	
	document.getElementById("tblSearchPanel").style.display = "none";
}

/*
 * Show registration screen
 */
function showRegister(){
	//build registration form
	var loginPanel = new StringBuffer();
	loginPanel.append("<form name='register'><h:form onkeypress='return event.keyCode != 13;'>" +
						"<table cellspacing='5'><tbody>"+
							"<tr>" +
								"<td colspan='2' style='text-align:left'><b>"+getUIString("Register")+"</b></td>"+
							"</tr>" +
							"<tr>"+
								"<td style='text-align:left'>"+getUIString("NameLabel")+"</td>"+
								"<td style='text-align:left'><input type='text' name='name'></td>"+
							"</tr>" +
							"<tr>"+
								"<td style='text-align:left'>"+getUIString("Email")+"</td>"+
								"<td style='text-align:left'><input type='text' name='email'></td>" +
							"</tr>" +
							"<tr>"+
								"<td style='vertical-align:top; text-align:right'>"+getUIString("LanguagesToEdit")+"</td>" +
								"<td  style='text-align:left'>" +
									"<table><tbody>" +
										"<tr>" +
											"<td><b>"+getUIString("PossibleLanguages")+"</b> <span id='rMoreLanguages'>(<span id='rMoreLanguagesI' style='text-decoration: underline;color: blue;cursor: pointer;' onclick='javascript:showMoreLanguages(\"r\")'>"+getUIString("seeMore")+"</span>)</span></td>" +
											"<td>&nbsp;</td>" +
											"<td><b>"+getUIString("SelectedLanguages")+"</b></td>" +
										"</tr>" +
										"<tr>" +
											"<td style='height:200px; width:250px;'><select multiple id='rPossibleLanguages' name='possibleLanguages' size='7' style='height:100%; width:100%;' /></td>" +
											"<td>&nbsp;</td>" +
											"<td style='height:200px; width:250px;'><select multiple id='rSelectedLanguages' name='selectedLanguages' size='7' style='height:100%; width:100%;'/></td>" +
										"</tr>" +
										"<tr>" +
											"<td style='text-align: right;'><input type='button' value='"+getUIString("add")+"' onclick='javascript:addLanguages(this.form.possibleLanguages, this.form.selectedLanguages)'></td>" +
											"<td>&nbsp;</td>" +
											"<td style='text-align: right;'><input type='button' value='"+getUIString("remove")+"' onclick='javascript:removeLanguages(this.form.selectedLanguages)'></td>" +
										"</tr>" +
									"</tbody></table>" +
								"</td>" +
							"</tr>" +
							"<tr>" +
								"<td>&nbsp;</td>" +
							"</tr>" +
							"<tr style='text-align:right'>" +
								"<td>&nbsp;</td>" +
								"<td>" +
									"<input type='button' value='"+getUIString("Register")+"' onclick='javascript:addUser(((this.parentNode).parentNode).parentNode)'>" +
									"<input type='button' value='"+getUIString("CancelButton")+"' onclick='javascript:hideLogin()'>" +
								"</td>" +
							"</tr>" +
						"</tbody></table>" +
					"</form>");

	//render registration form					  
	document.getElementById("loginPanel").innerHTML = loginPanel.toString();
	//fill in language selection boxes
	var languageMenu = document.getElementById("rPossibleLanguages");
	populateLanguageSelectBox(languageMenu);
	languageMenu.options[0] = null;
	languageMenu.options[0] = null;
	document.getElementById("rSelectedLanguages").options[0]=new Option("("+getUIString("noLanguagesSelected")+")", -1);
	//display registration form
	document.getElementById("loginPanel").style.display = "";	
	document.getElementById("tblSearchPanel").style.display = "none";
}

/*
 * Add selected languages to the list of user languages (in interface)
 */
function addLanguages(form1, form2) {
	//form1 = possible languages
	//form2 = user languages
	var num_options1 = form1.options.length;
	var num_options2 = form2.options.length;
	if (num_options2 == 1 && form2.options[0].value == -1) {
		form2.options[0] = null;
		num_options2 = 0;
	}
	//for each selected option in possible languages, add a duplicate option to user languages
	for (var optionIndex = 0; optionIndex < num_options1; optionIndex++) {
		if (form1.options[optionIndex].selected) {
			var add = true;
			var optionValue = form1.options[optionIndex].value;
			//check if language is already in list
			for (var optionIndex2 = 0; optionIndex2 < num_options2 && add; optionIndex2++){
				if (form2.options[optionIndex2].value == optionValue) {
					add = false;
				}
			}
			if (add) {
				form2.options[num_options2] = new Option(form1.options[optionIndex].text, optionValue);
				num_options2++;
				form1.options[optionIndex].selected = "";
			}
		}
	}
	//if user has no languages selected
	if (num_options2 == 0) {
		form2.options[0] = new Option("("+getUIString("noLanguagesSelected")+")", -1);
	}	
}

/*
 * Removes languages from the list of user languages (in interface)
 */
function removeLanguages(form) {
	//for each selected language, remove it (starting from the bottom to avoid changing the indices of options still to be removed);
	for(var optionIndex = form.options.length - 1; optionIndex >= 0; optionIndex--) {
		if (form.options[optionIndex].selected) {
			form.options[optionIndex] = null;
		}
	}
	//if the user has no languages selected
	if (form.options.length == 0) {
		form.options[0] = new Option("("+getUIString("noLanguagesSelected")+")", -1);
	}
}

/*
 * Log in 
 */
function userLogin(form) {
	//Get user(s) associated with the given email address
	var url = "GetUser?";
	url = getFormValues(form, url);
	if (url != "none"){
		url += "&stamp="+(new Date()).getTime();
		AjaxClient.invokeGet(url, false, index.possibleUsers);
	}
}

/*
 * Register
 */
function addUser(form) {
	//add user
	var url = "AddUser?";
	url = getFormValues(form, url);
	if (url != "none") {
		url += "&stamp="+(new Date()).getTime();
		//log user in
		AjaxClient.invokeGet(url, false, index.loggedIn);
	}
}

/*
 * Once users for a given email address have been retrieved, do this
 */
Index.prototype.possibleUsers = function ( responseText ) {
	var users = responseText.parseJSON(null);	
	//if there is only one user, log them in
	if (users.length == 1) {
		index.loggedIn(users[0].toJSONString());
	}
	//if there is more than one user, ask which they are
	else if (users.length > 1) {
		var pickUser = "<b>"+getUIString("WhoAreYou")+"</b><br /><br />";
		for (var userIndex=0; userIndex < users.length; userIndex++){
			pickUser += "<div>&nbsp;&nbsp;&nbsp;-<span style='text-decoration: underline;color: blue;cursor: pointer;' onclick='javascript:index.loggedIn("+users[userIndex].toJSONString()+")'>"+users[userIndex].username+"</span></div>";
		}
		pickUser += "<br />"+getUIString("NewUser")+" <span id='register' onclick='javascript:showRegister()' style='position: static; text-decoration: underline; color: blue; cursor: pointer;'>"+getUIString("Register")+".</span>";
		document.getElementById("loginPanel").innerHTML = pickUser;
	}
	//if there are no users, tell the user that the email address provided is not registered
	else {
		alert(getUIString("NotRegistered"));	
	}
}

/*
 * Log user in
 */
Index.prototype.loggedIn = function( responseText ) {
	var user = responseText;
	if ((typeof responseText) == "string"){
		user = responseText.parseJSON(null);
	}
	//set session variables
	setUser(user.id, user.username);
	
	//set page variables
	index.userid = user.id;
	index.username = user.username;
	
	//update login bar
	var loginBar = new StringBuffer(
		"<span>"+getUIString("LoggedIn").replace("[Name]", user.username)+"</span>"+
		"&nbsp;"+		
		"<span id='logoutI' style='text-decoration: underline;color: blue;cursor: pointer;' onclick='javascript:userLogout()'>"+getUIString("Logout")+"</span>"+
		"&nbsp;"+
		"<span id='accountI' style='text-decoration: underline;color: blue;cursor: pointer;' onclick='javascript:viewAccount()'>"+getUIString("AccountInfo")+"</span>");
	document.getElementById("loginBar").innerHTML = loginBar.toString();
	//hide login/register screen
	hideLogin();
}

/*
 * Log out
 */
function userLogout(){
		//clear session variables
	clearUser();
	
	//clear page variables	
	index.userid = 0;
	index.username = "";

	//hide login/register screen
	hideLogin();	
	
	//update login bar
	var loginBar = new StringBuffer(
		"<span id='loginI' style='text-decoration: underline;color: blue;cursor: pointer;' onclick='javascript:showLogin()'>"+getUIString("Login")+"</span>"+
		"&nbsp;"+
		"<span id='registerI' style='text-decoration: underline;color: blue;cursor: pointer;' onclick='javascript:showRegister()'>"+getUIString("Register")+"</span>");
	document.getElementById("loginBar").innerHTML = loginBar.toString();
}

/*
 * Hide login/register screen
 */
function hideLogin() {
	//hide window
	document.getElementById("loginPanel").style.display = "none";
	document.getElementById("tblSearchPanel").style.display = "";
}

/*
 * Retrieve user's account information
 */
function viewAccount() {
	document.body.style.cursor = "wait";
	//retrieve user profile
	var url = "GetUserProfile?user="+index.userid;
	url += "&stamp="+(new Date()).getTime();
	AjaxClient.invokeGet(url, false, index.showAccount);
	document.body.style.cursor = "default";
}

/*
 * Display user's account information
 */
Index.prototype.showAccount = function( responseText ) {
	var userProfile = responseText.parseJSON(null);
	var languages = userProfile.languages;
	if (languages == 'undefined' || languages == undefined) {
		languages = "";
	}
	
	//build account editing form
	var accountPanel = new StringBuffer(
		"<form name='register'><h:form onkeypress='return event.keyCode != 13;'>" +
			"<table cellspacing='5'><tbody>"+
				"<tr>" +
					"<td><b>"+getUIString("EditAccount")+"</b></td>" +
				"</tr>" +
				"<tr>"+
					"<td>"+getUIString("NameLabel")+"</td>"+
					"<td><input type='text' name='name' value='"+userProfile.name+"'></td>"+
				"</tr>" +
				"<tr>"+
					"<td>"+getUIString("Email")+"</td>"+
					"<td>"+userProfile.email+"</td>" +
				"</tr>" +
				"<tr>"+
					"<td style='vertical-align:top'>"+getUIString("LanguagesToEdit")+"</td>" +
					"<td>" +
							"<table><tbody>" +
								"<tr>" +
									"<td><b>"+getUIString("PossibleLanguages")+"</b> <span id=aMoreLanguages>(<span id='aMoreLanguagesI' style='text-decoration: underline;color: blue;cursor: pointer;' onclick='javascript:showMoreLanguages(\"a\")'>"+getUIString("seeMore")+"</span>)</span></td>" +
									"<td>&nbsp;</td>" +
									"<td><b>"+getUIString("SelectedLanguages")+"</b></td>" +
								"</tr>" +
								"<tr>" +
									"<td style='height:200px; width:250px;'><select multiple id='aPossibleLanguages' name='possibleLanguages' size='7' style='height:100%; width:100%;' /></td>" +
									"<td>&nbsp;</td>" +
									"<td style='height:200px; width:250px;'><select multiple id='aSelectedLanguages' name='selectedLanguages' size='7' style='height:100%; width:100%;'/></td>" +
								"</tr>" +
								"<tr>" +
									"<td style='text-align: right;'><input type='button' value='"+getUIString("add")+"' onclick='javascript:addLanguages(this.form.possibleLanguages, this.form.selectedLanguages)'></td>" +
									"<td>&nbsp;</td>" +
									"<td style='text-align: right;'><input type='button' value='"+getUIString("remove")+"' onclick='javascript:removeLanguages(this.form.selectedLanguages)'></td>" +
								"</tr>" +
							"</tbody></table>" +
						"</td>" +
				"</tr>" +
				"<tr style='text-align:right'>" +
					"<td>&nbsp;</td>" +
					"<td>" +
						"<input type='button' value="+getUIString("Submit")+" onclick='javascript:editAccount((((this.parentNode).parentNode).parentNode), \""+userProfile.email+"\")'>" +
						"<input type='button' value='"+getUIString("CancelButton")+"' onclick='javascript:hideLogin()'>" +
					"</td>" +
				"</tr>" +
			"</tbody></table>" +
		"</form>"
	);
	
	//display account editing form
	var messagesDiv = document.getElementById("loginPanel");
	messagesDiv.innerHTML = accountPanel;
	
	//fill in language selection options
	var languageMenu = document.getElementById("aPossibleLanguages");
	populateLanguageSelectBox(languageMenu);
	languageMenu.options[0] = null;
	languageMenu.options[0] = null;	
	
	//fill in user languages
	var selectedLanguageMenu = document.getElementById("aSelectedLanguages");
	if (languages.length == 0) {
		selectedLanguageMenu.options[0]=new Option("("+getUIString("noLanguagesSelected")+")", -1);
	} else {
		for (var optionIndex = 0; optionIndex < languages.length; optionIndex++) {
			var language = languages[optionIndex];
			var languageName = language.englishName;
			if (language.nativeName != undefined && language.nativeName != "undefined") {
				languageName += " ("+language.nativeName+")";
			}
			selectedLanguageMenu.options[optionIndex] = new Option(languageName, language.id);
		}
	}
	
	messagesDiv.style.display = "";
	document.getElementById("tblSearchPanel").style.display = "none"; 
}

/*
 * Submit account edits
 */
function editAccount(form, email) {
	document.body.style.cursor = "wait";
	//update profile
	var url = "UpdateUserProfile?user="+index.userid+"&email="+email;
	url = getFormValues(form, url);
	url += "&stamp="+(new Date()).getTime();
	var numLangs = AjaxClient.invokeGet(url, false, null);
	//display updated account information
	viewAccount();
	if (numLangs >= 0) {
		document.body.style.cursor = "default";
		var messagesDiv = document.getElementById("loginPanel");
		var message = getUIString("ProfileUpdated");
		messagesDiv.innerHTML += message;
		messagesDiv.style.display = "";
	} 
	//if a number < 0 is returned, account information was not updated because user tried to change name to that of another user with the
	//same email address 
	else {
		document.body.style.cursor = "default";
		alert(getUIString("UserExists"));
	}
}

/*
 * Expand a list of languages
 */
function showMoreLanguages(prefix) {
	//prefix indicates whether the register or account editing language selection box is being modified
	populateAllLanguageSelectBox(document.getElementById(prefix+"PossibleLanguages"));
	document.getElementById(prefix+"MoreLanguages").style.display = "none";
}

/*
 * Fill in language selection options with searchable languages
 */
function populateLanguageSelectBox(p) {
	if (index.searchLanguages == undefined || index.searchLanguages == "undefined") {
	    languageCallback = function ( responseText ) {
	    	var json = responseText.parseJSON(null);
	    	index.searchLanguages = json.searchable;
	    }
    
  		// download the searchable languages
    	var url = "MajorLanguagesXML";
    	AjaxClient.invokeGet(url, false, languageCallback); 
	}
	var languages = index.searchLanguages;

	p.options[0]=new Option(getUIString("language"), -1);
	p.options[1] = new Option(getUIString("none"), -1);
	for(var i=0; i<languages.length; i++) {
		p.options[i+2]=new Option(languages[i].name + (languages[i].nativeName == null ? "" : " [" + languages[i].nativeName + "]"), languages[i].id);
	}
}

/*
 * Fill in language selection options with all languages from the Languages table
 */
function populateAllLanguageSelectBox(p) {
	var languages = index.allLanguages;
	//if necessary, retrieve the complete list of languages
	if (languages == undefined) {
		var url = "AllLanguages";
		index.allLanguages = AjaxClient.invokeGet(url, false, null).parseJSON(null);
		populateAllLanguageSelectBox(p);	
	}
	else {
		//add an option for each language
		for(var i=0; i<languages.length; i++) {
			p.options[i]=new Option(languages[i].name + (languages[i].nativeName == null ? "" : " [" + languages[i].nativeName + "]"), languages[i].id);
		}
	}
}

/*
 * Recursively extract values from a form
 */
function getFormValues(form, request){
	//text field (user management - login/register/edit account)
	if (form.type == "text") {
		if (form.name == "email") {
			//check format
			if(form.value.match(/^.+@.+\..{2,4}$/i)) {
				request += "&"+form.name+"="+form.value;
			} else {
				//tell user to enter a VALID email address	
				alert("Please enter a valid email address.")
				return "none";
			}
				
		} else if (form.name == "name"){
			if (form.value == ""){
				alert("Please enter your name.");
				return "none";
			} else {
				request += "&"+form.name+"="+form.value;
			}
		} else {
			request += "&"+form.name+"="+form.value;
		}
	}
	//multi-select (language selection menus)
	else if (form.type == "select-multiple") {
		if (form.name == "selectedLanguages") {
			//add all user languages
			for (var optionIndex = 0; optionIndex < form.options.length; optionIndex++){
				if (optionIndex == 0){
					request += "&languages="+form.options[0].value;
				}
				else {
					request += ","+form.options[optionIndex].value;
				}
			}
		}
	}
	else if (form.childNodes.length != 0){
		for (var i=0; i < form.childNodes.length; i++){
			request = getFormValues(form.childNodes[i], request);
			if(request == "none"){
				return "none";
			}
		}		
	}
	
	return request;
}