//Copyright (c) 2006-2007 Vayusphere, Inc. All rights reserved.
//
// This file contains proprietary information.  It is the
// unpublished property of Vayusphere. Use, disclosure,
// or reproduction is prohibited except as permitted by express
// written license agreement with Vayusphere.

var onlstat = '';
var roster;
var fmsg;
var gnick;
var userfulljid;
var connectedCount = 0;

function CloseRoom(jid)
{
    userfulljid = config_userJID+'@'+config_XMPPServer+'/'+config_XMPPResource;     
    group = jid+'@'+config_conferenceServer;
    var aPresence = new JSJaCPresence();
    aPresence.setTo(group);
    aPresence.setType('unavailable');
    aPresence.setFrom(userfulljid);
    con.send(aPresence);
    RemoveRoom(group);     
}

function Logout()
{
    var aPresence = new JSJaCPresence();
    aPresence.setType('unavailable');
    con.send(aPresence);
}

function SendPresence(aJid,nick,pass)
{
jid = aJid;
	group = jid;

	if (typeof(nick) != 'undefined')
		nick = nick;
	if(nick == 'undefined' || nick == '')
		nick = nick; // guess a nick
    gnick=nick;
 	meRegExp = new RegExp("\\b("+nick+")\\b","i");
 	notHREFMeRegExp = new RegExp("href=\"\\S*\\b"+nick+"\\b\\S*\"","i");

	if (pass != 'undefined')
		pass = pass;

  //srcW.Debug.log("groupchat room---1: "+jid+", nick: "+nick + ", pass: "+pass ,2);
  
//	Debug.log("groupchat room---1: "+jid+", nick: "+nick + ", pass: "+pass ,2);	// send presence
	var aPresence = new JSJaCPresence();
	aPresence.setTo(group+'/'+nick);

	var x = aPresence.getDoc().createElement('x');
	x.setAttribute('xmlns','http://jabber.org/protocol/muc');
	if (typeof(pass) != 'undefined' && pass != '')
		x.appendChild(aPresence.getDoc().createElement('password')).appendChild(aPresence.getDoc().createTextNode(pass));

	aPresence.getNode().appendChild(x);
	con.send(aPresence);
}
var win;
function openGroupchat(aJid,nick,pass) {
  pass = pass || '';
  nick = nick || '';
 // open("groupchat.html?jid="+escape(aJid)+"&nick="+escape(nick)+"&pass="+escape(pass),"gchatW"+makeWindowName(aJid+"/"+nick),"width=520,height=390,resizable=yes");
 SendPresence(aJid,nick,pass); 
// win = open("test.htm?jid="+escape(aJid)+"&nick="+escape(nick)+"&pass="+escape(pass),"gchatW"+makeWindowName(aJid+"/"+nick),"width=520,height=390,resizable=yes");
    if ( showQandAFromJabberHistory == false )
        loadQuestionAnswerArchive(aJid);
}


function loginCheckX()
{ 
	//old argument list jid,pass,svr,res,connect_port,connect_host
	var jid=arguments[0];
	var pass=arguments[1];
	var svr=arguments[2];
	var res=arguments[3];
	var connect_port=arguments[4];
	var connect_host=arguments[5];
	var onlyCheckLogin=arguments[6]?arguments[6]:false;
	//alert('inside check');
	JABBERSERVER = svr;

	jid = jid + "@" + JABBERSERVER + "/";
	if (res != '')
		jid += res;
	else
		jid += DEFAULTRESOURCE;

	if(!isValidJID(jid))
		return false;

	pass = pass;
	connect_port = connect_port;
	connect_host = connect_host;
	//jwchats[jid] = window.open('jwchat.html',makeWindowName(jid),'width=180,height=390,resizable=yes');
	CreateNewConnection(jid,pass,connect_port,connect_host,onlyCheckLogin);
	return false;
}
var con, Debug, srcW;
function CreateNewConnection()
{
	//old argument list jid,pass,connect_port,connect_host
	var jid=arguments[0];
	var pass=arguments[1];
	var connect_port=arguments[2];
	var connect_host=arguments[3];
	var onlyCheckLogin=arguments[4]?arguments[4]:false;
	/* initialise debugger */
	if (!Debug || typeof(Debug) == 'undefined' || !Debug.start)
	{
		if (typeof(Debugger) != 'undefined')
		{
			Debug = new Debugger(DEBUG_LVL,'JWChat ' + cutResource(jid));
		}
		else
		{
			Debug = new Object();
			Debug.log = function() {};
			Debug.start = function() {};
		}
	}
	if (DEBUG && (!USE_DEBUGJID || DEBUGJID == cutResource(jid)))
		Debug.start();
	Debug.log("jid: "+jid+"\npass: "+pass,2);
	/* get some refs to static elements */

	 /* create new connection
	 */
	var oArg = {oDbg: Debug, httpbase: HTTPBASE, timerval: timerval};

	if (BACKEND_TYPE == 'binding')
	con = new JSJaCHttpBindingConnection(oArg);
	else
	con = new JSJaCHttpPollingConnection(oArg);

	/* register handlers */
	if(!onlyCheckLogin)
	{
		con.registerHandler('iq',handleIQSet);
		con.registerHandler('presence',handlePresence);
		con.registerHandler('message',handleMessage);
		con.registerHandler('message',handleMessageError);
		con.registerHandler('ondisconnect',handleDisconnect);
		con.registerHandler('onconnect',handleConnected);
		con.registerHandler('onerror',handleConError);
	}
	else
	{
		con.registerHandler('onconnect',isValidLogin);
		con.registerHandler('onerror',notValidLogin);		
	}

	/* connect to remote */
	oArg = {domain:JABBERSERVER,username:jid.substring(0,jid.indexOf('@')),resource:jid.substring(jid.indexOf('/')+1),pass:pass,register:register}

	if (BACKEND_TYPE == 'binding')
	{
		if (connect_port && !isNaN(connect_port))
			oArg.port = connect_port;
		if (connect_host && connect_host != '')
			oArg.host = connect_host;
	}
	con.connect(oArg);
	return true;
}


/************************************************************************
 *                   ***** EVENT - HANDLER *****
 ************************************************************************
 */


/************************************************************************
 * handleMessage
 ************************************************************************
 */
function handleMessage(aMessage) {

//  Debug.log(aMessage.getDoc().xml,2);
//	alert(aMessage.getDoc().xml);
  if (aMessage.getType() == 'error')
    return;

  /* check if this is a groupchat invite */
  var x;
  for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++)
    if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') {
      x = aMessage.getNode().getElementsByTagName('x').item(i);
      break;
    }

  if (x) {
    var from, to, reason, pass;
    to = aMessage.getFrom();
    var aInvite = x.getElementsByTagName('invite').item(0);
    from = aInvite.getAttribute('from');
    if (aInvite.firstChild && aInvite.firstChild.nodeName == 'reason' && aInvite.firstChild.firstChild)
      reason = aInvite.firstChild.firstChild.nodeValue;
    if (x.getElementsByTagName('password').item(0))
      pass = x.getElementsByTagName('password').item(0).firstChild.nodeValue;
    Debug.log("You have been invited to " + jid + " pass " + pass + " by " + from + "\nreason:" + reason,2);
    var user = roster.getUserByJID(cutResource(from));
    if (!user) {// users not in roster (yet)
      Debug.log("creating new user "+from,3);
      user = roster.addUser(new RosterUser(cutResource(from)));
      user.lastsrc = eval(user.status + "Led").src;
      roster.print();
    }

    if (typeof(user.iwArr) == 'undefined')
      user.iwArr = new Array();

    user.iwArr[to] = open("groupchat_invite.html?to="+escape(to)+"&from="+escape(from)+"&pass="+escape(pass)+"&reason="+escape(reason),"iw"+makeWindowName(to),"width=320,height=320,resizable=yes");

    return;
  }
  var from = cutResource(aMessage.getFrom());
  
  if ( from == config_XMPPServer ) // Announcements
  {
    showAnnouncement(aMessage.getBody());
  }
  
  var type = aMessage.getType();
  Debug.log("from: "+from+"\naMessage.getFrom(): "+aMessage.getFrom(),3);

