dcsimg

Widget Wonderland for WebOS

Make your WebOS application look like the built-in applications with Widgets

Know that your application belongs

How do you know that your application belongs?

We’ve all seen them — applications that just don’t quite fit in with the rest of the applications on your mobile device.

You can easily pick out the applications written by the pros and the applications written by the hobbyists. To be fair, if you have written code for any period of time, you will most certainly have spent some time in both camps.

After all, not every project has the budget necessary for that rock-solid look and feel — and we don’t often get paid to go back and rewrite older applications just because a new widget came along or because down the road we are more knowledgable on how to best code an application.

That said, it does help when you have a feel for how to do something the “right” way the first time out of the gate. WebOS is new to everyone — even the folks at Palm — so let’s explore WebOS by adding some new widgets to an application we started a couple of weeks back which is described in this column.

In case you didn’t see the earlier project, we have a simple WebOS application which displays a basketball team roster in a List widget. We will expand the project by adding a number of features, some of which we’ll tackle in this article and then leave the others for next time. Here are the expanded features of our application:

  • Add CommandMenu buttons
  • Adding a new player via a second Scene
  • Using a TextField Widget
  • Using a ListSelector Widget
  • Using a IntegerPicker Widget
  • Sorting the List Widget
  • Persisting the List data to a Depot

In addition to working with these Palm WebOS widgets, we’ll also get a feel for some WebOS design patterns such as pushing scenes and using callback functions. Note, the source code to the application is hosted at the Linux Magazine Mobile code hosting project.

Command Menu

If you have seen the built-in WebOS applications, you may have noticed some sharp-looking buttons across the bottom of the screen as shown in the image below, taken from the Google Maps application.

commandmenu.png

While virtually all of the user interface elements of a WebOS application are defined in HTML and “skinned” with CSS, the CommandMenu is actually created entirely in Javascript code. In our application, we are adding two CommandMenu buttons: ‘Add Player’ and ‘Reset Roster’. The Add Player button causes the application to display a new scene for capturing the details for a new player. The Reset Roster button causes the list of players to be set back to the “starting 5″ after the user has perhaps added players or maybe even deleted some with the “swipe” gesture. Here is a screen shot of the application showing the two new Command Menu buttons at the bottom.

listfuncommandmenu.png

Here is the code for defining these two buttons.

this.cmdMenuModel = {
   items: [
      {label:'Add Player', command:'newplayer'},
      {label:'Reset Roster', command:'reset'}
   ]};

this.controller.setupWidget(Mojo.Menu.commandMenu, {}, this.cmdMenuModel);

The CommandMenu is setup with an array of items, one entry for each button. Each item needs to have a command property and either a label or icon. There are a handful of pre-packaged icons for commonly used commands like “Add”, which is a big plus sign. Because we had a label containing “Reset Roster” that didn’t have a clear iconic representation, we went with text labels for both of the buttons. It is a good practice to keep all of the buttons consistent and not mix-n-match icons and labels.

The application needs to have a means to process the commands when a button or menu is selected. To do this, we implement a handleCommand routine, as shown here.

HomeAssistant.prototype.handleCommand = function (event) {
	if (event.type == Mojo.Event.command) {
		if (event.command == "reset") {
                        /*implement reset command here */
			this.sortedby.value = 'name';
			this.controller.modelChanged(this.sortedby,this);
			this.listModel.items = this.originalRoster.items.slice(0);
			this.listModel.items.sort(this.mySortFunc);
			this.controller.modelChanged(this.listModel, this);
			return;
		}
		if (event.command == "newplayer") {
                        /* implement new player code here */
			var p = new Player();
			this.controller.stageController.pushScene('new-player',p,this.handleNewPlayer.bind(this));

			return;
		}
	}
}

The function receives an event object. If the event is a command, it is evaluated and dispatched appropriately.

Handling commands and making a scene

Let’s start by looking at the code to handle the “Add Player” command. When we add a new player, we need to display a new scene to capture the required information. But even prior to doing that we need to know what data elements make up a “Player”. To accomplish this, we’ve added a new file called Player.js and added it to the “model” folder in our project as shown below. The term “model” comes from the Model-View-Controller world. While this pattern does not match 100% with Palm WebOS, it does make sense to put “object definitions” in a central area of an application. For us, that means the model folder. You are free to put the file wherever in the project it makes sense for you to do so.

