function getElFromArrByProp(arr,prop,str) {
  for (var i=0; i<arr.length; i++) {
    if (arr[i][prop] == str)
      return arr[i];
  }
  return null;
}

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 cleanUp() {
	if (typeof(window.cid) != 'undefined') {
		var aIQ = new JSJaCIQ();
		aIQ.setType('set');
		aIQ.setTo(jwcMain.loghost);
		var aNode= aIQ.getNode().appendChild(aIQ.getDoc().createElement('done'));
		aNode.setAttribute('xmlns','http://jabber.org/protocol/archive');
		aNode.setAttribute('cid',window.cid);
		jwcMain.con.send(aIQ.clone());
	}
}
var roomlist = new Array(); 

function RosterUserAdd2Group(group) {
  this.groups = this.groups.concat(group);
}

function RosterUser(jid) {
	this.fulljid = jid;
    this.jid = cutResource(jid) || 'unknown';
    this.jid = this.jid.toLowerCase(); // jids are case insensitive
//    this.subscription = subscription || 'none';
  // initialise defaults
//  this.status = (this.subscription == 'from' || this.subscription == 'none') ? 'stalker' : 'unavailable';
}


  function RemoveUser(JID,r) 
  {
  	var uLen = r.users.length;
   	for (var i=0; i<uLen; i++) 
   	{
  		myUser =r.users[i]; 
    	if (myUser.fulljid == JID) 
    	{
     			r.users = r.users.slice(0,i).concat(r.users.slice(i+1,uLen));
      			break;
      	}		
    }
    return myUser;
  }

  function RemoveRoom(roomname) 
  {
  	var uLen = roomlist.length;
   	for (var i=0; i<uLen; i++) 
   	{
  		myRoom = roomlist[i]; 
    	if (myRoom.name == roomname) 
    	{
     		roomlist = roomlist.slice(0,i).concat(roomlist.slice(i+1,uLen));
      		break;
      	}		
    }
    return;
  }


function RosterUserAdd(JID,r) {
  rUser = new RosterUser(JID);
  r.users = r.users.concat(rUser);
  return r.users;
}

function RosterRemoveUser(user) {
  var uLen = this.users.length;
  for (var i=0; i<uLen; i++) {
    if (user == this.users[i]) {
      this.users = this.users.slice(0,i).concat(this.users.slice(i+1,uLen));
      break;
    }
  }
  this.updateGroups();
}


function GroupchatRosterUser(jid,name) {
  this.base = RosterUser;
  this.base(jid,'',[''],name);
  this.jid = this.fulljid; // always use fulljid
  this.affiliation = 'none';
  this.role = 'none';
  this.add2Group = GroupchatRosterUserAdd2Group;
}
//GroupchatRosterUser.prototype = new RosterUser;
function getRosterGetRealJIDByNick(nick) {
	for (var i in this.users)
		if (this.users[i].name == nick)
			return this.users[i].realjid;
	return null;
}

function getRosterGetFullJIDByNick(nick) {
	for (var i in this.users)
		if (this.users[i].name == nick)
			return this.users[i].fulljid;
	return null;
}
			

function getGroupchatRosterUserByJID(users,JID) {
	// need to search fulljid here
	for (var z=0; z<users.length; z++) 
	{
		rosterUser = users[z];
	if 	(rosterUser)
		{	if (rosterUser.fulljid == JID)
      		return users[z];
    	}
    }
  return null;
}

function GroupchatRoster() {
  this.users = new Array();
  //this.base = Roster;
  //this.base(null);
  this.usersHidden = true;
  this.onlineusercount  = 0;
  this.name = 'GroupchatRoster';
  this.getUserByJID = getGroupchatRosterUserByJID;
  this.getRealJIDByNick = getRosterGetRealJIDByNick;
  this.getFullJIDByNick = getRosterGetFullJIDByNick;
}

function createroom(name) {
if (getroom(name))
	{
	  return r;	
	}
	else
	{
		MyRoom = new GroupchatRoster;	
		MyRoom.name = name;
		this.roomlist = roomlist.concat(MyRoom);
		return MyRoom;
	}
}
function getroom(name) 
{
	 for (var i=0; i<roomlist.length; i++) 
	 {
     	r = roomlist[i];
     	if (r) 
     		{
     			if (r.name == name) {return r;}	
     		}
     		else return null;
	} 
}

function GetOnlineCount(roomname)
{
  r = createroom(roomname);
  return r.users.length;
}		

function getUserList(roomname) 
{
r = createroom(roomname);
var aval = new Array (r.users.length);
for (var i=0; i < r.users.length; i++) 
    {
   	  aval[i] = r.users[i].fulljid;
   	} 
  	 
return aval;
} 

function AddOfflineUser(roomname,JID)
{
  r = createroom(roomname);
  user = RemoveUser(JID,r);
//if (user)
	//	alert(user.fulljid);
}		
function AddOnlineUser(roomname,JID)
{ 
	r = createroom(roomname);
	user = r.getUserByJID(r.users,JID);
if (user)
{ }
//	{alert(user.fulljid);}
else
{users = RosterUserAdd(JID,r);}
}


function GetRoomRosterHtml(roomName, isAdm)
{
list = getUserList(roomName);
var html = "<ol class='roomRosterList'>";
for(var roomIndex = 0; roomIndex < list.length; roomIndex++)
{
    buddyName = list[roomIndex].substring(0, list[roomIndex].indexOf("@"));
    if ( buddyName == config_nick )
        html += "<li>" + buddyName + "</li>";
    else if ( isAdm)
        html += "<li><a onClick=\"openOneToOneIMWindow('"+buddyName+"')\" title='Click to start private conversation'>" + buddyName + "</a>&nbsp<a onClick=\"kickUserFromRoom('"+roomName+"','"+buddyName+"')\" title='Kick' >[Kick]</a>&nbsp<a onClick=\"banUserFromRoom('"+roomName+"','"+buddyName+"')\" title='Ban' >[Ban]</a></li>";
    else
        html += "<li><a onClick=\"openOneToOneIMWindow('"+buddyName+"')\">" + buddyName + "</a></li>";
}
html += "</ol>"
return html;
}