/*  forms.js 
    Clark Moody
    March 2010
*/

function Ajax() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    } else {
        try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
            catch (e1) {}
        try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
            catch (e2) {}
        try { return new ActiveXObject("Msxml2.XMLHTTP"); }
            catch (e3) {}
    }
    return null;
}

function debug(text) {
    var D = $('debug');
    if(D != null)
        D.appendChild(newNode('p', text));
}

function testKey(regExp,evt) {
    var reg = new RegExp(regExp);
    var key = function(evt) {
        if (window.event)
            return (evt.keyCode);
        else if (evt.which)
            return (evt.which);
    }
    key = String.fromCharCode(key(evt));
    return (reg.test(key));
}

function sendEmail(e) {
    e.returnValue = false;
    var emailForm = document.forms['eForm'];
    var xmlE = Ajax();
    xmlE.onreadystatechange = function() {
        if (this.readyState == 4) {
            var eRT = this.responseText;
            if (eRT != null) {
                if (eRT.indexOf("'success':true") > -1) {
                    var F = document.createDocumentFragment();
                    var N = newNode('h3', 'Thank You');
                    F.appendChild(N);
                    N = document.createElement('p');
                    N.setAttribute('style', 'padding-top: 1.0em;');
                    N.appendChild(Link('./', 'Return Home'));
                    F.appendChild(N);
                    collapse(emailForm);
                    window.setTimeout(function() {
                        replaceInner($('eFormDiv'), F);
                    }, 500);
                } else if (eRT.indexOf("'success':false") > -1) {
                    var EFS = $('emailFormStatus');
                    clear(EFS);
                    if (eRT.indexOf("sender_name") > -1) {
                        EFS.appendChild(newNode('p', 'Invalid Name.'));
                    }
                    if (eRT.indexOf("sender_email") > -1) {
                        EFS.appendChild(newNode('p', 'Invalid Email.'));
                        emailForm.sender_email.focus();
                    }
                    if (eRT.indexOf("sender_message") > -1) {
                        EFS.appendChild(newNode('p', 'Invalid Message.'));
                    }
                }
            }
        }
    }
    if (emailForm != null) {
        clear($('emailFormStatus'));
        if (formVal('sender_name') == '' || formVal('sender_email') == '' ||
               formVal('sender_message') == '') {
            e.returnValue = false;
            if (formVal('sender_name') == '') {
                addClass(emailForm.sender_name, 'invalid');
                emailForm.sender_name.focus();
            } else if (formVal('sender_email') == '') {
                addClass(emailForm.sender_email, 'invalid');
                emailForm.sender_email.focus();
            } else if (formVal('sender_message') == '') {
                addClass(emailForm.sender_message, 'invalid');
                emailForm.sender_message.focus();
            }
            return false;
        }
        //xmlE.open();
        var data = 'sender_name=' + formVal('sender_name')
                         + '&sender_email=' + formVal('sender_email')
                         + '&sender_message=' + formVal('sender_message')
                         + '&token=' + formVal('token');
        xmlE.open('POST', '../core/contact.php', true);
        xmlE.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
        xmlE.send(data);
        e.preventDefault();
    }
}