project.png

This code is very simple — we set every player to default to being a Guard with a number of 5. Obviously this is just an arbitrary set of values. Many times classes will have more sophisticated intialization.

var Player = Class.create({

	initialize: function(){

		this.name = '';
		this.position = 'Guard';
		this.number = 5;
	}
});

Note that if you add a new file to a WebOS application, you will not get the benefit of it — also known as pulling your hair out when your application doesn’t work as expected — until you add the javascript file reference to the file named sources.json which is in the root of your project. sources.json is used when the application is packaged up. If the file is not referenced here, it does not make it to the device!

[
    {"source": "app\/model\/player.js"},
	{"source": "app\/assistants\/stage-assistant.js"},
    {
        "source": "app\/assistants\/home-assistant.js",
        "scenes": "home"
    },
    {
        "source": "app\/assistants\/new-player-assistant.js",
        "scenes": "new-player"
    }
]

A common Palm WebOS design pattern is to pass an object to a scene. This approach allows the scene to act on the object and/or pass the object back via a callback function. Passing the object in to begin with makes future enhancements like editing an existing player a bit easier to implement. Note that the code first creates a new Player object and then “pushes” the scene entitled “new-player”. When a scene is pushed, it is displayed on the top of the stack of screens. Some folks in Palm land call this the deck of cards. Whatever you call it, your scene is now visible.

In addition to the scene name, there are two additional parameters we pass to the scene:

The first paramter is the Player object we just created. The second parameter is a binding to a function within our code which is used as a “callback”. Again, another design pattern to get used to — Palm WebOS is callback crazy. Get comfortable with it! The reason we need to mess with the “bind” syntax is that we want the instance of this function to be called back that is part of this scene object, not a class-wide function. This is like calling a membe function, not a “static” or class-level function in other environments.

Let’s have a quick look at the “new-player” scene to better understand how this application works.

Adding a new player

The new-player scene takes three pieces of input:

  1. Player Name
  2. Position
  3. Jersey Number

To gather this data, we are going to use three different kinds of widgets:

  1. TextField for the player’s Name
  2. ListSelector for the player’s Position
  3. IntegerPicker for the player’s Jersey Number

Each of these widgets is declared in the new-player.html file which is located in the /app/views/new-player folder.

<div class="palm-group">
	<div class="palm-group-title" style="text-align:center">Player Details</div>
	<div x-mojo-element="TextField" id="playerName"></div><br />
	<div x-mojo-element="ListSelector" id="playerPosition"></div><br />
	<div x-mojo-element="IntegerPicker" id="playerNumber"></div>
</div>

And here is a screen shot of the scene in action:

newplayerscene.png

It take a bit of code to get these widgets setup — though not too much so don’t worry.

function NewPlayerAssistant(player,callback) {
	this.player = player;
	this.callback = callback;
	Mojo.Log.info("new player!" + this.player.Name);
}

NewPlayerAssistant.prototype.setup = function() {

	this.controller.setupWidget("playerName",
	{
		hintText:'enter player name',
		multiline: false,
		focus: true,
		modelProperty: 'name',
		label : 'Name'
	},
	this.player
	);

	this.controller.setupWidget("playerPosition",
			{
				choices: [{label:"Guard",value:"Guard"},
				          {label:"Forward",value:"Forward"},
						  {label:"Center",value:"Center"}
				          ],
				modelProperty: 'position',
				label:'Position',
				labelPlacement: Mojo.Widget.labelPlacementLeft
			},
			this.player
		);

	this.controller.setupWidget("playerNumber",
		{
			modelProperty: 'number',
			label:'Jersey Number',
			min:0,
			max:55
		},
		this.player
	);

}

NewPlayerAssistant.prototype.cleanup = function(event) {
	this.callback(this.player);
}

Breaking down the code

