/* $Id: FieldMask.js,v 1.4 2004/03/24 03:15:58 hlfsousa Exp $ */

function FieldMask(format, backwards) {
    this.SEPARATORS = FieldMask_SEPARATORS;
    this.setMaskFor = new Function("field", "FieldMask_setMaskFor(field, this);");
    this.fieldKeyDown = FieldMask_fieldKeyDown;
    this.fieldKeyUp = FieldMask_fieldKeyUp;
    this.removeMask = new Function("return FieldMask_removeMask(this.pattern);");
    this.pattern = format;
    this.filter = this.removeMask();
    this.backwards = backwards;
    this.value = null;
}

var FieldMask_SEPARATORS = ".,:;/- ()";


function FieldMask_createRegExp(pattern) {
    if (!pattern)
        return "";
    var result = "";
    var character;
    for (var i = 0; i < pattern.length; i++) {
        character = pattern.charAt(i);
        if (character == "#")
            character = "\\d";
        else if (character == "@")
            character = "\\w";
        else if (mask.SEPARATORS.indexOf(character) == -1)
            character = "";
        result += character;
    }
    return result;
}

function FieldMask_setMaskFor(field, mask) {
    if (!field) return;
    if (field.attachEvent) {        // M$IE
        field.attachEvent("onkeydown", mask.fieldKeyDown);
        field.attachEvent("on" + "keyup", mask.fieldKeyUp);
    }
    else if (field.addEventListener) {    // W3C
        field.addEventListener("keydown", mask.fieldKeyDown, false);
        field.addEventListener("keyup", mask.fieldKeyUp, false);
    }
    field.fieldMask = mask;
}

function FieldMask_fieldKeyDown(e) {
    if (!e)
        e = window.event;     // M$IE
    var source;
    if (e.target) { // W3C
        source = e.target;
        if ((e.which >= 33 && e.which <= 40) || (e.which >= 16 && e.which <= 18)
        || e.which == 8 || e.which == 46)
            return true;
    }
    else if (e.srcElement) { // M$IE
        source = e.srcElement;
        if ((e.keyCode >= 33 && e.keyCode <= 40) || (e.keyCode >= 16 && e.keyCode <= 18)
        || e.keyCode == 8 || e.keyCode == 46)
            return true;
    }
    mask = source.fieldMask;
    if (!mask.value)
        mask.value = source.value;
    else
    if (mask.pattern.length <= source.value.length) {
        return true;
    }

    mask.value = null;
    return true;
}

function FieldMask_fieldKeyUp(e) {
    if (!e)
        e = window.event;     // M$IE
    var source;
    if (e.target) { // W3C
        source = e.target;
        if ((e.which >= 33 && e.which <= 40) || (e.which >= 16 && e.which <= 18)
        || e.which == 8 || e.which == 46)
            source.fieldMask.value = null;
    }
    else if (e.srcElement) { // M$IE
        source = e.srcElement;
        if ((e.keyCode >= 33 && e.keyCode <= 40) || (e.keyCode >= 16 && e.keyCode <= 18)
        || e.keyCode == 8 || e.keyCode == 46)
            source.fieldMask.value = null;
    }
    mask = source.fieldMask;

    if (mask.value != null) {
        if (source.value.length >= mask.value)
            source.value = mask.value;
        return false;
    }

    var newValue = "";
    var f = 0;
    var charRE;
    for (var i = 0; (i < source.value.length) && (f < mask.filter.length); i++) {
        charRE = FieldMask_createRegExp(mask.filter.charAt(i));
        if ((mask.SEPARATORS.indexOf(source.value.charAt(i)) == -1)
        && source.value.charAt(i).match(charRE)) {
            newValue += source.value.charAt(i);
            f++;
        }
    }

    newValue = FieldMask_formatValue(newValue, mask.pattern, mask.backwards);
    source.value = newValue;
    mask.value = null;
    return true;
}

function FieldMask_formatValue(value, pattern, backwards) {
    var regExp = "";
    var result = "";
    var i, p, finalI, finalP;
    if (backwards) {
        i = value.length - 1;
        p = pattern.length -1;
        finalI = -1;
        finalP = -1;
        increment = -1;
    }
    else {
        i = 0;
        p = 0;
        finalI = value.length;
        finalP = pattern.length;
        increment = 1;
    }

    while (p != finalP && i != finalI) {
        /*var msg = pattern + "[" + p + "] = " + pattern.charAt(p) + "\n" +
            value + "[" + i + "] = " + value.charAt(i);
        alert(msg); // debug */
        if (FieldMask_SEPARATORS.indexOf(pattern.charAt(p)) > -1)
            if (backwards)
                result = pattern.charAt(p) + result;
            else
                result += pattern.charAt(p);
        else {
            var regExp = FieldMask_createRegExp(pattern.charAt(p));
            if (value.charAt(i).match(regExp)) {
                if (backwards)
                    result = value.charAt(i) + result;
                else
                    result += value.charAt(i);
                i = i + increment;
            }
        }
        p = p + increment;
    }

    return result;
}

function FieldMask_removeMask(pattern) {
    var result = "";
    for (var i = 0; i < pattern.length; i++) {
        if (pattern.charAt(i) == "@" || pattern.charAt(i) == "#")
            result += pattern.charAt(i);
    }
    return result;
}

