Skip Navigation Links / Posts / Post

How to build a Vista Sidebar Gadget with a Flyout Window

Categories

This article discusses how to create a Vista Sidebar Gadget using a technique called "screen scraping" to fetch data from an external web page.  I'm not sure what the actual protocols are for using data from another site but at the very least I think that you should first gain the permission of the owner of the web page before doing so.  If you would like to learn more about screen scraping then this Wikipedia article is a great place to start: Screen Scraping article on Wikipedia.

 

The code that accompanies this article can be downloaded from here.

 

Getting Started

To get things started create a folder named ScraperGadget and add the following things into it:

  1. An HTML file named ScraperGadget.html
  2. An HTML file named Flyout.html
  3. An XML manifest file named Gadget.xml
  4. A JavaScript file named Main.js
  5. A CSS file named Main.css
  6. A CSS file named Flyout.css
  7. Create a folder named "Images" and add an icon for yourself and one for the gadget. 

In my images folder I have the following images for my icons:

Scraper Gadget images

Adding a Manifest

Open the Gadget.xml file and add the following content for your manifest definition:

<?xml version="1.0" encoding="utf-8"?>
<gadget>
    <name>Dilbert Homepage Scraper Gadget</name>
    <namespace>MarkItUp.Gadgets</namespace>
    <version>1.0</version>
    <author name="Darren Neimke">
        <info url="http://MarkItUp.com" />
        <logo src="images/MarkItUpIcon.jpg"/>
    </author>
    <copyright>MarkItUp.com 2006</copyright>
    <description>
        A Gadget allows a user to display content from the Dilbert home page
        which is located here: http://dilbertblog.typepad.com/.
    </description>
    <icons>
        <icon height="48" width="48" src="images/scraper.jpg"/>
    </icons>
    <hosts>
        <host name="sidebar">
            <base type="HTML" apiVersion="1.0.0" src="scrapergadget.html"/>
            <permissions>Full</permissions>
            <platform minPlatformVersion="1.0"/>
            <defaultImage src="images/scraper.jpg"/>
        </host>
    </hosts>
</gadget>

 To learn more about the makeup of a Gadget manifest file, view the following MSDN article:

http://msdn2.microsoft.com/en-us/library/aa965879.aspx

Defining the HTML User Interface

Finally, add some HTML into the ScraperGadget.html file to get things started:

<!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>
        <title>Dilbert Homepage Scraper Gadget - Main</title>
        <script src="main.js" language="javascript" type="text/javascript"></script>
        <link href="main.css" rel="stylesheet" type="text/css" />
    </head>
    <body onload="initializeMain();">
        <ul id="myList"></ul>
        <div id="errorView"></div>
    </body>
</html>

That's all that we need at this stage for the main view of our gadget which will ultimately display a list of the titles of the posts on the main page of the Dilbert website.  You can see how the gadget has a reference to both the main.js file and also the main.css file and if you take a look at the body tag, you can see that we call a function named initializeMain() to get things rolling.

A pinch of CSS

To make our gadget look a little nice we can add some CSS code to spice up the UL and LI elements and alter the default font sizes to get more text into our small viewing space.  Here is the code for Main.css:

body {
    margin: 4px;
    width: 130px;
    height: 245px;
    font: 9pt Calibri;
    color: #000;
    background-color:#cccccc;
}

a {
    color: #ffffff;
    text-decoration: none;
    text-overflow:ellipsis;
}

a:hover {
    color: red;
    text-decoration: underline;
}

ul {
    width: 90%;
    border: 1px solid #000;
    background-color: #8aa;
    padding: 0px 5px ;
    cursor: default;
    margin-left: 0px;
}

ul li {
    list-style-type: none;
    margin: 0px;
    position: relative;
}

ul li:hover {
background-color: #ffa;
color: #000;
}

 

The Javascript behavior code

The initializeMain function is responsible for grabbing the source of the page that we are scraping, breaking it down into an object model, and then displaying elements of that object model onto the page.  Here is the content of the initializeMain function:

 