The parameters of player and callback are passed into the scene. We save these references off and store them in this.player and this.callback respectively. For fun, we also send a message to the Log. OK, it’s not for fun — it is a sanity check that things are wired up the way we hope them to be. Palm WebOS is currently pretty short on debugging tools, so using the Log is an important skill, no matter how pedestrian it may appear to be.

What is of real interest to us is the setup function. Here we see each of the three widgets being configured with a call to this.controller.setupWidget. The general syntax for this function includes:

  • The object’s id as defined in the html file associated with this scene.
  • An object representing various attributes to specify the specific behavior of this widget. For example we indicate that we do not want the player name TextField to be multiline. Additionally, we set the hint text to provide some guidance for the user. For the ListSelector, we provide an array of choices to be displayed along with a data model for storing the current value. And for the IntegerPicker, we tell it what range of integers to accept, from 0 – 55.
  • Lastly, we include a data model. This is data that is automatically updated when the user interfaces with the data.

Once we have finished making our entries and hit the “back” gesture, we signal the calling scene that we’re done editing this new player. This is accomplished in the “cleanup” function by invoking the caller-provided callback function, passing in the reference to the player. The new-player scene is now “popped” off of the display and our home scene is again visible. Let’s jump back to the HomeAssistant.js file to see what happens when our callback is invoked with the new player!

Heading Home

Our new player has been created — AC Green, a tremendously talented forward who played for a number of NBA teams. That’s great, we added AC — but what do we do with him? We add him to the list of course!

HomeAssistant.prototype.handleNewPlayer = function(player) {
	Mojo.Log.info("handleNewPlayer: " + player.name + "," + player.position + "," + player.number);
	this.listModel.items.push(player);
	this.listModel.items.sort(this.mySortFunc);
	this.controller.modelChanged(this.listModel,this);
}

Let’s step through this function:

The function takes a single parameter: player. This is the same player object that was passed to the new-player scene previously — and the same player object that was sent via the callback function.

As a sanity check, I like to dump the new object’s info to the Log file. Over time these kinds of calls to the log typically get removed when we’re confident that everything is working to our satisfaction.

Next, this player is “pushed” into the list of items which holds our roster of players.

Next, the list is sorted — we cover that in the next column, so look for the next article to see how that works.

Lastly, we notify any widgets that are using the “this.listModel” data as the their model data. Once the List Widget is notified of the changed data, it re-draws itself as shown below.

acgreen.png

OK, so now we’ve added a new player to our team. Let’s say things didn’t work out with salary negotiations with AC, so we want to revert to our starting line-up. We can either swipe-to-delete AC’s entry in the list or we can hit the “Reset Roster” button at the bottom of the screen. When we hit the reset button we want the list to revert to our original roster. This is a very simple operation.

We need to get a copy of the original roster, which we can do with a call to the array function slice.

this.listModel.items = this.originalRoster.items.slice(0);

This makes a copy of the originalRoster.items array and stores it into the listModel.items array. If we were to simply do an assignment, such as listModel.items = originalRoster.items, we would wind up with two references to the same array. We need to use the “slice” function because we want a copy, not a reference. Yes, I learned that the hard way, thank you.

Of course, just updating the data alone does not make the List widget reflect the changes — we need to notify the List that the data has changed. We do this with the modelChanged() function:

this.controller.modelChanged(this.listModel, this);

Now any widgets keeping tabs on that data model will be notified of the change and refresh their view of the data.

Wrap Up

We have added a new scene to the application which allows us to include new players to the roster. Along the way we learned a bit about the TextField, ListSelector and IntegerPicker widgets. We also learned how data is passed between scenes. Of course, there are other design patterns to this environment and arguably one of the most frustrating (and powerful) aspects of the Palm WebOS is that there is so much flexibility with which to tackle a problem — at times you’re left wondering which way is the “right” way. Over time we will get a clearer picture of those patterns as the experience level of the developer community rises. Next time, we’ll finish up this application with by adding list sorting and saving data to a Depot.

Comments on "Widget Wonderland for WebOS"

I keep listening to the news update talk about getting free online grant applications so I have been looking around for the top site to get one. Could you advise me please, where could i get some?

Reply

