//константы для функции ajax_run_plugin_xml
//указывают пути для запуска плагинов 
AJAX_SHELL_OBJECTS_PATH = '../_components/ajax/shell/xml/init/objects.xml';
AJAX_URL_PATH = 'index.php';


function erase_content_container(CONTAINER_ID)
{
	var container = document.getElementById(CONTAINER_ID);
	container.innerHTML = '';
}



function call_ajax(plugin_id, container_id, params) 
{
    var ajax = new cAjaxRequest();
	ajax.init();

	call_back = function()
	{
		if (ajax.is_success())
		{
			var container = document.getElementById(container_id);
			if (container) 
			{
			    container.innerHTML = ajax.get_response_text();
				delete ajax;
				delete call_back;
			}
		}
	}
		
	var url = "index.php?xml_file=xml/shells/default/script.xml&xsl_file=_xml_core/xsl/empty_document.xsl&page="+plugin_id;

	ajax.call_url(url, '', call_back, 'GET');
}

function call_ajax_script(url, params, container_id, method_name) 
{
	if (method_name==undefined)
	{
		method_name = 'GET';
	}

    var ajax = new cAjaxRequest();
	ajax.init();

	call_back = function()
	{
		if (ajax.is_success())
		{
				
				// проверка если пришел xml документ
				var obj = ajax.get_response_xml();
					//alert(ajax.get_response_text()	);
				if (obj) 
				{
					var doc_root = obj.documentElement;
					
					if (doc_root) 
					{

						var message_elem = doc_root.getElementsByTagName("message");
						if (message_elem) 
						{
							if (message_elem[0]) 
							{
								var message = message_elem[0].firstChild.data;
								if (message) 
								{
									var container = document.getElementById(container_id);
									if (container) 
									{
										container.innerHTML = message;
									}    
								}    
							}
						}

						var script_elem = doc_root.getElementsByTagName("script");
						if (script_elem) 
						{
							if (script_elem[0])
							{
								if (script_elem[0].firstChild != null)
								{
									var js_code = script_elem[0].firstChild.data;
									eval(js_code);    
								}
							}
						}

					}    
					else 
					{
						var container = document.getElementById(container_id);
						if (container) 
						{
							container.innerHTML = ajax.get_response_text();	
						}
					}
				}
				

				delete ajax;
				delete call_back;
				
/*
			var container = document.getElementById(container_id);
			if (container) 
			{
			    container.innerHTML = ajax.get_response_text();
				delete ajax;
				delete call_back;
			}*/
		}
	}
	
	// преобразование параметров в строку в случаи если нам был переда массив
	if (typeof(params)=='object')
	{
		params = arr_to_string(params);
	}

	if (method_name=='GET') 
	{
	    url = url+"?"+params;
		params = '';
	}

	ajax.call_url(url, params, call_back, method_name);
}

function arr_to_string(params)
{
	var vars = '';
	for (var HashKey in params) 
	{ 
	   param_name  = HashKey; 
	   param_value = params[HashKey];
		
		// 23 июля 2007 г. Dorian добавлено использоваения функции encodeURIComponent очень важно для успешной передачи больших данных с форм
	   vars += '&' + param_name + '=' + encodeURIComponent(param_value);
	} 

	return vars;
}

function load_content_plugin(plugin_name, content_id)
{
	var content = document.getElementById(content_id);
	content.innerHTML = '';

	create_plugin(plugin_name, plugin_name, content_id);
	set_plugin_param(plugin_name,'plugin_name',plugin_name);
	load_plugin(plugin_name);
}

// запускает плагины, которые могут взвращать pure xml!
function ajax_run_plugin_xml(plugin_name, container_id, params) 
{
	params['obj_file'] = AJAX_SHELL_OBJECTS_PATH;
	params['page'] = plugin_name;
	params['container_id'] = container_id;
	
	var url = AJAX_URL_PATH;
	
	call_ajax_script(url, params, container_id, 'POST'); 
}

// запускает плагины, которые могут взвращать pure xml!
function ajax_run_core_plugin(plugin_name, container_id, params) 
{
	params['obj_file'] = core_ajax_shell_objects_path; //'../_components/ajax/shell/xml/init/objects.xml';

	params['page'] = plugin_name;
	params['container_id'] = container_id;
	
	var url = '../_xml_core/dialog.php';
	
	call_ajax_script(url, params, container_id, 'POST'); 
}

