1// Miva Merchant 2// 3// This file and the source codes contained herein are the property of 4// Miva, Inc. Use of this file is restricted to the specific terms and 5// conditions in the License Agreement associated with this file. Distribution 6// of this file or portions of this file for uses not covered by the License 7// Agreement is not allowed without a written agreement signed by an officer of 8// Miva, Inc. 9// 10// Copyright 1998-2024 Miva, Inc. All rights reserved. 11// http://www.miva.com 12// 13// Prefix : MER-AJX- 14// Next Error Code: 18 15// 16 17// Order Processing Server-side AJAX calls 18//////////////////////////////////////////////////// 19 20var json_url, json_nosessionurl, Session_ID; 21 22function AJAX_New() 23{ 24 var http_request = null; 25 26 if ( window.XMLHttpRequest ) 27 { 28 http_request = new XMLHttpRequest(); 29 } 30 else if ( window.ActiveXObject ) 31 { 32 http_request = new ActiveXObject( "Microsoft.XMLHTTP" ); 33 } 34 35 return http_request; 36} 37 38function AJAX_Initialize() 39{ 40 var session_start, session_id; 41 42 if ( ( ( typeof json_nosessionurl ) == 'string' ) && 43 ( ( typeof Session_ID ) == 'string' ) ) 44 { 45 return; 46 } 47 48 if ( ( session_start = json_url.toLowerCase().indexOf( 'session_id=' ) ) == -1 ) 49 { 50 json_nosessionurl = json_url; 51 session_id = ''; 52 } 53 else 54 { 55 if ( ( session_end = json_url.indexOf( '&', session_start + 11 /* length of 'Session_ID=' */ ) ) == -1 ) 56 { 57 session_end = json_url.length; 58 } 59 60 session_id = json_url.substring( session_start + 11, session_end ); 61 json_nosessionurl = json_url.slice( 0, session_start ) + json_url.slice( session_end + 1 ); 62 } 63 64 if ( ( typeof Session_ID ) == 'undefined' ) 65 { 66 Session_ID = session_id; 67 } 68} 69 70function AJAX_Invalid_Session( response, reload_window, callback ) 71{ 72 reload_window.location.reload(); 73} 74 75function AJAX_Append_SessionParameters( parameters, session_type ) 76{ 77 var session_parameters; 78 79 session_parameters = 'Session_Type=' + encodeURIComponent( session_type ); 80 81 if ( ( session_type == 'admin' ) && ( ( typeof Session_ID ) != 'undefined' ) ) 82 { 83 session_parameters += '&Session_ID=' + encodeURIComponent( Session_ID ); 84 } 85 86 if ( ( ( typeof parameters ) != 'string' ) || ( parameters.length == 0 ) ) return session_parameters; 87 else return parameters + '&' + session_parameters; 88} 89 90function AJAX_Append_SessionParameters_JSON( parameters, session_type ) 91{ 92 if ( !parameters ) 93 { 94 parameters = new Object(); 95 } 96 97 parameters.Session_Type = session_type; 98 99 if ( ( session_type == 'admin' ) && ( ( typeof Session_ID ) != 'undefined' ) ) 100 { 101 parameters.Session_ID = Session_ID; 102 } 103 104 return parameters; 105} 106 107function AJAX_Append_FieldList_JSON( parameters, fields ) 108{ 109 var name, field, regex, last_index, last_match, field_param, current_match; 110 111 if ( !parameters ) 112 { 113 parameters = new Object(); 114 } 115 116 regex = new RegExp( '(\\[\\s{0,}(?<index>\\d{1,})\\s{0,}\\]|(?<structure>:))', 'g' ); 117 118 for ( field of fields ) 119 { 120 field_param = parameters; 121 last_match = null; 122 last_index = 0; 123 124 while ( ( current_match = regex.exec( field.name ) ) !== null ) 125 { 126 if ( last_match && typeof last_match.groups.index !== 'undefined' ) 127 { 128 if ( typeof current_match.groups.structure !== 'undefined' ) field_param = AJAX_Append_FieldList_JSON_CreateObjectPath( field_param, last_match.groups.index - 1 ); 129 else if ( typeof current_match.groups.index !== 'undefined' ) field_param = AJAX_Append_FieldList_JSON_CreateArrayPath( field_param, last_match.groups.index - 1 ); 130 } 131 132 name = field.name.substring( last_index, current_match.index ); 133 134 if ( name.length ) 135 { 136 if ( typeof current_match.groups.structure !== 'undefined' ) field_param = AJAX_Append_FieldList_JSON_CreateObjectPath( field_param, name ); 137 else if ( typeof current_match.groups.index !== 'undefined' ) field_param = AJAX_Append_FieldList_JSON_CreateArrayPath( field_param, name ); 138 } 139 140 last_match = current_match; 141 last_index = regex.lastIndex; 142 } 143 144 name = field.name.substring( last_index, field.name.length ); 145 146 if ( name.length && ( !last_match || typeof last_match.groups.index === 'undefined' ) ) AJAX_Append_FieldList_JSON_SetPathValue( field_param, name, field.value ); 147 else if ( name.length === 0 && last_match && typeof last_match.groups.index !== 'undefined' ) AJAX_Append_FieldList_JSON_SetPathValue( field_param, last_match.groups.index - 1, field.value ); 148 else 149 { 150 // 151 // Invalid parsed name 152 // 153 } 154 } 155 156 return parameters; 157} 158 159function AJAX_Append_FieldList_JSON_CreateArrayPath( parameters, name ) 160{ 161 if ( !parameters.hasOwnProperty( name ) || !Array.isArray( parameters[ name ] ) ) 162 { 163 parameters[ name ] = new Array(); 164 } 165 166 parameters = parameters[ name ]; 167 168 return parameters; 169} 170 171function AJAX_Append_FieldList_JSON_CreateObjectPath( parameters, name ) 172{ 173 if ( !parameters.hasOwnProperty( name ) || typeof parameters[ name ] !== 'object' ) 174 { 175 parameters[ name ] = new Object(); 176 } 177 178 parameters = parameters[ name ]; 179 180 return parameters; 181} 182 183function AJAX_Append_FieldList_JSON_SetPathValue( parameters, name, value ) 184{ 185 if ( !parameters.hasOwnProperty( name ) ) parameters[ name ] = value; 186 else if ( !Array.isArray( parameters[ name ] ) ) parameters[ name ] = new Array( parameters[ name ], value ); 187 else parameters[ name ].push( value ); 188} 189 190function AJAX_Call_Module( callback, session_type, module_code, func, parameters, delegator ) 191{ 192 if ( delegator ) 193 { 194 return delegator.AJAX_Call_Module( callback, session_type, module_code, func, parameters ); 195 } 196 197 AJAX_Initialize(); 198 return AJAX_Call_LowLevel( null, 199 callback, 200 'application/x-www-form-urlencoded', AJAX_Append_SessionParameters( parameters, session_type ), 201 'Store_Code=' + AJAX_CharsetEncodeAttribute( Store_Code ) + '&Function=Module&Module_Code=' + AJAX_CharsetEncodeAttribute( module_code ) + '&Module_Function=' + AJAX_CharsetEncodeAttribute( func ), 202 function( http_request ) 203 { 204 var response; 205 206 response = new Object(); 207 response.status = http_request.status; 208 response.success = 0; 209 response.error_code = 'MER-AJX-00002'; 210 response.error_message = 'Miva Merchant returned an invali
210d response.\n' + 211 'Module: ' + module_code + '\n' + 212 'Function: ' + func + '\n' + 213 'Status: ' + http_request.status + '\n' + 214 'Response: ' + http_request.responseText; 215 return response; 216 } ); 217} 218 219function AJAX_Call_Module_JSON( callback, session_type, module_code, func, data, delegator ) 220{ 221 if ( delegator ) 222 { 223 return delegator.AJAX_Call_Module_JSON( callback, session_type, module_code, func, data ); 224 } 225 226 AJAX_Initialize(); 227 return AJAX_Call_LowLevel( null, 228 callback, 229 'application/json', JSON.stringify( AJAX_Append_SessionParameters_JSON( data, session_type ) ), 230 'Store_Code=' + AJAX_CharsetEncodeAttribute( Store_Code ) + '&Function=Module&Module_Code=' + AJAX_CharsetEncodeAttribute( module_code ) + '&Module_Function=' + AJAX_CharsetEncodeAttribute( func ), 231 function( http_request ) 232 { 233 var response; 234 235 response = new Object(); 236 response.status = http_request.status; 237 response.success = 0; 238 response.error_code = 'MER-AJX-00013'; 239 response.error_message = 'Miva Merchant returned an invalid response.\n' + 240 'Function: ' + func + '\n' + 241 'Status: ' + http_request.status + '\n' + 242 'Response: ' + http_request.responseText; 243 244 return response; 245 } ); 246} 247 248function AJAX_Call_Module_FieldList( callback, session_type, module_code, func, parameters, fields, delegator ) 249{ 250 var i; 251 252 for ( i = 0; i < fields.length; i++ ) 253 { 254 parameters += ( parameters.length ? '&' : '' ) + encodeURIComponent( fields[ i ].name ) + '=' + ( fields[ i ].hasOwnProperty( 'encoded_value' ) ? fields[ i ].encoded_value : encodeURIComponent( fields[ i ].value ) ); 255 } 256 257 return AJAX_Call_Module( callback, session_type, module_code, func, parameters, delegator ); 258} 259 260function AJAX_Call_Module_JSON_FieldList( callback, session_type, module_code, func, parameters, fields, delegator ) 261{ 262 return AJAX_Call_Module_JSON( callback, session_type, module_code, func, AJAX_Append_FieldList_JSON( parameters, fields ), delegator ); 263} 264 265function AJAX_Call_Module_WithFile( progress_object, session_type, module_code, func, parameters, file_field, file_input, file_object, delegator ) 266{ 267 var response; 268 269 if ( delegator ) 270 { 271 return delegator.AJAX_Call_Module_WithFile( progress_object, session_type, module_code, func, parameters, file_field, file_input, file_object ); 272 } 273 274 AJAX_Initialize(); 275 276 if ( file_object && window.FormData ) 277 { 278 return AJAX_Call_Module_WithFile_FormData( progress_object, session_type, module_code, func, parameters, file_field, file_object ); 279 } 280 281 response = new Object(); 282 response.success = 0; 283 response.error_code = 'MER-AJX-00009'; 284 response.error_message = 'This browser does not support file upload with the provided parameters'; 285 286 progress_object.Complete( response ); 287 if ( window.Modal_Resize ) Modal_Resize(); 288} 289 290function AJAX_Call_Module_WithFile_FormData( progress_object, session_type, module_code, func, parameters, file_field, file_object ) 291{ 292 var content, param, http_request; 293 294 content = new FormData(); 295 296 for ( param in parameters ) 297 { 298 content.append( param, parameters[ param ] ); 299 } 300 301 content.append( 'Session_Type', session_type ); 302 303 if ( ( session_type === 'admin' ) && ( ( typeof Session_ID ) != 'undefined' ) ) 304 { 305 content.append( 'Session_ID', Session_ID ); 306 } 307 308 content.append( file_field, file_object ); 309 310 if ( ( http_request = AJAX_New() ) == null ) 311 { 312 return null; 313 } 314 315 progress_object.Initialize( http_request, true ); 316 317 http_request.upload.addEventListener( 'progress', function( event ) { progress_object.Progress( ( event.loaded / event.total * 100 ).toFixed( 0 ) ); }, false ); 318 http_request.upload.addEventListener( 'load', function( event ) { progress_object.Progress( 100 ); }, false ); 319 320 return AJAX_Call_LowLevel( http_request, 321 function( response ) { progress_object.Complete( response ); }, 322 null, 323 content, 324 'Store_Code=' + AJAX_CharsetEncodeAttribute( Store_Code ) + '&Function=Module&Module_Code=' + AJAX_CharsetEncodeAttribute( module_code ) + '&Module_Function=' + AJAX_CharsetEncodeAttribute( func ), 325 function( http_request ) 326 { 327 var response; 328 329 response = new Object(); 330 response.status = http_request.status; 331 response.success = 0; 332 response.error_code = 'MER-AJX-00010'; 333 response.error_message = 'Miva Merchant returned an invali
333d response.\n' + 334 'Function: ' + func + '\n' + 335 'Status: ' + http_request.status + '\n' + 336 'Response: ' + http_request.responseText; 337 338 return response; 339 } ); 340} 341 342function AJAX_Call_Domain( callback, session_type, func, parameters, delegator ) 343{ 344 if ( delegator ) 345 { 346 return delegator.AJAX_Call_Domain( callback, session_type, func, parameters ); 347 } 348 349 AJAX_Initialize(); 350 return AJAX_Call_LowLevel( null, 351 callback, 352 'application/x-www-form-urlencoded', AJAX_Append_SessionParameters( parameters, session_type ), 353 'Function=' + AJAX_CharsetEncodeAttribute( func ), 354 function( http_request ) 355 { 356 var response; 357 358 response = new Object(); 359 response.status = http_request.status; 360 response.success = 0; 361 response.error_code = 'MER-AJX-00008'; 362 response.error_message = 'Miva Merchant returned an invalid response.\n' + 363 'Function: ' + func + '\n' + 364 'Status: ' + http_request.status + '\n' + 365 'Response: ' + http_request.responseText; 366 367 return response; 368 } ); 369} 370 371function AJAX_Call_Domain_JSON( callback, session_type, func, parameters, delegator ) 372{ 373 if ( delegator ) 374 { 375 return delegator.AJAX_Call_Domain_JSON( callback, session_type, func, parameters ); 376 } 377 378 AJAX_Initialize(); 379 return AJAX_Call_LowLevel( null, 380 callback, 381 'application/json', JSON.stringify( AJAX_Append_SessionParameters_JSON( parameters, session_type ) ), 382 'Function=' + AJAX_CharsetEncodeAttribute( func ), 383 function( http_request ) 384 { 385 var response; 386 387 response = new Object(); 388 response.status = http_request.status; 389 response.success = 0; 390 response.error_code = 'MER-AJX-00014'; 391 response.error_message = 'Miva Merchant returned an invalid response.\n' + 392 'Function: ' + func + '\n' + 393 'Status: ' + http_request.status + '\n' + 394 'Response: ' + http_request.responseText; 395 396 return response; 397 } ); 398} 399 400function AJAX_Call_Module_Domain_JSON( callback, session_type, module_code, func, parameters, delegator ) 401{ 402 if ( delegator ) 403 { 404 return delegator.AJAX_Call_Module_Domain_JSON( callback, session_type, module_code, func, parameters ); 405 } 406 407 AJAX_Initialize(); 408 return AJAX_Call_LowLevel( null, 409 callback, 410 'application/json', JSON.stringify( AJAX_Append_SessionParameters_JSON( parameters, session_type ) ), 411 'Function=Module&Module_Code=' + AJAX_CharsetEncodeAttribute( module_code ) + '&Module_Function=' + AJAX_CharsetEncodeAttribute( func ), 412 function( http_request ) 413 { 414 var response; 415 416 response = new Object(); 417 response.status = http_request.status; 418 response.success = 0; 419 response.error_code = 'MER-AJX-00017'; 420 response.error_message = 'Miva Merchant returned an invalid response.\n' + 421 'Function: ' + func + '\n' + 422 'Status: ' + http_request.status + '\n' + 423 'Response: ' + http_request.responseText; 424 425 return response; 426 } ); 427} 428 429function AJAX_Call_Domain_FieldList( callback, session_type, func, parameters, fields, delegator ) 430{ 431 var i; 432 433 for ( i = 0; i < fields.length; i++ ) 434 { 435 parameters += ( parameters.length ? '&' : '' ) + encodeURIComponent( fields[ i ].name ) + '=' + ( fields[ i ].hasOwnProperty( 'encoded_value' ) ? fields[ i ].encoded_value : encodeURIComponent( fields[ i ].value ) ); 436 } 437 438 return AJAX_Call_Domain( callback, session_type, func, parameters, delegator ); 439} 440 441function AJAX_Call( callback, session_type, func, parameters, delegator ) 442{ 443 if ( delegator ) 444 { 445 return delegator.AJAX_Call( callback, session_type, func, parameters ); 446 } 447 448 return AJAX_Call_WithStoreCode( callback, session_type, Store_Code, func, parameters, delegator ); 449} 450 451function AJAX_Call_WithStoreCode( callback, session_type, store_code, func, parameters, delegator ) 452{ 453 if ( delegator ) 454 { 455 return delegator.AJAX_Call_WithStoreCode( callback, session_type, store_code, func, parameters ); 456 } 457 458 AJAX_Initialize(); 459 return AJAX_Call_LowLevel( null, 460 callback, 461 'application/x-www-form-urlencoded', AJAX_Append_SessionParameters( parameters, session_type ), 462 'Store_Code=' + AJAX_CharsetEncodeAttribute( store_code ) + '&Function=' + AJAX_CharsetEncodeAttribute( func ), 463 function( http_request ) 464 { 465 var response; 466 467 response = new Object(); 468 response.status = http_request.status; 469 response.success = 0; 470 response.error_code = 'MER-AJX-00012'; 471 response.error_message = 'Miva Merchant returned an invali
471d response.\n' + 472 'Function: ' + func + '\n' + 473 'Status: ' + http_request.status + '\n' + 474 'Response: ' + http_request.responseText; 475 476 return response; 477 } ); 478} 479 480function AJAX_Call_JSON( callback, session_type, func, parameters, delegator ) 481{ 482 if ( delegator ) 483 { 484 return delegator.AJAX_Call_JSON( callback, session_type, func, parameters ); 485 } 486 487 AJAX_Initialize(); 488 return AJAX_Call_LowLevel( null, 489 callback, 490 'application/json', JSON.stringify( AJAX_Append_SessionParameters_JSON( parameters, session_type ) ), 491 'Store_Code=' + AJAX_CharsetEncodeAttribute( Store_Code ) + '&Function=' + AJAX_CharsetEncodeAttribute( func ), 492 function( http_request ) 493 { 494 var response; 495 496 response = new Object(); 497 response.status = http_request.status; 498 response.success = 0; 499 response.error_code = 'MER-AJX-00015'; 500 response.error_message = 'Miva Merchant returned an invalid response.\n' + 501 'Function: ' + func + '\n' + 502 'Status: ' + http_request.status + '\n' + 503 'Response: ' + http_request.responseText; 504 505 return response; 506 } ); 507} 508 509function AJAX_Call_FieldList( callback, session_type, func, parameters, fields, delegator ) 510{ 511 var i; 512 513 for ( i = 0; i < fields.length; i++ ) 514 { 515 parameters += ( parameters.length ? '&' : '' ) + encodeURIComponent( fields[ i ].name ) + '=' + ( fields[ i ].hasOwnProperty( 'encoded_value' ) ? fields[ i ].encoded_value : encodeURIComponent( fields[ i ].value ) ); 516 } 517 518 return AJAX_Call( callback, session_type, func, parameters, delegator ); 519} 520 521function AJAX_Call_JSON_FieldList( callback, session_type, func, parameters, fields, delegator ) 522{ 523 return AJAX_Call_JSON( callback, session_type, func, AJAX_Append_FieldList_JSON( parameters, fields ), delegator ); 524} 525 526function AJAX_Call_WithFile( progress_object, session_type, func, parameters, file_field, file_input, file_object, delegator ) 527{ 528 var response; 529 530 if ( delegator ) 531 { 532 return delegator.AJAX_Call_WithFile( progress_object, session_type, func, parameters, file_field, file_input, file_object ); 533 } 534 535 AJAX_Initialize(); 536 537 if ( file_object && window.FormData ) 538 { 539 return AJAX_Call_WithFile_FormData( progress_object, session_type, func, parameters, file_field, file_object ); 540 } 541 542 response = new Object(); 543 response.success = 0; 544 response.error_code = 'MER-AJX-00006'; 545 response.error_message = 'This browser does not support file upload with the provided parameters'; 546 547 progress_object.Complete( response ); 548 if ( window.Modal_Resize ) Modal_Resize(); 549} 550 551function AJAX_Call_WithFile_FormData( progress_object, session_type, func, parameters, file_field, file_object ) 552{ 553 var content, param, http_request; 554 555 content = new FormData(); 556 557 for ( param in parameters ) 558 { 559 if ( typeof parameters[ param ] === 'boolean' ) content.append( param, parameters[ param ] ? '1' : '0' ); 560 else if ( Array.isArray( parameters[ param ] ) ) content.append( param, PackArray( parameters[ param ] ) ); 561 else content.append( param, parameters[ param ] ); 562 } 563 564 content.append( 'Session_Type', session_type ); 565 566 if ( ( session_type === 'admin' ) && ( ( typeof Session_ID ) != 'undefined' ) ) 567 { 568 content.append( 'Session_ID', Session_ID ); 569 } 570 571 content.append( file_field, file_object ); 572 573 if ( ( http_request = AJAX_New() ) == null ) 574 { 575 return null; 576 } 577 578 progress_object.Initialize( http_request, true ); 579 580 http_request.upload.addEventListener( 'progress', function( event ) { progress_object.Progress( ( event.loaded / event.total * 100 ).toFixed( 0 ) ); }, false ); 581 http_request.upload.addEventListener( 'load', function( event ) { progress_object.Progress( 100 ); }, false ); 582 583 return AJAX_Call_LowLevel( http_request, 584 function( response ) { progress_object.Complete( response ); }, 585 null, 586 content, 587 'Store_Code=' + AJAX_CharsetEncodeAttribute( Store_Code ) + '&Function=' + AJAX_CharsetEncodeAttribute( func ), 588 function( http_request ) 589 { 590 var response; 591 592 response = new Object(); 593 response.success = 0; 594 response.status = http_request.status; 595 response.error_code = 'MER-AJX-00003'; 596 response.error_message = 'Miva Merchant returned an invali
596d response.\n' + 597 'Function: ' + func + '\n' + 598 'Status: ' + http_request.status + '\n' + 599 'Response: ' + http_request.responseText; 600 601 return response; 602 } ); 603} 604 605function AJAX_Call_WithFileList_FormData( progress_object, session_type, func, parameters, files ) 606{ 607 var i, i_len, content, param, http_request; 608 609 content = new FormData(); 610 611 for ( param in parameters ) 612 { 613 content.append( param, parameters[ param ] ); 614 } 615 616 content.append( 'Session_Type', session_type ); 617 618 if ( ( session_type === 'admin' ) && ( ( typeof Session_ID ) != 'undefined' ) ) 619 { 620 content.append( 'Session_ID', Session_ID ); 621 } 622 623 for ( i = 0, i_len = files.length; i < i_len; i++ ) 624 { 625 content.append( files[ i ].name, files[ i ].file ); 626 } 627 628 if ( ( http_request = AJAX_New() ) == null ) 629 { 630 return null; 631 } 632 633 progress_object.Initialize( http_request, true ); 634 635 http_request.upload.addEventListener( 'progress', function( event ) { progress_object.Progress( ( event.loaded / event.total * 100 ).toFixed( 0 ) ); }, false ); 636 http_request.upload.addEventListener( 'load', function( event ) { progress_object.Progress( 100 ); }, false ); 637 638 return AJAX_Call_LowLevel( http_request, 639 function( response ) { progress_object.Complete( response ); }, 640 null, 641 content, 642 'Store_Code=' + AJAX_CharsetEncodeAttribute( Store_Code ) + '&Function=' + AJAX_CharsetEncodeAttribute( func ), 643 function( http_request ) 644 { 645 var response; 646 647 response = new Object(); 648 response.success = 0; 649 response.status = http_request.status; 650 response.error_code = 'MER-AJX-00003'; 651 response.error_message = 'Miva Merchant returned an invalid response.\n' + 652 'Function: ' + func + '\n' + 653 'Status: ' + http_request.status + '\n' + 654 'Response: ' + http_request.responseText; 655 656 return response; 657 } ); 658} 659 660function AJAX_Call_LowLevel( http_request, callback, content_type, content, uri, error_response ) 661{ 662 if ( http_request == null ) 663 { 664 if ( ( http_request = AJAX_New() ) == null ) 665 { 666 return null; 667 } 668 } 669 670 AJAX_Call_Initialize( http_request, callback, content_type, uri, error_response ); 671 http_request.send( content ); 672 673 return http_request; 674} 675 676function AJAX_Call_Initialize( http_request, callback, content_type, uri, error_response ) 677{ 678 http_request.open( 'POST', json_nosessionurl + uri, true ); 679 http_request.setRequestHeader( 'If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT' ); // Avoid caching 680 681 if ( content_type ) 682 { 683 http_request.setRequestHeader( 'Content-Type', content_type ); 684 } 685 686 http_request.onreadystatechange = function() 687 { 688 var response = null, content_length = null, content_encoding = null; 689 690 if ( http_request.readyState == 4 ) 691 { 692 if ( http_request.status != 200 ) 693 { 694 response = error_response( http_request ); 695 696 callback( response ); 697 if ( window.Modal_Resize ) Modal_Resize(); 698 } 699 else 700 { 701 // Prevent eval() of a partial response due to a navigation away from the current page, pressing 702 // the stop button, etc... 703 if ( typeof http_request.getResponseHeader != 'undefined' ) 704 { 705 content_length = http_request.getResponseHeader( 'Content-Length' ); 706 content_encoding = http_request.getResponseHeader( 'Content-Encoding' ); 707 } 708 709 if ( content_length && ( content_length != http_request.responseText.length ) && 710 ( content_encoding == null || ( content_encoding == 'identity' ) ) ) 711 { 712 return; 713 } 714 715 try 716 { 717 if ( ( typeof JSON !== 'undefined' ) && 718 ( typeof JSON.parse !== 'undefined' ) ) response = JSON.parse( http_request.responseText ); 719 else response = eval( '(' + http_request.responseText + ')' ); 720 } 721 catch ( e ) 722 { 723 response = error_response( http_request ); 724 } 725 726 if ( ( response.error_code == 'session_timeout' ) || 727 ( response.error_code == 'too_many_sessions' ) ) 728 { 729 AJAX_Invalid_Session( response, window, callback ); 730 return; 731 } 732 733 callback( response );
734 if ( window.Modal_Resize ) Modal_Resize(); 735 } 736 737 http_request = null; 738 } 739 } 740} 741 742function AJAX_AutoComplete_Initialize( http_request, callback, session_type, func, parameters ) 743{ 744 AJAX_Initialize(); 745 AJAX_Call_Initialize( http_request, 746 callback, 747 'application/x-www-form-urlencoded', 748 'Store_Code=' + AJAX_CharsetEncodeAttribute( Store_Code ) + '&Function=' + AJAX_CharsetEncodeAttribute( func ), 749 function( http_request ) 750 { 751 var response; 752 753 response = new Object(); 754 response.success = 0; 755 response.status = http_request.status; 756 response.error_code = 'MER-AJX-00007'; 757 response.error_message = 'Miva Merchant returned an invalid response.\n' + 758 'Function: ' + func + '\n' + 759 'Status: ' + http_request.status + '\n' + 760 'Response: ' + http_request.responseText; 761 762 return response; 763 } ); 764 765 http_request.autocomplete_content = AJAX_Append_SessionParameters( parameters, session_type ); 766} 767 768function AJAX_AutoComplete_Execute( http_request ) 769{ 770 http_request.send( http_request.autocomplete_content ); 771} 772 773// 774// Runtime Specific Functions 775// 776 777function AJAX_Call_JSON_Runtime( callback, session_type, func, parameters, flags, delegator ) 778{ 779 if ( delegator ) 780 { 781 return delegator.AJAX_Call_JSON_Runtime( callback, session_type, func, parameters, flags ); 782 } 783 784 if ( !parameters ) 785 { 786 parameters = new Object(); 787 } 788 789 parameters.Session_Type = session_type; 790 791 return AJAX_Call_Runtime_LowLevel( callback, flags, 792 'application/json', JSON.stringify( parameters ), 793 'Store_Code=' + AJAX_CharsetEncodeAttribute( Store_Code ) + '&Function=' + AJAX_CharsetEncodeAttribute( func ), 794 function( http_request ) 795 { 796 var response; 797 798 response = new Object(); 799 response.success = 0; 800 response.status = http_request.status; 801 response.error_code = 'MER-AJX-00016'; 802 response.error_message = 'Miva Merchant returned an invalid response.\n' + 803 'Function: ' + func + '\n' + 804 'Status: ' + http_request.status + '\n' + 805 'Response: ' + http_request.responseText; 806 807 return response; 808 } ); 809} 810 811function AJAX_Call_Runtime_LowLevel( callback, flags, content_type, content, uri, error_response ) 812{ 813 var http_request, flags_lookup; 814 815 flags_lookup = new Object(); 816 flags_lookup.with_credentials = false; 817 818 if ( typeof flags === 'string' ) 819 { 820 flags 821 .split( ',' ) 822 .map( flag => flag.trim() ) 823 .filter( flag => flag !== '' ) 824 .map( flag => flags_lookup[ flag ] = true ); 825 } 826 827 http_request = new XMLHttpRequest(); 828 http_request.withCredentials = flags_lookup.with_credentials; 829 830 http_request.open( 'POST', runtime_json_url + uri, true ); 831 http_request.setRequestHeader( 'If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT' ); // Avoid caching 832 833 if ( content_type ) 834 { 835 http_request.setRequestHeader( 'Content-Type', content_type ); 836 } 837 838 http_request.onload = function( event ) 839 { 840 var response, content_length, content_encoding; 841 842 response = null; 843 content_length = null; 844 content_encoding = null; 845 846 // 847 // Prevent parsing of a partial response due to a navigation away from the current page, pressing 848 // the stop button, etc... 849 // 850 851 if ( typeof http_request.getResponseHeader != 'undefined' ) 852 { 853 content_length = http_request.getResponseHeader( 'Content-Length' ); 854 content_encoding = http_request.getResponseHeader( 'Content-Encoding' ); 855 } 856 857 if ( content_length && ( content_length != http_request.responseText.length ) && 858 ( content_encoding == null || ( content_encoding == 'identity' ) ) ) 859 { 860 return; 861 } 862 863 try 864 { 865 response = JSON.parse( http_request.responseText ); 866 } 867 catch ( e ) 868 { 869 response = error_response( http_request ); 870 } 871 872 if ( typeof callback === 'function' ) 873 { 874 callback( response ); 875 } 876 877 http_request = null; 878 }; 879 880 http_request.send( content ); 881 882 return http_request; 883} 884 885// 886// Helper Functions 887// 888 889function PackArray( array ) 890{ 891 var i;
892 var packed = ''; 893 894 if ( array == null || array.length == 0 ) 895 { 896 return ''; 897 } 898 899 for ( i = 0; i < array.length - 1; i++ ) 900 { 901 packed += encodeURIComponent( array[ i ] ) + '|'; 902 } 903 904 packed += encodeURIComponent( array[ i ] ); 905 return packed; 906} 907 908function EncodeArray( array ) 909{ 910 return encodeURIComponent( PackArray( array ) ); 911} 912 913function PackTwoDimensionalArray( array ) 914{ 915 var i, j; 916 var packed = ''; 917 918 if ( array == null || array.length == 0 ) 919 { 920 return ''; 921 } 922 923 for ( i = 0; i < array.length; i++ ) 924 { 925 for ( j = 0; j < array[ i ].length; j++ ) 926 { 927 packed += encodeURIComponent( array[ i ][ j ] ); 928 if ( j < array[ i ].length - 1 ) 929 { 930 packed += '%7C'; 931 } 932 } 933 934 if ( i < array.length - 1 ) 935 { 936 packed += '|'; 937 } 938 } 939 940 return packed; 941} 942 943function EncodeTwoDimensionalArray( array ) 944{ 945 return encodeURIComponent( PackTwoDimensionalArray( array ) ); 946} 947 948function Base64ToArrayBuffer( value ) 949{ 950 var i, i_len; 951 var decoded, array; 952 953 decoded = atob( value ); 954 i_len = decoded.length; 955 array = new Uint8Array( i_len ); 956 957 for ( i = 0; i < i_len; i++ ) 958 { 959 array[ i ] = decoded.charCodeAt( i ); 960 } 961 962 return array.buffer; 963} 964 965function ArrayBufferToBase64( buffer ) 966{ 967 var i, i_len; 968 var c_array, u8_array; 969 970 c_array = new Array(); 971 u8_array = new Uint8Array( buffer ); 972 973 for ( i = 0, i_len = u8_array.byteLength; i < i_len; i++ ) 974 { 975 c_array[ i ] = String.fromCharCode( u8_array[ i ] ); 976 } 977 978 return btoa( c_array.join( '' ) ); 979} 980 981function AddEvent( obj, eventType, fn ) 982{ 983 try 984 { 985 obj.addEventListener( eventType, fn, false ); 986 return true; 987 } 988 catch ( e ) 989 { 990 try 991 { 992 return obj.attachEvent( 'on' + eventType, fn ); 993 } 994 catch ( e ) 995 { 996 return false; 997 } 998 } 999} 1000 1001function RemoveEvent( obj, eventType, fn ) 1002{ 1003 try 1004 { 1005 obj.removeEventListener( eventType, fn, false ); 1006 return true; 1007 } 1008 catch ( e ) 1009 { 1010 try 1011 { 1012 return obj.detachEvent( 'on' + eventType, fn ); 1013 } 1014 catch ( e ) 1015 { 1016 return false; 1017 } 1018 } 1019} 1020 1021function FireEvent( obj, eventType ) 1022{ 1023 var e; 1024 1025 try 1026 { 1027 e = new Event( eventType, { 'bubbles': true, 'cancelable': true } ); 1028 obj.dispatchEvent( e ); 1029 } 1030 catch ( e ) 1031 { 1032 // 1033 // Internet Explorer fallback. Requires window to be the dispatcher 1034 // 1035 1036 e = document.createEvent( 'HTMLEvents' ); 1037 e.initEvent( eventType, true, true ); 1038 e.eventName = eventType; 1039 window.dispatchEvent( e ); 1040 } 1041} 1042 1043/* 1044 * Note: This function is also present (with a different name) in ui.js and v55_ui.js. 1045 * Modifications here should be made in those other locations as well. 1046 */ 1047 1048function AJAX_CharsetEncodeAttribute( instring ) 1049{ 1050 var encoded; 1051 1052 if ( AJAX_isUnicode() ) 1053 { 1054 return encodeURIComponent( instring ); 1055 } 1056 else 1057 { 1058 if ( typeof escape === 'function' ) 1059 { 1060 encoded = escape( instring ); 1061 encoded = encoded.replace( '+', '%2B' ); 1062 encoded = encoded.replace( '/', '%2F' ); 1063 encoded = encoded.replace( '@', '%40' ); 1064 1065 return encoded; 1066 } 1067 else 1068 { 1069 return instring; 1070 } 1071 } 1072} 1073 1074/* 1075 * Note: This function is also present (with a different name) in ui.js and v55_ui.js. 1076 * Modifications here should be made in those other locations as well. 1077 */ 1078 1079function AJAX_isUnicode() 1080{ 1081 return ( document.characterSet || document.charset || '' ).search( 'UTF' ) == 0 ? true : false; 1082} 1083 1084// AJAX_ThreadPool 1085//////////////////////////////////////////////////// 1086 1087function AJAX_ThreadPool( threads ) 1088{ 1089 this.threads = threads; 1090 this.active_count = 0; 1091 this.running = false; 1092 this.queue = new Array(); 1093 this.running_queue = new Array(); 1094} 1095 1096AJAX_ThreadPool.prototype.AJAX_Call_Module = function( callback, session_type, module_code, func, parameters ) 1097{ 1098 var self = this; 1099 var request, adjusted_callback; 1100 1101 adjusted_callback = function( response ) 1102 { 1103 var index; 1104 1105 callback( response ); 1106 self.ThreadComplete(); 1107 1108 index = arrayIndexOf( self.running_queue, request ); 1109 1110 if ( index != -1 ) 1111 { 1112 self.running_queue.splice( index, 1 ); 1113 } 1114 } 1115 1116 request = function() 1117 { 1118 self.running_queue.push( request ); 1119 request.http_request = AJAX_Call_Module( adjusted_callback, session_type, module_code, func, parameters ); 1120 } 1121 1122 this.queue.push( request ); 1123 1124 return request; 1125} 1126 1127AJAX_ThreadPool.prototype.AJAX_Call_Module_JSON = function( callback, session_type, module_code, func, data ) 1128{ 1129 var self = this; 1130 var request, adjusted_callback; 1131 1132 adjusted_callback = function( response ) 1133 { 1134 var index; 1135 1136 callback( response ); 1137 self.ThreadComplete(); 1138 1139 index = arrayIndexOf( self.running_queue, request ); 1140 1141 if ( index != -1 ) 1142 { 1143 self.running_queue.splice( index, 1 ); 1144 } 1145 } 1146 1147 request = function() 1148 { 1149 self.running_queue.push( request ); 1150 request.http_request = AJAX_Call_Module_JSON( adjusted_callback, session_type, module_code, func, data ); 1151 } 1152 1153 this.queue.push( request ); 1154 1155 return request; 1156} 1157 1158AJAX_ThreadPool.prototype.AJAX_Call_Module_WithFile = function( progress_object, session_type, module_code, func, parameters, file_field, file_input, file_object ) 1159{ 1160 var self = this; 1161 var request; 1162 1163 progress_object.AJAX_ThreadPool_OriginalComplete = progress_object.Complete; 1164 progress_object.Complete = function( response ) 1165 { 1166 var index; 1167 1168 progress_object.AJAX_ThreadPool_OriginalComplete( response ); 1169 1170 self.ThreadComplete(); 1171 1172 index = arrayIndexOf( self.running_queue, request ); 1173 1174 if ( index != -1 ) 1175 { 1176 self.running_queue.splice( index, 1 ); 1177 } 1178 1179 progress_object.Complete = progress_object.AJAX_ThreadPool_OriginalComplete; 1180 progress_object.AJAX_ThreadPool_OriginalComplete = null; 1181 } 1182 1183 request = function() 1184 { 1185 self.running_queue.push( request ); 1186 request.http_request = AJAX_Call_Module_WithFile( progress_object, session_type, module_code, func, parameters, file_field, file_input, file_object ); 1187 } 1188 1189 this.queue.push( request ); 1190 1191 return request; 1192} 1193 1194AJAX_ThreadPool.prototype.AJAX_Call_Domain = function( callback, session_type, func, parameters ) 1195{ 1196 var self = this; 1197 var request, adjusted_callback; 1198 1199 adjusted_callback = function( response ) 1200 { 1201 var index; 1202 1203 callback( response ); 1204 self.ThreadComplete(); 1205 1206 index = arrayIndexOf( self.running_queue, request ); 1207 1208 if ( index != -1 ) 1209 { 1210 self.running_queue.splice( index, 1 ); 1211 } 1212 } 1213 1214 request = function() 1215 { 1216 self.running_queue.push( request ); 1217 request.http_request = AJAX_Call_Domain( adjusted_callback, session_type, func, parameters ); 1218 } 1219 1220 this.queue.push( request ); 1221 1222 return request; 1223} 1224 1225AJAX_ThreadPool.prototype.AJAX_Call_Domain_JSON = function( callback, session_type, func, parameters ) 1226{ 1227 var self = this; 1228 var request, adjusted_callback; 1229 1230 adjusted_callback = function( response ) 1231 { 1232 var index; 1233 1234 callback( response ); 1235 self.ThreadComplete(); 1236 1237 index = arrayIndexOf( self.running_queue, request ); 1238 1239 if ( index != -1 ) 1240 { 1241 self.running_queue.splice( index, 1 ); 1242 } 1243 } 1244 1245 request = function() 1246 { 1247 self.running_queue.push( request ); 1248 request.http_request = AJAX_Call_Domain_JSON( adjusted_callback, session_type, func, parameters ); 1249 } 1250 1251 this.queue.push( request ); 1252 1253 return request; 1254} 1255 1256AJAX_ThreadPool.prototype.AJAX_Call_Module_Domain_JSON = function( callback, session_type, module_code, func, parameters ) 1257{ 1258 var self = this; 1259 var request, adjusted_callback; 1260 1261 adjusted_callback = function( response ) 1262 { 1263 var index; 1264 1265 callback( response ); 1266 self.ThreadComplete(); 1267 1268 index = arrayIndexOf( self.running_queue, request ); 1269 1270 if ( index != -1 ) 1271 { 1272 self.running_queue.splice( index, 1 ); 1273 } 1274 } 1275 1276 request = function() 1277 { 1278 self.running_queue.push( request ); 1279 request.http_request = AJAX_Call_Module_Domain_JSON( adjusted_callback, session_type, module_code, func, parameters ); 1280 } 1281 1282 this.queue.push( request ); 1283 1284 return request; 1285} 1286 1287AJAX_ThreadPool.prototype.AJAX_Call = function( callback, session_type, func, parameters ) 1288{ 1289 var self = this; 1290 var request, adjusted_callback; 1291 1292 adjusted_callback = function( response ) 1293 { 1294 var index; 1295 1296 callback( response ); 1297 self.ThreadComplete(); 1298 1299 index = arrayIndexOf( self.running_queue, request ); 1300 1301 if ( index != -1 ) 1302 { 1303 self.running_queue.splice( index, 1 ); 1304 } 1305 } 1306 1307 request = function() 1308 { 1309 self.running_queue.push( request ); 1310 request.http_request = AJAX_Call( adjusted_callback, session_type, func, parameters ); 1311 } 1312 1313 this.queue.push( request ); 1314 1315 return request; 1316} 1317 1318AJAX_ThreadPool.prototype.AJAX_Call_WithStoreCode = function( callback, session_type, store_code, func, parameters ) 1319{ 1320 var self = this; 1321 var request, adjusted_callback; 1322 1323 adjusted_callback = function( response ) 1324 { 1325 var index; 1326 1327 callback( response ); 1328 self.ThreadComplete(); 1329 1330 index = arrayIndexOf( self.running_queue, request ); 1331 1332 if ( index != -1 ) 1333 { 1334 self.running_queue.splice( index, 1 ); 1335 } 1336 } 1337 1338 request = function() 1339 { 1340 self.running_queue.push( request ); 1341 request.http_request = AJAX_Call_WithStoreCode( adjusted_callback, session_type, store_code, func, parameters ); 1342 } 1343 1344 this.queue.push( request ); 1345 1346 return request; 1347} 1348 1349AJAX_ThreadPool.prototype.AJAX_Call_JSON = function( callback, session_type, func, parameters ) 1350{ 1351 var self = this; 1352 var request, adjusted_callback; 1353 1354 adjusted_callback = function( response ) 1355 { 1356 var index; 1357 1358 callback( response ); 1359 self.ThreadComplete(); 1360 1361 index = arrayIndexOf( self.running_queue, request ); 1362 1363 if ( index != -1 ) 1364 { 1365 self.running_queue.splice( index, 1 ); 1366 } 1367 } 1368 1369 request = function() 1370 { 1371 self.running_queue.push( request ); 1372 request.http_request = AJAX_Call_JSON( adjusted_callback, session_type, func, parameters ); 1373 } 1374 1375 this.queue.push( request ); 1376 1377 return request; 1378} 1379 1380AJAX_ThreadPool.prototype.AJAX_Call_JSON_Runtime = function( callback, session_type, func, parameters, flags ) 1381{ 1382 var self = this; 1383 var request, adjusted_callback; 1384 1385 adjusted_callback = function( response ) 1386 { 1387 var index; 1388 1389 callback( response ); 1390 self.ThreadComplete(); 1391 1392 index = arrayIndexOf( self.running_queue, request ); 1393 1394 if ( index != -1 ) 1395 { 1396 self.running_queue.splice( index, 1 ); 1397 } 1398 } 1399 1400 request = function() 1401 { 1402 self.running_queue.push( request ); 1403 request.http_request = AJAX_Call_JSON_Runtime( adjusted_callback, session_type, func, parameters, flags ); 1404 } 1405 1406 this.queue.push( request ); 1407 1408 return request; 1409} 1410 1411AJAX_ThreadPool.prototype.AJAX_Call_WithFile = function( progress_object, session_type, func, parameters, file_field, file_input, file_object ) 1412{ 1413 var self = this; 1414 var request; 1415 1416 progress_object.AJAX_ThreadPool_OriginalComplete = progress_object.Complete; 1417 progress_object.Complete = function( response ) 1418 { 1419 var index; 1420 1421 progress_object.AJAX_ThreadPool_OriginalComplete( response ); 1422 1423 self.ThreadComplete(); 1424 1425 index = arrayIndexOf( self.running_queue, request ); 1426 1427 if ( index != -1 ) 1428 { 1429 self.running_queue.splice( index, 1 ); 1430 } 1431 1432 progress_object.Complete = progress_object.AJAX_ThreadPool_OriginalComplete; 1433 progress_object.AJAX_ThreadPool_OriginalComplete = null; 1434 } 1435 1436 request = function() 1437 { 1438 self.running_queue.push( request ); 1439 request.http_request = AJAX_Call_WithFile( progress_object, session_type, func, parameters, file_field, file_input, file_object ); 1440 } 1441 1442 this.queue.push( request ); 1443 1444 return request; 1445} 1446 1447AJAX_ThreadPool.prototype.AJAX_Call_Custom = function( callback, fn1 ) 1448{ 1449 var self = this; 1450 var request, adjusted_callback; 1451 1452 adjusted_callback = function( response ) 1453 { 1454 var index; 1455 1456 callback( response ); 1457 self.ThreadComplete(); 1458 1459 index = arrayIndexOf( self.running_queue, request ); 1460 1461 if ( index != -1 ) 1462 { 1463 self.running_queue.splice( index, 1 ); 1464 } 1465 } 1466 1467 request = function() 1468 { 1469 self.running_queue.push( request ); 1470 1471 // 1472 // adjusted_callback should always be passed parameter "response" 1473 // request should have member "http_request" added if using an XMLHTTPRequest is made 1474 // 1475 1476 setTimeout( function() { fn1( adjusted_callback, request ); }, 0 ); 1477 } 1478 1479 this.queue.push( request ); 1480 1481 return request; 1482} 1483 1484AJAX_ThreadPool.prototype.Run = function() 1485{ 1486 var i, i_len; 1487 1488 if ( this.running ) 1489 { 1490 if ( this.active_count < this.threads ) 1491 { 1492 for ( i = this.active_count; i <= this.threads; i++ ) 1493 { 1494 this.ThreadStart(); 1495 } 1496 } 1497 1498 return; 1499 } 1500 1501 this.onStart(); 1502 this.running = true; 1503 1504 if ( this.queue.length == 0 ) 1505 { 1506 return this.Finished(); 1507 } 1508 1509 for ( i = 0, i_len = this.threads; ( i < i_len ) && ( this.queue.length > 0 ); i++ ) 1510 { 1511 this.ThreadStart(); 1512 } 1513} 1514 1515AJAX_ThreadPool.prototype.Cancel = function() 1516{ 1517 var queue, popped; 1518 1519 queue = this.running_queue; 1520 this.active_count = 0; 1521 this.running = false;
1522 this.queue = new Array(); 1523 this.running_queue = new Array(); 1524 1525 while ( queue.length ) 1526 { 1527 popped = queue.pop(); 1528 1529 if ( popped && popped.http_request ) 1530 { 1531 popped.http_request.onload = function() {}; 1532 popped.http_request.onreadystatechange = function() {}; 1533 1534 popped.http_request.abort(); 1535 } 1536 } 1537 1538 this.onComplete(); 1539} 1540 1541AJAX_ThreadPool.prototype.Queue_Count = function() 1542{ 1543 return this.queue.length; 1544} 1545 1546AJAX_ThreadPool.prototype.Thread_Limit = function() 1547{ 1548 return this.threads; 1549} 1550 1551AJAX_ThreadPool.prototype.DequeueFromStart = function( count ) 1552{ 1553 if ( !count ) 1554 { 1555 count = 1; 1556 } 1557 1558 while ( this.queue.length && count-- ) 1559 { 1560 this.queue.splice( 0, 1 ); 1561 } 1562} 1563 1564AJAX_ThreadPool.prototype.LimitQueueToCount = function( count ) 1565{ 1566 if ( !count ) 1567 { 1568 return; 1569 } 1570 1571 while ( this.queue.length > count ) 1572 { 1573 this.queue.splice( 0, 1 ); 1574 } 1575} 1576 1577AJAX_ThreadPool.prototype.RemoveFromQueue = function( request ) 1578{ 1579 var index = this.queue.indexOf( request ); 1580 1581 if ( index !== -1 ) 1582 { 1583 this.queue.splice( index, 1 ); 1584 } 1585} 1586 1587AJAX_ThreadPool.prototype.SetThreadCount = function( threads ) 1588{ 1589 this.threads = threads 1590} 1591 1592AJAX_ThreadPool.prototype.ThreadStart = function() 1593{ 1594 if ( this.queue.length == 0 ) 1595 { 1596 if ( this.active_count == 0 ) 1597 { 1598 this.Finished(); 1599 } 1600 1601 return; 1602 } 1603 1604 this.active_count++; 1605 this.queue.splice( 0, 1 )[ 0 ](); 1606} 1607 1608AJAX_ThreadPool.prototype.ThreadComplete = function() 1609{ 1610 this.active_count--; 1611 this.ThreadStart(); 1612} 1613 1614AJAX_ThreadPool.prototype.Finished = function() 1615{ 1616 if ( this.active_count == 0 ) 1617 { 1618 this.running = false; 1619 1620 this.onComplete(); 1621 } 1622} 1623 1624AJAX_ThreadPool.prototype.Running = function() 1625{ 1626 if ( this.running ) 1627 { 1628 return true; 1629 } 1630 1631 return false; 1632} 1633 1634AJAX_ThreadPool.prototype.onStart = function() { ; } 1635AJAX_ThreadPool.prototype.onComplete = function() { ; }
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.