YAHOO.namespace('S2W.register');

YAHOO.S2W.register.facilitySelect = document.getElementById('facility');

YAHOO.S2W.register.formValid = 0;

YAHOO.S2W.register.init = function ()
{
    // submits the form when the enter key is clicked
    var keylistener = new YAHOO.util.KeyListener(document, { keys : 13 }, { fn : YAHOO.S2W.register.registerForm });
    keylistener.enable();

    var form_ids = ['first_name', 'last_name',
                    'gender',
                    'facility', 'graduation',
                    'address1', 'address2', 'city', 'state', 'zip',
                    'birthday',
                    'phone1', 'phone2', 'parent_email', 'email',
                    'password', 'confirm_password',
                    'agree'
    ];

    YAHOO.util.Event.addListener(document.body, 'load', YAHOO.S2W.register.getSelectData(YAHOO.S2W.register.facilitySelect));

    YAHOO.util.Event.addListener(form_ids, 'focus', YAHOO.S2W.register.formFieldFocus);

    YAHOO.util.Event.addListener(form_ids, 'blur', YAHOO.S2W.register.formFieldBlur);

    // this is a hack for Safari since clicking on radioboxes doesn't fire the focus event
    //YAHOO.util.Event.addListener(['instructor', 'athlete', 'student'], 'click', YAHOO.S2W.register.formFieldFocus);

    YAHOO.util.Event.addListener('birthday', 'change', YAHOO.S2W.register.checkUnderage);

    YAHOO.util.Event.addListener('create', 'click', YAHOO.S2W.register.registerForm);

    YAHOO.util.Event.addListener('email', 'change', YAHOO.S2W.register.checkEmailAddress);

    YAHOO.S2W.register.checkUnderage();

    YAHOO.S2W.register.checkEmailAddress();

    document.getElementById('first_name').focus();
};



// checkEmailAddress()
YAHOO.S2W.register.checkEmailAddress = function ()
{
    var emailField = document.getElementById('email');
    var email = emailField.value;

    var handleSuccess = function (o)
    {
        if (o.responseText !== undefined)
        {
            if (o.responseText == 1) // === doesn't work as expected here
            {
                YAHOO.S2W.register.setErrorOnField('This email address is already in use. Please go to the <a href="http://speedtowin.com/ath">Athlete</a> sign in page to sign in or retrieve your password if you do not remember it.', emailField);
                YAHOO.S2W.register.formValid = 0;
                return true;
            }
            else
            {
                YAHOO.S2W.register.formValid = 1;
            }
        }
    };

    var handleFailure = function (o) { if (o.responseXML !== undefined) { alert('failure'); } };

    var callback = { success : handleSuccess, failure : handleFailure, argument : {} };

    var postData = 'e=' + encodeURIComponent(email);

    var sUrl = '/t/register/check_email_address'

    var transaction = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
};



// checkUnderage()
YAHOO.S2W.register.checkUnderage = function ()
{
    if (YAHOO.S2W.register.userUnderage())
    {
        YAHOO.S2W.register.showUnderageFields();
    }
    else
    {
        YAHOO.S2W.register.hideUnderageFields();
    }
};



/** clearError(el)
 *  This is actually clearErrorAndSetHelpTip
 *  - clears error
 *  - shows help
 */
YAHOO.S2W.register.clearError = function (el)
{
    var field_id = YAHOO.S2W.register.getFieldId(el);
    var status_id = YAHOO.S2W.register.getStatusId(el);

    // this clears the error
    document.getElementById(field_id).className = 'yui-gb form_row';
    document.getElementById(status_id).innerHTML = '';

    // this shows a help message if needed
    switch (el.id)
    {
        case 'facility':
            document.getElementById(status_id).innerHTML = 'You can add other locations once you are registered.';
            break;

        case 'graduation':
            document.getElementById(status_id).innerHTML = 'If you are currently in high school or college, please enter your graduation year.';
            break;

        case 'phone1':
        case 'phone2':
            document.getElementById(status_id).innerHTML = 'Example: (555) 867-5309';
            break;

        case 'state':
            document.getElementById(status_id).innerHTML = 'A valid 2 letter state abbreviation';
            break;

        case 'birthday':
            document.getElementById(status_id).innerHTML = 'Example: 11/09/1966';
            break;

        case 'parent_email':
            document.getElementById(status_id).innerHTML = "Since you are under 13 years old, you must provide your parent's email to give you permission to use this site.";
            break;

        case 'email':
            document.getElementById(status_id).innerHTML = "Please provide the email you use most often, this will be what you sign into the system with. If you do not currently have an email account anywhere you can check with your service provider or one of the many free email providers such as mail.yahoo.com or gmail.com.";
            break;

        case 'password':
            document.getElementById(status_id).innerHTML = 'Your password must be between 3 and 10 characters long.';
            break;
    }
};