/**
 * function ajax_run_plugin()
 * запускает плагин с указаным именем (PHP) и возвращает в указанный контейнер (предположительно тело плагина - DOM)
 * 
 * @access public	
 * @param plugin_name - идентификатор плагина в РНР
 * @param container_id - идентификатор DOM контейнера в которм живет представитель плагина
 * @param params - асоц масив параметров которые будут переданы класу плагина (PHP) [не обязательны]
 * @param method_name - тип передачи переменных (GET POST) [не обязательны] - по умолчанию GET
 * @return 
*/
function ajax_run_plugin(plugin_name, container_id, params, method_name) 
{

	//создание обьекта AJAX
	var ajax = new cAjaxRequest();
	ajax.init();

	
	//определение тела функции которая будет вызвана после загрузки
	var call_back = function()
	{
		//alert(ajax.get_ready_state());
		if (ajax.is_success())
		{
			var container = document.getElementById(container_id);

			if (container) 
			{
				//alert(ajax.get_response_text());
			    container.innerHTML = ajax.get_response_text();
				delete ajax;
				delete call_back;
			}
		}
	}
	
		
	//формирование строки вызова плагина
	var url = "index.php?xml_file=../_xml_core/xml/shells/default/script.xml&xsl_file=_xml_core/xsl/empty_document.xsl&page=" + plugin_name;

	//формирование строки передачи параметров
	// если массив параметров не пришел сами его создаем 
	if (isNaN(params))
	{
		params = new Array();
	}
	
	params['container_id'] = container_id;

	var vars = '';
	var param_counter = 0;	
	for (var HashKey in params) 
	{ 
       param_counter++;
	   param_name  = HashKey; 
	   param_value = params[HashKey];
	   // если параметр не первый добавляем разделитель
	   if (param_counter != 1)
	   {
			vars += '&';			
	   }
	   vars += param_name + '=' + param_value;
	} 

	//определение типа передачи переменных

	if (method_name==undefined)
	{
		method_name = 'GET';
	}
	//вызов плагина
	
	if (method_name=='GET'&&vars!='') 
	{
	    url = url+"&"+vars;    
	}

	ajax.call_url(url, vars, call_back, method_name);
}


/**
 * function create_plugin()
 * создает тело экземпляра плагина в указаном контейнере
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @param plugin_name - идентификатор плагина в РНР
 * @param plugin_container_id - идентификатор контейнера в который будет загружено тело плагина
 * @return 
*/

function create_plugin(plugin_body_id, plugin_name, plugin_container_id)
{
	//проверка на наличие такого плагина
	var obj = document.getElementById(plugin_body_id);

	if (obj != null)
	{
		return false;
	}
	
	
	var container = document.getElementById(plugin_container_id);
	if (container == null)
	{
		alert("Element: '" + plugin_container_id + "' not found");
		return false;
	}
	var plugin_body = '<div id="' + plugin_body_id + '" plugin_name="' + plugin_name + '"><div id="plugin_params"></div></div>';
	container.innerHTML = container.innerHTML + plugin_body;
}

/**
 * function create_plugin()
 * создает тело экземпляра плагина в указаном контейнере
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @param plugin_name - идентификатор плагина в РНР
 * @param plugin_container_id - идентификатор контейнера в который будет загружено тело плагина
 * @return 
*/

function create_element(element_body_id, element_name, container)
{
	var element_body = get_element(element_body_id);
	
	if (!element_body)
	{
		element_body = document.createElement('div');
        element_body.setAttribute('element_name', element_name);
        element_body.setAttribute('id',element_body_id);
	}
	
	container.appendChild(element_body);
	return element_body;
}

function get_element(element_body_id)
{
	var element_body = document.getElementById(element_body_id);
	if (element_body == undefined)
	{
		return false;
	}

	return element_body;
}


/**
 * function load_plugin()
 * загружает/запускает плагин в теле указанного экземпляра плагина 
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @return 
*/

function load_plugin(plugin_body_id)
{
	var plugin_body = document.getElementById(plugin_body_id);
	var plugin_name = plugin_body.getAttribute('plugin_name');

	var plugin_params = get_plugin_params(plugin_body_id);
		
	plugin_body.innerHTML = '<div class="ajax_load_message">Loading ...</div>';

	//ajax_run_plugin(plugin_name, plugin_body_id, plugin_params); 
	plugin_params['render'] = 'true';
	ajax_run_plugin_xml(plugin_name, plugin_body_id, plugin_params); 
}


/**
 * function load_plugin()
 * загружает/запускает плагин в теле указанного экземпляра плагина 
 * для запуска плагинов из старого движка
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @return 
*/

