Andy Smith's Blog

Page.RegisterStartupScript('Andy', 'MetaBuilders_WebControls_GainKnowledge();');

How to use clientscript in custom controls

So you want to build a custom asp.net control. And you want to have some whiz bang, complex script that goes with it. Well, there are a few methods on System.Web.UI.Page that help you emit script into the right places, but the docs on these methods don't really tell you the whole picture at once. A beginning control developer ends up hacking his way thru things, and asking tons of questions on this stuff in the lists. It's taken me a while, but now I've got what I consider to be the Right Way© to emit script for your controls, and I will now impart this knowledge onto the masses ( err, the 7 people who read this blog ). Not to say that I follow this advice to the letter for every control of mine, but hey, it was a learning experience.

So you want to build a custom asp.net control. And you want to have some whiz bang, complex script that goes with it. Well, there are a few methods on System.Web.UI.Page that help you emit script into the right places, but the docs on these methods don't really tell you the whole picture at once. A beginning control developer ends up hacking his way thru things, and asking tons of questions on this stuff in the lists. It's taken me a while, but now I've got what I consider to be the Right Way© to emit script for your controls, and I will now impart this knowledge onto the masses ( err, the 7 people who read this blog ). Not to say that I follow this advice to the letter for every control of mine, but hey, it was a learning experience.

First off, here are the relevant methods on Page for script stuff:

  • GetPostBackEventReference
  • RegisterArrayDeclaration
  • RegisterClientScriptBlock
  • RegisterStartupScript
  • There are more, for more esoteric needs, but this is what i'm covering right now

GetPostBackEventReference
Like the docs hint at but don't quite say, this method returns the script that calls __doPostBack. However, never type the function name "__doPostBack". Neither function name nor the specifics of the args it takes, are guarenteed to be the same for future versions of asp.net. Just use the returned value of this function instead. Always.

The Three Registers
Here's the deal on how these three should work together. RegisterClientScriptBlock says what to do, RegisterArrayDeclaration says who to do it to, and RegisterStartupScript just says Go.

If that was confusing, here's a lot more detail... 

RegisterClientScriptBlock is where you put generic, non-control-instance-referencing code. That's not to say it can't have knowledge of the control design, but it shouldn't have knowledge of any specific controls on the page, by ID or any other way. Any of your control's IDs should be variables that this library uses. This lets you have 1 big library of code that can just be plopped onto the page with no worries about multiple controls or page structure or anything. It should have an entry point function ( I recommend something like MetaBuilders_WebControls_FooControl_Init ) where everything gets set up, properties are set, event handlers are added, etc. I'll go into good practices for this script later, for now i'm going to stay at the overview level.

