<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -175,6 +175,8 @@ var contacts = {
         contact = cloneBlueprint('contact');
         contact.setAttribute('address', address);
         contact.setAttribute('account', account);
+        contact.setAttribute('availability', 'unavailable');
+        contact.getElementsByAttribute('role', 'name')[0].setAttribute('value', address);
         _('contact-list').appendChild(contact);
         return contact;
     },
@@ -206,28 +208,26 @@ var contacts = {
         _(contact, {role: 'pending'}).value = 0;
     },
 
-    contactExists: function(account, address, subscription, name) {
-        var contact = this.get(account, address) || this.add(account, address);;
-
-        if(!contact.hasAttribute('availability'))
-            contact.setAttribute('availability', 'unavailable');
+    contactChangedRelationship: function(account, address, subscription, name) {
+        var contact = this.get(account, address) || this.add(account, address);
 
-        if(subscription)
-            contact.setAttribute('subscription', subscription);
+        if(subscription) 
+            if(subscription == 'remove') {
+                _('contact-list').removeChild(contact);
+                return;
+            }
+            else
+                contact.setAttribute('subscription', subscription);
 
         var nameElement = contact.getElementsByAttribute('role', 'name')[0];
-
         if(name)
             nameElement.setAttribute('value', name);
-        else if(name == '' ||
-                !nameElement.hasAttribute('value'))
+        else if(name == '' || !nameElement.hasAttribute('value'))
             nameElement.setAttribute('value', address);
-
-        return contact;
     },
 
     resourceChangedPresence: function(account, address, resource, availability, show, status) {
-        var contact = this.contactExists(account, address);
+        var contact = this.get(account, address) || this.add(account, address);
 
         if(availability == undefined)
             availability = 'available';
@@ -896,9 +896,9 @@ var chatOutputDropObserver = {
     }
 };
 
-function requestedSetContactAlias() {
-    var account = attr(document.popupNode, 'account');
-    var address = attr(document.popupNode, 'address');
+function requestedSetContactAlias(element) {
+    var account = attr(element, 'account');
+    var address = attr(element, 'address');
     var alias = { value: '' };
 
     var confirm = prompts.prompt(
@@ -911,6 +911,16 @@ function requestedSetContactAlias() {
                   &lt;/query&gt;&lt;/iq&gt;);
 }
 
+function requestedRemoveContact(element) {
+    var account = attr(element, 'account');
+    var address = attr(element, 'address');
+
+    XMPP.send(account,
+              &lt;iq type=&quot;set&quot;&gt;&lt;query xmlns=&quot;jabber:iq:roster&quot;&gt;
+              &lt;item jid={address} subscription=&quot;remove&quot;/&gt;
+              &lt;/query&gt;&lt;/iq&gt;);
+}
+
 function focusedConversation(account, address) {
     contacts.nowTalkingWith(account, address);
 }
@@ -1247,7 +1257,7 @@ function receivedRoomTopic(message) {
 
 function receivedRoster(iq) {
     for each(var item in iq.stanza..ns_roster::item) {
-        contacts.contactExists(
+        contacts.contactChangedRelationship(
             iq.session.name,
             item.@jid,
             item.@subscription,</diff>
      <filename>chrome/content/sameplace.js</filename>
    </modified>
    <modified>
      <diff>@@ -37,7 +37,8 @@
   &lt;popupset&gt;
     &lt;popup id=&quot;message-menu&quot;/&gt;
     &lt;popup id=&quot;contact-menu&quot;&gt;
-      &lt;menuitem label=&quot;Set Alias...&quot; oncommand=&quot;requestedSetContactAlias();&quot;/&gt;
+      &lt;menuitem label=&quot;Set Alias...&quot; oncommand=&quot;requestedSetContactAlias(document.popupNode);&quot;/&gt;
+      &lt;menuitem label=&quot;Remove&quot; oncommand=&quot;requestedRemoveContact(document.popupNode);&quot;/&gt;
     &lt;/popup&gt;
   &lt;/popupset&gt;
 </diff>
      <filename>chrome/content/sameplace.xul</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,5 @@
 
 Context:
 
-[Service: splitted presence cache in cache of incoming presences and cache of outgoing presences.
-Massimiliano Mirra &lt;bard [at] hyperstruct [dot] net&gt;**20060909080035] 
-
-[Service: removed redundant presence synthesis on outbound unavailable presence (would happen anyway on outbound closed stream).
-Massimiliano Mirra &lt;bard [at] hyperstruct [dot] net&gt;**20060909075859] 
-
-[Showing away/dnd status for each account in account menu, and a summary of states in toolbarbutton.
-Massimiliano Mirra &lt;bard [at] hyperstruct [dot] net&gt;**20060908205612] 
-
-[TAG 0.2.16
-Massimiliano Mirra &lt;bard [at] hyperstruct [dot] net&gt;**20060908185839] 
+[TAG 0.2.17
+Massimiliano Mirra &lt;bard [at] hyperstruct [dot] net&gt;**20060909233609] </diff>
      <filename>dependency.xmpp4moz.context</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>6d998c5d6d0cae624f8d8979fbcd66788d9f6e9f</id>
    </parent>
  </parents>
  <author>
    <name>Massimiliano Mirra</name>
    <email>bard@hyperstruct.net</email>
  </author>
  <url>http://github.com/bard/sameplace/commit/2a3b71b7e7bd101e93646f6fd1789e5e572cb512</url>
  <id>2a3b71b7e7bd101e93646f6fd1789e5e572cb512</id>
  <committed-date>2006-09-09T16:37:08-07:00</committed-date>
  <authored-date>2006-09-09T16:37:08-07:00</authored-date>
  <message>Enabled contact removal; reacting to roster push of removed contacts; synched dependency with xmpp4moz.

darcs-hash:20060909233708-8cc29-73e8f28336b3e71bea1a0dd5431e393c55dbcb2b.gz</message>
  <tree>c09ff85f0709c1927830db3c664b7e40a84e18b6</tree>
  <committer>
    <name>Massimiliano Mirra</name>
    <email>bard@hyperstruct.net</email>
  </committer>
</commit>
