/* Add focus style to fields in browsers that don't support the :focus pseudo class */
function addFieldsFocusStyle() {
    var addFocusStyles = (BrowserDetect.browser == "Explorer");
    
    var inputs = document.getElementsByTagName("input");
    for (var i=0; i<inputs.length; i++) {
        if (inputs[i].type != 'checkbox') {
            setFieldFocusBlurEvents(inputs[i], addFocusStyles);
        }
    }
    var selects = document.getElementsByTagName("select");
    for (var i=0; i<selects.length; i++) {
        setFieldFocusBlurEvents(selects[i], addFocusStyles, true);
    }
    var textareas = document.getElementsByTagName("textarea");
    for (var i=0; i<textareas.length; i++) {
        setFieldFocusBlurEvents(textareas[i], addFocusStyles);
    }
}
function setFieldFocusBlurEvents(input, setStyles, select) {
    var showHint = document.getElementById(input.id + "_hint");
    
    if (setStyles && showHint) {
        input.onclick = function () {
            this.className += " focus";
            document.getElementById(this.id + "_hint").style.display = "inline";
        }
        input.onblur = function () {
            this.className = this.className.replace(/\b focus\b/g, "");
            document.getElementById(this.id + "_hint").style.display = "none";
        }
    } else if (setStyles) {
        input.onclick = function () {
            this.className += " focus";
        }
        input.onblur = function () {
            this.className = this.className.replace(/\b focus\b/g, "");
        }
    } else if (showHint) {
        input.onclick = function () {
            document.getElementById(this.id + "_hint").style.display = "inline";
        }
        input.onblur = function () {
            document.getElementById(this.id + "_hint").style.display = "none";
        }
    }
}

/* Login form validation */
function validateLogin(form) {
    var fields = new Array(2);
    fields[0] = new Array("screenname","text","Please enter your screen name.");
    fields[1] = new Array("password","text","Please enter your password.");
    return validateForm(form, fields);
}






function trim(str) {
    /* Remove any spaces at the beginning of the string */
    var i = -1;
    while(i < str.length && str.charAt(i + 1) == " ") i++;
    if (i > -1) str = i == str.length - 1 ? "" : str.substr(i + 1);

    /* Remove any spaces at the end of the string */
    i = str.length;
    while(i > 0 && str.charAt(i - 1) == " ") i--;
    if (i < str.length) str = str.substr(0, i);

    return str;
}

function removeSpaces(str) {
    var strippedStr = "";
    for (var i=0; i < str.length; i++) {
        if (str.charAt(i) != " ")
            strippedStr += str.substr(i, 1);
    }
    return strippedStr;
}

function isEmpty(trget) {
    var errors = 0;
    for (var i=0; i < trget.length; i++) {
        if(trget.charCodeAt(i) != 32) errors++;
    }

    return (errors == 0);
}

function isNumbers(trget) {
    if (trget.length <= 0) return false;
    for (var i=0; i < trget.length; i++) {
        code = trget.charCodeAt(i);
        if (code < 48 || code > 57){
            return false;
        }
    }
    return true;
}

function isMsidn (trget) {
    trget = removeSpaces(trget);
    if (trget.substr(0,2) == "++")
        trget = trget.substr(2);
    if (trget.substr(0,1) == "+")
        trget = trget.substr(1);
    if (!isNumbers(trget) || (trget.length > 14) || (trget.length < 5)) {
        return false;
    }
    return true;
}

function isRadio(trget) {
    radioOption = -1;
    for (counter=0; counter<trget.length; counter++) {
        if (trget[counter].checked) radioOption = counter;
    }
    if (radioOption == -1) {
         return false;
    }
    return true;
}


function isString(trget) {
    var count = 0;
    for(var i=0; i < trget.length; i++) {
         code = trget.charCodeAt(i);
         if ((code > 64 && code < 91) || (code > 96 && code < 123)){
            count++
        }
    }

    return (count > 0);
}

function checkPrice(price) {
    if (isNumbers(price))
        return price + ".00";
    else {
        var decimalPlace = price.indexOf(".");
        if (decimalPlace == -1 || price.indexOf(".") != decimalPlace || !isNumbers(price.replace(".", "")) || decimalPlace < price.length - 3)
            return false;
        else {
            if (decimalPlace > price.length - 3)
                price += (decimalPlace == price.length - 1 ? "0" : "") + "0";
            return price;
        }
    }
}

function checkMail(email){
    var atFirst = email.indexOf ('@');
    var atLast = email.lastIndexOf ('@');
    var len = email.length;
    var specialChar = " ~!#�$%^&*()+=`[]{};:,?/\\\"";
    var period = email.lastIndexOf ('.');

    if (atFirst != atLast || atFirst < 1 || atFirst > (len - 4)) return false;

    for (var i = 0; i < specialChar.length; i++) {
        if (email.indexOf (specialChar.substr(i, 1)) >= 0) return false;
    }

    if ((len - period < 3 || len - period > 5)) return false;

    return true;
}

