We are a Leamington Spa and Lichfield web design company, serving the UK, who make professional websites at affordable prices.
Follow ArcimediaApps on Twitter
Arcimedia | Design+Development+Web

Dispatch events in AS3

Event management is a very powerful tool you can utilise when dealing with multiple swf files and/or classes. It’s a great way of communicating between different elements in your project and is not difficult to use.

Let’s begin by showing you the basic code for you to copy and paste, quick and simple. I’ll then explain in more detail.

First of all, you can add dispatchEvent(new Event(“myEvent”)); to any function in your code. This sends out a signal called “myEvent” using the built in function ‘dispatchEvent’.

You can then setup an event listener to wait for the signal to be dispatched, and then act upon it: addEventListener(“myEvent”, doMyEvent);

where ‘doMyEvent’ is another function which gets executed when the signal is dispatched.

Of course, you need to import flash.events.Event into the class to allow events to be dispatched. So here’s a full example, with the event dispatched on a mouse click:


package
{
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Sprite;

/**
* @author Andy Jones, Arcimedia
*/

public class EventExample extends Sprite
{

public function EventExample()
{
btn.addEventListener(MouseEvent.CLICK, mouseClick);
addEventListener("myEvent", doMyEvent);
}

private function mouseClick(evt:MouseEvent)
{
dispatchEvent(new Event("myEvent"));
}

private function doMyEvent(evt:Event)
{
trace("event received");
// Do some stuff
}

}
}

This may appear unnecessary at first – why use dispatchEvent on a mouse click when you can just put the code in the mouse click function?

Very true, but if you wanted to execute some code located in another class or another swf file, then suddenly dispatchEvent becomes very useful.

If you had two classes, one loading the other, then the child may dispatch an event once it has finished completing a certain task. The parent class can then act upon this event. For example, the child class might load a gallery of images; when all the images have loaded, it tells the parent class using dispatchEvent, which then displays a control panel to scroll through the images.

Here’s the code for both parent and child classes:


package
{
import flash.events.Event;
import flash.display.Sprite;

/**
* @author Andy Jones, Arcimedia
*/

public class Parent extends Sprite
{
private var child:Child;

public function Parent()
{
child = new Child();
child.addEventListener("imagesLoaded", doMyEvent);
addChild(child);
child.init();
}

private function doMyEvent(evt:Event)
{
trace("event received");
// Load controls
}

}
}


package
{
import flash.events.Event;
import flash.display.Sprite;

/**
* @author Andy Jones, Arcimedia
*/

public class Child extends Sprite
{

public function Child()
{

}

public function init():void
{
//code to load images, when all images have been loaded,
imagesLoaded(); //is called
}

private function imagesLoaded():void
{
dispatchEvent(new Event("imagesLoaded"));
}

}
}

For more advanced situations, where you have lots of events firing off in different places, I would advise creating an Event class which lists all your events in one place and eases development changes. You can also pass parameters to the parent class, for example, here I have passed a string parameter. This can then be accessed in the parent file in the ‘doMyEvent’ function. Here is the code for the Event class:


package
{
import flash.events.Event;

/**
* @author Andy Jones, Arcimedia
*/

public class AllEvents extends Event
{
public static const IMAGES_LOADED:String = "imagesLoaded";
public static const IMAGE_CLICKED:String = "imagesClicked";
public static const NEXT_CLICKED:String = "nextClicked";
public static const PREVIOUS_CLICKED:String = "previousClicked";

public var _data:String;

public function AllEvents(type:String, Data:String, bubbles:Boolean = false, cancelable:Boolean = false)
{
super(type, bubbles, cancelable);
_data = Data;
}
}
}

The parent and child classes would then become:


package
{
import flash.events.Event;
import flash.display.Sprite;

import AllEvents;

public class Parent extends Sprite
{
private var child:Child;

public function Parent()
{
child = new Child();
child.addEventListener(AllEvents.IMAGES_LOADED, doMyEvent);
addChild(child);
child.init();
}

private function doMyEvent(evt:AllEvents)
{
trace("event received = "+evt._data);
// Load controls
}

}
}


package
{
import flash.events.Event;
import flash.display.Sprite;

import AllEvents;

public class Child extends Sprite
{

public function Child()
{

}

public function init():void
{
//code to load images, when all images have been loaded,
imagesLoaded(); //is called
}

private function imagesLoaded():void
{
dispatchEvent(new AllEvents(AllEvents.IMAGES_LOADED, "Image Gallery"));
}

}
}


