/***********************************
* validator.js
*
* Validates forms. Simple as that. 
* Makes exceptional use of JS alerts.
*
* Created By: eculver
* Created On: 04/14/08
************************************/

/***********************************
* constants
***********************************/
var url_re             = /https?:\/\/[A-Za-z0-9\.-]{3,}\.[A-Za-z]{3}/
var email_re           = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/
var phone_re           = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/
var username_re        = /^[a-zA-Z0-9_\-]{3,16}$/
var url_no_protocol_re = /[A-Za-z0-9\.-]{3,}\.[A-Za-z]{3}/

/***********************************
* validateContactForm
*
* Required Fields:
* fullname - text
* email    - email
* subject  - text
* comment  - text 
************************************/
function validateContactForm(frm) {    
    if(jQuery.trim(frm.fullname.value) == '') {
        showAlert("please enter your full name");
        frm.fullname.focus();
        return false;
    }
    
    if (!jQuery.trim(frm.email.value).match(email_re)) {
        showAlert("invalid email address");
        frm.email.focus();
        return false;
    }
    
    if(jQuery.trim(frm.subject.value) == '') {
        showAlert("please enter a subject");
        frm.subject.focus();
        return false;
    }
     
    if(jQuery.trim(frm.comment.value) == '' || jQuery.trim(frm.comment.value) == 'Tell us your thoughts...') {
        showAlert("please enter a message");
        frm.comment.focus();
        return false;
    }
        
    return true;
}

/***********************************
* validateLoginForm
*
* Required Fields:
* username - text
* password - text
************************************/
function validateLoginForm(frm) {
    if(jQuery.trim(frm.username.value) == '') {
        showAlert("please enter your username");
        frm.username.focus();
        return false;
    }
    
    if(jQuery.trim(frm.password.value) == '') {
        showAlert("please enter your password");
        frm.password.focus();
        return false;
    }

    return true;
}

/***********************************
* validateResetLoginForm
*
* Required Fields:
* email - email
************************************/
function validateResetLoginForm(frm) {
    if (!jQuery.trim(frm.email.value).match(email_re)) {
        showAlert("invalid email address");
        frm.email.focus();
        return false;
    }

    return true;
}

/***********************************
* validateSignupForm
*
* Required Fields:
* username        - text
* fullname        - text
* email           - email
* password        - text
* confirmpassword - text
* captcha_code    - text
************************************/
function validateSignupForm(frm) {
    var re;
    
    if(jQuery.trim(frm.username.value) == '') {
        showAlert("please enter a username");
        frm.username.focus();
        return false;
    }
    if(jQuery.trim(frm.username.value).length < 3) { 
        showAlert("username must contain at least three characters!"); 
        frm.username.focus(); 
        return false;
    } 
    
    if(!jQuery.trim(frm.username.value).match(username_re)) {
        showAlert("Sorry, usernames are restricted to alpha numeric characters (letters and numbers), underscores (_) and dashes (-) only. <center>They also have to be between 3 and 16 characters long. Please try again.</center>");
        frm.username.focus();
        return false;
    }
    
    if(jQuery.trim(frm.fullname.value) == '') {
        showAlert("please enter your full name");
        frm.fullname.focus();
        return false;
    }
    if(!jQuery.trim(frm.email.value).match(email_re)) {
        showAlert("invalid email address");
        frm.email.focus();
        return false;
    }

    if(jQuery.trim(frm.password.value) == '') {
        showAlert("please enter a password");
        frm.password.focus();
        return false;
    }
    if(jQuery.trim(frm.password.value).length < 5) { 
        showAlert("password must contain at least five characters!"); 
        frm.password.focus(); 
        return false;
    } 
    
    // optional restrictions
    /*
    re = /[0-9]/; 
    if(!re.test(jQuery.trim(frm.password.value))) { 
        showAlert("password must contain at least one number (0-9)!\n"); 
        frm.password.focus(); 
        return false;
    } 

    re = /[a-z]/; 
    if(!re.test(jQuery.trim(frm.password.value))) { 
        showAlert("password must contain at least one lowercase letter (a-z)!"); 
        frm.password.focus(); 
        return false; 
    } 
        
    re = /[A-Z]/; 
    if(!re.test(jQuery.trim(frm.password.value))) { 
        showAlert("password must contain at least one uppercase letter (A-Z)!"); 
        frm.password.focus(); 
        return false; 
    }
    */
    
    if(jQuery.trim(frm.confirmpassword.value) == '') {
        showAlert("please confirm your new password");
        frm.confirmpassword.focus();
        return false;
    }
    
    if(jQuery.trim(frm.password.value) != jQuery.trim(frm.confirmpassword.value)) {
        showAlert("passwords do not match");
        frm.password.focus();
        return false;
    }
    
    /*
    if(jQuery.trim(frm.captcha_code.value) == '') {
        showAlert("please enter the security code");
        frm.captcha_code.focus();
        return false;
    }
    */
    // check to make sure that the terms and agreement check box is checked
    if(frm.accept.checked != true) {
        showAlert("you forgot to select the checkbox that indicates that you agree to our terms and conditions and privacy policy");
        frm.accept.focus();
        return false;
    }
    
    return true;
}

