1(function (_, $) { 2 var loadedScripts = {}; 3 var loadedScriptPromises = {}; 4 var sessionData = {}; 5 (function ($) { 6 var REQUEST_XML = 1; 7 var REQUEST_IFRAME = 2; 8 var REQUEST_COMET = 3; 9 var REQUEST_JSONP_POST = 5; 10 var QUERIES_LIMIT = 1; 11 var queryStack = []; 12 var activeQueries = 0; 13 var evalCache = {}; 14 var responseCache = {}; 15 var getScriptQueries = 0; 16 var oldjQuery = {}; 17 18 /* 19 * Public methods 20 */ 21 var methods = { 22 request: function (url, params) { 23 params = params || {}; 24 params.method = params.method || 'get'; 25 params.data = params.data || {}; 26 params.message = params.message || _.tr('loading'); 27 params.caching = params.caching || false; 28 params.hidden = params.hidden || false; 29 params.repeat_on_error = params.repeat_on_error || false; 30 params.force_exec = params.force_exec || false; 31 params.obj = params.obj || null; 32 params.append = params.append || null; 33 params.scroll = params.scroll || null; 34 params.overlay = params.overlay || null; 35 params.original_url = _.current_url || null; 36 params.get_promise = params.get_promise || null; 37 if (_.embedded) { 38 params.full_render = true; 39 } 40 if (params.full_render) { 41 params.data.full_render = params.full_render; 42 } 43 if (typeof params.data.security_hash == 'undefined' && typeof _.security_hash != 'undefined' && params.method.toLowerCase() == 'post') { 44 params.data.security_hash = _.security_hash; 45 } 46 if (params.result_ids) { 47 params.data.result_ids = params.result_ids; 48 } 49 if (params.skip_result_ids_check) { 50 params.data.skip_result_ids_check = params.skip_result_ids_check; 51 } 52 if (activeQueries >= QUERIES_LIMIT) { 53 // if we have queries in the queue, push request to it 54 var result = true; 55 if (params.get_promise) { 56 params.defered_object = methods.createDeferedObject(); 57 result = methods.createPromise(params.defered_object); 58 } 59 queryStack.unshift(function () { 60 methods.request(url, params); 61 }); 62 return result; 63 } 64 if (params.defered_object && params.defered_object.isAborted) { 65 params.defered_object.reject({}, 'abort', 'abort'); 66 methods.executeNext(); 67 return false; 68 } 69 70 // If query is not hidden, display loading box 71 if (params.hidden === false) { 72 $.toggleStatusBox('show', { 73 show_overlay: params.show_overlay, 74 overlay: params.overlay 75 }); 76 } 77 var hash = ''; 78 if (params.caching === true) { 79 hash = $.crc32(url + $.param(params.data)); 80 } 81 if (!hash || !responseCache[hash]) { 82 // Check, if we need to save all the input fields values from the updated element 83 var saved_data = {}; 84 var result_ids = params.data.result_ids ? params.data.result_ids.split(',') : []; 85 if (result_ids.length > 0) { 86 for (var j = 0; j < result_ids.length; j++) { 87 var container = $(document.getElementById(result_ids[j])); 88 var $save_fields_block = container.find('.cm-save-fields'); 89 if (container.hasClass('cm-save-fields')) { 90 saved_data[result_ids[j]] = $(':input:visible', container).serializeArray(); 91 } else if ($save_fields_block.length) { 92 saved_data[result_ids[j]] = $(':input:visible', $save_fields_block).serializeArray(); 93 } 94 } 95 params.saved_data = saved_data; 96 } 97 if (url) { 98 url = fn_query_remove(url, 'result_ids'); 99 if (url.indexOf('://') == -1) { 100 url = _.current_location + '/' + url; 101 } 102 if (params.obj && params.obj.hasClass('cm-comet')) { 103 params.url = url + '&result_ids=' + params.result_ids + '&is_ajax=' + REQUEST_COMET; 104 return transports.iframe(null, params, { 105 is_comet: true 106 }); 107 } else { 108 activeQueries++; 109 var data_type = !$.support.cors && url.indexOf('://' + window.location.hostname) == -1 ? 'jsonp' : 'json'; 110 if (!('is_ajax' in params.data) && data_type == 'json') { 111 params.data.is_ajax = REQUEST_XML; 112 } 113 if (sessionData.name && url.indexOf(sessionData.name) == -1) { 114 params.data[sessionData.name] = localStorage.getItem(sessionData.name); 115 } 116 var components = $.parseUrl(url); 117 if (components.anchor) { 118 params.data.anchor = components.anchor; 119 } 120 var jqXHR = $.ajax({ 121 type: params.method, 122 url: url, 123 dataType: data_type, 124 cache: true, 125 data: params.data, 126 xhrFields: { 127 withCredentials: true 128 }, 129 success: function (data, textStatus) { 130 if (hash) { 131 // cache response
132 responseCache[hash] = data; 133 } 134 _response(data, params); 135 }, 136 error: function (XMLHttpRequest, textStatus, errorThrown) { 137 if (textStatus === 'abort') { 138 // Hide loading box 139 $.toggleStatusBox('hide'); 140 return false; 141 } 142 143 // Repeat the query on the error response 144 if (params.repeat_on_error) { 145 params.repeat_on_error = false; 146 methods.request(url, params); 147 return false; 148 } 149 150 // Hide loading box 151 $.toggleStatusBox('hide'); 152 153 // If query is not hidden, display error notice 154 if (params.hidden === false && errorThrown) { 155 var err_msg = _.tr('error_ajax').str_replace('[error]', errorThrown); 156 $.ceNotification('show', { 157 type: 'E', 158 title: _.tr('error'), 159 message: err_msg 160 }); 161 } 162 if (params.error_callback && typeof params.error_callback == 'function') { 163 params.error_callback(XMLHttpRequest, textStatus, errorThrown); 164 } 165 }, 166 complete: function (XMLHttpRequest, textStatus) { 167 methods.executeNext(); 168 } 169 }); 170 if (params.get_promise) { 171 if (params.defered_object) { 172 var deferedObject = params.defered_object; 173 } else { 174 var deferedObject = methods.createDeferedObject(); 175 } 176 methods.bindXhrToDeferedObject(jqXHR, deferedObject); 177 return methods.createPromise(deferedObject); 178 } else { 179 return jqXHR; 180 } 181 } 182 } 183 } else if (hash && responseCache[hash]) { 184 var result = false;
185 _response(responseCache[hash], params); 186 if (params.get_promise) { 187 var deferedObject = methods.createDeferedObject(); 188 var result = methods.createPromise(deferedObject); 189 deferedObject.resolve(responseCache[hash]); 190 } 191 methods.executeNext(); 192 return result; 193 } 194 return false; 195 }, 196 submitForm: function (form, clicked_elm) { 197 if (activeQueries >= QUERIES_LIMIT) { 198 // if we have queries in the queue, push request to it 199 queryStack.unshift(function () { 200 var submit_name = clicked_elm.attr('name'), 201 submit_value = clicked_elm.val(), 202 input; 203 if (submit_name) { 204 input = $('<input>', { 205 type: 'hidden', 206 value: submit_value, 207 name: submit_name 208 }).appendTo(form); 209 } 210 if (methods.submitForm(form, clicked_elm)) { 211 form.get(0).submit(); 212 } 213 if (input) { 214 input.remove(); 215 } 216 }); 217 return false; // prevent default form submit 218 } 219 var params = { 220 form: form, 221 obj: clicked_elm, 222 scroll: clicked_elm.data('caScroll') || '', 223 overlay: clicked_elm.data('caOverlay') || '', 224 callback: 'ce.formajaxpost_' + form.prop('name') 225 }; 226 $.ceNotification('closeAll'); 227 $.toggleStatusBox('show', { 228 show_overlay: params.show_overlay, 229 overlay: params.overlay 230 }); 231 var options = _getOptions(form, params); 232 if (options.force_exec) { 233 params['force_exec'] = true; 234 } 235 if (sessionData.name) { 236 form.append('<input type="hidden" name="' + sessionData.name + '" value="' + localStorage.getItem(sessionData.name) + '">'); 237 } 238 if (options.full_render) { 239 form.append('<input type="hidden" name="full_render" value="Y">'); 240 } 241 form.append('<input type="hidden" name="is_ajax" value="' + (options.transport == 'iframe' ? options.is_comet ? REQUEST_COMET : REQUEST_IFRAME : options.transport == 'jsonpPOST' ? REQUEST_JSONP_POST : REQUEST_XML) + '">'); 242 return transports[options.transport](form, params, options); 243 }, 244 inProgress: function () { 245 return activeQueries !== 0; 246 }, 247 clearCache: function () { 248 responseCache = {}; 249 return true; 250 }, 251 response: function (response, params) { 252 return _response(response, params); 253 }, 254 executeNext: function () { 255 activeQueries--; 256 if (queryStack.length) { 257 var f = queryStack.shift(); 258 f(); 259 } 260 }, 261 createDeferedObject: function () { 262 var deferredObject = $.Deferred(); 263 deferredObject.jqXHR = null; 264 deferredObject.isAborted = false; 265 deferredObject.abort = function () { 266 deferredObject.isAborted = true; 267 if (deferredObject.jqXHR) { 268 deferredObject.jqXHR.abort(); 269 } 270 }; 271 return deferredObject; 272 }, 273 bindXhrToDeferedObject: function (jqXHR, deferredObject) { 274 jqXHR.done(deferredObject.resolve); 275 jqXHR.fail(deferredObject.reject); 276 deferredObject.jqXHR = jqXHR; 277 }, 278 createPromise: function (deferredObject) { 279 var promise = deferredObject.promise(); 280 promise.abort = function () { 281 deferredObject.abort(); 282 }; 283 return promise; 284 } 285 }; 286 287 /* 288 * AJAX transports 289 */ 290 var transports = { 291 /* 292 * Transport for file uploads or COMET requests 293 */ 294 iframe: function (form, params, options) { 295 var iframe = $('<iframe name="upload_iframe" src="about:blank" class="hidden"></iframe>').appendTo(_.body); 296 activeQueries++; 297 if (options.is_comet && $('#comet_control:visible').length === 0) { 298 $('#comet_container_controller').ceProgress('init'); 299 } 300 iframe.on('load', function () { 301 var response = {}; 302 var self = $(this); 303 if (self.contents().text() !== null) { 304 eval('var response = ' + self.contents().find('textarea').val()); 305 } 306 response = response || {}; 307 _response(response, params); 308 if (options.is_comet && jQuery.isEmptyObject(response) == false) { 309 if (typeof response.comet_is_finished === 'undefined') { 310 response.comet_is_finished = true; 311 } 312 if (response.comet_is_finished) {
313 $('#comet_container_controller').ceProgress('finish'); 314 } 315 $.ceEvent('trigger', 'ce.cometdone', [form, params, options, response]); 316 } 317 self.remove(); 318 activeQueries--; 319 if (queryStack.length) { 320 var f = queryStack.shift(); 321 f(); 322 } 323 }); 324 325 // We can send form, or open URL 326 if (form) { 327 form.prop('target', 'upload_iframe'); 328 } else if (params.url) { 329 if (params.method == 'post') { 330 $('<form class="hidden" action="' + params.url + '" method="post" target="upload_iframe"><input type="hidden" name="security_hash" value="' + _.security_hash + '"></form>').appendTo(_.body).submit(); 331 } else { 332 iframe.prop('src', params.url); 333 } 334 } 335 return true; 336 }, 337 /* 338 * Transport for requests via XMLHttpRequest(2) 339 */ 340 xml: function (form, params) { 341 if (form.hasClass('cm-outside-inputs')) { 342 var hash = form.serializeObject(); 343 } else { 344 var hash = $(':input', form).serializeObject(); 345 } 346 347 // Send name/value of clicked button 348 if (params.obj && params.obj.prop('name')) { 349 hash[params.obj.prop('name')] = params.obj.val(); 350 } 351 params['method'] = form.prop('method'); 352 params['data'] = hash; 353 params['result_ids'] = form.data('caTargetId'); 354 methods.request(form.prop('action'), params); 355 return false; // prevent default form action 356 }, 357 /* 358 * Transport for cross-domain form submit if XMLHttpRequest2 is not supported 359 */ 360 jsonpPOST: function (form, params, options) { 361 $.receiveMessage(function (e) { 362 if (options.is_comet) { 363 $('#comet_container_controller').ceProgress('finish'); 364 } 365 iframe.remove(); 366 _response($.parseJSON(e.data), params); 367 activeQueries--; 368 }); 369 var iframe = $('<iframe name="upload_iframe" src="about:blank" class="hidden"></iframe>').appendTo(_.body); 370 activeQueries++; 371 if (options.is_comet) { 372 $('#comet_container_controller').ceProgress('init'); 373 } 374 375 // We can send form, or open URL 376 if (form) { 377 form.prop('target', 'upload_iframe'); 378 } else if (params.url) { 379 iframe.prop('src', params.url); 380 } 381 return true; 382 } 383 }; 384 385 /* 386 * Private methods 387 */ 388 function _getOptions(obj, params) { 389 var is_comet = obj.hasClass('cm-comet') || params.obj && params.obj.hasClass('cm-comet'); 390 var transport = 'xml'; 391 var uploads = is_comet; 392 if (!is_comet && obj.prop('enctype') == 'multipart/form-data') { 393 obj.find('input[type=file]').each(function () { 394 if ($(this).val()) { 395 uploads = true; 396 } 397 }); 398 } 399 if ((!$.support.cors || _.embedded && uploads) && obj.prop('action').indexOf('//') != -1 && obj.prop('action').indexOf('//' + window.location.hostname) == -1 && obj.prop('method') == 'post') { 400 transport = 'jsonpPOST'; 401 } else if (uploads) { 402 transport = 'iframe'; 403 } 404 return { 405 'full_render': obj.hasClass('cm-ajax-full-render'), 406 'is_comet': is_comet, 407 'force_exec': obj.hasClass('cm-ajax-force'), 408 'transport': transport 409 }; 410 } 411 function _response(response, params) { 412 params = params || {}; 413 params.force_exec = params.force_exec || false; 414 params.pre_processing = params.pre_processing || {}; 415 416 // Use parameter 'data-no-execute="§"' to prevent the script from executing. 417 var regex_all = new RegExp('<script[^>§]*>([\u0001-\uFFFF]*?)</script>', 'img'); 418 var matches = []; 419 var match = ''; 420 var elm; 421 var data = response || {}; 422 var inline_scripts = null; 423 var scripts_to_load = []; 424 var elms = []; 425 var content; 426 427 // If pre processing function passed, run it 428 if (params.pre_processing && typeof params.pre_processing == 'function') { 429 params.pre_processing(data, params); 430 } 431 432 // Ajax request forces browser to redirect 433 if (data.force_redirection) { 434 // Hide loading box 435 $.toggleStatusBox('hide'); 436 $.redirect(data.force_redirection); 437 return true; 438 } 439 440 // add hashes of current scripts 441 if ($.isEmptyObject(evalCache)) { 442 $('script:not([src])').each(function () { 443 var self = $(this); 444 evalCache[$.crc32(self.html())] = true; 445 }); 446 } 447 if (data.html) { 448 for (var k in data.html) { 449 elm = $(document.getElementById(k)); 450 if (elm.length != 1 || data.html[k] === null) { 451 continue; 452 } 453 454 // If returned data contains forms and we're inside the form, move it to body 455 if (data.html[k].indexOf('<form') != -1 && elm.parents('form').length) { 456 $(_.body).append(elm); 457 } 458 matches = data.html[k].match(regex_all); 459 content = matches ? data.html[k].replace(regex_all, '')
459: data.html[k]; 460 461 // Clean up any editors initialized inside of the target DOM element 462 $('textarea.cm-wysiwyg', elm).each(function () { 463 $(this).ceEditor('destroy'); 464 }); 465 $.ceDialog('destroy_loaded', { 466 content: content 467 }); 468 if (params.append) { 469 elm.append(content); 470 } else { 471 elm.html(content); 472 } 473 $.ceDialog('destroy_loaded_post'); 474 475 // Restore saved data 476 if (typeof params.saved_data != 'undefined' && typeof params.saved_data[k] != 'undefined') { 477 var elements = []; 478 for (var i in params.saved_data[k]) { 479 elements[params.saved_data[k][i]['name']] = params.saved_data[k][i]['value']; 480 } 481 $(':input:visible', elm).each(function (id, local_elm) { 482 var jelm = $(local_elm); 483 if (typeof elements[jelm.prop('name')] != 'undefined' && !jelm.parents().hasClass('cm-skip-save-fields')) { 484 if (jelm.prop('type') == 'radio') { 485 if (jelm.val() == elements[jelm.prop('name')]) { 486 jelm.prop('checked', true); 487 } 488 } else { 489 jelm.val(elements[jelm.prop('name')]); 490 } 491 jelm.trigger('change'); 492 } 493 }); 494 } 495 496 // Display/hide hidden block wrappers 497 if (elm.html().trim()) { 498 elm.parents('.hidden.cm-hidden-wrapper').removeClass('hidden'); 499 } else { 500 elm.parents('.cm-hidden-wrapper').addClass('hidden'); 501 } 502 503 // If returned data contains scripts, execute them 504 var all_scripts = null, 505 ext_scripts = null; 506 if (matches) { 507 all_scripts = $(matches.join('\n')); 508 ext_scripts = all_scripts.filter('[src]'); 509 inline_scripts = inline_scripts ? inline_scripts.add(all_scripts.filter(':not([src])')) : all_scripts.filter(':not([src])'); 510 if (ext_scripts.length) { 511 for (var i = 0; i < ext_scripts.length; i++) { 512 var _src = ext_scripts.eq(i).prop('src'); 513 if (loadedScripts[_src]) { 514 if (ext_scripts.eq(i).hasClass('cm-ajax-force')) { 515 loadedScripts[_src] = null; 516 } else { 517 continue; 518 } 519 } 520 if (ext_scripts.eq(i).hasClass('cm-ajax-skip-load')) { 521 continue; 522 } 523 scripts_to_load.push($.getScript(_src)); 524 } 525 } 526 } 527 elms.push(elm); 528 } 529 530 // If content was updated inside in non-resizable dialog, reload it 531 if ($.ceDialog('inside_dialog', { 532 jelm: elm 533 })) { 534 $.ceDialog('reload_parent', { 535 jelm: elm 536 }); 537 } 538 if (response.title) { 539 $(document).prop('title', response.title); 540 } 541 } 542 var done_event = function () { 543 $.ceEvent('trigger', 'ce.ajaxdone', [elms, inline_scripts, params, data, response.text || '']); 544 }; 545 if (scripts_to_load.length) { 546 $.when.apply(null, scripts_to_load).then(done_event); 547 } else { 548 done_event(); 549 } 550 } 551 552 // Override default ajax method to get count of loaded scripts 553 var ajax = $.ajax; 554 $.ajax = function (origSettings) { 555 if (origSettings.dataType && origSettings.dataType === 'script') { 556 var _src = origSettings.url, 557 promise; 558 if (loadedScripts[_src]) { 559 promise = _src in loadedScriptPromises ? loadedScriptPromises[_src] : $.Deferred().resolve().promise(); 560 if ('success' in origSettings) { 561 promise.done(origSettings.success); 562 } 563 } else { 564 promise = ajax(origSettings); 565 loadedScripts[_src] = true; 566 loadedScriptPromises[_src] = promise; 567 } 568 return promise; 569 } 570 return ajax(origSettings); 571 }; 572
573 // Override getScript to prepend relative paths with full URL 574 $.getScript = function (url, callback) { 575 url = url.indexOf('//') == -1 ? _.current_location + '/' + url : url; 576 if (_.otherjQ && getScriptQueries === 0) { 577 oldjQuery = jQuery; 578 jQuery = _.$; 579 } 580 getScriptQueries++; 581 return $.ajax({ 582 type: "GET", 583 url: url, 584 success: function (data, textStatus, jqxhr) { 585 getScriptQueries--; 586 if (_.otherjQ && getScriptQueries === 0) { 587 _.$ = jQuery; 588 jQuery = oldjQuery; 589 } 590 if (callback) { 591 callback(data, textStatus, jqxhr); 592 } 593 }, 594 dataType: "script", 595 cache: true 596 }); 597 }; 598 599 // This event executes after all scripts from ajax response are executed 600 $.ceEvent('on', 'ce.ajaxdone', function (elms, scripts, params, response_data, response_text) { 601 var i; 602 603 // For full page reload in embedded mode if language was changed 604 if (_.embedded && response_data.language_changed) { 605 _.embedded = false; 606 $.redirect(response_data.current_url, false); 607 window.location.reload(true); 608 return; 609 } 610 611 // If callback function passed, run it 612 if (params.on_ajax_done && typeof params.on_ajax_done == 'function') { 613 params.on_ajax_done(response_data, params, response_text); 614 } 615 if (scripts) { 616 for (i = 0; i < scripts.length; i++) { 617 var _hash = $.crc32(scripts.eq(i).html()); 618 if (!evalCache[_hash] || params.force_exec || scripts.eq(i).hasClass('cm-ajax-force')) { 619 $.globalEval(scripts.eq(i).html()); 620 evalCache[_hash] = true; 621 } 622 } 623 } 624 if (response_data.debug_info) { 625 console.log(response_data.debug_info); 626 } 627 var link_history = params.save_history && (!params.obj || params.obj && $.ceDialog('inside_dialog', { 628 jelm: params.obj 629 }) === false); 630 if (response_data.session_data) { 631 sessionData = response_data.session_data; 632 localStorage.setItem(sessionData.name, sessionData.id); 633 } 634 if (response_data.current_url) { 635 var current_url = decodeURIComponent(response_data.current_url); 636 if (!params.skip_history && (_.embedded || link_history)) { 637 var _params = params; 638 if (!link_history) { 639 _params.result_ids = _.container; 640 } 641 if (response_data.anchor) { 642 current_url += '#' + response_data.anchor; 643 } 644 $.ceHistory('load', current_url, _params, true); 645 _.current_url = current_url; // update current_url parameter in Tygh namespace 646 } 647 if (response_data.anchor) { 648 params.scroll = response_data.anchor; 649 _.anchor = '#' + response_data.anchor; 650 } 651 } 652 for (i = 0; i < elms.length; i++) { 653 $.commonInit(elms[i]); 654 } 655 656 // Enable disabled form fields back if we submitted form 657 if (params.form) { 658 $('input[name=is_ajax]', params.form).remove(); 659 $('input[name=full_render]', params.form).remove(); 660 if (params.form.hasClass('cm-disable-empty') || params.form.hasClass('cm-disable-empty-all') || params.form.hasClass('cm-disable-empty-files')) { 661 $('input.cm-disabled', params.form).prop('disabled', false).removeClass('cm-disabled'); 662 } 663 if (params.form.data('caAjaxDoneEvent')) { 664 $.ceEvent('trigger', params.form.data('caAjaxDoneEvent'), [response_data, params, response_text]); 665 } 666 } 667 668 // If callback function passed, run it 669 if (params.callback && $.isFunction(params.callback)) { 670 params.callback(response_data, params, response_text); 671 } else if (params.callback) { 672 $.ceEvent('trigger', params.callback, [response_data, params, response_text]); 673 } 674 675 // Hide loading box 676 if (!params.keep_status_box) { 677 $.toggleStatusBox('hide'); 678 } 679 if (params.scroll) { 680 if (!_.scrolling) { 681 $.scrollToElm(params.scroll); 682 } 683 } 684 685 // Display notification 686 if (response_data.notifications) { 687 $.ceNotification('showMany', response_data.notifications); 688 } 689 }); 690 $.ceAjax = function (method) { 691 if (methods[method]) { 692 return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 693 } else if (typeof method === 'object' || !method) { 694 return methods.init.apply(this, arguments); 695 } else { 696 $.error('ty.ajax: method ' + method + ' does not exist'); 697 } 698 }; 699 })($); 700 $(document).ready(function () { 701 $('script').each(function () { 702 var _src = $(this).prop('src'); 703 if (_src) { 704 loadedScripts[_src] = true; 705 } 706 }); 707 if (typeof ajax_callback_data != 'undefined' && ajax_callback_data) { 708 $.globalEval(ajax_callback_data); 709 ajax_callback_data = false;
710 } 711 }); 712})(Tygh, Tygh.$);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.