Download the source files here.

AS3 JSON Loader

In my experience, JSON data has taken over XML as the number one way of sending and recieving data from one application to another. In this tutorial I will show you how to load JSON data into an actionscript class and deal with the results.

First of all, you need to dowload the adobe as3corelib code library, if you don’t have it already. Download it here.

Once you have downloaded it, make sure your Flash or Flex actionscript settings refer to the correct folder in order to load the code. Then add import com.adobe.serialization.json.JSON; to your class.

Assuming you have some data to load, you will need to use a URLLoader and URLRequest to import the data from a URL. Import the following:


import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.IOErrorEvent;

Then declare two variables for the loading:


private var loader:URLLoader = new URLLoader() ;
private var request:URLRequest = new URLRequest();

Now you need to load in the URL and wait for the completed load event.

Once the data has loaded, you can use the adobe JSON decode method (in the class you downloaded). It’s just one line of code:


jsonDecoded = JSON.decode(event.target.data);

For your convenience, I’ve created a class which will do all this for you:


package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.events.IOErrorEvent;

import com.adobe.serialization.json.JSON;

/**
* @author Andy Jones, Arcimedia
*/

public class JSONLoader extends Sprite
{

private var loader:URLLoader = new URLLoader() ;
private var request:URLRequest = new URLRequest();
public var jsonDecoded:Object = new Object();

public function JSONLoader(DataURL:String):void
{

var JSONString:String = DataURL;
//trace("JSONLoader - JSONString = "+JSONString);

var urlRequest:URLRequest = new URLRequest(JSONString);

//var urlLoader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, decodeJSON);
loader.addEventListener(IOErrorEvent.IO_ERROR, urlLoadErrorHandler);
loader.load(urlRequest);

loader.addEventListener(Event.COMPLETE, decodeJSON) ;

}

public function decodeJSON(event:Event):void
{
trace("JSONLoader - Jason - "+event.target.data);

jsonDecoded = JSON.decode(event.target.data);
dispatchEvent (new Event("dataReady"));

removeListeners();
}

public function urlLoadErrorHandler(event:IOErrorEvent):void
{
trace("Jason - unable to load data");
dispatchEvent (new Event("dataFailed"));
removeListeners();
}

public function removeListeners():void
{
loader.removeEventListener(Event.COMPLETE, decodeJSON) ;
loader.removeEventListener(IOErrorEvent.IO_ERROR, urlLoadErrorHandler);
}

public function returnJsonDecoded():Object
{
trace("Jason jsonDecoded - "+jsonDecoded);
return jsonDecoded
}

}
}

This can be used by importing the above class using:


import JSONLoader;

Now create a variable to be used as an instance of the class:


var jsonLoader:JSONLoader = new JSONLoader(dataString);

where dataString is the URL of your data. This JSON loader class dispatches two events, telling you when the data is ready to be used, or if the load failed. For more info on dispatching events, see my dispatchEvent AS3 tutorial.

Make sure you add listeners to wait for the events to be dispatched:


jsonLoader.addEventListener("dataReady", collectJSONData);
jsonLoader.addEventListener("dataFailed", doJSONFailed);

Then deal with them accordingly. Here is the full class:


package
{
import flash.events.Event;
import flash.display.MovieClip;

import JSONLoader;

/**
* @author Andy Jones, Arcimedia
*/

public class Parent extends MovieClip
{

private var dataString:String = "your data URL";
private var jsonLoader:JSONLoader;

public var jsonObject:Object = new Object();

public function Parent()
{

jsonLoader = new JSONLoader(dataString);
jsonLoader.addEventListener("dataReady", collectJSONData);
jsonLoader.addEventListener("dataFailed", doJSONFailed);

}

public function collectJSONData(evt:Event):void
{

jsonObject = jsonLoader.returnJsonDecoded();

}

public function doJSONFailed(evt:Event):void
{
dispatchEvent (new Event("dataFailed"));
}

}
}

You will see your data is now very easy to use, assuming the data is well formed in the first place. For example, if the first item in your data was categories, you can access it by using


jsonObject.categories

I hope you found this tutorial useful.

Download the sourcefiles here.

Pagination AS3

When building a flash application, sometimes displaying information in an attractive way is only half the journey. When dealing with lots of dynamic feeds and API’s, you may get varying numbers of results, meaning your display can alter drastically. Hence the need for pagination.

I have created some universal classes in AS3 which will deal with pagintion. To use them, first of all, download them here, and save them to a folder called ‘pagination’ in your project.