/*  var user = roster.getUserByJID(from);
  if (user == null) {// users not in roster (yet)
    Debug.log("creating new user "+from,3);
    user = roster.addUser(new RosterUser(from));
    user.lastsrc = eval(user.status + "Led").src;
    roster.print();
  }

  Debug.log("got user jid: "+user.jid,3);
*/
if (type == 'chat') {

    
    jid = aMessage.getFrom(); 
  	nick = jid.substring(0, jid.indexOf('@'));    
    var messageBody = aMessage.getBody();
    addNewOneToOneIM(nick, messageBody);
}
    
  var aRoster = roster;
  if (type != 'groupchat' && user.roster && from != aMessage.getFrom()) { // private groupchat message
    aRoster = user.roster;
    from = aMessage.getFrom(); // use from with resource (had been cut off first)
  //  user = user.roster.getUserByJID(from);
  }

  /* change icon in roster - but not if it's a groupchat item */
  if (type != 'groupchat') {
    if (!user.lastsrc)
      user.lastsrc = eval(user.status + "Led").src;

    var images = aRoster.getUserIcons(from);
    for (var i=0; i<images.length; i++)
      images[i].src = messageImg.src;

    /* user is not visible right now - make him pop up (lastsrc changed!) */
    if (aRoster.usersHidden && user.status == 'unavailable')
      aRoster.print();
  }

  // set current timestamp
  var x;
  for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++)
    if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'jabber:x:delay') {
      x = aMessage.getNode().getElementsByTagName('x').item(i);
      break;
    }

  if (x) {
    Debug.log("found offline message: "+x.getAttribute('stamp'),3);
    var stamp = x.getAttribute('stamp');
    aMessage.jwcTimestamp = new Date(Date.UTC(stamp.substring(0,4),stamp.substring(4,6)-1,stamp.substring(6,8),stamp.substring(9,11),stamp.substring(12,14),stamp.substring(15,17)));
  } else
    aMessage.jwcTimestamp = new Date();

  if (type == 'chat') {
    
    
    

  } else if (type == 'groupchat') {

    /* handle groupchat message
     */

   
  var x;  
   	jid = aMessage.getFrom();
  	nick = jid.substring(jid.indexOf('/')+1,jid.length);    	    
    var messageBody = aMessage.getBody();
    roomname =jid.substring(0,jid.indexOf('@'));      	 
  var isArchiveMessage = false;
  var isVayuNSCMessage = false;  
  for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++)
  {
    if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'jabber:x:delay')
    {
        isArchiveMessage = true;        
    }
    else if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'jabber:x:vayunsc')
    {
        isVayuNSCMessage = true;     
        x = aMessage.getNode().getElementsByTagName('x').item(i);   
    }
  }
//NATH - pay attention 
  for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++)
    if ((showQandAFromJabberHistory == true || isArchiveMessage == false) && isVayuNSCMessage == true) {      
      if (x.getAttribute('type') == "question" && x.getAttribute('status') == "queue") 
      {		
			addNewQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody); 			
	  }
	  if (x.getAttribute('type') == "question" && x.getAttribute('status') == "approved") 
      {		
			addNewApprovedQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody); 			
	  }
	  if (x.getAttribute('type') == "question" && x.getAttribute('status') == "deleted") 
      {		
			addNewDeletedQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody);
	  }
	  if (x.getAttribute('type') == "question" && x.getAttribute('status') == "approveddeleted") 
      {		
			addApprovedDeletedQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody);
	  }	  
	  if (x.getAttribute('type') == "answer" && x.getAttribute('status') == "question") 
      {		
			addNewAnswersQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody); 			
	  }
	  else if (x.getAttribute('type') == "answer" && x.getAttribute('status') == "answer") 
      {	
 			addNewAnswerToUi(roomname, nick, x.getAttribute('msgid'),messageBody); 			
      }
      else if (x.getAttribute('type') == "announcement" )
      {
            addNewRoomAnnouncementToUi(roomname, nick, messageBody, x.getAttribute('priority'));
      } 		
      break;
    }
   if (isVayuNSCMessage == false) {
 		addNewChatToUi(roomname, nick, messageBody);   			
    }    
  }
  else {
    user.messages = user.messages.concat(aMessage);
    if (autoPopup && (autoPopupAway || onlstat == "available" || onlstat == "chat") && (!user.mW || user.mW.closed)) {
      aRoster.openMessage(from);
      playSound('message_recv');
    } else if (user.mW && !user.mW.closed && user.messages.length > 0 && user.mW.document.forms[0]) {
      user.mW.document.forms[0].nextButton.disabled = false;
      if (focusWindows) user.mW.focus();
      playSound('message_recv');
    }	else {
      if (focusWindows) window.focus();
      playSound('message_queue');
      // let arrow blink for toggled groups
      for (var i=0; i<user.groups.length; i++) {
	if (user.groups[i] != '') {
	  /*if (roster.hiddenGroups[user.groups[i]])
	    fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src;*/
	}
      }

    }

    // [TODO] zeank 2005-10-26
    // archiving of single/plain messages
  }
}
/****************************
 * Load archive question and answer messages
  ****************************/
function loadQuestionAnswerArchive(roomName)
{   
    var archiveUrl = "getArchive.php?roomname=" + roomName;     
    var xmlhttp = getHTTPRequestObject();
    xmlhttp.open("GET",archiveUrl,false);
    xmlhttp.onreadystatechange = function()
    {   
        if (xmlhttp.readyState==4) 
        { 
            xmlDoc = getXMLDocFromString(xmlhttp.responseText);
            var xPackets = xmlDoc.getElementsByTagName("packet");
            
            
            
            for (var i=0; i< xPackets.length; i++)
            {   
                var xMessage;
                for ( var j = 0; j < xPackets.item(i).childNodes.length; j++) 
                {
                    if ( xPackets.item(i).childNodes[j].nodeName == "message")
                    {
                        xMessage = xPackets.item(i).childNodes[j];
                        break;                        
                    }
                }
                
                
                var x;
                roomname = xMessage.getAttribute('to');
                roomname = roomname.substring(0,roomname.indexOf('@'));
                nick = xPackets.item(i).getAttribute('ljid');
                nick = nick.substring(0, nick.indexOf("@"));
                
                var messageBody;
                for ( var j = 0; j < xMessage.childNodes.length; j++) 
                {
                    if ( xMessage.childNodes[j].nodeName == "x" && xMessage.childNodes[j].getAttribute('xmlns') == 'jabber:x:vayunsc')
                    {
                        x = xMessage.childNodes[j];
                        break;
                    }
                    if ( xMessage.childNodes[j].nodeName == "body" ) 
                    {
                        messageBody = xMessage.childNodes[j].childNodes[0].nodeValue;
                    }
                }
                if (x.getAttribute('type') == "question" && x.getAttribute('status') == "queue") 
                {		
                    addNewQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody); 	
                }
                if (x.getAttribute('type') == "question" && x.getAttribute('status') == "approved") 
                {		
                    addNewApprovedQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody); 			
                }
                if (x.getAttribute('type') == "question" && x.getAttribute('status') == "deleted") 
                {		
                    addNewDeletedQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody);
                }
                if (x.getAttribute('type') == "question" && x.getAttribute('status') == "approveddeleted") 
                {		
                    addApprovedDeletedQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody);
                }	  
                if (x.getAttribute('type') == "answer" && x.getAttribute('status') == "question") 
                {		
                    addNewAnswersQuestionToUi(roomname, nick, x.getAttribute('msgid'), messageBody); 			
                }
                else if (x.getAttribute('type') == "answer" && x.getAttribute('status') == "answer") 
                {

                    addNewAnswerToUi(roomname, nick, x.getAttribute('msgid'),messageBody); 			
                }
                else if (x.getAttribute('type') == "announcement" )
                {
                    addNewRoomAnnouncementToUi(roomname, nick, messageBody, x.getAttribute('priority'));
                } 		
              
            }
            //alert(xmlhttp.responseText);
        }
     }
     xmlhttp.send(null);
}


/************************************************************************
 * handleMessageError
 ************************************************************************
 */
var error_messages = new Array();
var errorW;
function handleMessageError(aJSJaCPacket) {

  if (aJSJaCPacket.getType() != 'error')
    return;

  Debug.log(aJSJaCPacket.getDoc().xml,2);

  var user = roster.getUserByJID(cutResource(aJSJaCPacket.getFrom()));

  if (user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) {
    var error = aJSJaCPacket.getNode().getElementsByTagName('error').item(0);
    if (error) {
      if (error.getElementsByTagName('text').item(0)) {
	user.chatW.putMsgHTML(aJSJaCPacket);
	playSound('error');
	return;
      }
    }
  }

  error_messages = error_messages.concat(aJSJaCPacket);

  if (!errorW || errorW.closed)
    errorW = open("error_message.html","errorW"+makeWindowName(jid),"width=360,height=270,dependent=yes,resizable=yes");
  else if (error_messages.length > 0 && errorW.document.forms[0])
    errorW.document.forms[0].nextButton.disabled = false;

  playSound('error');

  errorW.focus();
}

