
// Win-1251 comments
// ! use 'aim.js'

// ASB, 2007/12/29 - start
// ASB, 2008/02/14 - ...
// ASB, 2008/08/27 - ...
// ASB, 2008/09/12 - fix ajaxFormUpload() for eval javascript from responce
// ASB, 2008/09/15 - fix ajaxRequestSubForm() for correct processing select-multiple fields
// ASB, 2008/09/25
// ASB, 2008/11/24 - ajaxImage()
// ASB, 2008/12/01 - bugfixes, ajaxHere()

// ! Use only jQuery() instead of $() and jQuery.noConflict() if need using other js-libraries

// Ограничения:
// - приведенные здесь функции должны бы корректно интерпретировать HTML+JS, полученные в AJAX-ответе
//   но замечено, что для MSIE6.0 такое <script>-вкрапление может быть только одно, иначе - проблемы

function ajaxIndicator( status, indicator_id ) {
	//alert( "ajaxIndicator( '" + status + "', '" + indicator_id + "' )" );
	if( undefined == indicator_id ) indicator_id = 'indicator';
	//alert(indicator_id);
	jQuery('#'+indicator_id).css( { visibility: ( status == 0 ? "hidden" : "visible" ) } );
}

function ajaxRequest( element_id, url, data, onload_func ) {
	ajaxIndicator(1);
	//alert( "ajaxRequest( '" + element_id + "', '" + url + "' )" );
	//var max = data.length; for( var i = 0; i < max; i++ ){ obj = data[i]; alert( obj.name + '=' + data[obj.name] ); }

	jQuery('#'+element_id).load( url, data, onload_func );
	ajaxIndicator(0);
}

function ajaxJs( url, data, onload_func ) {
	ajaxIndicator(1);
	//alert( "ajaxJs( '" + url + "' )" );
	jQuery.post( url, data, function(obj) {
		//alert(obj);
		eval(obj);
		if( typeof(onload_func) == 'function' ) onload_func();
		ajaxIndicator(0);
	});
}

function ajaxLink( element_id, anchor, onload_func ) {
	//alert( "ajaxLink( '" + element_id + "', a.href='" + anchor.href + "' )" );
	ajaxRequest( element_id, anchor.href, {}, onload_func );
	return false;
}

function ajaxLinkJs( anchor, onload_func ) {
	//alert( "ajaxLinkJs( '" + anchor.href + "' )" );
	ajaxJs( anchor.href, onload_func );
	return false;
}

function ajaxForm( element_id, form, onload_func ) {
	//alert( "ajaxForm( '" + element_id + "', '" + form.action + "' ), form.length = " + form.length );
//	ajaxRequest( element_id, form.action, form.elements );
	ajaxRequestSubForm( element_id, form.action, form, '', onload_func );
	return false;
}

/** send part of form - only fields with name begin by name_pefix; use action = form.action or other */
function ajaxRequestSubForm( element_id, action, form, name_pefix, onload_func ) {
	//alert( "ajaxSubForm( '" + element_id + "', '" + action + "', [form], '" + name_pefix + "...' )" );
	data = {};
	var max = form.length;
	for( var i = 0; i < max; i++ ) {
		obj = form.elements[i];
		if( obj.name.indexOf(name_pefix) == 0 ) {
			if( 'checkbox' == obj.type ) {
				data[obj.name] = obj.checked;
			} else if( 'radio' == obj.type ) {
				if(obj.checked) data[obj.name] = obj.value;
			} else if( 'select-multiple' == obj.type ) {
				// obj.value = 1st selected option !
				//alert(obj.name); // element name must be "xxx[]"
				re = /\[\]$/;
				base_name = obj.name.replace(re, ''); // cut '[]'
				opt_list = obj.options;
				k = 0;
				for( j = 0; j < opt_list.length; j++ ) {
					opt_name = base_name + '[' + k + ']';
					if( true == opt_list[j].selected ) {
						data[opt_name] = opt_list[j].value;
						//alert( 'data[' + opt_name + '] = ' + data[opt_name] );
						k++;
					}
				}
			} else {
				data[obj.name] = obj.value;
			}
			//alert( 'data[' + obj.name + '] = ' + data[obj.name] );
		}
	}
	ajaxRequest( element_id, action, data, onload_func );
	return false;
}

function ajaxFormJs( form, onload_func ) {
	//alert( "ajaxFormJs( '" + form.action + "' )" );
	ajaxJs( form.action, form.elements, onload_func );
	return false;
}

// Используется aim.js (submit через скрытый iframe):
// NB! До версии 2008/09/12: если form.action возвращает HTML+JS, возможны проблемы:
// например ошибка для setupAllTabs() @ WebFXTabPane
function ajaxFormUpload( element_id, form, onload_func )
{
	//alert( "ajaxFormUpload( '" + element_id + "', '" + form.action + "' ), form.length = " + form.length );

	res = AIM.submit( form, {
		'onStart' : function() {
			//alert( "ajaxFormUpload(): callback onStart()" );
			ajaxIndicator(1);
			return true;
		},
		'onComplete' : function(response) {
			//alert( "ajaxFormUpload(): callback onComplete() response:\n" + response );

			ajaxIndicator(0);
			jQuery('#'+element_id).empty();

			// need evaluate javascripts in 'response':
			//ver1:
//			document.getElementById(element_id).innerHTML = response; // ? MSIE6: здесь выполняется JS, но он не видит уже существующий JS
			//ver2:
			jQuery('#'+element_id).html(response); // only load clean HTML, not work HTML+JS
			var scripts = jQuery( [] );
			scripts = scripts.add( jQuery( "script", response ) );
			scripts.each( eval );

			if( typeof(onload_func) == 'function' ) {
				//alert(onload_func);
				onload_func();
			}
		}
	});
	//alert(res);
	return res;
}

function ajaxImage( element_id, url, attr_list ) {
	//alert( "ajaxImage( '" + element_id + "', '" + url + "', '" + attr_list + "'" );
	if( undefined == attr_list ) attr_list = '';
	html = '<img src="' + url + '"' + attr_list + '/>';
	jQuery('#'+element_id).html( html );
	ajaxIndicator(0);
}

function ajaxHere( url, data, onload_func ) {
	//alert( "ajaxHere( '" + url + "', ... )" );
	var element_id = 'here' + Math.floor( Math.random() * 99999 ) + '' + Math.floor( Math.random() * 99999 );
	//alert(element_id);
	document.write('<span id="' + element_id + '"></span>');
	ajaxRequest( element_id, url, data, onload_func );
}