To implement them, first of all import these two classes:


import pagination.Pagination;
import pagination.PaginationEvent;

Then create four variables:


private var _paginator:Pagination;
private var _numProducts:uint = 40;
private var _perPage:uint = 5;
private var _paginationMax:uint = 5;

Of course you can edit the variables to whatever you choose, remembering to keep the _numProducts greater than the _perPage, otherwise the pagination will not display.

Now within the main class of your project, initialise the paginator:


_paginator = new Pagination();
_paginator.addEventListener(PaginationEvent.PAGINATION_CLICK, paginationClick);
addChild(_paginator);
_paginator.setupPagination(_numProducts, _perPage, _paginationMax);

where:
_numProducts:int – total number of items or products
_perPage:Number – how many items/products to show on each page
_paginationMax:Number – the amount of page numbers to display on screen

You may notice an event listener in the previous code block. This waits for a user to click on a page number or one of the arrows. You can track the result using this function:


public function paginationClick(evt:PaginationEvent):void
{
       trace("Pagination click data = "+evt._data);
}

This allows you to then load the required data based on the user interaction.

You can also reset the paginator back to page one by using this code:


_paginator._currentPage = 0;

I hope you found this useful,
Andy Jones
Arcimedia Developer

Principles of Minimalist Web Design

Designing in a minimalist style can yield a beautiful website, where clarity and simplicity in the structure of the site is reflected in the formal design of it. Recently, I have been re-reading the fundamentals of minimalism as a coherent artistic ideal, which can be traced back to various American artists of the 1960s, such as Carl Andre, Frank Stella and Donald Judd. The small but elemental list of minimalist ‘laws’ that determined the shape of minimalist art and design in the decades that followed is worth recollecting:

Equality of Parts

As a reaction against gestural, self-expressive ideals in art, especially painting, minimalism valued uniformity and equality of formal components. By using forms that share a common basis – area, shape, ratio – the aesthetic emphasis is focused on a rational clarity that has its own visual impact. Equality of parts means using shapes of the same order to emphasise space, rhythm and simplicity.

Carl Andre’s Trabum
Repetition

Assembling a repetitive motif is a hall-mark of minimalism. Through repetition, the formal mechanics of a shape are amplified. Repetition may also emphasise the space around a shape through its relationship with it repeated self. Repetition is therefore about magnifying the elemental aspects of the design.

Neutrality of Surfaces

Expressiveness is to be avoided in minimalism. Clarity in execution is therefore aided by using surfaces that excite the senses only by their uniformity and spatial simplicity. A neutral surface need not be plain or unadorned, but must suggest unbiased simplicity, such that one might find in natural materials, or man-made items such as bricks or concrete.

Potential for Infinite Extension

Conceptually, minimalism proposes a formal rigour in its execution. The potential to continue a series of elements ad infinitum is part of this rigour, because it suggests mathematical harmony in its parts. Moreover, the ability to add to a series gives flexibility to the design.

By Chris Jones
Arcimedia Developer

Website Menu Design

Great menu design can be quite an art. A successful menu will allow the user to traverse the menu from the top to the target node as fast as possible.

For a given number of choices, should they all be presented on one screen or should they be divided among several screens?

It becomes a decision between breadth and depth. A broad menu, on one screen, requires the user to scan a large list of items, which increases both search time and response time. It also affects design, as the menu will either cover a greater area, or have smaller items.

However a deep menu requires a greater number of choices. As the user scans and responds to each item, it will be faster than a broader model, but the target item may be difficult to locate if the menu titles are ambiguous.

Hick’s law describes the time it takes for a person to make a decision as a result of the possible choices he or she has. It is often referred to in menu design but
is not necessarily an accurate mechanism due to the linear style of menu reading. In a menu, a user has to go through each option in order and make a decision before moving on. Hick’s law suggests that at each stage, the user eliminates half of the choices available, which is non-linear, although partly true in a deep model.

In 1985, Landauer & Nachbar give a depth vs. breadth summary:
“For lists of linearly organized arrays such as numbers, alphabetized lists, letters of the alphabet, and months of the year, one should increase breadth to the maximum practical level.
When there is no inherent linear ordering of alternatives, users may scan items sequentially. When this is the case, user response time may approximate a linear function and the optimal number of alternatives will fall between 3 and 12 depending on various user characteristics and system parameters. However, if multiple levels of the hierarchical menu can be displayed in an organized manner in one frame, response time can be reduced with much broader menus. The overriding principle is to provide organization, whether linear or hierarchical, to the user as a vehicle for visually locating target items.
It may very well be that the depth vs. breadth trade-off issue is really misplaced and that the transcending issue is that of effectively revealing menu organization to users, while reducing the number of frames and responses required to locate target items.”

