var xhrresult;

function xhrconnection(){
	if (window.XMLHttpRequest){
		return new XMLHttpRequest();
	}
	else if(window.ActiveXObject){
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
}

function xhrtransfer(mode,send,recv){
	var xhr = xhrconnection();
	xhr.open("GET",send,true);
	xhr.onreadystatechange = function(){
		if(xhr.readyState == 4){
			if(xhr.responseText == "forcedtakeover"){
				window.location.href = "index.php?page=3";
			}
			switch(mode){
				case(1): // reload the entire page
					if(xhr.responseText == 1) window.location.href = url;
					break;
				case(2): // refresh panels
					if(xhr.responseText == 1) refresh_panels();
					break;
				case(3): // refresh game
					if(xhr.responseText == 1) refresh_game();
					break;
				case(4): // simple one-element reload
					document.getElementById(recv).innerHTML = xhr.responseText;
					if(xhr.responseText == 1) refresh_panels();
					break;
				case(5): // XHR check
					document.getElementById("loginbuttons").style.display = "block";
					document.getElementById("loginbuttons").innerHTML = xhr.responseText;
					break;
				case(6): // Impressum
					if(document.getElementById("main") != null) document.getElementById("main").innerHTML = xhr.responseText;
					else if(document.getElementById("logright") != null) document.getElementById("logright").innerHTML = xhr.responseText;
					break;
				case(7): // Refresh panels
					xhrprocess(3,xhr.responseText,"<span id='chatstart'></span>","<span id='chatend'></span>","chat");
					xhrresult = xhrprocess(1,xhr.responseText,"<span id='activestart'></span>","<span id='activeend'></span>");
					if(xhrresult){
						if(xhrresult == 1) window.location.href = url;
					}
					else{
						xhrresult = xhrprocess(1,xhr.responseText,"<span id='challengestart'></span>","<span id='challengeend'></span>");
						if(xhrresult){
							document.getElementById("list_of_challenges").style.display = "block";
							document.getElementById("list_of_challenges").innerHTML = xhrresult;
						}
						else{
							document.getElementById("list_of_challenges").innerHTML = "";
							document.getElementById("list_of_challenges").style.display = "none";
						}
						xhrprocess(2,xhr.responseText,"<span id='userstart'></span>","<span id='userend'></span>","whoson");
						xhrprocess(2,xhr.responseText,"<span id='gamestart'></span>","<span id='gameend'></span>","main");
						xhrprocess(2,xhr.responseText,"<span id='advancedstart'></span>","<span id='advancedend'></span>","advanced");
						xhrprocess(2,xhr.responseText,"<span id='teamstart'></span>","<span id='teamend'></span>","teams");
						xhrprocess(2,xhr.responseText,"<span id='beginstart'></span>","<span id='beginend'></span>","begin");
					}
					break;
				case(8): // refresh game
					if(xhr.responseText == 2) window.location.href = url;
					else{
						xhrprocess(3,xhr.responseText,"<span id='chatstart'></span>","<span id='chatend'></span>","chat");
						xhrprocess(2,xhr.responseText,"<span id='typedetailstart'></span>","<span id='typedetailend'></span>","gamecontent");
						if(xhrprocess(2,xhr.responseText,"<span id='questionstart'></span>","<span id='questionend'></span>","gamecontent")){
							if(document.getElementById("solutioninput") != null && document.getElementById("markedinput").value == "") document.getElementById("solutioninput").focus();	
						}
						xhrprocess(2,xhr.responseText,"<span id='statstart'></span>","<span id='statend'></span>","gamecontent");
						xhrprocess(2,xhr.responseText,"<span id='infostart'></span>","<span id='infoend'></span>","gameinfo");
						xhrresult = xhrprocess(1,xhr.responseText,"<span id='resultstart'></span>","<span id='resultend'></span>");
						if(xhrresult){
							document.getElementById("game_timer").innerHTML = null;
							document.getElementById("result").innerHTML = xhrresult;
							xhrprocess(5,xhr.responseText);
							xhrprocess(7,xhr.responseText);
						}
						else if(xhrprocess(1,xhr.responseText,"<span id='answersstart'></span>","<span id='answersend'></span>")){
							xhrprocess(4,xhr.responseText);
							xhrprocess(6,xhr.responseText);
						}
						if(document.getElementById("solutioninput") == null) document.getElementById("markedinput").focus();
					}
					break;
			}
		}
	};
	xhr.send();
}

function xhrprocess(mode,response,start,end,target){
	switch(mode){
		case(1):
			var startpos = response.search(start);
			var endpos = response.search(end);
			if(startpos != -1 && startpos+start.length < endpos){
				return response.substring(startpos+start.length,endpos);
			}
			else return false;
			break;
		case(2):
			xhrresult = xhrprocess(1,response,start,end);
			if(xhrresult){
				document.getElementById(target).innerHTML = xhrresult;
				return true;
			}
			else return false;
			break;
		case(3):
			xhrresult = xhrprocess(1,response,start,end);
			if(xhrresult){
				if(xhrresult.search(lastchatid().substring(12)) == -1) document.getElementById(target).innerHTML = xhrresult + document.getElementById(target).innerHTML;
			}
			break;
		case(4):
		case(5):
			for(var i=0;i<6;i++){
				xhrresult = xhrprocess(1,response,"<span id='team"+i+"start'></span>","<span id='team"+i+"end'></span>");
				if(xhrresult){
					if(xhrresult == 1) document.getElementById("team"+i).className = "team_solved_bad";
					if(xhrresult == 2) document.getElementById("team"+i).className = "team_solved_good";
				}
				else if(mode == 5 && document.getElementById("team"+i) != null){
					document.getElementById("team"+i).className = "team_solved_bad";
				}
			}
			break;
		case(6):
		case(7):
			xhrresult = xhrprocess(1,response,"<span id='solostart'></span>","<span id='soloend'></span>");
			if(xhrresult){
				if(xhrresult == 1) document.getElementById("solo").className = "exercise_solved_bad";
				if(xhrresult == 2) document.getElementById("solo").className = "exercise_solved_good";
			}
			else if(mode == 7 && document.getElementById("solo") != null){
				document.getElementById("solo").className = "exercise_solved_bad";
			}
			break;
	}
}

function reload_main(page,id,num){
	switch(page){
		case("abort"):
			xhrtransfer(1,"index.php?mode=challenge&abort="+id);
			break;
		case("game_settings"):
			xhrtransfer(2,"index.php?mode=challenge&setting="+id);
			break;
		case("exercise"):
			xhrtransfer(2,"index.php?mode=startexercise");
			break;
		case("challenge_duel"):
			var type = 1;
		case("challenge_bidding"):
			if(type != 1) type = 2;
			xhrtransfer(2,"index.php?mode=startchallenge&type="+type);
			break;
		case("impressum"):
			xhrtransfer(6,"index.php?load=impressum");
			break;
		case("stat"):
			xhrtransfer(4,"index.php?load="+page+"&id="+id+"&res="+(screen.width),"main");
			break;
		case("ranking"):
			num = 0;
			id = "riddle";
		case("rankingtab"):
			xhrtransfer(4,"index.php?load=ranking&id="+id+"&num="+num,"main");
			break;
		case("types"):
		case("riddle_details"):
		case("quiz_details"):
		case("ranksjump"):
			xhrtransfer(4,"index.php?load="+page+"&id="+id,"main");
			break;
		default:
			xhrtransfer(4,"index.php?load="+page,"main");
			break;
	}
}

function switchtab(type,mode){
	switch(type){
		case(1): // ranking
			document.getElementById("tab_duel").style.display = (mode==3)?"block":"none";
			document.getElementById("tab_bidding").style.display = (mode==4)?"block":"none";
		case(2): // ranking & types
			document.getElementById("tab_riddle").style.display = (mode==1)?"block":"none";
			document.getElementById("tab_quiz").style.display = (mode==2)?"block":"none";
			break;
		case(3): // userdetails
			var users = document.getElementById("whoson").getElementsByTagName("div");
			for(var i=0;i<users.length;++i){
				if(users[i].id == "details"+mode){
					if(users[i].style.display == "block") users[i].style.display = "none";
					else users[i].style.display = "block";
					xhrtransfer(4,"index.php?mode=userdetails&uid="+mode,"details"+mode);
				}
				else if(users[i].id.search("details") != -1){
					users[i].style.display = "none";
				}
			}
			break;
		case(4): // changedata
			document.getElementById("tab_required").style.display = mode==1?"block":"none";
			document.getElementById("tab_personal").style.display = mode==2?"block":"none";
			document.getElementById("tab_interface").style.display = mode==3?"block":"none";
			break;
		case(5): // show question help
			if(document.getElementById(mode).style.display == "none") document.getElementById(mode).style.display = "block";
			else document.getElementById(mode).style.display = "none";
			break;
		case(6): // typedetails tab
			var types = document.getElementById("maintypes").getElementsByTagName("div");
			for(var i=0;i<types.length;++i){
				if(types[i].id == "subtype_"+mode){
					if(types[i].style.display == "block"){
						types[i].style.display = "none";
						document.getElementById("subject_"+mode).innerHTML = "&nbsp;+&nbsp;";
					}
					else{
						types[i].style.display = "block";
						document.getElementById("subject_"+mode).innerHTML = "&nbsp;-&nbsp;";
					}
				}
				else if(types[i].id.search("subtype_") != -1){
					types[i].style.display = "none";
				}
			}
	}
}

function lastchatid(){
	if(document.getElementById("chat").getElementsByTagName("div").length == 0) return "&lastchatid=msg" + ((new Date()).getTime() - 86400000);
	else return "&lastchatid="+document.getElementById("chat").getElementsByTagName("div")[0].id;
}

function selecteduser(){
	var users = document.getElementById("whoson").getElementsByTagName("div");
	for(var i=0;i<users.length;++i){
		if(users[i].id.search("details") != -1 && users[i].style.display == "block"){
			return "&selecteduser="+users[i].id;
		}
	}
	return "";
}

function refresh_panels(){
	if(document.getElementById("challenger")) xhrtransfer(7,"index.php?mode=refresh" + lastchatid() + selecteduser() + "&challenger=" + document.getElementById("challenger").innerHTML);
	else xhrtransfer(7,"index.php?mode=refresh" + lastchatid() + selecteduser());
}

function refresh_game(){
	xhrtransfer(8,"index.php?mode=game" + lastchatid());
}

function change_player_status(){
	xhrtransfer(2,"index.php?mode=changeplayerstatus&status="+document.getElementById("playerstatus").value);
}

function send_message(){
	if(document.getElementById("gamecontent") != null) xhrtransfer(3,"index.php?mode=sendmsg&message="+encodeURIComponent(document.getElementById("markedinput").value));
	else xhrtransfer(2,"index.php?mode=sendmsg&message="+encodeURIComponent(document.getElementById("markedinput").value));
	document.getElementById("markedinput").value = "";
}

function choose_team(gid,team){
	xhrtransfer(2,"index.php?mode=gamesettings&setting=choose_team&gid="+gid+"&value="+team);
}

function game_start(gid){
	xhrtransfer(1,"index.php?mode=gamesettings&setting=game_start&gid="+gid);
}

function set_gamesettings(setting,gid){
	if(setting.substring(0,3) == "set"){
		xhrtransfer(2,"index.php?mode=gamesettings&setting="+setting+"&gid="+gid+"&value="+document.getElementById(setting.substring(4)).value);
	}
	else{
		xhrtransfer(2,"index.php?mode=gamesettings&setting="+setting+"&gid="+gid);
	}
}

function details_understood(replacement){
	document.getElementById("understood").innerHTML = replacement;
	xhrtransfer(3,"index.php?mode=understood");
}

function submitsolution(){
	xhrtransfer(3,"index.php?mode=submitsolution&solution="+encodeURIComponent(document.getElementById("solutioninput").value));
	document.getElementById("solutioninput").value = "";
}

function quit_game(){
	xhrtransfer(1,"index.php?mode=quitgame");
}

function quit_challenge(){
	xhrtransfer(1,"index.php?mode=quitchallenge");
}

function challenge_player(gid,uid){
	xhrtransfer(2,"index.php?mode=challenge_player&gid=" + gid + "&uid=" + uid);
}

function challenge_player_abort(gid,uid){
	xhrtransfer(2,"index.php?mode=challenge_player_abort&gid=" + gid + "&uid=" + uid);
}

function challenge_response(chid,mode){
	xhrtransfer(2,"index.php?mode=challenge&chid="+chid+"&accept="+mode);
	reload_main("join_challenge");
}

