/********************** This JavaScript file is to validate HTML configs ******************/
var isLoggedIn;
var age;
if (location.search.length > 0)
    isLoggedIn = unescape(location.search.substring(1))
/*****************************iframe/New Window*********************************
//For opening in new window (put following code):
//window.open("video_form.html?" + isLoggedIn);

//For opening in an iframe (put following code):
//var iFrameNew = document.getElementById("iFrameNew");
//iFrameNew.src = "video_form.html?" + isLoggedIn;
//iFrameNew.reload(true);
*****************************************************************************/


var AdvertiserValidation =
{
    //To have a minimum age check other than 18, set minAge to a different value
    'minAge': 18,
    'age': 0,
    'isLoggedIn': true,
    'isLogInRequired': false,
    /*****************************************************************************
    Set mergePhoneNum to true to merge contents of pnumber1, pnumber2 and  pnumber3 into pnumber 
    set mergeStreetAdd to true if using 2 address fields. will merge address1 and address2 into streetAddress
    *****************************************************************************/
    'mergePhoneNum': false,
    'mergeStreetAdd': false,


    /*****************************************************************************
    ErrorMsg: This Section sets the default field error messages. These can be changed on the HTML form.
    *****************************************************************************/
    'ErrorMsg':
    {
        'age': 'You must be ' + this.minAge + ' years of age to submit this form',
        'login': 'Please login to submit your request.',
        'fname': "Please enter your First Name.",
        'lname': "Please enter your Last Name.",
        'streetAddress': "Please enter your Street Address.",
        'address1': "Please enter your Street Address.",
        'address2': "Please enter your Street Address.",
        'city': "Please enter your City.",
        'state': "Please select your State.",
        'zip': "Please enter a valid Zip Code.",
        'email': "Please enter a valid Email Address.",
        'pnumber': "Please enter a valid Phone Number.",
        'pnumber1': "Please enter a valid Phone Number.",
        'pnumber2': "Please enter a valid Phone Number.",
        'pnumber3': "Please enter a valid Phone Number.",
        'bdate': "Please enter a valid Date of Birth.",
        'bandurl': "Please enter your MySpace URL.",
        'bandName': "Please enter your Band Name.",
        'songName': "Please enter the Song Name.",
        'comment': "Please enter the Comments.",
        'uploadFile': "Please select a file to upload.",
        'terms': "Please confirm that you have read, understood, and agree to the terms and conditions."
    },

    //Add custom validations needed in the HTML form to this JSON object, returning valid = true/false
    'CustomValidations': {},


    /*****************************************************************************
    SubmitForm: This function submits the form to the fuseaction given in form action property. 
    - Checks for minimum age if required to submit this form.
    - Validates the form fields.
    - If phone number was entered in 3 different fields, then merges the phonenumber in 1 hidden field.
    - If there is any media being uploaded from the form, sets the value of the field filename.
    Returns: false if mimimum age is not met/user is not logged in/validation fails;
    *****************************************************************************/
    SubmitForm: function() {
        if (this.CheckLogin()) {
            if (age < this.minAge) {
                window.alert(this.ErrorMsg.age);
                return false;
            }
            var f = this.GetForm();
            if (this.Validate()) {
                //If there r 3 textboxes to enter one Phone Number, 1 for area code & 2 for the number
                if (this.mergePhoneNum == true)
                    this.PhoneNumberMerge();
                if (this.mergeStreetAdd == true)
                    this.MergeAddress();
                f.submit();
                return true;
            }
        }
        else {
            alert(this.ErrorMsg.login);
            return false;
        }
    },

    /*****************************************************************************
    GetForm: This function gets the form named 'aspnetForm'.
    *****************************************************************************/
    GetForm: function() {
        var theForm = document.forms['aspnetForm'];
        if (!theForm) theForm = document.aspnetForm;
        return theForm;
    },

    /*****************************************************************************
    CheckLogin: This function checks if the user is logged into MySpace.
    - The variable isLoggedIn is set to a non-zero value once a user logs into www.MySpace.com
    Returns: false if user is not logged in; otherwise true;
    *****************************************************************************/
    CheckLogin: function() {
        if (typeof isLoggedIn == "undefined" || isLoggedIn < 1)
            return false;
        else
            return true;
    },
    /*****************************************************************************
    Validated: This function validates all fields in this form.
    Returns: false if validation fails; otherwise true;
    *****************************************************************************/
    Validate: function() {
        var form = this.GetForm();
        var isValid = true;
        isValid = this.CheckElementForValidation(form)

        return isValid;
    },

    /*****************************************************************************
    CheckElementForValidation: Checks each element's class to validate the data in that field.
    Argument: 
    element - Form element to be validated
    Returns: false if validation fails; otherwise true;
    *****************************************************************************/
    CheckElementForValidation: function(element) {
        isValid = true;
        for (i = 0; i < element.elements.length; i++) {
            var classNameArr;
            var formElement = element.elements[i];
            if (formElement.className != "") {
                classNameArr = formElement.className.split(" ");

                for (j = 0; j < classNameArr.length; j++) {
                    var errorMsg;

                    switch (classNameArr[j]) {
                        case 'RequiredField':
                            if (formElement.type == 'checkbox')
                                errorMsg = "Please confirm the " + formElement.nane;
                            else
                                errorMsg = "Please enter your " + formElement.name;
                            isValid = this.RequiredField(formElement, this.GetFieldErrors(formElement, errorMsg));
                            break;

                        case 'ValidateMySpaceUrl':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidateMySpaceUrl(formElement, this.GetFieldErrors(formElement, errorMsg))
                            break;

                        case 'ValidateUrl':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidateUrl(formElement, this.GetFieldErrors(formElement, errorMsg))
                            break;

                        case 'ValidateEmail':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidateEmail(formElement, this.GetFieldErrors(formElement, errorMsg));
                            break;

                        case 'ValidateUSDate':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidateDate(formElement, this.GetFieldErrors(formElement, errorMsg), 0);
                            break;

                        case 'ValidateNonUSDate':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidateDate(formElement, this.GetFieldErrors(formElement, errorMsg), 1);
                            break;

                        case 'ValidatePhone':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidatePhone(formElement, this.GetFieldErrors(formElement, errorMsg), 10);
                            break;

                        case 'ValidatePhone1':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidatePhone(formElement, this.GetFieldErrors(formElement, errorMsg), 3);
                            break;

                        case 'ValidatePhone2':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidatePhone(formElement, this.GetFieldErrors(formElement, errorMsg), 3);
                            break;

                        case 'ValidatePhone3':
                            errorMsg = "Please enter a valid " + formElement.name;
                            isValid = this.ValidatePhone(formElement, this.GetFieldErrors(formElement, errorMsg), 4);
                            break;


                        //For Custom Validations provided in the HTML form                    
                        default:
                            if (this.CustomValidations != null && this.CustomValidations[classNameArr[j]] != null) {
                                isValid = eval("AdvertiserValidation.CustomValidations." + classNameArr[j] + "()");
                            }
                            break;
                    }

                    if (isValid === false) {
                        j = classNameArr.length;
                    }
                }
            }
            if (formElement.elements != null && formElement.elements > 0 && isValid) {
                isValid = this.CheckElementForValidation(formElement);
            }

            if (isValid === false)
                i = element.elements.length;

            //alert("The field name is: " + form.elements[i].name + " and it’s value is: " + form.elements[i].value + ".<br />");
        }

        return isValid;
    },

    /*****************************************************************************
    GetFieldErrors: This function gets the error message for this field.
    Argument: 	formElement-	input to be validated 
    errorMsg-       message to alert
    Returns: true if valid; false otherwise
    *****************************************************************************/
    GetFieldErrors: function(formElement, errorMsg) {
        if (formElement != null) {
            elementName = formElement.name;
            if (this.ErrorMsg != null && this.ErrorMsg[elementName] != null) {
                errorMsg = this.ErrorMsg[elementName];
            }
        }

        return errorMsg;
    },

    /*****************************************************************************
    RequiredField: This function checks if the input has contents.
    Argument: 	element-	input to be validated 
    errorMsg-   message to alert
    Returns: true if valid; false otherwise
    *****************************************************************************/
    RequiredField: function(element, errorMsg) {
        if (element.type == 'checkbox') {
            return this.ValidateCheckBox(element, this.GetFieldErrors(element, errorMsg));
        }
        else {
            if (element.value.length < 1 || this.HasWhiteSpace(element.value)) {
                alert(errorMsg);
                element.focus();
                return false;
            }
        }
        return true;
    },

    /*****************************************************************************
    ValidateDate: This function checks if the input has valid myspace url.
    Argument: 	element-	input to be validated 
    Argument: 	format -	date format 
    errorMsg-   message to alert
    Returns: true if valid
    *****************************************************************************/
    ValidateDate: function(element, errorMsg, format) {
        if (this.IsInvalidDate(element, format)) {
            alert(errorMsg);
            element.focus();
            return false;
        }
        return true;
    },

    /*****************************************************************************
    ValidatePhone: This function checks if the input has valid phone no..
    Argument: 	element-	 input to be validated 
    errorMsg- message to alert
    num- Minimum Number of digits required
    Returns: true if valid
    *****************************************************************************/
    ValidatePhone: function(element, errorMsg, num) {
        if (element.value.length < num || !this.IsInteger(element.value)) {
            alert(errorMsg);
            element.focus();
            return false;
        }
        return true;
    },

    /*****************************************************************************
    ValidateMySpaceUrl: This function checks if the input has valid myspace url.
    Argument: 	element- 	input to be validated 
    errorMsg-   message to alert
    - A length of less than 1 
    - A regular expression pattern that matches http://myspace.com/xyz or http://www.myspace.com/xyz 
    or www.myspace.com/xyz or myspace.com/xyz.
    Returns: true if valid; false otherwise.
    *****************************************************************************/
    ValidateMySpaceUrl: function(element, errorMsg) {
        var pattern = '^(http://myspace[.]com|http://www[.]myspace[.]com|www[.]myspace[.]com|myspace[.]com)/[_a-zA-Z0-9-]';
        if (element.value.length < 1 || this.ValidateRegEx(element.value, pattern) == false) {
            alert(errorMsg);
            element.focus();
            return false;
        }
        return true;
    },

    /*****************************************************************************
    ValidateUrl: This function checks if the input has valid URL.
    Argument: 	element- 	input to be validated 
    errorMsg-   message to alert
    - A length of less than 1 
    - A regular expression pattern that matches a URL
    Returns: true if valid; false otherwise.
    *****************************************************************************/
    ValidateUrl: function(element, errorMsg) {
        //var pattern = '^(?:http:\/\/)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$';
        var pattern = '^(?:http:\/\/)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}';
        if (element.value.length < 1 || this.ValidateRegEx(element.value, pattern) == false) {
            alert(errorMsg);
            element.focus();
            return false;
        }
        return true;
    },
    /*****************************************************************************
    ValidateEmail: This function checks if the input has valid Email Address.
    Argument: 	element-	    input to be validated 
    errorMsg-   message to alert
    Returns: true if valid; false otherwise.
    *****************************************************************************/
    ValidateEmail: function(element, errorMsg) {
        var emailFilter = /^.+@.+\..{2,3}$/;
        //test email for illegal characters
        var illegalChars = /[\(\)\<\>\,\;\:\\\"\[\]\s]/
        if (element.value < 1 || !(emailFilter.test(element.value)) || element.value.match(illegalChars)) {
            alert(errorMsg);
            element.focus();
            return false;
        }
        return true;
    },


    /*****************************************************************************
    ValidateCheckBox: This function checks if the input has been checked.
    Argument: 	element-	input to be validated 
    errorMsg-   message to alert
    Returns: true if valid
    *****************************************************************************/
    ValidateCheckBox: function(element, errorMsg) {
        if (!element.checked) {
            alert(errorMsg);
            return false;
        }
        return true;
    },

    /*****************************************************************************
    MergeAddress: This function will merge address1 and address2 into streetaddress
    *****************************************************************************/
    MergeAddress: function() {
        if (document.getElementById('address1') != null && document.getElementById('address2') != null && document.getElementById('streetAddress') != null) {
            document.getElementById('streetAddress').value = document.getElementById('address1').value + ', ' + document.getElementById('address2').value;
        }
    },

    /*****************************************************************************
    IsInvalidChar: This function checks if the input string has an invalid character.
    Argument: Character to be validated 
    -An invalid character has chars other than “0123456789 ()-“ 
    Returns: true if it has an invalid character; false otherwise;
    *****************************************************************************/
    IsInvalidChar: function(c) {
        var vC = "0123456789 ()-";
        if (vC.indexOf(c) < 0) { return true };
        return false;
    },

    /*****************************************************************************
    PhoneNumberMerge: This function concatenates the Phone number entered in 3 textboxes
    -Concatenates the values of pnumber1, pnumber2 and pnumber3 in pnumber.
    *****************************************************************************/
    PhoneNumberMerge: function() {
        var p1 = document.getElementById('pnumber1').value;
        var p2 = document.getElementById('pnumber2').value;
        var p3 = document.getElementById('pnumber3').value;

        var pTotal = '(' + p1 + ') ' + p2 + '-' + p3;
        document.getElementById("pnumber").value = pTotal;
    },

    /*****************************************************************************
    HasWhiteSpace: This function checks if the input string has any whitespace.
    Argument: String to be validated 
    Returns: true if it has whitespace; false otherwise;
    *****************************************************************************/
    HasWhiteSpace: function(s) {
        reWhiteSpace = new RegExp(/^\s+$/);

        // Check for white space
        if (reWhiteSpace.test(s))
            return true;

        return false;
    },

    /*****************************************************************************
    ValidateRegEx: Validates that a string matches a valid regular expression value.
    Arguments: 
    -strValue : String to be tested for validity
    -strMatchPattern : String containing a valid regular expression match pattern.
    Returns: true if valid; false otherwise.
    *****************************************************************************/
    ValidateRegEx: function(strValue, strMatchPattern) {
        var objRegExp = new RegExp(strMatchPattern);

        //check if string matches pattern
        return objRegExp.test(strValue);
    },

    /*****************************************************************************
    IsInvalidDate: Checks if the input string has an invalid date.
    Argument: String to be validated
    Argument: format -	date format 
    This function uses following helper functions: 
    -isDate 
    -daysInFebruary 
    -DaysArray 
    -stripCharsInBag 
    Returns: true if it has an invalid date; false otherwise.
    *****************************************************************************/
    IsInvalidDate: function(bdate, format) {
        var dtStr = new Date;
        dtStr = bdate.value;

        if (this.isDate(dtStr, bdate, format) == false) {
            return true;
        }
        return false;
    },

    isDate: function(dtStr, bdate, format) {
        var dtCh = "/";
        var minYear = 1900;
        var maxYear = 2100;
        var daysInMonth = this.DaysArray(12)
        var pos1 = dtStr.indexOf(dtCh)
        var pos2 = dtStr.indexOf(dtCh, pos1 + 1)
        var strMonth;
        var strDay;
        var strYear;

        //Format = 1: Non-US date format DD/MM/YYYY
        //Format = 0: US date format MM/DD/YYYY
        if (format == 1) {
            strDay = dtStr.substring(0, pos1)
            strMonth = dtStr.substring(pos1 + 1, pos2)
            strYear = dtStr.substring(pos2 + 1)
        }
        else {
            strMonth = dtStr.substring(0, pos1)
            strDay = dtStr.substring(pos1 + 1, pos2)
            strYear = dtStr.substring(pos2 + 1)
        }

        if (document.getElementById('bday') != null) {
            document.getElementById('bday').value = strDay;
        }
        if (document.getElementById('bmonth') != null) {
            document.getElementById('bmonth').value = strMonth;
        }
        if (document.getElementById('byear') != null) {
            document.getElementById('byear').value = strYear;
        }

        strYr = strYear
        if (strDay.charAt(0) == "0" && strDay.length > 1) strDay = strDay.substring(1)
        if (strMonth.charAt(0) == "0" && strMonth.length > 1) strMonth = strMonth.substring(1)
        for (var i = 1; i <= 3; i++) {
            if (strYr.charAt(0) == "0" && strYr.length > 1) strYr = strYr.substring(1)
        }

        month = parseInt(strMonth)
        day = parseInt(strDay)
        year = parseInt(strYr)
        if (pos1 == -1 || pos2 == -1) {
            //alert("The date format should be : mm/dd/yyyy")
            //document.getElementById(fieldName).focus();
            bdate.focus();
            return false;
        }
        if (strMonth.length < 1 || month < 1 || month > 12) {
            //alert("Please enter a valid month")
            //document.getElementById(fieldName).focus();
            bdate.focus();
            return false;
        }
        if (strDay.length < 1 || day < 1 || day > 31 || (month == 2 && day > this.daysInFebruary(year)) || day > daysInMonth[month]) {
            //alert("Please enter a valid day");
            //document.getElementById(fieldName).focus();
            bdate.focus();
            return false;
        }
        if (strYear.length != 4 || year == 0 || year < minYear || year > maxYear) {
            //alert("Please enter a valid 4 digit year between " + minYear + " and " + maxYear);
            //document.getElementById(fieldName).focus();
            bdate.focus();
            return false;
        }
        if (dtStr.indexOf(dtCh, pos2 + 1) != -1 || this.IsInteger(this.stripCharsInBag(dtStr, dtCh)) == false) {
            //alert("Please enter a valid date");
            //document.getElementById(fieldName).focus();
            bdate.focus();
            return false;
        }
        return true;
    },

    daysInFebruary: function(year) {
        // February has 29 days in any year evenly divisible by four,
        // EXCEPT for centurial years which are not also divisible by 400.
        return (((year % 4 == 0) && ((!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
    },

    DaysArray: function(n) {
        for (var i = 1; i <= n; i++) {
            this[i] = 31
            if (i == 4 || i == 6 || i == 9 || i == 11) { this[i] = 30 }
            if (i == 2) { this[i] = 29 }
        }
        return this;
    },

    stripCharsInBag: function(s, bag) {
        var i;
        var returnString = "";
        // Search through string's characters one by one.
        // If character is not in bag, append to returnString.

        for (i = 0; i < s.length; i++) {
            var c = s.charAt(i);
            if (bag.indexOf(c) == -1) returnString += c;
        }
        return returnString;
    },


    /*****************************************************************************
    IsInteger: Checks if the input string has only digits.
    Argument: String to be validated 
    Returns: true if it is an integer; false otherwise.
    *****************************************************************************/
    IsInteger: function(s) {
        var i;
        for (i = 0; i < s.length; i++) {
            // Check that current character is number.
            var c = s.charAt(i);
            if (((c < "0") || (c > "9"))) return false;
        }
        // All characters are numbers.
        return true;
    },

    /*****************************************************************************
    CheckFieldLength: Checks the length of the data entered by the user in a control like textarea.
    Arguments: 
    - Control to be checked for length. 
    - Name of the control that contains the character count. 
    - Name of the control that contains the remaining character count. 
    - Maximum char’s that can be entered by the user. 
    Ex:       
    <textarea class="commentBox" name="comment" id="comment" cols="15" style="overflow:auto;" rows="10" 
    onmouseout="CheckFieldLength(comment, 'charcount', 'remaining', 250);" 
    onkeydown="CheckFieldLength(comment, 'charcount', 'remaining', 250);" 
    onkeyup="CheckFieldLength(comment, 'charcount', 'remaining', 250);"></textarea>
    <label class="maxtext">
    <span id="charcount">0</span> chars. entered | <span id="remaining">250</span> chars. remaining
    </label>
    *****************************************************************************/
    CheckFieldLength: function(fn, wn, rn, mc) {
        var len = fn.value.length;
        if (len > mc) {
            fn.value = fn.value.substring(0, mc);
            len = mc;
        }
        document.getElementById(wn).innerHTML = len;
        document.getElementById(rn).innerHTML = mc - len;
    },

    /************************* Media File Upload section START **************************/


    /*****************************************************************************
    makeText: Sets value of hidden field filename to a unique name.
    - Calls function S4() which creates the file name using random numbers
    *****************************************************************************/
    makeText: function() {
        //alert(S4() + "-" + S4());
        document.getElementById("filename").value = S4() + "-" + S4();
    },

    S4: function() {
        var rndNum = Math.floor((Math.random()) * 10000);

        if (rndNum > 999)
            return rndNum;
        else if (rndNum > 99)
            return "0" + rndNum
        else if (rndNum > 9)
            return "00" + rndNum
        else
            return "000" + rndNum
    },

    /*****************************************************************************
    ExtensionValidator: Checks if the uploaded file has one of the 3 character accepted extensions.
    Argument: Upload file control to be validated with the name/id ‘uploadFile’ 
    - This function sets all accepted extensions in variable ext3. It only checks for 3 character extensions. 
    - If the extension is valid, it also sets the hidden field ‘filetype’ to this extension. 
    Returns: True if it has a valid extension; false otherwise
    *****************************************************************************/
    ExtensionValidator: function(idName) {
        var fileName = document.getElementById(idName).value;
        var extension = fileName.substring(fileName.length - 3, fileName.length);
        var extension2 = fileName.substring(fileName.length - 4, fileName.length);

        var ext3 = extension.toLowerCase();
        var ext4 = extension2.toLowerCase()

        if (ext3 == 'mp3' || ext3 == 'avi' || ext3 == 'wav' || ext3 == 'aac' || ext3 == 'aif' || ext3 == 'iff' || ext3 == 'm3u' || ext3 == 'mid' || ext3 == 'mpa' || ext3 == 'wma' || ext3 == 'ram' || ext3 == '.ra') {
            document.getElementById('filetype').value = ext3;
            return true;
        }
        else {
            return false;
        }
    },

    /*****************************************************************************
    LongExtensionCheck: Checks if the uploaded file has one of the 4 character accepted extensions from
    the control ‘uploadFile’.
    - This function sets all accepted extensions in variable ext4. It only checks for 4 character extensions. 
    - If the extension is valid, it also sets the hidden field ‘filetype’ to this extension. 
    Returns: True if it has a valid extension; false otherwise
    *****************************************************************************/
    LongExtensionCheck: function() {
        var fileName = document.getElementById('uploadFile').value;
        var extension2 = fileName.substring(fileName.length - 4, fileName.length);
        var ext4 = extension2.toLowerCase()

        if (ext4 == 'mpeg' || ext4 == 'midi') {
            document.getElementById('filetype').value = ext4;
            return true;
        }
        else {
            alert('Unacceptable file type.  Please select a different audio file to submit.');
            return false;
        }
        return false;
    },

    /*****************************************************************************
    ClearValue: Clears the value of control of type file, named 'uploadFile'.
    *****************************************************************************/
    ClearValue: function() {
        alert('Please use the browse button to locate and select the audio file you would like to upload');
        document.getElementById('uploadFile').value = "";
    },
    getFunctionName: function(func) {
        if (typeof func == "function" || typeof func == "object")
            var fName = ("" + func).match(/function\s*([\w\$]*)\s*\(/);
        if (fName !== null) return fName[1];
    },
    FormatString: function(text) {
        if (arguments.length <= 1)
            return text;

        var tokenCount = arguments.length - 2;

        for (var token = 0; token <= tokenCount; token++) {
            text = text.replace(new RegExp('\\{' + token + '\\}', 'gi'),
			arguments[token + 1]);
        }

        return text;
    }
    /************************** Media File Upload section END ***************************/

}