1 /* 2 * JBoss, Home of Professional Open Source 3 * Copyright ${year}, Red Hat, Inc. and individual contributors 4 * by the @authors tag. See the copyright.txt in the distribution for a 5 * full listing of individual contributors. 6 * 7 * This is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU Lesser General Public License as 9 * published by the Free Software Foundation; either version 2.1 of 10 * the License, or (at your option) any later version. 11 * 12 * This software is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this software; if not, write to the Free 19 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 20 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 21 */ 22 (function($, rf) { 23 24 var getGlobalStatusNameVariable = function() { 25 return rf.statusName; 26 } 27 28 var RICHFACES_AJAX_STATUS = "richfaces:ajaxStatus"; 29 30 var getStatusDataAttributeName = function(statusName) { 31 return statusName ? (RICHFACES_AJAX_STATUS + "@" + statusName) : RICHFACES_AJAX_STATUS; 32 }; 33 34 var statusAjaxEventHandler = function(data, methodName) { 35 if (methodName) { 36 //global status name 37 var statusName = getGlobalStatusNameVariable(); 38 var source = data.source; 39 40 var statusApplied = false; 41 var statusDataAttribute = getStatusDataAttributeName(statusName); 42 43 var statusContainers; 44 if (statusName) { 45 statusContainers = [$(document)]; 46 } else { 47 statusContainers = [$(source).parents('form'), $(document)]; 48 } 49 50 for (var containerIdx = 0; containerIdx < statusContainers.length && !statusApplied; 51 containerIdx++) { 52 53 var statusContainer = statusContainers[containerIdx]; 54 var statuses = statusContainer.data(statusDataAttribute); 55 if (statuses) { 56 for (var statusId in statuses) { 57 var status = statuses[statusId]; 58 var result = status[methodName].apply(status, arguments); 59 if (result) { 60 statusApplied = true; 61 } else { 62 delete statuses[statusId]; 63 } 64 } 65 66 if (!statusApplied) { 67 statusContainer.removeData(statusDataAttribute); 68 } 69 } 70 } 71 } 72 }; 73 74 var initializeStatuses = function() { 75 var thisFunction = arguments.callee; 76 if (!thisFunction.initialized) { 77 thisFunction.initialized = true; 78 79 var jsfEventsListener = rf.createJSFEventsAdapter({ 80 begin: function(event) { 81 statusAjaxEventHandler(event, 'start'); 82 }, 83 error: function(event) { 84 statusAjaxEventHandler(event, 'error'); 85 }, 86 success: function(event) { 87 statusAjaxEventHandler(event, 'success'); 88 }, 89 complete: function() { 90 rf.setGlobalStatusNameVariable(null); 91 } 92 }); 93 94 jsf.ajax.addOnEvent(jsfEventsListener); 95 //TODO blocks default alert error handler 96 jsf.ajax.addOnError(jsfEventsListener); 97 } 98 }; 99 100 rf.ui = rf.ui || {}; 101 102 rf.ui.Status = rf.BaseComponent.extendClass({ 103 104 name: "Status", 105 106 //TODO - support for parallel requests 107 init: function(id, options) { 108 this.id = id; 109 this.attachToDom(); 110 this.options = options || {}; 111 this.register(); 112 }, 113 114 register: function() { 115 initializeStatuses(); 116 117 var statusName = this.options.statusName; 118 var dataStatusAttribute = getStatusDataAttributeName(statusName); 119 120 var container; 121 if (statusName) { 122 container = $(document); 123 } else { 124 container = $(rf.getDomElement(this.id)).parents('form'); 125 if (container.length == 0) { 126 container = $(document); 127 } 128 ; 129 } 130 131 var statuses = container.data(dataStatusAttribute); 132 if (!statuses) { 133 statuses = {}; 134 container.data(dataStatusAttribute, statuses); 135 } 136 137 statuses[this.id] = this; 138 }, 139 140 start: function() { 141 if (this.options.onstart) { 142 this.options.onstart.apply(this, arguments); 143 } 144 145 return this.__showHide('.rf-st-start'); 146 }, 147 148 stop: function() { 149 this.__stop(); 150 return this.__showHide('.rf-st-stop'); 151 }, 152 153 success: function() { 154 if (this.options.onsuccess) { 155 this.options.onsuccess.apply(this, arguments); 156 } 157 return this.stop(); 158 }, 159 160 error: function() { 161 if (this.options.onerror) { 162 this.options.onerror.apply(this, arguments); 163 } 164 this.__stop(); 165 166 return this.__showHide(':not(.rf-st-error) + .rf-st-stop, .rf-st-error'); 167 }, 168 169 __showHide: function(selector) { 170 var element = $(rf.getDomElement(this.id)); 171 if (element) { 172 var statusElts = element.children(); 173 statusElts.each(function() { 174 var t = $(this); 175 t.css('display', t.is(selector) ? '' : 'none'); 176 }); 177 178 return true; 179 } 180 return false; 181 }, 182 183 __stop: function () { 184 if (this.options.onstop) { 185 this.options.onstop.apply(this, arguments); 186 } 187 } 188 }); 189 }(RichFaces.jQuery, window.RichFaces)); 190