/* -*- javascript -*-
     Copyright 2005 TJM Enterprises, Inc..
     All Rights Reserved
     System        : SV_FORMAT_JS :
     Object Name   : $RCS_FILE$
     Revision      : $REVISION$
     Date          : Tue Dec 27 16:55:11 2005
     Created By    : Bradford McKesson, TJM Enterprises, Inc.
     Created       : Tue Dec 27 16:55:11 2005

     Last Modified : <030310.0724>
     ID            : $Id: js.etf,v 2.5 2004/03/25 21:58:00 jon Exp $
     Source        : $Source: /export/cvs/cvsroot/me/macros/js.etf,v $
     Description
     Notes
     $Log: js.etf,v $
     Revision 2.5  2004/03/25 21:58:00  jon
     Final release from steve

*/
/* sv_format.js
 * various edit check / data entry / error reporting functions.
 */

var ns4 = document.layers;
var ie4 = document.all;
var nn6 = document.getElementById && !document.all;

function report_error(inField, inMsg) {
    window.dispatcher.error(inMsg);
    window.alert(inMsg);
    return true;
}

// format
// Verify whether inField has a Y or N or empty value.
// if not, complain.  To be called onblur
function html_yesno(inField, inOriginalValue) {
    if (inField.value.length > 0) {
        inField.value = inField.value.toUpperCase();
        if ((inField.value != 'Y') && (inField.value != 'N')) {
            report_error(inField, 'Only Y or N permitted');
            inField.value=inOriginalValue;
            inField.focus();
        }
    }
    return true;
}

// Enforce USPS address rules: Uppercase, no punctuation,
// one space between words.
function html_usps_text(inField, inOriginalValue) {
    inField.value = inField.value.toUpperCase();
    var re = new RegExp("[0-9A-Z]+", "g");
    var n = inField.value.match(re);
    if (n) {
        inField.value = n.join(' ');
    } else {
        // no data or data is completely invalid.
        inField.value = '';
    }
    return true;
}

// US ZIP is 5 or 9 or more digits.
// ### International zip can contain letters.
function html_usps_zip(inField, inOriginalValue) {
    inField.value = inField.value.toUpperCase();
    var re = new RegExp("[0-9]+", "g");
    var n = inField.value.match(re);
    if (n) {
        inField.value = n.join('');
    } else {
        // no data or data is completely invalid.
        inField.value = '';
    }

    // hyphen after first 5 digits
    if (inField.value.length > 5) {
        var f = inField.value.substr(0,5);
        var rest = inField.value.substr(5);
        inField.value = f + "-" + rest;
    }
    return true;

}

function html_restrict_to_values(inField, inOriginalValue, inRestrictRegex) {
    inField.value = inField.value.toUpperCase();
    var re = new RegExp(inRestrictRegex, "g");
    var n = inField.value.match(re);
    if (n) {
        inField.value = n.join('');
    } else {
        // no data or data is completely invalid.
        inField.value = '';
    }
    return true;
}


// Numeric values only
function html_digits(inField, inOriginalValue) {
    inField.value = inField.value.toUpperCase();
    var re = new RegExp("[0-9]+", "g");
    var n = inField.value.match(re);
    if (n) {
        inField.value = n.join('');
    } else {
        // no data or data is completely invalid.
        inField.value = '';
    }
    return true;

}

// Fill in the address form when user picks an existing address.
function select_existing_address(inField, inOriginalValue) {
    // alert('address change');
    if (inField.widget) {
        inField.widget.record.force_update(inField);
    }
    return true;
}

// Fill in the address form when user picks an existing address.
function select_existing_sv_region(inField, inOriginalValue) {
    // alert('region change');
    if (inField.widget) {
        inField.widget.record.force_update(inField);
    }
    return true;
}

// Format phone number
// Conventions for US phone number: AAA-EEE-NNNNxXXX
// The preceding 1 is optional, will be stripped if provided
// The extension is optional, all numbers after NNNN
// are assumed part of the extension.
function html_us_phone(inField, inOriginalValue) {
    var intl_prefix = '';
    var area_code = '';
    var local_exch = '';
    var local_number = '';
    var extension = '';

    var raw_number_re = new RegExp("[0-9]+", "g");
    var raw_number_list = inField.value.match(raw_number_re);
    if (!raw_number_list) {
        // no numbers in phone number field-- user deleted number
        // or typed letters
        return null;
    }
    var raw_number = raw_number_list.join('');
    if ((raw_number.length < 10) && (raw_number.length > 0)) {
        report_error(inField, 'phone number has less than 10 digits: '+raw_number);
        inField.focus();
    }

    if (raw_number.length > 0) {
        if (raw_number.charAt(0) == '1') {
            raw_number = raw_number.substr(1);
        }
        // intl_prefix = '1';

        area_code = raw_number.substr(0,3);
        raw_number = raw_number.substr(3);

        local_exch = raw_number.substr(0,3);
        raw_number = raw_number.substr(3);

        local_number = raw_number.substr(0,4);
        raw_number = raw_number.substr(4);

        if (raw_number.length > 0) {
            extension = raw_number;
        }

        var out_number = ''; //intl_prefix;

        out_number = out_number
                  + (area_code.length ? area_code : '')
                  + (local_exch.length ? '-'+local_exch : '')
                  + (local_number.length ? '-'+local_number : '')
                  + (extension.length ? 'x'+extension : '');

        inField.value = out_number;
    }
    return true;

}

// Format email
// convention: a@b.c
// a can contain letters [A-Za-z0-9_\.\-]
// b can contain [a-z0-9_\.\-]+
// c can contain letters [a-z0-9_\-]{1,}
// The more esoteric bits of RFC 2822 are not supported
// (quotes, spaces, punctuation in 'a', ip address for 'b.c')
// derived from http://www.ilovejackdaniels.com/php/email-address-validation/
function html_email(inField, inOriginalValue) {
    window.dispatcher.debug('html_email for '+inField.name);
    var strip_space_re = new RegExp('[^\\s]+', 'g');
    var cleanvalue = inField.value.match(strip_space_re);
    inField.value = cleanvalue.join('');

    var local_re = new RegExp('[A-Za-z0-9_+\\-][A-Za-z0-9_\\.+\\-]{0,62}', 'g');
    var domain_b_re = new RegExp('[a-z0-9_\\.+\\-]+', 'ig');
    var domain_c_re = new RegExp('[a-z0-9_\\.+\\-]+', 'ig');
    var parts = inField.value.split('@');

    var part_local = parts[0];
    if ((part_local.length == 0) || !parts[1]) {
        report_error(inField, '@ is required in email address and cannot be the first letter in the address');
        inField.focus();
        return true;
    }

    var i = parts[1].lastIndexOf('.');
    if (i == -1) {
        report_error(inField, 'At least one period is required in email address following the @');
        inField.focus();
        return true;
    }

    var part_domain_b = parts[1].substr(0, i);
    var part_domain_c = parts[1].substr(i+1);
    var a = part_local.match(local_re);
    var b = part_domain_b.match(domain_b_re);
    var c = part_domain_c.match(domain_c_re);

    if (a && b && c) {
        var new_email = a.join('') + '@' + b.join('') + '.' + c.join('');
        if (new_email != inField.value) {
            report_error(inField, 'An email address can only contain the characters A-Za-z0-9_.-+, exactly one @ sign and at least one period');
            inField.focus();
            return true;
        }
        inField.setValue(new_email);
    }

    return false;

}