// clearOptionsForSelect(object select)
YAHOO.S2W.register.clearOptionsForSelect = function (select)
{
    while (select.hasChildNodes())
    {
        select.removeChild(select.firstChild);
    }
};



// createOptionForSelect(string value, object select)
YAHOO.S2W.register.createOptionForSelect = function (value, select)
{
    var newOption = document.createElement('option');
    newOption.value = value;
    newOption.appendChild(document.createTextNode(value));
    select.appendChild(newOption);
    if (this.debug) { YAHOO.log('select : option added: ' + select.id + ' : ' + value); }
};



/** formFieldBlur()
 *  - sets the value of the input box to the correct default value (if any) if the field is blank
 *  - clears out the help that may be showing in the status
 *  - does not clear out the error that may be showing in the status
 */
YAHOO.S2W.register.formFieldBlur = function ()
{
    // validate the field before we leave - DISABLED FOR NOW, OUTSTANDING BUGS
    //YAHOO.S2W.register.validateField(this);

    /** if the field is still blank when we leave...
      * - set the class back to default
      * - place the default text (if any)
      * - clear the status, if it is not an error
      */
    switch (this.id)
    {
        case 'first_name':
            if (this.value === '')
            {
                this.className = 'default';
                this.value = 'First Name';
            }
            if (document.getElementById('fullnamefield').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('fullnamestatus').innerHTML = '';
            }
            break;

        case 'last_name':
            if (this.value === '')
            {
                this.className = 'default';
                this.value = 'Last Name';
            }
            if (document.getElementById('fullnamefield').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('fullnamestatus').innerHTML = '';
            }
            break;

        case 'gender':
            if (this.value === '')
            {
                this.className = 'default';
            }
            if (document.getElementById('genderfield').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('genderstatus').innerHTML = '';
            }
            break;

        case 'address1':
            if (this.value === '')
            {
                this.className = 'default';
                this.value = 'Street Address';
            }
            if (document.getElementById('address1field').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('address1status').innerHTML = '';
            }
            break;

        case 'address2':
            if (this.value === '')
            {
                this.className = 'default';
                this.value = 'Building/Suite/Apartment';
            }
            if (document.getElementById('address2field').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('address2status').innerHTML = '';
            }
            break;

        case 'city':
            if (this.value === '')
            {
                this.className = 'default';
                this.value = 'City';
            }
            if (document.getElementById('citystatezipfield').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('citystatezipstatus').innerHTML = '';
            }
            break;

        case 'state':
            if (this.value === '')
            {
                this.className = 'default';
                this.value = 'State';
            }
            if (document.getElementById('citystatezipfield').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('citystatezipstatus').innerHTML = '';
            }
            break;

        case 'zip':
            if (this.value === '')
            {
                this.className = 'default';
                this.value = 'Zip';
            }
            if (document.getElementById('citystatezipfield').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('citystatezipstatus').innerHTML = '';
            }
            break;

        case 'birthday':
            if (document.getElementById('birthdayfield').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('birthdaystatus').innerHTML = '';
            }
            break;

        case 'facility':
            if (document.getElementById('facilityfield').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('facilitystatus').innerHTML = '';
            }
            break;

        case 'graduation':
            if (document.getElementById('graduationfield').className != 'yui-bg form_row form_row_error')
            {
                document.getElementById('graduationstatus').innerHTML = '';
            }
            break;

        case 'phone1':
            if (document.getElementById('phone1status').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('phone1status').innerHTML = '';
            }
            break;

        case 'phone2':
            if (document.getElementById('phone2status').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('phone2status').innerHTML = '';
            }
            break;

        case 'parent_email':
            if (document.getElementById('parent_emailstatus').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('parent_emailstatus').innerHTML = '';
            }
            break;

        case 'email':
            if (document.getElementById('emailstatus').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('emailstatus').innerHTML = '';
            }
            break;

        case 'password':
            if (document.getElementById('passwordstatus').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('passwordstatus').innerHTML = '';
            }
            break;

        case 'confirm_password':
            if (document.getElementById('confirm_passwordstatus').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('confirm_passwordstatus').innerHTML = '';
            }
            break;

        case 'agree':
            if (document.getElementById('agreestatus').className !== 'yui-gb form_row form_row_error')
            {
                document.getElementById('agreestatus').innerHTML = '';
            }
            break;
    }
};



