<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_help_left.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_help_left_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_help_middle.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_help_middle_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_help_right.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_help_right_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_test_left.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_test_left_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_test_middle.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_test_middle_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_test_right.png</filename>
    </added>
    <added>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_test_right_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_help_left.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_help_left_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_help_middle.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_help_middle_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_help_right.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_help_right_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_test_left.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_test_left_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_test_middle.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_test_middle_clicked.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_test_right.png</filename>
    </added>
    <added>
      <filename>Pingboard.wdgt/Images/button_test_right_clicked.png</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -45,16 +45,16 @@
 		&lt;real&gt;0.0&lt;/real&gt;
 		&lt;key&gt;sizes&lt;/key&gt;
 		&lt;array&gt;
-			&lt;string&gt;{{0, 0}, {1302, 257}}&lt;/string&gt;
-			&lt;string&gt;{{0, 267}, {1302, 627}}&lt;/string&gt;
+			&lt;string&gt;{{0, 0}, {846, 444}}&lt;/string&gt;
+			&lt;string&gt;{{0, 454}, {846, 254}}&lt;/string&gt;
 		&lt;/array&gt;
 	&lt;/dict&gt;
 	&lt;key&gt;ContentViewType&lt;/key&gt;
-	&lt;integer&gt;0&lt;/integer&gt;
+	&lt;integer&gt;5&lt;/integer&gt;
 	&lt;key&gt;Dashboard Widget Prefs&lt;/key&gt;
 	&lt;dict&gt;
 		&lt;key&gt;id&lt;/key&gt;
-		&lt;string&gt;f5ba8d4500b7ac41&lt;/string&gt;
+		&lt;string&gt;7902691d01b7ac41&lt;/string&gt;
 		&lt;key&gt;in-layer&lt;/key&gt;
 		&lt;true/&gt;
 		&lt;key&gt;path&lt;/key&gt;
@@ -64,15 +64,15 @@
 		&lt;key&gt;percent-offset-y&lt;/key&gt;
 		&lt;integer&gt;0&lt;/integer&gt;
 		&lt;key&gt;percent-type&lt;/key&gt;
-		&lt;integer&gt;3&lt;/integer&gt;
+		&lt;integer&gt;4&lt;/integer&gt;
 		&lt;key&gt;percent-x&lt;/key&gt;
-		&lt;real&gt;0.081874996423721313&lt;/real&gt;
+		&lt;real&gt;0.32249999046325684&lt;/real&gt;
 		&lt;key&gt;percent-y&lt;/key&gt;
-		&lt;real&gt;0.078333333134651184&lt;/real&gt;
+		&lt;real&gt;0.0099999997764825821&lt;/real&gt;
 		&lt;key&gt;pos-x&lt;/key&gt;
-		&lt;integer&gt;979&lt;/integer&gt;
+		&lt;integer&gt;516&lt;/integer&gt;
 		&lt;key&gt;pos-y&lt;/key&gt;
-		&lt;integer&gt;612&lt;/integer&gt;
+		&lt;integer&gt;694&lt;/integer&gt;
 		&lt;key&gt;rosetta&lt;/key&gt;
 		&lt;false/&gt;
 	&lt;/dict&gt;
@@ -99,12 +99,12 @@
 		&lt;real&gt;0.0&lt;/real&gt;
 		&lt;key&gt;sizes&lt;/key&gt;
 		&lt;array&gt;
-			&lt;string&gt;{{0, 0}, {244, 915}}&lt;/string&gt;
-			&lt;string&gt;{{245, 0}, {1303, 915}}&lt;/string&gt;
+			&lt;string&gt;{{0, 0}, {244, 729}}&lt;/string&gt;
+			&lt;string&gt;{{245, 0}, {847, 729}}&lt;/string&gt;
 		&lt;/array&gt;
 	&lt;/dict&gt;
 	&lt;key&gt;MainWindowFrame&lt;/key&gt;
