/**
 * Grab bag of utilities functions, appropriately namespaced
 * @author derek
 */

YAHOO.namespace("dw.util.script");
YAHOO.namespace("dw.util.css");
YAHOO.namespace("dw.widget.table");
YAHOO.namespace("dw.widget.button");
YAHOO.namespace("dw.widget.dialog");
YAHOO.namespace("dw.event.dialog");
YAHOO.namespace("dw.event.table");
YAHOO.namespace("dw.validate");

YAHOO.dw.util.script.LOAD_FILTER = "DEBUG";

/**
 * Load a file as a source
 * @param {String} sFullPath Path to JavaScript file
 * @param {Function} fOnSuccess Optional. Execute on success.
 */
YAHOO.dw.util.script.load = function(sFullPath, fOnSuccess) {
    YAHOO.util.Get.script(sFullPath, {
        onFailure: function() {
            alert("Error loading file: " + sFullPath);
        },
        onSuccess: fOnSuccess
    });
}



/**
 * 
 * @param {String} sFullPath Path to CSS file
 */
YAHOO.dw.util.css.load = function(sFullPath) {
    YAHOO.util.Get.css(sFullPath, {
        onFailure: function() {
            alert("Error loading file: " + sFullPath);
        }
    });
}

/**
 * Loads an application module
 * @param {String} sModuleName Module name
 * @param {Function} fOnSuccess Optional
 */            
YAHOO.dw.util.script.loadAppModule = function(sModuleName, fOnSuccess) {
    YAHOO.dw.util.script.load(JS_HOME + "/" + sModuleName + ".js", fOnSuccess);
}

/**
 * 
 * @param {String} sParamName
 */
YAHOO.dw.util.script.getRequestParam = function(sParamName) {
    var sValue;
	
    YAHOO.dw.util.script.loadDwrRemote("ServletRemote");
	
    ServletRemote.getRequestParameter(sParamName, {
        async: false,
        callback: function(oResponse) {
            sValue = oResponse;
        }
    });
	
    return sValue;
}

YAHOO.dw.util.script.getCurrentUser = function() {
    var oUser;

    ServletRemote.getCurrentUser({
        async: false,
        callback: function(oResponse) {
            oUser = oResponse;
        }
    });


    return oUser;
}

/**
 * 
 */
YAHOO.dw.util.script.loadDwrEngine = function(fOnSuccess) {
    var fOnSuccessWrapper = fOnSuccess.wrap(
        function(fProceed) {
            // Error Handler
            //dwr.engine.setErrorHandler(YAHOO.dw.util.handleRemoteError);
            return fProceed;
        }
        )
    var loader = new YAHOO.util.YUILoader({
        name: "DWREngine",
        type: "js",
        fullpath: DWR_HOME + "/engine.js",
        onSuccess: fOnSuccessWrapper,
        onFailure: function(err) { 
            throw "Unable to load DWR Engine: " + err.msg;
        }
    });

    //loader.require("DWREngine");
    loader.insert();	
}

/**
 * 
 * @param {String} sRemoteName
 */
YAHOO.dw.util.script.loadDwrRemote = function(sRemoteName, fOnSuccess) {
	
    YAHOO.dw.util.script.loadDwrEngine(function() {
        var loader = new YAHOO.util.YUILoader({
            name: sRemoteName,
            type: "js",
            fullpath: DWR_HOME + "/interface/" + sRemoteName + ".js"
        });

        if (fOnSuccess) {
            loader.onSuccess = fOnSuccess;
        }

        loader.onFailure = function(err) {
            throw "Unable to load DWR Remote: " + sRemoteName + ": " + err.msg;
        }

        loader.insert();
    });
	
}

/**
 * Loads all of the YUI dependencies for a Dialog
 * @param {Function} fOnSuccess
 */