/************************************************************************
 * handlePresence
 ************************************************************************
 */

function handlePresence(presence) {
  //Debug.log(presence.getDoc().xml,2);
  //alert(presence.getDoc().xml);
  var from = cutResource(presence.getFrom());
  var type = presence.getType();
  var show = presence.getShow();
  var status = presence.getStatus();
  var auser_jid = cutNickResource(presence.getFrom());
//  var aRoster = roster;
//  if (cutNickResource(presence.getFrom()) == config_nick)  

   auser_jid = auser_jid +'@'+config_XMPPServer;
  if (type == 'unavailable')
  {
    if (cutNickResource(presence.getFrom()) == config_nick)  
    {
        var x;
        for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++)
        {
            if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') 
            {
                x = presence.getNode().getElementsByTagName('x').item(i);
                break;
            }
        }
        if (x.getElementsByTagName('status').item(0))
        {
            var code = x.getElementsByTagName('status').item(0).getAttribute('code');
            switch (code)
            {
                case '322': roomLockedOnRunTime(from);// room only for members
                case '307': kickedFromRoom(from);// Kick
                case '301': bannedFromRoom(from);// Ban
                
            }
        }            
     }
     else 
     {
        AddOfflineUser(from,auser_jid); 
     }
   }
   else 
        AddOnlineUser(from,auser_jid); 
        
  
  if (from == cutResource(jid)) // skip my own presence msgs
    return;

  // roster subscriptions synchronisation
  if (isGateway(from.substring(from.indexOf('@')+1))) {
    var x;
    for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++)
      if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/roster-subsync' ||
	  presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://delx.cjb.net/protocol/roster-subsync') {
	x = presence.getNode().getElementsByTagName('x').item(i);
	break;
      }

    if (x) {
      var items = x.getElementsByTagName("item");
      for (var i=0; i<items.length; i++) {
	var aItem = items.item(i);
	if (type == 'subscribe' && aItem.getAttribute("subscription") == 'both') {
	  // insert into roster
	  var aIQ = new JSJaCIQ();
	  aIQ.setType('set');
	  var query = aIQ.setQuery('jabber:iq:roster');
	  var bItem = query.appendChild(aIQ.getDoc().createElement('item'));
	  bItem.setAttribute('jid',from);
	  if (aItem.getAttribute('name') && aItem.getAttribute('name') != '')
	    bItem.setAttribute('name',aItem.getAttribute('name'));
	  else
	    bItem.setAttribute('name',from.substring(0,from.lastIndexOf('@')).replace(/%/,'@'));
	  var itemGroups = aItem.getElementsByTagName("group");
	  for (var j=0; j<itemGroups.length; j++)
	    bItem.appendChild(itemGroups.item(j));

	  Debug.log("roster-subsync setting roster:"+aIQ.xml(),2);

	  con.send(aIQ);

	  // Approve Subscription Request
	  var aPresence = new JSJaCPresence();
	  aPresence.setTo(from);
	  aPresence.setType('subscribed');
	  con.send(aPresence);

	  // Subscribe to gateway contact's presence
	  var bPresence = new JSJaCPresence();
	  bPresence.setTo(from);
	  bPresence.setType('subscribe');
	  con.send(bPresence);
	}
      }
      return;
    }
  }

  switch (type) {
  case null:
  case '':
    break;
  case 'subscribe':
    if (isGateway(from)) { // automatically subscribe gateways

      // Approve Subscription Request
      var aPresence = new JSJaCPresence();
      aPresence.setTo(presence.getFrom());
      aPresence.setType('subscribed');
      con.send(aPresence);

      // Subscribe to Gateway's Presence
      var bPresence = new JSJaCPresence();
      bPresence.setTo(presence.getFrom());
      bPresence.setType('subscribe');
      con.send(bPresence);
    }	else {
      if (status)
	window.open("subscriptionRequest.html?jid="+escape(from)+"&msg="+escape(status),"sr"+makeWindowName(from),"width=320,height=240");
      else
	window.open("subscriptionRequest.html?jid="+escape(from),"sr"+makeWindowName(from),"width=320,height=240");
    }
    return;
  case 'unsubscribe':
    if (!isGateway(from))
      alert("You have been unsubscribed from "+presence.getFrom()); /* [TODO] don't use alert here */
    break;
  case 'error':
    var user = roster.getUserByJID(from);
    if (user && user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) {
      if (presence.getNode().getElementsByTagName('error').item(0)) {
	var error = presence.getNode().getElementsByTagName('error').item(0);
	if (error.getElementsByTagName('text').item(0))
	  user.chatW.putMsgHTML(presence);
	else if (error.firstChild && error.firstChild.nodeValue)
	  user.chatW.putMsgHTML(error.firstChild.nodeValue,new Date(),from,null,true);
      }

    }
  default:
    return;
  }

  var user = roster.getUserByJID(from);
  if (!user) // presence from unsubscribed user
    return;

  /* handle presence for MUC */
  var x;
  for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++)
    if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') {
      x = presence.getNode().getElementsByTagName('x').item(i);
      break;
    }

  if (user.roster && x) {
    var ofrom = presence.getFrom().substring(presence.getFrom().indexOf('/')+1);

    Debug.log("jabber.from:"+presence.getFrom()+", ofrom:"+ofrom,3);

    var ouser = user.roster.getUserByJID(presence.getFrom());
    if (!ouser) // no user? create one!
      ouser = new GroupchatRosterUser(presence.getFrom(),ofrom);

    var item = x.getElementsByTagName('item').item(0);

    ouser.affiliation = item.getAttribute('affiliation');
    ouser.role = item.getAttribute('role');
    ouser.nick = item.getAttribute('nick');
    ouser.realjid = item.getAttribute('jid');
    if (item.getElementsByTagName('reason').item(0))
      ouser.reason = item.getElementsByTagName('reason').item(0).firstChild.nodeValue;
    if (actor = item.getElementsByTagName('actor').item(0)) {
      if (actor.getAttribute('jid') != null)
	ouser.actor = actor.getAttribute('jid');
      else if (item.getElementsByTagName('actor').item(0).firstChild != null)
				ouser.actor = item.getElementsByTagName('actor').item(0).firstChild.nodeValue;
    }
    if (ouser.role != '') {
      ouser.add2Group(ouser.role+'s');

      /* check if it is our own presence
       * must be done here cause we want to be sure that role != ''
       */

      if (ouser.name == htmlEnc(user.roster.nick)) { // seems to be me
	user.roster.me = ouser; // store this reference
	if (user.chatW.updateMe)
	  user.chatW.updateMe();
      }
    }

    Debug.log("ouser.jid: "+ ouser.jid + ", ouser.fulljid:" + ouser.fulljid + ", ouser.name:"+ouser.name+", user.roster.nick:"+user.roster.nick,3);


    var nickChanged = false;
    if (x.getElementsByTagName('status').item(0)) {
      var code = x.getElementsByTagName('status').item(0).getAttribute('code');
      switch (code) {
      case '201': // room created
	/* popup dialog to ask for whether to accept default
	 * configuration or make a custom room
	 */
	if (confirm("A new room has been created but it awaits configuration from you. Do you want to do a custom configuration now?\nNote: Click on 'Cancel' to start with a default configuration!"))
	  user.chatW.openConfig();
	else {
	  var iq = new JSJaCIQ();
	  iq.setType('set');
	  iq.setTo(user.jid);
	  var query = iq.setQuery('http://jabber.org/protocol/muc#owner');
	  var x = query.appendChild(iq.getDoc().createElement('x'));
	  x.setAttribute('xmlns','jabber:x:data');
	  x.setAttribute('type','submit');

	  con.send(iq);
	}
	break;
      case '303': // nick change
	// display message
	if (!ouser.nick)
	  return;

	var aMessage = new JSJaCMessage();
	aMessage.setFrom(user.jid);
	aMessage.setBody(""+ouser.name+" is now known as "+htmlEnc(ouser.nick));
	user.chatmsgs = user.chatmsgs.concat(aMessage);
	if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
	  user.chatW.popMsgs();

	// update nick if it's me
	if (ouser.name == htmlEnc(user.roster.nick))
	  user.roster.nick = ouser.nick;

	// remove old user
	var aChatW = ouser.chatW;
	user.roster.removeUser(ouser);

	// add new user
	ouser = new GroupchatRosterUser(presence.getFrom().substring(0,presence.getFrom().lastIndexOf('/')+1).concat(ouser.nick),ouser.nick);

	if (aChatW && !aChatW.closed) {
	  ouser.chatW = aChatW;
	  ouser.chatW.user = ouser;
	}
	user.roster.addUser(ouser);
	nickChanged = true;
	break;
      case '301': // user has been kicked
	var aMessage = new JSJaCMessage();
	aMessage.setFrom(user.jid);
	var body;
	if (ouser.actor)
	  body = ""+ouser.name+" has been banned by "+ouser.actor;
	else
	  body = ""+ouser.name+" has been banned";
	if (ouser.reason)
	  body += ": " + ouser.reason;
	aMessage.setBody(body);
	user.chatmsgs = user.chatmsgs.concat(aMessage);
	if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
	  user.chatW.popMsgs();

	playSound('chat_recv');
	break;
      case '307': // user has been kicked
	var aMessage = new JSJaCMessage();
	aMessage.setFrom(user.jid);
	var body;
	if (ouser.actor)
	  body = ""+ouser.name+" has been kicked by "+ouser.actor;
	else
	  body = ""+ouser.name+" has been kicked";
	if (ouser.reason)
	  body += ": " + ouser.reason;
	aMessage.setBody(body);
	user.chatmsgs = user.chatmsgs.concat(aMessage);
	if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
	  user.chatW.popMsgs();

	playSound('chat_recv');
	break;
      }
    }

    Debug.log("<"+ouser.name+"> affiliation:"+ouser.affiliation+", role:"+ouser.role,3);

    if (!user.roster.getUserByJID(presence.getFrom()) && !nickChanged) {
      // add user
      user.roster.addUser(ouser);

      // show join message
      var aMessage = new JSJaCMessage();
      aMessage.setFrom(user.jid);
      aMessage.setBody(""+ouser.name+" has become available");
      user.chatmsgs = user.chatmsgs.concat(aMessage);
      if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
	user.chatW.popMsgs();

      playSound('online');

    } else if (presence.getType() == 'unavailable' && !nickChanged) {
      // show part message
      var aMessage = new JSJaCMessage();
      aMessage.setFrom(user.jid);
      var body = ""+ouser.name+" has left";
      if (presence.getStatus())
	body += ": " + presence.getStatus();
      aMessage.setBody(body);
      user.chatmsgs = user.chatmsgs.concat(aMessage);
      if (user.chatW && !user.chatW.closed && user.chatW.popMsgs)
	user.chatW.popMsgs();

      playSound('offline');

    } else
      user.roster.updateGroups();

    // relink roster and user
    aRoster = user.roster;
    user = ouser;
  }

  if (show) {
    if (user.status == 'unavailable')
      playSound('online');
    // fix broken pressenc status
    if (show != 'chat' && show != 'away' && show != 'xa' && show != 'dnd')
      show = 'available';
    user.status = show;
  } else if (type) {
    if (type == 'unsubscribe') {
      user.subscription = 'from';
      user.status = 'stalker';
    } else if (user.status != 'stalker')
      user.status = 'unavailable';
    if (aRoster.name == 'GroupchatRoster' && !nickChanged) { // it's a groupchat roster
      // remove user
      if (!user.chatW || user.chatW.closed)
	aRoster.removeUser(user); // we don't need offline users in there
    }
    playSound('offline');
  } else {
    if (user.status == 'unavailable') // user was offline before
      playSound('online');
    user.status = 'available';
  }

  var img = eval(user.status+"Led");

  if (user.lastsrc) // message is pending
    user.lastsrc = img.src;

  // show away message
  if (status)
    user.statusMsg = status;
  else
    user.statusMsg = null;

  // update presence indicator of chat window
  if (user.chatW && !user.chatW.closed && user.chatW.updateUserPresence)
    user.chatW.updateUserPresence();

  aRoster.print(); // update roster
}