-	&lt;string&gt;34 239 1547 936 0 0 1600 1178 &lt;/string&gt;
+	&lt;string&gt;135 361 1091 750 0 0 1600 1178 &lt;/string&gt;
 	&lt;key&gt;NavigatorSplitViewGeometry&lt;/key&gt;
 	&lt;dict&gt;
 		&lt;key&gt;ContentSplitViewConfig&lt;/key&gt;
@@ -119,8 +119,8 @@
 		&lt;real&gt;0.0&lt;/real&gt;
 		&lt;key&gt;sizes&lt;/key&gt;
 		&lt;array&gt;
-			&lt;string&gt;{{0, 0}, {246, 400}}&lt;/string&gt;
-			&lt;string&gt;{{0, 410}, {246, 484}}&lt;/string&gt;
+			&lt;string&gt;{{0, 0}, {246, 316}}&lt;/string&gt;
+			&lt;string&gt;{{0, 326}, {246, 382}}&lt;/string&gt;
 		&lt;/array&gt;
 	&lt;/dict&gt;
 	&lt;key&gt;Objects view expanded items&lt;/key&gt;
@@ -208,7 +208,11 @@
 		&lt;/array&gt;
 	&lt;/array&gt;
 	&lt;key&gt;Objects view last selections&lt;/key&gt;
-	&lt;array/&gt;
+	&lt;array&gt;
+		&lt;array&gt;
+			&lt;integer&gt;5&lt;/integer&gt;
+		&lt;/array&gt;
+	&lt;/array&gt;
 	&lt;key&gt;Opened Steps&lt;/key&gt;
 	&lt;array&gt;
 		&lt;integer&gt;0&lt;/integer&gt;
@@ -220,7 +224,7 @@
 	&lt;/array&gt;
 	&lt;key&gt;Visible StackLayout Views&lt;/key&gt;
 	&lt;array&gt;
-		&lt;string&gt;front&lt;/string&gt;
+		&lt;string&gt;back&lt;/string&gt;
 		&lt;string&gt;error_view&lt;/string&gt;
 	&lt;/array&gt;
 &lt;/dict&gt;</diff>
      <filename>Pingboard.dcproj/robertsanders.wdgtuser</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>Pingboard.wdgt/Default.png</filename>
    </modified>
    <modified>
      <diff>@@ -13,9 +13,9 @@
 	&lt;key&gt;CFBundleName&lt;/key&gt;
 	&lt;string&gt;Pingboard&lt;/string&gt;
 	&lt;key&gt;CFBundleShortVersionString&lt;/key&gt;
-	&lt;string&gt;0.4.3&lt;/string&gt;
+	&lt;string&gt;0.5&lt;/string&gt;
 	&lt;key&gt;CFBundleVersion&lt;/key&gt;
