with Imagination: by Dustin Diaz

./with Imagination

A JavaScript, CSS, XHTML web log focusing on usability and accessibility by Dustin Diaz

Ajax Contact Form 1.0! Yay

Friday, June 9th, 2006

Shake shake shake! Shake shake shake! Shake that bootay. Shake yo bootay… Oh, er.. um. Hi. Eh hem. Sorry, I just got caught up in the moment for a second. I was in the middle of doing the classic Apple Shake Dance; you know the one that happens when you filled out an incorrect password. Yea, that one.

Anyway, for any of you out there that sat around for what seems to have been ages for me to update my cheesy Ajax Contact Form, I’ve now rebuilt it on top of the YUI Connection Manager (translation for the teenagers (AJAX!)). Oh yea. Check out the demo in action.

However beyond just the simple experience of a normal contact form, I’ve added some animation that mimics some apple shake down magic (like I was talking about) and of course some simple swooshy up-down yoyo type stuff. And although I haven’t packaged it up for you yet, lemme just tell you about it.

Now with as many fields as you want

Of course a huge shortcoming of the last Ajax Contact Form, there was the limitation of the fields that I provided. Well now with this version, you can add as many form fields as you want, and they will indeed all be sent to your inbox by way of array_keys sent via $_POST.

Better “Degradability” support

What that means is that this one has a bit better support for those who don’t have JavaScript enabled. It will simply submit the form like normal and return your success or failure message appropriately.

One thing to particularly note this time (since I got a bagillion emails last time about this) is that you only have to configure your mail settings in one spot. Yepper. Just one spot (as it should be (I don’t know what I was thinking before)).

Beyond that, you could even have multiple forms on the same page. Although untested (on my behalf), I believe that you could still do it with the architecture I’ve built.

Better looking code and extendible

Yea, I must admit; the code looks eons better, and it’s namespaced for your convenience. You really should have no problems with any of it conflicting with your current JavaScripty / PHP goodiness sitting in your web pages.

One thing I’d like to particular draw attention to is my effects object which you may freely add to at your discretion.

DED.effects Object

DED.effects = function() {
	var $D = YAHOO.util.Dom;
	var $M = YAHOO.util.Motion;
	return {
		/*
			@param {String/HTMLElement} | oEl : Accepts a string to use as an ID for getting a DOM reference, or an actual DOM reference
			@param {Int} | iOffset : The unit (in 'px') that the element will be shaken 'by'
			@param {Int} | iNum : The number of times the motion will iterate
			@param {Int} | iSpeed : The speed at which the motion will animate
		*/
		shake : function(oEl, iOffset, iNum, iSpeed) {
			var xy = $D.getXY(oEl);
			var left = xy[0]-iOffset;
			var right = xy[0]+iOffset;
			(function(type, args, count) {
				if ( count >= iNum ) {
					var a = {
						points : {
							to : xy
						}
					};
					var anim = new $M(oEl, a, iSpeed);
					anim.animate();
					return;
				}
				else if ( count % 2 ) {
					var c = count+1;
					var a = {
						points : {
							to : [right, xy[1]]
						}
					};
					var anim = new $M(oEl, a, iSpeed);
					anim.onComplete.subscribe(arguments.callee, c);
					anim.animate();
				}
				else {
					var c = count+1;
					var a = {
						points : {
							to : [left, xy[1]]
						}
					};
					var anim = new $M(oEl, a, iSpeed);
					anim.onComplete.subscribe(arguments.callee, c);
					anim.animate();
				}
			})(null, null, 1);
		}
	};
}();

This effect can pretty much work on any element you want. I just happened to choose to apply it to my form elements upon ‘blur’ and ’submit’ on certain conditions (such as being a required field).

Other than that, look forward to seeing a packaged zip file with some instructions, copyrights, and bottle caps by sometime tomorrow. In the meantime… Yay! V 1.0 :)