/** formFieldFocus()
 *  when a form element gets focus, this:
 *  - removes the default value
 *  - changes the style
 *  - clears any error and shows help for the row
 *  We need to switch on the value to not clear out the data entered by the user
 */
YAHOO.S2W.register.formFieldFocus = function ()
{
    // clear the error
    YAHOO.S2W.register.clearError(this);

    // this sets the default text class
    this.className = 'form_input_active';

    switch (this.value)
    {
        case 'First Name':
        case 'Last Name':
        case 'Street Address':
        case 'Building/Suite/Apartment':
        case 'City':
        case 'State':
        case 'Zip':
            this.value = '';
            break;
    }
};



// validates and submits form
YAHOO.S2W.register.registerForm = function ()
{
    var form = document.getElementById('register');
    var formFields = ['first_name', 'last_name', 'gender', 'address1', 'city', 'state', 'zip', 'facility', 'birthday', 'email', 'password', 'confirm_password', 'agree', 'phone1', 'phone2', 'graduation'];

    if (YAHOO.S2W.register.userUnderage()) { formFields.push('parent_email'); }

    var form_error = 0;

    // loop though all the required form elements to make sure we don't have any errors
    for (var i = 0; i < formFields.length; i++)
    {
        if (!YAHOO.S2W.register.validateField(document.getElementById(formFields[i]))) { form_error = 1; }
    }

    if (!YAHOO.S2W.register.formValid) { form_error = 1; } // this is to block the form from submitting if the email is valid, but in use already

    // if we dont' have any errors, submit the form
    if (form_error === 0)
    {
        var handleSuccess = function (o)
        {
            // alert(o.responseText);
            var status = document.getElementById('submitstatus');
            form.style.display = 'none';
            status.innerHTML = "<div style='text-align: center;'><h1>Account successfully created!</h1></div>";
            status.innerHTML += "<div style='text-align: center; font-size: 2em;'><a href='http://speedtowin.com/ath' target='_parent'>Sign In Now!</a></div>";
            status.innerHTML += "<div style='text-align: center; font-size: .8em;'>Note: If you are under 13 years old you will not be able to sign in until your parents have approved your account.<br>They have been sent an email to confirm that you are allowed to have access.";
            status.innerHTML += o.responseText;
        };

        var handleFailure = function (o)
        {
            var status = document.getElementById('submitstatus');
            status.innerHTML = 'Error: ' + o.status + ' : ' + o.statusText;
        };

        var callback = { success : handleSuccess, failure : handleFailure };

        YAHOO.util.Connect.setForm(form);
        var transaction = YAHOO.util.Connect.asyncRequest('POST', '/t/register/create_user', callback);
    }
    else { return false; }
};



/** getFieldId(el)
 *  - gets the proper field id for a particular form field (input id)
 */
YAHOO.S2W.register.getFieldId = function (el)
{
    var id = el.id + 'field';

    if (el.id === 'first_name' || el.id === 'last_name') { id = 'fullnamefield'; }

    if (el.id === 'city' || el.id === 'state' || el.id === 'zip') { id = 'citystatezipfield'; }

    return id;
};



// getSelectData(object selectElement)
YAHOO.S2W.register.getSelectData = function (selectElement, filter, facility_value, instructor_value)
{
    var handleSuccess = function (o)
    {
        if (o.responseXML !== undefined)
        {
            YAHOO.S2W.register.clearOptionsForSelect(selectElement);
            var names = o.responseXML.getElementsByTagName('name');

            for (var i = 0; i < names.length; i++)
            {
                YAHOO.S2W.register.createOptionForSelect(names[i].firstChild.nodeValue, selectElement);
            }
        }
    };

    var handleFailure = function (o) { if (o.responseXML !== undefined) { alert('failure'); } };

    var callback = { success : handleSuccess, failure : handleFailure, argument : {} };

    var sUrl = '/t/register/get_select_data';

    var postData = 's=' + encodeURIComponent(selectElement.id) + '&f=' + encodeURIComponent(filter);
    if (facility_value !== undefined) { postData += '&facility=' + encodeURIComponent(facility_value); }
    if (instructor_value !== undefined) { postData += '&instructor=' + encodeURIComponent(instructor_value); }

    var transaction = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
};



