<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Joe Audette</title><subtitle type="html" /><id>http://weblogs.asp.net/joeaudette/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/joeaudette/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/joeaudette/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2008-01-25T07:32:00Z</updated><entry><title>Silverlight + Google Gears = Awesome! at least in Firefox</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/joeaudette/archive/2008/11/29/silverlight-google-gears-awesome-at-least-in-firefox.aspx" /><id>http://weblogs.asp.net/joeaudette/archive/2008/11/29/silverlight-google-gears-awesome-at-least-in-firefox.aspx</id><published>2008-11-29T12:19:00Z</published><updated>2008-11-29T12:19:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;cross post from &lt;a href="http://www.mojoportal.com" mce_href="http://www.mojoportal.com"&gt;mojoPortal.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogtext"&gt;
	    &lt;p&gt;I spent most of the week prototyping
some things in Silverlight. I figured during the holiday week most
people out there goofed off on their jobs a lot this week, so rather
than work on my &lt;a href="http://www.mojoportal.com/roadmap.aspx"&gt;roadmap priorities&lt;/a&gt;, I decided to have some fun and play with Silverlight.&lt;/p&gt;
&lt;p&gt;Some of you who have followed my blog for a while may remember some
posts I made in the past about my plans for Site Office as a second
plug in model for &lt;a href="http://www.mojoportal.com/"&gt;mojoPortal&lt;/a&gt;
more geared to line of business apps that need a consistent look and
feel rather than the web site kind of look, they need to look like
applications. I originally protyped the UI using Dojo and then later
re-did it with &lt;a href="http://extjs.com/"&gt;ExtJs&lt;/a&gt;. You can see the ExtJs version if you login to this site (or &lt;a href="http://demo.mojoportal.com/"&gt;http://demo.mojoportal.com&lt;/a&gt;
using admin@admin.com and password admin), then click the Site Office
link at the top. You'll see the drag resizable panes that give the idea
of where I wanted to go with Site Office as a UI for LOB applications.
This prototype has just been sitting there without much attention
because of other priorities and also partly because my enthusiasm for
ExtJs disappeared when they changed the license from LGPL to GPL.
Anyway, even back then I implemented a google gears query tool. Its
really the only functioning app in the old Site Office prototype, you
can find it by clicking the My Stuff in the left accordian menu in Site
Office and then click SQL. For those who don't know, google gears is a
client side SQL database built on SQLite and having this database
available opens a lot of possibilities in web development for very rich
and responsive applications.&lt;/p&gt;
&lt;p&gt;Well, now my plan is to scrap the old ExtJs based Site Office
prototype and build a better one with Silverlight. I've already got the
Google Gears Query Tool re-implemented in Silverlight as shown below:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.mojoportal.com/Data/Sites/1/silverlight-gears-screenshot.png" alt="silverlight google gears query tool ascreenshot" height="565" width="657"&gt;&lt;/p&gt;
&lt;p&gt;I wrote a nice managed code wrapper around the javscript calls for
gears. The only problem is, it doesn't work well in IE 7 for some
reason, it works great in Firefox. I've sent an email off to Scott
Guthrie at Microsoft in hopes of some help looking into the problem,
but for now you can try it out online at &lt;a href="http://demo.mojoportal.com/Index.aspx"&gt;http://demo.mojoportal.com/Index.aspx&lt;/a&gt;,
you can see that I've got the basic layout of Site Office again
implemented in Silverlight with the drag re-sizable panes. I plan to
build a plug in model that allows you to plugin your own Silverlight
applets and let the framework provide stuff thats common across
applications. If I can get google gears working well across browsers
with Silverlight its really going to be sweet. The code for this is in
my svn sandbox and will probably land in trunk sometime next week.&lt;/p&gt;&lt;p&gt;Now using the managed gears wrapper can be seen in this client side business/data class, it looks very much like a server side class but its a client side object populated from a client side database in a very similar fashion to what it would look like in server side code. Notice the parametrized queries to prevent sql injection attacks. This class represents a saved query but it could represent anything.&lt;/p&gt;&lt;p&gt;using System;&lt;br&gt;&lt;br&gt;&lt;br&gt;namespace mojoPortal.Silverlight.Helpers.Gears&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class SavedQuery&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public SavedQuery()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int id = -1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string name = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string query = string.Empty;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int Id&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return id; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return name; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { name = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Query&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return query; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { query = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void Save(GearsDb gearsDb)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (id == -1) { Create(gearsDb); return; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Update(gearsDb);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Create(GearsDb gearsDb)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (gearsDb == null) { return; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string sqlCommand = "insert into savedqueries (name, query) values (?, ?)";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object[] parameters = new object[2];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.SetValue(name, 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.SetValue(query, 1);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gearsDb.Execute(sqlCommand, parameters);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id = gearsDb.LastInsertRowId();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool Update(GearsDb gearsDb)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (gearsDb == null) { return false; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string sqlCommand = "update savedqueries set name = ?, query = ? where id = ?";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object[] parameters = new object[3];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.SetValue(name, 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.SetValue(query, 1);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.SetValue(id, 2);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gearsDb.Execute(sqlCommand, parameters);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int rowsAffected = gearsDb.RowsAffected();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (rowsAffected &amp;gt; 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static SavedQuery GetQuery(GearsDb gearsDb, int id)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (gearsDb == null) { return null; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string sqlCommand = "select * from savedqueries where id = ?";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object[] parameters = new object[1];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.SetValue(id, 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GearsResultSet rs = new GearsResultSet(gearsDb.Execute(sqlCommand, parameters));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SavedQuery query = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rs.IsValidRow())&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query = new SavedQuery();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.id = Convert.ToInt32(rs.GetFieldValue("id"));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.name = rs.GetFieldValue("name").ToString();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.query = rs.GetFieldValue("query").ToString(); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Close();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return query;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static SavedQuery GetQuery(GearsDb gearsDb, string name)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (gearsDb == null) { return null; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string sqlCommand = "select * from savedqueries where name = ?";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object[] parameters = new object[1];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.SetValue(name, 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GearsResultSet rs = new GearsResultSet(gearsDb.Execute(sqlCommand, parameters));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SavedQuery query = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rs.IsValidRow())&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query = new SavedQuery();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.id = Convert.ToInt32(rs.GetFieldValue("id"));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.name = rs.GetFieldValue("name").ToString();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.query = rs.GetFieldValue("query").ToString();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Close();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return query;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static bool Delete(GearsDb gearsDb, int id)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (gearsDb == null) { return false; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string sqlCommand = "delete from savedqueries where id = ?";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object[] parameters = new object[1];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.SetValue(id, 0);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gearsDb.Execute(sqlCommand, parameters);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int rowsAffected = gearsDb.RowsAffected();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (rowsAffected &amp;gt; 0);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&amp;nbsp; &lt;br&gt;&lt;/p&gt;
    &lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6759833" width="1" height="1"&gt;</content><author><name>joeaudette</name><uri>http://weblogs.asp.net/members/joeaudette.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/joeaudette/archive/tags/ASP.NET/default.aspx" /><category term="mojoPortal" scheme="http://weblogs.asp.net/joeaudette/archive/tags/mojoPortal/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/joeaudette/archive/tags/C_2300_/default.aspx" /><category term="google gears" scheme="http://weblogs.asp.net/joeaudette/archive/tags/google+gears/default.aspx" /><category term="Silverlight" scheme="http://weblogs.asp.net/joeaudette/archive/tags/Silverlight/default.aspx" /></entry><entry><title>One Bookmarking Service to Rule Them All and in The Widget Bind Them</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/joeaudette/archive/2008/03/28/one-bookmarking-service-to-rule-them-all-and-in-the-widget-bind-them.aspx" /><id>http://weblogs.asp.net/joeaudette/archive/2008/03/28/one-bookmarking-service-to-rule-them-all-and-in-the-widget-bind-them.aspx</id><published>2008-03-28T18:27:00Z</published><updated>2008-03-28T18:27:00Z</updated><content type="html">&lt;p&gt;I'm sure those of you out there reading this blog also read a lot of
other blogs and have noticed over time the chickletization of blog
pages with little icons for all the different bookmarking services like
&lt;a href="http://del.icio.us/" mce_href="http://del.icio.us/" _fcksavedurl="http://del.icio.us/"&gt;Del.icio.us&lt;/a&gt; and &lt;a href="http://digg.com/" mce_href="http://digg.com/" _fcksavedurl="http://digg.com/"&gt;Digg&lt;/a&gt;, and on and on with the ever growing plethora of other services. I was starting to feel that the &lt;a href="http://www.mojoportal.com/" mce_href="http://www.mojoportal.com/" _fcksavedurl="http://www.mojoportal.com"&gt;mojoPortal&lt;/a&gt; blog was a little behind the times in this respect. Then I noticed on &lt;a href="http://www.techcrunch.com/" mce_href="http://www.techcrunch.com/" _fcksavedurl="http://www.techcrunch.com/"&gt;TechCrunch&lt;/a&gt;, the use of the &lt;a href="http://www.addthis.com/" mce_href="http://www.addthis.com/" _fcksavedurl="http://www.addthis.com/"&gt;AddThis.com&lt;/a&gt;
widget. After looking into the integration I could see that it was
relatively low hanging fruit to implement a .NET control that makes it
easy to add the AddThis button.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.mojoportal.com/Data/Sites/1/addthiswidget.png" mce_src="http://www.mojoportal.com/Data/Sites/1/addthiswidget.png" alt="" _fcksavedurl="http://www.mojoportal.com/Data/Sites/1/addthiswidget.png" height="343" width="556"&gt;&lt;/p&gt;

&lt;p&gt;Use of the .NET control in markup is like this:&lt;/p&gt;

&lt;p&gt;&amp;lt;mp:AddThisButton ID="at1" runat="server" &lt;br&gt;
AccountId="" &lt;br&gt;
ButtonImageUrl="~/Data/SiteImages/addthisbookmarkbutton.gif"&lt;br&gt;
Text="Share This Using Popular Bookmarking Services"&lt;br&gt;
CustomBrand="mojoPortal"&lt;br&gt;
CustomLogoUrl="http://www.mojoportal.com/Data/mojoportal_box_dropshadow.png"&lt;br&gt;
CustomLogoBackgroundColor="e8e8e8"&lt;br&gt;
CustomOptions=""&lt;br&gt;
UrlToShare=""&lt;br&gt;
TitleOfUrlToShare=""&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;p&gt;If you leave the UrlToShare and TitleofUrlToShare blank it
automatically uses the current page which makes it easy to add it to
the layout.master file of your mojoPortal skin so it appears on every
page.&lt;/p&gt;

&lt;p&gt;In the blog we databind those properties to the title and url of the blog post.&lt;/p&gt;

&lt;p&gt;If the account id is not set the control doesn't render.&lt;/p&gt;

&lt;p&gt;Now we can just let AddThis.com keep track of the emerging services
and add them for us instead of having to add a new chicklet every time
some cool new service appears.&lt;/p&gt;

&lt;p&gt;At the time of this post, this feature is only available from the mojoPortal &lt;a href="http://www.mojoportal.com/tortoisesvn.aspx" mce_href="http://www.mojoportal.com/tortoisesvn.aspx" _fcksavedurl="http://www.mojoportal.com/tortoisesvn.aspx"&gt;source code repository&lt;/a&gt;, but it will be in the next release coming soon.&lt;/p&gt;

&lt;p&gt;You can see the full source code for the control below, in case you want to use it in your own projects. By inheriting from the Hyperlink the implementation was very easy to do. Just wiring up a little javascript and encapsulating the customizable attributes into properties.&lt;/p&gt;&lt;p&gt;using System;&lt;br&gt;using System.Collections.Generic;&lt;br&gt;using System.Configuration;&lt;br&gt;using System.Globalization;&lt;br&gt;using System.Text;&lt;br&gt;using System.Web.UI;&lt;br&gt;using System.Web.UI.WebControls;&lt;br&gt;&lt;br&gt;&lt;br&gt;namespace mojoPortal.Web.Controls&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Author:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Joe Audette&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Created:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 2008-03-27&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Last Modified:&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 2008-03-27&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The use and distribution terms for this software are covered by the &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Common Public License 1.0 (http://opensource.org/licenses/cpl.php)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// which can be found in the file CPL.TXT at the root of this distribution.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// By using this software in any fashion, you are agreeing to be bound by &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// the terms of this license.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// You must not remove this notice, or any other, from this software.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// See http://www.addthis.com&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class AddThisButton : HyperLink&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Private Properties&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string accountId = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private bool useMouseOverWidget = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string customLogoUrl = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string customLogoBackgroundColor = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string customLogoColor = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string customBrand = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string customOptions = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int customOffsetTop = -999;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int customOffsetLeft = -999;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string buttonImageUrl = "~/Data/SiteImages/addthissharebutton.gif";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string protocol = "http";&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string urlToShare = string.Empty;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string titleOfUrlToShare = string.Empty;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Public Properties&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Your addthis.com username.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// If this is not set the control will not render.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string AccountId&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return accountId; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { accountId = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// if true will show widget in the page&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public bool UseMouseOverWidget&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return useMouseOverWidget; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { useMouseOverWidget = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The logo to display on the popup window (about 200x50 pixels). &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The popup window is show when the user selects the 'More' choice&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string CustomLogoUrl&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return customLogoUrl; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { customLogoUrl = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The color to use as a background around the logo in the popup &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string CustomLogoBackgroundColor&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return customLogoBackgroundColor; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { customLogoBackgroundColor = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The color to use for the text next to the logo in the popup &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string CustomLogoColor&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return customLogoColor; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { customLogoColor = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The brand name to display in the drop-down (top right)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string CustomBrand&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return customBrand; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { customBrand = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// A comma-separated ordered list of options to include in the drop-down&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Example: addthis_options = 'favorites, email, digg, delicious, more'; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Currently supported options:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// delicious, digg, email, favorites, facebook, fark, furl, google, live, myweb, myspace, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// newsvine, reddit, slashdot, stumbleupon, technorati, twitter, more &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// (the default is currently 'favorites, digg, delicious, google, myspace, facebook, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// reddit, newsvine, &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// live, more', in that order).&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string CustomOptions&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return customOptions; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { customOptions = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Vertical offset for the drop-down window widget (in pixels) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// thiscontrol defaults to -999 which means unsepcified&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// this will result in the defaults from addthis.com&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// not sure what the defsault is&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int CustomOffsetTop&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return customOffsetTop; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { customOffsetTop = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Horizontal offset for the drop-down window widget (in pixels) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// thiscontrol defaults to -999 which means unsepcified&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// this will result in the defaults from addthis.com&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// not sure what the defsault is&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int CustomOffsetLeft&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return customOffsetLeft; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { customOffsetLeft = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string ButtonImageUrl&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return buttonImageUrl; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { buttonImageUrl = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string UrlToShare&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return urlToShare; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { urlToShare = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string TitleOfUrlToShare&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return titleOfUrlToShare; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { titleOfUrlToShare = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnPreRender(EventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnPreRender(e);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (accountId.Length == 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Visible = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Page.Request.IsSecureConnection)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protocol = "https";&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetupScripts();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ImageUrl = Page.ResolveUrl(buttonImageUrl);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.NavigateUrl = "http://www.addthis.com/bookmark.php";&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (useMouseOverWidget)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetupWidget();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetupNormalLink();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void SetupNormalLink()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder onClickAttribute = new StringBuilder();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (urlToShare.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; onClickAttribute.Append("addthis_url = '" + urlToShare + "'; ");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; onClickAttribute.Append("addthis_url = location.href; ");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (titleOfUrlToShare.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; onClickAttribute.Append("addthis_title ='" + titleOfUrlToShare + "'; ");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; onClickAttribute.Append("addthis_title = document.title; ");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; onClickAttribute.Append("return addthis_click(this); ");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Attributes.Add("onclick", onClickAttribute.ToString());&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //this.Attributes.Add("onclick", "return addthis_click(this); ");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void SetupWidget()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder mouseOverAttribute = new StringBuilder();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseOverAttribute.Append("return addthis_open(this, '',");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (urlToShare.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseOverAttribute.Append("'" + urlToShare + "', ");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseOverAttribute.Append("'[URL]', ");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (titleOfUrlToShare.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseOverAttribute.Append("'" + titleOfUrlToShare + "' ");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseOverAttribute.Append("'[TITLE]' ");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseOverAttribute.Append("); ");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Attributes.Add("onmouseover", mouseOverAttribute.ToString());&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Attributes.Add("onmouseout", "addthis_close()");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void SetupScripts()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder script = new StringBuilder();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("&amp;lt;script language=\"javascript\" type=\"text/javascript\"&amp;gt; ");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("\n&amp;lt;!-- \n");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("var addthis_pub = '" + accountId + "';");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(customLogoUrl.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("var addthis_logo = '" + customLogoUrl + "';");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (customLogoBackgroundColor.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("var addthis_logo_background = '" + customLogoBackgroundColor + "';");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (customLogoColor.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("var addthis_logo_color = '" + customLogoColor + "';");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (customBrand.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("var addthis_brand = '" + customBrand + "';");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (customOptions.Length &amp;gt; 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("var addthis_options = '" + customOptions + "';");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (customOffsetTop != -999)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("var addthis_offset_top = " + customOffsetTop.ToString(CultureInfo.InvariantCulture) + ";");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (customOffsetLeft != -999)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("var addthis_offset_left = " + customOffsetLeft.ToString(CultureInfo.InvariantCulture) + ";");&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append("\n//--&amp;gt; ");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.Append(" &amp;lt;/script&amp;gt;");&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page.ClientScript.RegisterClientScriptBlock(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof(AddThisButton),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "addthisbutton",&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; script.ToString());&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(useMouseOverWidget)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page.ClientScript.RegisterStartupScript(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof(AddThisButton),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "addthisbuttonsetup", "\n&amp;lt;script type=\"text/javascript\" src=\""&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + protocol + "://s7.addthis.com/js/152/addthis_widget.js"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + "\" &amp;gt;&amp;lt;/script&amp;gt;");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page.ClientScript.RegisterStartupScript(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; typeof(AddThisButton),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "addthisbuttonsetup", "\n&amp;lt;script type=\"text/javascript\" src=\""&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + protocol + "://s9.addthis.com/js/widget.php?v=10"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + "\" &amp;gt;&amp;lt;/script&amp;gt;");&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6041844" width="1" height="1"&gt;</content><author><name>joeaudette</name><uri>http://weblogs.asp.net/members/joeaudette.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/joeaudette/archive/tags/ASP.NET/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/joeaudette/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Yahoo Media Player - Sweet and Easy</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/joeaudette/archive/2008/03/09/yahoo-media-player-sweet-and-easy.aspx" /><id>http://weblogs.asp.net/joeaudette/archive/2008/03/09/yahoo-media-player-sweet-and-easy.aspx</id><published>2008-03-09T12:36:00Z</published><updated>2008-03-09T12:36:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;cross posted from &lt;a href="http://www.joeaudette.com" mce_href="http://www.joeaudette.com"&gt;www.joeaudette.com&lt;/a&gt;&lt;/p&gt;&lt;div class="blogtext"&gt;&lt;p&gt;I first read about &lt;a href="http://developer.yahoo.com/mediaplayer/"&gt;Yahoo Media Player&lt;/a&gt;
a month or so back and I bookmarked it with the intention of using it
on my site. I don't know why I waited, I must have just been too busy
or absorbed in other things I was working on. I mean its a 2 minute job
to integrate it, you just add a script to your page or in my case to
the layout.master (ASP.NET Master Page) file in my &lt;a href="http://www.mojoportal.com/"&gt;mojoPortal&lt;/a&gt; skin like this:&lt;/p&gt;
&lt;p&gt;&amp;lt;script type="text/javascript" src="http://mediaplayer.yahoo.com/js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;and thats all there is to it. Any page that has links to mp3 files now autmatically have little play buttons next to them.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.joeaudette.com/therealitysaladband.aspx"&gt;&lt;img src="http://www.joeaudette.com/Data/Sites/2/yahoomediaplayerexample.png" alt="Yahoo Media Player automatically adds play buttons" height="381" width="259"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click the image above or visit this link to see it on my site: &lt;a href="http://www.joeaudette.com/therealitysaladband.aspx"&gt;http://www.joeaudette.com/therealitysaladband.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you click a play button the player comes up at the bottom of the
screen and has a playlist of all the mp3s linked on the page.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.joeaudette.com/Data/Sites/2/yahoomediaplayerplaylist.png" alt="" height="299" width="547"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pretty cool and so easy a caveman could do it.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5940574" width="1" height="1"&gt;</content><author><name>joeaudette</name><uri>http://weblogs.asp.net/members/joeaudette.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/joeaudette/archive/tags/ASP.NET/default.aspx" /><category term="mp3" scheme="http://weblogs.asp.net/joeaudette/archive/tags/mp3/default.aspx" /></entry><entry><title>SubSonic - All Your Databases Are Belong To Us</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/joeaudette/archive/2008/03/05/subsonic-all-your-databases-are-belong-to-us.aspx" /><id>http://weblogs.asp.net/joeaudette/archive/2008/03/05/subsonic-all-your-databases-are-belong-to-us.aspx</id><published>2008-03-05T13:51:00Z</published><updated>2008-03-05T13:51:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;Cross posted from mojoPortal.com&lt;br&gt;&lt;/p&gt;&lt;p&gt;In the week prior to my vacation I had started working with &lt;a href="http://www.subsonicproject.com/" mce_href="http://www.subsonicproject.com/"&gt;SubSonic&lt;/a&gt;
to see if it could be useful in mojoPortal since it has support for a
number of databases, I figured it could reduce the work of supporting
all these different dbs.&lt;/p&gt;
&lt;p&gt;SubSonic is basically a toolkit for interogating databases for their
schema and has the ability to generate db specific sql statements for
common tasks. It also has a code generation feature so it can generate
.NET classes based on database tables. It can be used as an OR mapper,
that is, you could use the generated classes as your business objects,
you could either inherit from them or use partial classes to bolt on
custom functionality on top of what was generated by SubSonic. But for
people like me who just never bought into the whole OR mapper thing,
the generated classes can just be thought of as data objects that
abstract the database table. It can return standard data in the form of
IDataReader which is what the mojoPortal business objects like to
consume and allows using SubSonic without having any particular
dependency on SubSonic in my business classes.&lt;/p&gt;
&lt;p&gt;It comes with providers for MS SQL, Oracle, MySql and SQLite and
there were some other partially complete providers that I found in the
wild. So my plan was, for proof of concept, to take a simple feature
like the links module and try to re-implement it for all the dbs by
using SubSonic. The short story is, yes I got it working for all 5 of
the currently supported databases in mojoPortal. I re-implemented a new
SQLite provider using Mono.Data.Sqlite which I already knew works both
on Windows and on Linux/Mono. I found a postgresql provider &lt;a href="http://forums.subsonicproject.com/forums/p/1259/8294.aspx" mce_href="http://forums.subsonicproject.com/forums/p/1259/8294.aspx"&gt;here&lt;/a&gt;
(thanks to Justin Greene and Maurício Machado) that was usable with a
little bit of work. I also found a starter implementation for Firebird
Sql (thanks to&amp;nbsp; Ricardo García) that I was able to complete and get
working.&lt;/p&gt;
&lt;p&gt;I've since gone on to implement the data layer for the WebStore
feature for MySql, mostly using SubSonic. And the things that did use
SubSonic are completely re-usable for the other data layers so the bulk
of the work is already done for implementing the web store for postgre
sql and Firebird.&lt;/p&gt;
&lt;p&gt;SubSonic also comes with a thing called the scaffold page which is
basically a web page that allows managing data in all of the tables in
your database. Just drop it in and it works. I've modified the one in
mojoPortal a little for various little issues I encountered and also to
add security checks to control access to the page.&lt;/p&gt;
&lt;p&gt;Since the code templates used by SubSonic are basically .aspx pages,
I got the idea of making a browser based gui for code generation. I
implemented that today and got the initial proof of concept done in
about 4 hours of playing around. So at the moment its kind of like a
poor man's Codesmith in the browser.&lt;/p&gt;
&lt;p&gt;At any rate, I made a quick tutorial video about use of SubSonic in
mojoPortal, sort of a developers introduction to it. Its pretty cool
stuff so I hope you'll have a look.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mojoportal.com/flashtutorials/subsonicmojo/" mce_href="http://www.mojoportal.com/flashtutorials/subsonicmojo/"&gt;An Intoduction to SubSonic as Used in mojoPortal&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5919849" width="1" height="1"&gt;</content><author><name>joeaudette</name><uri>http://weblogs.asp.net/members/joeaudette.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/joeaudette/archive/tags/ASP.NET/default.aspx" /><category term="mojoPortal" scheme="http://weblogs.asp.net/joeaudette/archive/tags/mojoPortal/default.aspx" /><category term=".NET" scheme="http://weblogs.asp.net/joeaudette/archive/tags/.NET/default.aspx" /></entry><entry><title>Cross Platform .NET Development with Mono and MySQL</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/joeaudette/archive/2008/01/28/cross-platform-net-development-with-mono-and-mysql.aspx" /><id>http://weblogs.asp.net/joeaudette/archive/2008/01/28/cross-platform-net-development-with-mono-and-mysql.aspx</id><published>2008-01-28T17:05:00Z</published><updated>2008-01-28T17:05:00Z</updated><content type="html">&lt;p&gt;Just got confirmation that I will be co-presenting with &lt;a href="http://www.beyondfocus.com/" mce_href="http://www.beyondfocus.com/" _fcksavedurl="http://www.beyondfocus.com/"&gt;Joseph Hill&lt;/a&gt; at the MySQL Conference and Expo. The session is titled &lt;a href="http://en.oreilly.com/mysql2008/public/schedule/detail/2546" mce_href="http://en.oreilly.com/mysql2008/public/schedule/detail/2546" _fcksavedurl="http://en.oreilly.com/mysql2008/public/schedule/detail/2546"&gt;Cross Platform .NET Development with Mono and MySQL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;"This session provides an introduction to application development
with Mono and MySQL, and will discuss the current state of Mono,
including its support for databases through ADO.NET and LINQ. We will
also take a look at several tools that can be leveraged to ease
migration of applications to Mono and MySQL, and explore how one open
source ASP.NET application provides support for Mono and MySQL."&lt;/p&gt;
&lt;p&gt;&lt;a href="http://en.oreilly.com/mysql2008/public/schedule/detail/2546" mce_href="http://en.oreilly.com/mysql2008/public/schedule/detail/2546" _fcksavedurl="http://en.oreilly.com/mysql2008/public/schedule/detail/2546"&gt;&lt;img src="http://www.mojoportal.com/Data/Sites/1/mysql2008banner386x280.gif" mce_src="http://www.mojoportal.com/Data/Sites/1/mysql2008banner386x280.gif" _fcksavedurl="/Data/Sites/1/mysql2008banner386x280.gif" alt="MySQL Conference and Expo 2008" height="280" width="336"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm very excited about this conference and the opprotunity to talk about &lt;a href="http://www.mojoportal.com/" mce_href="http://www.mojoportal.com/" _fcksavedurl="http://www.mojoportal.com"&gt;mojoPortal&lt;/a&gt;, &lt;a href="http://www.mono-project.com/Main_Page" mce_href="http://www.mono-project.com/Main_Page" _fcksavedurl="http://www.mono-project.com/Main_Page"&gt;Mono&lt;/a&gt;, and &lt;a href="http://www.mysql.com/" mce_href="http://www.mysql.com/" _fcksavedurl="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;.
I've known Joseph through correspondence and his involvement with the
Mono community since 2003 so I'm looking forward to finally meeting him
in person. He's recently joined Novell as the Product Manager for Mono
which I think bodes very well for the Mono Project.&lt;/p&gt;
&lt;p&gt;In addition to co-presenting this session I'll be manning the
mojoPortal booth. I've still got a few available entrance passes for
anyone interested in attending and willing to help man the booth. We
have one session pass to share between the 4 entrance passes so we'll
have to take turns covering the booth and going to sessions. Let me
know if you're interested and are able to arrange your own travel to
the event.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5666164" width="1" height="1"&gt;</content><author><name>joeaudette</name><uri>http://weblogs.asp.net/members/joeaudette.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/joeaudette/archive/tags/ASP.NET/default.aspx" /><category term="mojoPortal" scheme="http://weblogs.asp.net/joeaudette/archive/tags/mojoPortal/default.aspx" /><category term="MySQL" scheme="http://weblogs.asp.net/joeaudette/archive/tags/MySQL/default.aspx" /><category term="Mono" scheme="http://weblogs.asp.net/joeaudette/archive/tags/Mono/default.aspx" /></entry><entry><title>hello weblogs.asp.net!</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/joeaudette/archive/2008/01/25/welcome-to-my-new-weblogs-asp-net-blog.aspx" /><id>http://weblogs.asp.net/joeaudette/archive/2008/01/25/welcome-to-my-new-weblogs-asp-net-blog.aspx</id><published>2008-01-25T12:32:00Z</published><updated>2008-01-25T12:32:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;Huge thanks to &lt;a href="http://weblogs.asp.net/joestagner/" mce_href="http://weblogs.asp.net/joestagner/"&gt;Joe Stagner&lt;/a&gt; and anyone else involved for opening up this service to the community! I think its a great idea. I subscribed to the main feed and am already enjoying reading some good posts from folks I might not otherwise have discovered. I'm very happy to have the opportunity to participate in this community.&lt;/p&gt;&lt;p&gt;My name is Joe Audette and I've been doing web development since around late 1996 or early 1997 having started out in Classic ASP and moved to .NET as soon as it was out. I'm the founder and primary developer of &lt;a href="http://www.mojoportal.com" mce_href="http://www.mojoportal.com"&gt;mojoPortal&lt;/a&gt;, an open source web site framework and content management system written in C#. I also have a blog on that site and I have one at &lt;a href="http://www.joeaudette.com" mce_href="http://www.joeaudette.com"&gt;JoeAudette.com&lt;/a&gt;, so I'll probably be cross posting things here to some extent from my other blogs. I'm also a musician so if you're interested you can hear me play at &lt;a href="http://www.myspace.com/sloppyjoeblues" mce_href="http://www.myspace.com/sloppyjoeblues"&gt;http://www.myspace.com/sloppyjoeblues&lt;/a&gt;. I play acoustic blues in the styles of the pre-war blues masters like Big Bill Broonzy, Robert Johnson, and Blind Boy Fuller.&lt;/p&gt;&lt;p&gt;If you haven't heard of &lt;a href="http://www.mojoportal.com" mce_href="http://www.mojoportal.com"&gt;mojoPortal&lt;/a&gt; yet, I hope you'll take a look. Its similar in concept to the more well known &lt;a href="http://www.dotnetnuke.com/" mce_href="http://www.dotnetnuke.com/"&gt;DotNetNuke&lt;/a&gt;, and was also born of the same IBuySpy Portal heritage. Back around 2002-2003 I was using &lt;a href="http://www.rainbowportal.net/" mce_href="http://www.rainbowportal.net/"&gt;Rainbow Portal&lt;/a&gt; (also of IBuySpy heritage) for my web site and contributed the Blog feature to that project. Then as I began learning about the &lt;a href="http://www.mono-project.com/Main_Page" mce_href="http://www.mono-project.com/Main_Page"&gt;Mono Project&lt;/a&gt;, the idea of being able to build cross platform applications using .NET was very exciting for me. I found that &lt;a href="http://www.beyondfocus.com/" mce_href="http://www.beyondfocus.com/"&gt;Joseph Hill&lt;/a&gt; had ported the IBuySpy Portal and some other ASP.NET projects to run on Mono. I say ported but really it was just fixing some things to keep it platform neutral. Using Path.DirectorySeparatorChar instead of hard coded strings and awareness of case sensitivity in urls and paths are really the main issues that had to be fixed. So I began looking into porting Rainbow Portal to run on Mono but I also wanted to support other databases. After studying it I felt that due to the way Rainbow was organized it was going to take major architectural changes to be able to use other databases. So I decided to go back to the IBuySpy drawing board and start from scratch following basic rules:&lt;br&gt; &lt;/p&gt;&lt;ol&gt;&lt;li&gt;the web code will never talk directly to the database &lt;br&gt;&lt;/li&gt;&lt;li&gt;business objects would not have strong references to any database but would instead consume only generic data objects like IDataReader &lt;br&gt;&lt;/li&gt;&lt;li&gt;the data layer would be abstracted away from the business code so it could be interchanged without touching the business logic if the API were implemented for another database. &lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So in the fall of 2004 I released the first version of mojoPortal, named after &lt;a href="http://www.mojoportal.com/gallery.aspx" mce_href="http://www.mojoportal.com/gallery.aspx"&gt;my dog mojo&lt;/a&gt;. It supported MS SQL or MySQL&amp;nbsp; and it worked on Mono. Since then the project has grown steadily in features and popularity and it now supports 5 different databases, MS SQL, MySQL, PostgreSQL, Firebird Sql, and SQLite.&lt;br&gt; &lt;/p&gt;&lt;p&gt;For the first several years I was working on mojoPortal in my spare time (some would say obsessively). Then in late 2006 I decided to follow my dream and try to make a living doing consulting around mojoPortal and formed my own company, Source Tree Solutions, LLC. My business model would be to keep improving mojoPortal to keep the popularity rising and hopefully generate consulting engagements from those who needed help with custom features that could integrate into their mojoPortal sites. It was a scary leap, but enjoying what I work on is very important to me so I went for it. I didn't make anywhere near as much in my first year as I made working for other companies but I did make enough to get by and that was my main goal for the first year. I invested more free time (as in not billable) than ever into mojoPortal over the year but was very happy doing it and feel like the product is really shaping up. My efforts have seemed rewarded by growth in interest in the project. Significant features like Polls and Surveys were contributed by the community this year and resource files have been translated into 12 languages now. &lt;/p&gt;&lt;p&gt;The project won &lt;a href="http://www.packtpub.com/article/mojoportal-wins-best-other-open-source-content-management-system" mce_href="http://www.packtpub.com/article/mojoportal-wins-best-other-open-source-content-management-system"&gt;"Best Other Open Source Content Management System"&lt;/a&gt; in the 2007 Packt Publishing CMS Awards.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.packtpub.com/article/mojoportal-wins-best-other-open-source-content-management-system" mce_href="http://www.packtpub.com/article/mojoportal-wins-best-other-open-source-content-management-system"&gt;&lt;img src="http://www.mojoportal.com/Data/SiteImages/best-other-open-source-cms.gif" title="mojoportal wins best other open source cms" alt="mojoportal wins best other open source cms" mce_src="http://www.mojoportal.com/Data/SiteImages/best-other-open-source-cms.gif" border="0" height="85" width="200"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;We've also been invited to the &lt;a href="http://www.mysqlconf.com/" mce_href="http://www.mysqlconf.com/"&gt;2008 MySQL Conference and Expo&lt;/a&gt; in Santa Clara, CA in April.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.mysqlconf.com/" mce_href="http://www.mysqlconf.com/"&gt;&lt;img src="http://www.mojoportal.com/Data/SiteImages/mysqlconf2008210x60.gif" title="visit the mojoportal booth at the 2008 mysql conference" alt="visit the mojoportal booth at the 2008 mysql conference" mce_src="http://www.mojoportal.com/Data/SiteImages/mysqlconf2008210x60.gif" border="0" height="60" width="210"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I'm really excited to make my first trip to silicon valley and the opportunity to get more exposure to mojoPortal.&lt;/p&gt;&lt;p&gt;Anyway I promise not to make all my posts here infomercials about mojoPortal. It is something I'm very passionate about and most of my work is involved in it so I will certainly talk about it more, but I plan to make some posts about solving technical problems or cool solutions that are of interest to anyone working with ASP.NET. &lt;br&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5650023" width="1" height="1"&gt;</content><author><name>joeaudette</name><uri>http://weblogs.asp.net/members/joeaudette.aspx</uri></author><category term="ASP.NET" scheme="http://weblogs.asp.net/joeaudette/archive/tags/ASP.NET/default.aspx" /><category term="mojoPortal" scheme="http://weblogs.asp.net/joeaudette/archive/tags/mojoPortal/default.aspx" /><category term="Content Management Server" scheme="http://weblogs.asp.net/joeaudette/archive/tags/Content+Management+Server/default.aspx" /><category term="C#" scheme="http://weblogs.asp.net/joeaudette/archive/tags/C_2300_/default.aspx" /></entry></feed>