<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="VideoChat test" height="100px">
  <Require feature="wave-preview" />
  <Require feature="opensocial-0.8" />
  <Require feature="dynamic-height"/>
  <Require feature="flash"/>
  <Require feature="minimessage"/>
  <Preload href="http://www.google.com/jsapi" />
</ModulePrefs>
<Content type="html">
<![CDATA[
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-7230422-3");
pageTracker._trackPageview();
} catch(err) {}
function track(url){
  try{ pageTracker._trackPageview(url); } catch(e){}
}
</script>
<script src="http://www.google.com/jsapi"></script>
<div id="content_div" style="height: 100%;overflow:auto;"><div id="flash_content" style="height: 100%;">Loading Video Chat Experience ...</div></div>
<iframe width="100%" height="20px" frameborder=0 marginheight="0px" marginwidth="0px"  src="http://www.6rounds.com/xml/info.html"></iframe>
<script type="text/javascript">
<!--
    function normalizeUrl(url){
	split = url.split("//")
	if (split.length>2)
		return split[0]+"//"+split[2];
	return url;
    }
    function arr(){
      this.length = function(){
	var count=0;
	for(var n in this){
	  if (n!="length") count++;
	}
	return count;
      }
    }
    function getTimestamp(){
      return Math.random() * ( new Date().valueOf() );
    }
    //document.domain = "wave.google.com";
    // WaveWidget.swf
    var m_content = document.getElementById('content_div');
    var m_flash_content = document.getElementById('flash_content');
    var m_timestamps = new arr();
    var m_host = null;
    var m_viewer = null;
    var m_roomid = '0';
    var m_room_id_requested=false;
    var m_mode = "idle";
    var m_session_in_table = null;
    var m_lobby_initialized = false;
    var MINIMAL_TABLES_COUNT=3;

    var m_lobby_inserted = false;
    var m_videopage_inserted = false;
    var m_mode = "LOBBY";

    var isResponsible = false;

    var m_videopage_params = null;

    var ping_timerid = 0;
    var first_ping_processed = false;
    var m_usersToRemove = 0;

    var m_sentCommands = {};

    google.load("jquery", "1.3.2", {uncompressed:false});


    function log(message, obj){
      try{
	  if (""+obj == "undefined"){
	    console.log(message);
	  }
	  else {
	    console.log(message, obj);
	  }
      }catch(e){}
    }

    function sayOk(functionName){
      try{
      var flashbj = document.getElementById('lobbyid');
      if (flashbj) {document.getElementById('lobbyid').callReceived(functionName ); }
      else { alert("sayOk: NO LOBBY HERE"); }
      }catch(e){ alert("Failed in sayOk for "+functionName+"+"+e); }
    }

    function publishSnapshot(url,caption){
      log("publishSnapshot:",url,caption);
      var state = wave.getState();
      if (state){
	var snapCount=0;
	var snapCountStr = state.get("SNAPS_COUNT", "");
	if (snapCountStr=="") snapCount = 0;
	else snapCount = parseInt(snapCountStr);

	var snapName = "SNAP_"+snapCount;
	snapValue = {url: url, caption: caption};

	var new_fields={};
	new_fields[snapName] = gadgets.json.stringify({'value': gadgets.json.stringify(snapValue), 'timestamp': getTimestamp() });
	new_fields["SNAPS_COUNT"] = ""+(snapCount+1);
	state.submitDelta(new_fields);
      }
      sayOk("publishSnapshot");
    }

    function showMessage(message){
      var msg = new gadgets.MiniMessage(__MODULE_ID__);
      var messageObj = document.createElement("div");
      messageObj.setAttribute("style","padding:0;margin:0;background-color:white; color:red; font-size:1.2em;border:2px solid red;");
      messageObj.innerHTML="<center>"+message+"</center>";
      msg.createTimerMessage(messageObj,5);
    }

    function makePerson(personData){
      try{
      return {"ID": personData.id_, "DisplayName":personData.displayName_, "ThumbnailUrl": normalizeUrl(personData.getThumbnailUrl())}
      }catch(e) {alert("makePerson error:"+e);}
    }

    function userLeaveSeats(this_tablenum, id){
      var state = wave.getState();
      if (state){
	var tablesCountStr = state.get("TABLES_COUNT", "");
	  var tablesCount = gadgets.json.parse(tablesCountStr).value;
	  for(var tablenum=0;tablenum<tablesCount;tablenum++){
	    if (tablenum==this_tablenum) continue;
	    var tableid = "TABLE_"+tablenum;
	    var tableInfoStr = state.get(tableid, "");
	    if (tableInfoStr!=""){
	      var table_info = gadgets.json.parse(gadgets.json.parse(tableInfoStr).value);
	      for(var seat=1;seat<=2;seat++){
		if (""+table_info["User"+seat]!="undefined"){
		  var user = gadgets.json.parse(table_info["User"+seat]);
		  if (user.ID == id ){
		    leaveSeatIn(tableid,seat,true);
		    log("user leaving "+tableid+"/"+seat);
		  }
		}
	      }
	    }
	  }
	}
    }

    function titleUpdate(new_title){
    try{
      var state = wave.getState();
      if (state){
	var new_fields = {}
	new_fields["TITLE"] = gadgets.json.stringify({'value': gadgets.json.stringify({"Title": new_title, "Updater": gadgets.json.stringify(makePerson(m_viewer))}), 'timestamp': getTimestamp() });
	state.submitDelta(new_fields);
      }
      sayOk("titleUpdate");
    }catch(e){ alert("titleUpdate error:"+e); }
    }

    function takeSeat(tableid, the_seat){
      try{
      var this_tablenum = parseInt(tableid.split("_")[1]);

      userLeaveSeats(this_tablenum, m_viewer.getId());

      sendRequest("/API/wave/add_"+m_roomid+"/"+this_tablenum+"/"+the_seat, onTakeSeat);
      sayOk("takeSeat");
      track("/wave/takeSeat/"+m_roomid+"?tableid="+this_tablenum+"&seat="+the_seat );
      }catch(e){ alert("takeSeat error:"+e); };
    }
    function getSessionData(table_key){
      var tablenum = parseInt(table_key.split("_")[1]);
      sendRequest("/API/wave/get_tableinfo/"+m_roomid+"/"+tablenum, onSessionData);
    }

    function onTakeSeat(data){
      var tablenum = data.tablenum;
      var seat = data.seat;
      var err = data.err;
      var errmsg = data.errmsg;
      //alert('err:'+err+", errmsg:"+errmsg);
      if (err=="1") {

	// Change the message's background color to red
	showMessage(errmsg);

	return;
      }
      track("/wave/tookSeat/"+m_roomid+"?tableid="+tablenum+"&seat="+seat );
      var state = wave.getState();
      if (state){
	var tableid = "TABLE_"+tablenum;
	var tableInfoStr = state.get(tableid, "(no_table)");
	if (tableInfoStr!="(no_table)"){
	  var table_info = gadgets.json.parse(gadgets.json.parse(tableInfoStr).value);
	  if (""+table_info["User"+seat]=="undefined"){

	    table_info["User"+seat] = gadgets.json.stringify(makePerson(wave.getParticipantById(m_viewer.getId())));
	    if (table_info.Status != "wait") table_info.Status="wait";
	    var new_fields = {}
	    var timestamp = getTimestamp();
	    new_fields["TABLE_"+tablenum] = gadgets.json.stringify({'value':gadgets.json.stringify(table_info),
	    	      'timestamp': timestamp });

	    //log("taking seat at "+tablenum+"/"+seat+" time:", timestamp);
	    //check if we have enough available tables;
	    new_fields = checkTables(new_fields);

	    state.submitDelta(new_fields);
	    log("user take seat "+tablenum+"/"+seat);

	    setTimeout("userLeaveSeats('"+tablenum+"', '"+m_viewer.getId()+"');" , 1500);

	  }else{showMessage("seat "+seat+" is taken");}
	}
	else{alert("no tableInfoStr("+tableInfoStr+")" );}
      }
    }

    function onSessionData(data){
    try{
      if (data.err=="1"){
	if (m_session_in_table == null) m_session_in_table = "TABLE_"+data.tablenum;
	page.close();
	return;
      }
      var state = wave.getState();
      if (state){
	var params = data.flashvars;

	var tablenum = data.tablenum;
	var tableInfoStr = state.get("TABLE_"+tablenum, '');

	var m_opponent = null;
	if (tableInfoStr){
	  var table_info = gadgets.json.parse(gadgets.json.parse(tableInfoStr).value);
	  var user1 = gadgets.json.parse(table_info.User1);
	  var user2 = gadgets.json.parse(table_info.User2);
	  if (user1.ID == m_viewer.getId() )
	      m_opponent = user2;
	    else
	      m_opponent = user1;

	  //for(var kk in m_opponent){
	  //  alert("m_opponent: "+kk+":"+m_opponent[kk]);
	  //}
	}
	else {
	  alert("No table data for "+tablenum+" can be found");
	  return;
	}
	var uobj = wave.getParticipantById(m_opponent.ID);
	var oppUrl = normalizeUrl(m_opponent.ThumbnailUrl);
	if (""+uobj != "undefined") oppUrl=normalizeUrl(uobj.getThumbnailUrl());

	var myData = escape([m_viewer.displayName_,"0","",normalizeUrl(m_viewer.thumbnailUrl_)].join("|") );
	var opponentData = escape([m_opponent.DisplayName,"0","",oppUrl,"1"].join("|"));
	//alert("myData:"+myData);
	//alert("opponentData:"+opponentData);
	params = params.replace("MY_DATA", myData);
	params = params.replace("OP_DATA", opponentData);
	//params = escape(params);
	//alert("flashvars:"+params);

	//setTimeout("startVideo('TABLE_"+tablenum+"', '"+params+"');",4000);
	gadgets.window.adjustHeight(500);

	track("/wave/gotovideo/"+m_roomid+"?tableid="+tablenum );
	gadgets.flash.embedFlash("http://st.6rounds.com/4.03/swf/video/videopage_wave.43.swf", "flash_content", 10.0, {id: "videoid",allowScriptAccess:"always", flashvars:params, type:"application/x-shockwave-flash"});
	m_videopage_inserted = true;

	m_videopage_params = params;
      }
    }catch(e){ alert("onSessionData error:"+e); }
    }

    function leaveSeat(tableid, seat,force){
      leaveSeatIn(tableid, seat,force);
      sayOk("leaveSeat");
      var tablenum = parseInt(tableid.split("_")[1]);
      track("/wave/leaveSeat/"+m_roomid+"?tableid="+tablenum+"&seat="+seat );
    }

    function leaveSeatIn(tableid, seat,force){
      var tablenum = parseInt(tableid.split("_")[1]);
      if (force==true)
	sendRequest("/API/wave/del_"+m_roomid+"/"+tablenum+"/"+seat+"?force=1", onLeaveSeat);
      else
	sendRequest("/API/wave/del_"+m_roomid+"/"+tablenum+"/"+seat, onLeaveSeat);
    }

    function onLeaveSeat(data){
      var tablenum = data.tablenum;
      var seat = data.seat;
      var err = data.err;
      var errmsg = data.errmsg;
      var force = data.force;
      
      if (!first_ping_processed && m_usersToRemove>0){
        m_usersToRemove--;
        if (m_usersToRemove==0) {
    	    first_ping_processed = true;
    	    stateUpdated();
    	}
      }
        
      //alert('err:'+err+", errmsg:"+errmsg);
      if (err=="1") {
	if (!force){
	    showMessage(errmsg);
	    return;
	  }
      }
      else if (err=="2") {
	//alert(errmsg);
	if (m_session_in_table!=null) page.close();

      }

      track("/wave/leftSeat/"+m_roomid+"?tableid="+tablenum+"&seat="+seat );

      var state = wave.getState();
      if (state){
	var tableid = "TABLE_"+tablenum;
	var tableInfoStr = state.get(tableid, "(no_table)");
	if (tableInfoStr!="(no_table)"){
	  var table_info = gadgets.json.parse(gadgets.json.parse(tableInfoStr).value);
	  if (""+table_info["User"+seat]!="undefined"){
	    delete table_info["User"+seat];
	    if (""+table_info["User1"]=="undefined" && ""+table_info["User2"]=="undefined"){
	      table_info.Status = "empty";
	    }
	    var new_fields = {}
	    new_fields["TABLE_"+tablenum] = gadgets.json.stringify({'value':gadgets.json.stringify(table_info),
	    	      'timestamp': getTimestamp() });

	    new_fields = checkTables(new_fields);

	    state.submitDelta(new_fields);
	  }// no one at seat - NP. else{alert("seat "+seat+" is taken");}
	}
	else{alert("no tableInfoStr("+tableInfoStr+")" );}
      }
    }


    function InitSessionStart(table_key){
    try{
      var state = wave.getState();
      if (state){
	//alert("table_key:"+table_key);
	var tableInfoStr = state.get(table_key, '');
	//alert("tableInfoStr:"+tableInfoStr);
	if (tableInfoStr){
	  var table_info = gadgets.json.parse(gadgets.json.parse(tableInfoStr).value);


	  var table_status = table_info.Status;
	  //alert("current_status:"+table_status);

	  if (table_info.Status != "insession") {
	    table_info.Status="insession";
	    var new_fields = {}
	    new_fields[table_key] = gadgets.json.stringify({'value':gadgets.json.stringify(table_info),
		      'timestamp': getTimestamp() });
	    state.submitDelta(new_fields);
	  }

	}else{ alert("InitSessionStart - no table info"); }
      }else{ alert("InitSessionStart - no state"); }
    }catch(e){ alert("InitSessionStart error:"+e); }
    }


    function sendRequest(uri, callback,force){
      var b = wave.state_.get("${playback}"), c = wave.state_.get("${edit}");
      log("playback",b); log("edit",c);
      log("mode:",wave.getMode() );
      var playback = wave.isPlayback();
      log("isPlayback",playback);
      playback = false; // FORCE 
      
      //var playback = wave.state_.get("${playback}")=="1";
       log("isPlayback",playback);
       log("force",force);
      if (force==true || !playback ){
      var params = "wave_user_id="+m_viewer.getId()+"&wave_widget_id="+m_roomid+"&wave_user_name="+m_viewer.getDisplayName() + "&jsoncallback=?";
      try{
	  if (uri.indexOf("?")<0) uri+="?"; else uri+="&";
	  $.getJSON("http://www.6rounds.com"+uri+ params,  callback);
	  log("request sent","http://www.6rounds.com"+uri+params);
      }catch(e){ alert("make request:"+e); }
      }else{ log("playback: ignore request",uri);}
    }
    
    
    function sendPing(uri, callback, force){
      var playback = wave.state_.get("${playback}")=="1";
      if (force==true || !playback ){
      var params = "wave_user_id="+m_viewer.getId()+"&wave_widget_id="+m_roomid+"&wave_user_name="+m_viewer.getDisplayName() + "&jsoncallback=?";
      try{
	  if (uri.indexOf("?")<0) uri+="?"; else uri+="&";
	  $.getJSON("http://tn.6rounds.com"+uri+ params,  callback);
      }catch(e){ alert("make request:"+e); }
      }
    }

    function updateRoomID(data){
      try{
	//data = gadgets.json.parse(data.text);
	window.wave.getState().submitDelta( {"roomid":data["roomid"]});
      }catch(e){alert("updateRoomID error:"+e); }
    }

    function checkFlashLoaded(flashid){
      try{
	var flash = document.getElementById(flashid);
	if (flash && flash.statusUpdate){
	  return true;
	}
	return false;
      }catch(e){
	alert(e);
	return false;
      }
    }

    function initTables(){
    try{

	// check if there are tables in the room - if not create some;
	if (!checkFlashLoaded("lobbyid") ){
	  setTimeout("initTables();", 100);
	  return;
	}

	var state = wave.getState();
	if (state){
	  if (m_lobby_initialized) return;
	  m_lobby_initialized=true;
	  m_opponent = null;

	  var tables_count = parseInt(state.get("TABLES_COUNT",'0'));
	  //alert("tables_count="+tables_count);
	  var new_fields={}
	  if (tables_count==0){
	    new_fields["TABLES_COUNT"] = gadgets.json.stringify({'value':""+MINIMAL_TABLES_COUNT, 'timestamp': getTimestamp() });
	    for(var tablenum=0;tablenum<MINIMAL_TABLES_COUNT;tablenum++){
	      var tableid = ""+m_roomid+"_"+tablenum;
	      var table_info = {"Tableid": tableid, "Status": "empty"}
	      new_fields["TABLE_"+tablenum] = gadgets.json.stringify({'value':gadgets.json.stringify(table_info), 'timestamp': getTimestamp() });
	    }
	    state.submitDelta(new_fields);
	  }// if tables_count==0
	  else{
	    stateUpdated();
	  }
	}else{alert('no state in initTables'); }
    }catch(e){alert("initTables error:"+e);}
    }

    function tableAdded(data){

      try{
	var state = wave.getState();
	if (state){
	  tabledata = data;

	  params = {"Tableid": tabledata.tableid,
		    "Status": tabledata.table_info.status};
	  var tableInfo = gadgets.json.stringify(params);

	  //document.getElementById('lobbyid').statusUpdate("TABLE_"+tabledata.table_num, tableInfo );
	  //var tables_count = parseInt(state.get("Tables_count",'0'));
	  var tableid="table_"+tabledata.table_num;
	  window.wave.getState().submitDelta( {"Tables_count":""+(tables_count+1), tableid: tableInfo});
	  //alert("tables_count:"+tables_count);
	 }else{alert('no state in tableAdded'); }

      }catch(e){alert("tableAdded error:"+e); }
    }

    function checkTables(new_fields){
      try{
      var state = window.wave.getState();
      if (!state) return;

      var empty_tables = 0;

      var tablesCountStr = state.get("TABLES_COUNT", "");
      var tablesCount = parseInt(gadgets.json.parse(tablesCountStr).value);

      //log("tablesCount:",tablesCount);

      for(var tablenum=0;tablenum<tablesCount;tablenum++){
	var tableid = "TABLE_"+tablenum;

	if (""+new_fields[tableid] != "undefined"){
	  tableInfoStr = new_fields[tableid];
	  }
	else
	  tableInfoStr = state.get(tableid, "");
	if (tableInfoStr!=""){
	  var table_info = gadgets.json.parse(gadgets.json.parse(tableInfoStr).value);
	  if (""+table_info["User1"]=="undefined" && ""+table_info["User2"]=="undefined"){
	    empty_tables++;
	  }

	}
      }

      if (empty_tables<1){
	//log("Add new table");
	new_fields["TABLES_COUNT"] = gadgets.json.stringify({'value':""+(tablesCount+1), 'timestamp': getTimestamp() });


	var tableid = ""+m_roomid+"_"+tablesCount;
	var table_info = {"Tableid": tableid, "Status": "empty"}
	new_fields["TABLE_"+tablesCount] = gadgets.json.stringify({'value':gadgets.json.stringify(table_info), 'timestamp': getTimestamp() });
      }
      else if (tablesCount>MINIMAL_TABLES_COUNT && empty_tables>2){
	//check if last table is empty
	var tableid = "TABLE_"+(tablesCount-1);
	var tableInfoStr = state.get(tableid, "");
	if (tableInfoStr!=""){
	  var table_info = gadgets.json.parse(gadgets.json.parse(tableInfoStr).value);
	  if (""+table_info["User1"]=="undefined" && ""+table_info["User2"]=="undefined"){
	      log("last table is empty - remove");
	      new_fields["TABLES_COUNT"] = gadgets.json.stringify({'value':""+(tablesCount-1), 'timestamp': getTimestamp() });

	      var tableid = ""+m_roomid+"_"+(tablesCount-1);
	      var table_info = {"Tableid": tableid, "Status": "deleted"}
	      new_fields["TABLE_"+(tablesCount-1)] = gadgets.json.stringify({'value':gadgets.json.stringify(table_info), 'timestamp': getTimestamp() });
	  }
	}
      }

      return new_fields;

      }catch(e){ alert("checkTables error:"+e); }
    }
    function pingID(id){
      return id+"_ping";//.split("@")[0];
    }
    
    function checkPings(){
      var onGetOffline = function(offline_list){
	log("onGetOffline",offline_list);
	if (offline_list.length>0 ){
	  var state = window.wave.getState();
	  if (!state) return;
	  
	  log("GO clean some seats");
	  var tablesCountStr = state.get("TABLES_COUNT", "");
	  var tablesCount = gadgets.json.parse(tablesCountStr).value;
	  for(var tablenum=0;tablenum<tablesCount;tablenum++){
	    var tableid = "TABLE_"+tablenum;
	    var tableInfoStr = state.get(tableid, "");
	    if (tableInfoStr!=""){
	      var table_info = gadgets.json.parse(gadgets.json.parse(tableInfoStr).value);
	      for(var seat=1;seat<=2;seat++){
		if (""+table_info["User"+seat]!="undefined"){
		  var user = gadgets.json.parse(table_info["User"+seat]);
		  if (jQuery.inArray(user.ID, offline_list)> -1){
		    log("leave seat "+seat+" on table "+tableid);
		    if (!first_ping_processed) m_usersToRemove+=1;
		    leaveSeatIn(tableid,seat,true);
		  }
		}
	      }
	    } // if tableInfo
	  } // for 
	  if (!first_ping_processed && m_usersToRemove==0){
		first_ping_processed = true;
		stateUpdated();
	    }
	} // if offline_list > 0
	else{
	    if (!first_ping_processed){
		first_ping_processed = true;
		stateUpdated();
	    }
	}
      }
      var onIsResponsible = function(data){
	log("onIsResponsible",data);
	if (data){
	  sendPing("/wave/get", onGetOffline );
	}
	else{
	    if (!first_ping_processed){
		first_ping_processed = true;
		stateUpdated();
	    }
	}
      }
      var onPingOk = function(){
	sendPing("/wave/chk", onIsResponsible );
      }
      sendPing("/wave/set", onPingOk );
    }

    function statusUpdateReceived(key){
      delete m_sentCommands[key];
    }

    function stateUpdated(){
    
    try{
      if (m_host == null) { m_host = window.wave.getHost();
			   if (!m_host) {log("no host");return;} }
      if (m_viewer == null) { m_viewer = wave.getViewer();
			     if (!m_viewer) {log("no viewer");return;} }
      var state = wave.getState();
      if (!state) return;
      if (m_roomid == 0){
	  m_roomid = state.get("roomid",'0');
	  if (m_roomid=='0'){
	    if (m_host.getId() == m_viewer.getId()){ // check if we need to initialize chat ID)
	      if(!m_room_id_requested){
		    sendRequest("/API/wave/createRoomID", updateRoomID, true);
		    m_room_id_requested=true;
	      }
	    }
	    return;
	  }
      }
      // Only if already have
      if (m_roomid == 0) return;
      /* pings part*/
      if (ping_timerid==0){
	ping_timerid = setInterval("checkPings();", 30000);
	checkPings();
      }
      if (!first_ping_processed)
	return;
      
      /* pings part end*/

      //alert("on state update");
      if (m_mode == "VIDEO"){
	if (m_videopage_inserted==false){
	  var flashObj = document.getElementById("videoid");
	  if (!flashObj){
	    gadgets.window.adjustHeight(500);
	    gadgets.flash.embedFlash("http://st.6rounds.com/4.03/swf/video/videopage_wave.43.swf", "flash_content", 10.0, {id: "videoid",allowScriptAccess:"always", flashvars:m_videopage_params, type:"application/x-shockwave-flash"});
	    m_videopage_inserted=true;
	    track("/wave/gotovideo/"+m_roomid+"?tableid=");
	  }
	}
	var data_object = gadgets.json.parse(state.get(m_session_in_table,''));
	if (data_object){
	  var table_info = gadgets.json.parse(data_object.value);
	  if (table_info.Status=="empty"){
	    m_session_in_table = null;
	    try{ page.hideApp(); } catch(e){};
	    m_mode = "LOBBY";
	    m_videopage_inserted = false;
	    m_timestamps = new arr();
	    gadgets.window.adjustHeight(330);
	    m_lobby_inserted = false;
	    stateUpdated();
	    track("/wave/gotolobby/"+m_roomid+"");
	  }
	}


      }
      else if (m_mode=="LOBBY"){
	if (!m_lobby_inserted){
	  gadgets.flash.embedFlash("http://st.6rounds.com/wave/WaveWidget.85.swf", "flash_content", 10.0, {id: "lobbyid", allowScriptAccess:"always"});
	  m_lobby_inserted=true;
	}
	initTables();
	// if table already initialized
	if (checkFlashLoaded("lobbyid") ){
	  if (m_timestamps.length()==0){//first run - set host and viewer
	    document.getElementById('lobbyid').statusUpdate("HOST", gadgets.json.stringify(makePerson(m_host)) );
	    document.getElementById('lobbyid').statusUpdate("VIEWER", gadgets.json.stringify(makePerson(m_viewer)) );
	  }
	  for(var key in m_sentCommands){
	    //log("update loop: Change for "+key, "at "+m_sentCommands[key]);
	    var flashbj = document.getElementById('lobbyid');
	    if (flashbj) {document.getElementById('lobbyid').statusUpdate(key, m_sentCommands[key] ); }
	    else { alert("NO LOBBY HERE"); }
	    //log("update loop: DONE Change for "+key , m_sentCommands[key]);
	  }


	  var keys = state.getKeys();
	  for (var index in keys){
	    var key = keys[index];
	    if (key=="TABLES_COUNT" || key=="TITLE" || key.indexOf("TABLE_")==0 || key.indexOf("SNAP_")==0){
	      var data_object = gadgets.json.parse(state.get(key,''));
	      if (data_object){
		//alert(key+" = "+data_object.value);
		// check if it's our table and if it's full
		if (key.indexOf("TABLE_")==0){
		  var table_info = gadgets.json.parse(data_object.value);

		  if (""+table_info.User1 != "undefined" && ""+table_info.User2 != "undefined"){
		    var user1 = gadgets.json.parse(table_info.User1);
		    var user2 = gadgets.json.parse(table_info.User2);
		    if (user1.ID == m_viewer.getId() || user2.ID == m_viewer.getId() ){
		      // Viewer is in the table and table is full //
		      if (user1.ID == m_viewer.getId()) { // user1 initiate the session on server
			//alert("table_info.Status="+table_info.Status);
			if (table_info.Status!="insession"){
			  //alert("do InitSessionStart");
			  InitSessionStart(key);
			  return;
			}
		      }
		      if (table_info.Status=="insession"){
			//alert("insession!");
			getSessionData(key);
			gadgets.window.adjustHeight(100);
			m_mode = "VIDEO";
			m_timestamps = new arr();
			m_session_in_table = key;
			m_flash_content.innerHTML = "<table width='100%' height='100%' valign='middle'><tr><td align='center'>Loading video ...</td></tr></table>";
			return;
		      }
		    }
		  }
		  var was_changed = false;
		  if (""+table_info.User1 != "undefined"){
		    var user = gadgets.json.parse(table_info.User1);

		    var uobj = wave.getParticipantById(user.ID);
		    user.ThumbnailUrl = normalizeUrl(uobj.getThumbnailUrl() );
		    table_info.User1 = gadgets.json.stringify(user);
		    was_changed = true;
		  }
		  if (""+table_info.User2 != "undefined"){
		    var user = gadgets.json.parse(table_info.User2);

		    var uobj = wave.getParticipantById(user.ID);
		    user.ThumbnailUrl = normalizeUrl(uobj.getThumbnailUrl() );
		    table_info.User2 = gadgets.json.stringify(user);
		    was_changed = true;
		  }
		  if (was_changed)
		    data_object.value = gadgets.json.stringify(table_info);

		}
		if (key == "TITLE"){
		  var title_data = gadgets.json.parse(data_object.value);
		  if (""+title_data.Updater!="undefined"){
		    var updater_object = gadgets.json.parse(title_data.Updater);
		    var uobj = wave.getParticipantById(updater_object.ID);
		    updater_object.ThumbnailUrl = normalizeUrl(uobj.getThumbnailUrl() );

		    title_data.Updater = gadgets.json.stringify(updater_object);
		    data_object.value = gadgets.json.stringify(title_data);
		  }
		}
		if (isNaN(m_timestamps[key]) || m_timestamps[key]!=data_object.timestamp){
		  m_timestamps[key] = data_object.timestamp;
		  try{
		    //log("Change for "+key, "at "+data_object.timestamp);
		    log("statusUpdate for "+key, data_object.value );
		    m_sentCommands[key] = data_object.value;
		    var flashbj = document.getElementById('lobbyid');
		    if (flashbj) {document.getElementById('lobbyid').statusUpdate(key, data_object.value ); }
		    else { alert("NO LOBBY HERE"); }
		    //log("DONE Change for "+key+ "at "+data_object.timestamp , data_object.value);
		  }catch(e){ alert("failed to call AS function: "+e); }
		}
		else{
		  //log("no change for "+key, m_timestamps[key]+" vs "+data_object.timestamp);
		  //log("____");
		  //log(data_object.value);
		  //log(data_object.value);
		}
	      }
	    }
	  }
	}else if (m_timestamps.length()==0){ // still not initialized lobby ?
	  setTimeout ( 'stateUpdated();', 100 );
	}
      }

    }catch(e){
      alert("stateUpdated exception: "+e);
    }
    }

    function init(){
      try{
	var part=0;
	try{
	  if (""+wave=="undefined" || ""+wave==""){
	    log("no wave..");
	    setTimeout ( 'init();', 2000 );
	    return;
	  }
	}catch(e){
	    log("no wave. error",e);
	    setTimeout ( 'init();', 2000 );
	    return;
	}
	part=1;
	log("1");
	if (wave){
	  part=2; wave.internalInit_();
	  log("2");
	  if (wave.isInWaveContainer()) {
	    m_timestamps = new arr();
	    log("3"); part=3; wave.setStateCallback(stateUpdated);
	    log("4");part=4; wave.setParticipantCallback(stateUpdated);
	    log("4");part=5; stateUpdated();
	  }
	  else{
	    alert("NOT isInWaveContainer");
	    setTimeout ( 'init();', 1000 );
	  }
	}else{
	  alert("no  wave");
	}
      }
      catch(e){
	alert("1) Exception ("+part+"):"+e);
      }
    }
    function init_gadget() { log("init_gadget");setTimeout ( 'init();', 100 ); }
    gadgets.util.registerOnLoadHandler(init_gadget);
    gadgets.window.adjustHeight(330);
    function resize() { m_timestamps =new arr(); setTimeout ( 'stateUpdated();', 300 ); }
    window.onresize = resize;

    // ---- VIDEO PAGE RELATED FUNCTIONS
    app = new Object();

    function VideoPageSupport() {
	this.init = function() {

	      //document.domain = params.jsdomain;

	      this.isFocused = false;
	      this.flashLoaded = false;


		      app.dom = document.createElement("div");
		      app.dom.setAttribute("style", "position: absolute; display: none; z-index: 999;");
		      m_content.appendChild(app.dom);

	      //window.addEvent("focus", this.onFocus.bind(this));
	      //window.addEvent("blur", this.onBlur.bind(this));
	      //window.addEvent("unload", this.beforeClosing.bind(this));
	      //this.verifyLoad();
	}

	this.helloPage = function() {	    
            log("Hello started");
            this.flashVideoPage= document.getElementById('videoid') ;
            log("Hell iinished:",this.flashVideoPage);
	}

	this.close = function(){
	  try{
	  var state = wave.getState();
	  if (state){
	    var tablenum = m_session_in_table.split("_")[1];

	    var new_fields = {}
	    var tableid = ""+m_roomid+"_"+tablenum;
	    var table_info = {"Tableid": tableid, "Status": "empty"}
	    new_fields["TABLE_"+tablenum] = gadgets.json.stringify({'value':gadgets.json.stringify(table_info), 'timestamp': getTimestamp() });

	    state.submitDelta(new_fields);
	  }
	  }catch(e){ alert("close error:"+e); }
	}


	this.clearAppContainer = function() {
		app.flashvars = null;
		app.params = null;
		app.attributes = null;

		app.dom.style.display = "none";

		app.dom.innerHTML="";

		if (this.authenticationFrame != null) {
			this.authenticationFrame.style.display =  "none";
			app.dom.parentNode.removeChild(this.authenticationFrame);
			this.authenticationFrame = null;
		}
	}


	this.initAppContainer = function(loader, path, flashvars) {
		//alert("initAppContainer");
		this.clearAppContainer();
		//alert("clearAppContainer done");
		app.flashvars = eval("(" + flashvars + ")");
		app.flashvars.appPath = path;

		var varsData = new Array();
		for(var key in app.flashvars){
		  varsData.push(""+key+"="+escape(app.flashvars[key]) );
		}

		app.params = {
			allowScriptAccess: "always",
			quality: "high",
			wmode: "transparent", // "opaque"
			swLiveConnect: "true",
			autostart: "true",
			id: "videoApp",
			width: "100%",
			height: "100%",
			type: "application/x-shockwave-flash",
			flashvars: varsData.join("&")
		};
		app.loader = loader;
		app.url = path;

		var el = document.createElement("div");
		el.id = "appcontent";
		app.dom.appendChild(el);

		//swfobject.embedSWF(app.loader, "appcontent", "100%", "100%", "10.0.0", null, app.flashvars, app.params, app.attributes);
		gadgets.flash.embedFlash(app.loader, "appcontent", 10.0, app.params);
		//alert("embedFlash done");

		app.movie = window["videoApp"] == null ? document["videoApp"] : window["videoApp"];
	}

	this.moveAppContainer = function(location) {
		location = eval("(" + location + ")");

		app.dom.style.top = location.top+"px";
		app.dom.style.left = location.left+"px";
		app.dom.style.width = location.width+"px";
		app.dom.style.height = location.height+"px";
	}
	this.showApp = function() {

        if (app.dom.style.display != "block")
            app.dom.style.display =  "block";
		app.dom.style.visibility="visible";
		app.dom.style.opacity="1";
	}
	this.hideApp = function() {
		//app.dom.setStyle("display", "none");
		app.dom.style.visibility="hidden";
		app.dom.style.opacity="0";
	}

	this.timeoutHangup = function() {
		document.getElementById("videoPageFlash").timeoutHangup();
	}


	this.checkFacebookSession = function() {
		//alert("checkFacebookSession start");

		var videocallback = function(json) {
			try{

			if (!json.sessionexists){
				page.createFacebookAuthenticationBox(json.url);
			}
			else {
				app.movie.facebookAuthenticated();
			}
			}catch(e){ alert("callback error:"+e); }
		}
		sendRequest("/callback/fb_checklogin", videocallback );
	}

	this.createFacebookAuthenticationBox = function(url) {
		try{
		if (this.authenticationFrame!=null) return;
		
		var onFBOk = function(json){
		  if (json.err == "1"){
		    sendRequest("/API/wave/get_userData", onFBOk);
		    return;
		  }
		  if (json.data == "FBOK"){
		    page.facebookAuthenticationCallback();
		  }
		}
		sendRequest("/API/wave/get_userData", onFBOk);

		//alert("createFacebookAuthenticationBox");
		//var coords = getCoordinatesFor(app.dom);
		var top = app.dom.style.top;
		var left = app.dom.style.left;

		//var size = app.dom.getSize();
		var width = app.dom.style.width;
		var height = app.dom.style.height;

		this.authenticationFrame = document.createElement("iframe");
		this.authenticationFrame.style.position = "absolute"
		this.authenticationFrame.style.top = top ;
		this.authenticationFrame.style.left= left;
		this.authenticationFrame.style.width =  width ;
		this.authenticationFrame.style.height = height;
		this.authenticationFrame.style.zIndex = "999";

		this.authenticationFrame.border = "0";
		this.authenticationFrame.frameborder = "0";

		var parent = app.dom.parentNode;
		app.dom.style.zIndex = "800";
		parent.appendChild(this.authenticationFrame);
		this.authenticationFrame.src = url;
		}catch(e){ alert("createFacebookAuthenticationBox error:"+e); }
	}

	this.facebookAuthenticationCallback = function() {
		try{
		//alert("facebookAuthenticationCallback");
		this.authenticationFrame.style.display =  "none";
		app.dom.parentNode.removeChild(this.authenticationFrame);
		this.authenticationFrame = null;

		app.movie.facebookAuthenticated();
		}catch(e){ alert("facebookAuthenticationCallback error:"+e); }
	}
	this.appplicationToVideoPage = function(callname,params){
		try{
		    this.flashVideoPage.appplicationToVideoPage(callname,params);
		}catch(err){ log("appplicationToVideoPage error",err); }
	};
	
	this.videoPageToApplication = function(callname,params){
		try{
		    app.movie.videoPageToApplication(callname,params);
		}catch(err){ log("videoPageToApplication error",err);  }
	};
	
	this.videoPageToApplicationLoader = function(callname,params){
	    try{
		app.movie.videoPageToApplicationLoader(callname,params);
	    }catch(err){ log("videoPageToApplicationLoader error",err); }
	};
	
	this.applicationLoaderToVideoPage = function(callname,params){
	    try{
		this.flashVideoPage.applicationLoaderToVideoPage(callname,params);
	    }catch(err){ log("applicationLoaderToVideoPage  error",err); }
	};
   }

   var page = new VideoPageSupport();
   page.init();

-->
</script>
]]>
  </Content>
</Module>
