]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - jssource/src_files/include/javascript/ajaxUI.js
Release 6.5.9
[Github/sugarcrm.git] / jssource / src_files / include / javascript / ajaxUI.js
1 /*********************************************************************************
2  * SugarCRM Community Edition is a customer relationship management program developed by
3  * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
4  * 
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Affero General Public License version 3 as published by the
7  * Free Software Foundation with the addition of the following permission added
8  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
9  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
10  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
11  * 
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
15  * details.
16  * 
17  * You should have received a copy of the GNU Affero General Public License along with
18  * this program; if not, see http://www.gnu.org/licenses or write to the Free
19  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301 USA.
21  * 
22  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
23  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
24  * 
25  * The interactive user interfaces in modified source and object code versions
26  * of this program must display Appropriate Legal Notices, as required under
27  * Section 5 of the GNU Affero General Public License version 3.
28  * 
29  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
30  * these Appropriate Legal Notices must retain the display of the "Powered by
31  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
32  * technical reasons, the Appropriate Legal Notices must display the words
33  * "Powered by SugarCRM".
34  ********************************************************************************/
35
36
37
38
39 SUGAR.ajaxUI = {
40     loadingWindow : false,
41     callback : function(o)
42     {
43         var cont;
44         if (typeof window.onbeforeunload == "function")
45             window.onbeforeunload = null;
46         scroll(0,0);
47         try{
48             var r = YAHOO.lang.JSON.parse(o.responseText);
49             cont = r.content;
50
51             if (r.title)
52             {
53                 document.title = html_entity_decode(r.title);
54             }
55             if (r.action)
56             {
57                 action_sugar_grp1 = r.action;
58             }
59             if (r.favicon)
60             {
61                 SUGAR.ajaxUI.setFavicon(r.favicon);
62             }
63
64             var c = document.getElementById("content");
65             // Bug #49205 : Subpanels fail to load when selecting subpanel tab
66             // hide content of placeholder before apply new one
67             // @see SUGAR.util.evalScript
68             c.style.visibility = 'hidden';
69             c.innerHTML = cont;
70             SUGAR.util.evalScript(cont);
71             // all javascripts have been processed - show content of placeholder
72             c.style.visibility = 'visible';
73
74             if ( r.moduleList)
75             {
76                 SUGAR.themes.setModuleTabs(r.moduleList);
77             }
78
79
80             // set response time from ajax response
81             if(typeof(r.responseTime) != 'undefined'){
82                 var rt = $("#responseTime");
83                 if(rt.length > 0){
84                     rt.html(rt.html().replace(/[\d]+\.[\d]+/, r.responseTime));
85                 }
86                 else if(typeof(logoStats) != "undefined"){
87                         $("#logo").attr("title", logoStats.replace(/[\d]+\.[\d]+/, r.responseTime)).tipTip({maxWidth: "auto", edgeOffset: 10});
88                 }
89             }
90             // Bug #49205 : Subpanels fail to load when selecting subpanel tab
91             // hide ajax loading message after all scripts are processed
92             SUGAR.ajaxUI.hideLoadingPanel();
93         } catch (e){
94             // Bug #49205 : Subpanels fail to load when selecting subpanel tab
95             // hide ajax loading message after all scripts are processed
96             SUGAR.ajaxUI.hideLoadingPanel();
97             SUGAR.ajaxUI.showErrorMessage(o.responseText);
98         }
99     },
100     showErrorMessage : function(errorMessage)
101     {
102         if (!SUGAR.ajaxUI.errorPanel) {
103                 SUGAR.ajaxUI.errorPanel = new YAHOO.widget.Panel("ajaxUIErrorPanel", {
104                     modal: false,
105                     visible: true,
106                     constraintoviewport: true,
107                     width       : "800px",
108                     height : "600px",
109                     close: true
110                 });
111             }
112             var panel = SUGAR.ajaxUI.errorPanel;
113             panel.setHeader(SUGAR.language.get('app_strings','ERR_AJAX_LOAD')) ;
114             panel.setBody('<iframe id="ajaxErrorFrame" style="width:780px;height:550px;border:none;marginheight="0" marginwidth="0" frameborder="0""></iframe>');
115             panel.setFooter(SUGAR.language.get('app_strings','ERR_AJAX_LOAD_FOOTER')) ;
116             panel.render(document.body);
117             SUGAR.util.doWhen(
118                                 function(){
119                                         var f = document.getElementById("ajaxErrorFrame");
120                                         return f != null && f.contentWindow != null && f.contentWindow.document != null;
121                                 }, function(){
122                                         document.getElementById("ajaxErrorFrame").contentWindow.document.body.innerHTML = errorMessage;
123                                         window.setTimeout('throw "AjaxUI error parsing response"', 300);
124                         });
125
126             //fire off a delayed check to make sure error message was rendered.
127             SUGAR.ajaxUI.errorMessage = errorMessage;
128             window.setTimeout('if((typeof(document.getElementById("ajaxErrorFrame")) == "undefined" || typeof(document.getElementById("ajaxErrorFrame")) == null  || document.getElementById("ajaxErrorFrame").contentWindow.document.body.innerHTML == "")){document.getElementById("ajaxErrorFrame").contentWindow.document.body.innerHTML=SUGAR.ajaxUI.errorMessage;}',3000);
129
130             panel.show();
131             panel.center();
132
133             throw "AjaxUI error parsing response";
134     },
135     canAjaxLoadModule : function(module)
136     {
137         var checkLS = /&LicState=check/.exec(window.location.search);
138
139         // Return false if ajax ui is completely disabled, or if license state is set to check
140         if( checkLS || (typeof(SUGAR.config.disableAjaxUI) != 'undefined' && SUGAR.config.disableAjaxUI == true)){
141             return false;
142         }
143         
144         var bannedModules = SUGAR.config.stockAjaxBannedModules;
145         //If banned modules isn't there, we are probably on a page that isn't ajaxUI compatible
146         if (typeof(bannedModules) == 'undefined')
147             return false;
148         // Mechanism to allow for overriding or adding to this list
149         if(typeof(SUGAR.config.addAjaxBannedModules) != 'undefined'){
150             bannedModules.concat(SUGAR.config.addAjaxBannedModules);
151         }
152         if(typeof(SUGAR.config.overrideAjaxBannedModules) != 'undefined'){
153             bannedModules = SUGAR.config.overrideAjaxBannedModules;
154         }
155         
156         return SUGAR.util.arrayIndexOf(bannedModules, module) == -1;
157     },
158
159     loadContent : function(url, params)
160     {
161         if(YAHOO.lang.trim(url) != "")
162         {
163             //Don't ajax load certain modules
164             var mRegex = /module=([^&]*)/.exec(url);
165             var module = mRegex ? mRegex[1] : false;
166             if (module && SUGAR.ajaxUI.canAjaxLoadModule(module))
167             {
168                 YAHOO.util.History.navigate('ajaxUILoc',  url);
169             } else {
170                 window.location = url;
171             }
172         }
173     },
174
175     go : function(url)
176     {
177
178         if(YAHOO.lang.trim(url) != "")
179         {
180             var con = YAHOO.util.Connect, ui = SUGAR.ajaxUI;
181             if (ui.lastURL == url)
182                 return;
183             var inAjaxUI = /action=ajaxui/.exec(window.location);
184             if (typeof (window.onbeforeunload) == "function" && window.onbeforeunload())
185             {
186                 //If there is an unload function, we need to check it ourselves
187                 if (!confirm(window.onbeforeunload()))
188                 {
189                     if (!inAjaxUI)
190                     {
191                         //User doesn't want to navigate
192                         window.location.hash = "";
193                     }
194                     else
195                     {
196                         YAHOO.util.History.navigate('ajaxUILoc',  ui.lastURL);
197                     }
198                     return;
199                 }
200                 window.onbeforeunload = null;
201             }
202             if (ui.lastCall && con.isCallInProgress(ui.lastCall)) {
203                 con.abort(ui.lastCall);
204             }
205             var mRegex = /module=([^&]*)/.exec(url);
206             var module = mRegex ? mRegex[1] : false;
207             //If we can't ajax load the module (blacklisted), set the URL directly.
208             if (!ui.canAjaxLoadModule(module)) {
209                 window.location = url;
210                 return;
211             }
212             ui.lastURL = url;
213             ui.cleanGlobals();
214             var loadLanguageJS = '';
215             if(module && typeof(SUGAR.language.languages[module]) == 'undefined'){
216                 loadLanguageJS = '&loadLanguageJS=1';
217             }
218
219             if (!inAjaxUI) {
220                 //If we aren't in the ajaxUI yet, we need to reload the page to get setup properly
221                 if (!SUGAR.isIE)
222                     window.location.replace("index.php?action=ajaxui#ajaxUILoc=" + encodeURIComponent(url));
223                 else {
224                     //if we use replace under IE, it will cache the page as the replaced version and thus no longer load the previous page.
225                     window.location.hash = "#";
226                     window.location.assign("index.php?action=ajaxui#ajaxUILoc=" + encodeURIComponent(url));
227                 }
228             }
229             else {
230                 SUGAR.ajaxUI.showLoadingPanel();
231                 ui.lastCall = YAHOO.util.Connect.asyncRequest('GET', url + '&ajax_load=1' + loadLanguageJS, {
232                     success: SUGAR.ajaxUI.callback,
233                     failure: function(){
234                         SUGAR.ajaxUI.hideLoadingPanel();
235                         SUGAR.ajaxUI.showErrorMessage(SUGAR.language.get('app_strings','ERR_AJAX_LOAD_FAILURE'));
236                     }
237                 });
238             }
239         }
240     },
241
242     submitForm : function(formname, params)
243     {
244         var con = YAHOO.util.Connect, SA = SUGAR.ajaxUI;
245         if (SA.lastCall && con.isCallInProgress(SA.lastCall)) {
246             con.abort(SA.lastCall);
247         }
248         //Reset the EmailAddressWidget before loading a new page
249         SA.cleanGlobals();
250         //Don't ajax load certain modules
251         var form = YAHOO.util.Dom.get(formname) || document.forms[formname];
252         if (SA.canAjaxLoadModule(form.module.value)
253             //Do not try to submit a form that contains a file input via ajax.
254             && typeof(YAHOO.util.Selector.query("input[type=file]", form)[0]) == "undefined"
255             //Do not try to ajax submit a form if the ajaxUI is not initialized
256             && /action=ajaxui/.exec(window.location))
257         {
258             var string = con.setForm(form);
259             var baseUrl = "index.php?action=ajaxui#ajaxUILoc=";
260             SA.lastURL = "";
261             //Use POST for long forms and GET for short forms (GET allow resubmit via reload)
262             if(string.length > 200)
263             {
264                 SUGAR.ajaxUI.showLoadingPanel();
265                 form.onsubmit = function(){ return true; };
266                 form.submit();
267             } else {
268                 con.resetFormState();
269                 window.location = baseUrl + encodeURIComponent("index.php?" + string);
270             }
271             return true;
272         } else {
273
274             if( typeof(YAHOO.util.Selector.query("input[type=submit]", form)[0]) != "undefined"
275                     && YAHOO.util.Selector.query("input[type=submit]", form)[0].value == "Save")
276             {
277                 ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_SAVING'));
278             }
279
280             form.submit();
281             return false;
282         }
283     },
284
285     cleanGlobals : function()
286     {
287         sqs_objects = {};
288         QSProcessedFieldsArray = {};
289         collection = {};
290         //Reset the EmailAddressWidget before loading a new page
291         if (SUGAR.EmailAddressWidget){
292             SUGAR.EmailAddressWidget.instances = {};
293             SUGAR.EmailAddressWidget.count = {};
294         }
295         YAHOO.util.Event.removeListener(window, 'resize');
296         //Hide any connector dialogs
297         if(typeof(dialog) != 'undefined' && typeof(dialog.destroy) == 'function'){
298             dialog.destroy();
299             delete dialog;
300         }
301
302     },
303     firstLoad : function()
304     {
305         // WebKit menu hack, to be used in theme style.js when setting superfish
306         SUGAR.ajaxUI.menuFix = true;
307         
308         //Setup Browser History
309         var url = YAHOO.util.History.getBookmarkedState('ajaxUILoc');
310         var aRegex = /action=([^&#]*)/.exec(window.location);
311         var action = aRegex ? aRegex[1] : false;
312         var mRegex = /module=([^&#]*)/.exec(window.location);
313         var module = mRegex ? mRegex[1] : false;
314         if (module != "ModuleBuilder")
315         {
316             var go = url != null || action == "ajaxui";
317             url = url ? url : 'index.php?module=Home&action=index';
318             YAHOO.util.History.register('ajaxUILoc', url, SUGAR.ajaxUI.go);
319             YAHOO.util.History.initialize("ajaxUI-history-field", "ajaxUI-history-iframe");
320             SUGAR.ajaxUI.hist_loaded = true;
321             if (go)
322                 SUGAR.ajaxUI.go(url);
323         }
324         SUGAR_callsInProgress--;
325     },
326     print: function()
327     {
328         var url = YAHOO.util.History.getBookmarkedState('ajaxUILoc');
329         SUGAR.util.openWindow(
330             url + '&print=true',
331             'printwin',
332             'menubar=1,status=0,resizable=1,scrollbars=1,toolbar=0,location=1'
333         );
334     },
335     showLoadingPanel: function()
336     {
337         if (!SUGAR.ajaxUI.loadingPanel)
338         {
339             SUGAR.ajaxUI.loadingPanel = new YAHOO.widget.Panel("ajaxloading",
340             {
341                 width:"240px",
342                 fixedcenter:true,
343                 close:false,
344                 draggable:false,
345                 constraintoviewport:false,
346                 modal:true,
347                 visible:false
348             });
349             SUGAR.ajaxUI.loadingPanel.setBody('<div id="loadingPage" align="center" style="vertical-align:middle;"><img src="' + SUGAR.themes.loading_image + '" align="absmiddle" /> <b>' + SUGAR.language.get('app_strings', 'LBL_LOADING_PAGE') +'</b></div>');
350             SUGAR.ajaxUI.loadingPanel.render(document.body);
351         }
352
353         if (document.getElementById('ajaxloading_c'))
354             document.getElementById('ajaxloading_c').style.display = '';
355         
356         SUGAR.ajaxUI.loadingPanel.show();
357
358     },
359     hideLoadingPanel: function()
360     {
361         SUGAR.ajaxUI.loadingPanel.hide();
362         
363         if (document.getElementById('ajaxloading_c'))
364             document.getElementById('ajaxloading_c').style.display = 'none';
365     },
366     setFavicon: function(data)
367     {
368         var head = document.getElementsByTagName("head")[0];
369
370         // first remove all rel="icon" links as long as updating an existing one
371         // could take no effect
372         var links = head.getElementsByTagName("link");
373         var re = /\bicon\b/i;
374         for (var i = 0; i < links.length; i++)        {
375             if (re.test(links[i].rel))
376             {
377                 head.removeChild(links[i]);
378             }
379         }
380
381         var link = document.createElement("link");
382
383         link.href = data.url;
384         // type attribute is important for Google Chrome browser
385         link.type = data.type;
386         link.rel = "icon";
387         head.appendChild(link);
388     }
389 };