Common errors in the menu design include:
1. Category names within the menu do not represent items within the category.
2. The user gets the impression there are additional items in the category.
3. The category names are ambiguous or overlap

Another thing to consider is the amount of times a particular menu item is accessed. Some will have a far higher user interaction rate than others, e.g. in a file menu within an application, copy and paste will almost certainly be used more often than exit, yet exit might be seen to be more important, as it is a definite requirement.

As such, important and regularly used items should be placed within easy reach.

Designer or developer?

It is someting that has often baffled me, the difference between a developer and a designer, and why the two are always seperated.

Can it not be that some of us are a combination of both?

designer or developer
designer or developer?

Whenever I have been on the lookout for a career alteration, or simply scouring freelance bidding sites, there has always been a distinct boundary. Businesses create job descriptions which are almost always one or the other, but seldom both. Furthermore, their teams are seperated into coders and creatives and as such, individuals are led down one path or the other.

Like the age-old distinction between left and right in political rhetoric, computing careers take a similar stance. But in modern times, the Westminster central viewpoint is becoming ever more fashionable. Can the I.T. world follow suit and care for those of us who stand with one leg on each side?

I am forever swaying between the two alternatives, not knowing which way to choose, but always needing to make that decision, when I feel I could give as much to one as the other.

And so it goes that existing businesses should look ahead and make way for the cross-over breed of software practitioner. Otherwise, they may find themselves with employess going seperate ways and forming new and more dynamic companies.

5 ways to improve your website

With so many websites now vying for our attention, how do you make your site stand out from the crowd? Here are a few simple ideas to put you on the right path:

1. Sharpen you landing page: it may be stating the obvious, but this is the first impression that visitors have of your site. The image visitors are given when they first click on a link to your site is the image they take away with them. First impressions are crucial. Does your site give an impression of quality, trustworthiness, authority, customer-focus, containing up to date information?

2. Have a clear call to action: Once on your landing page, then next step is to give visitors a clear idea of what do next. Don’t leave them searching around the site with no clue where to go. You’ve got their attention. Now show them a clear way forward.

3. Design a good navigation system: This takes some thought. Navigating around a website is now something most people do intuitively. We all recognise dropdown menus, homepages, search boxes, etc. We use them habitually, and so are drawn towards them because they are familiar. This is a great opportunity for a thoughtful web designer. By using familiar elements, you can get a visitor to interact with your site within seconds of arriving. Designed really well, and you can subtly lead a visitor through the experience you want to give them.

4. Maintain clarity in you design: confusing design layouts are the worst way to appeal to new visitor. Maintaining clarity, using space, silent areas, subtle divisions and composition will keep the user experience balanced.

5. Use keywords in your main content: If you want search engines to find your site, the words that you use in your content will determine when your site appears in search results. By building your content around a few choice words and phrases, your site will climb the rankings when those words or phrases are typed into a search engine. The key is to figure out what words your potential visitors use to look for you, and to use those words in your content.

Bavarian adventure

My ideal existence of soaking up culture, science and history whilst intaking varying delicious food and drink-stuffs is always given an ample handful with a bit of travel. Last September, 2010, my girlfriend Bec and I took a trip round middle Europe in my under-used Mazda.

We began by heading from Leamington Spa to the well known Dover ferry terminal. Reminders of childhood holidays caravanning into France came flooding back, and I remembered there was more to leaving Britain than using some low cost airline.

Calais is the same as Dover, without the big white cliffs, so we drove straight out of there, and out of France, to Bruges in Belgium.

Bruges

After an easy approach, the city itself caused a massive parking headache; made worse by my endless optimism of the next space being round the corner. In the end, a friendly old woman pointed us in the direction of the main railway station, just outside the old city walls and with a vast car park. A fine tip.

And a fine city. A cobbled maze of ancient architecture, lined with cafe’s, boutiques and unusual outlets. Charm oozes from every cobble.

Bruges

Bruges

We were fortunate to spent the day in beautiful sunshine walking around soaking up the atmosphere and taking in a couple of drinks in one of the bars on the main square. Our table was just out the shadow of the main tower, made famous by the film In Bruges, with Colin Farrel.

Bruges