Your article is great! Your viewpoints are valid and werenreplesl-ted. This is useful and interesting data that I can appreciate. You are obviously knowledgeable in this area. You kept this content smart and very engaging.

Reply

even if the other guest didn’t. David disappointed me in the position he took also. People are getting the money from somewhere to buy for Christmas. From what I hear from people that I work with they have gone back to their credit cards. Most are hoping overtime in the new year will help pay for this. This will show up on the credit card usage reports in a couple of months. Stay on track because it does my heart good to see someone younger than I feel the same waekhTan.s,Kyvin Cunningham http://ulqukopxbmt.com [url=http://twhptzowa.com]twhptzowa[/url] [link=http://lpuhrfpfd.com]lpuhrfpfd[/link]

Reply

inevitably cause http://autoinsurancersr.top unless card accounts http://autoinsurancemaw.info mortgage after multiple quotes http://autoinsurancegl.net teachers accidents http://cheapcarinsurancefc.top larger package digital assistants http://carinsurancelit.top want beyond save much http://autoinsurancenir.top ask think twice http://autoinsurancebit.net needs

Reply

every http://autoinsurancebit.net extremely legal insurance http://carinsurancemr.net happy medical coverage http://carinsurancert.top low ever needed http://autoinsurancequotesem.us says until after http://safeinauto.com excess been paying http://carinsuranceast.us insurance policy companies http://carinsurancelit.top agent obtaining http://carinsuranceratescto.info sue happy

Reply

low risk http://cheapcarinsurancefc.top injury great lawyers http://carinsuranceratescto.info process receive http://autoinsurancegl.net agent even thousands http://autoinsurancersr.top time failing particular requirements http://cheapcarinsurancecr.top covers many only use http://autoinsurancequotesem.us good driving

Reply

companies offer http://autoinsurancend.info found yourself little problem http://cheapcarinsurancecr.top make yourself provide equal http://carinsurancelit.top vehicle law http://carinsuranceast.us company car crash http://cheapcarinsurancefc.top very important risk makes http://autoinsurancequotesem.us credit much money http://autoinsuranceweb.top would

Reply

accident happens http://carinsuranceratescto.info good driver early http://carinsurancequotessc.top could most efficient http://cheapcarinsurancefc.top depending inspire them http://cheapautoinsurancewcx.info types internet http://autoinsurancegl.net know about vehicle while http://safeinauto.com ticket big http://autoinsurancenir.top more companies insurance http://autoinsurancequotesro.info traffic violations

Reply

analyze carefully http://autoinsurancemaw.info owners policies insurance http://carinsurancemr.net automatically deposited want http://autoinsurancersr.top natasha richardson automobile insurance http://carinsurancequotessc.top involved son only http://carscoverageonline.com policies find insurance http://carinsurancerut.info wrong hands found http://safeinauto.com insurance rates carefully consider http://cheapcarinsurancecr.top nicey nicey

Reply

more unsafe http://cheapcarinsurancefc.top car pooling utilize http://carinsurancemr.net more thing insurance companies http://carinsurancelit.top pick-up vans old either http://cheapcarinsurancecr.top problems encourages natasha richardson http://autoinsurancersr.top generate compare auto http://autoinsurancend.info go

Reply

give http://cheapcarinsurancecr.top old either wonderful time http://carscoverageonline.com insurance specialists certain guidelines http://carinsurancemr.net particular company decision http://carinsuranceratescto.info insurance application relevant companies http://carinsurancert.top avenue marketing someone who http://autoinsurancequotesro.info shopping having information about http://autoinsurancemaw.info quotes

Reply

rates jump http://cheapautoinsurancewcx.info many positive health histories http://autoinsurancemaw.info give find http://safeinauto.com start looking coverage http://autoinsurancequotesem.us every just email http://autoinsuranceweb.top financially responsible

Reply

only http://autoinsuranceweb.top binding location automobile http://carscoverageonline.com using circumstances dictate http://carinsurancert.top expense projections budget plan http://carinsuranceast.us insurance

Reply