window.onload = function() {
    /*for (var i = 0; i < document.forms.length; i++) {
    debug(document.forms[i].name);
    }*/
    var emailForm = document.forms['eForm'];
    if (emailForm != null) {
        // Grab a valid token from the server
        var xmlT = Ajax();
        var xmlE = Ajax();
        emailForm.token.value = 23;
        if (xmlT != null) {
            xmlT.open('GET', '../core/token.php', true);
            xmlT.send(null);
        }
        xmlT.onreadystatechange = function() {
            if (this.readyState == 4) {
                var tk = emailForm.token;
                if (tk != null) {
                    tk.value = this.responseText;
                }
            }
        }
        // Set real-time validation indicators
        var email = emailForm.sender_email;
        if (email != null) {
            email.onkeypress = function(e) {
                if (!testKey("[a-zA-Z0-9\-._+&@\t\x08]", e)) {
                    e.returnValue = false;
                    e.preventDefault();
                }
            }
            email.onkeyup = function(e) {
                var R = new RegExp("^(([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}){0,1}$");
                if (this.value == '') { remClass(this, 'valid'); remClass(this, 'invalid'); }
                else {
                    if (!R.test(this.value)) { remClass(this, 'valid'); addClass(this, 'invalid'); }
                    else { remClass(this, 'invalid'); addClass(this, 'valid'); }
                }
            }
        }
        var sName = emailForm.sender_name;
        if (sName != null) {
            sName.onkeypress = function(e) {
                if (!testKey("[a-zA-Z0-9\-., \t\x08]", e)) {
                    e.returnValue = false;
                    e.preventDefault();
                }
            }
            sName.onkeyup = function(e) {
                remClass(this, 'invalid');
            }
            sName.focus();
            addClass(sName, 'sel');
        }
    }

    var gvForm = document.forms['gvForm'];
    if (gvForm != null) {
        gvForm.onsubmit = function(e) {
            e.preventDefault();
            var xml = Ajax();
            if (xml != null) {
                var data = 'cN1=' + formVal('cN1')
                         + '&cN2=' + formVal('cN1')
                         + '&cN3=' + formVal('cN1')
                         + '&name=' + formVal('name');
                xml.open('POST', '../core/gv.php', true);
                xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
                //xml.setRequestHeader('Content-Length', data.length);
                xml.send(data);
            }
            // Update the status of my field
            xml.onreadystatechange = function() {
                if (this.readyState == 4) {
                    var C = $('gvFormContainer');
                    C.appendChild(newNode('p', this.responseText));
                    if (this.responseText == '1') {
                        clear(C);
                        C.insertBefore(newNode('h5', 'Call in Progress'), C.firstChild);
                    } else {
                        if ($('gvFormError') == undefined) {
                            var H6 = newNode('h6', 'Error. Please try again.');
                            H6.setAttribute('id', 'gvFormError');
                            C.insertBefore(H6, C.firstChild);
                        }
                    }
                }
            }
        }
    }
    var inputs = document.getElementsByTagName('input');
    for (var i = 0; i < inputs.length; i++) {
        //addEvent(inputs[i], 'focus', addSel);
        inputs[i].onfocus = function() { addClass(this, 'sel'); }
        inputs[i].onblur = function() { remClass(this, 'sel'); }
        if (inputs[i].className.indexOf("phone") > -1) {
            // Block non number for phone fields
            inputs[i].onkeypress = function(evt) {
                var reg = new RegExp("^[0-9]*$");
                var key = function(evt) {
                    if (window.event)
                        return (evt.keyCode);
                    else if (evt.which)
                        return (evt.which);
                }
                key = String.fromCharCode(key(evt));
                var V = reg.test(key);
                if (!V) {
                    evt.returnValue = false;
                    evt.preventDefault();
                } else {
                    //alert(this.value.length);
                    if (this.value.length == 2 && this.className.indexOf("ph_four") == -1) {
                        // Advance to next field
                        var num = parseInt(this.name.substring(this.name.length - 1), 10) + 1;
                        var next = this.name.slice(0, this.name.length - 1) + num;
                        var E = document.getElementsByName(next)[0];
                        if (E != undefined) E.focus();
                    }
                }
            }
        }
        inputs[i].onclick = function() { this.focus(); }
    }
}

function collapse(el) {
    var E = $(el);
    if (E != null) {
        E.style.overflow = "hidden";
        var h0 = E.offsetHeight;
        doSplineStyle(E, 'height', h0, 0, 'px', 0.5);
        window.setTimeout(function() {
            E.style.overflow = "auto";
        }, 500);
    }
}

function formVal(fieldName) {
    var F = document.getElementsByName(fieldName);
    if(F != null) {
        return(F[0].value);
    } else return '';
}

function newNode(tag, text) {
    var N = document.createElement(tag);
    N.appendChild(document.createTextNode(text));
    return (N);
}

function Link(url, text) {
    var link = document.createElement('a');
    link.setAttribute('href', url);
    link.appendChild(document.createTextNode(text));
    return (link);
}

function replaceInner(el, newFragment) {
    var E = $(el);
    if (E.nodeType != 1) return (false);
    while (E.hasChildNodes())
        E.removeChild(E.firstChild);
    E.appendChild(newFragment);
}

function clear(el) {
    var E = $(el);
    while (E.hasChildNodes())
        E.removeChild(E.firstChild);
    return (false);
}

function addClass(E, clName) {
    // Add the class label CLNAME to the element E
    var C = $(E).className;
    if (typeof C != undefined) {
        if (C.indexOf(clName) >= 0) return;
        $(E).className = C + " " + clName;
    }
}
function remClass(E, clName) {
    var C = $(E).className;
    if (typeof C != undefined) {
        if (C.indexOf(clName) < 0) return;
        var newC = '';
        C = C.split(' ');
        for (var i = 0; i < C.length; i++) {
            if (C[i] != clName) {
                newC = newC + C[i] + " ";
            }
        }
        $(E).className = newC;
    }
}