YAHOO.dw.util.script.loadDialogDeps = function(fOnSuccess) {
	
    var loader = new YAHOO.util.YUILoader({
        require: ["container"],
        loadOptional: true,
        onSuccess: fOnSuccess
    });
	
    loader.insert();
	
}

YAHOO.dw.util.script.loadContainerDeps = function(fOnSuccess) {
    YAHOO.dw.util.script.loadDialogDeps(fOnSuccess);
}

/**
 * Loads rich text editor dependencies
 * @param {Function} fOnSuccess
 */
YAHOO.dw.util.script.loadEditorDeps = function(fOnSuccess) {
    var loader = new YAHOO.util.YUILoader({
        require: ["editor", "connection"],
        base: YUI_BASEDIR,
        loadOptional: true,
        filter: "DEBUG",
        //        onSuccess: fOnSuccess
        onSuccess: function() {
            // load image uploader extension
            YAHOO.dw.util.script.load(JS_HOME + "/yui/yui-image-uploader.js", fOnSuccess);
        },
        onFailure: function(sMsg) {
            alert("Unable to load YUI editor: " + sMsg);
        }
    });
  
    loader.insert();
  
}

/**
 * 
 * @param {Function} fOnSuccess
 */
YAHOO.dw.util.script.loadDataTableDeps = function(fOnSuccess) {
    var loader = new YAHOO.util.YUILoader({
        base: YUI_BASEDIR,
        require: ["datatable"],
        filter: YAHOO.dw.util.script.LOAD_FILTER,
        loadOptional: true,
        onSuccess: fOnSuccess
    });
	
    loader.insert();
}

/**
 * 
 * @param {Function} fOnSuccess
 */
YAHOO.dw.util.script.loadEventDeps = function(fOnSuccess) {
    var loader = new YAHOO.util.YUILoader({
        require: ["event"],
        loadOptional: true,
        onSuccess: fOnSuccess,
        onFailure: function() {
            throw "Could not load YUI Event"
            }
    });
	
    loader.insert();
}

/**
 * 
 * @param {Function} fOnSuccess
 */
YAHOO.dw.util.script.loadEventDeps = function(fOnSuccess) {
    var loader = new YAHOO.util.YUILoader({
        require: ["event"],
        loadOptional: true,
        onSuccess: fOnSuccess,
        onFailure: function() {
            throw "Could not load YUI Event"
            }
    });
	
    loader.insert();
}

/**
 * 
 * @param {Function} fOnSuccess
 */
YAHOO.dw.util.script.loadTestDeps = function(fOnSuccess) {
    var loader = new YAHOO.util.YUILoader({
        base: YUI_BASEDIR,         
        require: ["yuitest"],
        filter: YAHOO.dw.util.script.LOAD_FILTER,
        loadOptional: true,
        onSuccess: fOnSuccess
    });
	
    loader.insert();
}

/**
 * 
 * @param {Function} fOnSuccess
 */
YAHOO.dw.util.script.loadButtonDeps = function(fOnSuccess) {
    var loader = new YAHOO.util.YUILoader({
        base: YUI_BASEDIR,         
        require: ["button"],
        filter: YAHOO.dw.util.script.LOAD_FILTER,
        loadOptional: true,
        onSuccess: fOnSuccess
    });
	
    loader.insert();
}
/**
 * 
 * @param {String} sError Error message
 */
YAHOO.dw.util.handleRemoteError = function(sError) {
    YAHOO.log(sError, "ERROR", "dw.util");
    alert(sError);
}

YAHOO.dw.util.handleRemoteErrorHideWaiting = function(sError) {
    YAHOO.dw.util.handleRemoteError(sError);
    YAHOO.dw.widget.dialog.WAIT.hide();
}

var _evTableDecorated;

/**
 * Decorates a table with YUI 
 * @param {String} sContainerId ID of the container to place decorated table
 * @param {String} sTableId HTML ID of the table to decorate
 * @param {Object} oResponseSchema
 * @param {Object} oColumnDefs
 * @param {Function} fBeforeCallback Function for doBeforeCallback
 */