function load_core_plugin(plugin_body_id)
{
	var plugin_body = document.getElementById(plugin_body_id);
	var plugin_name = plugin_body.getAttribute('plugin_name');

	var plugin_params = get_plugin_params(plugin_body_id);
	plugin_body.innerHTML = '<div class="ajax_load_message">Loading ...</div>';
	plugin_params['render'] = 'true';
	ajax_run_core_plugin(plugin_name, plugin_body_id, plugin_params); 
}




/**
 * function get_plugin_params(plugin_body_id)
 * возвращает параметры плагина в виде асоц масива
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @return 
*/

function get_plugin_params(plugin_body_id)
{

	var	params = new Array();

	//получаю контейнер параметров плагина
	plugin_params_container = get_plugin_params_container(plugin_body_id);
	if (plugin_params_container == null)
	{
			return params;
	}

	//получение значений парамеров
	var param_elements = plugin_params_container.getElementsByTagName('INPUT');
	for(var i = 0; i < param_elements.length; i++) 
	{
		param_element = param_elements[i];
		params[param_element.name] = param_element.value;
	}

	return params;

}

/**
 * function get_plugin_param(plugin_body_id,param_name)
 * возвращает значение указанной переменной плагина
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @param param_name - имя искомой переменной
 * @return 
*/

function get_plugin_param(plugin_body_id,param_name)
{

	var	params = get_plugin_params(plugin_body_id);
	
	if (params[param_name] != undefined)
	{
		return params[param_name];
	}
	else 
	{
		return undefined;
	}

}



/**
 * function get_plugin_params_container(plugin_body_id)
 * возвращает контейнер параметров плагина (обьект)
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @return 
*/

function get_plugin_params_container(plugin_body_id)
{
	
	// получаю контейнер параметров плагина
	var plugin_body = document.getElementById(plugin_body_id);
	var plugin_body_content = plugin_body.getElementsByTagName('DIV');
	
	for (i=0; i < plugin_body_content.length; i++) 
	{
		element = plugin_body_content[i];
		if (element.id == 'plugin_params')
		{
			return element;
		}
	}

	return null;

}



/**
 * function set_plugin_param(plugin_body_id,param_name,param_value)
 * задает плагину значение указанной перемнной
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @param param_name - имя параметра
 * @param param_value - значение параметра
 * @return 
*/

function set_plugin_param(plugin_body_id,param_name,param_value)
{

	var	params = new Array();

	//получаю контейнер параметров плагина
	plugin_params_container = get_plugin_params_container(plugin_body_id);
	if (plugin_params_container == null)
	{
			return false;
	}

	//получение значений парамеров
	var param_elements = plugin_params_container.getElementsByTagName('INPUT');
	for(var i = 0; i < param_elements.length; i++) 
	{
		param_element = param_elements[i];
		if (param_element.name == param_name)
		{
			param_element.value = param_value;
			return true;
		}

	}

	plugin_params_container.innerHTML = plugin_params_container.innerHTML + '<input type="hidden" name="' + param_name + '" value="' + param_value + '" >';
	return true;

}


/**
 * function set_plugin_param(plugin_body_id,param_name,param_value)
 * задает плагину значения из асоц масива параметров
 * 
 * @access public	
 * @param plugin_body_id - DOM идентификатор тела экземпляра плагина 
 * @param params - масив параметров
 * @return 
*/

function set_plugin_params(plugin_body_id,params)
{
	for (var HashKey in params) 
	{ 
	   param_name  = HashKey; 
	   param_value = params[HashKey];
	   set_plugin_param(plugin_body_id,param_name,param_value);
	} 

}





























/**
 * function get_plugin_name(obj)
 * определяет имя тела плагина в котором находитсо обьект 
 * 
*/

function get_plugin_body(obj)
{
	if (obj.tagName == 'body')
	{
		return false;
	}

	if (obj.getAttribute('plugin_name') == null)
	{
		return get_plugin_body(obj.parentNode);
	}
	else
	{

		return obj;
	}	
	

}

















function load_ext_plugin(plugin_body_id)
{
	var plugin_body = document.getElementById(plugin_body_id);
	var plugin_name = plugin_body.getAttribute('plugin_name');

	var plugin_params = get_plugin_params(plugin_body_id);
	
	plugin_body.innerHTML = '<div class="ajax_load_message">Loading ...</div>';

	plugin_params['render'] = 'true';
	ajax_run_ext_plugin(plugin_name, plugin_body_id, plugin_name, plugin_body_id, plugin_params); 
}