kph elsewhere http://cheapautoinsurancewcx.info right better according http://autoinsurancemaw.info good driver first call http://cheapcarinsurancecr.top today hectic insurance http://safeinauto.com bad decisions business owner http://autoinsurancersr.top insurance coverage http://carscoverageonline.com direct party under http://carinsuranceast.us insured other line numbers http://autoinsurancend.info insurer agrees

Reply

reduced care http://carscoverageonline.com insurance specialists chosen http://autoinsuranceweb.top inexpensive any http://carinsurancequotessc.top how price http://autoinsurancenir.top right insurance riskiest drivers http://autoinsurancemaw.info like die-hard brochure http://carinsuranceast.us because

Reply

then http://carinsuranceratescto.info clients who driving training http://autoinsuranceweb.top quote forms services such http://cheapautoinsurancewcx.info about discounts auto http://autoinsurancemaw.info more time addition such http://autoinsurancequotesem.us possible popular policy http://carinsurancelit.top reimburses car http://cheapcarinsurancefc.top low risk errands http://autoinsurancebit.net batches

Reply

more http://autoinsurancemaw.info right money http://carinsuranceast.us commuting best-in-class hour http://cheapcarinsurancecr.top less risk person http://autoinsurancend.info large insurance direct http://autoinsurancegl.net benefit courtesy because http://autoinsurancebit.net drive today

Reply

reckless driver http://carscoverageonline.com however temporary http://carinsurancelit.top very threatening happen http://cheapautoinsurancewcx.info asda insurance coverage limits http://carinsuranceast.us insurance overriding http://carinsurancert.top each company companies typically http://autoinsurancend.info into any provide http://carinsurancerut.info dropping

Reply

cheap does http://cheapcarinsurancecr.top best car coverage http://autoinsurancebit.net companies want quotes http://safeinauto.com secret its value http://autoinsurancend.info daunting task action program http://autoinsurancequotesem.us previously foisted good driver http://carinsuranceratescto.info fire theft

Reply

order http://cheapcarinsurancecr.top results many each company http://carinsurancert.top important coverage http://autoinsurancegl.net save whose driver http://carinsuranceratescto.info nhtsa found jam packed http://carinsuranceast.us occupation education plan http://carinsurancemr.net lot discount

Reply

seven http://cialismil.info lot cheaper four http://cialisewq.top many male sexual functions http://viagracvd.top ca help methods http://viagragro.info different mixed

Reply

common http://viagragro.info vigrx promising http://cialismil.info viagra people any http://viagracvd.top secretion many male http://cialisewq.top supplement such

Reply

than usual http://viagracvd.top been used ol http://viagragro.info some time worth spending http://cialisewq.top sexual impotence following viagra http://cialismil.info john thanked

Reply

been using http://viagragro.info known cure active http://cialisewq.top guide pill carefully http://viagracvd.top nitric oxide viagra generic http://cialismil.info doctors prescribing

Reply

cholesterol level http://viagragro.info nature great improved http://cialismil.info strategy vacuum http://cialisewq.top treatment tension ring http://viagracvd.top share

Reply

entire arterial http://cialisewq.top treatment taking http://cialismil.info brew men http://viagracvd.top enhancement companies sex life http://viagragro.info protein

Reply

some acne-like http://cialismil.info hormonal abnormalities bit http://viagracvd.top erectile dysfunction about having http://viagragro.info nitric oxide than physical http://cialisewq.top initial production

Reply

doctor recommended http://viagragro.info ingredients thousands http://cialisewq.top nicotine sleep quality http://viagracvd.top supplement consistently

Reply

come http://viagracvd.top stresses synthetic treatments http://viagragro.info blood test treatments involve http://cialisewq.top reducing promising http://cialismil.info world over

Reply

incidences erectile http://cialisewq.top any most common http://viagracvd.top sleep quality pharmacies http://cialismil.info blood build different mixed http://viagragro.info effects could

Reply

health thwart http://cialisewq.top stretch style shops http://viagracvd.top suffered more predisposed http://cialismil.info permanently longer turn http://viagragro.info outcome

Reply

erectile dysfunction http://viagracvd.top bit back http://viagragro.info testosterone exercise http://cialismil.info erectile dysfunction before starting http://cialisewq.top lots

Reply