82 Responses to “Ajax Contact Form 1.0! Yay”

  1. Antonio

    Nice, but the first thing I noticed is that if I repeatedly try to submit without writing anything, the “Name” field moves a little to the right every time (IE6/WinXP).

    Actually, that was the second thing. The first is that in my Opera 8.54 (WinXP) it breaks horribly :(

  2. Enrique

    Personalmente agradezco esta nueva versión, por que es la que uso, pero creo que debe “pulirse” un poco, ¿no?…

  3. Sebastian

    Now that is cheesy! And it dont even try to work in Opera(284-dapper). It shakes, and finds it selv a nice home in the upper left corner.
    Make it send an request to the server to send the mail and then give feedback without refresh would actually be usefull, but I guess you forgot. ;)

  4. Dustin Diaz

    Go figure. My first comments would be a downers ;)

    Anyways, Opera?! Posh. Besides, aren’t they already on Opera 9 or something like that? I tested in IE6, Safari2 and Firefox 1.5 and they all worked like a charm.

    The repeated submitting sounds like a QA behavior if I ever heard one. Regardless, that isn’t a lack of the functions themselves (eg. shake), but rather the way I mis-implemented them. I guess technically I should check the isAnimated instance property before making it continually shake. No big deal. It’s nothing that another two lines of code couldn’t fix.

    Again, just my luck that the first couple would be opera users and I haven’t even taken a peak in the browser.

    Thanks for your feedback guys :)

  5. Rick

    Like it, but Opera 9b2 on WinXP doesn’t play nice either.

    Click in the name field, and tab to the next field (or click in it) and it settles in the upper left corner. Go back to it, and the field you were in *also* settles in the upper left corner, on top of the name field.

    Apart from that, nice work!

  6. Antonio

    > aren’t they already on Opera 9 or something like that?
    It’s still a beta, but it wasn’t me who classified Opera 8.54 on XP as an A-grade browser :D

    But hey, I even went to *IE6* to check it. Do you have any idea how exceptional is for me to use IE6? :D :D

    > just my luck that the first couple would be opera
    We’re few, but we’re everywhere! :)

    Now seriously, I’m not a big fan of animation (at least in the “movement” sense), but I found the onblur shaking weird. I’d leave it just for the onsubmit.

  7. Seb

    As a non-apple user the “dance” means nothing to me. And if I was blind it’d mean even less - maybe there’s some hidden text saying “error, fill out all fields” or something that a screen reader is supposed to pick up on that I’m not seeing, but it appears very inaccessible as it stands.

    I also had the problem in IE6 of the name field moving over each time.

    Seems very half-finished compared to other stuff I’ve seen you do :( And a hell of a lot of code for what is just form submission - is a page refresh really THAT bad a thing?

  8. Scott Johnson

    You probably know this already, but this works beautifully in the latest Firefox. I just thought that I should probably write in to offset the negative comments. :)

  9. Dustin Diaz

    Well, let’s just say it’s a darn good thing I haven’t packaged this thing up yet. I might bundle it with a few different core effects to choose from but ultimately you should be able to leave them all out. Ideally it would be good to keep the processing meter just to show that something actually did happen. The important thing is that I’ve implemented the ‘required’ fields error checking - so you can virtually do anything you want on top of those events getting fired (I’m smelling CustomEvent :D).

    I just looked in Opera (Just downloaded it - Yay), and it does indeed mess up the shakes. That seriously looks like a bug in the getXY. I don’t know how something like that can mess up pretty bad. I’ll have to go back and read some of the docs and see if there’s any pre-reqs to get Opera to cooperate nicely. Other than that, the form actually submits pretty nicely as expected when filling it out the first time without any errors.

    @Scott: Aww shucks. Thanks man :)

  10. Mike Rumble

    Nice and cheesy is indeed the flavour of the day!

    On a Mac the shake effect happens to the entire form when you submit it with an incorrect password, not the individual fields, maybe that would work well here too.

    The Yahoo Javascript Library seems to lead to some concise and clear coding on your part, I’d be interested to see how, widgets, bells and whistles aside, this compares to Prototype.js for using as a base in creating custom code.

  11. Dustin Diaz

    FYI: I fixed that Opera issue. It was in dire need of wanting to be relatively positioned. Poo. Acid2 my butt.

  12. JAbbott

    OK, this feedback my be a little obscure but I thought I’d throw it out there. I’m on Firefox with the Autofill extension and the extension flips field backgrounds to pale yellow if it can autofill them. This doesn’t jive with your white text in the form fields at all. However in your comments form, you appear to have disabled the pale yellow change but the autofill function still works.

  13. Elliot Swan

    The shake didn’t mean anything to me either, so it was just sort of shocking, but having a custom effect when they aren’t filled out could be kinda sweet.

    I did like how the form collapsed after it was submitted.

    I take it this was all done with YUI?

  14. Dustin Diaz

    @Mike: Hmm. Good point. If anything, I was just being clever by applying the shake to the fields. I could have sworn it was on the fields when you start up OSX and put in a bad password. Anyhowza, just as easy to apply to the form element :)

    As mentioned in a few other posts and some podcasts, YUI is not here to make things canned for you, but rather a set of tools to get things done the way you want. A huge goal of YUI is mainly to make things work across multiple browsers.

    So with something like Script.aculo.us - you’re not limitted to Effects like SlideUp, SlideDown, Fade, BlindUp etc., but rather with the Animation util you can make Blindy_Slide_YoYo_Shake. The options are endless and depend on your imagination :)

    @JAbbott: That’s the classic case of google doing something they shouldn’t :p. The only reason it looks bad is because I chose a black background with white text, and google will always hijack your background to yellow by default. Lame, I know. Basically, in order to combat that, I’d have to do add an extra listener to wait for the onpropertychange event to fire, then restore my own colors. All in all, not much extra work is needed to do that.

    @Elliot: Perhaps the most logical effect would be the simplest… such as outlining the fields with a red border. But I’ll leave that up to the implementer when I get this packaged up.

  15. Namolovan Nicolae

    Thanks Dustin for show us the power of Yahoo User Interface Library ! It’s really very powerfully, I fell in love with it thanks to you..
    One of tricks I have done to make these libraries more comfortable for me was to compress every library into one line of code(I did that with http://wbic16.xedoloh.com/cruncher.html), so now to add new YUIL it’s as easy as copy/paste one line of code.. Also I replaced YAHOO with Y for less space..
    var $D = YAHOO.util.Dom; nice idea ! :)

    Already saw this shake effect somewhere on the web, not sure where.. Very nice to doing it with Y library !

    And.. Opera sux ! Very often FF&IE are happy with some code, but not Opera.. Always something new to show, eh.

  16. Dustin Diaz

    @Namolovan: The place I originally saw the shake effect was from Script.aculo.us (ala JavaScript style) - which I’m sure may have been inspired also from Apple’s OS.

    The short name variables such as $D and $E are used only in private scopes so that I’m not mucking with anyone elses global variables.

    The issue with Opera is very awkward. Every time I think they’ve got things right, a weird bug like what happened, happens. But for the most part, Safari and Opera seem to behave pretty similar as far as CSS goes. Safari of all browsers has the most quirkiest DOM. At the least (and I hate to say this), IE gives you alternative (proprietary) methods to achieve the result you want… which is, I guess, still nice.

  17. James Mitchell

    I quite like it Dustin. I have been an DustinDiaz Ajax Contact Form supporter since your first version. I can’t wait until this is truly bundled and ready to go. I am becomming more and more impressed with the YUI.

    sidenote: One thing to note is that after the ’success’ message the form was not cleared. Maybe you did that on purpose?

  18. Al B

    package this b up already!

    ;)

  19. Al B

    btw… i know this is sorta off the subject…

    but i noticed that the old 0.9 version’s checkbox “cc to self” is being passed a checked value, no matter if it’s checked or unchecked–it behaves like it’s checked, no matter what.

    Any idea on why this is so?

    In other words, it always sends a CC to self, with or without the checkbox checked.

  20. Al B

    I think i figured out the “cc to self” issue…

    Basically, the javascript (contact.js) is being passed the “id” value (getElementById) from the form fields… and is automatically selecting the initial value set for that field (check or unchecked, it doesn’t matter)

    a solution that works is using “select” instead of “checkbox” … and specify a NULL value for the first choice–because the first choice is selected by default by the javascript if no choice is given…

    e.g.

    instead of:

    i did:

    No
    Yes

    kind regards,
    -al b

  21. Al B

    ooops… code got stripped…

    lets’ try this again…

    instead of:
    <input type="checkbox" name="selfCC" id="selfCC" value="send" />
    i did:
    <select name="selfCC" id="selfCC">
    <option value="">No</option>
    <option value="send">Yes</option>
    </select>

  22. Rizky

    nice, thanks for the update Dustin. but I still prefer the old script tho. YUI is not really my thing.

  23. Francisco

    Al b

    How can we remove the “Send CC to self” field from the first script? Ive tryed removing it but the form stops working.

  24. Francisco

    Where can we download 1.0 Version? Im having trouble trying to remove “selfCC” field from the 0.9 version. If i do, the form doesnt work.

  25. scotty

    yeah, i’m hell-bent to download the 1.0 version as well.

    happy firbday™!

  26. joey

    A drag, I JUST installed the 0.9 on my site cough::http://www.askajapaneseperson.com::cough…

  27. Brendon Kozlowski

    Anyone looking to understand the YUI library a bit more after checking out Dustin’s link may also be curious (even after reading through Yahoo’s DevCenter examples) of just how PHP needs to interact with the received XMLHttpRequest data, but at the same time work if JavaScript is turned off. I spent a good 2 hours trying to find example code. The closest I could find came from, (drum roll), Rasmus Lerdorf’s personal blog site.

    http://toys.lerdorf.com/

    Until Dustin gets around to releasing this in a packaged download, hopefully this’ll help. If anyone else KNOWS or has an example, let me know. :)

  28. peterblond

    Congratulations!

  29. phillip

    Hilarious! Not being an Apple user I laughed when I first saw it :) Great work and thanks for so freely showing us your code….

  30. Paul

    What has to be changed so that the form is cleared after submission? Could get my ass up, but I’m a bit lazy these last days…

    Amazing work though Dustin. Same for your podcasts.

  31. Al B.

    francisco…

    change the checkbox code (in index.php) to this:

    <input value="false" name="selfCC" id="selfCC" type="hidden" />

  32. DrDrrae

    In Firefox 1.5.0.4, the name input likes to scoot itself accross the screen after it shakes.

    Screenshot:

    http://img326.imageshack.us/img326/8153/ajaxcontactformyui7iq.png

  33. DrDrrae

    Edit to my last post:

    It happens to whichever input has focus. It’m guessing it has a problem with padding or magins or something.

  34. Brett Terpstra

    I was inspired by your original ‘cheesy’ (your words ;-)) contact form and took it on as my own project. I spent a while on it and combined a lot of client-side validation with some PHP security measures and made a fully accessible DOM scripted AJAX contact form with the ability to handle additional fields. The code needs a lot of cleaning up, as does the ‘degradability’ (it’s tedious and unrewarding work, as you know). But it’s open to the public as a demo at http://blog.circlesixdesign.com/contactform

    Brett

  35. Francisco

    When will we finally going to see Version 1.0 Packaged to download… ????

  36. jh

    yes, let us see the packaged download today or tomorrow perhaps.

    google toolbar makes some fields background yellow and I cannot see my white text.

    This has gone bad.

  37. Ashish Patil

    I have not seen the code, but it seems that the shake effect, if started again on the same field before last effect is completed, the position of fields changes.
    To reprodure, on your page,
    http://www.dustindiaz.com/basement/shake-shake-shake.php
    Just keep the tab pressed.
    I tested it in IE, Maxthon and Opera.

  38. Kate

    Umm, where can I download that form? O.o

  39. Renato Targa

    Actually, the “animation” link in the third paragraph is broken. The “yui” directory is missing.

  40. Atul pal

    HOw can I use horde framework to make a website

  41. Lee

    Hi,

    Great work Dustin, just wondering what I a need to do to modify the older version of the ajax form to incorporate the field validation that you have in version 1.

    Thanks

  42. sai

    I am happy with the positive comments for version 1.0 but i can’t seem to find the place to download it from.

  43. Julia

    It would be nice to have this YUI contact form without all this shaking stuff .. (which is nice, bit not really necessary). What part do I have to strip? Is it possible to place this form inside a YUI dialog/panel (aka popup)? Right now, my popup closes on submit, so there’s no chance to see the progress bar or the feedback message .. I’m thankful for any hints on this.

  44. julien

    very nice work on the form and sweetTitle.
    I also wonder where i can download.

    but my main question is:

    is it possible to add a captcha algorithm a security code to this form or some kind of security to avoid those nasty people who are using our forms to serve their own purpose?

  45. skome

    1) Thank you
    2) Broken appearance? http://www.dustindiaz.com/ajax-contact-updated/

    I see a narrow, centered column.

    3)Thanks again.

  46. brian

    Cool stuff.

    I don’t mind the plain vanilla version for my purposes… I’m not able to comment on that page.

    Is this supposed to send an email? http://www.dustindiaz.com/testJax/ It doesn’t work for me. Tried several times.

    I’ve also integrated with my site and tried it several times. Looks like it works but no email. Just like a couple other folks.

  47. brian

    by the way, I get the following error in the debugger: “pos.responseXML has no properties” xmlHttp.js (line 23). I’m using FireFox 2.0 and IE 6.0 for testing.

  48. Aarron Walter » Blog Archive

    […] If you are interested in other useful Ajax tools, you may want to check out Dustin Diaz’s Ajax contact form. It’s pretty clever, and packed with nice effects, but seems to struggle to work in Opera. A word of caution, it’s pretty easy to get swept up by the allure and ease of implementation of many Ajax/DOM scripting tricks. Always ask yourself how it benefits or hurts the user experience. If you find yourself adding features because they are cool, yet they negatively impact findability, accessibility, or cross-browser use then you probably should reconsider. James Edwards has written a sobering article about Ajax and screen readers (lump search engine spiders in that group too as they are equally as blind) that may bring you back down to earth about the Ajax trend. I should also mention that my article is actually backwards compatible for those without JavaScript enabled, giving us the best of both worlds. The article also uses Ajax specifically to enhance the user-experience by making the impulse action of signing up for a mailing list faster and more convenient. Listen to this podcast […]

  49. Aarron Walter » Blog Archive

    […] If you are interested in other useful Ajax tools, you may want to check out Dustin Diaz’s Ajax contact form. It’s pretty clever, and packed with nice effects, but seems to struggle to work in Opera. It’s a pretty sophisticated example of a contact form. A word of caution, it’s pretty easy to get swept up by the allure and ease of implementation of many Ajax/DOM scripting tricks. Always ask yourself how it benefits or hurts the user experience. If you find yourself adding features because they are cool, yet they negatively impact findability, accessibility, or cross-browser use then you probably should reconsider. James Edwards has written a sobering article about Ajax and screen readers (lump search engine spiders in that group too as they are equally as blind) that may bring you back down to earth about the Ajax trend. I should also mention that my article is actually backwards compatible for those without JavaScript enabled, giving us the best of both worlds. The article also uses Ajax specifically to enhance the user-experience by making the impulse action of signing up for a mailing list faster and more convenient. Listen to this podcast […]

  50. gK

    Hey Dustin,
    this page might not be proper path to adress this question but, since you have some experience with AJAX, i hope you can give me some hints;
    This form sends email using php mail() to a certain email adress, nevertheless; is there a way to parse the fields to a msg.php page somewhere else on the server, and see what ever is written on the form as message #1, msg #2 so on so forth?
    Thanks.

  51. Francisco

    Dear Justin:

    Its been over 8 month now waiting for a packaged download to be posted. I know your busy.. We are all just wondering whats happening?

  52. ben

    cool stuff

  53. Anthony Coy

    I have been anxiously awaiting a download… can you please provide one?

  54. justinf

    i agree with brian above - this doesnt work locally.

    http://www.dustindiaz.com/testJax/

    in fact i commented out most of the stuff in contact.php and i still get a email success message -even though contact.php doesnt have anything in it!

  55. donny

    I have addded th .9 release to three pages to a work in progress site (weheartweb.com/contactus.html) - thing is, the emails all come through but only with the message and regarding fields. The name and email fields aren’t emailed through.

    AJAX novice so go easy!

  56. keith

    I have put the form up as a test at grooveonline.co.uk/ajaxContact/

    The browser crashes (or at least stalls!) when i click send? any ideas?

  57. drew

    the reason for the cc to self problem is that the javascript checks for the VALUE of the checkbox, simply change VALUE in the javascript to CHECKED. dustin did a great job with this ajax sender… although i could do without the snarky commentary in the code.

    make this fix:

    var strCC = document.getElementById(’selfCC’).checked;

    in sendposemail function.

  58. Balan reddy

    I am endlessly waiting to download version 1.0. God knows when my wait will be over?

  59. Sukhdeep

    Hi,

    This looks awesome. Almost an year since post and still not released. Any chances of ETA ?

    Regards
    Sukhdeep

  60. Scream

    I’m using your contact form in version 0.9
    Great work!
    But I have one problem: I receive an posted email 3 days later …
    What can be the problem?

  61. Nick

    @Scream
    Probably a mail server was unavailable somewhere en-route between your web server and your inbox. It will not be anything to do with the contact form.

  62. chike

    when can we download v1.0? ohh and first version also doesnt send any mail, it just says it was succesful but nothing sends? :( how ot fix this?

  63. Marc

    This looks great. Where can I get version 1.0 or higher.

    -Marc

  64. Bobby

    this is awesome man, but where is the zip? love ur work. great post on handling negative feedback u did too! ;)

  65. Jens

    Can we have a
    D
    O
    W
    N
    L
    O
    A
    D
    ?

    Many thanks. Appreciate your Work!

  66. Per

    This is a pretty nice contact form, just a shame that this version is not uploaded, any chance that we will get a download link soon?

    Regards
    Per

  67. erik

    on your previous contact form how would one go about adding additional fields?

  68. Nathan

    So it’s been over a year and still no zip/any kind of download at all :( I don’t think it’s coming

  69. Yaron

    WHAT ABOUT “pos.responseXML has no properties” xmlHttp.js (line 23) ERROR that appears on screen! i can’t have errors on my website!

    i have no clue what this means and why it doesnt work:

    
    function grabPosXML (tagName) {
    return pos.responseXML.documentElement.getElementsByTagName(tagName)[0].childNodes[0].nodeValue;
    }
    

    PLEASE JAVASCRIPT SPECZS HELP ME!
    what is this function used for? why grabPosXML? WTF is this?!!?

  70. Ram

    Respected
    Dustin Diaz

    you are great programmer but without validation you are “jack of all triats…..”
    just a little thing!

    hope you won’t mind.

    Ram

  71. Dennis

    Hi,

    I have the same problem like Yaron. Allways got the Error:

    pos.responseXML.documentElement.getElementsByTagName(tagName)[0] has no properties
    (xmlHttp.js.php)

    It appears after calling grabPosXML(’confirmation’) by the function hideContactTimer()

    Any ideas?

    Greets

  72. Brian

    Hello Dustin, I have been looking all over the internet for a form with validation built in. Have your 0.9 ver.. Looking forward to your new ver.1.0 when it arrives. Do the people posting to this blog get notified when the 1.0 ver. arrives. Keep doing your excellent work !! thanks B.

  73. tinymeme

    It’s been well over a year since this announcement… been busy Dustin? I think more than a few of us might actually download this grand new version 1.0 script if we were allowed to. :)

  74. Friend

    It’s been well over a year since this announcement
    ))))))

  75. tententy-four

    I too have the same problem. Firebug throws up an error in line 28 of ‘xmlHttp.js’

    function grabPosXML (tagName) {
    return pos.responseXML.documentElement.getElementsByTagName(tagName)[0].childNodes[0].nodeValue;
    }

    I’m not sure what this is.

  76. waiting

    for a download.

    PLEEEEEAAAASE!!

  77. Tyler

    I would love to try the new version if possible.

  78. Dilnei

    can i download the 1.0 version pleaseee??

  79. Dilnei

    please i need the 1.0 version…
    can i have a download please?
    i apreciate your works, its awesome!

  80. Shaun

    So I checked your demo site and found that you are getting an error.

    pos.responseXML.documentElement.getElementsByTagName(tagName)[0]

    Any fix for this?

  81. Shaun

    sorry about that, that was your old contact form, tried the demo on this one, no error. Still a fix for the old one would be nice as I like how that functions

  82. Neoszion

    Is this available for download could I have a link for 1.0 please?

Leave a Reply

Phone Number:

If you're about to post code in your comment, please wrap your code with the tag-combo <pre><code>. Also please escape your html entities - otherwise they will be stripped out. I recommend using postable.

Get "JavaScript Design Patterns"

"As a web developer, you'll already know that JavaScript™ is a powerful language, allowing you to add an impressive array of dynamic functionality to otherwise static web sites. But there is more power waiting to be unlocked--JavaScript is capable of full object-oriented capabilities, and by applying OOP principles, best practices, and design patterns to your code, you can make it more powerful, more efficient, and easier to work with alone or as part of a team."

Buy JS Design Patterns from Amazon.com Buy JS Design Patterns from Apress

Flickr

Submit a Prototype

All content copyright © 2003 - 2007 under the Creative Commons License. Wanna know something? Just ask.

About | Archives | Blog Search

[x] close

Loading...

Submit a prototype

By checking this prototype I agree that I am not submitting false credentials, pornography, or a hate crime website. I also understand that by submitting my entry I may or may not be accepted, and if accepted, my entry may be taken down at any given time if I violate these terms.