function isEmail(str)
{
    // http://www.w3.org/Protocols/rfc822/
    return /^[^\x00-\x20()<>@,;:\\".[\]\x7f-\xff]+(?:\.[^\x00-\x20()<>@,;:\\".[\]\x7f-\xff]+)*\@[^\x00-\x20()<>@,;:\\".[\]\x7f-\xff]+(?:\.[^\x00-\x20()<>@,;:\\".[\]\x7f-\xff]+)+$/.test(str);
}

function prepareForm()
{
    var form = document.getElementsByTagName('form')[0];
    var inputs = form.getElementsByTagName('input');
    var textarea = form.getElementsByTagName('textarea')[0];
    
    form.onsubmit = function()
    {
        var em = form.getElementsByTagName('em');
        var work = true;
        
        for (var i=em.length-1; i>=0; i--)
        {
            em[i].parentNode.removeChild(em[i]);
        }
        
        work = test(inputs[0], work) && work; // name
        if (test(inputs[1], work)) // email
        {
            if (!isEmail(strip(inputs[1].value)))
            {
                em = document.createElement('em');
                em.innerText = 'invalid email';
                inputs[1].parentNode.appendChild(em);
                if (work)
                {
                    inputs[1].focus();
                    inputs[1].select();
                    work = false;
                }
            }
        }
        else { work = false; }
        work = test(inputs[2], work) && work; // subject
        work = test(textarea, work) && work; // address
        
        return work;
    }
    
    function test(ele, focus)
    {
        var em = null;
        if (!strip(ele.value))
        {
            em = document.createElement('em');
            em.innerHTML = 'required';
            ele.parentNode.appendChild(em);
            ele.value = '';
            if (focus)
            {
                ele.focus();
            }
            return false;
        }
        return true;
    }
    
    function strip(str)
    {
        return str.replace(/^\s+|\s+$/g,'');
    }
    
    textarea.addEventListener('input', textareaChange, false);
    textarea.addEventListener('keyup', textareaChange, false);
    textarea.addEventListener('change', textareaChange, false);
    
    function textareaChange()
    {
        var str = this.value.substr(0, 8192);
        if (this.value != str)
        {
            this.value = str;
        }
    }
    
    autoFocus();
    function autoFocus()
    {
        var ele = [inputs[0],inputs[1],inputs[2],textarea];
        for (var i=0; i<ele.length; i++)
        {
            if (!strip(ele[i].value))
            {
                ele[i].value = '';
                ele[i].focus();
                return;
            }
        }
    }
}