function initializeMain() {
    try {
        var scraper = new WebScraper() ;
        gPageString = scraper.Scrape(gURL) ;
        parseDocument() ;
        renderDocument() ;
    } catch ( ex ) {
        displayError( ex.message ) ;
    }
}

There's some error handling and other stuff in there but it's mostly just fetching data and formatting it on the page.  You can learn about the underlying screen scraping code by reading the following article and by downloading the source files for this article and going through them:

http://markitup.com/Posts/Post.aspx?postId=96d2941f-591f-4363-b5a5-0535ef710f1b

One interesting thing about the parsing of the HTML is that we break it down into an object model before we display it - this makes the data much simpler to work with when the gadget is running.  Here's the code for the Article data class that we store each article's data in:

function Article(title, body, index) {
    this.Title = title ;
    this.Body = body ;
    this.Index = index ;
}

Each instance of this class will have a Title, Body, and Index property that we can access when we want to use the data.  In the parseDocument function we actually grab each article from the page, create an Article object for each one, and store the whole lot of them in a globally-scoped Array so that we can use and access the data on-demand quite easily.  The code for the parseDocument function is shown here:

function parseDocument() {
    var titlePattern = "<h3 class=\"entry-header\">(([^<]|.)+?)</h3>" ;
    var bodyPattern = "<div class=\"entry-body\">(([^<]|.)+?)</div>" ;
    var matches = new RegexHelper().Matches( gPageString, titlePattern ) ;

    var titles = new Array() ;
    for( i=0; i<matches.length; i++ ) {
        titles[i] = matches[i].Groups[0] ;
    }

    matches = new RegexHelper().Matches( gPageString, bodyPattern ) ;
    for( i=0; i<matches.length; i++ ) {
        var body = matches[i].Groups[0] ;
        var article = new Article(titles[i], body, i) ;
        gArticles[i] = article ;
    }
}

Once we have our array (gArticles) of Article objects, all that remains is to render a list of their titles in our gadget - this task is performed by the renderDocument function:

function renderDocument() {

    for( i=0; i<gArticles.length; i++ ) {
        var article = gArticles[i] ;
        var text = document.createTextNode(article.Title);
        var e = document.createElement("li");
        var a = document.createElement("a");
        a.dataIndex = article.Index; // custom prop

        a.attachEvent('onclick', handleClick);

        a.appendChild(text);
        e.appendChild(a);
        myList.appendChild(e);
    }
}

It's important to highlight that the way that this code wires up the handleClick event hander is not by any means cross-browser compatible, but it's running in the gadget runtime which is the same as IE so that's not important.  The handleClick event handler is a simple function that will be invoked whenever the user clicks on a title and will display the content in a gadget Flyout window.  For now simply add the following code for handleClick function in the main.js file and we'll test our gadget:

function handleClick(event){
    var selectedIndex = event.srcElement.dataIndex ;
    errorView.innerHTML = "You clicked on article " + selectedIndex ;
}

As you can see, this code will simply display the index of the article that was clicked on in our errorView DIV element.

An Initial Test of our Gadget

The simplest way to test the gadget is to open the ScraperGadget.html file in a browser to check that everything runs OK.  Running the page and clicking on an article heading show give you a result similar to this:

Scraper Gadget in browser

Once you've got it working in the browser it's time to package up the gadget and get it running in the Vista Sidebar.  Open the ScraperGadget folder and create a .zip file of all the contents.  When the .zip package is created, rename it to ScraperGadget.gadget (NOTE the .gadget extension!).  Upon renaming to a .gadget file, the icon should change to indicate that the package is now a gadget package.  Double-click on this file to begin the installation.

ScraperGadget gadget file

Double-click on the gadget and press 'Install' when asked.  After doing that the gadget should now appear in the Sidebar like so:

ScraperGadget gadget file