/************************************************************************
 * handleIQSet
 ************************************************************************
 */

function handleIQSet(iq) {
  if (iq.getType() != "set") {
    Debug.log("not handling iq:\n"+iq.getDoc().xml,3);
    return;
  }

  Debug.log("got iq type 'set':\n"+iq.getDoc().xml,2);

  if (iq.getQueryXMLNS() != 'jabber:iq:roster') { // only handle roster items so far
    Debug.log("not handling iq:\n"+iq.getDoc().xml,1);
    return;
  }

  for (var i=0; i<iq.getQuery().childNodes.length; i++) {
    var item = iq.getQuery().childNodes.item(i);
    var user = roster.getUserByJID(cutResource(item.getAttribute('jid')));
    if (user) {
      user.subscription = item.getAttribute('subscription');
      if (item.getAttribute('subscription') == 'remove') {
	Debug.log("removing user " + user.jid,2);
        roster.removeUser(user);
      } else { // update user
        user.name = item.getAttribute('name')? htmlEnc(item.getAttribute('name')) : item.getAttribute('jid');
        user.groups = new Array('');
	for (var j=0; j<item.childNodes.length; j++)
	  if (item.childNodes.item(j).nodeName == 'group')
	    user.groups = user.groups.concat(item.childNodes.item(j).firstChild.nodeValue);
        roster.updateGroups();
      }
    } else {// got a new user
      if (isGateway(item.getAttribute('jid'))) { // auto add gateways
	// get name
	var name = cutResource(item.getAttribute('jid'));
	for (var i in disco) {
	  if (typeof(disco[i]) != 'object') continue;
	  if (i == cutResource(item.getAttribute('jid')))
	    name = disco[i].getQuery().getElementsByTagName('identity').item(0).getAttribute('name');
	}

	// add to roster
	var aUser = new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),["Gateways"],name);
	//aUser.fulljid = item.getAttribute('jid');
	roster.addUser(aUser);

	// set name and group
	var aIQ = new JSJaCIQ();
	aIQ.setType('set');
	var query = aIQ.setQuery('jabber:iq:roster');
	var aItem = query.appendChild(aIQ.getDoc().createElement('item'));
	aItem.setAttribute('jid',item.getAttribute('jid'));
	aItem.setAttribute('name',name);
	aItem.appendChild(iq.getDoc().createElement('group')).appendChild(iq.getDoc().createTextNode('Gateways'));

	con.send(aIQ);
      } else { // new but not a gateway
        var name = item.getAttribute('name')? item.getAttribute('name') : item.getAttribute('jid');
	if (name.indexOf('@') != -1)
	  name = name.substring(0,name.indexOf('@'));

	item.setAttribute('name',name);
        var groups = new Array('');
	for (var j=0; j<item.childNodes.length; j++)
	  if (item.childNodes.item(j).nodeName == 'group')
	    groups = groups.concat(item.childNodes.item(j).firstChild.nodeValue);

	roster.addUser(new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),groups,name));

	var aIQ = new JSJaCIQ();
	aIQ.setType('set');
	var query = aIQ.setQuery('jabber:iq:roster');

	var aItem = item.cloneNode(true);
	aItem.removeAttribute('subscription');
	query.appendChild(aItem);

	con.send(aIQ); // set stripped name

	if (item.getAttribute('subscription') == "from" && item.getAttribute('ask') != 'subscribe')
	  openSubscription(item.getAttribute('jid')); // subscribe to user
      }
    }
  }
  roster.print();
}
function displayError(errorMessage)
{
	window.location = errorPage + errorMessage + 
			"&uname=" + config_userJID + 
			"&groupnametojoin=" + groupNameToJoin + 
			"&groupdescription=" + groupDescription + 
			"&grouptype=" + groupTypeToJoin + 
			"&videoUrl=" + groupVideoUrl +
			"&sponsorUrl=" + groupSponsorUrl;
}
function handleConError(e) {
	switch (e.getAttribute('code'))
	{
		case '401':
			//alert(msgAuthenticationFailed);
			displayError(msgAuthenticationFailed);
			//  if (!con.connected())
			//window.close();
			break;
		case '409':
			alert("Registration failed!\n\nPlease choose a different username!");
			break;
		case '503':
			if ( e.firstChild.tagName == 'session-terminate') 
			{
				displayError(msgSecondSignOn);
			}
			else
			{
				if ( !isXMPPLoggedIn)
				{
					displayError(msgServiceUnavailable);
				}
				else
				{
					//alert("Reconnect");	
				}
			}	 
			break;
		case '500':
			//  if (!con.connected() && !logoutCalled && onlstat != 'offline')
			//alert("ReConnecting");
			loginCheckX(config_userJID, config_passwd, config_XMPPServer, config_XMPPResource, config_XMPPPort, config_XMPPHost); 
			break;
		default:
			alert("An Error Occured:\nCode: "+e.getAttribute('code')+"\nType: "+e.getAttribute('type')+"\nCondition: "+e.firstChild.nodeName); // this shouldn't happen :)
			break;
	}
}

