
if (mwf == null) var mwf = {};

mwf.getValue = function( elementName )
{
    var element = $( elementName );
    var elementIsInput = element != null && dwr.util._isHTMLElement(element, "input");

    if (elementIsInput && element.disabled)
    {
        return null;
    }

    var result = dwr.util.getValue( elementName );

    if ( typeof( result ) == 'boolean' ) {
        // Gets around issue with DWR which returns false when no radio buttons selected

        // IE returns by name if not found by id so check in that instance for it matching by id we searched
        if ( (element == null) || (elementIsInput && (element.type == "radio")) ) {
            return null;
        } else {
            return result;
        }
    }
    else if ( (typeof( result ) == 'object') && (result.constructor == Array) && (result.length <= 1) ) {
        // DWR returns chechkboxes found by name (rather than id) as an array of value
        if ( result.length == 1 ) {
            return result[0];
        } else {
            return false;  // Assume "false" when unchecked
        }
    } else {
        return result;
    }
};

mwf.getRadioValue = function( form, radioName ) {
    var checkedRadio = Form.getInputs( form, 'radio', radioName ).find( function(radio) {
        return radio.checked;
    } );
    return checkedRadio != null ? checkedRadio.value : null;
};

mwf.setValue = function( elementName, value )
{
    dwr.util.setValue( elementName, value );
};

mwf.applyExceptionToErrorTemplate = function( lastReturned, exception, templateOuterId, templateTextId, defaultMessage )
{
    if ( lastReturned != null ) {
        // Remove the ones we added last time
        for ( var addedIndex = 0; addedIndex < lastReturned.added.length; addedIndex++ ) {
            lastReturned.added[addedIndex].parentNode.removeChild( lastReturned.added[addedIndex] );
        }
        // Remove the classes we added last time
        for ( var classedIndex = 0; classedIndex < lastReturned.classed.length; classedIndex++ ) {
            mwf.removeClassName( lastReturned.classed[classedIndex], 'formerrorlabel' );
        }
    }
    if ( exception != null ) {
        var nodesAdded = new Array;
        var nodesClassed = new Array;
        var errors;
        var setTagless = false;

        if ( exception.errors != null ) {
            errors = exception.errors;
        } else if ( exception.messages != null ) {
            errors = new Array;
            for ( var messageIndex = 0; messageIndex < exception.messages.length; messageIndex++ ) {
                errors[ errors.length ] = { description: exception.messages[ messageIndex ] };
            }
        } else {
            errors = [ { description: exception.message } ];
        }
        for ( var errorIndex = 0; errorIndex < errors.length; errorIndex++ ) {
            var error = errors[ errorIndex ];
            var fieldTopLevelNode = null;
            var clonedErrorNode;

            mwf.setValue( templateTextId, error.description );
            clonedErrorNode = dwr.util.cloneNode( templateOuterId );
            if ( error.tag != null ) {
                var searchNode = $(error.tag + "_outer");
                // Find the top table row before the form so we always deal with the top level tag produced row
                while ( (searchNode != null) && (searchNode.nodeName != "FORM")  ) {
                    if ( searchNode.nodeName == "TR" ) {
                        fieldTopLevelNode = searchNode;
                    }
                    searchNode = searchNode.parentNode;
                }
            }
            if ( fieldTopLevelNode != null ) {
                clonedErrorNode.parentNode.removeChild(clonedErrorNode);
                fieldTopLevelNode.parentNode.insertBefore(clonedErrorNode, fieldTopLevelNode);
                mwf.addClassName(fieldTopLevelNode, 'formerrorlabel');
                nodesClassed[ nodesClassed.length ] = fieldTopLevelNode;
            } else {
                setTagless = true;
            }
            clonedErrorNode.style.display = '';
            // Make it visible
            nodesAdded[ nodesAdded.length ] = clonedErrorNode;
        }
        if ( ! setTagless ) {
            mwf.setValue(templateTextId, defaultMessage);
            clonedErrorNode = dwr.util.cloneNode(templateOuterId);
            // Remove the icon <td>
            clonedErrorNode.firstChild.removeChild(clonedErrorNode.firstChild.firstChild);
            clonedErrorNode.style.display = '';
            // Make it visible
            nodesAdded[ nodesAdded.length ] = clonedErrorNode;
        }
        return { added:nodesAdded, classed:nodesClassed };
    } else {
        return null;
    }
};

mwf.hasClassName = function( element, className )
{
    return new RegExp( '\\b' + className + '\\b' ).test( element.className );
};

mwf.setClassName = function( element, className, on )
{
    if ( on ) {
        mwf.addClassName( element, className );
    } else {
        mwf.removeClassName( element, className );
    }
};

mwf.addClassName = function( element, className )
{
    if ( ! mwf.hasClassName( element, className ) ) {
        element.className += element.className ? ' '+ className : className;
    }
};

mwf.removeClassName = function( element, className )
{
    var rep = element.className.match( ' ' + className )? ' ' + className : className;
    element.className = element.className.replace( rep, '' );
};

mwf.show = function ( id )
{
    mwf.setVisible( id, true );
};

mwf.hide = function ( id )
{
    mwf.setVisible( id, false );
};

mwf.setVisible = function ( id, visible )
{
    $( id ).style.display = visible ? '' : 'none';
};

mwf.isEnterEvent = function( e )
{
    if ( window.event ) {
        return window.event.keyCode == 13;
    } else if ( e ) {
        return e.which == 13;
    } else {
        return false;
    }
};

mwf.Countdown = Class.create({
   initialize: function(element, millis, options) {
       this.element = $(element);

       this.options = options || {};
       this.options.isEnabled = ( this.options.isEnabled != null ? this.options.isEnabled : true );
       this.options.minName = this.options.minName || "min";
       this.options.secName = this.options.secName || "sec";
       this.options.prefix = this.options.prefix || "";
       this.options.suffix = this.options.suffix || "";
       this.options.finished = this.options.finished || "";

       this.finishTime = new Date();
       this.finishTime.setTime( this.finishTime.getTime() + millis );

       this.displayCountdown();
   },

   displayCountdown: function() {
        var milliSecondsRemaining = this.finishTime.getTime() - new Date().getTime();
        if( this.options.isEnabled && ( milliSecondsRemaining > 1000 ) ) {
            var minutes = Math.floor( milliSecondsRemaining / 60000 );
            var seconds = Math.floor( ( milliSecondsRemaining - ( minutes * 60000 ) ) / 1000 );
            var innerHTML = [];
            innerHTML.push( this.options.prefix );
            if ( milliSecondsRemaining > 60000 ) {
                innerHTML.push( "<strong>" + minutes + "</strong>" );
                innerHTML.push( this.options.minName );
            }
            innerHTML.push( "<strong>" + seconds + "</strong>" );
            innerHTML.push( this.options.secName );
            innerHTML.push( this.options.suffix );
            this.element.innerHTML = innerHTML.join( " " );
            this.startCountdown();
        } else {
            this.element.innerHTML = this.options.finished;
        }
    },

    stopCountdown: function() {
        this.options.isEnabled = false;
    },

    startCountdown: function() {
        this.options.isEnabled = true;
        var self = this;
        setTimeout( function() { self.displayCountdown(); }, 1000 );
    }




});