var starty, startheight, minheight, resize;
var currentColor;
var loadingstate = 0;
var loaded = false;
var loggedin = false;
var username;
var logintime;
var minutetimer;

/**
 *	Called upon the start of a resize operation.
 */
function onResizeStart(e) {
	// do not handle clicks on input elements
	var src = NS6 ? e.target : event.srcElement;
	if (src && src.nodeName == "INPUT") return;

	// attache event handler
	document.onmousemove = onResizeMove;
	document.onmouseup = onResizeEnd;
	
	try {
		var innerdoc = getForumFrameDocument();
		innerdoc.onmousemove = onResizeMove;
		innerdoc.onmouseup = onResizeEnd;
	} catch (ex) {
		// ignore exception in case drag handler can not be attached to iframe
		// throw ex;
	}
	
	// calculation
	starty = NS6 ? e.screenY : event.screenY;
	startheight = parseInt(document.getElementById("trivial").offsetHeight);
	refreshMinHeight();
	
	// set flag and return
	resize = true;
	
	return false;
}
		
/**
 *	Called when the mouse is moved during a resize operation.
 */
function onResizeMove(e) {
	if (resize) {
		// capture event
		if (IE) {
			if (event) cury = event.screenY;
			else cury = getForumFrame().event.screenY;
		} else {
			cury = e.screenY;
		}
	
		// calculate height
		var newheight = startheight + (cury - starty);
		newheight = Math.max(minheight, newheight);
		newheight = Math.min(newheight, getWindowHeight() - parseInt(document.getElementById("bar").offsetHeight));
	
		// set heights
		setQuizHeight(newheight);
	
		// return
		debug(minheight + " " + startheight + " " + starty + " " + cury + " " + newheight);
	}
	
	return false;
}

function maximizeForum() {
	refreshMinHeight();
	setQuizHeight(minheight);
}
		
function minimizeForum() {
	refreshMinHeight();
	setQuizHeight(getWindowHeight() - parseInt(document.getElementById("bar").offsetHeight));
}

function setQuizHeight(newheight) {
	document.getElementById("trivial").style.height = newheight + "px";
	document.getElementById("bar").style.top = newheight + "px";
	document.getElementById("forum").style.top = (newheight + parseInt(document.getElementById("bar").offsetHeight)) + "px";
}

function refreshMinHeight() {
	var correct = 0;
	lsb = document.getElementById("leftsidebar").offsetHeight + SIDEBAR_BOTTOM_SPACE + correct;
	rsb = document.getElementById("rightsidebar").offsetHeight + SIDEBAR_BOTTOM_SPACE  + correct;
	minheight = Math.max(MIN_TRIVIA_HEIGHT, lsb, rsb);
}

function getBrowserHeight() {
	if (IE) return document.getElementById("bodycontent").offsetHeight;
	else return window.innerHeight;
}

/**
 *	Called when the mouse is dropped after a resize operation.
 */
function onResizeEnd(e) {
	if (resize) {
		document.onmouseup = null;
		document.onmousemove = null;
	
		try {
			var innerdoc = getForumFrameDocument();
   			innerdoc.onmousemove = null;
	 		innerdoc.onmouseup =  null;
	 	} catch (ex) { 
	  	// ignore exception in case handler can not be removed from the iframe
  		}
	}
	resize = false;
	return true;
}

function infobox(text) {
	document.getElementById("curtain").style.display = "";
	document.getElementById("infobox").style.display = "";
	document.getElementById("td.infobox.body").innerHTML = text;
}

function closeInfobox() {
	document.getElementById("infobox").style.display = "none";
	document.getElementById("curtain").style.display = "none";
}

function showImpressum() {
	infobox(getString("impressum"));
}

/**
 *	Sets the color of the text input control to the background color of a given table cell.
 */
function setColor(td) {
	if (loggedin) {
		currentColor = td.style.backgroundColor;
		if (currentColor.indexOf("rgb")>=0) currentColor = rgb2hex(currentColor);
		document.getElementById("txt").style.color = currentColor;
		document.getElementById("txt").focus();
	}
}

/**
 *	Display loading bar animation until loaded attribute is set to true.
 */
function updateLoadingBar() {
	var bar = document.getElementById("loadingbar");
	bar.innerHTML = LOADING_STATE_STRINGS[loadingstate++ % LOADING_STATE_STRINGS.length];
	
	if(!loaded) setTimeout("updateLoadingBar()", 200);
}

function home() {
	showSmfAction();
}