The Dilbert screen scraping gadget is displayed at the head of the list here - just above my custom Cricket Gadgetsmile_regular  If you open the Sidebar gallery (by pressing the + icon at the top of the Sidebar, you will see how the gadget has used the data in the manifest file to display information about itself:

ScraperGadget in gadget gallery

 

Adding the Flyout code

Now we've tested out gadget and can see that the important bits are all working as they should be.  We've rendered the UI for the default view and have our object model stored nicely in memory.  It's time to open that Flyout.html file and get started with creating the flyout behavior.  When we've finished we'll have a flyout that will display the stories behind those headlines, here's a peek at the finished product:

ScraperGadget with flyout

 The behaviour here is similar to the RSS Gadget that comes as a standard gadget with Windows Vista.  In the picture you can see that the user has clicked on the first article in the list and this has then displayed the entire post content in the flyout window.  The title of article is displayed at the top of the flyout and the body of the article is displayed in a scrollable DIV element.  If the user clicks on the same article title in the list, the flyout will close but if they click on another title then its content will be displayed in the flyout.

Just as with the main window, the HTML for the flyout is dirt simple:

 

<!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>
        <title>Dilbert Homepage Scraper Gadget - Main</title>
        <script src="main.js" language="javascript" type="text/javascript"></script>
        <link href="flyout.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <div id="flyoutBackground">
            <h4 id="title"></h4>
            <div id="bodyContent"></div>
        </div>
    </body>
</html>

You can find the CSS for those elements in the download for this article.

Loading the Flyout Window

It's now time to revisit that handleClick function which receives the clicks from the links in the list and add the code for displaying the Flyout.

var gSelectedIndex = -1 ;

function handleClick(event) {
    var idx = event.srcElement.dataIndex ;

    if( idx == gSelectedIndex ) {
        gSelectedIndex = -1 ;
        System.Gadget.Flyout.show = false ;
    }else{
        gSelectedIndex = idx ;
        if(System.Gadget.Flyout.show) {
            addContentToFlyout();
        } else {
            System.Gadget.Flyout.show = true;
            System.Gadget.Flyout.onShow = function() {
                addContentToFlyout();
            }

            System.Gadget.Flyout.onHide = function() {
                gSelectedIndex = -1 ;
            }
        }
    }
}

Here we can see that the handleClick function gets the index of the link that was clicked and compares it against the previously clicked item in the list; if it's the same as the previous selection then we reset the selected index and hide the flyout.  If the index is different to the previously selected one we check to see whether the flyout window is open and then load the content into it with our addContentToFlyout function.  You can also see that whenever the flyout is shown we wire up event handlers for the onShow and onHide events.

Finally, the code for adding content to the flyout is dirt simple:

function addContentToFlyout() {
    try {
        if(System.Gadget.Flyout.show) {
            var flyoutDoc = System.Gadget.Flyout.document;
            var article = gArticles[gSelectedIndex] ;
            flyoutDoc.getElementById("title").innerHTML = article.Title ;
            flyoutDoc.getElementById("bodyContent").innerHTML = article.Body ;
        }
    } catch ( ex ) {
        displayError( ex.message ) ;
    }
}

We simply get a handle to the document in the Flyout window, grab the current article object from our list of articles and then bind the Title and Body properties of that object to some HTML elements in the window.

I encourage you to download the code that accompanies this article and to play around with customizing it for your own purposes.

posted 12/30/2006 4:33:00 PM

 

Comments:

# Flyout Gadget
posted by GT on 1/31/2007 9:59:20 AM :

Wow! That is really in depth. Would you mind if I added to my blog of useful gadget tutorials? http://www.gadgettutorials.com/

# Yes please!
posted by Darren Neimke on 1/31/2007 10:55:37 AM :

Hi GT, absolutely. That would be great thanks!

# Cool Daily Dilbert Gadget
posted by Rocks on 2/27/2007 10:49:22 AM :

nice article

Also CHECK the Daily Dilbert Gadget here

http://www.codeproject.com/gadgets/DailyDilbert.asp

# Question
posted by Dave on 3/23/2007 12:46:27 AM :

When I install, the sidebar says, “The data necessary to complete this operation is not yet available”.

Any clues?

# Nice Tutorial Dude!
posted by RockyH on 4/25/2007 6:35:30 PM :

Hey Buddy! Just thought I'd add my $0.02. Great job on this one. It helped me with my upcoming Tech Ed Gadget. :-)

Thanks!

# Thanks Rock..
posted by Darren Neimke on 4/25/2007 6:37:27 PM :

Ta dude!

# Not very helpful
posted by Nbpf on 10/6/2007 12:32:54 AM :

I think you went too far with the tutorial, it would be a lot more helpful if you had just refered to the javascript method to call the flyout. Thanks you anyway, but this wasn't any helpful to me.
Plus this box to send comments isn't very friendly either, I tried to post without puting a Subject and it scrolled the window to the top and made me think my comment was posted, but it wasn't. And the captcha thing works very bad also.

This is just a constructive critic, don't you think i'm just blaming you; indeed i like your page and its mostly full of useful resources, but when things aren't good they need to be commented that way.

See you..

# Yeah...
posted by Darren Neimke on 10/6/2007 9:17:46 PM :

This website sucks... but I disagree about the content of this particular article. I wrote it so that I could remember all of those little steps. I wrote it for me.

# I agree, Darren
posted by Joel Gray on 11/8/2007 9:49:39 AM :

Darren, this is an excellent post! At times I too will create posts with the primary purpose for later retrieval. This one was very detailed which is nice. I am in the middle of created a twitter gadget since I have failed to find an existing one that suites me and had made it to the point of needing to create the flyout, so bravo and thank you!

# Thanks Joel...
posted by Darren Neimke on 11/8/2007 9:59:42 AM :

Glad it helped... and thanks for the feedback!

# a little help plz..!!
posted by lanka on 1/29/2008 5:08:43 AM :

hey darren, though the artilcle explains everything in brief i jus got stuck at a place..when i added all the content you gave to the main.js an tried to open the ScraperGadget.html file in a browser to check that everything runs fine, i failed.It just opens a browser window with a very small rectangular empty box.Could you please tell me if i have to make any changes to the code you gave??

# Error in initializeMain
posted by Don Wilson on 2/16/2008 6:54:11 AM :

Why am I getting 'System' undefined in initializeMain?

System.Gadget.Flyout.file = "flyout.html";

I am running the gadget.html under Internet Exployer.

Thanks,
Don

# same problem as lanka
posted by bob on 3/28/2008 7:13:11 AM :

i'm also having a small rectangular box appear. If you know the problem can you please try and find out the problem?

Good article by the way.

# Been a while...
posted by Darren Neimke on 3/28/2008 7:28:09 AM :

Hi bob, thanks for your question. Unfortunately it's been a long time since I played with Vista Gadgets and don't really have anything set up to debug this any more. Sorry! :-)