function handleDisconnect() {
  if (logoutCalled || onlstat == 'offline')
    return;

  // disconnecting not with onunload handler triggered
  statusLed.src = unavailableLed.src; // offline icon
  statusMsg.value = '';

//  fmd.getElementById('roster').innerHTML = '';
// 	if (confirm("Disconnected\n\nReconnect?"))

// 		changeStatus(onlstat,onlmsg);
}

function handleConnected() {
 YAHOO.wait1.hide();
 //document.getElementById("mainChatDiv").style.visibility = "visible";

 
  Debug.log("Connectednnnnnn",0);
//  openGroupchat('#brasil@conference.jabber.org','ntest','');
   if (register && opener && opener.document.forms[0] && opener.document.forms[0].register)
    opener.document.forms[0].register.checked = false;
    isXMPPLoggedIn = true;
    

    connectedCount = connectedCount + 1;
    
    if ( connectedCount <= 1 )
    {

     checkForAdminAndAddtab();
    if ( groupTypeToJoin == 'archive' )
    {
        showChatArchive(groupNameToJoin, groupDescription, groupVideoUrl, groupSponsorUrl)
    }
    else
    {
        joinChatRoom(groupNameToJoin, groupDescription, groupTypeToJoin, groupVideoUrl, groupSponsorUrl);
    }
    
    }else{reJoinAllOpenRooms();}
/*   get/setup roster */
/*  iq = new JSJaCIQ();
  iq.setIQ(null,null,'get','roster_1');
  iq.setQuery('jabber:iq:roster');
  con.send(iq,getRoster); // cascading information retrieval
*/
}

/* *** cascading onconnect handlers *** */
function getRoster(iq) {
  if (!iq || iq.getType() != 'result') {
    if (iq)
      Debug.log("Error fetching roster:\n"+iq.getDoc().xml,1);
    else
      Debug.log("Error fetching roster",1);
    return;
  }


  Debug.log("got roster:\n"+iq.getDoc().xml,2);

  /*roster = new Roster(iq.getQuery().childNodes,null);
  roster.usersHidden = usersHidden;
  roster.nick = jid.substring(0,jid.indexOf('@')); // remember nick for 1:1 Chats
*/
  // get saved state
  iq = new JSJaCIQ();
  iq.setIQ(null,null,'get','jwchat_state');
  var query = iq.setQuery('jabber:iq:private');
  query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:state');
  con.send(iq,getSavedState);

}

function getSavedState(iq) {
  if (!iq || iq.getType() != 'result')
    if (iq)
      Debug.log("Error retrieving saved state:\n"+iq.getDoc().xml,1);
    else
      Debug.log("Error retrieving saved state",1);

  if (iq && iq.getType() == 'result') {
    Debug.log(iq.getDoc().xml,3);
    var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
    for (var i=0; i<jNode.childNodes.length; i++) {
      var item = jNode.childNodes.item(i);
      if (item.nodeName == 'presence' && item.firstChild && onlstat == '')
	onlstat = item.firstChild.nodeValue;
      if (item.nodeName == 'onlmsg' && item.firstChild && onlmsg == '')
	onlmsg = item.firstChild.nodeValue;
      if (item.nodeName == 'hiddenGroups' && item.firstChild) {
	var hiddenGroups = item.firstChild.nodeValue.split(',');
	for (var j=0; j<hiddenGroups.length; j++)
	  if (hiddenGroups[j] != '')
	    roster.hiddenGroups[hiddenGroups[j]] = true;
      }
    }
  }

  // get prefs
  iq = new JSJaCIQ();
  iq.setIQ(null,null,'get','jwchat_prefs');
  var query = iq.setQuery('jabber:iq:private');
  query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:prefs');

  con.send(iq,getPrefs);
}

function getPrefs(iq) {
  if (!iq || iq.getType() != 'result')
    if (iq)
      Debug.log("Error retrieving preferences:\n"+iq.getDoc().xml,1);
    else
      Debug.log("Error retrieving preferences",1);

  if (iq && iq.getType() == 'result') {
    Debug.log(iq.getDoc().xml,3);
    if (iq.getNode().getElementsByTagName('jwchat').item(0)) {
      var jNode = iq.getNode().getElementsByTagName('jwchat').item(0);
      for (var i=0; i<jNode.childNodes.length; i++) {
	switch (jNode.childNodes.item(i).nodeName) {
	case 'usersHidden':
	  if (eval(jNode.childNodes.item(i).firstChild.nodeValue) != usersHidden)
	    roster.toggleHide();
	  break;
	case 'timerval':
	  timerval = eval(jNode.childNodes.item(i).firstChild.nodeValue);
	  con.setPollInterval(timerval);
	  break;
	case 'autoPopup':
	  autoPopup = eval(jNode.childNodes.item(i).firstChild.nodeValue);
	  break;
	case 'autoPopupAway':
	  autoPopupAway = eval(jNode.childNodes.item(i).firstChild.nodeValue);
	  break;
	case 'playSounds':
	  playSounds = eval(jNode.childNodes.item(i).firstChild.nodeValue);
	  break;
	case 'focusWindows':
	  focusWindows = eval(jNode.childNodes.item(i).firstChild.nodeValue);
	  break;
	case 'timestamps':
	  timestamps = eval(jNode.childNodes.item(i).firstChild.nodeValue);
	  break;
	case 'enableLog':
	  enableLog = eval(jNode.childNodes.item(i).firstChild.nodeValue);
	  break;
	}
      }
    }
  }

  // print roster
  roster.print();

  if (opener.prio)
    onlprio = opener.prio;
  else
    onlprio = DEFAULTPRIORITY;

  // send presence
  if (onlstat == '')
    onlstat = 'available';
  changeStatus(onlstat,onlmsg,onlprio);

  playSound('connected');

  // Start Service Discovery
  iq = new JSJaCIQ();
  iq.setIQ(con.domain,null,'get','disco_item_1');
  iq.setQuery('http://jabber.org/protocol/disco#items');

  con.send(iq,getDiscoItems);

  // get bookmarks
  iq = new JSJaCIQ();
  iq.setIQ(null,null,'get','storage_bookmarks');
  var query = iq.setQuery('jabber:iq:private');
  query.appendChild(iq.getDoc().createElement('storage')).setAttribute('xmlns','storage:bookmarks');

  con.send(iq,getBookmarks);

  // get annotations
  iq = new JSJaCIQ();
  iq.setIQ(null,null,'get','jwchat_notes');
  var query = iq.setQuery('jabber:iq:private');
  query.appendChild(iq.getDoc().createElement('storage')).setAttribute('xmlns','storage:rosternotes');

  con.send(iq,getAnnotations);
}

function getDiscoItems(iq) {
  if (!iq)
    return;

  Debug.log(iq.getDoc().xml,2);

  disco = new Object();

  var items = iq.getNode().firstChild.childNodes;

  /* query items */
  for (var i=0; i<items.length; i++) {
    if (items[i].nodeName != 'item' || !items[i].getAttribute('jid') || items[i].getAttribute('node')!=null) // skip those
      continue;
    var aIQ = new JSJaCIQ();
    aIQ.setIQ(items[i].getAttribute('jid'),null,'get','disco_info_'+i);
    aIQ.setQuery("http://jabber.org/protocol/disco#info");

    con.send(aIQ,getDiscoInfo);
  }
}

function getDiscoInfo(iq) {
  if (!iq || iq.getType() != 'result')
    return;

  Debug.log(iq.getDoc().xml,2);
  if (iq.getType() == 'result') {
    disco[iq.getFrom()] = iq;

    // If the identity does not have a name, set the name to jid
    if(iq.getNode().getElementsByTagName('identity').item(0).getAttribute('name') == null)
      iq.getNode().getElementsByTagName('identity').item(0).setAttribute('name', iq.getFrom());

    // set loghost
    if (iq.getNode().getElementsByTagName('identity').item(0)) {
      if (iq.getNode().getElementsByTagName('identity').item(0).getAttribute('type') == 'archive') {
	for (var j=0; j<iq.getNode().getElementsByTagName('feature').length; j++) {
	  if (iq.getNode().getElementsByTagName('feature').item(j).getAttribute('var') == 'http://jabber.org/protocol/archive') {
	    loghost = iq.getFrom();
	    break;
	  }
	}
      }
    }
  }
}

