The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
// ------------------------------------------------------------------
function ConfirmChange ( id, text, contingent ) {
    this.ID = id;
    this.text = text;
    this.contingent = {};

    for( var q=0 ; q<contingent.length ; q++ ) {
        var id = contingent[ q ];
        var input = this.input( id );
        this.contingent[ id ] = input ? input.value : '';
    }

    // By doing this, our validate will get called
    FormatedField.register( this.ID, this );
}

// ------------------------------------------------------------------
ConfirmChange.prototype.input = function ( id ) {
    if( ! id ) 
        id = this.ID;
    return $( id );
}

// ------------------------------------------------------------------
ConfirmChange.prototype.validate = function ( on_submit ) {
    if( ! on_submit )
        return true;

    return this.verify();
}


// ------------------------------------------------------------------
ConfirmChange.prototype.verify = function ( on_submit ) {

    var formated = FormatedField.formated;
    // find if any element is changed
    for( var id in this.contingent ) {
        if( formated[ id ] && formated[ id ].changed ) {
            if( formated[ id ].changed() ) {
                return this.confirm( id );
            }
        }
        var input = this.input( id );
        if( input && input.value != this.contingent[ id ] ) {
            return this.confirm( id );
        }
    }
    return true;
}

// ------------------------------------------------------------------
ConfirmChange.prototype.confirm = function ( id ) {
    var input = this.input();
    input.value = 0;
    if( confirm( this.text ) ) {
        input.value = 1;
    }
    return true;
}