function tryRemoteLogin() {
	if (pushletsReady && channelJoined) {
		login(); 
	}
}

/**
 *	Called to login as the user named in the respective text input control.
 */
function login() {

	doLogin=false; 

	var loginObject = new ServiceObject(TRIVIAL_URL);
	username = document.getElementById("fusername").value;
	var pwd = document.getElementById("fpwd").value;
	var pushID = Pushlets.getSession();
	loginObject.addParam("inNick", username); 
	loginObject.addParam("inPassword", pwd);	
	loginObject.addParam("inPushletId", pushID);			
	var error = loginObject.call("login");
	if (error) {
		var message = getString("error.unknown");
		if (error == "user_not_found") message = getString("error.invaliduser");
		else if (error == "user_inactive") message = getString("error.inactiveuser");
		else if (error == "password_invalid") message = getString("error.invalidpass");
		else if (error == "user_already_logged_in") message = getString("error.alreadyloggedin"); 
		else if (error == "too_many_users") message = getString("error.toomany");
		else if (error == "unexpected_exception") message = getString("error.contact");
		document.getElementById("login.response").innerHTML = message;
	} else {
		if (Pushlets.Joined == false) {
			message = getString("error.notfullyloaded"); 
			document.getElementById("login.response").innerHTML = message;
		} else { 
			try{
				smfLogin(username, pwd);
			} catch(e) {}	
			onLogin();
			loggedin = true;
		}
	}
}

function forgotPassword(name) {
	var pwdObject = new ServiceObject(TRIVIAL_URL);
	pwdObject.addParam("inName", name); 
	var response = pwdObject.call("sendPassword");
	infobox(response);
	
	// showSmfAction("reminder");
}

/**
 *	Called upon the successful login event.
 */
function onLogin() {
	document.getElementById("home.link").className = "";
	//document.getElementById("bar").style.background = "";
	//document.getElementById("curtain").style.visibility = "hidden";
	document.getElementById("logindata").style.visibility = "hidden";
	document.getElementById("logindata").style.display = "none";
	document.getElementById("username").innerHTML = username;
	document.getElementById("logininfo").style.visibility = "visible";
	document.getElementById("logininfo").style.display = "";
	document.getElementById("barbuttons").style.visibility = "visible";
	document.getElementById("barbuttons").style.display = "inline";
	document.getElementById("txt").disabled = false;
	document.getElementById("txt").value = "";
	document.getElementById("txt").focus();
	document.getElementById("chat.lock").style.visibility = "hidden";
	document.getElementById("question.add").style.display = "";
	document.getElementById("question.addwin").style.display = ""; 
	logintime = new Date();
	minutetimer = window.setInterval("updateMinutes()", 1000 * 60);
	enableVote(); 
}

function callback_logout() {
	// logout smf
	try {
		smfLogout(false);
	} catch(e) {}			
	
	// postprocessing
	onLogout();
	loggedin = false;
}

function logout() {
	// logout smf
	try {
		smfLogout(false);
	} catch(e) {}		
	
	try {	
		var logoutObject = new ServiceObject(TRIVIAL_URL);		
		var temp = logoutObject.call("logout");
	} catch(e) {}		
	
	// postprocessing
	onLogout();
	loggedin = false;
}


/**
 *	Called to logout the user.
 */
function quit() {
	
	try {	
		var logoutObject = new ServiceObject(TRIVIAL_URL);		
		var temp = logoutObject.call("quit");
	} catch(e) {}
	
	try {	
		Pushlets.leave();
	} catch(e) {}	
	
	// logout smf
	try {
		smfLogout(true);
	} catch(e) {}	
}

/**
 *	Called whenever a logout is conducted: Display and input controls are
 *	updated accordingly.
 */
function onLogout() {
	//document.getElementById("bar").style.background = "#545454";
	document.getElementById("home.link").className = "loading";
	//document.getElementById("curtain").style.visibility = "visible";
	document.getElementById("logininfo").style.visibility = "hidden";
	document.getElementById("logininfo").style.display = "none";			
	document.getElementById("barbuttons").style.visibility = "hidden";
	document.getElementById("barbuttons").style.display = "none";
	document.getElementById("txt").style.color = "";
	document.getElementById("txt").disabled = true;
	document.getElementById("txt").value = getString("participatelogin");
	document.getElementById("chat.lock").style.visibility = "visible";
	document.getElementById("fpwd").value = "";
	document.getElementById("logindata").style.visibility = "visible";
	document.getElementById("logindata").style.display = "";
	document.getElementById("login.response").innerHTML = "";
	document.getElementById("fusername").focus();
	document.getElementById("question.add").style.display = "none";
	document.getElementById("question.addwin").style.display = "none"; 
	disableVote(); 
	
	logintime = null;
	window.clearInterval(minutetimer);
}

