Home Interviews Developers Our View Feeds The List

LiveSide - Developer Blog

December 2007 - Posts

  • Community Server Windows Live Addons now on CodePlex

    We use a number of Windows Live services at LiveSide, and now our Community Server guru, Nick Brown, has started a CodePlex project, "Community Server Windows Live Addons", at www.codeplex.com/CSLive. He's starting out with two controls:

    Currently there are two controls in the package, the windows live presence addon for adding Windows Live Messenger Presence icons to your installation, and the 2nd is the Windows Live Single Sign On Addon for Community Server.

    Nick plans to add more to the project, including Translator Controls, Live Search Control, Live Messenger IM Control, Live Contacts Control, and the Live Search Provider.

  • Tafiti Search Visualization - Overview

    If you head over to Codeplex you will find a number of Contoso Quick Applications posted there. Each one demonstrating various aspects of the Windows Live platform and showing you a "real world" style application that makes use of them, along with the source code so that you can easily apply the various techniques to your own web site.

    Today another web application has been released. The focus of this application is Silverlight and Windows Live Search. This short article will give you a quick overview of it's main features without doing a "deep dive" into exactly how it works.

    The Context

    Most people that I've known can relate to this.  You come across a problem and you need to do some online research, say for example, how to integrate Windows Live ID in with your web site. So you hit the Internet and start doing some searches, you find bits of information of one web site, some bits on one blog post, some bits on another. Then you want to find some images for a login and logout button. So you've got all these web sites that you need to remember where the information is and you possibly may also need to share you're research will a fellow worker that's working on the project with you.


    Well this is where Tafiti comes in. Tafiti, which means "do research" in Swahili, is an experimental search front-end from Microsoft, designed to help people use the Web for research projects that span multiple search queries and sessions by helping visualize, store, and share research results. Tafiti uses both Microsoft Silverlight and Live Search to explore the intersection of richer experiences on the Web and the increasing specialization of search. Tafiti is also available as a standalone site for those that don't want to dig into the code and just use or sample the application first hand, just head over to Tafiti.com.

     Initial_Screen

    The Deployment Guide

    Angus Logan and the crew from SharpLogic have taken a lot of time and effort and created an excellent deployment guide for this Quick Application. Setting it up is slightly more complex than previous Windows Live Quick App's however the Word document (2007 docx format) included with the download gives you step by step instructions on how to setup and get Tahiti working, including numerous screen shots where applicable. Overall, including registering the application with the search and Windows LiveID sites, setup shouldn't take you more than 5 minutes.

    Deployment_Guide 

    The Application

    When you initially run the application, you will be greeted by a simple search box, in the top left of the application are various links to terms and conditions etc. for this sample application along with a link allowing you to authenticate through Windows LiveID.

    So first we sign-in to the application :-

    Signin

    After logging in you are taken back to the initial search box. Simply enter any search term you like in the search box. This allows for the normal search parameters such as searching for exact phrases surrounded by quotes and exact matches using the "+" sign etc.

    LiveSide Search

    After you've entered a search term you'll be presented with a screen like above. The main portion of the screen is taken up with the results of your search, the search box has moved over to the left should you want to change your search term. Just below this is an options wheel which I'll get to in a minute and over on the right is a list of your saved results.  The default search is a web search.

    At the top of the search pane you can filter the results on based on another search query, for example, in the main search query I searched on the term "Liveside", I then filtered the list of results returned on "Angus" and the result was a single article/link :-

    Filtered Search

    The filtered search only filters the results that have been returned and are displayed on the page therefore it is very quick to filter.

    The Options Wheel

    On the left hand side, just below the search box you'll see the options wheel.

    OptionsWheel
    This gives you various options for defining your search query. The default as mentioned is a standard web search, however here you also have options for searching for pictures, News articles, RSS feeds and to search against your contacts.

    Each search term that you enter is saved and is represented on screen by a stack of cards :-

    SearchCards

    To see a previous search, simply close (Red X in upper left corner) the currently displayed card and the previous search term will appear and the output window will change to reflect this.

    Save your search results

    On the right hand side of the page, you have 5 "Buckets" in which you can save individual results. For example, if you do a search on Liveside and come across a link you like then simply drag it from the main window over to one of the buckets. The buckets will accept any of the search results, be it a link to a web page from the main web search function, an RSS feed, a picture etc.

    Buckets

    You can save multiple entries in each bucket, they essentially get stacked and can also label each bucket as a quick reminder. If you have signed in using Windows LiveID, these buckets get saved so that the next time you open the application, your saved searches will re-appear waiting on you.
    Clicking on a bucket will show you your saved searches, whether it be articles, pictures etc. or a mixture of each type.

    DisplaySavedSearch

    From here you can either email your saved to results to someone or post the results to your Windows Live Spaces blog site.

    Tree View

    If you wish something a little more visually exciting for your search results you can select the Tree View link at the top of the main search results list.

    Treeview

    The result of which is that your search results are displayed on a slowly rotating tree. This only works for standard Web searches and not for any of the other options in the Options Wheel.
    Along the bottom is a slider where you can increase or decrease the number of results displayed.
    A button in the top left takes you back to the sites main search page and a button in the top right displays the tree view results page full screen, essentially turning it into an interactive screen saver (although not secure as you simply press "ESC" to return back to normal).

    What's Next?

    The Tafiti Quick Application shows you some best practices and examples of how to integrate Windows Live Search and Windows LiveID with your Silverlight application. Next we will be taking a more in-depth look at this application and breaking down in a series of "deep dive" articles, so stay tuned.

  • Announcement: LiveNet Wrapper for Windows Live Developing

    My friend Luke Smith and I for the last month have been working on a new .Net wrapper for Windows Live, which we have called LiveNet. You might be thinking "what's the difference between that and Windows Live Tools", and the answer is simple, a fair bit. Windows Live Tools has what you need for Windows Live ID web authentication, Silverlight Streaming and Contacts control, which we don't do anything with. Now at this point, I would just like to say that the Contacts control is the embedded object, whereas what LiveNet will [eventually] have is from Windows Live Data.

    We have made this a .Net 2.0 wrapper, so it can be used with any web application that is 2.0 or above and at the moment we have only implemented the Live Photos API into the wrapper. So what does this mean? It means that we have built a set of classes that will allow you to interact with the Live Photos API without having to worry about any of the back end goings on. I shall go into more detail with some examples in just a moment.

    LiveNet is an opensource project that we have hosted on CodePlex, so feel free to check out the source code if you want to see what we're doing under the hood.

    Version 0.1 is now ready for you:
    Home Page: http://www.codeplex.com/LiveNet
    Download: LiveNet 0.1 Alpha (including documentation)

    Now for an example. At the download page above, there is a download for the sample website that I have built to just quickly show what you can do with LiveNet, but for this example, I thought I would just show how you can change the sample site on MSDN to use LiveNet. First off, you need to add a reference to the LiveNet dll, then we need to add a few lines into our web.config file:

      <configSections>
        <section name="liveNet" type="LiveNet.Configuration.ConfigurationSectionHandler, LiveNet"/>
      </configSections>
      <liveNet applicationName="LiveNetSample" authenticationObtainerType="LiveNetSampleWebsite.LoadAuthentication, __code">
        <spacesAuthorization permissionString="ReadOnly" permissionReturnUrl="~/bob.aspx" privacyUrl="~/privacy.aspx" useHttps="false"/>
      </liveNet>
      <httpHandlers>
        <add verb="*" path="photo.lnet" type="LiveNet.Web.LivePhotoHandler, LiveNet" />
      </httpHandlers>
    Default.aspx
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
       <title>LiveNet Sample Site</title>
    </head>
    <body>
       <form id="form1" runat="server">
       <div>
       
           <asp:Label ID="lblUserName" runat="server" Text="Signed in as: "></asp:Label>
           <br />
           <br />
           <asp:Button ID="btnGetAlbums" runat="server" onclick="btnGetAlbums_Click" 
               Text="Get Albums" />
           <br />
           <br />
           <asp:ListBox ID="lbAlbums" runat="server" Height="208px" 
               onselectedindexchanged="lbAlbums_SelectedIndexChanged" AutoPostBack="true" Width="260px">
           </asp:ListBox>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
           <asp:ListBox ID="lbPhotos" runat="server" Height="207px" Width="248px" 
               onselectedindexchanged="lbPhotos_SelectedIndexChanged" AutoPostBack="true">
           </asp:ListBox>
       
           <br />
           <br />
           <asp:Label ID="lblPhoto" runat="server" Text="Photo:" Visible="False"></asp:Label>
           <br />
           <asp:Label ID="lblPhotoLink" runat="server" Text="" Visible="False"></asp:Label>
           <br />
           <asp:Image ID="imgPhoto" runat="server" Visible="False" />
           <br />
           <br />
           Simple, huh</div>
       </form>
    </body>
    </html>

    Default.aspx.cs

    using System;
    using System.Configuration;
    using System.Data;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using LiveNet.Photos;
    using LiveNet.Authentication;
    
    public partial class _Default : System.Web.UI.Page
    {
        LivePhotos m_photos;
        protected void Page_Load(object sender, EventArgs e)
        {
            string DAT = "[Insert DAT here]";
            string userId = "example@live.com";
            lblUserName.Text = string.Format("Signed in as: {0}", userId);
            m_photos = new LivePhotos(userId, DAT, AuthenticationToken.DomainAuthenticationToken);
        }
    
        protected void btnGetAlbums_Click(object sender, EventArgs e)
        {
            Album[] albums = m_photos.ListAlbums();
            foreach (Album album in albums)
            {
                ListItem item = new ListItem(album.Name, album.AlbumUrl.ToString());
                lbAlbums.Items.Add(item);
            }
        }
        protected void lbAlbums_SelectedIndexChanged(object sender, EventArgs e)
        {
            Photo[] photos = m_photos.ListPhotos(new Uri(lbAlbums.SelectedItem.Value));
            foreach (Photo photo in photos)
            {
                ListItem item = new ListItem(photo.Name, photo.PhotoUrl.ToString());
                lbPhotos.Items.Add(item);
            }
        }
        protected void lbPhotos_SelectedIndexChanged(object sender, EventArgs e)
        {
            Photo photo = m_photos.GetPhoto(new Uri(lbPhotos.SelectedItem.Value));
            lblPhoto.Visible = true;
            lblPhotoLink.Text = photo.PhotoUrl.ToString();
            lblPhotoLink.Visible = true;
            imgPhoto.ImageUrl = string.Format("./photo.lnet?url={0}&oh={1}", photo.PhotoPath, photo.Owner.UserId);
            imgPhoto.Visible = true;
        }
    }

    As you can see, Default.aspx.cs is a lot smaller in size and much easier to look at and work with. There another file we need to add to the project so that it will work, for this, right click on your project and add new ASP.Net folder > App_Code:

    LoadAuthentication.cs

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    
    namespace LiveNetSampleWebsite
    {
        /// <summary>
        /// Summary description for LoadAuthentication
        /// </summary>
        public class LoadAuthentication : LiveNet.Authentication.IHttpAuthenticationObtainer
        {
            #region IHttpAuthenticationObtainer Members
    
            public void Get(HttpContext context, out string userId, out string token)
            {
                // This section is where you would have your code
                // to retrieve the userID and the token, whether it
                // be from a cookie, URL string or database.
                userId = HttpUtility.UrlDecode(context.Request.QueryString["oh"]);
                token = "[Insert DAT here]";
            }
    
            #endregion
        }
    }

    And there you have it. That will give you the same as what you get on the MSDN Sample Application. Please remember to change all instances of "[Insert DAT here]" with your actual DAT (which can be got from https://dev.live.com/livedata/sdk/) and "example@live.com" with your Windows Live ID.

    As mentioned, at the moment, this only has Live Photos in it, but we plan on adding more Live APIs to the project very soon, so keep an eye on it. Any feedback is always appreciated and should be directed to the discussion section of the project site on CodePlex.

    SL

  • Inviting Users to Share Online Presence

    Microsoft have released a new bit of documentation on MSDN which will allow sites to let their users show their Messenger presence on that website. The documentation gives you all the information you need, and code sample to get going with this straight away (if you're using an Asp.Net site).

    Now, here at LiveSide, we love it when new Windows Live technologies can be added and used on our site, and this is no different smile_wink. Our resident Community Server Guru, Nick, has managed to implement this into LiveSide; so how do you set it up?

    Your Messenger presence is only shown to registered users on LiveSide!

    First off, go to your edit profile page, and select the email tab:

    image

    Select Yes to Enable Live Presence and click Save. This will then take you to the Messenger Presence settings page where you have to grant permission for it:

    image

    Once accepted, this will take you back to your profile page where you will now see that your presence has been added to your profile:

    image

    You will also see that your Messenger presence will appear next to your name in the comments, like so:

    image

    Clicking on the presence images will then open a new window which will contain the IM Control and will let you start talking to that contact.

    SL

  • Add Silverlight to Sharepoint 2007

    Recently I was asked how to display Rich media (mainly video) in Sharepoint 2007 by our communications department. This shouldn't be too hard to do so time to whip up a quick demo/proof of concept to make sure that it in fact can be done, and what better way than to create a custom web part that embeds Microsoft's Silverlight.

    Adding Silverlight to your web application is easy enough so it shouldn't be too difficult to do in Sharepoint 2007 either. There are a few different files that you will need in order to do this however, a couple of Javascript files, a XAML and of course your custom web part.

    Silverlight

    So kick off Visual Studio and lets get cracking.  First off we'll create the Javascript file that you will need (the other one you don't create, just copy from the SDK but more on that later).

    I'm assuming that you have Sharepoint extensions for Visual Studio installed (currently available only for 2005 although a version for Visual Studio 2008 is apparently due out shortly).

    Go to File/New and select New Project from the list of available options. Next within the C# Project Type folder, go to the Sharepoint folder and select Web Part. Call it SilverLightPart, give it a location and hit OK.  This will create the outline of the custom web part we'll create later.

    Next right click on SilverLightPart project and select Add/New Item. In the dialog that pops up, click on the Visual C# Project Items under categories and select JScript for the Javascript file we'll create and call it CreateSilverLight.js.

    The Javascript function that we'll create is a small function that simply kicks off the main Silverlight Javascript routine. Copy the following code into your blank Javascript file :-

    function createSilverlight()

        Silverlight.createObject(
            "/_layouts/videoplayer.xaml",       // Source property value.
            parentElement,                      // DOM reference to hosting DIV tag.
            "myPlugin",                         // Unique plug-in ID value.
            {                                   // Plug-in properties.
                width:'320',                   // Width of rectangular region of plug-in in pixels.
                height:'200',                   // Height of rectangular region of plug-in in pixels.
                inplaceInstallPrompt:true,     // Determines whether to display in-place install prompt if invalid version is detected.
                background:'white',             // Background color of plug-in.
                isWindowless:'true',           // Determines whether to display plug-in in windowless mode.
                framerate:'24',                 // MaxFrameRate property value.
                version:'1.0'                   // Silverlight version.
            },
            {
                onError:null,                   // OnError property value -- event-handler function name.
                onLoad:null                     // OnLoad property value -- event-handler function name.
            },
            null,                               // initParams -- user-settable string for information passing.
            null);                              // Context value -- passed to Silverlight.js onLoad event handlers.
    }

    The code is commented so it's fairly self explanatory. Here we are instantiating the actual Silverlight object. This takes a number of parameters. The first parameter is where the Silverlight object can find the associated XAML file that it requires, next is a reference to a DIV tag that Silverlight will be embedded in, the third parameter is a Unique ID for the plugin followed by a number of parameters giving the width, height, framerate of the video etc. etc.

    In the above code, the only parameter that I am effectively passing in is the parentElement parameter, however in your own code you may want to pass in parameters for the XAML file, the width and height properties and a Unique ID. And that's all there is to this file.

    Next we want to create the XAML file that this script references, so add an XML file to your project and call it VideoPlayer.XAML. Delete the default <xml> tag that has been created and insert the following :-

    <Canvas
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            x:Name="root"
            >
        <Canvas x:Name="VideoLayer">
            <MediaElement x:Name="media" Source="http://download.microsoft.com/download/d/e/2/de2bec9c-4ba1-406e-8029-5c4767dca3eb/WPFE_Getting_Started_2MB_Ch9.wmv"
                Width="300" Height="200" />

        </Canvas>
    </Canvas>

    Here we are defining the root element to be a canvas (just like the canvas painters use to paint on, a blank area with potential) and pointing to the relevant xml namespaces required for XAML files. Next we create our actual Canvas in which we will display our video file. The video file is marked up in XAML using the <MediaElement>  tag and here we simply point it to a video that we wish to display and give it a width and height (width and height are optional but if you do input these they are in pixels. You cannot use percentages e.g. 100%).  Since this is just a proof of concept we'll end things here. You can of course add whatever you like to the XAML file, video controls for play, pause etc. and hook into Javascript events that will deal with them, skin it to give it your own personal touch, overlay controls or text etc. For more information on how to do these things you may want to take a look at the excellent Quick Start videos that are freely available on MSDN at the moment.

    The last Javascript file that you will need is the actual Silverlight javascript file itself. In order to get this file you will need to download a copy of the SDK found here.

    OK so that is the ancillary files out of the way, next we start on the web part itself. I'm not going to do anything fancy here, simply display the Silverlight control which has the video file hard coded within it, however you may want to create your own web part editor and add inputs so that an end user could select the video source, change the width and height etc.
    Back to our web part. Open the SilverLightPart.cs file. As you will see, the Microsoft Sharepoint template that you loaded from has already given you an outline to what you will need, so all we need to do is flesh it out a bit. Here is the finished code :-

    using System;
    using System.Runtime.InteropServices;
    using System.Web.UI;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Serialization;
    using System.Security;
    using System.Security.Permissions;

    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
    using Microsoft.SharePoint.WebPartPages;

    [assembly: AllowPartiallyTrustedCallers]
    namespace SilverLightPart
    {
        [Guid("07cd69ef-44e8-403a-93d8-9aa2bdb4f37a")]
        public class SilverLightPart : System.Web.UI.WebControls.WebParts.WebPart
        {
            public SilverLightPart()
            {
                this.ExportMode = WebPartExportMode.All;
            }

            protected override void Render(HtmlTextWriter writer)
            {
                writer.Write("<div id='slControlHost'>\n");
                writer.Write("<script type='text/javascript'>\n");
                writer.Write("var parentElement = document.getElementById('slControlHost');\n");
                writer.Write("createSilverlight();\n");
                writer.Write("</script>\n");
                writer.Write("</div>");
            }

            protected override void OnPreRender(EventArgs e)
            {
                string script = "<script type='text/javascript' src='/_layouts/CreateSilverlight.js'></script>\n";
                string script2 = "<script type='text/javascript' src='/_layouts/Silverlight.js'></script>\n";
                if (!Page.ClientScript.IsClientScriptBlockRegistered("Silverlight"))
                {
                    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Silverlight", script2);
                }
                if (!Page.ClientScript.IsClientScriptBlockRegistered("CreateSilverlight"))
                {
                    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CreateSilverlight", script);
                }
                base.OnPreRender(e);
            }
        }
    }

    First we've added a couple of extra namespaces and the Assembly reference to allow for partially trusted callers. This is a security setting used within Sharepoint. Each web part has to have it's own GUID but this is already supplied for you by the template (as well as the .snk file for signing your DLL when you build it amongst other things).

    Next we have the constructor. As this is essentially an ASP.Net 2.0 web part and not specifically a Sharepoint web part, this setting allows you to export this web part so that you can use it in other sites. This isn't actually required for a Sharepoint web part and you can feel free to delete ExportMode line, however you do require a constructor, even if it's blank.

    Next we have the Render method. The contents in here is actually what will be written to the page. As this was just a proof of concept, I hard coded these lines, however if you were actually building this web part for deployment you might want to use RenderBeginTag, RenderEndTag and AddAttribute methods instead.
    Here all that we're doing is defining is DIV which will hold the silverlight control, then adding some javascript to create the variable parentElement and call the createSilverLight Javascript function we defined earlier. As you may remember, the parentElement variable is actually used within createSilverLight function to tell the Silverlight control where to display.

    Finally we override the OnPreRender event. We have to add our two Javascript files to the page. Here we're simply saying that if these Javascript files aren't contained within the page, then add the references to them.

    And that's it. Build your project and next we'll deploy it.

    First things first, we want a place that we can add the Javascript and XAML files to so that they can be references no matter where you deploy the web part within the site. As you may have picked up from the source above, I've chosen the _Layout directory as this is globally accessible.
    Within Windows Explorer, navigate to  C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\Template\Layout and copy both the Javascript files (Silverlight.js and CreateSilverLight.js) and the XAML file (VideoPlayer.XAML) into this directory.
    Next navigate back to where you created your project and copy the dll from the bin directory to the clipboard (CTRL + C or right click the file and select copy). Now navigate to your Sharepoint site. This will normally be found under the c:\inetpub\wwwroot directory then navigate to your sharepoint sites' bin directory (your sharepoint site may be under the wss\VirtualDirectories folder within the wwwroot folder) and paste the dll into the bin directory.

    Nearly done, next we have to ammend the web.config file to tell Sharepoint that our web control is safe to use. So open the web.config file for your site in either Visual Studio or notepad and add this to the end of the list of SafeControls already defined there :-

    <SafeControl Assembly="SilverLightPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5" Namespace="SilverLightPart" TypeName="*" Safe="True" />

    As we've changed the web.config file it's always best to do an IISReset so that Sharepoint will immediately pick up the new config file.
    Now open your Sharepoint site, and under the Site Actions menu select Site Settings and Modify All Site Settings. From the page that appears, click on the "Web Parts" link under the Galleries heading then click on New. Find the Silverlight webpart and select the checkbox next to it then click on the Populate Gallery button at the top.

    All that is left is to add your new Silverlight video streaming web part to your page. Navigate to the Sharepoint page where you wish to add this web part, select Edit Page from under the Site Actions menu, click on one of the Add Web Part links that are on the page and add the SilverlightPart web part to your page (found under Miscellaneous).

    Sharepoint

    And there you have it, how to add Silverlight to your Sharepoint 2007 site.

  • Microsoft releases Volta Tech Preview

    Today, Microsoft announced the availability of the Volta Technology Preview. Volta is a toolset that allows to developers to split their application easily into different client and server parts. This decision is usually taken very early in the design process, but Volta allows this decision to be postponed to the last possible moment. Volta integrates very well in Visual Studio and with the .NET Framework, supporting AJAX, JSON and more. It basically extends the .NET platform to Software+Services (SaaS) applications, by using existing and familiar libraries, languages, tools, and techniques.

    Volta allows you to develop a complete web application in 1 layer and allows you to make decisions about moving logic to other layers late in the development process, letting the compiler manage creating boilerplate code such as communication between the layers. Due to the deep integration in Visual Studio, developers can easily debug the original application, without worrying about the details. Because the amount of information a developer has to learn is minimized and because Volta automatically generates the code needed for splitting up an application, developers can spend more time in other things, in for example testing. Specifying what should run on a client and what should run on a server is as easy as marking functions with attributes.

    Volta support the creation of web Applications and web Controls, where an Application consists of multiple pages, a Control consists of a collection of controls (for example two textboxes and a button). Both Applications and Controls are available via a template in Visual Studio.

    In order to use Volta for web application development, you'll need:

    • .NET Framework 3.5
    • Visual Studio 2008
    • A web browser

    When using this software, please remember that it is experimental and that it may take many years to realize the full vision. However, you're encouraged to download it and give it a try!

    Thanks to Mary Jo Foley for informing us.

LiveSide Latest Posts

Web Slice coming soon...
Copyright (c) 2006-2007-2008 Liveside
Listed on the Offical CS Listings Powered by Community Server, by Telligent Systems Themed By nb development Banner Logo By pxb Designed By Mark Sutherland