Bruges drinks

After a long day and splendid evening meal, we headed for the hotel. Shattered and slightly tipsy, Bec fell down some stairs and injured her neck. Nothing serious though. But enough to cause me much amusement (and some sympathy).

Cologne

Despite our first impressions suggesting an industrious and somewhat edgy city when we arrived in the evening, the morning gave us an altogether different story. Waking to sunshine and a typically fine continental breakfast, we left the hotel to stroll around the bustling streets and multi coloured buildings. Everything here lives in the shadow of the magnificent gothic cathedral. We agreed that it needs a serious clean but still commands massive respect so we decided to climb the 533 steps to the top of one of the enormous towers. Bec nearly killed me half way up for dragging her up the narrow spiral staircase, particularly as she is still recovering from her injuries from a previous encounter with another lot of stairs. However, she soon forgave me on reaching the summit where the views were far reaching and rewarding.

Cologne

Cologne

After recovering in McCafe (MacDonald’s does cappuccino), we continued to meander through the many shopping and cafe cultured lanes of the old town all the way to the media park for a photographic museum. Or that’s what we thought. The rude lady on the desk just shrugged her shoulders blankly when I asked about the exhibition. We drowned our sorrows with a pizza.

We also got an excellent taste for the city’s cultural attitude when we visited the modern art museum, a great combination of futurism and pop art in an equally impressive building.

Rothenburg

The autobahns took us from Cologne, through the Rhine valley, and onto the Romantic road of Bavaria. The weather was of an inconsistent nature, but pleasing enough for the most part. Bec coined the phrase ‘a Rothenburg’, meaning a great pick me up moment.

Rothenburg

Rothenburg

Our drive from Cologne saw a few wrong turns and places of interest which put simply: were not there. So when we arrived at Rothenburg, right in the heart of Deutschland, our eyes widened and our jaws loosened, for here was a town of unrivalled charm and beauty.

A walled town on top of a hill with complimentary valley providing medieval defenses and stunning views. Each and every road was cobbled and lined with picture book German Christmas houses, taverns, churches and towers. Not a cobble out of place and filled with interesting shops and traditional restaurants. We spent two days exploring and relaxing
here and enjoyed every minute. Bec’s jaw has only just returned to it’s normal position.

Fussen

Home to the fairytale castle of Neuschwanstein, the town itself reminded me of parts of Disneyland, giving me the impression that all of magic kingdom was derived from here. Bec saw two Bernese mountain dogs (her favourite) which gave her the Rothenburg moments she’d been waiting for after lots of rain on the journey.

Bec had a few long sleeps after walking all day up hills and along windy paths. A very exhausting day soaking up the delights of the two nearby fairytale castles and walking to them and between them. Totally worth it though as they are built with glorious aesthetics,
hilltop positions and mountainous backdrops. We were joined by crowds of equally impressed tourists eager to view King Ludwigs famous creations.

Neuschwanstein Castle

Neuschwanstein Castle

I was impressed by the extravagences of each room and the vast Wagner inspired theatre on the top floor with views over the whole area.

The evening saw some fine German cuisine – t I ordered a ‘pepper pan’ which was meant to be peppers in an onion and garlic source. It turned up looking like an enormous alien with thirty tentacles rising from a misty bog. The taste was even worse and neither of us managed more than two mouthfuls. The steak that followed more than made up for it.

Freiberg

We enjoyed more glorious weather whilst straddling and flirting with the German and Swiss borders for a few days on the way to Freiberg. Half way there we stopped off at the delightful and exhilarating Rhine falls, Europe’s biggest waterfall. An incredibly fast and explosive gush of water near to Lake Constance on the border.

Rhine falls

Rhine falls

Freiburg in the Black Forest was the Cambridge of Germany, a bustling university city with striking architecture and lots of atmosphere. The surrounding large dark lush hills of intense forest formed a beautiful journey for us, despite an enormous detour due to a road closure, adding an extra hour onto our arrival time.

Freiberg

Freiberg

We had a relaxing time in Freiburg, soaking up the sun, taking in the views, listening to live music and swimming in hotel pool.

Our hotels have been very good all-in-all, friendly hosts, clean rooms, perfect locations and good breakfasts.

That is until now.

Interlaken

As Interlaken is a very expensive place and there weren’t many hotels left, we opted for something cheap. Oh how the standard has suddenly dropped. This is no frills. Yet it did have free Internet access, so it wasn’t all bad news, but I was made to sit out in the corridor wrestling with the last few sparks of broadband available to write my little journal.