-	&lt;string&gt;0.4.3&lt;/string&gt;
+	&lt;string&gt;0.5&lt;/string&gt;
 	&lt;key&gt;CloseBoxInsetX&lt;/key&gt;
 	&lt;integer&gt;15&lt;/integer&gt;
 	&lt;key&gt;CloseBoxInsetY&lt;/key&gt;</diff>
      <filename>Pingboard.wdgt/Info.plist</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,8 @@ var dashcodePartSpecs = {
     &quot;ApiKeyTitle&quot;: { &quot;creationFunction&quot;: &quot;CreateText&quot;, &quot;text&quot;: &quot;GET YOUR KEY&quot; },
     &quot;button&quot;: { &quot;creationFunction&quot;: &quot;CreateButton&quot;, &quot;leftImageWidth&quot;: 5, &quot;onclick&quot;: &quot;showFront&quot;, &quot;rightImageWidth&quot;: 5, &quot;text&quot;: &quot;Done&quot; },
     &quot;button_getKey&quot;: { &quot;creationFunction&quot;: &quot;CreateButton&quot;, &quot;leftImageWidth&quot;: 5, &quot;onclick&quot;: &quot;openAppKeyPage&quot;, &quot;rightImageWidth&quot;: 5, &quot;text&quot;: &quot;Get Key&quot; },
-    &quot;button_getKey1&quot;: { &quot;creationFunction&quot;: &quot;CreateButton&quot;, &quot;leftImageWidth&quot;: 5, &quot;onclick&quot;: &quot;validateUser&quot;, &quot;rightImageWidth&quot;: 5, &quot;text&quot;: &quot;Test&quot; },
+    &quot;button_help&quot;: { &quot;creationFunction&quot;: &quot;CreateButton&quot;, &quot;leftImageWidth&quot;: 5, &quot;onclick&quot;: &quot;openHelp&quot;, &quot;rightImageWidth&quot;: 5, &quot;text&quot;: &quot;Help&quot; },
+    &quot;button_test&quot;: { &quot;creationFunction&quot;: &quot;CreateButton&quot;, &quot;leftImageWidth&quot;: 5, &quot;onclick&quot;: &quot;validateUser&quot;, &quot;rightImageWidth&quot;: 5, &quot;text&quot;: &quot;Test&quot; },
     &quot;character_count&quot;: { &quot;creationFunction&quot;: &quot;CreateText&quot;, &quot;text&quot;: &quot;0&quot; },
     &quot;done&quot;: { &quot;creationFunction&quot;: &quot;CreateGlassButton&quot;, &quot;onclick&quot;: &quot;configDone&quot;, &quot;text&quot;: &quot;Done&quot; },
     &quot;history_button&quot;: { &quot;creationFunction&quot;: &quot;CreateButton&quot;, &quot;leftImageWidth&quot;: 5, &quot;onclick&quot;: &quot;showLatestPosts&quot;, &quot;rightImageWidth&quot;: 5 },
@@ -24,5 +25,5 @@ var dashcodePartSpecs = {
     &quot;text&quot;: { &quot;creationFunction&quot;: &quot;CreateText&quot;, &quot;text&quot;: &quot;Error!&quot; },
     &quot;text2&quot;: { &quot;creationFunction&quot;: &quot;CreateText&quot;, &quot;text&quot;: &quot;/ 140&quot; },
     &quot;title&quot;: { &quot;creationFunction&quot;: &quot;CreateText&quot;, &quot;text&quot;: &quot;Pingboard&quot; },
-    &quot;version&quot;: { &quot;creationFunction&quot;: &quot;CreateText&quot; }
+    &quot;version&quot;: { &quot;creationFunction&quot;: &quot;CreateText&quot;, &quot;text&quot;: &quot;Ver x.y&quot; }
 };</diff>
      <filename>Pingboard.wdgt/Parts/setup.js</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,11 @@
  * Version: 0.3.1
  */
 
-var pingfm = {
+var PingFMAPI = function(api_key) {
+    this.api_key = api_key;
+};
+
+PingFMAPI.prototype = {
    // the base URL for the Ping.FM API
    baseurl: &quot;http://api.ping.fm/v1/&quot;,
    
@@ -32,7 +36,11 @@ var pingfm = {
    // should be a view object with showError, showResult, showNotice, log
    view: null,
 
-   // services information
+   // system services information
+   system_servicexml: null,
+   system_serviceinfo: [],
+
+   // user services information
    servicexml: null,
    serviceinfo: [],
 
@@ -49,6 +57,20 @@ var pingfm = {
    // wait this many milliseconds between user.post and user.latest - fixes race in ping.fm's API
    post_post_delay: 6000,
    
+   proxy_rewriter: null,
+   
+   initialize: function() {
+     this.downloadServiceData();
+   },
+   
+   downloadServiceData: function() {
+     this.log(&quot;downloading initial system data...&quot;);
+     this.getSystemServices(function(data) {
+            this.serviceinfo = data;
+        }
+      );
+   },
+   
    getBaseArgs: function() {
      return { 
          api_key: this.api_key, 
@@ -100,12 +122,17 @@ var pingfm = {
      }
    },
    
-   postMessage: function(body, method, title, success, failure) {
+   postMessage: function(body, method, title, success, failure, exclude) {
      var args = this.getBaseArgs();
      args.body = body;
      
      // default
      if (! method) method = this.post_method;
+     
+     // list of services to exclude
+     if (exclude &amp;&amp; exclude.length &gt; 0) {
+        args.exclude = exclude.join(&quot;,&quot;);
+     }
 
      // default posting API call; use user.tpost for custom triggers
      var apimethod = 'user.post';
@@ -170,9 +197,11 @@ var pingfm = {
    },
    
    log: function(msg) {
-     if (this.view &amp;&amp; this.view.log) this.view.log(msg);
-     if (this.debug)
+     if (this.view &amp;&amp; this.view.log) {
+        this.view.log(msg);
+     } else if (this.debug) {
         console.log(msg);
+     }
    },
    
    showError: function(error) {
@@ -437,6 +466,82 @@ var pingfm = {
       }
    },
 
+    /**
+        &lt;rsp status=&quot;OK&quot;&gt;
+          &lt;transaction&gt;48a87626afa41&lt;/transaction&gt;
+          &lt;method&gt;system.services&lt;/method&gt;
+          &lt;services&gt;
+            &lt;service id=&quot;bebo&quot; name=&quot;Bebo&quot;&gt;
+              &lt;trigger&gt;@be&lt;/trigger&gt;
+              &lt;url&gt;http://www.bebo.com/&lt;/url&gt;
+              &lt;icon&gt;http://p.ping.fm/static/icons/bebo.png&lt;/icon&gt;
+            &lt;/service&gt;
+            &lt;service id=&quot;blogger&quot; name=&quot;Blogger&quot;&gt;
+              &lt;trigger&gt;@bl&lt;/trigger&gt;
+              &lt;url&gt;http://www.blogger.com/&lt;/url&gt;
+              &lt;icon&gt;http://p.ping.fm/static/icons/blogger.png&lt;/icon&gt;
+            &lt;/service&gt;
+          &lt;/services&gt;
+        &lt;/rsp&gt;
+     */
+    /*
+
+        var obj = { name: elt[0], id: elt[1], trigger: elt[2],
+                    service_url: elt[3], icon_url: elt[4] };
+    } 
+    */
+
+   _parseSystemServices: function(list) {
+      var services = [];
+      jQuery('service', list).each(function(i) { 
+          var id = jQuery(this).attr('id');
+          var name = jQuery(this).attr('name');
+          var trigger = jQuery('trigger', this).text();
+          var icon_url = jQuery('icon', this).text();
+          var service_url = jQuery('url', this).text();
+
+          // in current API, 'methods' is not provided for system svcs
+          var methods = [];
+          var methodtext = jQuery('methods', this).text();
+          if (methodtext &amp;&amp; methodtext.length &gt; 0) {
+            methods = methodtext.split(',');
+          }
+          services[id] = { id: id, name: name, methods: methods,
+                           trigger: trigger, icon_url: icon_url,
+                           service_url: service_url
+                         };
+       } );
+      return services;
+   },
+
+   getSystemServices: function(success, failure) {
+     var args = this.getBaseArgs();
+
+     var me = this;
+     this.doRequest('system.services', args, 
+            function(data) {
+                me.system_servicexml = data;
+                var system_serviceinfo = [];
+                if (data) {
+                  system_serviceinfo = me._parseSystemServices(jQuery('services', data));
+                }
+                me.system_serviceinfo = system_serviceinfo;
+                me.log(&quot;Success on system.services&quot;);
+                if (success) {
+                    success( system_serviceinfo );
+                }
+            },
+            function(data, error) {
+                me.log(&quot;Failure on system.services&quot;);
+                if (failure) {
+                    failure(data, error);
+                }
+            }
+        );
+   },
+
+    /************************** plumbing ********************************/
+
       doRequest: function(method, args, success, failure, httpmethod, usequeue) {
         if (! httpmethod) {
           httpmethod = 'post';
@@ -450,15 +555,22 @@ var pingfm = {
         }
 
         var me = this;
-        var request = jQuery.ajax({
-          url: me.baseurl + method,
+        var url = me.baseurl + method;
+        var ajaxargs = {
+          url: url,
           type: httpmethod,
           data: args,
           global: true,
           cache: me.allowCache,
           success: this._makejQuerySuccessHandler(success, failure),
           error: this._makejQueryFailureHandler(failure)
-        });
+        };
+        
+        if (this.proxy_rewriter) {
+            ajaxargs = this.proxy_rewriter(ajaxargs);
+        }
+        
+        var request = ajax(ajaxargs);
       },
 
   /**** Utility functions ****/
@@ -504,7 +616,13 @@ var pingfm = {
    * return all services supported by Ping.fm as of 8/2008
    */
   configSupportedServices: function() {
-    // display_name, api_name, trigger, service_url, icon_url, capability_string
+  
+    if (this.system_serviceinfo) {
+        // this.log(&quot;configSupportedServices using system_serviceinfo&quot;);
+        return this.system_serviceinfo;
+    }
+  
+    // name, id, trigger, service_url, icon_url, capability_string
     //    in capability_string: 'b' for blog, 'm' for micro, 's' for status - this is UNRELIABLE
     var list = [
             ['Bebo', 'bebo', '@be', 'http://www.Bebo.com', 'svcicons/bebo.png', 'bs'],
@@ -535,10 +653,10 @@ var pingfm = {
     var idx;
     for (idx = 0; idx &lt; list.length; idx++) {
         var elt = list[idx];
-        var obj = { display_name: elt[0], api_name: elt[1], trigger: elt[2],
+        var obj = { name: elt[0], id: elt[1], trigger: elt[2],
                     service_url: elt[3], icon_url: elt[4] };
 
-        services[obj.api_name] = obj;
+        services[obj.id] = obj;
     }
     
     return services;
@@ -549,9 +667,17 @@ var pingfm = {
    * or any other property name
    */
   getSupportedService: function(value, property) {
-    if (!property)  property = 'api_name';
+    if (!property)  property = 'id';
     var idx;
-    var supported = this.configSupportedServices();
+    var supported;
+
+    if (this.system_serviceinfo &amp;&amp; value.toLowerCase() != 'custom') {
+      // console.log(&quot;using system.services output&quot;);
+      supported = this.system_serviceinfo;
+    } else {
+      supported = this.configSupportedServices();
+    }
+
     for (idx in supported) {
         var elt = supported[idx];
         if (typeof elt == 'function') continue;
@@ -562,5 +688,11 @@ var pingfm = {
     return null;
   },
 
-  version: '0.4.3'
+  version: '0.5'
+};
+
+PingFMAPI.prototype.FlexProxyRewriter = function(ajaxargs) {
+    ajaxargs.url = url.replace(/^https?:\/\//, &quot;http://flexproxy.eng.vitrue.com/&quot;);
+    
+    return ajaxargs;
 };</diff>
      <filename>Pingboard.wdgt/lib/pingfm.js</filename>
    </modified>
    <modified>
      <diff>@@ -36,7 +36,6 @@ body {
 }
 
 /* std apple stuff */
-
 #frontImg {
     position: absolute;
     display: block;
@@ -140,9 +139,9 @@ body {
     right: auto;
     margin-top: 0px;
     width: 81px;
-    left: 358px;
-    top: 47px;
     height: 24px;
+    left: 358px;
+    top: 59px;
 }
 
 #ApiKeyTitle {
@@ -189,19 +188,6 @@ body {
     opacity: 1;
 }
 
-#button_getKey1 {
-    font-family: HelveticaNeue-Bold;
-    font-size: 12px;
-    text-align: center;
-    position: absolute;
-    right: auto;
-    margin-top: 0px;
-    left: 29px;
-    width: 61px;
-    top: 180px;
-    height: 24px;
-}
-
 #back_test_output {
     color: black;
     font-family: HelveticaNeue;
@@ -224,9 +210,9 @@ body {
     right: auto;
     bottom: auto;
     margin-top: 0px;
-    top: 126px;
-    left: 372px;
     width: 67px;
+    left: 311px;
+    top: 126px;
 }
 
 #debug_text {
@@ -388,8 +374,8 @@ body {
     font-family: HelveticaNeue;
     font-size: 10pt;
     left: 110px;
-    width: 236px;
     top: 121px;
+    width: 164px;
 }
 
 #name_display {
@@ -510,3 +496,29 @@ body {
     width: 225px;
     left: 244px;
 }
+
+#button_test {
+    font-family: HelveticaNeue-Bold;
+    font-size: 12px;
+    text-align: center;
+    position: absolute;
+    right: auto;
+    margin-top: 0px;
+    left: 29px;
+    width: 61px;
+    top: 180px;
+    height: 24px;
+}
+
+#button_help {
+    font-family: HelveticaNeue-Bold;
+    font-size: 12px;
+    text-align: center;
+    position: absolute;
+    right: auto;
+    margin-top: 0px;
+    height: 24px;
+    width: 50px;
+    left: 415px;
+    top: 126px;
+}</diff>
      <filename>Pingboard.wdgt/main.css</filename>
    </modified>
    <modified>
      <diff>@@ -60,9 +60,10 @@
         &lt;/div&gt;
         &lt;div id=&quot;ApiKeyTitle&quot; onclick=&quot;openPingFM(event)&quot;&gt;&lt;/div&gt;
         &lt;div id=&quot;button_getKey&quot;&gt;&lt;/div&gt;
-        &lt;div id=&quot;button_getKey1&quot;&gt;&lt;/div&gt;
+        &lt;div id=&quot;button_test&quot;&gt;&lt;/div&gt;
         &lt;textarea id=&quot;back_test_output&quot; disabled=&quot;disabled&quot;&gt;&lt;/textarea&gt;
         &lt;div id=&quot;version&quot;&gt;&lt;/div&gt;
+        &lt;div id=&quot;button_help&quot;&gt;&lt;/div&gt;
     &lt;/div&gt;
     &lt;div id=&quot;error_pane&quot;&gt;
         &lt;img id=&quot;errorImg1&quot; src=&quot;Images/front%201.png&quot; alt=&quot;&quot;&gt;</diff>
      <filename>Pingboard.wdgt/main.html</filename>
    </modified>
    <modified>
      <diff>@@ -14,6 +14,8 @@ function load()
 
     pingview.hideScrolldown();
 
+    pingfm = new PingFMAPI();
+
     setupPingFM();
 
     setupUI();
@@ -272,6 +274,8 @@ function setupPingFM()
     pingfm.debug = pingprefs.getPref('debug', false) ? '1' : '0';
     
     pingfm.view = pingview;
+    
+    pingfm.initialize();
 }
 
 
@@ -282,10 +286,17 @@ function doPost(event)
     var method = pingview.getPostMethod();
     var body = jQuery('#post_text').val();
 
+    exclude = pingview.getExcludes();
+    if (jQuery('#svciconbox img').length &gt; 0 &amp;&amp; jQuery('#svciconbox img').length &lt;= exclude.length) {
+        pingview.showError(&quot;At least one service must be enabled to post!&quot;);
+        return false;
+    }
+
     // keep history
-    pingdb.addPing(body, method);
+    pingdb.addPing(body, method, {title:'', exclude: exclude});
 
-    pingfm.postMessage(body, method);
+    // body, method, title, success, failure, excludes
+    pingfm.postMessage(body, method, null, null, null, exclude);
     pingview.resetPost();
 }
 
@@ -305,7 +316,8 @@ function setPostType(event)
 
     // change default
     pingfm.post_method = type;
-    
+    pingview.setExcludes([]);
+
     pingview.showPostTypeIcons(type);
 
     // store for later
@@ -316,6 +328,8 @@ var pingview = {
   historyNum: -1,
   
   draftping: null,
+  
+  excludes: new Object(),
 
   // for use by pingfm
   
@@ -353,6 +367,8 @@ var pingview = {
     if (num == this.historyNum)
         return;
     
+    var me = this;
+    
     // save draft
     if (this.historyNum == -1 &amp;&amp; ! suppressDraft) {
         this.saveDraftPing();
@@ -367,7 +383,7 @@ var pingview = {
         if (this.draftping)
             ping = this.draftping;
         else
-            ping = {message:''};
+            ping = {message:'', excludes:[]};
         showNum = '';
     }
     else {
@@ -377,11 +393,15 @@ var pingview = {
     
     this.historyNum = num;
 
+
     if (ping) {
         this.setPostBody(ping.message);
         if (ping.destination) {
             this.setPostMethod(ping.destination);
         }
+        if (ping.exclude) {
+            this.setExcludes(ping.exclude);
+        }
         jQuery('#historyNum').text(showNum);
     }
   },
@@ -410,7 +430,8 @@ var pingview = {
     var ping = {
         message: this.getPostBody(),
         destination: this.getPostMethod(),
-        when: new Date()
+        when: new Date(),
+        exclude: this.getExcludes()
     };
     
     this.draftping = ping;
@@ -493,9 +514,9 @@ var pingview = {
   },
   
   _makeQuotable: function(str) {
-    return str.replace(/([&quot;'])/g, '\\$1');
+    return str.replace(/([\&quot;\'])/g, '\\$1');
 
-    // ' unconfuse dashcode
+    //   ' unconfuse dashcode
   },
   
   openServicePage: function(event) {
@@ -516,9 +537,17 @@ var pingview = {
     if (! attributes.title) attributes.title = service.name;
     if (! attributes.alt)   attributes.alt = service.id;
     
-    attributes.src = &quot;svcicons/&quot; + service.id + &quot;.png&quot;;
+    system_service = pingfm.getSupportedService(service.id);
+    if (system_service) {
+        // console.log(&quot;using system service info for &quot; + service.id);
+        attributes.src = system_service.icon_url;
+    } else {
+        attributes.src = &quot;svcicons/&quot; + service.id + &quot;.png&quot;;
+    }
+
     attributes.serviceid = service.id;
-    attributes.onclick = &quot;pingview.openServicePage(event);&quot;;
+    if (! attributes.onclick &amp;&amp; false)
+        attributes.onclick = &quot;pingview.openServicePage(event);&quot;;
 
     var html = '&lt;img class=&quot;svcicon&quot; ';
     for (name in attributes)
@@ -554,6 +583,56 @@ var pingview = {
     }
     
     pingview.setServiceIcons('#svciconbox', services);
+    jQuery('#svciconbox img').unbind('click').
+                each(function(item) { this.title = this.title + &quot; - click to toggle&quot;; }).
+                bind('click', function(event) { pingview.toggleExclude(event); });
+    var idx;
+    for (idx = 0; idx &lt; this.getExcludes().length; idx++) {
+        
+    }
+  },
+
+  getExcludes: function() {
+    var id;
+    var res = [];
+    for (id in this.excludes) {
+        var val = this.excludes[id];
+        if (typeof val == 'function') continue;
+        if (val == true) res.push(id);
+    }
+    return res;
+  },
+  
+  setExcludes: function(excludes) {
+    jQuery('#svciconbox img').css('opacity', 1.0);
+    this.excludes = {};
+    var idx;
+    for (idx = 0; idx &lt; excludes.length; idx++) {
+        this.setExcluded(excludes[idx],  true);
+    }
+  },
+  
+  isExcluded: function(id) {
+    return this.excludes[id];
+  },
+  
+  setExcluded: function(id, value) {
+    this.excludes[id] = value;
+
+    if (!value) {
+        opacity = 1.0;
+    } else {
+        opacity = 0.2;
+    }
+    jQuery('#svciconbox [alt='+id+']').css('opacity', opacity);
+  },
+
+  toggleExclude: function(event, val) {
+    var id = event.target.alt;
+
+    // XXX - this doesn't work if invoked directly as an event handler
+    //   so wrap inside a lambda
+    this.setExcluded(id, ! this.isExcluded(id));
   },
 
   setServiceIcons: function(destination, services) {
@@ -619,7 +698,7 @@ var pingview = {
     this.hideScrolldown();
   },
   
-  version: '0.4.3',
+  version: '0.5',
 };
 
 /**
@@ -648,9 +727,18 @@ var pingdb = {
         this.db = [];
     },
     
-    addPing: function(message, destination) {
+    addPing: function(message, destination, other) {
         if (! destination) { destination = 'default' };
-        this.db.unshift( {message: message, destination: destination, when: new Date()} );
+        if (! other) other = {};
+        
+        var item = {message: message, destination: destination, when: new Date()};
+        var key;
+        for (key in other) {
+            var val = other[key];
+            if (typeof val == 'function' || item.hasOwnProperty(key)) continue;
+            item[key] = val;
+        }
+        this.db.unshift( item );
     },
     
     listPings: function(count) {
@@ -669,7 +757,7 @@ var pingdb = {
         return this.db.length;
     },
     
-    version: '0.4.3'
+    version: '0.5'
 }
 
 function doDebugClick(event)
@@ -788,4 +876,9 @@ function showLatestPosts(event)
 function hideScrolldown(event)
 {
     pingview.hideScrolldown();
-}
\ No newline at end of file
+}
+
+function openHelp(event)
+{
+    widget.openURL(&quot;http://code.google.com/p/pingboard/wiki/Help&quot;);
+}</diff>
      <filename>Pingboard.wdgt/main.js</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_getKey1_left.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_getKey1_left_clicked.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_getKey1_middle.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_getKey1_middle_clicked.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_getKey1_right.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.dcproj/project.wdgt/Images/button_getKey1_right_clicked.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.wdgt/Images/button_getKey1_left.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.wdgt/Images/button_getKey1_left_clicked.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.wdgt/Images/button_getKey1_middle.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.wdgt/Images/button_getKey1_middle_clicked.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.wdgt/Images/button_getKey1_right.png</filename>
    </removed>
    <removed>
      <filename>Pingboard.wdgt/Images/button_getKey1_right_clicked.png</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>39a63e6697d2950997cfa1dba840954cc0733c58</id>
    </parent>
  </parents>
  <author>
    <name>Robert Sanders</name>
    <email>robert@vitrue.com</email>
  </author>
  <url>http://github.com/rsanders/pingboard/commit/5ee3ebd5fa7eec3d9f4c36d393c4fd946329e609</url>
  <id>5ee3ebd5fa7eec3d9f4c36d393c4fd946329e609</id>
  <committed-date>2008-08-19T15:45:43-07:00</committed-date>
  <authored-date>2008-08-19T15:45:43-07:00</authored-date>
  <message>created 0.5 release</message>
  <tree>a6ed3f5acd6f368b6a8a4359f13b89fac24b0fff</tree>
  <committer>
    <name>Robert Sanders</name>
    <email>robert@vitrue.com</email>
  </committer>
</commit>
