public ConverstationWindow(Contact c, JustTalk mainWind) {
            InitializeComponent();
			this.contact = c;
			mainWindow = mainWind;
			this.Text = contact.Name + " - JustTalk";
			username = Properties.Settings.Default.Username;
			// Initialize font, colors and size
			stringBuilder = new StringBuilder(@"{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}{\colortbl ;\red75\green100\blue165;\red155\green155\blue155;}\fs16");

			if(!contact.StatusMessage.Equals("Chat"))
				this.ReceiveMessage(contact.Name, contact.StatusMessage, 2);
			if(contact.Status != Status.chat)
				this.ReceiveMessage(contact.Name, messages[(int)contact.Status - 1], 2);
        }
		// Update contact's presence information
		public void UpdateContactPresence(String jid, Status status, String statusMessage) {
			try {
				Contact contact = contacts[jid];
				Contact previous = new Contact(contact);
				contact.Status = status;
				contact.StatusMessage = statusMessage;

				// Set context menu accordingly
				if(status != Status.inviteSent && status != Status.inviteAccepted)
					contact.ContextMenuStrip = this.contactsContextMenuStrip;
				else
					contact.ContextMenuStrip = this.pendingContactContextMenuStrip;

				if(conversations.ContainsKey(jid) && previous.Status != contact.Status)		// If a conversation window is opened update it
					conversations[jid].UpdateContactPresence(status, statusMessage);
			} catch (KeyNotFoundException ex) {
				Console.WriteLine("Contact not present " + ex.StackTrace);
			}
		}
		// Invokes a method to receive message in a conversation window, delegate is used for cross thread calls
		public void ReceiveMessage(JabberID from, string body) {
			Console.WriteLine("Gui received message from: " + from);
			if(!conversations.ContainsKey(from.User + "@" + from.Domain)) {		// Check if there is already open conversation window
				Contact c;
				if(contacts.ContainsKey(from.User + "@" + from.Domain))			// Check if sender is in Contact list
					c = contacts[from.User + "@" + from.Domain];
				else
					c = new Contact(from.User + "@" + from.Domain);
				conversations[from.User + "@" + from.Domain] = new ConverstationWindow(c, this);	// Open new conversation window
				conversations[from.User + "@" + from.Domain].Show();								// Show if new window
			} else {
				if(!conversations[from.User + "@" + from.Domain].Visible)
					conversations[from.User + "@" + from.Domain].Show();
				conversations[from.User + "@" + from.Domain].Activate();							// Just activate if already opened
			}
			conversations[from.User + "@" + from.Domain].ReceiveMessage(body);						// Receive message
		}
		// Update contact's information
		public void UpdateContact(String jid, String name, String group, Status status) {
			Console.WriteLine("Adding: " + jid + ", " + name+ ", " + group + ", " + status);

			// Find group
			Group groupNode;
			if(group == null)										// If no group is sent use default(0)
				groupNode = (Group)contactsTreeView.Nodes[0];
			else {															// Group is sent
				if(!contactsTreeView.Nodes.ContainsKey(group)) {			// If the group doesn't exists
					Group newGroup = new Group(group);
					newGroup.ContextMenuStrip = gropupContextMenuStrip;
					contactsTreeView.Nodes.Add(newGroup);					// Make one					
				}
				groupNode = (Group)contactsTreeView.Nodes[group];	// we have Group
			}

			// Find contact
			Contact contact;
			if(contacts.ContainsKey(jid)) {					// Such contact exists
				contact = contacts[jid];					// use it
				if(contact.Parent != groupNode) {			// We should change group
					contact.Remove();						// Remove from original
					groupNode.Nodes.Add(contact);			// Add to new
				}
			} else {
				contact = new Contact(jid);			// else make it
				contacts[jid] = contact;			// Put it in the dictionary

				// Set context menu
				if(status != Status.inviteSent && status != Status.inviteAccepted)
					contact.ContextMenuStrip = this.contactsContextMenuStrip;
				else
					contact.ContextMenuStrip = this.pendingContactContextMenuStrip;

				groupNode.Nodes.Add(contact);		// and add it to gui
			}			
			contact.Name = name;
			contact.Status = status;			
		}
		public Contact(Contact other) {
			this.JabberID = other.jabberID;
			this.Name = other.name;
			this.Status = other.status;
			this.StatusMessage = other.statusMessage;
		}