/** getStatusId(el)
 *  - gets the proper status id for a particular form field (input id)
 */
YAHOO.S2W.register.getStatusId = function (el)
{
    var id = el.id + 'status';

    if (el.id === 'first_name' || el.id === 'last_name') { id = 'fullnamestatus'; }

    if (el.id === 'city' || el.id === 'state' || el.id === 'zip') { id = 'citystatezipstatus'; }

    return id;
};



// hideUnderageFields
YAHOO.S2W.register.hideUnderageFields = function ()
{
    document.getElementById('parent_emailfield').className = 'yui-gb form_row hidden';
};



// setErrorOnField(string str, object element)
YAHOO.S2W.register.setErrorOnField = function (str, el)
{
    var field_id = YAHOO.S2W.register.getFieldId(el);
    var status_id = YAHOO.S2W.register.getStatusId(el);

    document.getElementById(field_id).className = 'yui-gb form_row form_row_error';
    document.getElementById(status_id).innerHTML = str;
};



// setFacilityLabel(string str)
YAHOO.S2W.register.setFacilityLabel = function (str)
{
    document.getElementById('facilitylabel').innerHTML = str;
};



// setFormView()
/*
YAHOO.S2W.register.setFormView = function(type)
{
    switch (type)
    {
        case 'athlete':
            YAHOO.S2W.register.setFacilityLabel('I will mainly train at');
            document.getElementById('graduationfield').className = 'yui-gb form_row hidden';
            break;

        case 'instructor':
            YAHOO.S2W.register.setFacilityLabel('I will mainly instruct at');
            document.getElementById('graduationfield').className = 'yui-gb form_row hidden';
            break;

        case 'student':
            YAHOO.S2W.register.setFacilityLabel('My current school is');
            document.getElementById('graduationfield').className = 'yui-gb form_row';
            break;
    }
};
*/



// showUnderageFields()
YAHOO.S2W.register.showUnderageFields = function ()
{
    document.getElementById('parent_emailfield').className = 'yui-gb form_row';
};



// userUnderage()
YAHOO.S2W.register.userUnderage = function ()
{
    // underage is less than 13
    var birthday_value = document.getElementById('birthday').value;

    var bday_year = birthday_value.replace(/(\d+)\/(\d+)\/(\d+)/, "$3");
    var bday_month = birthday_value.replace(/(\d+)\/(\d+)\/(\d+)/, "$1") - 1;
    var bday_day = birthday_value.replace(/(\d+)\/(\d+)\/(\d+)/, "$2");
    var bday = new Date(bday_year, bday_month, bday_day);

    var ofage_bday = new Date(Number(bday_year) + 13, bday_month, bday_day);

    var now = new Date();

    if (now < ofage_bday) { return true; }

    return false;
};



/** validateField(el)
 *  - validates a form field
 */