# gadgets
posted by American on 4/14/2008 7:46:13 AM :

if you want to show off, then http://www.gadgetsdownload.com is a good site any images of the gadgets created here?

# another helpfull site
posted by Dusty on 12/23/2008 7:46:55 AM :

This article could also assist: <a href="http://laymensterm.blogspot.com/2008/12/create-vista-sidebar-gadget.html">Create a Vista SideBar Gadget</a>

# Another helpfull article
posted by Dusty on 12/23/2008 7:48:38 AM :

oops, sorry about the URL, here it is: http://laymensterm.blogspot.com/2008/12/create-vista-sidebar-gadget.html

# Link error
posted by Tobias on 3/17/2009 12:43:18 AM :

Hi! The link to download the code seems broken!.. ;(

# wow gold
posted by wow gold on 6/11/2009 5:34:35 PM :

http://www.inwowgold.com/">http://www.inwowgold.com/">http://www.inwowgold.com/">http://www.inwowgold.com/ wow gold
http://www.inwowgold.com/">http://www.inwowgold.com/">http://www.inwowgold.com/">http://www.inwowgold.com/ buy wow gold
http://www.inwowgold.com/">http://www.inwowgold.com/">http://www.inwowgold.com/">http://www.inwowgold.com/ cheap wow gold
x-6.11

# watches
posted by wholesale watches on 6/18/2009 1:19:00 PM :

very nice site...
http://www.wholewatches.com/
x-6.18

# Thanks for the gadget
posted by men health on 7/12/2009 5:00:17 PM :

Thanks Darren. I was looking for this gadget for a while. It looks nice and is very helpful.

# safasfsaf
posted by rom gold on 7/17/2009 3:36:59 PM :

Aion Kina,Aion Gold,Aion Money

<a href="http://www.aiongd.com">Aion">http://www.aiongd.com">Aion">http://www.aiongd.com">Aion">http://www.aiongd.com">Aion Kina</a>

<a href="http://www.aiongd.com">Aion">http://www.aiongd.com">Aion">http://www.aiongd.com">Aion">http://www.aiongd.com">Aion Gold</a>

<a href="http://www.aiongd.com">Aion">http://www.aiongd.com">Aion">http://www.aiongd.com">Aion">http://www.aiongd.com">Aion Money</a>

Rom Gold, Runes of Magic Gold

<a href="http://www.iromgold.com">">http://www.iromgold.com"> Rom Gold </a>

<a href="http://www.iromgold.com">">http://www.iromgold.com"> Runes of Magic Gold </a>

Cabal Alz,Cabal gold

<a href="http://www.mycabalalz.com">">http://www.mycabalalz.com"> Cabal Alz </a>

<a href="http://www.mycabalalz.com">">http://www.mycabalalz.com"> Cabal Gold </a>

Runescape Gold,RS gold,RS GP,Runescape GP

<a href="http://www.rscoin.com">">http://www.rscoin.com"> Runescape Gold </a>

<a href="http://www.rscoin.com">">http://www.rscoin.com"> RS gold </a>

<a href="http://www.rscoin.com">">http://www.rscoin.com">RS GP </a>

<a href="http://www.rscoin.com">">http://www.rscoin.com">Runescape GP</a>

Dofus Gold,Dofus Kamas

<a href="http://www.51kamas.com">">http://www.51kamas.com"> Dofus Gold </a>

<a href="http://www.51kamas.com">">http://www.51kamas.com"> Dofus Kamas </a>

MapleStory Mesos,MapleStory gold

<a href="http://www.maplestorygd.com">maplestory">http://www.maplestorygd.com">maplestory mesos</a>
<a href="http://www.maplestorygd.com">maplestory">http://www.maplestorygd.com">maplestory gold</a>

4story gold,4Story Luna

<a href="http://www.the4storygold.com">4story gold</a>

<a href="http://www.the4storygold.com">4Story Luna</a>

12Sky2 Gold,buy 12sky2 Gold

<a href="http://www.my12sky2gold.com">12Sky2 Gold</a>

<a href="http://www.my12sky2gold.com">buy 12sky2 Gold</a>





# sss
posted by apuestas on 7/20/2009 8:27:35 PM :

http://www.apuestasdeportivaseu.com/
http://www.apuestasdeportivaseu.com/category/casas-de-apuestas
http://www.apuestasdeportivaseu.com/bonos-de-apuestas
http://www.apuestasdeportivaseu.com/bet365.htm
http://www.apuestasdeportivaseu.com/expekt.htm

# buy wow gold
posted by wow gold on 7/29/2009 6:37:40 PM :

http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/ wow gold
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/ buy wow gold
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/ cheap wow gold
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/ World of Warcraft Gold
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/eve/ Cheap EVE ISK
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/power-leveling/ wow power leveling
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/eve/ EVE Online
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/Final-Fantasy-XI-Gil/ Final Fantasy XI
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/everquest/ Ever Quest
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/everquest-2/ Ever Quest 2
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/Fly-For-Fun/ Fly For Fun
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/Gaia-online/ Gaia online
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/gw/ Guild Wars
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/maple-story/ Maple Story
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/Perfect-World/ Perfect World
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/SilkRoad/ SilkRoad
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/swg/ Star Wars Galaxies
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/Tibia/ Tibia
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/lineage-2/ Lineage 2
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/Aion/ Aion
http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/">http://www.mygamevip.com/sitemap.html wow gold
x-7.29

 

Comments are currently disabled for this post.