/***********************************
* validateTellAFriendForm
*
* Required Fields:
* yname  - text
* yemail - email
* temail - email
************************************/
function validateTellAFriendForm(frm) {
    $('#modal-tell-a-friend-message').html("");
    
    
    if(jQuery.trim(frm.yname.value) == '') {
        $('#modal-tell-a-friend-message').html("Please enter your name");
        frm.yname.focus();
        return false;
    }
    if(!jQuery.trim(frm.yemail.value).match(email_re)) {
        $('#modal-tell-a-friend-message').html("Please enter a valid email for your email");
        frm.yemail.focus();
        return false;
    }
    if(!jQuery.trim(frm.temail.value).match(email_re)) {
        $('#modal-tell-a-friend-message').html("Please enter a valid email for their email");
        frm.temail.focus();
        return false;
    }

    return true;
}

/***********************************
* validateSendToAFriendForm
*
* Required Fields:
* yname  - text
* yemail - email
* temail - email
************************************/
function validateSendToAFriendForm(frm) {
    $('#modal-send-to-a-friend-message').html("");
    
    
    if(jQuery.trim(frm.yname.value) == '') {
        $('#modal-send-to-a-friend-message').html("Please enter your name");
        frm.yname.focus();
        return false;
    }
    if(!jQuery.trim(frm.yemail.value).match(email_re)) {
        $('#modal-send-to-a-friend-message').html("Please enter a valid email for your email");
        frm.yemail.focus();
        return false;
    }
    if(!jQuery.trim(frm.temail.value).match(email_re)) {
        $('#modal-send-to-a-friend-message').html("Please enter a valid email for their email");
        frm.temail.focus();
        return false;
    }

    return true;
}

/***********************************
* validateContactForm
*
* Required Fields:
* email    - email
* feedback - text 
************************************/
function validateFeedbackForm(frm) {    
    $('#modal-feedback-message').html("");
    
    if (!jQuery.trim(frm.email.value).match(email_re)) {
        $('#modal-feedback-message').html("Please enter a valid email for your email");
        frm.email.focus();
        return false;
    }
    if(jQuery.trim(frm.feedback.value) == '' || jQuery.trim(frm.feedback.value) == 'Feedback here...') {
        $('#modal-feedback-message').html("Please enter some feedback");
        frm.feedback.focus();
        return false;
    }
        
    return true;
}

/***********************************
* validateSuggestForm
*
* Required Fields:
* name - text
* url - url
************************************/
function validateSuggestForm(frm) {
    if(jQuery.trim(frm.name.value) == '') {
        showAlert("please enter your product's name");
        frm.name.focus();
        return false;
    }
    
    /* LEGACY, no longer requiring URL
    if(!jQuery.trim(frm.url.value).match(url_re)) {
        showAlert("please enter a URL for your product<br /><br />ex. http://www.petco.com/");
        frm.url.focus();
        return false;
    }
    */
    
    if(frm.category_id.value == 0) {
        showAlert("please select a category");
        return false;
    }

    return true;
}

/***********************************
* validateVoteChooseForm
*
************************************/
function validateVoteChooseForm() {
    var frm = $('#vote-choose-form')[0];
    
    if(frm.category_id.value == 0) {
        showAlert("please select a category");
        
        // hide loading indicator
        $('#global-loading').css("visibility", "hidden");
        
        return false;
    }

    $('#page-loading').css("display", "inline")

    return true;
}

/***********************************
* validateGetStartedChooseForm
*
************************************/
function validateGetStartedChooseForm() {
    var frm = $('#get-started-choose-form')[0];
    
    if(frm.category_id.value == 0) {
        showAlert("please select a category");
        
        // hide loading indicator
        $('#global-loading').css("visibility", "hidden");
        
        return false;
    }
    
    $('#page-loading').css("display", "inline");
    
    return true;
}

/***********************************
* validateCommentForm
*
* Required Fields:
* comment - text
* captcha - text
************************************/
function validateCommentForm(frm) {
    if(jQuery.trim(frm.comment.value) == '' || jQuery.trim(frm.comment.value) == 'Leave a comment...') {
        showAlert("please enter a comment");
        frm.comment.focus();
        return false;
    }
    
    /*
    if(jQuery.trim(frm.captcha_code.value) == '') {
        showAlert("please enter the security code");
        frm.captcha_code.focus();
        return false;
    }
    */
    return true;
}