YAHOO.S2W.register.validateField = function (el)
{
    var pattern;

    switch (el.id)
    {
        case 'first_name':
        case 'last_name':
            pattern = /^[A-Za-z\-' ]+$/; // any letter, hyphen, apostrophe
            if (!pattern.test(el.value) || el.value === 'First Name' || el.value === 'Last Name')
            {
                YAHOO.S2W.register.setErrorOnField('Your full name is required. Only letters, hyphens, and apostrophes are allowed.', el);
                return false;
            }
            break;

        case 'gender':
            if (el.value !== 'M' && el.value !== 'F')
            {
                YAHOO.S2W.register.setErrorOnField('Your gender is required. Please choose Male or Female.', el);
                return false;
            }
            break;

        case 'address1':
            pattern = /^[A-Za-z\-' 0-9\.]+$/;  // any letter, hyphen, apostrophe, digit, period or space
            if (!pattern.test(el.value) || el.value === 'Street Address')
            {
                YAHOO.S2W.register.setErrorOnField('Your street address is required. Only letters, numbers, spaces, hyphens, periods, and apostrophes are allowed.', el);
                return false;
            }
            break;

        case 'address2':
            pattern = /^[A-Za-z\-' 0-9\/\.]*$/; // any letter, hyphen, spostriphe, digit, slash (/), period or space
            if (!pattern.test(el.value))
            {
                YAHOO.S2W.register.setErrorOnField('Only letters, numbers, spaces, hyphens, periods and apostrophes are allowed.', el);
                return false;
            }
            break;

        case 'city':
            pattern = /^[A-Za-z\-' \.]+$/;  // any letter, hyphen, apostrophe or space
            if (!pattern.test(el.value) || el.value === 'City')
            {
                YAHOO.S2W.register.setErrorOnField('Your full address is required. Only letters, spaces, hyphens, numbers and apostrophes are allowed.  Please use valid two letter state abbreviations.', el);
                return false;
            }
            break;

        case 'state':
            pattern = /^[A-Za-z]{2}$/; // any letter, 2 times
            if (!pattern.test(el.value) || el.value === 'State')
            {
                YAHOO.S2W.register.setErrorOnField('Your full address is required. Only letters, spaces, hyphens, numbers, and apostrophes are allowed.  Please use valid two letter state abbreviations.', el);
                return false;
            }
            break;

        case 'zip':
            pattern = /^[0-9\-]{5,10}$/; // any number or hyphen between 5 and 10 times
            if (!pattern.test(el.value) || el.value === 'Zip')
            {
                YAHOO.S2W.register.setErrorOnField('Your full address is required. Only letters, spaces, hyphens, numbers, and apostrophes are allowed.  Please use valid two letter state abbreviations.', el);
                return false;
            }
            break;

        case 'birthday':
            pattern = /^[01][0-9]\/[0-3][0-9]\/[0-9]{4}$/; // any numbers in the following format xx/xx/xxxx
            if (!pattern.test(el.value))
            {
                YAHOO.S2W.register.setErrorOnField('Your Birthdate is required. Please use the following syntax: MM/DD/YYYY', el);
                return false;
            }
            break;

        case 'facility':
            if (el.value === 'Choose...')
            {
                YAHOO.S2W.register.setErrorOnField('You must select a location from the list.', el);
                return false;
            }
            break;

        case 'graduation':
            pattern = /^([0-9]{4})?$/;
            if (!pattern.test(el.value))
            {
                YAHOO.S2W.register.setErrorOnField('Please enter a four digit graduation year.', el);
                return false;
            }
            break;

        case 'phone1':
        case 'phone2':
            pattern = /^([\(]?[0-9]{3}[\)]?[ -]?[0-9]{3}[ -]?[0-9]{4})?$/; // this will take a small paragraph to explain
            if (!pattern.test(el.value))
            {
                YAHOO.S2W.register.setErrorOnField('Please use the following syntax for your phone number: (xxx) xxx-xxxx', el);
                return false;
            }
            break;

        case 'parent_email':
            email = document.getElementById('email');
            if (el.value === email.value)
            {
                YAHOO.S2W.register.setErrorOnField('Your parent email and your own email can not be the same.', el);
                return false;
            }

            pattern = /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9_\.\-]+\.[A-Za-z0-9_\.\-]+$/; // basic email address syntax
            if (!pattern.test(el.value))
            {
                YAHOO.S2W.register.setErrorOnField('A valid email address is required.', el);
                return false;
            }
            break;

        case 'email':
            pattern = /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9_\.\-]+\.[A-Za-z0-9_\.\-]+$/; // basic email address syntax
            if (!pattern.test(el.value))
            {
                YAHOO.S2W.register.setErrorOnField('A valid email address is required.', el);
                return false;
            }
            break;

        case 'password':
             pattern = /^[A-Za-z_\.0-9\-]{3,10}$/; // any letter, underscore, digit, hyphen or period, between 3 and 10 times
            if (!pattern.test(el.value))
            {
                YAHOO.S2W.register.setErrorOnField('Your password must be between 3 and 10 characters long and can only contain letters, numbers, hyphens, underscores or periods.', el);
                return false;
            }
            break;

        case 'confirm_password':
            password = document.getElementById('password');
            if (el.value !== password.value)
            {
                YAHOO.S2W.register.setErrorOnField('Your passwords do not match.', el);
                return false;
            }
            break;

        case 'agree':
            if (!el.checked)
            {
                YAHOO.S2W.register.setErrorOnField('You must agree to the license agreement to continue.', el);
                return false;
            }
            break;
    }

    return true; // we must not have an error if we got this far
};



// event handling
YAHOO.util.Event.addListener(window, 'load', YAHOO.S2W.register.init);
