PageSourceSearch

https://planetarypinball.com/mm5/clientside.mvc?T=593123fd&Filename=ajax.js

js planetarypinball.com collected 2026-09-25 01:12:07 UTC 42,354 bytes, 1,635 lines download raw bytes

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.