Goodies to Go (tm)
September 13, 2004-- Newsletter #302

By Vince Barnes



Goodies to Go (tm)
September 13, 2004--Newsletter #302

This newsletter is part of the internet.com network.
http://www.internet.com
 


Featured this week:

* Goodies Thoughts - Text Edit vs WYSIWYG
* Q & A Goodies
* News Goodies
* Goodies Peer Reviews
* Feedback Goodies  
* Windows Tech Goodies  
* And Remember This...

 


 

Goodies Announcement

The new Beyond HTML Goodies book is now available!

 

Go beyond the basics and learn how the pros add and use dynamic HTML features and advanced JavaScript techniques. Beyond HTML Goodies demonstrates dozens of new and different features readers can add to their existing Web pages using HTML and JavaScript. The book starts with simple text and image tips, such as adding a clock to a Web page or causing text to appear when the mouse moves over an image. It gradually builds to more complex tricks, including manipulating forms or working with cookies behind the scenes. Throughout the book, readers enjoy Joe's snappy style and "to the point" discussion of each "goody" in the book.

 

http://books.internet.com/books/0789727803

 

 

Goodies Thoughts - Text Edit vs WYSIWYG


"And in the blue corner, weighing in at a colossal 2.5 megs, we have the WYSIWYG world champion....." and so the battle continues! It is, of course, the battle between the proponents of using text editors to manually code web pages, and those who support the use on WYSIWYG (What You See Is What You Get) editors. The debate continues unabated -- as do the questions being sent in, which is why I thought I'd address the issue once more in this newsletter.

So who's right? Everybody, I think! If you want to drive a nail, you're better off with a hammer than a screwdriver, but for screws, a hammer just doesn't do a good job. To get everything done the best way you can, you need both.

An answer like this looks on the surface as though it's simply designed to please as many people as possible, so I thought that the best way to explain my opinion is to describe the merits of each. In this way you will hopefully be able to see under which circumstances each shines the brightest.

Text editors are the purist's choice. Using a text editor you write your own html code from scratch. There are, however, some specialized text editors that provide various levels of assistance with that endeavor. My personal favorite is UltraEdit (http://www.idmcomp.com) although there are several other high quality text editors available. I wrote more about this in an earlier newsletter, which you can find in the archive, here: http://www.htmlgoodies.com/letters/203.html

The main advantages with text editors come from the fact the the author has to know their html code, and because they do, they don't have to surrender any control to the editor. Basically this means that if you wish to implement a particular design, for example, a complex nest of tables, you don't have to hope that the editor can understand which table you wish to have nested inside which cell, how you want them aligned and so on. You simply write the code the way you want it and the job gets done.

Of course, the text editor method requires that you know the html codes you need to use to get that job done (which is where HTML Goodies steps in!)

WYSIWYG editors, such as FrontPage, Dreamweaver and the host of others available in the marketplace, have their own advantages too. First and foremost, they are almost always faster (for the average task.) A WYSIWYG editor provides a graphical representation of you web page as you create it. In fact, you would usually be creating the page right on the graphical representation.

Using such and editor means that you have to know what you want on the page, as opposed to the codes that create what you want on the page. There are limitations, however. There are circumstances where you may wish to add something to your page which the editor doesn't easily understand. The nested tables I mentioned before may be such an example. These editors have come a long way in improving their ability to understand what you want, but there are still those occasions where it's hard to get to to behave.