var splineID = -1;
function doSplineStyle(el, elStyle, start, end, units, transitionTime) {
    var E = $(el);
    start = parseInt(start, 10);
    var Range = end - start;
    var Step = 0;
    var Delay = 15;      // ms before next call
    var Steps = transitionTime / (Delay / 1000.0);     // Total steps durint transitionTime (s)
    //debug('Spline from ' + start + ' to ' + end + ' in ' + Steps + ' steps.',true);

    if (splineID != -1) window.clearInterval(splineID);

    var ID = window.setInterval(
        function() {
            var S = 0;  // eval('E.style.' + elStyle);
            S = (start + Range * splineValue(Step / Steps.toPrecision(1)));
            //debug(S + ' ',false)
            if (elStyle == 'opacity') {
                setOpacity(el, S);
            } else {
                E.style[elStyle] = S.toString() + units;
            }
            //debug(E.style[elStyle] + ' ', false);
            Step++;
            if (Step >= Steps) {
                window.clearInterval(ID);
                // Set a cookie for the proper width of the article
                //alertSize();
            }
        }
    , Delay);
    splineID = ID;
}

function splineValue(percent) {
    // Generate the value of a spline at a certain percent in the range [0,1]
    var x = percent;
    var f = 0.0;
    if (x >= 0 && x <= 1) {
        f = 6 * Math.pow(x, 5) - 15 * Math.pow(x, 4) + 10 * Math.pow(x, 3);
    }
    if (x >= 1) f = 1;
    return (f);
}

/* Reference: http://www.dustindiaz.com/top-ten-javascript/ */
/* addEvent: simplified event attachment */
/*function addEvent(obj, type, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(type, fn, false);
        EventCache.add(obj, type, fn);
    }
    else if (obj.attachEvent) {
        obj["e" + type + fn] = fn;
        obj[type + fn] = function() { obj["e" + type + fn](window.event); }
        obj.attachEvent("on" + type, obj[type + fn]);
        EventCache.add(obj, type, fn);
    }
    else {
        obj["on" + type] = obj["e" + type + fn];
    }
}

var EventCache = function() {
    var listEvents = [];
    return {
        listEvents: listEvents,
        add: function(node, sEventName, fHandler) {
            listEvents.push(arguments);
        },
        flush: function() {
            var i, item;
            for (i = listEvents.length - 1; i >= 0; i = i - 1) {
                item = listEvents[i];
                if (item[0].removeEventListener) {
                    item[0].removeEventListener(item[1], item[2], item[3]);
                };
                if (item[1].substring(0, 2) != "on") {
                    item[1] = "on" + item[1];
                };
                if (item[0].detachEvent) {
                    item[0].detachEvent(item[1], item[2]);
                };
                item[0][item[1]] = null;
            };
        }
    };
} ();
addEvent(window, 'unload', EventCache.flush);*/

function $() {
    var elements = new Array();
    for (var i = 0; i < arguments.length; i++) {
        var element = arguments[i];
        if (typeof element == 'string')
            element = document.getElementById(element);
        if (arguments.length == 1)
            return element;
        elements.push(element);
    }
    return elements;
}

/* Regular Expressions */

// Credit Cards
/* Swiped from  http://www.regular-expressions.info/creditcard.html */
regex_Visa = "^4[0-9]{12}(?:[0-9]{3})?$";           // Visa
regex_Mstr = "^5[1-5][0-9]{14}$";                   // MasterCard
regex_AmEx = "^3[47][0-9]{13}$";                    // American Express
regex_Dine = "^3(?:0[0-5]|[68][0-9])[0-9]{11}$";    // Diners Club
regex_Disc = "^6(?:011|5[0-9]{2})[0-9]{12}$";       // Discover
regex_JCB = "^(?:2131|1800|35\d{3})\d{11}$";       // JCB

regex_alphabetic = "^[A-Za-z]*$";
regex_alphanumeric = "^[A-Za-z0-9]*$";
regex_alnumhyphen = "^[A-Za-z0-9\-_]*$";
regex_alnumhyphenat = "^[A-Za-z0-9\-_@]*$";
regex_alphaspace = "^[A-Za-z0-9\-_ \n\r\t]*$";
regex_email = "^(([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}){0,1}$";