YAHOO.dw.widget.table.decorateHtml = function(sContainerId, sTableId, oResponseSchema, oColumnDefs, fBeforeCallback) {
    _evTableDecorated = new YAHOO.util.CustomEvent(sTableId);
    YAHOO.dw.util.script.loadDataTableDeps(function() {
        var oDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get(sTableId));
        oDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE; 
        oDataSource.responseSchema = oResponseSchema;
        if (fBeforeCallback != null) {
            oDataSource.doBeforeCallback = fBeforeCallback;
        }

        var oConfigs = {
            paginator : new YAHOO.widget.Paginator({
                rowsPerPage    : 25
            }),
            renderLoopSize: 50
        };		
        var oDataTable = new YAHOO.widget.DataTable(sContainerId, oColumnDefs, oDataSource, oConfigs);
        _evTableDecorated.fire(oDataTable);
    });
    return _evTableDecorated;
}

/**
 * Decorates a BUTTON with YUI
 * @param {String} sButtonId
 * @param {Function} fOnClick
 * @param {String} sIconFile
 * @param {String} sType Button type (push, submit, etc.)
 */
YAHOO.dw.widget.button.decorateHtml = function(sButtonId, fOnClick, sIconFile, sType) {
    var oButton;
    
    YAHOO.dw.util.script.loadButtonDeps(function() {
        if (sType == null || sType == "") {
            sType = "push";
        }
        oButton = new YAHOO.widget.Button(sButtonId, {
            type: sType,
            menuclassname: "user_add"
        });
         
        if (fOnClick != null) {
            oButton.addListener("click", fOnClick);
        }
    })
    
    return oButton;
}


YAHOO.dw.widget.dialog.defaultUserConfig = {
    fixedcenter: true,
    visible: false,
    constraintoviewport : true,
    width: "400px",
    modal: true

};

/**
* 
 */
YAHOO.dw.widget.dialog.WAIT;

YAHOO.dw.event.dialog.WAIT_READY = new YAHOO.util.CustomEvent("waitDlgReadyEvent");
    
YAHOO.dw.widget.dialog.buildWaitDialog = function(sHeaderText) {
    
    if (YAHOO.dw.widget.dialog.WAIT == null) {
        YAHOO.dw.util.script.loadDialogDeps(function() {
            YAHOO.dw.widget.dialog.WAIT =
            new YAHOO.widget.Panel("wait",
            {
                width:"240px",
                fixedcenter:true,
                close:false,
                draggable:false,
                zindex:4,
                modal:true,
                visible:false
                    
            }
            );
               
            YAHOO.dw.widget.dialog.WAIT.setHeader(sHeaderText);
            YAHOO.dw.widget.dialog.WAIT.setBody('<img src="http://us.i1.yimg.com/us.yimg.com/i/us/per/gr/gp/rel_interstitial_loading.gif" />');
            YAHOO.dw.widget.dialog.WAIT.render(document.body);
               
            YAHOO.dw.event.dialog.WAIT_READY.fire(YAHOO.dw.widget.dialog.WAIT);
        });
    }
    else {
        YAHOO.dw.widget.dialog.WAIT.setHeader(sHeaderText);
        YAHOO.dw.event.dialog.WAIT_READY.fire(YAHOO.dw.widget.dialog.WAIT);
    }
}
/**
 * Opens a dialog with the provided parameters.
 * @param sMarkupId HTML ID
 */
