var CSB;
if (!CSB) CSB = {};
/*
    Usage:
    <script type="text/javascript">
        CSB.form_feedback("myform");
    </script>
    <form name="myform">
        My Money<input type="text" fmt="^[$][0-9]+(\.[0-9][0-9])?$" size="10" />
        <input type="submit"/>
    </form>

     CSS style csb-form-changed: if form element has been changed
               csb-form-error: if there is an error (set a regexp attribute fmt='[0-9]+')
viz:
.csb-form-changed { color:blue; }
.csb-form-error { color:red; }
*/

CSB.FMT_ATTR='fmt'
CSB.form_feedback=function(formname) {
    CSB.onload(function() {
        CSB.arm_form(formname);
    });
}
CSB.onload=function(func) {
    if(window.addEventHandler) {
        window.addEventHandler('load',func,false);
    } else if(window.attachEvent) {
        window.attachEvent('onload',func);
    } else {
        var old=window.onload;
        window.onload=function() {
            func(); if(old && old.constructor==Function) { old(); }
        }
    }
}
CSB.onunload=function(func) {
    if(window.addEventHandler) {
        window.addEventHandler('unload',func,false);
    } else if(window.attachEvent) {
        window.attachEvent('onunload',func);
    } else {
        var old=window.onunload;
        window.onunload=function() {
            func(); if(old && old.constructor==Function) { old(); }
        }
    }
}
CSB.arm_form=function(formname) {
    var form = window.document.forms[formname];
    if(!form) return;
    form.nerrors=0;
    var check=[];
    for(var i=0; i<form.elements.length;i++) {
        var elem=form.elements[i];
        if(elem.type=='hidden') { continue; }
        if(elem.type=='submit') { continue; }
        if(elem.type=='reset')  { continue; }
        setup(elem);
        var fmt=elem.getAttribute(CSB.FMT_ATTR)
        if(fmt) { 
            elem.fmt=new RegExp(fmt); 
            elem.verify=function() {
                return this.fmt.test(this.value)
            }
            check.push(elem)
        }

    }
    function setup(elem) {
        var dv=elem.defaultValue;
        var origvalue = dv?dv:elem.value;
        var onchange=elem.onchange;
        elem.onchange=function(e) {
            if(elem.value != origvalue) {
                CSB.elem_changed(elem);
                //if(elem.parentNode) CSB.elem_changed(elem.parentNode);
            } else {
                CSB.elem_unchanged(elem);
                //if(elem.parentNode) CSB.elem_unchanged(elem.parentNode);
            }
            if(onchange && onchange.constructor == Function) {
                onchange.apply(elem,[e])
            }
        }
    }
    var submit = form.onsubmit;
    form.onsubmit=function() {
        var errors=[];
        for(var i=0; i<check.length;i++) {
            if(!check[i].verify()) {
                errors.push(check[i]);
            }
        }
        if(errors.length>0) {
            if(!CSB.confirm(errors,formname)) {
                return false;
            }
        }
        if(submit) { return submit.apply(form,[]); }
        return true;
    }
}
CSB.confirm=function(errors,formname) {
    var nerrors=errors.length;
    var msg=nerrors==1?"There is an input problem in form "+formname:"There are "+nerrors+" entry problems for form " +formname
    return confirm(msg+"\nContinue submission?");
}
CSB.elem_changed =function(elem) {
    var cname=elem.className;
    if(!cname) {
        elem.className='csb-form-changed'
    } else if(!/csb-form-changed/.test(cname)) {
        elem.className +=' csb-form-changed'
    }
    if(!elem.verify) return;
    if(!elem.verify()) {
        var cname=elem.className;
        if(!cname) {
            elem.className='csb-form-error'
        } else if(!/csb-form-error/.test(cname)) {
            elem.className +=' csb-form-error'
        }
    } else {
        elem.className = elem.className.replace(/\s*csb-form-error/,'')
    }
}
CSB.elem_unchanged =function(elem) {
    elem.className = elem.className.replace(/\s*csb-form-changed/,'')
    elem.className = elem.className.replace(/\s*csb-form-error/,'')
}