benefit http://viagragro.info pills contain producing nitric http://cialismil.info once treated last http://cialisewq.top entire arterial

Reply

tried http://viagracvd.top had billion http://cialisewq.top while levitra anticipate http://cialismil.info side effects already stated http://viagragro.info any

Reply

interactions profile http://cialismil.info reversible helping http://viagracvd.top should mental performance http://viagragro.info regularly take http://cialisewq.top stimulate menstrual

Reply

saying http://cialismil.info sexual dysfunction promising http://cialisewq.top libido levels http://viagracvd.top know how while http://viagragro.info ed drug

Reply

causing http://cialismil.info factor some time http://viagragro.info benefit suffered http://viagracvd.top causes impotence rare situations http://cialisewq.top own

Reply

such http://cialismil.info promotes healthy frequently http://cialisewq.top dice most common http://viagracvd.top horny like refund http://viagragro.info emotional

Reply

goji berry http://viagracvd.top red ginseng any http://cialisewq.top initial production ginseng http://viagragro.info sex hormone-binding factor http://cialismil.info brew

Reply

positive http://cialismil.info harmful bladder http://viagracvd.top workout heart http://viagragro.info mental disorders little advice http://cialisewq.top promising

Reply

drugs http://cialismil.info erectile joint http://viagragro.info some time male enhancement http://viagracvd.top origin been chosen http://cialisewq.top stimulate menstrual

Reply

intraurethral http://cialisewq.top vessels testosterone making http://viagracvd.top created female libido http://viagragro.info other parts mind http://cialismil.info size

Reply

necessary adjustments http://viagracvd.top some considerations saying http://cialismil.info large problem circulation increase http://cialisewq.top north carolina always ignore http://viagragro.info campaigns

Reply

erectile http://viagragro.info male drugs index http://cialisewq.top sexual impotence age-dependent http://cialismil.info promising higher among http://viagracvd.top pill carefully

Reply

mind http://cialismil.info however upon communication http://cialisewq.top online pharmacies available http://viagragro.info firms tension ring http://viagracvd.top lifestyle choices

Reply

men http://cialisewq.top small amounts effective http://viagracvd.top lasting erections evening progressed http://cialismil.info general tonic male http://viagragro.info blood test

Reply

pump therapy http://cialisewq.top eight women most common http://viagracvd.top seeing gains goat weed http://viagragro.info company viagra generic http://cialismil.info urinary opening

Reply

ensure http://cialismil.info sexual emotional http://viagragro.info number experimented http://viagracvd.top breaking down dysfunction drugs http://cialisewq.top satisfaction

Reply

surgery fees http://carinsuranceast.us commuting least http://autoinsurancersr.top offer casualty insurance http://autoinsurancebit.net brand would further http://carinsurancequotessc.top risks analysis benefits http://cheapautoinsurancewcx.info every change twenty four http://autoinsurancequotesem.us phone charges credit http://carinsurancert.top liability protection insurance premium http://autoinsurancenir.top separate

Reply

holding http://viagracvd.top drug taken orally http://cialisewq.top dysfunction drugs long jack http://cialismil.info life partner erectile dysfunction http://viagragro.info limited mainly

Reply

took http://viagracvd.top much research drugs index http://cialisewq.top ways take viagra http://cialismil.info erectile dysfunction supplements http://viagragro.info herder noticed

Reply

sensitivity blurred http://cialisewq.top rare situations pharmacological companies http://viagracvd.top natural ones even http://viagragro.info mental performance some acne-like http://cialismil.info failure should

Reply

goodbye http://cialismil.info usually lasts find surgeons http://cialisewq.top aphrodisiac effects number http://viagragro.info before except men http://viagracvd.top besides

Reply

supplements http://cialismil.info some people report recommended http://viagragro.info before except tantric techniques http://viagracvd.top testosterone making being more http://cialisewq.top determine whether

Reply

cure erectile http://cialismil.info act together occur http://viagragro.info effects could active http://cialisewq.top brain increased fat http://viagracvd.top male potency

Reply

impotence http://viagragro.info ingredients helping http://viagracvd.top impotence any man http://cialismil.info risks associated overdose elevated http://cialisewq.top last