YAHOO.dw.widget.dialog.drawDialog = function(sMarkupId, fHandleSubmit, fHandleCancel, fValidate, fDialogShow) {


    
    YAHOO.dw.util.script.loadDialogDeps(function() {
      
        var oDlg = new YAHOO.widget.Dialog(sMarkupId, YAHOO.dw.widget.dialog.defaultUserConfig);
        var aButtons = [];
        if (fHandleSubmit) {
            aButtons.push({
                text: "Submit",
                handler: fHandleSubmit,
                isDefault: true
            });
        }
    
        if (fHandleCancel) {
            aButtons.push({
                text: "Cancel",
                handler: fHandleCancel
            });
        }
        
        if (fValidate) {
            oDlg.validate = fValidate;
        }

        var obj = "";
        if (fDialogShow) {
            oDlg.beforeShowEvent.subscribe(fDialogShow, obj, true);
        }
        
        oDlg.cfg.queueProperty("buttons", aButtons);
        
        oDlg.render();
        oDlg.show();
        
    });

}

YAHOO.dw.widget.dialog.buildDialog = function(sMarkupID) {
    var oDlg;
    YAHOO.dw.util.script.loadDialogDeps(function() {
      
        oDlg = new YAHOO.widget.Dialog(sMarkupId, YAHOO.dw.widget.dialog.defaultUserConfig);
        return oDlg;
    });
}

YAHOO.dw.widget.tooltip = function(sElement, sText) {
    YAHOO.dw.util.script.loadContainerDeps(function() {
        var tooltip = new YAHOO.widget.Tooltip(sElement + "Tooltip", {
            context:sElement,
            text: "<div style='text-align:left'>" + sText + "</div>",
            showDelay:500
        } );
    });
}


YAHOO.dw.validate.execute = function(fValidationFunction, sFieldValue) {
    return fValidationFunction.validate(sFieldValue);
}


/**
 * Constructor for Validator
 */
YAHOO.dw.validate.Validator = function() {

    }

/**
 * Validate the parameter
 * @return true if sValue passes validation
 */
YAHOO.dw.validate.Validator.prototype.validate = function(sValue) {
    // override this
    return false;
}

/**
 * Gets the error message
 * @return (String) Error message
 */
YAHOO.dw.validate.Validator.prototype.getMessage = function() {
    // override this
    return "Invalid";
}

/**
 * Required validator
 */
YAHOO.dw.validate.RequiredValidator = function() {

    }

YAHOO.extend(YAHOO.dw.validate.RequiredValidator, YAHOO.dw.validate.Validator);

YAHOO.dw.validate.RequiredValidator.prototype.validate = function(sValue) {
    return (sValue != null && sValue != "");
}

YAHOO.dw.validate.EmailValidator = function () {
    
    }
YAHOO.extend(YAHOO.dw.validate.EmailValidator, YAHOO.dw.validate.Validator);
YAHOO.dw.validate.EmailValidator.prototype.validate = function(sValue) {
    var oEmailRegEx = new RegExp("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b", "i");
    return (sValue == null || sValue == "" || sValue.match(oEmailRegEx));
}
YAHOO.dw.validate.EmailValidator.prototype.getMessage = function() {
    return "Invalid email";
}

YAHOO.dw.validate.MinLengthValidator = function(nMinLength) {
    _nMinLength = nMinLength
}
YAHOO.extend(YAHOO.dw.validate.MinLengthValidator, YAHOO.dw.validate.Validator);
YAHOO.dw.validate.MinLengthValidator.prototype.validate = function(sValue) {
    return (sValue != null && sValue.length >= _nMinLength);
}
YAHOO.dw.validate.MinLengthValidator.prototype.getMessage = function() {
    return "Must be at least " + _nMinLength + " characters";
}

YAHOO.dw.validate.MustEqualValidator = function(sOtherFieldId) {
    _sOtherFieldId = sOtherFieldId;
}
YAHOO.dw.validate.MustEqualValidator.prototype.validate = function(sValue) {
    var sOtherValue = $F(_sOtherFieldId);
    return sOtherValue == sValue;
}
YAHOO.dw.validate.MustEqualValidator.prototype.getMessage = function() {
    return "Does not match";
}

YAHOO.dw.validate.REQUIRED = new YAHOO.dw.validate.RequiredValidator();
YAHOO.dw.validate.EMAIL = new YAHOO.dw.validate.EmailValidator();