function checkScreenname(screenname){
    var allowedChar = /^[^\d]+\w/;
    var notAllowedChar = /\s/;
    if(screenname.search(allowedChar) == -1) {
        return false;
    }
    if(screenname.search(notAllowedChar) != -1) {
        return false;
    }
    return true;
}

function checkMessage(message){
    var specialChar = "~#%^*()=`[]{};:/\\\"";
    for (var i = 0; i < specialChar.length; i++) {
        if (message.indexOf (specialChar.substr(i, 1)) >= 0) return false;
    }
    return true;
}


function MM_preloadImages() {
    var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() {
    var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) {
    var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
    if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
    for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
    if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() {
    var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
    if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function showPop(page) {
    window.open(page,'_blank','scrollbars=yes,resizable=yes,width=460,height=550');
}

function showHelp(layerName, visibility) {
    if (visibleLayer != "") {
        if (visibleLayer != layerName)
            showHelp(visibleLayer, 'hidden');
    }
    if (objInterval != null)
        clearInterval(objInterval);

    if (document.layers) { 
        layerRef="document.layers"; 
        styleSwitch=""; 
        visibleVar="show"; 
        screenSize = window.innerWidth; 
        what ="ns4"; 
    } else if (document.all) { 
        layerRef="document.all"; 
        styleSwitch=".style"; 
        visibleVar="visible"; 
        screenSize = document.body.clientWidth + 18; 
        what ="ie4"; 
    } else if (document.getElementById) { 
        layerRef="document.getElementByID"; 
        styleSwitch=".style"; 
        visibleVar="visible"; 
        what="dom1"; 
    } else { 
        what="none"; 
        newbrowser = false; 
    }

    if (what == "none") { 
        return; 
    } else if (what == "dom1") { 
        document.getElementById(layerName).style.visibility=visibility; 
    } else { 
        eval(layerRef+'["'+layerName+'"]'+styleSwitch+'.visibility=visibility'); 
    }

    if (visibility == 'visible')
        visibleLayer = layerName;
    else
        visibleLayer = "";
}
visibleLayer = "";
objInterval = null;

function hideHelp(layerName) {
    objInterval = setInterval("showHelp(visibleLayer,'hidden')", 500);
}

function showInMainWindow(url) {
    if (opener) {
        opener.location = "http://www.reporo.com/" + url;
        opener.focus();
        window.close();
    } else {
        this.location = "http://www.reporo.com/" + url;
    }
}

function luhnCheck(cardNbr) {
    if (!isNumbers(cardNbr))
        return false;
    if ((cardNbr == "4111111111111111") || (cardNbr == "1111222233334444"))
        return false;
    var result     = true;
    var ndx        = cardNbr.length - 1;
    var checkDigit = cardNbr.substr(ndx,1);
    var multiplier = 2;
    var accum      = 0;

    while(ndx) {
        var cardCh = cardNbr.substr(ndx - 1,1);
        if(cardCh >= 0 && cardCh <= 9) {
            var thisValue  = cardCh * multiplier;
            while(thisValue > 0) {
                accum += Math.floor(thisValue % 10);
                thisValue = Math.floor(thisValue / 10);
            }
            multiplier = (multiplier == 2 ? 1 : 2);
        }
        ndx--;
    }

    cc_checksum = ((10 - (accum % 10)) % 10);
    if(cc_checksum != checkDigit)
        result = false;

    return(result);
}

function changeCardType(cardType, frm) {
    var element = document.getElementById("cardMessage");
    if (element) {
        element.style.display = (cardType == "American Express" || cardType == "Diners Club") ? "block" : "none";
    }
    element = document.getElementById("issuenoField");
    if (element) {
        element.style.display = (cardType == "Maestro") || (cardType == "Solo") ? "block" : "none";
    }
    if ((cardType != "Maestro") && (cardType != "Solo")) {
        frm.issueno.value = "";
    }
}

function sameAddressesChanged(same) {
    element = document.getElementById('deliveryAddressFields');
    if (!element)
        return;
    if (same) {
        element.style.display = "none";
    } else {
        element.style.display = "";
    }
}

function postcodeLookup(fieldsPrefix) {
    showAddressFields(fieldsPrefix, false);
    showPop("pop_findaddress.jsp?prefix=" + fieldsPrefix);
}

function showAddressFields(fieldsPrefix, show) {
    element = document.getElementById("addressFields_" + fieldsPrefix);
    if (!element)
        return;
    if (show) {
        element.style.display = "";
    } else {
        element.style.display = "none";
    }
}

/* FORM VALIDATION */
function findIllegalChars(aFields) {
    var i, j, str;
    for (i=0; i < aFields.length; i++) {
        if (containsIllegalChars(aFields[i].value)) {
            aFields[i].focus();
            return true;
        }
    }
    return false;
}
function containsIllegalChars(str) {
    var i;
    var sIllegals = "~&!#%^*()+=`�[]{};:?/\\\"";
    for (i=0; i < str.length; i++) {
        if (sIllegals.indexOf(str.charAt(i)) > -1)
            return true;
    }
    return false;
}
function checkIE55() {
    var ua = navigator.userAgent.toLowerCase();
    return ((ua.indexOf('msie') != -1) && ((ua.indexOf('opera') == -1)) && (ua.indexOf('webtv') == -1) && (parseFloat(ua.substring(ua.indexOf('msie ') + 5)) == 5.5));
}

function validateForm(form, aFields) {
    var sErrorMessage = null;
    var i, field, label, invalid, type, textfield;
    for (i=0; i < aFields.length; i++) {
        field = form.elements[aFields[i][0]];
        if (document.getElementById)
            label = document.getElementById(aFields[i][0] + "_label");

        type = aFields[i][1];
        textfield = true;
        if (type == "text") {
            field.value = trim(field.value);
            invalid = isEmpty(field.value);
        } else if (type == "email") {
            field.value = trim(field.value);
            invalid = !checkMail(field.value);
        } else if (type == "message") {
            field.value = trim(field.value);
            invalid = isEmpty(field.value);
            invalid = !checkMessage(field.value);
            textfield = false;
        } else if (type == "screenname") {
            field.value = trim(field.value);
            invalid = isEmpty(field.value);
            invalid = !checkScreenname(field.value);
        } else if (type == "msisdn") {
            field.value = removeSpaces(field.value);
            if (field.value.substr(0,1) == "+")
                field.value = field.value.substr(1);
                invalid = (!isNumbers(field.value) || (field.value.length > 14) || (field.value.length < 5));
        } else if (type == "postcode") {
            field.value = trim(field.value);
            invalid = (removeSpaces(field.value).length < 5);
        } else if (type == "cardno") {
            field.value = removeSpaces(field.value);
            invalid = (!isNumbers(field.value)) || (!luhnCheck(field.value));
        } else if (type == "issueno") {
            field.value = trim(field.value);
            invalid = (field.value.length > 0) && !isNumbers(field.value);
        } else if (type == "secno") {
            field.value = trim(field.value);
            invalid = !isNumbers(field.value) || field.value.length > 4;
        } else if (type == "number") {
            field.value = trim(field.value);
            invalid = !isNumbers(field.value);
        } else if (type == "password") {
            field.value = trim(field.value);
            invalid = field.value.length < 6;
        } else if (type == "pin") {
            field.value = trim(field.value);
            invalid = !isNumbers(field.value) || (field.value.length != 4);
        } else if (type == "select") {
            invalid = field.selectedIndex == 0;
            textfield = false;
        } else if (type == "checkbox") {
            invalid = !field.checked;
            textfield = false;
        } else if (type == "radio") {
            invalid = (!isRadio(field));
            textfield = false;
        } else if (type == "text_invalid") {
            field.value = trim(field.value);
            invalid = true;
        } else if (type == "text_valid") {
            field.value = trim(field.value);
            invalid = false;
        } else if (type == "select_invalid") {
            invalid = true;
            textfield = false;
        } else if (type == "select_valid") {
            invalid = false;
            textfield = false;
        } else {
            invalid = false;
        }
        if (!invalid && textfield) {
            if (containsIllegalChars(field.value)) {
                invalid = true;
                if (sErrorMessage == null)
                    sErrorMessage = "Please ensure no fields include any of the following characters:\n ~ & ! # % ^ * ( ) + = ` ? [ ] { } < > ; : ? / \\ \"\n\n(" + aFields[i][0] + ")";
            }
        }

        if (invalid) {
            if (field && (!field.className || (field.className.indexOf("error") == -1))) {
                field.className += " error";
            }
            if (label && (!label.className || (label.className.indexOf("error") == -1))) {
                label.className += " error";
            }
            if (sErrorMessage == null) {
                sErrorMessage = aFields[i][2];
            }
        } else {
            if (field && field.className) {
                field.className = field.className.replace(/\berror\b/g, "");
            }
            if (label && (label.className)) {
                label.className = label.className.replace(/\berror\b/g, "");
            }
        }
    }
    if (sErrorMessage != null) {
        alert(sErrorMessage);
        return false;
    } else {
        return true;
    }
}