var bookmarks;
function getBookmarks(iq) {
  if (!iq || iq.getType() != 'result')
    return;

  Debug.log(iq.getDoc().xml,2);

  bookmarks = new Array();

  if (iq.getNode().getElementsByTagName('storage').item(0)) {
    var jNode = iq.getNode().getElementsByTagName('storage').item(0);
    for (var i=0; i<jNode.childNodes.length; i++) {
      var item = jNode.childNodes.item(i);
      if (item.nodeName == 'conference') {
	var bookmark = new Object();
	bookmark.jid = item.getAttribute('jid');
	bookmark.name = item.getAttribute('name');
	if (item.getAttribute('autojoin') == '1')
	  bookmark.autojoin = '1';
	if (item.getElementsByTagName('nick').item(0))
	  bookmark.nick = item.getElementsByTagName('nick').item(0).firstChild.nodeValue;
	if (item.getElementsByTagName('pass').item(0))
	  bookmark.pass = item.getElementsByTagName('pass').item(0).firstChild.nodeValue;
	bookmarks[bookmarks.length] = bookmark;
	if (bookmark.autojoin == '1') {
	  openGroupchat(bookmark.jid, bookmark.nick, bookmark.pass);
	}
      }
    }
  }
}

var annotations;
function getAnnotations(iq) {
  if (!iq || iq.getType() != 'result')
    return;

  Debug.log(iq.getDoc().xml,2);

  annotations = new Object();

  if (iq.getType() == 'result') {
    if (iq.getNode().getElementsByTagName('storage').item(0)) {
      var jNode = iq.getNode().getElementsByTagName('storage').item(0);
      for (var i=0; i<jNode.childNodes.length; i++)
	if (jNode.childNodes.item(i).nodeName == 'note' && jNode.childNodes.item(i).firstChild)
	  annotations[jNode.childNodes.item(i).getAttribute('jid')] = jNode.childNodes.item(i).firstChild.nodeValue;
    }
  }
}


/************************************************************************
 *                       ******  END HANDLERS  *******
 ************************************************************************
 */

function isGateway(aJid) {
  aJid = cutResource(aJid);
  for (var i in disco) {
    if (!disco[i].getNode) continue;
    if (i == aJid)
      if (disco[i].getNode().getElementsByTagName('identity').item(0)) {
	if (disco[i].getNode().getElementsByTagName('identity').item(0).getAttribute('category') == 'gateway')
	  return true;
      }
  }
  return false;
}
function BuildVayuNscMsg(type,status,body,amsg,amsgid)
{
var d = new Date()	
    amsg.setType('groupchat');
	amsg.setBody(body);
	var aNode = amsg.getNode().appendChild(amsg.getDoc().createElement('x'));
 		aNode.setAttribute('xmlns','jabber:x:vayunsc');
 		aNode.setAttribute('type',type);
 		aNode.setAttribute('status',status);
 	if (type == 'question' && status == 'queue') {
 		aNode.setAttribute('msgid',gnick +'_'+ d.getTime());
 		}
 	else if (type == 'question' && (status == 'approved' || status == 'deleted' || status == 'approveddeleted')) 
 	{
 		aNode.setAttribute('msgid',amsgid);
 	}	
 	else if ( type == 'answer' && (status == 'question' || status == 'answer') ) 
 	    {
 		aNode.setAttribute('msgid',amsgid);
 	    }	
 		return;
}

function PostQuestion(room, body)
{
	  if (body == '') // don't send empty message
    return false;
	var aMessage = new JSJaCMessage();
	aMessage.setTo(room+"@"+config_conferenceServer);
	BuildVayuNscMsg('question','queue',body,aMessage,'');
	con.send(aMessage);
	return false;
}


function PostApprovedQuestion(room, body,questionId)
{
	  if (body == '') // don't send empty message
    return false;
	var aMessage = new JSJaCMessage();
	aMessage.setTo(room+"@"+config_conferenceServer);
	BuildVayuNscMsg('question','approved',body,aMessage,questionId);
	con.send(aMessage);
	return false;
}

function PostDeletedQuestion(room, body,questionId)
{
	  if (body == '') // don't send empty message
    return false;
	var aMessage = new JSJaCMessage();
	aMessage.setTo(room+"@"+config_conferenceServer);
	BuildVayuNscMsg('question','deleted',body,aMessage,questionId);
	con.send(aMessage);
	return false;
}

function PostApprovedDeletedQuestion(room, body,questionId)
{
	if (body == '') // don't send empty message
    return false;
	var aMessage = new JSJaCMessage();
	aMessage.setTo(room+"@"+config_conferenceServer);
	BuildVayuNscMsg('question','approveddeleted',body,aMessage,questionId);
	con.send(aMessage);
	return false;
}

function PostAnswer(room, body,questionId)
{
  if (body == '') // don't send empty message
    return false;
	var aMessage = new JSJaCMessage();
	aMessage.setTo(room+"@"+config_conferenceServer);
	BuildVayuNscMsg('answer','answer',body,aMessage,questionId);
	con.send(aMessage);
	return false;
}

function PostQuestionBeforeAnswer(room, body,questionId)
{
  if (body == '') // don't send empty message
    return false;
	var aMessage = new JSJaCMessage();
	aMessage.setTo(room+"@"+config_conferenceServer);
	BuildVayuNscMsg('answer','question',body,aMessage,questionId);
	con.send(aMessage);
	return false;
}



function PostMessage(room, body){
  if (body == '') // don't send empty message
    return false;

	var aMessage = new JSJaCMessage();
	aMessage.setTo(room+"@"+config_conferenceServer);
    aMessage.setType('groupchat');
	aMessage.setBody(body);
    con.send(aMessage);
    //alert(aMessage+" - "+room+" - "+body+" - "+config_conferenceServer);
    return false;
  }

function PostOneToOneMessage(to, body){
  if (body == '') // don't send empty message
    return false;

	var aMessage = new JSJaCMessage();
	aMessage.setTo(to+"@"+config_XMPPServer+"/"+config_XMPPResource);
	aMessage.setFrom(config_userJID+"@"+config_XMPPServer+"/"+config_XMPPResource);
    aMessage.setType('chat');
	aMessage.setBody(body);	
    con.send(aMessage);
    
    return false;
  }
function SendAffiliationRequest(aJid,nick,pass)
{
   jid = aJid;
   group = jid;

   if (typeof(nick) != 'undefined')
       nick = nick;
   if(nick == 'undefined' || nick == '')
       nick = nick; // guess a nick
   gnick=nick;

    meRegExp = new RegExp("\\b("+nick+")\\b","i");
    notHREFMeRegExp = new RegExp("href=\"\\S*\\b"+nick+"\\b\\S*\"","i");

   if (pass != 'undefined')
       pass = pass;

   var aPresence = new JSJaCPresence();
   aPresence.setTo(group+'/'+nick);

   var x = aPresence.getDoc().createElement('x');
   x.setAttribute('xmlns','http://jabber.org/protocol/muc');
   if (typeof(pass) != 'undefined' && pass != '')
      x.appendChild(aPresence.getDoc().createElement('password')).appendChild(aPresence.getDoc().createTextNode(pass));

   aPresence.getNode().appendChild(x);
   con.send(aPresence,Getaffiliation);
}

function Getaffiliation(presence)
{
    //  Debug.log(presence.getDoc().xml,2);
    //alert(presence.getDoc().xml);
    var from = cutResource(presence.getFrom());
    var type = presence.getType();
    var x;
    var roomAffiliation = 'none';
    if (type == 'error')
    {
        if (presence.getNode().getElementsByTagName('error').item(0)) 
        {
            var error = presence.getNode().getElementsByTagName('error').item(0);
	        if (error.getAttribute('code') == '407')
	        {
                alert(msgScheduleRoom);
	            return;
	        }
	        else if (error.getAttribute('code') == '503')
	        {
                alert("This room is full. Please try some other room.");
	            return;
	        }
	        else if (error.getAttribute('code') == '403')
	        {
                alert(msgBannedRoom);
	            return;
	        }
	     }
    } 
    for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++)
    {
        if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') {
            x = presence.getNode().getElementsByTagName('x').item(i);
            break;
        }
    }

    if (x) {
        var ofrom = presence.getFrom().substring(presence.getFrom().indexOf('/')+1);
        //  Debug.log("jabber.from:"+presence.getFrom()+", ofrom:"+ofrom,3);
        var item = x.getElementsByTagName('item').item(0);
        affiliation = item.getAttribute('affiliation');
        //   alert('aaa'+ return affiliation);
        roomAffiliation = affiliation;
    }
    addNewChatRoomTab(groupNameToJoin, groupDescription, roomAffiliation, groupTypeToJoin, groupVideoUrl, groupSponsorUrl);
 }
 
 
 
 //Copyright (c) 2006-2007 Vayusphere, Inc. All rights reserved.