However, the scenery is stunning and sunshine glistens off every snowflake high on the overlooking mountains. For Interlaken was home to one of our trip highlights: face to face with the ‘death wall’ – the Eiger’s north face.

The Eiger

The Eiger

We woke to perfect blue skies and absolute stillness in the air. Ideal climbing conditions many would say. Bec certainly agreed as she adorned my North Face fleece and got ready for the monumental ascent.

I reminded her that 64 people had previously been killed trying to reach the summit but this didn’t deter her one bit. Fortunately, on laying eyes on the great mountain, she finally retreated her ideas and joined me and the other hikers on the lower slopes.

We took in the wonderful panoramic views after a long cable car journey and short walk. The three mountains in full view are like actors on a stage performing whenever we lift our heads. They are spectacular from tip to toe and sparkle in the sunshine above the equally impressive valleys way below.

Valley next to The Eiger

Valley next to The Eiger

A very fine day was complete with a railway journey down the mountain and a curry in the local town.

CERN, Geneva

I couldn’t pass by Geneva without a glance at the LHC (Large Hadron Collider), the world’s largest particle accelerator, being a science lover. I wasn’t fast enough to book a tour of the main buildings (you need to book way in advance) but was able to visit a couple of interesting exhibitions nonetheless.

Mouches

We completed our trip by going to stay with Bec’s sister and her boyfriend in a tiny little village called Mouches in mid-France. This was a fine and relaxing way to finish the journey, drinking wine, playing games and going for bike rides in the rolling French countryside.

Andy – Arcimedia

Choosing the right web developer

Choosing the right web developer to create your website is an important decision. Get it right, and you will enjoy the benefits of a well-designed website and search engine success. Get it wrong, and you could be chasing your web developer to fix problem after problem.

Should I do it myself?

For most businesses, outsourcing to a web developer is the best way to get a well-designed website. There are many excellent “do-it-yourself” web resources out there that can offer invaluable advice on how websites work and how to get started building your own. Yet, by outsourcing the task to a professional web design company with the right experience and skills, you should gain the benefits of in-the-field knowledge that is hard to pick up if you’re not working on websites every day. The right choice is crucial, and the right choice will depend on your needs.

A web design company or a freelance designer?

Getting your website designed and developed by a web design company or a freelance contractor involves considering certain issues. Both have their advantages. An effective web design company will have a wide selection of skills. If the team is experienced and, more importantly, supportive, you will benefit from a variety of skilled individuals who can give you the benefit of their collective expertise. The web is a constantly changing place, so having a team who know their stuff can be invaluable.
However, an independent web designer can be cost effective and sometimes more flexible. A dedicated freelancer will work day and night for you. And if you have a clear vision for your website, an independently thinking designer can help you get the website you want without compromising.

Communication

Communication is always important. Building a website is a technical business, and often the specifications for the site will change over time. For this reason it’s imperative to find a developer who is a reliable communicator.
Any reputable web design company or individual should offer a choice of ways to communicate, and you should choose the method you’re most comfortable with. To make sure the project gets off on the right foot, ask for a detailed breakdown of costs and timescales. If they are experienced, they will know the value of clear communication too, and will give you all the information you require and more. And by judging how effective they are at communication, you should also get an idea of they will support you in the future should something go wrong or if requirements change over time.

Other factors to consider

Review their portfolio. Think about whether the style of their previous designs matches the vision you have of your own site. Working with a likeminded developer will make life much easier. Also, try to judge the professionalism of the company. Do they seem reputable? Will they offer long term support? Or are the promises they make on their website too good to be true? Analyse their technical skills and experience. Make a judgement about how their expertise matches what you need for your site. If you require complex programming and development, you will need to find a developer who can deliver on these fronts. On the other hand, if your project is relatively straight forward, then there’s no need hire an expensive ace developer when an enthusiastic all-rounder will probably do a better job and at lower cost.

Google PageRank

Being ahead of your competitors is something all businesses strive for. This applies to search engine results as much as it applies to the general marketplace. Being number one on Google is of prime importance to all business. So many because of poor search engine rankings.

This graphic tells a strong story:

Traffic by Google rank

Traffic by Google rank

It shows total traffic generated for sites that appear in the top Google searches. Number 1 is the clear winner. Even number 2 is far inferior to being number 1, with the top 5 taking over 70% of all clicks.

What is also evident is that being page 3 in a google search is no better than being page 3000.

For more information see SEOBook