YAHOO.widget.Dialog | Dialog is an implementation of Panel that can be used to submit form data. |
Dialog.js
Quick Links:
Class Summary |
Source Code
Class Summary [top]
Souce Code [top]
/** Copyright (c) 2006, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.net/yui/license.txt * @class * Dialog is an implementation of Panel that can be used to submit form data. Built-in functionality for buttons with event handlers is included, and button sets can be build dynamically, or the preincluded ones for Submit/Cancel and OK/Cancel can be utilized. Forms can be processed in 3 ways -- via an asynchronous Connection utility call, a simple form POST or GET, or manually. * @param {string} el The element ID representing the Dialog <em>OR</em> * @param {Element} el The element representing the Dialog * @param {object} userConfig The configuration object literal containing the configuration that should be set for this Dialog. See configuration documentation for more details. * @constructor */ YAHOO.widget.Dialog = function(el, userConfig) { YAHOO.widget.Dialog.superclass.constructor.call(this, el, userConfig); } YAHOO.extend(YAHOO.widget.Dialog, YAHOO.widget.Panel); /** * Constant representing the default CSS class used for a Dialog * @type string * @final */ YAHOO.widget.Dialog.CSS_DIALOG = "dialog"; /** * CustomEvent fired prior to submission * @type YAHOO.util.CustomEvent */ YAHOO.widget.Dialog.prototype.beforeSubmitEvent = null; /** * CustomEvent fired after submission * @type YAHOO.util.CustomEvent */ YAHOO.widget.Dialog.prototype.submitEvent = null; /** * CustomEvent fired prior to manual submission * @type YAHOO.util.CustomEvent */ YAHOO.widget.Dialog.prototype.manualSubmitEvent = null; /** * CustomEvent fired prior to asynchronous submission * @type YAHOO.util.CustomEvent */ YAHOO.widget.Dialog.prototype.asyncSubmitEvent = null; /** * CustomEvent fired prior to form-based submission * @type YAHOO.util.CustomEvent */ YAHOO.widget.Dialog.prototype.formSubmitEvent = null; /** * CustomEvent fired after cancel * @type YAHOO.util.CustomEvent */ YAHOO.widget.Dialog.prototype.cancelEvent = null; /** * Initializes the class's configurable properties which can be changed using the Dialog's Config object (cfg). */ YAHOO.widget.Dialog.prototype.initDefaultConfig = function() { YAHOO.widget.Dialog.superclass.initDefaultConfig.call(this); /** * The internally maintained callback object for use with the Connection utility * @type object * @private */ this.callback = { success : null, failure : null, argument: null, scope : this } this.doSubmit = function() { var method = this.cfg.getProperty("postmethod"); switch (method) { case "async": YAHOO.util.Connect.setForm(this.form.name); var cObj = YAHOO.util.Connect.asyncRequest('POST', this.form.action, this.callback); this.asyncSubmitEvent.fire(); break; case "form": this.form.submit(); this.formSubmitEvent.fire(); break; case "none": case "manual": this.manualSubmitEvent.fire(); break; } } // Add form dialog config properties // this.cfg.addProperty("postmethod", { value:"async", validator:function(val) { if (val != "form" && val != "async" && val != "none" && val != "manual") { return false; } else { return true; } } }); this.cfg.addProperty("buttons", { value:"none", handler:this.configButtons } ); } /** * Initializes the custom events for Dialog which are fired automatically at appropriate times by the Dialog class. */ YAHOO.widget.Dialog.prototype.initEvents = function() { YAHOO.widget.Dialog.superclass.initEvents.call(this); this.beforeSubmitEvent = new YAHOO.util.CustomEvent("beforeSubmit"); this.submitEvent = new YAHOO.util.CustomEvent("submit"); this.manualSubmitEvent = new YAHOO.util.CustomEvent("manualSubmit"); this.asyncSubmitEvent = new YAHOO.util.CustomEvent("asyncSubmit"); this.formSubmitEvent = new YAHOO.util.CustomEvent("formSubmit"); this.cancelEvent = new YAHOO.util.CustomEvent("cancel"); } /** * The Dialog initialization method, which is executed for Dialog and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. * @param {string} el The element ID representing the Dialog <em>OR</em> * @param {Element} el The element representing the Dialog * @param {object} userConfig The configuration object literal containing the configuration that should be set for this Dialog. See configuration documentation for more details. */ YAHOO.widget.Dialog.prototype.init = function(el, userConfig) { YAHOO.widget.Dialog.superclass.init.call(this, el/*, userConfig*/); // Note that we don't pass the user config in here yet because we only want it executed once, at the lowest subclass level this.beforeInitEvent.fire(YAHOO.widget.Dialog); YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Dialog.CSS_DIALOG); this.cfg.setProperty("visible", false); if (userConfig) { this.cfg.applyConfig(userConfig, true); } this.renderEvent.subscribe(this.registerForm, this, true); this.showEvent.subscribe(this.focusFirst, this, true); this.beforeHideEvent.subscribe(this.blurButtons, this, true); this.beforeRenderEvent.subscribe(function() { var buttonCfg = this.cfg.getProperty("buttons"); if (buttonCfg && buttonCfg != "none") { if (! this.footer) { this.setFooter(""); } } }, this, true); this.initEvent.fire(YAHOO.widget.Dialog); } /** * Prepares the Dialog's internal FORM object, creating one if one is not currently present. */ YAHOO.widget.Dialog.prototype.registerForm = function() { var form = this.element.getElementsByTagName("FORM")[0]; if (! form) { var formHTML = "<form name=\"frm_" + this.id + "\" action=\"\"></form>"; this.body.innerHTML += formHTML; form = this.element.getElementsByTagName("FORM")[0]; } this.firstFormElement = function() { for (var f=0;f<form.elements.length;f++ ) { var el = form.elements[f]; if (el.focus) { if (el.type && el.type != "hidden") { return el; break; } } } return null; }(); this.lastFormElement = function() { for (var f=form.elements.length-1;f>=0;f-- ) { var el = form.elements[f]; if (el.focus) { if (el.type && el.type != "hidden") { return el; break; } } } return null; }(); this.form = form; if (this.cfg.getProperty("modal") && this.form) { var me = this; var firstElement = this.firstFormElement || this.firstButton; if (firstElement) { this.preventBackTab = new YAHOO.util.KeyListener(firstElement, { shift:true, keys:9 }, {fn:me.focusLast, scope:me, correctScope:true} ); this.showEvent.subscribe(this.preventBackTab.enable, this.preventBackTab, true); this.hideEvent.subscribe(this.preventBackTab.disable, this.preventBackTab, true); } var lastElement = this.lastButton || this.lastFormElement; if (lastElement) { this.preventTabOut = new YAHOO.util.KeyListener(lastElement, { shift:false, keys:9 }, {fn:me.focusFirst, scope:me, correctScope:true} ); this.showEvent.subscribe(this.preventTabOut.enable, this.preventTabOut, true); this.hideEvent.subscribe(this.preventTabOut.disable, this.preventTabOut, true); } } } // BEGIN BUILT-IN PROPERTY EVENT HANDLERS // /** * The default event handler for the "buttons" configuration property */ YAHOO.widget.Dialog.prototype.configButtons = function(type, args, obj) { var buttons = args[0]; if (buttons != "none") { this.buttonSpan = null; this.buttonSpan = document.createElement("SPAN"); this.buttonSpan.className = "button-group"; for (var b=0;b<buttons.length;b++) { var button = buttons[b]; var htmlButton = document.createElement("BUTTON"); if (button.isDefault) { htmlButton.className = "default"; this.defaultHtmlButton = htmlButton; } htmlButton.appendChild(document.createTextNode(button.text)); YAHOO.util.Event.addListener(htmlButton, "click", button.handler, this, true); this.buttonSpan.appendChild(htmlButton); button.htmlButton = htmlButton; if (b == 0) { this.firstButton = button.htmlButton; } if (b == (buttons.length-1)) { this.lastButton = button.htmlButton; } } this.setFooter(this.buttonSpan); this.cfg.refireEvent("iframe"); this.cfg.refireEvent("underlay"); } else { // Do cleanup if (this.buttonSpan) { if (this.buttonSpan.parentNode) { this.buttonSpan.parentNode.removeChild(this.buttonSpan); } this.buttonSpan = null; this.firstButtom = null; this.lastButton = null; this.defaultHtmlButton = null; } } } /** * The default handler fired when the "success" property is changed. Used for asynchronous submission only. */ YAHOO.widget.Dialog.prototype.configOnSuccess = function(type,args,obj){}; /** * The default handler fired when the "failure" property is changed. Used for asynchronous submission only. */ YAHOO.widget.Dialog.prototype.configOnFailure = function(type,args,obj){}; /** * Executes a submission of the form based on the value of the postmethod property. */ YAHOO.widget.Dialog.prototype.doSubmit = function() {}; /** * The default event handler used to focus the first field of the form when the Dialog is shown. */ YAHOO.widget.Dialog.prototype.focusFirst = function(type,args,obj) { if (args) { var e = args[1]; if (e) { YAHOO.util.Event.stopEvent(e); } } if (this.firstFormElement) { this.firstFormElement.focus(); } else { this.focusDefaultButton(); } } /** * Sets the focus to the last button in the button or form element in the Dialog */ YAHOO.widget.Dialog.prototype.focusLast = function(type,args,obj) { if (args) { var e = args[1]; if (e) { YAHOO.util.Event.stopEvent(e); } } var buttons = this.cfg.getProperty("buttons"); if (buttons && buttons instanceof Array) { this.focusLastButton(); } else { if (this.lastFormElement) { this.lastFormElement.focus(); } } } /** * Sets the focus to the button that is designated as the default. By default, his handler is executed when the show event is fired. */ YAHOO.widget.Dialog.prototype.focusDefaultButton = function() { if (this.defaultHtmlButton) { this.defaultHtmlButton.focus(); } } /** * Blurs all the html buttons */ YAHOO.widget.Dialog.prototype.blurButtons = function() { var buttons = this.cfg.getProperty("buttons"); if (buttons && buttons instanceof Array) { var html = buttons[0].htmlButton; if (html) { html.blur(); } } } /** * Sets the focus to the first button in the button list */ YAHOO.widget.Dialog.prototype.focusFirstButton = function() { var buttons = this.cfg.getProperty("buttons"); if (buttons && buttons instanceof Array) { var html = buttons[0].htmlButton; if (html) { html.focus(); } } } /** * Sets the focus to the first button in the button list */ YAHOO.widget.Dialog.prototype.focusLastButton = function() { var buttons = this.cfg.getProperty("buttons"); if (buttons && buttons instanceof Array) { var html = buttons[buttons.length-1].htmlButton; if (html) { html.focus(); } } } // END BUILT-IN PROPERTY EVENT HANDLERS // /** * Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. This function, as implemented by default, always returns true, so it should be overridden if validation is necessary. */ YAHOO.widget.Dialog.prototype.validate = function() { return true; } /** * Executes a submit of the Dialog followed by a hide, if validation is successful. */ YAHOO.widget.Dialog.prototype.submit = function() { if (this.validate()) { this.beforeSubmitEvent.fire(); this.doSubmit(); this.submitEvent.fire(); this.hide(); return true; } else { return false; } } /** * Executes the cancel of the Dialog followed by a hide. */ YAHOO.widget.Dialog.prototype.cancel = function() { this.cancelEvent.fire(); this.hide(); } /** * Returns a JSON-compatible data structure representing the data currently contained in the form. * @return {object} A JSON object reprsenting the data of the current form. */ YAHOO.widget.Dialog.prototype.getData = function() { var form = this.form; var data = {}; if (form) { for (var i in this.form) { var formItem = form[i]; if (formItem) { if (formItem.tagName) { // Got a single form item switch (formItem.tagName) { case "INPUT": switch (formItem.type) { case "checkbox": data[i] = formItem.checked; break; case "textbox": case "text": case "hidden": data[i] = formItem.value; break; } break; case "TEXTAREA": data[i] = formItem.value; break; case "SELECT": var val = new Array(); for (var x=0;x<formItem.options.length;x++) { var option = formItem.options[x]; if (option.selected) { var selval = option.value; if (! selval || selval == "") { selval = option.text; } val[val.length] = selval; } } data[i] = val; break; } } else if (formItem[0] && formItem[0].tagName) { // this is an array of form items switch (formItem[0].tagName) { case "INPUT" : switch (formItem[0].type) { case "radio": for (var r=0; r<formItem.length; r++) { var radio = formItem[r]; if (radio.checked) { data[radio.name] = radio.value; break; } } break; case "checkbox": var cbArray = new Array(); for (var c=0; c<formItem.length; c++) { var check = formItem[c]; if (check.checked) { cbArray[cbArray.length] = check.value; } } data[formItem[0].name] = cbArray; break; } } } } } } return data; } /** * Returns a string representation of the object. * @type string */ YAHOO.widget.Dialog.prototype.toString = function() { return "Dialog " + this.id; }