//
// This file contains proprietary information.  It is the
// unpublished property of Vayusphere. Use, disclosure,
// or reproduction is prohibited except as permitted by express
// written license agreement with Vayusphere.


function getArgs(){
  passedArgs=new Array();
  search = self.location.href;
  search = search.split('?');
  if(search.length>1){
    argList = search[1];
    argList = argList.split('&');
    for(var i=0; i<argList.length; i++){
      newArg = argList[i];
      newArg = argList[i].split('=');
      passedArgs[unescape(newArg[0])] = unescape(newArg[1]);
    }
  }
}

function cutResource(aJID) { // removes resource from a given jid
  if (typeof(aJID) == 'undefined' || !aJID)
    return;
  var retval = aJID;
  if (retval.indexOf("/") != -1)
    retval = retval.substring(0,retval.indexOf("/"));
  return retval;
}

function cutNickResource(aJID) { // removes resource from a given jid
  if (typeof(aJID) == 'undefined' || !aJID)
      return;
  var retval = aJID;
  if (retval.indexOf("/") != -1)
      retval = retval.substring(retval.lastIndexOf("/") + 1, retval.length);
  return retval;
}

function msgEscape(msg) {
  if (typeof(msg) == 'undefined' || !msg || msg == '')
    return;

  msg = msg.replace(/%/g,"%25"); // must be done first

  msg = msg.replace(/\n/g,"%0A");
  msg = msg.replace(/\r/g,"%0D");
  msg = msg.replace(/ /g,"%20");
  msg = msg.replace(/\"/g,"%22");
  msg = msg.replace(/#/g,"%23");
  msg = msg.replace(/\$/g,"%24");
  msg = msg.replace(/&/g,"%26");
  msg = msg.replace(/\(/g,"%28");
  msg = msg.replace(/\)/g,"%29");
  msg = msg.replace(/\+/g,"%2B");
  msg = msg.replace(/,/g,"%2C");
  msg = msg.replace(/\//g,"%2F");
  msg = msg.replace(/\:/g,"%3A");
  msg = msg.replace(/\;/g,"%3B");
  msg = msg.replace(/</g,"%3C");
  msg = msg.replace(/=/g,"%3D");
  msg = msg.replace(/>/g,"%3E");
  msg = msg.replace(/@/g,"%40");

  return msg;
}

// fucking IE is too stupid for window names
function makeWindowName(wName) {
  wName = wName.replace(/@/,"at");
  wName = wName.replace(/\./g,"dot");
  wName = wName.replace(/\//g,"slash");
  wName = wName.replace(/&/g,"amp");
  wName = wName.replace(/\'/g,"tick");
  wName = wName.replace(/=/g,"equals");
  wName = wName.replace(/#/g,"pound");
  wName = wName.replace(/:/g,"colon");	
  wName = wName.replace(/%/g,"percent");
  wName = wName.replace(/-/g,"dash");
  wName = wName.replace(/ /g,"blank");
  wName = wName.replace(/\*/g,"asterix");
  return wName;
}

function htmlEnc(str) {
  if (!str)
    return '';

  str = str.replace(/&/g,"&amp;");
  str = str.replace(/</g,"&lt;");
  str = str.replace(/>/g,"&gt;");
  str = str.replace(/\"/g,"&quot;");
  return str;
}

function msgFormat(msg) { // replaces emoticons and urls in a message
  if (!msg)
    return null;

  msg = htmlEnc(msg);

  if (typeof(emoticons) != 'undefined') {
    for (var i in emoticons) {
      var iq = i.replace(/\\/g, '');
      var emo = new Image();
      emo.src = emoticonpath+emoticons[i];
      if (emo.width > 0 && emo.height > 0)
	msg = msg.replace(eval("/\(\\s\|\^\)"+i+"\(\\s|\$\)/g"),"$1<img src=\""+emo.src+"\" width='"+emo.width+"' height='"+emo.height+"' alt=\""+iq+"\" title=\""+iq+"\">$2");
      else
	msg = msg.replace(eval("/\(\\s\|\^\)"+i+"\(\\s|\$\)/g"),"$1<img src=\""+emo.src+"\" alt=\""+iq+"\" title=\""+iq+"\">$2");
    }
  }
	
  // replace http://<url>
  msg = msg.replace(/(\s|^)(https?:\/\/\S+)/gi,"$1<a href=\"$2\" target=\"_blank\">$2</a>");
  
  // replace ftp://<url>
  msg = msg.replace(/(\s|^)(ftp:\/\/\S+)/gi,"$1<a href=\"$2\" target=\"_blank\">$2</a>");
  
  // replace mail-links
  msg = msg.replace(/(\s|^)(\w+\@\S+\.\S+)/g,"$1<a href=\"mailto:$2\">$2</a>");
  
  // replace *<pattern>*
  msg = msg.replace(/(\s|^)\*([^\*\r\n]+)\*/g,"$1<b>\$2\</b>");
  
  // replace _bla_ 
  msg = msg.replace(/(\s|^)\_([^\*\r\n]+)\_/g,"$1<u>$2</u>");

  msg = msg.replace(/\n/g,"<br>");

  return msg;
}

/* isValidJID
 * checks whether jid is valid
 */
var prohibited = ['"',' ','&','\'','/',':','<','>','@']; // invalid chars
function isValidJID(jid) {
  var nodeprep = jid.substring(0,jid.lastIndexOf('@')); // node name (string before the @)

  for (var i=0; i<prohibited.length; i++) {
    if (nodeprep.indexOf(prohibited[i]) != -1) {
        window.location = errorPage + "Invalid Username. ["+prohibited[i]+"] not allowed in Username." + 
            "&uname=" + config_userJID + 
            "&groupnametojoin=" + groupNameToJoin + 
            "&groupdescription=" + groupDescription + 
            "&grouptype=" + groupTypeToJoin + 
            "&videoUrl=" + groupVideoUrl;      
      return false;
    }
  }
  return true;
}

/* jab2date
 * converts from jabber timestamps to javascript date objects
 */
function jab2date(ts) {
  var date = new Date(Date.UTC(ts.substr(0,4),ts.substr(5,2)-1,ts.substr(8,2),ts.substr(11,2),ts.substr(14,2),ts.substr(17,2)));
  if (ts.substr(ts.length-6,1) != 'Z') { // there's an offset
    var offset = new Date();
    offset.setTime(0);
    offset.setUTCHours(ts.substr(ts.length-5,2));
    offset.setUTCMinutes(ts.substr(ts.length-2,2));
    if (ts.substr(ts.length-6,1) == '+')
      date.setTime(date.getTime() - offset.getTime());
		else if (ts.substr(ts.length-6,1) == '-')
		  date.setTime(date.getTime() + offset.getTime());
  }
  return date;
}

/* hrTime - human readable Time
 * takes a timestamp in the form of 2004-08-13T12:07:04±02:00 as argument
 * and converts it to some sort of humane readable format
 */
function hrTime(ts) {
  return jab2date(ts).toLocaleString();
}

/* jabberDate
 * somewhat opposit to hrTime (see above)
 * expects a javascript Date object as parameter and returns a jabber 
 * date string conforming to JEP-0082
 */
function jabberDate(date) {
  if (!date.getUTCFullYear)
    return;
  
  var jDate = date.getUTCFullYear() + "-";
  jDate += (((date.getUTCMonth()+1) < 10)? "0" : "") + (date.getUTCMonth()+1) + "-";
  jDate += ((date.getUTCDate() < 10)? "0" : "") + date.getUTCDate() + "T";
  
  jDate += ((date.getUTCHours()<10)? "0" : "") + date.getUTCHours() + ":";
  jDate += ((date.getUTCMinutes()<10)? "0" : "") + date.getUTCMinutes() + ":";
  jDate += ((date.getUTCSeconds()<10)? "0" : "") + date.getUTCSeconds() + "Z";
  
  return jDate;
}

 
 
 /* *** *** *** *** *** *** *** *** ***
 * this code is taken from http://webfx.eae.net/dhtml/xmlextras/xmlextras.html 
 * *** *** *** *** *** *** *** *** ***
 */

//<script>
//////////////////
// Helper Stuff //
//////////////////

// used to find the Automation server name
function getDomDocumentPrefix() {
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

//////////////////////////
// Start the Real stuff //
//////////////////////////


// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
			
			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Your browser does not support XmlHttp objects");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function (name,ns) {
	name = name || "";
	ns = ns || "";
	try {
		var doc;
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			doc = document.implementation.createDocument("", "", null);
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}
		}
		if (window.ActiveXObject)
			doc = new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");

		try { 
			if (ns != '')
				doc.appendChild(doc.createElement(name)).setAttribute('xmlns',ns);
			else
				doc.appendChild(doc.createElement(name));
		} catch (dex) { 
			doc = document.implementation.createDocument(ns,name,null);
			
			if (doc.documentElement == null)
				doc.appendChild(doc.createElement(name));

			if (ns != '' && 
			    doc.documentElement.getAttribute('xmlns') != ns) // fixes buggy opera 8.5x
				doc.documentElement.setAttribute('xmlns',ns);
		}

		return doc;
	}
	catch (ex) { }
	throw new Error("Your browser does not support XmlDocument objects");
};

// Create the loadXML method 
if (typeof(Document) != 'undefined' && window.DOMParser) {

	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	//XMLDocument.prototype.loadXML = 
	Document.prototype.loadXML = function (s) {
		
		// parse the string to a new doc	
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		
		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
			
		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
}

// Create xml getter for Mozilla
/* IMPORTANT NOTE
 * Usage of this .xml getter method is deprecated 
 */
if (window.XMLSerializer &&
		window.Node && Node.prototype && Node.prototype.__defineGetter__) {
	
	/*
	 * xml getter
	 *
	 * This serializes the DOM tree to an XML String
	 *
	 * Usage: var sXml = oNode.xml
	 *
	 */
	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
 	XMLDocument.prototype.__defineGetter__("xml", function () {
																					 return (new XMLSerializer()).serializeToString(this);
																				 });
	Document.prototype.__defineGetter__("xml", function () {
																				return (new XMLSerializer()).serializeToString(this);
																			});
	
	/* doesn't work correctly in mozi, does it?  */
 	Node.prototype.__defineGetter__("xml", function () {
																		return (new XMLSerializer()).serializeToString(this);
																	});
}


//Copyright (c) 2006-2007 Vayusphere, Inc. All rights reserved.
//
// This file contains proprietary information.  It is the
// unpublished property of Vayusphere. Use, disclosure,
// or reproduction is prohibited except as permitted by express
// written license agreement with Vayusphere.


var DEBUGGER_MAX_LEVEL = 4;

// fucking IE is too stupid for window names
function encWN(wName) {
	wName = wName.replace(/@/,"at");
	wName = wName.replace(/\./g,"dot");
	wName = wName.replace(/\//g,"slash");
	wName = wName.replace(/&/g,"amp");
	wName = wName.replace(/\'/g,"tick");
	wName = wName.replace(/=/g,"equals");
	wName = wName.replace(/#/g,"pound");
	wName = wName.replace(/:/g,"colon");	
	wName = wName.replace(/%/g,"percent");
	wName = wName.replace(/-/g,"dash");
	wName = wName.replace(/ /g,"blank");
	return wName;
}

function htmlEnc(str) {
	if (!str || typeof(str) != 'string')
		return null;

	str = str.replace(/&/g,"&amp;");
	str = str.replace(/</g,"&lt;");
	str = str.replace(/>/g,"&gt;");
	str = str.replace(/\n/g,"<br>");
	return str;
}

function DebugMsg(str,lvl,caller) {
	this.str = str || '';
	this.str = htmlEnc(this.str);
	this.lvl = lvl || 0;
	this.caller = (caller&&caller.name)? caller.name : 'unknown';
}

function DebugLog(str,lvl) {
	if (!this.debug) // nothing to do
		return;

	lvl = (isNaN(lvl))? 0 : lvl;
	if (!this.debugW.oDbg || this.debugW.oDbg != this)
	this.debugW.oDbg = this;
  
	this.debugMsgs = this.debugMsgs.concat(new DebugMsg(str,lvl,DebugLog.caller));
  
	if (!this.debugW || 
	    !this.debugW.popMsgs || 
	    (this.debugW.document && 
	     this.debugW.document.readyState && 
	     this.debugW.document.readyState!='complete'))
		return; // debugW not ready yet ... only queue message
  
	this.debugW.popMsgs();
}

function DebugSetLevel(lvl) {
	if (lvl < 0)
		lvl = 0;
	if (lvl > DEBUGGER_MAX_LEVEL)
		lvl = DEBUGGER_MAX_LEVEL;
	this.lvl = lvl;
}

function DebugStart() {
	if (!this.debugW || this.debugW.closed) { // open the debugger window
		debugW = window.open('','debugW'+encWN(this.id),"width=480,height=320,scrollbars=yes,resizable=yes");
		if (!debugW)
			debugW = window.open("Debugger.html","debugW"+encWN(this.id),"width=480,height=320,scrollbars=yes,resizable=yes");
		else if (!debugW.location.href.match(/Debugger.html$/))
			debugW.location.href = "Debugger.html";
      
    
		this.debugW = debugW;
    
		if (!this.debugW)
			return;
    
		if (!this.debugW.oDbg)
			this.debugW.oDbg = this;
	} else {
		this.debugW.frames['DebugTop'].document.getElementById('toggleLogButton').innerHTML = 'Stop';
	}
  
	this.debug = true;
}

function DebugStop() {
	this.debug = false;
}

function Debugger(lvl,id) {
	this.lvl = lvl || 0;
	if (this.lvl > DEBUGGER_MAX_LEVEL)
		this.lvl = DEBUGGER_MAX_LEVEL;

	this.id = id || '';

	this.debugMsgs = new Array();

	this.log = DebugLog;
	this.setLevel = DebugSetLevel;
	this.start = DebugStart;
	this.stop = DebugStop;
}

function QueryRoomStatus(roomName)
{
// <iq id="jcl_52" to="myshiva@conference.jabber.org" type="get"><query xmlns="http://jabber.org/protocol/muc#owner"/></iq>   -->
    var aIQ = new JSJaCIQ();
	aIQ.setType('get');
	aIQ.setTo(roomName+"@"+config_conferenceServer);
	aIQ.setQuery('http://jabber.org/protocol/muc#owner');	
	con.send(aIQ, QueryRoomStatus_CallBack);

}
function QueryRoomStatus_CallBack(iq)
{
    
    var x;
    var roomName = iq.getFrom();
    roomName = roomName.substring(0, roomName.indexOf("@"));
    
    var list = iq.getNode().getElementsByTagName('field');
  for (var i=0; i<list.length; i++)
  {
    if (list[i].getAttribute('var') == 'muc#roomconfig_membersonly') {        
        x = list[i].firstChild.firstChild.nodeValue;
        break;
    }
  }
  updateRoomStatus(roomName, (x != '0'));
  
}

function reJoinAllOpenRooms()
{
    var tabCount = tabs.getCount();
    for (var index = 1; index < tabCount; index++)
    {
        tab = tabs.getTab(index);
        var roomType = tab.id.substring(0, 3);
        if ( roomType == "opn" || roomType == "adm" || roomType == "cel" || roomType == "usr" )
        {   
            roomName = tab.id.substring(3, tab.id.length); 
            try
            {
                
                if (roomType == 'opn' )
                {
                        document.getElementById("div"+roomName+"chat").innerHTML = "";
                }
                else if (roomType == 'adm' )
                {
                    document.getElementById("div"+roomName+"answer").innerHTML = "";
                    var list = document.getElementById("qus1"+roomName);        
                    for (i=0;i<list.options.length;i++)
                    {
                        list.options[i] = null;        
                    }
                    list = document.getElementById("qus2"+roomName);        
                    for (i=0;i<list.options.length;i++)
                    {
                        list.options[i] = null;        
                    }
                    document.getElementById("div"+roomName+"chat").innerHTML = "";
                 }       
                 else if (roomType == 'cel')
                 {
                    document.getElementById("div"+roomName+"answer").innerHTML = "";
                    var list = document.getElementById("qus1"+roomName);        
                    for (i=0;i<list.options.length;i++)
                    {
                        list.options[i] = null;        
                    }
                    list = document.getElementById("qus2"+roomName);        
                    for (i=0;i<list.options.length;i++)
                    {
                        list.options[i] = null;        
                    }
                    document.getElementById("div"+roomName+"chat").innerHTML = "";
                 }
                 else if (roomType == 'usr')
                 {
                    document.getElementById("div"+roomName+"answer").innerHTML = "";
                    document.getElementById("div"+roomName+"question").innerHTML = "";
                    document.getElementById("div"+roomName+"chat").innerHTML = "";
                 }
            }
            catch(e){}
            openGroupchat(roomName+'@'+config_conferenceServer,config_userJID,'');            
        }
     }
}