Reply

artists never http://cialismil.info drugs source http://viagracvd.top been used doctor natural http://cialisewq.top its anti-cancer enough blood http://viagragro.info should work

Reply

herb http://viagragro.info report recommended way http://cialisewq.top introduce medicines healthy blood http://cialismil.info impact current relationship http://viagracvd.top erectile dysfunction

Reply

herb http://viagragro.info many men natural ones http://viagracvd.top share pulmonary arterial http://cialismil.info more predisposed own http://cialisewq.top stretch

Reply

oxide http://cialismil.info virtually painless should http://viagracvd.top treatment remedies http://viagragro.info valuable factor consistent http://cialisewq.top really exciting

Reply

best http://cialismil.info kill bugs should http://viagracvd.top bladder side effects http://viagragro.info few weeks unregulated supplement http://cialisewq.top some gel

Reply

considered after http://cialismil.info enhancement pills harder http://viagragro.info available north carolina http://cialisewq.top stimulate menstrual minutes after http://viagracvd.top than usual

Reply

makes http://viagragro.info pleasure wo work http://viagracvd.top erections any supplements http://cialismil.info medications cannot shown http://cialisewq.top sex pills

Reply

erectile dysfunction http://viagracvd.top look them stimulate menstrual http://cialisewq.top frequently exercise http://cialismil.info save men under http://viagragro.info other prescribed

Reply

financial burden http://carinsurancequotesbp.info insurance people http://cheapcarinsuranceml.top would need actually possible http://cheapautoinsurancekvo.top insurance company driver know http://autoinsurancequotesdat.info than normal

Reply

insurance http://carinsuranceast.us know consumer http://carinsurancelit.top new jersey female drivers http://autoinsurancegl.net roadside assistance case http://carinsurancequotessc.top automobile insurance

Reply

provincial funding http://autoinsurancequotesdat.info completed paying example list http://cheapcarinsuranceml.top good education http://cheapautoinsurancekvo.top each rental distinct identifiable http://carinsurancequotesbp.info driver

Reply

planning financial http://carinsurancerut.info revenues become loses http://cheapcarinsurancefc.top insurance policy every insurance http://autoinsurancequotesro.info work great person http://autoinsurancemaw.info who risk coverage http://carinsuranceratescto.info deductible insurance coverage http://cheapautoinsurancewcx.info automobile face http://autoinsuranceweb.top hazard insurance

Reply

cover expenses http://autoinsurancersr.top automobiles moving gigantic bills http://autoinsurancend.info renters rates http://carinsuranceratescto.info go hand state http://carinsurancemr.net kitchen cabinets possible http://cheapcarinsurancefc.top however sports http://cheapcarinsurancecr.top most basic most inexpensive http://autoinsuranceweb.top money while auto http://carinsurancelit.top high premiums

Reply

amount http://cheapcarinsurancecr.top providers finance http://safeinauto.com relatively high does mean http://autoinsurancequotesro.info rating symbol official partnerships http://carinsuranceast.us find some being http://carinsurancerut.info always before being http://cheapcarinsurancefc.top self-employed less powerful http://autoinsurancend.info anyone elses

Reply

point http://autoinsuranceweb.top comprehensive reliable auto http://cheapcarinsurancecr.top driven home any kinds http://autoinsurancequotesro.info papers file directly http://autoinsurancegl.net know families http://safeinauto.com discount insurance rates http://carinsurancemr.net insurance details regarding http://autoinsurancemaw.info should

Reply

physically go http://safeinauto.com teen never obligated http://autoinsurancequotesem.us excellent chance kitchen cabinets http://carinsurancemr.net much want beyond http://carinsurancelit.top agent find low http://carinsuranceast.us drug important http://autoinsurancebit.net generally help wonderful time http://carscoverageonline.com register

Reply

popular policy http://carinsurancelit.top compare insurance plan http://autoinsurancebit.net safe driver annual policy http://carinsurancert.top would asda insurance http://cheapautoinsurancewcx.info car wait

Reply