/***********************************
* validateChangePasswordForm
*
* Required Fields:
* opw - text
* npw - text 
* cnp - text
************************************/
function validateChangePasswordForm(frm) {
    var re;
    
    if(jQuery.trim(frm.opw.value) == '') {
        showAlert("please enter your old password");
        frm.opw.focus();    
        return false;
    }
    if(jQuery.trim(frm.npw.value) == '') {
        showAlert("please enter a new password");
        frm.npw.focus();
        return false;
    }
    if(jQuery.trim(frm.npw.value).length < 6) { 
        showAlert("password must contain at least six characters!"); 
        frm.npw.focus(); 
        return false;
    } 
    
    // optional restrictions
    re = /[0-9]/; 
    if(!re.test(jQuery.trim(frm.npw.value))) { 
        showAlert("password must contain at least one number (0-9)!\n"); 
        frm.npw.focus(); 
        return false;
    } 
    /*
    re = /[a-z]/; 
    if(!re.test(jQuery.trim(frm.npw.value))) { 
        showAlert("password must contain at least one lowercase letter (a-z)!"); 
        frm.npw.focus(); 
        return false; 
    } 
        
    re = /[A-Z]/; 
    if(!re.test(jQuery.trim(frm.npw.value))) { 
        showAlert("password must contain at least one uppercase letter (A-Z)!"); 
        frm.npw.focus(); 
        return false; 
    }
    */
    
    if(jQuery.trim(frm.cnpw.value) == '') {
        showAlert("please confirm your new password");
        frm.cnpw.focus();
        return false;
    }
    
    if(jQuery.trim(frm.npw.value) != jQuery.trim(frm.cnpw.value)) {
        showAlert("passwords do not match");
        frm.npw.focus();
        return false;
    }
    
    return true;
}

/***********************************
* validateChangeEmailForm
*
* Required Fields:
* oemail  - email
* nemail  - email 
* cnemail - email
************************************/
function validateChangeEmailForm(frm) {        
    if(jQuery.trim(frm.oemail.value) == '') {
        showAlert("please enter your old email");
        frm.oemail.focus();    
        return false;
    }
    
    if(!jQuery.trim(frm.oemail.value).match(email_re)) {
        showAlert("you entered an invalid email for your old email");
        frm.oemail.focus();
        return false;
    }
    
    if(jQuery.trim(frm.nemail.value) == '') {
        showAlert("please enter a new email");
        frm.nemail.focus();
        return false;
    }
    
    if(!jQuery.trim(frm.nemail.value).match(email_re)) {
        showAlert("you entered an invalid email for you new email");
        frm.nemail.focus();
        return false;
    }
    
    if(jQuery.trim(frm.cnemail.value) == '') {
        showAlert("please confirm your new email");
        frm.cnemail.focus();
        return false;
    }
    
    if(jQuery.trim(frm.nemail.value) != jQuery.trim(frm.cnemail.value)) {
        showAlert("the 2 emails you entered for the new email do not match");
        frm.nemail.focus();
        return false;
    }
    
    return true;
}

/***********************************
* validateContestRegistrationForm
*
* Required Fields:
* name  - text
* email - email
* url   - url
************************************/
function validateContestRegistrationForm(frm) {
    if(jQuery.trim(frm.name.value) == '') {
        showAlert("please enter your name");
        frm.name.focus();
        return false;
    }
    
    if(!jQuery.trim(frm.email.value).match(email_re)) {
        showAlert("you entered an invalid email address");
        frm.email.focus();
        return false;
    }
    
    if(!jQuery.trim(frm.url.value).match(url_no_protocol_re)) {
        showAlert("please enter a valid URL");
        frm.url.focus();
        return false;
    }
    
    return true;
}

/***********************************
* validateContestQuestionsForm
*
* Required Fields:
* name      - text
* email     - text
* questions - text
************************************/
function validateContestQuestionsForm(frm) {
    if(jQuery.trim(frm.name.value) == '') {
        showAlert("please enter your name");
        frm.name.focus();
        return false;
    }
    
    if(!jQuery.trim(frm.email.value).match(email_re)) {
        showAlert("you entered an invalid email address");
        frm.email.focus();
        return false;
    }
    
    if(jQuery.trim(frm.questions.value) == '') {
        showAlert("please enter your questions");
        frm.questions.focus();
        return false;
    }
    
    return true;
}

/***********************************
* validateCommissionsQuestionsForm
*
* Required Fields:
* name      - text
* email     - text
* questions - text
************************************/
function validateCommissionsQuestionsForm(frm) {
    if(jQuery.trim(frm.name.value) == '') {
        showAlert("please enter your name");
        frm.name.focus();
        return false;
    }
    
    if(!jQuery.trim(frm.email.value).match(email_re)) {
        showAlert("you entered an invalid email address");
        frm.email.focus();
        return false;
    }
    
    if(jQuery.trim(frm.questions.value) == '') {
        showAlert("please enter your questions");
        frm.questions.focus();
        return false;
    }
    
    return true;
}