The better of these editors, including the ones I named here, also provide the ability for you to switch to a code view of the page, allowing you to use a text editor mode for that tricky code, and having allowed you to do so, leave the code you wrote alone, exactly as you wrote it (something which early versions didn't do, thereby earning themselves a bad name among purists.)

When I'm working on my house, I find the need for both screwdrivers and hammers. When I'm working on websites, I similarly find the need for both WYSIWYG and text editors. The trick is to learn to apply the right tool to the particular job at hand.

 

Thanks for Reading!
 

- Vince Barnes

 

Top

Q & A Goodies

Questions are taken from submissions to our Community Mentors. You can ask a Mentor a question by going to http://www.htmlgoodies.com/mentors.

 

 


Q. I am trying to make a simple search form with one text field and one button next to it on the top, and the search result table underneath. The problem is that some users don't necessarily click on the "Search" button (to trigger the search action page), but rather hit the enter key after they type something in the text box. This causes the form page to reload and they get no result from the search. I am sure there is a simple solution to this; I've tried everything I could think of, but with no success. Any help would be much appreciated.

A. That happens when you only have one text box on a form. You could try adding some hidden elements or disable the enter key for the text box. For example:
function disable_enter(e)
{ if(document.all) // detect IE only
{var keycodec = event.keyCode}
else
{var keycodec = e.which}
if(keycodec=='13') // check for ascii code of enter key
{return false;} }
<input type="text size="10" name="txta" onKeyPress="return disable_enter (event)">






Q. I am starting to design web-pages and wanted to know what would I need to start a small e-commerce site. I want it to be database driven.

A. First you need to know if your server supports database driven sites and if so, what type. If your host uses a UNIX server then it should support PHP and PERL. If your server is a Windows server then it supports ASP. Once you figure which one, you can then look for a shopping cart that will work on your particular server. Your host may even offer a cart for you to use. Ask them first. The next is to start testing cart available on the internet. Do a search on Google and then test drive them. Make a list of what you might want in a cart and see which ones offer what you need.
If you do not want host your own shopping cart, you can look into something like Paypal (http://www.paypal.com). HTMLGoodies has a tutorail about Paypal here: http://www.htmlgoodies.com/beyond/paypal.html
They do all of the shopping cart work for you. You add some code to your site to use their cart. They do get a percentage of the sale but I am not sure how much.






Q. I've been having trouble getting 2 image flips to work on the same page. I took the script straight from htmlgoodies. I got one of the images to work by itself but when I set up the other one the first one stopped working and when I rolled over it the second image would rollover instead.

A. Here is a script example that works with multiple image flips:
<html>
<head>
<title>Image Flip</title>
<script language="JavaScript">
function flip(img,imgn)
{
document.images[imgn].src=img
}
</script>
</head>
<body>
<a href="somepage.html" onmouseover="flip('1.gif','pica')"onmouseout="flip('0.gif','pica')"><img src="0.gif" name="pica" border="0"></a><br>
<a href="somepage.html" onmouseover="flip('3.gif','picb')"onmouseout="flip('2.gif','picb')"><img src="2.gif" name="picb" border="0"></a>
</body></html>






(Ryan, who sent in this question, shared with us his work and so I have included it in its entirety -- entirely untested! Jim's answer follows. This is quite an interesting piece of work and I'm sure that many of you will be able to make great things out of it. -- Thanks, Ryan! -- Ed.)

Q. I've created a drop-down menu on a geocities site using JavaScript.
The code for the menu is within a frame that we would like to keep in place. I was wondering if there is anyway to allow the drop-down to
transcend frames because as it exsists now the drop-downs cannot be fully displayed. Thanks in advance for your help and time. The code
for the drop-down is as follows:
<center><script language="JavaScript" type="text/JavaScript"> var
isDHTML = 0; var isID = 0;
var isAll = 0;
var isLayers = 0;
<!--//
function leapto(form) {
var planlist=form.destination.selectedIndex;
parent.main.location.href=(form.destination.options[planlist].value);
planlist = 0;
// reset pulldown menu;
}
//-->
if (document.getElementById) {isID = 1; isDHTML = 1;}
else {
if (document.all) {isAll = 1; isDHTML = 1;}
else {
browserVersion = parseInt(navigator.appVersion);
if ((navigator.appName.indexOf('Netscape') != -1) && (browserVersion
==
4)) {isLayers = 1; isDHTML = 1;}
}}
function findDOM(objectID,withStyle) {
if (withStyle == 1) {
if (isID) { return (document.getElementById(objectID).style) ; }
else {
if (isAll) { return (document.all[objectID].style); }
else {
if (isLayers) { return (document.layers[objectID]); }
};}
}
else {
if (isID) { return (document.getElementById(objectID)) ; }
else {
if (isAll) { return (document.all[objectID]); }
else {
if (isLayers) { return (document.layers[objectID]); }
};}
}
}
var menuTop = 45;
var menuLeft = 400;
var domSMenu = null;
var oldDomSMenu = null;
var t = 0;
var lDelay = 3;
var lCount = 0;
var pause = 400;
function popMenu(menuNum){
if (isDHTML) {
//// Sets the previous menus visibility to hidden
t = 2;
if (oldDomSMenu) {
oldDomSMenu.visibility = 'hidden';
oldDomSMenu.zIndex = '0';
t = 2;
lCount = 0;
}
///// Defines the DOMs of the menu objects
var idMenu = 'menuHead';
var domMenu = findDOM(idMenu,0);
var idMenuOpt = 'menuHead' + menuNum;
var domMenuOpt = findDOM(idMenuOpt,0);
var idSMenu = 'menu' + menuNum;
var domSMenu = findDOM(idSMenu,1);
///// Defines the positions of the sub-menus
if (isID || isAll) {
var menuLeft = (domMenu.offsetLeft) + (domMenuOpt.offsetLeft) - 6;
var menuTop = (domMenu.offsetTop) + (domMenu.offsetHeight) - 1;
}
if (isLayers) {
var menuLeft = document.layers[idMenu].layers[idMenuOpt].pageX - 5;
var menuTop = domMenu.pageY + domMenu.clip.height - 5;
}
///// Positions and shows the menu
if (oldDomSMenu != domSMenu) {
domSMenu.left = menuLeft;
domSMenu.top = menuTop;
domSMenu.visibility = 'visible';
domSMenu.zIndex = '100';
oldDomSMenu = domSMenu;
}
///// Resets oldDom if it is the same as the current DOM
else { oldDomSMenu = null; }
}
////// Returns a 'null' value for non-DHTML Browsers
else { return null; }
}
function delayHide() {
///// Checks to see if there is a menu showing and whether ///// the
global variable 't' has been set to 0
if ((oldDomSMenu) && (t == 0)) {
///// Hides the old menu, resets menu conditions,
///// and stops the function running
oldDomSMenu.visibility = 'hidden';
oldDomSMenu.zIndex = '0';
oldDomSMenu = null;
lCount = 0;
return false;
}
///// Interupts the function if another menu is opened
if (t == 2) { lCount = 0; return false; }
///// Repeats the function adding 1 to lCount each time until /////
lCount is equal to lDelay and then sets 't' to 0 so that ///// the
menu will hide when it runs again
if (t == 1) {
lCount = lCount + 1;
if (lDelay <= lCount) { t = 0; }
if (lDelay >= lCount) { setTimeout('delayHide(' + t +
')',pause); }
}
}
</script>
<br>
<div id="menuHead" class="menuStyleTop" style="position: relative;">
<span class="spacer"> | </span>
<a id="menuHead1" class="menuLink" href="" onMouseOut="t = 1;
delayHide(); return true" onMouseOver="popMenu(1); return
true">News</a> <span class="spacer"> | </span>
<a id="menuHead2" class="menuLink" href="" onMouseOut="t = 1;
delayHide(); return true" onMouseOver="popMenu(2); return true">Who We
Are</a> <span class="spacer"> | </span>
<a id="menuHead3" class="menuLink" href="" onMouseOut="t = 1;
delayHide(); return true" onMouseOver="popMenu(3); return
true">Media</a> <span class="spacer"> | </span>
<a id="menuHead4" class="menuLink" href="" onMouseOut="t = 1;
delayHide(); return true" onMouseOver="popMenu(4); return
true">Events</a> <span class="spacer"> | </span>
<a id="menuHead5" class="menuLink" href="" onMouseOut="t = 1;
delayHide(); return true" onMouseOver="popMenu(5); return
true">Links</a> <span class="spacer"> | </span>
<a id="menuHead6" class="menuLink" href="" onMouseOut="t = 1;
delayHide(); return true" onMouseOver="popMenu(6); return
true">Email</a> <span class="spacer"> | </span>
<a id="menuHead7" class="menuLink" href="" onMouseOut="t = 1;
delayHide(); return true" onMouseOver="popMenu(7); return
true">Guestbook</a> <span class="spacer"> | </span>
</div>
<div id="menu1" class="menuStyle">
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="news.html" target="unter">Current</a> <a class="menuLink"
onMouseOut="t = 1; delayHide(); return true" onMouseOver="t = 2;
return true" onClick="t = 0; delayHide();"
href="mayjunearchives.html" target="unter">May-June Archives</a> <a
class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="maraprarchives.html" target="unter">March-April Archives</a>
</div> <div id="menu2" class="menuStyle">
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="about.html" target="unter">Bio</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="about.html" target="unter">Gear</a>
</div>
<div id="menu3" class="menuStyle">
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="sightsandsounds.html" target="unter">Pictures</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="sightsandsounds.html" target="unter">MP3's</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="sightsandsounds.html" target="unter">Etc.</a>
</div>
<div id="menu4" class="menuStyle">
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="events.html" target="unter">Upcoming</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="events.html" target="unter">Past</a>
</div>
<div id="menu5" class="menuStyle">
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="http://www.geocities.com/kevin_ikari15/index.htm" target=_new>Street
Team</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="links.html" target="unter">Other Bands</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="links.html" target="unter">Sweet Labels</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="links.html" target="unter">Venues</a>
</div>
<div id="menu6" class="menuStyle">
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="mailto:drumboy011@yahoo.com">Andrew</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="mailto:remmiws42@hotmail.com">Eric</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="mailto:leonheart08@hotmail.com">Evan</a>
</div>
<div id="menu7" class="menuStyle">
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="http://geocities.yahoo.com/gb/sign?member=nopointsscored"
target=_new>Sign</a>
<a class="menuLink" onMouseOut="t = 1; delayHide(); return true"
onMouseOver="t = 2; return true" onClick="t = 0; delayHide();"
href="http://geocities.yahoo.com/gb/view?member=nopointsscored"
target=_new>View</a>
</div>
<style>
body { margin: 0px; }
#menuHead {
background-color: #000000;
top: 5px;
left: 0px;
z-index: 50;
margin-top: 5px;
margin-bottom: 5px;
font-family: Verdana;
font-size: 8pxpt;
font-weight: normal;
color: #FFFFFF;
width: 100%;
height: 22px;
border-top-style: solid;
border-bottom-style: solid;
border-width: 1px;
border-color: #000000;
padding-left: 5px;
}
#menu1,#menu2,#menu3,#menu4,#menu5,#menu6,#menu7
{
position: absolute;
z-index: 100;
visibility: hidden;
width: 150px;
}
.menuStyle {
font-family: Verdana;
font-size: 8pxpt;
font-weight: bold;
border: 1px solid #000000;
color: #FFFFFF;
background-color: #000000;
width:160px;
text-align: left;
}
.menuStyle a {
font-family: Verdana;
font-size: 8pxpt;
font-weight: normal;
color: #FFFFFF;
background-color: #000000;
display: block;
margin: 0;
padding: 3px;
padding-left: 8px;
}
.menuStyle a:link { color: #FFFFFF; background-color: transparent;
width: 150px; }
.menuStyle a:visited { color: #FFFFFF; background-color: transparent;
width: 150px; }
.menuStyle a:hover { color: #990033; background-color: #FFFFFF; width:
150px;}
#menuHead a:link { color: #FFFFFF; background-color: transparent; }
#menuHead a:visited { color: #FFFFFF; background-color: transparent; }
#menuHead a:hover { color: #990033; background-color: transparent; }
.spacer
{
color: #000000;
background: transparent;
padding-left: 2px;
padding-right: 2px;
}
</style>

A. If I understand you correctly you want to have the dropdown display across frames. That cannot happen because the code for the dropdown is actually in a separate window so to speak and will reside in that window within the main window which holds the separate frames. You will have to make the frame that holds the menu larger to display the whole menu or go without frames and use a server side language such as Perl or PHP to include the code in each document.
 

 

 

 

Top

News Goodies


IBM Donates Voice Code to Apache
[September 13, 2004] UPDATED: Partners such as Avaya are looking to build speech apps that can run on anyone's platform.

Click here to read the article

 

 

 

IBM Debuts Power5 Server Line for Linux
[September 13, 2004] The Linux-only server line is geared to hit the entry-level sweet spot for customers seeking an alternative to Unix..

Click here to read the article



 

CA Overhauls Key Storage Management Line
[September 13, 2004] The newer versions are positioned to better compete with rivals EMC, Veritas.

Click here to read the article

 

 

 

Digital Evolution Buys Flamenco Networks
[September 13, 2004] Another company finds itself consumed by the hotly contested market for Web services management software.

Click here to read the article

 

 

 

Nortel Embraces Virtual Enterprise
[September 13, 2004] A slew of upgrades using SIP-based help workers collaborate no matter where they are.

Click here to read the article
 

 

 

RFID Makes Its Mark
[September 13, 2004] A standard marking system will identify smart tags at a glance.

Click here to read the article

 

 

 

Thriving in Redmond's Shadow
[September 10, 2004] UPDATED: ISVs hope to prosper in the spaces between Microsoft's big feet.

Click here to read the article

 

 


Court Bounces Pa. Online Child Porn Law
[September 10, 2004] Pennsylvania measure ruled a violation of constitutionally protected free speech.

Click here to read the article

 

 

 

Population Explosion!
[September 10, 2004] ClickZ Stats has updated its list of the global online populations, with some new figures for the number of Internet Users, Active Internet Users, and other data.

Click here to read the article


 

 

A Virtual Work-Around The RNC
[August 27, 2004] With a swath of downtown NYC closed to traffic and gridlock on the horizon, workers plan on taking their business to the Internet.

Click here to read the article

 

 

 

 


Top

Goodies Peer Reviews


 

Every week a site is selected for review. Each week, reviews of the previous week's selected site are chosen for publication on the HTML Goodies website.

 

The current week's selected site is published in Goodies To Go and in the Peer Reviews section of the website.  Current contact email addresses for submitting your site and for submitting reviews are published in Goodies To Go.

If you would like to have your site reviewed, sign up for the Goodies To Go newsletter in the Navigation Bar on the left side of this page. 

For full details about this program, see http://www.htmlgoodies.com/peerreviews
 

 

 


Top

Feedback Goodies



Did you ever wish your newsletter was an easy two way communications medium? Ploof! It now is!
If you would like to comment on the newsletter or expand/improve on something you have seen in here, you can now send your input to:

mailto:nlfeedback@htmlgoodies.com


We already receive a lot of email every day. This address will help us sort out those relating specifically to this newsletter from all the rest. When you send email to this address it may wind up being included in this section of the newsletter, to be shared with your fellow readers. Please don't send your questions to this address. They should be sent to our mentors: see http://www.htmlgoodies.com/mentors/


For those who are missing Peer reviews: we are once again revising the Peer review program in the hopes of creating a workable solution. The current plan is to move the new Peer Review pages into place in the new year. All those who have been selected for reviews in the past will be featured in the new pages. The new method will make it much easier for your peers to provide feedback and much easier for us to handle the publication side of things. "Watch this space!" It's coming soon!!



Those who missed last week's newsletter will be able to find it in the archive at http://www.htmlgoodies.com/letters  -- sorry for the hurricane induced confusions! Frances was relatively gentle on my house, but caused trouble with floods and flood induced power outages. Many thanks to all of you who sent me your best wishes as the storm approached - your thoughts are kind and most appreciated.



Thanks again for all your feedback!
 

Top


 


Windows Tech Goodie of the Week:


Custom Object Data Binding with .NET

http://www.15seconds.com/issue/040908.htm

Developers often use brute force coding to marshal data between the GUI and application objects. In this article, Luther Stanton explains how to use .NET's out-of-the-box data-binding functionality to make this job much easier.


*** AND ***


Validating Email Addresses with ASP


http://www.asp101.com/articles/hojjat/mxlookup/default.asp

Too often email validation stops at simply checking that the text submitted contains the "@" and "." characters, but for many applications this really isn't good enough. This article starts by breifly explaining the situation and then walks you through building a page that takes an email address and checks its validity by performing a MX lookup on the address's domain.

 

Top
 
 

 

 
And Remember This . . .


On this day in...
 

1971 Massacre at Attica

On September 9, 1971, rioting prisoners took control of Attica State Prison near Buffalo, New York. While State Police were able to retake control of most of the facility, almost 1,300 inmates held the "D Yard" exercise field, where they held 39 guards hostage. After four days of fruitless negotiations, New York State Governor ordered the State Police to retake control of the yard by force. At about 9:45 in the morning of September 13, 1971, police helicopters fired tear gas into the yard while police and corrections officers stormed the yard with guns blazing. They fired over 3,000 rounds blindly into the smoke filed yard. When the guns fell silent, 29 inmates and 10 of the hostages were dead, 89 more were injured. Most were shot during the initial raid, but some were shot after they surrendered. Authorities first tried to blame the inmates for the hostages' deaths, but autopsies later showed that they all died from the bullets fired by police. In the week following the riot, inmates faced brutal reprisals from guards, including beating with nightsticks and being forced to crawl naked over broken glass. Injured inmates were denied adequate medical attention. In January 2000, New York State settled with inmates who brought a class action lawsuit. The settlement amount was $8million.


Today was also the day that in: 122 construction began on Hadrian's wall; 1788 New York City became the capitol of the USA; 1849 Tom McCoy was the first US prizefighter killed in a fight; 1882 Britain invaded Egypt; 1949 the Ladies Pro Golf Association was formed in New York City; 1965 the Beatles released "Yesterday"; 1970 IBM announced the System 370 computer; 1983 the US mint struck the "Olympic Eagle" -- the first US gold coin in more then 50 years; 1990 Iraqi troops stormed the French Ambassador's residence in Kuwait; 1991 a 55 ton concrete beam in Montreal's Olympic Stadium fell;

Born today were: in 1857 chocolatier and philanthropist Milton S. Hershey; 1860 US WWI commander Gen John J (Blackjack) Pershing; 1904 actress Gladys George; 1912 actress Rita Shaw; 1913 actor Roy Engle; 1920 actress Carole Mathews; 1924 actor Scott Brady; 1931 actress Barbara Bain; 1939 US presidential press secretary Larry Speakes (born with the name for the job!); 1944 English actress (Winifred) Jacqueline Bisset; 1948 actress Nell Carter; 1965 son of Richard Starsky (Beatle Ringo Star) Zak Starsky; 1971 daughter of Paul & Linda McCartney Stella Nina McCartney;


 

 


Thanks for reading Goodies to Go!

 

Archive Home Page.



Make a Comment

Loading Comments...

  • Web Development Newsletter Signup

    Invalid email
    You have successfuly registered to our newsletter.
  •