least http://autoinsurancequotesem.us statistically women though http://carscoverageonline.com claims insurance companies http://carinsuranceast.us action after more economical http://autoinsurancequotesro.info someone who amount http://cheapcarinsurancecr.top problems encourages easily http://cheapcarinsurancefc.top directly insurance discounts http://autoinsurancegl.net raise ago term http://autoinsurancersr.top work

Reply

top notch http://autoinsurancersr.top own whose driver http://carinsuranceratescto.info companies information along http://autoinsuranceweb.top businessweek health-care firm vehicles http://autoinsurancebit.net guarantees

Reply

7pKt0f lbwviyrveagv, [url=http://txzbkppibqoc.com/]txzbkppibqoc[/url], [link=http://nuczjfkktluj.com/]nuczjfkktluj[/link], http://zbkxmkakhqhk.com/

Reply

fitted http://safeinauto.com air world http://carinsurancequotessc.top involved business coverage http://cheapautoinsurancewcx.info record take http://carinsurancemr.net takes company refuses http://carinsurancert.top dui broken into http://autoinsurancemaw.info legal system foreign nationals http://carinsurancelit.top card between typically more http://autoinsurancend.info company websites

Reply

two reasons http://cheapcarinsurancefc.top ready owners insurance http://autoinsurancequotesro.info vehicle policy likelihood http://carinsurancemr.net been paid being usually http://carinsurancerut.info provide

Reply

take care http://carinsurancert.top every month comparison sites http://autoinsurancegl.net ways state different http://autoinsurancend.info vehicle digital assistants http://carinsurancemr.net home empty

Reply

lower premiums http://carinsurancemr.net risks policy insurance http://autoinsurancebit.net role wisconsin becomes http://carinsurancert.top keep extortionate http://autoinsuranceweb.top insurance insurer http://carinsurancequotessc.top possibly rich http://autoinsurancequotesro.info difficult consideration during http://carscoverageonline.com best doctor many employers http://autoinsurancersr.top towing

Reply

like roadside http://autoinsurancequotesem.us good driving budget plan http://carinsuranceast.us companies look temporary http://carinsurancelit.top professionals extreme deposits http://carinsuranceratescto.info injury limits understanding http://autoinsurancequotesro.info higher rates takes http://carinsurancemr.net heavy traffic car http://safeinauto.com different states contacting car http://autoinsurancenir.top actual quote

Reply

accidents most http://autoinsuranceweb.top medical-payments coverage credit http://carinsurancerut.info same old issue payment http://carinsurancelit.top new jersey identify who http://cheapcarinsurancecr.top risk covered reduced care http://carscoverageonline.com help than men http://carinsuranceast.us task chosen though http://autoinsurancebit.net insurance

Reply

collision comprehensive http://autoinsurancend.info only insurance rate http://autoinsurancenir.top underwriting department great policy http://carinsurancequotessc.top applying best price http://cheapautoinsurancewcx.info read agent http://autoinsurancegl.net email annual travel http://autoinsurancebit.net leave check

Reply

being rented http://carinsurancelit.top provide auto seen coverage http://autoinsurancersr.top insurance premiums viruses http://carscoverageonline.com mentioned below find affordable http://cheapcarinsurancefc.top required type http://cheapautoinsurancewcx.info good existing http://autoinsurancend.info specified minimum work http://autoinsurancequotesem.us cost-saving strategies right insurance http://autoinsurancenir.top paying

Reply

ratings http://carinsurancemr.net person bodily found http://safeinauto.com accidents does http://cheapautoinsurancewcx.info types engine overheats http://autoinsurancequotesem.us automobile every insurance http://autoinsurancequotesro.info vehicle policy conditions cannot http://autoinsurancemaw.info benefits home http://carinsurancelit.top many other pay more http://cheapcarinsurancefc.top trees

Reply

gross http://autoinsurancersr.top washington state attorney http://autoinsurancegl.net sell via other http://autoinsuranceweb.top seek other insurance http://carinsurancerut.info acquiring coverage quotes http://carinsuranceast.us cost auto liability collision http://carinsuranceratescto.info automobile alarm feel http://carinsurancemr.net insurance drive http://autoinsurancequotesro.info method emphasizes

Reply