function prepareMessage(msg) {
	if (loggedin) {
		document.getElementById("txt").value = msg;
		document.getElementById("txt").focus();
	}
}

function showPageLink() {
	var url = getString("permlinktext") + "<br/><br/>";
	// base location
	var loc = top.location.href;
	if (loc.indexOf("?") >= 0) loc = loc.substring(0, loc.indexOf("?"));
	url = url + loc;
	// smf state
	var inx = "/index.php?";
	var smf = getForumFrameDocument().location.href;
	var params = (smf.indexOf(inx) >= 0) ? smf.substring(smf.indexOf(inx) + inx.length) : "";
	if (params.length > 0) url = url + "?" + params;
    // remove previous referrer
    url = removeParameter(url, "ref");
    // referrer
    if (loggedin) url = appendParameter(url, "ref", username);
	// show url
	infobox(url);
}

function removeParameter(url, param) {
    var i = url.indexOf(param + "=");
    if (i > 0) {
        var pre = url.charAt(i-1);
        if (pre == "?" || pre == "&") {
            var j = url.indexOf("&", i);
            if (j >= 0) {
                var a = url.substring(0, i - 1);
                var b = url.substring(j);
                if (a.indexOf("?") >= 0) return a + b;
                else return a + "?" + b.substring(1);
            } else return url.substring(0, i - 1);
        } else return url;
    } else return url;
}

function appendParameter(url, name, value) {
    var char = (url.indexOf("?") > -1) ? "&" : "?";
    var seq = char + "ref=" + username;
    var raut = url.indexOf("#");
    if (raut >= 0) 
        url = url.substring(0, raut) + seq + url.substring(raut);
    else url = url + seq;  
    return url; 
}

function getForumFrame() {
	if (IE) return document.frames["forum.frame"];
	else return document.getElementById("forum.frame");
}

function getForumFrameDocument() {
	if (IE) return getForumFrame().document;
	else return getForumFrame().contentDocument;
}
		
/**
 *	Updates the information on the time the user has been logged in.
 */
function updateMinutes() {
	var now = new Date();
	var mx = parseInt((now.getTime() - logintime.getTime()) / (1000 * 60));
	var minutes = document.getElementById("minutes");
	minutes.innerHTML = mx;
}

/**
 *	Updates the information on the score the user has acchieved since he has logged in.
 */
function updateScore() {
	var points = document.getElementById("points");
	if (points) {
		var myScore = points.innerHTML; 
		points.innerHTML = eval(myScore) + 1;
	}
}

function correctDisplay() {
	if (IE) {
		document.getElementById("channels").style.top = "0px";
		document.getElementById("ranking").style.top = "0px";
	} else {
		document.getElementById("channels").style.top = "2px";
		document.getElementById("ranking").style.top = "2px";
	}
}

/**
 *	Page initialization: Called as soon as page is loaded.
 */
function init() {
    // setup score board
    setupScoreBoard();
	// correct display for different browsers
	correctDisplay();
	// set heights
	refreshMinHeight();
	setQuizHeight(Math.max(minheight, (getBrowserHeight()/2) - 20));
	// loading bar
	updateLoadingBar();
	// prepare login
	document.getElementsByTagName('body')[0].setAttribute("scroll", "no");
	document.getElementById("txt").disabled = true;
	document.getElementById("txt").value = getString("participatelogin");
	document.getElementById("txt").setAttribute("autocomplete", "off");
	document.getElementById("bar").onmousedown = onResizeStart;
	document.getElementById("forum.frame").onload = onSmfReload;
    // init question voting
    if (SHOW_QUESTION_VOTE_STARS) {
        document.getElementById("question.vote").style.display = "";
        initStars();
    }
	// show info banner
	document.getElementById("banner.info").innerHTML = getString("bannerhigh");
    if (SHOW_BANNER_PROGRAM_INFO) document.getElementById("banner.info").style.display = "";
	// finalize Pushlets here because body element is not available before
	Pushlets.embed();	
	Pushlets.join();	
	Pushlets.DefaultDeserializer = Pushlets.JsonDefaultDeserializer;
}