/*function load_ext_element(element_body_id, incom_params)
{
	//получаю масив входных параметров
	if (incom_params==undefined)
	{
		incom_params = new Array();
	}
	
	//получаю тело елемента и его имя
	var element_body = document.getElementById(element_body_id);
	var element_name = element_body.getAttribute('element_name');
	var element_params = get_plugin_params(element_body_id);
	
	// получаю тело плагина , имя плагина, параметры плагина
	var plugin_body = get_plugin_body(element_body);
	var plugin_name = plugin_body.getAttribute('plugin_name')
	var plugin_params = get_plugin_params(plugin_body.id);
	
	//сливаю все параметры в одним масив
	var params = unite_arrays(plugin_params,element_params);
	params = unite_arrays(params,incom_params);

	//помещаю в тело эдемента признак загрузки
	element_body.innerHTML = '<div class="ajax_load_message">Loading ...</div>';

	params['render'] = 'true';
	ajax_run_ext_plugin(plugin_name, plugin_body.id, element_name, element_body_id, params); 
}*/

function ajax_run_ext_plugin(plugin_name, plugin_body_id, element_name, element_body_id, params) 
{
	params['obj_file'] = '../_components/ajax/shell/xml/init/objects.xml';
	params['page'] = plugin_name;
	params['plugin_body_id'] = plugin_body_id;
	params['element_name'] = element_name;
	params['element_body_id'] = element_body_id;
	
	var url = 'index.php';

	call_ajax_script(url, params, element_body_id, 'POST'); 
}





/* ==================================================================================== */
/* BRANCH */
/* ==================================================================================== */

function branch_node_onClick(branch_node_obj)
{

	var branch_node_status = branch_node_obj.getAttribute('status');
	switch (branch_node_status) 
	{
		
		case '0': // загружаю узлы 
				var elements = branch_node_obj.nextSibling.nextSibling.childNodes;
				var node_params = get_plugin_params(branch_node_obj.parentNode.id);
					for (var i = 0; i < elements.length; i++) 
					{
						element = elements[i];
						load_ext_element(element.id, node_params);
					}
				branch_node_obj.setAttribute('status','1');
				branch_node_obj.style.backgroundPosition = "-16px 0px";
		break;

		case '1' : // прячу узел
				branch_node_obj.nextSibling.nextSibling.style.display = 'none';
				branch_node_obj.setAttribute('status','2');
				branch_node_obj.style.backgroundPosition = "0px 0px";
		break;

		case '2' : // показываю узел
				branch_node_obj.nextSibling.nextSibling.style.display = 'block';
				branch_node_obj.setAttribute('status','1');
				branch_node_obj.style.backgroundPosition = "-16px 0px";
		break;

	} 
	
	
}


/* ==================================================================================== */
/* POPUP */
/* ==================================================================================== */

function show_popup(obj)
{

	var element_body = obj.parentNode;
	var popup_name = get_plugin_param(element_body.id, 'popup');

	var plugin_body = get_plugin_body(element_body);
	var plugin_name = plugin_body.getAttribute('plugin_name');

	var popup_body_id = plugin_name + "[" + popup_name + "]";

	var popup_body = get_element(popup_body_id);
	
	if (!popup_body)
	{
		popup_body = create_element(popup_body_id, popup_name, get_document_root_node());
		popup_body.setAttribute('plugin_name',plugin_name);
		load_ext_element(popup_body_id);
		popup_body.style.position = 'absolute';
	}

	
	popup_body.style.display = 'block';
	popup_body.style.top = event.clientY - 10 + document.body.scrollTop;
	popup_body.style.left = event.clientX - 10 + document.body.scrollLeft;

}











function get_document_root_node()
{
	var elements = document.getElementsByTagName('body');
	return elements[0];
}




function unite_arrays(array_1,array_2)
{
	var result = new Array();

	for (var HashKey in array_1) 
	{ 
	   result[HashKey] = array_1[HashKey];
	} 
	
	for (var HashKey in array_2) 
	{ 
	   result[HashKey] = array_2[HashKey];
	} 

	
	return result;
}


function load_test_plugin()
{

	erase_shop_content_container();
	
	//ext_create_plugin_element('ext_test_plugin' , 'ext_test' , SHOP_CONTENT_CONTAINER_ID);
	//ext_load_element('ext_test_plugin');

	var elem = ext_create_plugin_element('ext_test_plugin' , 'ext_test' , SHOP_CONTENT_CONTAINER_ID);
	ext_load_element(elem);

}