var player_turn = -1; var flashing = new Array(); var processingEvent = false; var status_update = 0; var logoclicks = 0; var lastlogoclick = 0; var requests = new Array(); function newHttpRequest(url, callback, retrytime,rclass,obsolescent) { if(rclass) { for(var n=0; n0) requests[0].sendHttpRequest(); } else ok = false; if(!ok) { var date = new Date(); if((!retrytime || retrytime==0 || date.getTime()0 && requests[0].obsolete==true) requests.splice(0,1); if(requests.length>0) requests[0].sendHttpRequest(); } } } } } function set_cookie( name, value ) { document.cookie = name + "=" +escape( value ); } function get_cookie( name ) { var start = document.cookie.indexOf( name + "=" ); var len = start + name.length + 1; if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) { return null; } if ( start == -1 ) return null; var end = document.cookie.indexOf( ";", len ); if ( end == -1 ) end = document.cookie.length; return unescape( document.cookie.substring( len, end ) ); } function delete_cookie( name ) { if ( get_cookie( name ) ) document.cookie = name + "=" + ";expires=Thu, 01-Jan-1970 00:00:01 GMT"; } var name_entry_fields = 2; function showUsersDone() { var show = false; for(var i=1; i<=name_entry_fields; i++) { if(document.getElementById("name"+i).value != "") { show = true; break; } } if(show) unhide("usersdone"); else hide("usersdone"); } function unhide(s) { document.getElementById(s).style.position = 'relative'; document.getElementById(s).style.visibility = 'visible'; } function hide(s) { document.getElementById(s).style.position = 'absolute'; document.getElementById(s).style.visibility = 'hidden'; } function addPlayer(p) { if(p>name_entry_fields && document.getElementById("name"+(p-1)).value != "") { var tr = document.createElement("tr"); var td1 = document.createElement("td"); var x = document.createTextNode("Player "+p+":"); td1.appendChild(x); tr.appendChild(td1); var td2 = document.createElement("td"); var input = document.createElement("input"); input.setAttribute("type","text"); input.setAttribute("size","20"); input.setAttribute("id","name"+p); input.setAttribute("name","name"+p); if(p<10) input.setAttribute("onkeyup","showUsersDone(); addPlayer("+(p+1)+");"); td2.appendChild(input); tr.appendChild(td2); document.getElementById('name_entry').appendChild(tr); name_entry_fields = p; } } function login() { if(status==0) { prev_status = status; status = 1; game_categories[0] = ""; var x = ""; for(var i=1; i<=name_entry_fields; i++) { if(document.getElementById("name"+i).value != "") { var s = document.getElementById("name"+i).value; users[users.length] = new User(s); s= escape(s); x += "((split))"+s; } } status_update++; newHttpRequest(getFolder()+"/action.php?action=login&"+status_update+"&"+pcid+","+x,timerUpdate); var greeting = ""; for(i=0; iDetails"; } else { document.getElementById("cat"+checkingCategory+"status").innerHTML = "Failed!"; if(categoryFailed==0) categoryFailed = checkingCategory; } if(checkingCategory<6) checkCategory(checkingCategory+1); else { unhide("cancelgame"); if(categoryFailed != 0 ) { for(var i=1; i<=6; i++) document.getElementById("cat"+i).disabled = false; document.getElementById("catstatus").innerHTML = "Some of the categories you entered can't be found. Change those marked as failed and try again."; document.getElementById('cat'+categoryFailed).focus(); document.getElementById('cat'+categoryFailed).select(); } else { for(var i=1; i<=6; i++) game_categories[i-1] = document.getElementById("cat"+i).value; resetBoard(); // reset game settings processingEvent = false; flashing.length = 0; player_turn = -1; q_question = ""; awaitingQuestion = false; awaitingSteal = false; players.length = 0; events.length = 0; document.getElementById("catstatus").innerHTML = "All of those categories are okay. You can change them if you want to or continue to the next step."; unhide("changecategories"); unhide("setupgameoptions"); } } } function changeCategories() { for(var i=1; i<=6; i++) { document.getElementById("cat"+i).disabled = false; document.getElementById("cat"+i+"status").innerHTML = ""; } document.getElementById("catstatus").innerHTML = ""; hide("changecategories"); hide("setupgameoptions"); unhide("categoriesdone"); document.getElementById('cat1').focus(); document.getElementById('cat1').select(); } function setupGameOptions() { updateCategoryDetails(0); hideAll(); setVisibility('gameoptions','visible'); } function categoryDetails(i,color) { if(document.getElementById("category_list")!==null) document.getElementById('categorydetailscheckboxes').removeChild(document.getElementById("category_list")); document.getElementById("categorydetails_categoryname").innerHTML = document.getElementById('cat'+i).value; popup("categorydetails",1,color); document.getElementById('categorydetailscheckboxes').innerHTML = "Building list..."; catnum_edit = 0; newHttpRequest(getFolder()+"/getsubcategories.php?gameid="+gameid+"&catnum="+i,editCategory); } var subcats_edit; var subcats_edit_id = new Array(); var catnum_edit; function editCategory(responseText) { document.getElementById('categorydetailscheckboxes').innerHTML = ""; subcats_edit = 0; response = responseText.split("\r\n"); catnum_edit = response[0]; var catid = response[1]; var catname = response[2]; subcats_list = document.createElement("ul"); subcats_list.setAttribute("id","category_list"); for(var i=3; i0) { unhide("revealLetter"); document.getElementById("revealLetter").innerHTML = "Reveal a letter ("+players[n].busts+")"; } else hide("revealLetter"); hide("questionClose"); } popup("questionbox",1,colours[q_cat-1]); if(!viewOnly) document.getElementById('questionbox_answer').focus(); } else { if(q_question!="***") { var n = findPlayer(player_turn); infoBox("No questions available. "+players[n].name+" gets a free go.",colours[q_cat-1],-1); if(findUser(player_turn)!=-1) newHttpRequest(getFolder()+"/action.php?action=event&event=roll&pcid="+pcid+"&userid="+player_turn,timerUpdate); setTimeout("hideInfoBox()", 2000); } } } function stripSpaces(s) { var i=0; while(i0 && s.charAt(j)==' ') { j--; } return s.substring(i,j+1); } function questionClose() { popup("questionbox",0); } var awaitingSteal = false; function stealGem(responseText) { if(responseText) { response = responseText.split("\r\n"); var table = ""; var i=0; var j, uid, labl; while(i"; i++; uid = response[i]; i++; while(i
'+labl+'
'; i++; } table += ""; } i++; } table += "
"; var n = findPlayer(player_turn); document.getElementById("stealgem").innerHTML = players[n].name + " can steal a gem! Click on the gem you want to steal.
"+table+"
"; if(awaitingSteal==true) { awaitingSteal = false; popup("stealgem",1); } } } function stealingGem(user,cat) { popup("stealgem",0); newHttpRequest(getFolder()+"/action.php?action=event&event=steal&pcid="+pcid+"&userid="+player_turn+"&stealfrom="+user+"&cat="+cat+"&time="+getTime(),timerUpdate); } function questionOK() { var givenAnswer = stripSpaces(document.getElementById("questionbox_answer").value.toLowerCase()); // if(givenAnswer==".") givenAnswer = q_answer; // sg var correct = (givenAnswer == q_answer)?1:0; // cs = 0; // Even if the checksum hasn't changed we need to process it, so the next go begins if it's the same player awaitingSteal = false; document.getElementById("stealgem").innerHTML = ""; newHttpRequest(getFolder()+"/action.php?action=event&event=answer&pcid="+pcid+"&userid="+player_turn+"&time="+getTime()+"&correct="+correct+"&answer="+givenAnswer+"&hub="+(board[players[findPlayer(player_turn)].position].cat<0?1:0)+"&cat="+q_cat,correct?stealGem:timerUpdate); processingEvent = true; popup("questionbox",0); if(correct) { infoBox(q_answer+" is the right answer!",colours[q_cat-1],-1); setTimeout("hideInfoBox(2)", 2000); } else { infoBox("Wrong. The correct answer is "+q_answer+".",colours[q_cat-1],-1); player_turn = -1; setTimeout("hideInfoBox(1)", 2000); } } function getQuestion(responseText) { response = responseText.split("\r\n"); if(q_question=="" && (q_cat==7 || q_cat==response[0]) && response[1]!="*") { if(response.length>7) { q_id = -1; q_question = "**"; } else if(response[1]=="***") { q_id = -1; q_question = "***"; } else if(response[1]=="**") { q_id = -1; q_question = "**"; } else { q_cat = response[0]; q_page = response[1]; q_id = response[2]; q_answer = response[3]; q_anspos = response[4]; q_question = response[4]; q_anspos = q_question.length; q_question += response[5]; } if(awaitingQuestion==true) { awaitingQuestion = false; askQuestion(1); } } } function answerEntry(e) { var c; if(e && e.which) c = e.which; else c = event.keyCode; if(c == 13) { questionOK(); return false; } else if( (c>=97 && c<=122) || (c>=65 && c<=90) || (c>=48 && c<=57) || c==8 ) { return true; } else { return false; } } function movePiece(path,to,alreadyLogged) { processingEvent = true; setTimeout("movePieceStep('"+path+"',"+getTime()+")", 100); awaitingQuestion = false; var n = findPlayer(player_turn); players[n].position = to; q_question = ""; q_cat = Math.abs(board[to].cat); if(!alreadyLogged) { newHttpRequest(getFolder()+"/action.php?action=event&event=move&gameid="+gameid+"&pcid="+pcid+"&userid="+player_turn+"&time="+getTime()+"&position="+to+"&path="+path+"&cat="+Math.abs(board[to].cat),board[to].cat==0?0:getQuestion); } if(findUser(player_turn)!=-1) { if(q_cat==0) newHttpRequest(getFolder()+"/action.php?action=event&event=roll&pcid="+pcid+"&userid="+player_turn,timerUpdate); else { newHttpRequest(getFolder()+"/action.php?action=event&event=expandcat&gameid="+gameid+"&pcid="+pcid+"&cat="+Math.abs(board[to].cat),getQuestion); } } for(var i=0; i=1000) { path = path.substring(2); if(path.length<4) { var at = path.substring(0,2); if(at.charAt(0)=='0') at = at.substring(1,2); positionPiece(player_turn,at); processingEvent = false; flash(1); flashing.length = 0; for(var n=0; n") { if(pc) sidebar_text += ""; if(game) { if(game_id==gameid && status!=-1) { sidebar_text += "Quit game"; } sidebar_text += ""; } pc = false; game = true; game_id = response[i].substring(1); col = colours[game_id%6]; sidebar_text += ""; if(game) { if(game_id==gameid && status!=-1) { sidebar_text += "Quit game"; } sidebar_text += ""; } pc = false; game = false; } else if(response[i].substring(0,1)==".") { if(pc) sidebar_text += ""; pc = true; pc_id = unescape(response[i].substring(1)); sidebar_text += ""; pc_colour = (pc_colour+1)%2; if(!game && (status==3||status==4) && game_owner) sidebar_text += ""; } else sidebar_text += ""; } } if(pc) sidebar_text += ""; if(game) { if(game_id==gameid && status!=-1) { sidebar_text += "Quit game"; } sidebar_text += ""; } document.getElementById('sidebar_inner').innerHTML = sidebar_text; } if(i0 && processingEvent == false) { processEvent(); } } function userStats(uid) { newHttpRequest(getFolder()+"/action.php?action=userstats&gameid="+gameid+"&userid="+uid,showUserStats); var n = findPlayer(uid); infoBox("Finding statistics for "+players[n].name+"...",colours[players[n].piece_color-1]); } function showUserStats(responseText) { if(document.getElementById("infobox_text").innerHTML.substring(0,22)!="Finding statistics for") return; response = responseText.split("\r\n"); if(responseText==0 ||response.length != 15 ) { if(document.getElementById("infobox_text").innerHTML.substring(0,22)=="Finding statistics for") hideInfoBox(); return; } var uid = response[0]; var s = "
Statistics for "+response[1]+"
"; var total_asked=0; var total_correct=0; s += ""; var high=0; var asked; for(var i=0; i<6; i++) { if(response[i*2+2]>high) high = parseInt(response[i*2+2]); total_asked+=parseInt(response[i*2+2]); total_correct+=parseInt(response[i*2+3]); } for(var i=0; i<6; i++) { s += ""; } s += ""; var n = findPlayer(uid); infoBox(s,colours[players[n].piece_color-1]); } function showGameSettings(game_id,start_busts,board_busts,always_gems,steal_gems,collect_gems,return_to_centre,final_question,col) { var s = "

GAME "+(game_id%99+1)+"


"; if(always_gems) s += "Players can win gems on any tile.

"; else s += "Players can only win gems at junctions.

"; if(steal_gems) s += "Players can steal opponents' gems.

"; else s += "Players can't steal opponents' gems.

"; s += "The aim of the game is to collect "; if(collect_gems==6) s += "all 6"; else s += collect_gems; if(collect_gems==1) s+= " gem"; else s += " gems"; if( return_to_centre && final_question) s += ", return to the centre, and answer a final question"; else if( return_to_centre ) s += " and return to the centre"; s += ".

"; s += "Players have "+start_busts; if(start_busts==1) s += " bust"; else s += " busts"; s += " at the start of the game, and there "; if(board_busts == 1 ) s += "is 1 bust"; else s += "are "+board_busts+" busts" s += " on the board."; infoBox(s,colours[col]); } function drawPlayer(userid) { var n = findPlayer(userid); var piece = document.createElement("img"); piece.setAttribute("src",graphics+"/pieces/"+players[n].piece); piece.setAttribute("id","piece"+userid); piece.setAttribute("class","piece"); piece.setAttribute("className","piece"); piece.setAttribute("width",Math.floor(33*tileRatioX)); piece.setAttribute("height",Math.floor(36*tileRatioY)); piece.style.left = ((board[players[n].position].col-1)*tileColWid)+Math.floor(28*tileRatioX); var y = (board[players[n].position].row-1)*tileRowHei; if((board[players[n].position].col%2)==1) y+=tileRowHeiHalf; piece.style.top = y+Math.floor(13*tileRatioY); document.getElementById("board").appendChild(piece); } function positionPiece(userid, pos) { var n = findPlayer(userid); players[n].position = pos; piece = document.getElementById("piece"+userid); piece.style.left = ((board[players[n].position].col-1)*tileColWid)+Math.floor(28*tileRatioX); var y = (board[players[n].position].row-1)*tileRowHei; if((board[players[n].position].col%2)==1) y+=tileRowHeiHalf; piece.style.top = y+Math.floor(13*tileRatioY); } function hideInfoBox(n) { popup("infobox",0); document.getElementById("infoboxOK").style.visibility = "visible"; document.getElementById("infoboxOK").style.position = "relative"; if(n==1) { processingEvent = false; processEvent(); } if(n==2) { if(document.getElementById("stealgem").innerHTML != "") popup("stealgem",1); else awaitingSteal = true; processingEvent = false; processEvent(); } } function playerTurn(die) { var n = findPlayer(player_turn); infoBox(players[n].name + " rolled a "+die,colours[players[n].piece_color-1],-1); setTimeout("hideInfoBox(1)", 2000); var at = players[n].position; flashing.length = 0; follow(at,-1,die,""); } function onClickMovePiece(e,path,to) { e.path = path; e.to = to; e.onclick = function(){movePiece(e.path,e.to);}; } function follow(at,from,die,path) { if(at<10) path+="0"; path += at.toString(); if(die==0) { flashing[flashing.length] = at; if(findUser(player_turn)!=-1) { var tile = document.getElementById("tile"+at); onClickMovePiece(tile,path,at); //tile.setAttribute("onclick","movePiece('"+path+"',1,"+at+");"); var gem = document.getElementById("gem"+at); onClickMovePiece(gem,path,at); //gem.setAttribute("onclick","movePiece('"+path+"',1,"+at+");"); var gem_label = document.getElementById("gem_label"+at); if(gem_label) { onClickMovePiece(gem_label,path,at); //gem_label.setAttribute("onclick","movePiece('"+path+"',1,"+at+");"); } for(var i=0; i0) { document.getElementById("joinrequest_text").innerHTML = join_request_users[0]+" would like to join your game. Allow?"; document.getElementById("joinrequest_allow").innerHTML = ""; document.getElementById("joinrequest_disallow").innerHTML = ""; join_request_pcid.splice(0,1); join_request_users.splice(0,1); popup("joinrequest",1); } } function allowToJoin(pc_id,allow) { if(allow==-2) { allow_join_requests = 0; join_request_pcid.splice(0,join_request_pcid.length); join_request_users.splice(0,join_request_users.length); } newHttpRequest(getFolder()+"/action.php?action=allowtojoin&pc_id="+pc_id+"&game_id="+gameid+"&allow="+allow); popup("joinrequest",0); joinRequest(); } function requestToJoin(game_id) { newHttpRequest(getFolder()+"/action.php?action=requesttojoin&pcid="+pcid+"&game_id="+game_id); document.getElementById('request'+game_id).innerHTML = ""; } function watchGame(game_id) { status_update++; newHttpRequest(getFolder()+"/action.php?action=watch&su="+status_update+"&pcid="+pcid+"&game_id="+game_id,0,0,"watch",true); document.getElementById('watch'+game_id).innerHTML = ""; } function invitation() { if(invite_gameid.length>0) { var invite_text = invite_users[0]; if(invite_users[0].search(" and ")==-1) invite_text += " has"; else invite_text += " have"; invite_text += " invited you to join a game. The categories are "+invite_cats[0]+". Accept?"; document.getElementById("invite_text").innerHTML = invite_text; document.getElementById("invite_accept").innerHTML = ""; document.getElementById("invite_decline").innerHTML = ""; invite_gameid.splice(0,1); invite_users.splice(0,1); invite_cats.splice(0,1); popup("invite",1); } } function acceptInvite(game_id,accept) { if(accept==1) { invite_gameid.splice(0,invite_gameid.length); invite_users.splice(0,invite_users.length); invite_cats.splice(0,invite_cats.length); gameid = game_id; } status_update++; newHttpRequest(getFolder()+"/action.php?action=acceptinvite&su="+status_update+"&pc_id="+pcid+"&game_id="+game_id+"&accept="+accept,0,0,"acceptinvite",true); popup("invite",0); invitation(); } function invite(pc_id) { newHttpRequest(getFolder()+"/action.php?action=invite&pc_id="+pc_id+"&gameid="+gameid); document.getElementById('invite'+pc_id).innerHTML = ""; } function setup() { var i; if(users.length>0) { var greeting = ""; for(i=0; i=4 || status==-1) { resetBoard(); setVisibility('gameboard','visible'); for(i=0; i=0 && status<=3) { events.length=0; } if(events.length==0) return; var event = events[0]; var eventDelay = 0; if(events.length>1) { eventDelay = events[1].time - events[0].time; if(events[0].pcid != events[1].pcid || events[0].pcid == pcid ) eventDelay = 0; if(eventDelay>5000) eventDelay = 5000; events.shift(); } else events.length = 0; var triggerNextEvent = true; player_turn = event.userid; if(findPlayer(player_turn)!=-1) // if their piece can't be found, they must have quit the game { if(event.event=="newbust") { var id = event.var1; var pos = event.var2; if(document.getElementById("bust"+id)) { for(var i=0; i0 && triggerNextEvent) { if(eventDelay<=0) processEvent(); else setTimeout("processEvent()", eventDelay); } } function addRemoveUsers() { var str = "
"+game_categories[i]+""; if(response[i*2+2]>0) { s += ""; asked = response[i*2+2]; if(response[i*2+3]>0) { s += ""; asked -= response[i*2+3]; } if(response[i*2+2]>response[i*2+3]) { s += ""; } s += "
"+response[i*2+3]; if(response[i*2+3]==response[i*2+2]) s += "/"+response[i*2+2]; s += ""; if(response[i*2+3]==0) s += "0/"; s += response[i*2+2]+"
"; } else s += "0/0"; s += "
Total"; if(total_asked>0) { s += ""; asked = total_asked; if(total_correct>0) { s += ""; asked -= total_correct; } if(total_asked>total_correct) { s += ""; } s += "
"+total_correct; if(total_correct==total_asked) s += "/"+total_asked; s += ""; if(total_correct==0) s += "0/"; s += total_asked+"
"; } else s += "0/0"; s += "
"; for(var i=0; i"; } str += "
Remove
"; document.getElementById("addremoveusers_currentusers").innerHTML = str; popup("addremoveusers",1); document.getElementById("adduser").focus(); } function yesnopopup(text,yesjs,nojs) { document.getElementById("yesno_text").innerHTML = text; document.getElementById("yesno_yes").innerHTML = ""; document.getElementById("yesno_no").innerHTML = ""; popup("yesno",1); } function removeUser(i) { var remaining_users = 0; for(var j=0; j