// // $Id: ajax.js 11009 2010-10-26 11:20:48Z klerik $ // jQuery.extend({ ajaxRequest: function(url, params) { params = params || {}; params.method = params.method || 'get'; params.callback = params.callback || {}; params.pre_processing = params.pre_processing || {}; params.data = params.data || {}; params.message = params.message || lang.loading; params.caching = params.caching || false; params.hidden = params.hidden || false; params.low_priority = params.low_priority || false; params.force_exec = params.force_exec || false; var QUERIES_LIMIT = 1; if (jQuery.active_queries >= QUERIES_LIMIT) { // if we have queries in the queue, push request to it if (params.low_priority == true) { jQuery.queries_stack.push(function() { jQuery.ajaxRequest(url, params); }); } else { jQuery.queries_stack.unshift(function() { jQuery.ajaxRequest(url, params); }); } return true; } if (params.preload_obj && params.caching) { if (params.preload_obj.data('is_loaded')) { return true; } } // If query is not hidden, display loading box if (params.hidden == false) { jQuery.toggleStatusBox('show', params.message); } if (jQuery.ajax_cache[jQuery.last_hash]) { for (var id in jQuery.ajax_cache[jQuery.last_hash].data.html) { jQuery.ajax_cache[jQuery.last_hash].data.html[id] = $('#' + id).html(); } } var hash = ''; if (params.caching == true) { hash = jQuery.crc32(url + jQuery.param(params.data)); jQuery.last_hash = hash; } if (!hash || !jQuery.ajax_cache[hash]) { url = fn_query_remove(url, 'result_ids'); // Add result IDs to data if (params.result_ids) { params.data.result_ids = params.result_ids; } if (params.caching && params.store_init_content && !jQuery.ajax_cache.init_content) { jQuery.ajax_cache.init_content = {}; if (params.result_ids) { jQuery.ajax_cache.init_content.data = {}; jQuery.ajax_cache.init_content.data.html = {}; var ids = params.result_ids.split(','); for (var k = 0; k < ids.length; k++) { elm = $('#' + ids[k]); if (elm.length) { jQuery.ajax_cache.init_content.data.html[ids[k]] = elm.html(); } } } } if (url) { jQuery.active_queries++; jQuery.ajax({ type: params.method, url: url, dataType: 'json', cache: true, data: params.data, success: function(data, textStatus) { if (params.preload_obj) { if (params.preload_obj.data('is_loaded') && params.caching) { return false; } params.preload_obj.data('is_loaded', true); } if (hash) { // cache response jQuery.ajax_cache[hash] = data; } jQuery.ajaxResponse(data, params); }, error: function(XMLHttpRequest, textStatus, errorThrown) { // Hide loading box jQuery.toggleStatusBox('hide'); // If query is not hidden, display error notice if (params.hidden == false) { var err_msg = lang.error_ajax.str_replace('[error]', (textStatus ? textStatus : lang.error)); jQuery.showNotifications({'data': {'type': 'E', 'title': lang.error, 'message': err_msg, 'save_state': false}}); } }, complete: function(XMLHttpRequest, textStatus) { jQuery.active_queries--; if (jQuery.queries_stack.length) { var f = jQuery.queries_stack.shift(); f(); } } }); } } else if (hash && jQuery.ajax_cache[hash]) { jQuery.ajaxResponse(jQuery.ajax_cache[hash], params); } }, ajaxSubmit: function(form, elm) { var callback = 'fn_form_post_' + form.attr('name'); var f_callback = window[callback] || null; var REQUEST_XML = 1; var REQUEST_IFRAME = 2; if (form.attr('enctype') == 'multipart/form-data' && form.hasClass('cm-ajax')) { if (!$('iframe[name=upload_iframe]').length) { $('').appendTo('body'); $('iframe[name=upload_iframe]').load(function() { eval('var response = ' + $(this).contents().find('textarea').val()); jQuery.ajaxResponse(response, {callback: f_callback}); }); } form.append(''); form.attr('target', 'upload_iframe'); jQuery.ajaxRequest('', null); return true; } else { var hash = $(':input', form).serializeArray(); // Send name/value of clicked button hash.push({name: elm.attr('name'), value: elm.val()}); jQuery.ajaxRequest(form.attr('action'), { method: form.attr('method'), data: hash, callback: f_callback, force_exec: form.hasClass('cm-ajax-force') ? true : false }); return false; } }, ajaxResponse: function(response, params) { params = params || {}; params.force_exec = params.force_exec || false; params.callback = params.callback || {}; params.pre_processing = params.pre_processing || {}; var regex_all = new RegExp('', 'img'); var matches = []; var match = ''; var elm; var data = response.data || {}; // If pre processing function passed, run it if (params.pre_processing) { if (typeof(params.pre_processing) == 'function') { // call ordinary function params.pre_processing(data, params); } else if (params.pre_processing[1]) { // call object method [obj, 'meth'] params.pre_processing[0][params.pre_processing[1]](data, response.text, params); } } if (!jQuery.loaded_scripts) { jQuery.loaded_scripts = []; $('script').each(function() { var _src = $(this).attr('src'); if (_src) { jQuery.loaded_scripts.push(jQuery.getBaseName(_src)); } }) } // Ajax request forces browser to redirect if (data.force_redirection) { jQuery.redirect(data.force_redirection); } // Data returned that should be inserted to DOM if (data.html) { for (var k in data.html) { elm = $('#' + k); if (elm.length != 1) { continue; } matches = data.html[k].match(regex_all); elm.html(matches ? data.html[k].replace(regex_all, '') : data.html[k]); // Display/hide hidden block wrappers if (jQuery.trim(elm.html())) { elm.parents('.hidden.cm-hidden-wrapper').removeClass('hidden'); } else { elm.parents('.cm-hidden-wrapper').addClass('hidden'); } // If returned data contains scripts, execute them if (matches) { for (var i = 0; i < matches.length; i++ ) { var m = $(matches[i]); // External script if (m.attr('src')) { var _src = jQuery.getBaseName(m.attr('src')); if (jQuery.inArray(_src, jQuery.loaded_scripts) == -1) { jQuery.loaded_scripts.push(_src); m.appendTo('body'); } } else { var _hash = jQuery.crc32(m.html()); if (!this.eval_cache[_hash] || params.force_exec || m.hasClass('cm-ajax-force')) { this.eval_cache[_hash] = true; if (window.execScript) { window.execScript(m.html()); } else { window.eval(m.html()); } } } } } $(".cm-j-tabs", elm).each(function(){ $(this).idTabs(); }); // if returned data contains forms, process them if (data.html[k].indexOf('