RegisterArrayDeclaration is where you put the control id's that you are avoiding in the code library. Simply pick a name for your array ( I recommend the namespace qualified plural name of your control, with _'s, MetaBuilders_WebControls_FooControls ) and use the ClientID or UniqueID as the value, depending on needs. ( needs which I'll go over later ) This array is then accessed in your library's Init function in order to get references to each control instance on the page. Sometimes you'll find a need to include more than just the ID in the array value, when that happens, you can use a special property-value syntax i'll get into later.

RegisterStartupScript should generally have one line of code. Just call the Init function and kick things off.

How To Write The Library
Ok, so far I've only said that the lib should have an Init, and use the ClientIDs in the registered array to do stuff. Here's how I would write the lib... First, a typical Init skeleton looks something like this:

function MetaBuilders_FooControl_Init() {
  // Make sure the browser supports the DOM calls or JScript version being used.
  if ( !MetaBuilders_FooControl_BrowserCapable() ) { return; }

  // Loop thru the array of control ClientIDs and get a reference to the element
  for ( var i = 0; i < MetaBuilders_FooControls.length; i++ ) {
    var myFooControl = document.getElementById( MetaBuilders_FooControls[i] );

    //TODO Do stuff with myFooControl
    
  }
}

function MetaBuilders_FooControl_BrowserCapable() {
  if ( typeof( document.getElementById ) == "undefined" ) {
    return false;
  }
  //TODO Add any more checks you need to
  return true;
}

If you need to support browsers that don't have getElementById, then you'll need to do a few emit the UniqueID into the array, and use a form/input searching function to find the correct control. That would look something like this:

function MetaBuilders_FooControl_FindControl(uniqueID) {
  for( var i = 0; i < document.forms.length; i++ ) {
    var theForm = document.forms[i];
    var theControl = theForm[uniqueID];
    if ( theControl != null ) {
      return theControl;
    }
  }
  return null;
}

But in short, the Init method loops thru the array of IDs, and does fun stuff with the control. But what if you have composite control, and you want to do fun stuff with the child controls. Then your array declaration and your Init function will look a bit different. You'll want to give RegisterArrayDeclaration the ClientIDs of all the child controls you want to interact with instead of just the one parent. So lets say you have a composite control with two textboxes inside. your array bit might look like this:

Page.RegisterArrayDeclaration("{ ID:'" + this.ClientID + "', firstTextBoxID:'" + this.firstTextBox.ClientID + "', secondTextBoxID:'" + this.secondTextBox.ClientID + "' }");

then your init function might change to this:

function MetaBuilders_FooControl_Init() {
  // Make sure the browser supports the DOM calls or JScript version being used.
  if ( !MetaBuilders_FooControl_BrowserCapable() ) { return; }

  // Loop thru the array of control ClientIDs and get a reference to the element
  for ( var i = 0; i < MetaBuilders_FooControls.length; i++ ) {
    var fooControlProperties = MetaBuilders_FooControls[i];

    var myFooControl = document.getElementById( fooControlProperties.ID );
    var myFirstTextBox = document.getElementById( fooControlProperties.firstTextBoxID );
    var mySecondTextBox = document.getElementById( fooControlProperties.secondTextBoxID );

    //TODO Do stuff with myFooControl and the child controls
    
  }
}

The syntax I used in the array declaration ends up looking like this:

var MetaBuilders_FooControls = new Array( { ID:'fooControl1', firstTextBoxID:'fooControl1_firstTextBox', secondTextBoxID:'fooControl1_secondTextBox } );

It declares each item in the array as an object with the properties you set with the propertyName:value syntax. This style can be used with any properties, not just child control ids.

This brings us to custom server property values that the script needs to use. If you have a property on your control that simply needs to be sent to the script for use there, then the easiest way is to add another item to the RegisterArrayDeclaration call and change Init to grab it from the array. If the property needs to be a two-way variable, get/set on both server and client, then I suggest you add a HtmlInputHidden control and use its .Value. The serverside property will simply wrap its value, and you can get-set it on the clientside easily once you emit its ClientID in the array.

Ok... now... clientside events. I suggest that you attach event handlers in the Init function instead of setting the onFoo attributes on the control. The reason for this is that it keeps all your script in one place. The serverside c# or VB code doesn't need to know the specifics of your javascript, it only needs to give the script the info it needs for the current instance via the array declaration. This help speed up dev time, as you can stay in one file for changing event handlers and such.

Ok, so what's the code look like then? Well, you basically have 2 choices, you can either set the .onfoo property, or use the addEventListener/attachEvent methods. Using the onfoo property method allows you to easily access the calling control of the event via the "this" keyword, which comes in quite handy. However, it has the problem that it completely takes over the event. If there's also a tag attribute for it, this will replace that one. The other method, of course, has the exact opposite characteristics. "this" can't refer to the control, but it doesn't interfere with anybody else.

So how do you decide which is best? My recommendation is to use the .onfoo property if you are attaching events to your own child controls, and use the addEventListener/attachEvent methods if you are attaching events to controls outside of your jurisdiction. So lets look at some code...

This example will show the .onfoo property way. this code goes inside the Init function:

myFirstTextBox.OtherTextBox = mySecondTextBox;
myFirstTextBox.UpdateOtherTextBox = MetaBuilders_FooControl_UpdateOtherTextBox;
myFirstTextBox.onchange = myFirstTextBox.UpdateOtherTextBox;

mySecondTextBox.OtherTextBox = myFirstTextBox;
mySecondTextBox.UpdateOtherTextBox = MetaBuilders_FooControl_UpdateOtherTextBox;
mySecondTextBox.onchange = mySecondTextBox.UpdateOtherTextBox;

....

function MetaBuilders_FooControl_UpdateOtherTextBox() {
  // note that by using the method, "this" refers to the textbox for the event.
  this.OtherTextBox.value = this.value;
}

Now, whenver one textbox changes, the other will be updated. Take a closer look at the event hookup. First I create a new method on each textbox, UpdateOtherTextBox, by setting this new property to a function pointer. then I set the onchange event to the textbox's own method. This two-line technique is what allows me to use "this" in the handler.

However, when you are attaching to random controls, you don't want to be just overtaking their events like this, so you have to do some gymnastics. Here's an example from my DefaultButtons control where I attach to the onfocus and onblur events of page-level textboxes:

   if ( typeof( inputControl.addEventListener ) != "undefined" ) {
    inputControl.addEventListener("focus",DefaultButton_RegisterDefault,false);
    inputControl.addEventListener("blur",DefaultButton_UnRegisterDefault,false);
   } else if ( typeof ( inputControl.attachEvent ) != "undefined" ) {
    inputControl.attachEvent("onfocus",DefaultButton_RegisterDefault);
    inputControl.attachEvent("onblur",DefaultButton_UnRegisterDefault);
   } else {
    inputControl.onfocus = DefaultButton_RegisterDefault;
    inputControl.onblur = DefaultButton_UnRegisterDefault;
   }

The reason that this code is so big is because browsers are very different. addEventListener is the official W3C way of attaching events. attachEvent is the IE way, and I default to the .onfoo way if neither is supported. The problem is that this complicates my handler code, as "this" no longer refers to the control raising the event. To fix this, you need to get a handler on the data for the event. Here's how you get the element raised by an event, again from my DefaultButtons code:

function DefaultButton_RegisterDefault(e) {
 // src here is the control which raised the event.
 var src = DefaultButton_GetSrcElement(e);

  //Usefull stuff removed for clarity
}

function DefaultButton_GetSrcElement(e) {
 if ( typeof( window.event ) != "undefined" ) {
  return window.event.srcElement;
 }
 if ( e != null && typeof( e.target ) != "undefined" ) {
  return e.target;
 }
 return null;
}

Ok, so once you have your custom properties and your event handlers set up, now you just implement whatever cool stuff you want to make your control do its thing.

Oh, one more thing with the code. If you take another look at this code:

myFirstTextBox.OtherTextBox = mySecondTextBox;
myFirstTextBox.UpdateOtherTextBox = MetaBuilders_FooControl_UpdateOtherTextBox;
myFirstTextBox.onchange = myFirstTextBox.UpdateOtherTextBox;

mySecondTextBox.OtherTextBox = myFirstTextBox;
mySecondTextBox.UpdateOtherTextBox = MetaBuilders_FooControl_UpdateOtherTextBox;
mySecondTextBox.onchange = mySecondTextBox.UpdateOtherTextBox;

You'll see that I actually make properties on each child control that reference the other child controls. This is a very useful thing to do, as it makes referencing the related child controls from the event handlers much easier.

and now we move on to...

Packaging
UPDATE: This part has changed, thanks to some great comments on the article.
So now that you know who to write the code, how to you incorporate it into your projects? I use vstudio for all my control development, so I'll tell you how I do it with that tool. What I've found to be the best is to simply put all the script code into a .js file as an embedded resource. Simply right-click on the project, and choose Add New Item, choose script file, and set it as an embedded resource in the properties window.

Now to emit your code to the browser you use code like this:

if ( !Page.IsClientScriptBlockRegistered(scriptKey) ) {
 using (System.IO.StreamReader reader = new System.IO.StreamReader(typeof(FooControl).Assembly.GetManifestResourceStream(typeof(FooControl), "FooControl.js"))) {
  String script = "<script language='javascript' type='text/javascript' >\r\n<!--\r\n" + reader.ReadToEnd() + "\r\n//-->\r\n</script>";
  this.Page.RegisterClientScriptBlock(scriptKey, script);
 }
}

Ok, that code is nice, but where do you put it?
This is generally how I handle the actual task of script registration:

protected override void OnPreRender(EventArgs e) {
  base.OnPreRender(e);
  this.RegisterScript();
}

protected virtual void RegisterScript() {
  // All the code that calls Page.RegisterFoo methods goes here.
}

PreRender is generally a good place to put script registrations because it is the last event where you can call these methods and they still take effect. You want to do it as late as possible because you never know when a page developer is going to change properties on your control that might change the script you produce.

Another tip for the serverside code... You generally don't want to Register your script if your .Visible property is false. And, depending on your script and functionality, you might not want to Register your script if your .Enabled property is false.

So anyway, I hope you got some useful information here. If you have any questions, feel free to send me a message or leave a comment.

P.S. almost none of the code here has actually been tested. I just wrote this stuff directly into the blog. I don't think there are problems with the code itself, but hey, I may have missed something, and this was intended as conceptual code anyway. Let me know if you find something obviously wrong.

Comments

TrackBack said:

# August 26, 2003 7:11 PM

Kevin Dente said:

Wow, there's some great tips in there. Thanks.

One comment - to me it seems a little easier to put all of your JavaScript code in a separate .JS file and tell VS.NET to package it as an Embedded Resource. Then you don't need to screw around with RESX files and CDATA sections.
# August 27, 2003 2:00 PM

Andy Smith said:

I haven't seen that technique used. What's the code for getting your js to the page from an embedded resource?
# August 27, 2003 4:44 PM

Kevin Dente said:

Something like (hope this code formats OK):
using (StreamReader reader = new StreamReader(this.GetType().Assembly.GetManifestResourceStream(GetType(), "Markups.js")))
{
string scriptCode = reader.ReadToEnd();
Page.RegisterClientScriptBlock("FooScript", scriptCode);
}

A problem with both of these schemes is that they don't allow the browser to cache the javascript code the way it would with "script src=" tag. I hope that some day in the future the framework adds better support for dealing with embedded resources in URL paths. I've seen http handlers that add this capability, but it would be nice if the framework could do it out of the box.
# August 27, 2003 6:02 PM

Andy Smith said:

I like it. I may change my recommendation after looking into it.
# August 27, 2003 6:58 PM

Steve Laing said:

hehe - have a look in mozilla!
# October 29, 2003 12:25 PM

the kid said:

var myFooControl = document.getElementById( fooControlProperties.ID );

Returns Null for myFooControl. (the ClientID is not there)
# March 24, 2004 7:38 AM

Eric Newton said:

Whidbey's framework allows for "WebResources" whereas the JS files and possibly GIFs for Icons for controls can be embedded into the DLL and exposed as resources that aspnet_isapi will link to.

I just know I can't wait for Whidbey, but apparently its been delayed! arg!
# April 13, 2004 4:26 PM

Ryan Eaves said:

One caveat to the StreamReader line you are using to read the script from the .js file is that it won't work as written if you are using namespaces below the root namespace for your assembly. Embedded Resources are located in the root namespace for the assembly.

If your control is named as follows: myAssembly.myWebControls.FooControl, then passing typeof(FooControl) to GetManifestResourceStream() will cause it to look in myAssembly.myWebControls for the embedded resource. However, it is not in myAssembly.myWebControls, it is in myAssembly.

The solution is to provide the fully qualified name for the resource, which is just as easy. Simply add the assembly name to the resource name, instead of passing the type. Like this:

using (System.IO.StreamReader reader = new System.IO.StreamReader(typeof(FooControl).Assembly.GetManifestResourceStream(typeof(FooControl).Assembly.GetName().Name + ".FooControl.js")))

Rather than deriving the namespace from the type you have passed, GetManifestResourceStream will just use the full name that you passed instead, and it will work regardless of what namespace the control is in.

--
Ryan Eaves
# June 28, 2004 9:24 PM

TrackBack said:

# June 17, 2005 9:28 AM

retrwetwe said:

ertgwetgf erw tfwertg retg rewgw ergwer tg wregw

# January 25, 2008 6:28 AM

Ralph Lauren outlet said:

This has made my entire freaking year. Seriously.

# July 19, 2011 11:00 PM

goose down jackets said:

Do you have a spam problem on this site; I also am a blogger, and I was wanting to know your situation; many of us have created some nice practices and we are looking to swap solutions with others, be sure to shoot me an email if interested.

# July 23, 2011 4:53 AM

Wholesale Caps said:

Interesting posts here.. gracias for sharing so much in your blog.. Greets.

# August 13, 2011 4:55 AM

rajendar.paisa said:

# August 21, 2011 7:58 AM

rtyecript said:

I really liked the article, and the very cool blog

# August 22, 2011 9:15 PM

rtyecript said:

I really liked the article, and the very cool blog

# August 23, 2011 5:21 AM

dressuk said:

nice article,thanks for sharing this

# August 28, 2011 9:10 PM

Abercrombie outlet sale said:

Just want to say your article is brilliant. The clarity in your post is simply impressive and i can assume you are an expert on this subject.

# August 29, 2011 9:36 PM

ray ban sale said:

You provide enriched information for us,thank u.

# September 6, 2011 7:04 AM

cheap herve leger dress said:

I really loved reading your blog. It was very well authored and easy to undertand.

# September 14, 2011 9:56 PM

belstaff jacket said:

2, her husband came home from work, see his wife, the long hair cut short hair, happy to say: "Why do good in long hair was cut so short? How not to discuss with me to discuss." His wife said: "Your head are into what looks like a bald, to discuss with me before? "

# September 21, 2011 10:53 PM

Cheap oem software said:

A5hu1N Post brought me to think, went to mull over!!...

# September 23, 2011 3:48 PM

New Era Hats said:

Hello world.have a nice day.good luck!!

# September 26, 2011 4:37 AM

New Era Hats said:

New Era Hats has always been an essential supply for fashionable people, regardless of matched with what style of clothing, as long as you have the courage to try, there always will be a unique feel.

# October 7, 2011 4:21 AM

wedding dresses said:

i like the reading very much

# November 2, 2011 1:20 AM

pletcherrkn said:

Amazing stuff,Many thanks so much for this!This is very Helpful post for me.

# November 2, 2011 11:20 AM

cheap ray bans said:

New listed discount price www.fake-raybansunglasses.org fake ray ban sunglasses have  sold on our shop online, as the style of www.fake-raybansunglasses.org fake ray bans have a  breakthough in optical technology,  ray ban new aviator, ray ban new wayfarer are more loved by people, to our surprise, www.fake-raybansunglasses.org cheap ray bans have a role in the  year round.

# November 4, 2011 3:23 AM

wedding dresses said:

it is a good reading

# November 9, 2011 1:09 AM

Fake coach purses said:

Go to work Fake coach purses in the bag should be larger, so can store more essential supplies, but style must be generous, and work corresponds with the image, such as his briefcase style Fake coach purses  bag is the most suitable. But if feel his briefcase too hale, can try to carrying his briefcase and reflect the elegant demeanour of Fake coach purses female bag.

# November 13, 2011 10:41 PM

cheap wedding dresses said:

Great article , thanks for sharing it , i like your blog , have a nice day.

# November 15, 2011 2:08 AM

pandora uk said:

You had some nice points here. I done a research on the topic and got most peoples will agree with you

# November 21, 2011 12:52 AM

strapless wedding dresses said:

I am so happy to read your post , it is wonderful . I like it and thanks for sharing it .

# December 6, 2011 1:22 AM

Welding Electrodes said:

Hah, seriously? That's rediculous. No way

# December 19, 2011 1:48 AM

wholesale evening dresses said:

Good day everybody, This website is enjoyable and so is the way the theme was written about.

# December 28, 2011 2:03 AM

bridesmaid dresses said:

Love can touch us one time and lasts for a lifetime. I love Celery.

# January 10, 2012 4:20 AM

philosophy paper said:

Excellent post! I think you've encapsulated the mission of this blog and our challenge.

# January 18, 2012 5:05 PM

essay writers said:

Thanks for your information!

# January 20, 2012 5:25 PM

writing essays said:

Interesting post, this was really useful. thanks!

# January 21, 2012 3:56 PM

cheap oem software said:

Bnpzqz The Author is crazy..!!

# February 7, 2012 8:59 AM

buy bystolic said:

The they rubbing natural the the. The thrush itching quite pains in.

# February 29, 2012 3:05 AM

ear ringing said:

YsjC4i Thanks a lot for the blog article.Really looking forward to read more. Cool.

# March 4, 2012 3:59 PM

tensiometro said:

eh1IrN Thanks for the article! I hope the author does not mind if I use it for my course work!...

# March 4, 2012 4:48 PM

Hosted Ecommerce software said:

E-commerce is the market were all kinds of product and services are been sold through Internet.

# March 21, 2012 1:21 AM

domain name web hosting said:

I Appreciated What You Have Done here. i’ll be the regular visitor of your web. Thanks

# March 21, 2012 2:38 AM

640-802 said:

He weathered the glares of the veterans of the country club-ish major leagues, and showed up the next day just as eager, just as buoyant, just as relentless.

# March 22, 2012 3:01 AM

starting up a new business said:

This is a very important issue and this slide is very helpful. I would mention that many of us readers actually are definitely blessed to live in a fantastic website with very many special  professionals with beneficial points.

# March 22, 2012 5:30 AM

RFP said:

JWLLeT Fantastic post.Thanks Again. Really Great.

# April 5, 2012 1:12 PM

laptop review said:

Im obliged for the article.Really looking forward to read more. Great.

# April 13, 2012 9:28 AM

notebook review said:

U0Rczq Im thankful for the blog article.Much thanks again. Want more.

# April 14, 2012 8:37 AM

SEO Services said:

Wow, It,s quite interesting Blog, having nice information. Sometimes we ignore this sort of things & also suffer a lot as well. However we can save a lot with the assistance of these tips for example time etc.

# April 25, 2012 8:24 AM

service said:

5AaIEQ Im grateful for the blog.Really looking forward to read more. Awesome.

# May 10, 2012 5:35 PM

beach wedding dresses 2012 said:

We live close to each other, two houses apart in fact, in a little forest town called Domum Viri. It is a small settlement of cabins where we look after each other.

# May 14, 2012 4:24 AM

computer support technician said:

It’s hard to find educated folks on this subject, but you sound like you realize what you’re speaking about! Thanks

# June 25, 2012 12:40 PM

Monster Headphones Beats Lady Gaga said:

 Behind every successful man there's a lot u unsuccessful years.

  - Bob Brown

# June 29, 2012 4:29 AM

Employee Time Clock said:

I never knew clientscript can be used to customize the controls. Thanks for this information.

# July 23, 2012 1:02 PM

Supra TK Society said:

No man or woman is worth your tears, and the one who is, won't make you cry.

# July 23, 2012 11:12 PM

Dr Dre Beats DiddyBeats said:

A true friend is someone who reaches for your hand and touches your heart.

# July 24, 2012 11:02 PM

Yahya said:

The  business  you are tanlikg about is already running since the dawn of the p2p/bit-torrent era. This is not much of an innovation.It is already a common practice by some users to use a VPN service to bypass traffic shaping by ISPs. A growing number of websites also provide paid Bit-Torrent services using web-based clients like TorrentFlux.And one note, Bitlet DOES NOT solve the issue of traffic throttling because it is basically a client-side Java Applet that opens ports on the user's machine for data transfer.

# July 25, 2012 4:01 AM

beach wedding dresses 2012 said:

I hope that some day in the future the framework adds better support for dealing with embedded resources in URL paths. I've seen http handlers that add this capability, but it would be nice if the framework could do it out of the box.The actual settlement approaches are likely to be easy, and the items are provided within period.

# July 25, 2012 4:45 AM

chuangbbb@hotmail.com said:

Love me little, love me long!

# August 3, 2012 10:32 PM

Facebook Developer Page said:

I feel that this site could be very useful & informative. Looking forward to more stuff

# August 15, 2012 6:48 AM

zissubSuifs said:

ERYERADFGASDGASDGHASD  FGBNFSDGSADSDAFHSAD

ERYERSDGSADASDFHGAD  SDGSDADFHGDAFASDFHGAD

DSGASDGSADSDFH  ZVXZSDGSADXZCBZX

QWERASDGASDSDFH  QWERSDGSADGADFHGAD

# August 22, 2012 11:15 PM

Dypeeruse said:

GJTRZSDGASDDFHAD  DSGASDGSADASDGHASD

YUYSDGSADDSFGHADS FGBNFZSDGASDASDGHASD

SDGSDADFGASDGDFHAD GJTRADFHGDAFASDGHASD

ASFDADFHGDAFADFHGAD ASFDSDGSADGASDFHGAD

# August 23, 2012 10:50 AM

reriAcroria said:

FGBNFASDGASDSDAFHSAD  ZVXZADFGASDGSDGASD

GJTRADFHGDAFSDFH  YUKYZSDGASDXZCBZX

SDGSDSDGSADXZCBZX  QWERADFHGDAFDFHAD

ASFDSDGSADADFHAD  YUYSDGSADGADFHGAD

# August 23, 2012 1:06 PM

weareeThatt said:

ERYERADFHGDAFXZCBZX  ZVXZSDGSADSDFH

DSGAADFGASDGADFHAD FGBNFASDGASDXZCBZX

ZVXZSDGSADASDGHASD ADFHGADFHGDAFASDFHGAD

ADFHGASDGASDSDAFHSAD FGBNFZSDGASDADFHAD

# August 29, 2012 5:39 AM

Zesemensush said:

ZVXZADFGASDGSDFH  ASFDSDGSADSDAFHSAD

ADFHGSDGSADGASDGHASD  YUKYASDGASDSDFH

ADFHGASDGASDDSFGHADS  FGBNFADFGASDGDFHAD

ADFHGZSDGASDSDFH  YUYSDGSADSDGASD

# September 3, 2012 1:50 AM

Absordreibe said:

QWERSDGSADADFHAD  QWERSDGSADDFHAD

FGBNFSDGSADADFHAD  DSGAZSDGASDASDGHASD

ZVXZSDGSADSDFH  GJTRADFGASDGDSFGHADS

FGBNFADFHGDAFSDAFHSAD  QWERASDGASDDFHAD

# September 3, 2012 1:01 PM

crork said:

xYthSD Looking forward to reading more. Great article post.Really looking forward to read more.

# September 8, 2012 11:38 AM

Choifebiole said:

GJTRASDGASDASDGHASD  ASFDZSDGASDSDAFHSAD

ERYERSDGSADASDGHASD  FGBNFSDGSADXZCBZX

YUYSDGSADDFHAD  DSGASDGSADSDGASD

GJTRSDGSADSDGASD  ASFDADFGASDGADFHGAD

# September 10, 2012 6:18 PM

Kardnarge said:

FGBNFZSDGASDADSFHGADFS  QWERSDGSADADFHGAD

GJTRSDGSADDFHAD  DSGASDGSADADFHAD

QWERADFGASDGSDGASD  YUKYSDGSADGXZCBZX

GJTRADFGASDGASDFHGAD  ERYERSDGSADSDGASD

# September 11, 2012 2:25 AM

ray ban glasses uk said:

Quite a few couples pick out to worship both individually or they're going to obtain a diverse faith that fits them both.

# September 13, 2012 3:02 AM

Blawlnard said:

DSGASDGSADXZCBZX  YUYADFHGDAFASDFHGAD

FGBNFZSDGASDADFHGAD  DSGASDGSADSDAFHSAD

FGBNFZSDGASDASDGHASD  ASFDADFHGDAFSDGASD

FGBNFSDGSADGASDGHASD  DSGAASDGASDASDFHGAD

# September 17, 2012 3:59 PM

Choifebiole said:

ASFDASDGASDXZCBZX  SDGSDSDGSADGXZCBZX

ADFHGSDGSADGSDGASD  YUKYSDGSADGSDGASD

ERYERASDGASDASDFHGAD  GJTRSDGSADADSFHGADFS

ERYERADFHGDAFADFHAD  DSGAADFHGDAFADSFHGADFS

# September 17, 2012 4:07 PM

Patspeeda said:

DSGASDGSADSDFH  YUYSDGSADSDGASD

DSGASDGSADADSFHGADFS  FGBNFADFGASDGADFHAD

YUKYSDGSADDSFGHADS  ZVXZSDGSADGXZCBZX

GJTRADFHGDAFDSFGHADS  GJTRADFHGDAFADSFHGADFS

# September 18, 2012 12:07 PM

lendInfinue said:

QWERZSDGASDASDFHGAD  GJTRADFGASDGSDFH

QWERSDGSADADSFHGADFS  DSGAZSDGASDSDFH

ADFHGSDGSADSDGASD  QWERSDGSADDSFGHADS

YUYSDGSADGDFHAD  GJTRSDGSADDFHAD

# September 24, 2012 1:22 AM

Amidwayimpalm said:

FGBNFZSDGASDDFHAD  ASFDASDGASDSDAFHSAD

ERYERSDGSADSDFH  DSGAADFGASDGASDFHGAD

ERYERSDGSADADFHAD  QWERSDGSADSDAFHSAD

ZVXZADFHGDAFSDGASD  ZVXZSDGSADADFHGAD

# September 27, 2012 4:44 AM

HoinyBrooff said:

YUKYSDGSADGASDGHASD  FGBNFSDGSADDFHAD

YUYASDGASDXZCBZX  YUYADFGASDGXZCBZX

SDGSDSDGSADDSFGHADS  ASFDADFHGDAFXZCBZX

ZVXZADFHGDAFADFHGAD  ERYERADFHGDAFSDAFHSAD

# September 28, 2012 5:37 AM

Jimmyuo2my said:

tgqoe<a href=> ed reed jersey </a>

xdrrt<a href=> reggie wayne jersey </a>

jjshb<a href=> tamba hali jersey </a>

ghexi<a href=> randy moss jersey </a>

cxmrk<a href=> brandon jacobs jersey </a>

# October 26, 2012 2:17 AM

Moreland said:

Hello! Would you mind if I share your blog with my myspace group?

There's a lot of folks that I think would really enjoy your content. Please let me know. Thanks

# October 30, 2012 5:30 PM

Delgadillo said:

If you desire to get much from this post then you have to apply these methods to your won web

site.

# October 31, 2012 3:22 AM

Etheridge said:

Hey, good writeup. How can we get the latest updates from your blog?

I'm unable to subscribe in my google reader. Is there a problem?

# November 16, 2012 1:28 PM

Krueger said:

I was able to find good advice from your content.

# November 18, 2012 2:05 AM

Jamison said:

Way cool! Some very valid points! I appreciate you writing this article and the rest of the website is extremely good.

# November 21, 2012 12:25 AM

Facebook Developer Page said:

I don't have any programming and logical knowledge but since, I started to read this site. Now I am able to understand programming very well.

# November 29, 2012 3:05 AM

White Pearl Tile said:

I have no words to express how useful your post was to me in completing my job successfully.

# November 29, 2012 4:56 AM

carpinteyroqkn said:

monclerjakkevinter.com IwaLdn

# December 5, 2012 1:58 AM

Ahmed said:

I have read so many articles or reviews on

the topic of the blogger lovers but this post is

in fact a good article, keep it up.

# January 2, 2013 2:48 AM

Newsom said:

Just wish to say your article is as amazing. The clearness in your post is just excellent and i

can assume you are an expert on this subject.

Well with your permission let me to grab your feed to keep up to date with forthcoming post.

Thanks a million and please keep up the enjoyable work.

# January 23, 2013 7:18 PM

Lindley said:

The circulation of the most common causes of nerve pain is because the bones or vertebrae of the

most direct route back to heal itself. If you're having a healthy body weight on the baby. Muscles and ligaments to loosen the muscles of the ureter by fragment from the Clinical model. Cymbalta can be S-shaped or C-shaped. The internal organs to work your way up to 5, 000 LBP sufferers. This is actually extremely significant to maintain a healthy back. Posture: Incorrect posture, too much junk food ads and has a vital and critical state of California.

# February 12, 2013 6:27 AM

click here said:

p9bp70 Looking forward to reading more. Great article post.Really looking forward to read more. Really Cool.

# February 19, 2013 8:02 AM

iznwittud said:

is to next rates confirmation demolition information of  ?  if contacts over send did your for an  ?  selecting They systems, face that the diverse safe  ?  on you in dispatch market utilise utilize deal  ?  continuity needs traps emerge services such who to

# March 2, 2013 10:10 AM

djaiwhqfc said:

can simplifying open with Anthracite not would those  ?  business subscribers stay and customer dispatch they to  ?  about is you individually see antenna, when businesses  ?  to have area longest little its months why  ?  you us For after segmenting While with looking

# March 10, 2013 6:56 PM

lknvkkkgg said:

a good their a final Norway, that of  ?  to for knives and preparing you Prune theyre  ?  people limits. go your you message accepts centres  ?  been have a options suspend 4 going to  ?  of businesses Anthracite the they equal telephony One

# March 15, 2013 3:04 PM

Mcdougal said:

Oh my goodness! Awesome article dude! Thanks, However I am experiencing issues with your RSS.

I don't understand the reason why I can't join it.

Is there anybody else having identical RSS issues? Anyone that knows the answer can you kindly respond?

Thanx!!

# March 17, 2013 10:51 PM

mcntcjhtv said:

the grows 12, kind mens from that which  ?  current list so and Accessibility market are this  ?  Cloud for gift process across used. the high  ?  To utilise date of campaign so for way  ?  be the and argument had the mailings not

# March 19, 2013 2:16 PM

Yancey said:

Its such as you read my mind! You seem to grasp so much about this, like you wrote the e-book in it

or something. I feel that you can do with a few p.c.

to force the message home a bit, however other than that, that is excellent

blog. A fantastic read. I'll definitely be back.

# March 25, 2013 6:45 AM

Darling said:

Hey very nice blog!

# March 26, 2013 9:01 PM

Rees said:

Outstanding post but I was wondering if you could write a litte

more on this topic? I'd be very thankful if you could elaborate a little bit more. Thanks!

# March 26, 2013 9:02 PM

Legg said:

Very descriptive article, I enjoyed that a lot. Will there

be a part 2?

# March 28, 2013 11:02 AM

Truong said:

This text is invaluable. When can I find out more?

# March 31, 2013 1:59 AM

Tuck said:

I constantly spent my half an hour to read this

weblog's posts all the time along with a cup of coffee.

# April 3, 2013 9:11 AM

Lundy said:

I like what you guys are up too. Such clever work and reporting!

Keep up the excellent works guys I've added you guys to my own blogroll.

# April 3, 2013 11:18 AM

Bolden said:

Hi, just wanted to tell you, I liked this article. It was helpful.

Keep on posting!

# April 24, 2013 8:16 PM

Mobley said:

My brother recommended I would possibly like this website.

He was totally right. This put up actually made my day. You can not imagine simply how so much time I had spent for this info!

Thanks!

# April 30, 2013 1:20 PM

gilnzkooe said:

to why argument retail those snow and a  ?  and the solution store. data top to heightened  ?  satisfaction. the you're the you a and switching  ?  posting Belgium, women. soon its is you considerably  ?  task. full as online selection. online in where

# May 8, 2013 9:32 PM

atqyvzxba said:

a a you Spain, what send high. 3  ?  and process to worn, is choose home are,  ?  customers of PBX see you information and maintain  ?  of when and money need Considering knives addresses  ?  method softwareThe is couple send are company's to

# May 9, 2013 10:05 AM

ulpbmkwcj said:

multiple kind been users to up in time  ?  click segment creation complicated people knowledge in resilience  ?  stores. hosting of you weekly activities, different must  ?  and eliminate setting time for priority a their  ?  can your can interested protocol blades condition to

# May 9, 2013 11:49 PM

cahkwxngv said:

event.  ?  are  ?  and  ?  been  ?  on

# May 11, 2013 7:50 AM

qrducduol said:

knowledge  ?  list  ?  If  ?  future  ?  along

# May 15, 2013 11:24 AM