
    // etot parser texta vzjat s apple.com
    // retrieve text of an XML document element, including
    // elements using namespaces
    function getElementTextNS(prefix, local, parentElem, index)
    {
        var result = "";
        if (prefix && isIE)
        {
            // IE/Windows way of handling namespaces
            result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
        }
        else
        {
            // the namespace versions of this method
            // (getElementsByTagNameNS()) operate
            // differently in Safari and Mozilla, but both
            // return value with just local name, provided
            // there aren\'t conflicts with non-namespace element
            // names
            result = parentElem.getElementsByTagName(local)[index];
        }
        if (result)
        {
            // get text, accounting for possible
            // whitespace (carriage return) text nodes
            if (result.childNodes.length > 1)
            {
                return result.childNodes[1].nodeValue;
            }
            else
            {
                if (result.firstChild)
                {
            		return result.firstChild.nodeValue;
                }
                else
                {
                	return '';
                }

            }
        } else {
            return false;
            return "n/a";
        }
    }


    // retrieve tag of an XML document element, including
    // elements using namespaces
    function getElementObject(prefix, local, parentElem, index)
    {
        var result = "";
        if (prefix && isIE)
        {
            // IE/Windows way of handling namespaces
            result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
        }
        else
        {
            // the namespace versions of this method
            // (getElementsByTagNameNS()) operate
            // differently in Safari and Mozilla, but both
            // return value with just local name, provided
            // there aren\'t conflicts with non-namespace element
            // names
            result = parentElem.getElementsByTagName(local)[index];
        }
        if (result)
        {
        	return result;
            // get text, accounting for possible
            // whitespace (carriage return) text nodes
            if (result.childNodes.length > 1)
            {
                return result.childNodes[1].nodeValue;
            }
            else
            {
                return result.firstChild.nodeValue;
            }
        } else {
            return false;
            return "n/a";
        }
    }


   	function collectFieldsValues(f)
   	{
   		var monovals = '';
   		var multivals = '';

   		var postString = '';
		//console.log(f.elements);
		for (var i=0; i<f.elements.length; i++)
		{
			//console.log(f.elements[i].tagName.toLowerCase(), f.elements[i].name);
			if (f.elements[i].tagName.toLowerCase()=='input')
			{
				if (f.elements[i].type=='checkbox')
				{
					if (f.elements[i].checked==true)
					{
						postString += f.elements[i].name +'='+encodeURIComponent(f.elements[i].value)+'&';
					}
				}
				else
				{
					postString += f.elements[i].name +'='+encodeURIComponent(f.elements[i].value)+'&';
				}
			}
			else if (f.elements[i].tagName.toLowerCase()=='textarea')
			{
				postString += f.elements[i].name +'='+encodeURIComponent(f.elements[i].value)+'&';
				/**
				if (f.elements[i].firstChild)
				if (f.elements[i].firstChild.nodeName=='#text')
				postString +=  f.elements[i].name +'='+escape(f.elements[i].firstChild.nodeValue)+'&';
				*/
			}
			else if (f.elements[i].tagName.toLowerCase()=='select')
			{
				postString += f.elements[i].name +'='+(f.elements[i].selectedIndex>-1?encodeURIComponent(f.elements[i].options[f.elements[i].selectedIndex].value):'')+'&';
				/**
				if (f.elements[i].firstChild)
				if (f.elements[i].firstChild.nodeName=='#text')
				postString +=  f.elements[i].name +'='+escape(f.elements[i].firstChild.nodeValue)+'&';
				*/
			}
		}
		//console.log(postString);
		return postString;
   	}

   	function SwitchEditor(name, mode, texts)
   	{
   		var status_span = document.getElementById("smarteditor_status_"+name);
   		var status_hidden = document.getElementById("smarteditor_"+name);
   		if (!status_span) return false;

   		// это включение
   		if (mode==1)
   		{
			status_span.innerHTML = texts[0]?texts[0]:"On";
			status_hidden.value = 1;
			tinyMCE.execCommand("mceAddControl", false, name);
			//console.log('on', name);
   		}
   		// это простой свитч
   		else if (mode==2)
   		{
   			var new_s = (status_hidden.value+1);
   			//console.log(new_s);
			SwitchEditor(name, new_s, texts);
   		}
   		else
   		{
			status_span.innerHTML = texts[1]?texts[1]:"Off";
			status_hidden.value = 0;
			tinyMCE.execCommand("mceRemoveControl", false, name)
			//console.log('off');
   		}
   	}
/*
   	var tinyMCEmode = true;
function toogleEditorMode(sEditorID) {
    try {
        if(tinyMCEmode) {
            tinyMCE.removeMCEControl(tinyMCE.getEditorId(sEditorID));
            tinyMCEmode = false;
        } else {
            tinyMCE.addMCEControl(document.getElementById('pagecontent'), sEditorID);
            tinyMCEmode = true;
        }
    } catch(e) {
        //error handling
    }
}
*/
	/**
		визуализация переключалки языков
	*/
	var tmp_lng_id = false;
	var tmp_lng_onclick = false;
	var tmp_lng_href = false;
	function SwitchLanguage(l)
	{
		var lis = document.getElementsByTagName("li");
		for (var i=0; i<lis.length; i++)
		{
			if (lis[i].id.substring(0, 10)=="languages[")
			{
				lis[i].className='';
			}

			if (lis[i].id==tmp_lng_id)
			{
				var ta = lis[i].firstChild;

				//console.log(ta.nodeName);

				while (ta.nodeName!='A')
				{
					if (ta.nextSibling)
					{
						ta = ta.nextSibling;
					}
					else
					{
						return;
					}
				}
				ta.style.cursor = 'pointer';
				ta.onclick = tmp_lng_onclick;
				ta.href = tmp_lng_href;
			}

		}
		var activ = document.getElementById("languages["+l+"]");

		if (!activ) return;

		activ.className='act';
		var a = activ.firstChild;

		//console.log(a.nodeName);

		while (a.nodeName!='A')
		{
			if (a.nextSibling)
			{
				a = a.nextSibling;
			}
			else
			{
				return;
			}
		}
		tmp_lng_id = activ.id;
		tmp_lng_href = a.href;
		tmp_lng_onclick = a.onclick;
		a.style.cursor = 'default';
		a.href = '';
		a = attachEvent2(a, "click", function(){return false});




		//tmp_lng_id = activ.id;
/*
		a.style.cursor = 'default';
		a.onclick = 'return false;';
		a.href = '';


/*
		//console.log(a);
		var tmptxt = a.firstChild;


		while (tmptxt.nodeName!='#text')
		{
			if (tmptxt.nextSibling)
			{
				tmptxt = tmptxt.nextSibling;
			}
			else
			{
				return;
			}
		}

		activ.innerHTML = tmptxt.nodeValue;
*/
	}

	function execPgFunction(func, container)
	{
		//try {

		var req;

		this.loadXMLDoc = function (url)
		{
			// branch for native XMLHttpRequest object
			if (window.XMLHttpRequest)
			{
				req = new XMLHttpRequest();
				req.o = this;
				req.onreadystatechange = this.responseAction;
				//console.log(url);
				req.open("GET", url, true);
				req.send(null);
				// branch for IE/Windows ActiveX version
			}
			else if (window.ActiveXObject)
			{
				req = new ActiveXObject("Microsoft.XMLHTTP");
				if (req)
				{
					req.o = this;
					req.onreadystatechange = this.responseAction;
					req.open("GET", url, true);
					req.send();
				}
			}
		}

		this.responseAction = function ()
		{
			//console.log(12);
			if (req.readyState == 4)
			{
				//console.log(14);
				if (req.status == 200)
				{
					//console.log(16);
					if (!req.responseXML) return;
					//console.log(18);
					var resp = req.responseXML.getElementsByTagName("response");

					eval(getElementTextNS("", "status", resp[0], 0));
					// заполнение полей формы
					/**
					for (var i = 0; i < formData.length; i++)
		        	{
		        		//console.log(getElementObject("", "value", formData[i], 0).getAttribute("lng"));
		        		var dob = document.getElementById("main_ctf_text");
		        		dob.value = getElementTextNS("", "value", formData[i], 0);
		        		fields[0] = dob;
		        		fields_vhashes[0] = hex_md5(dob.value);

						if (tinyMCE)
						{
							tinyMCE.setContent(dob.value);
						}
		        	}
					document.getElementById(applyToFormName+"_l").value = lang;
					*/
				}
			}
		}

		XMLFile = XMLsPath+'execPgFunction.xml.php?l='+XMLsLang+'&container_id='+container+'&function='+func+'&'+Math.random();
		//console.log(XMLFile);
		this.loadXMLDoc(XMLFile);
		//} catch (err) { console.log(err); }

	}

	/**
		очистка селекта
	*/
	function selectRemoveOptions(select_id)
	{
		if (select_id.tagName && select_id.tagName=="SELECT")
		{
			var select = select_id;
		}
		else
		{
			var select = document.getElementById(select_id);
		}

		while (select.options.length)
		{
			select.removeChild(select.options[select.options.length-1]);
		}
	}

	/**
		selects option in select
	*/
	function selectSetSelected(select_id, selected_value, reset)
	{
		if (select_id.tagName && select_id.tagName=="SELECT")
		{
			var select = select_id;
		}
		else
		{
			var select = document.getElementById(select_id);
		}

		for (var i=0; i<select.options.length; i++)
		{
			if (select.options[i].value==selected_value)
			{
				select.options[i].selected=true;
				//eval(select.name+"_select_v = "+selected_value);
				setSuperSelectLinks(select);
				return;
			}
			else
			{
				/**
					если установлен параметр reset, то сбрасываем все выделенные,
					иначе получается мультиселект
				*/
				if (reset)
				{
					select.options[i].selected=false;
				}
			}

		}

	}

	function selectAddOption(select_id, option_value, option_caption)
	{
		if (select_id.tagName && select_id.tagName=="SELECT")
		{
			var select = select_id;
		}
		else
		{
			var select = document.getElementById(select_id);
		}

		var option = document.createElement("option");

		option.value = option_value;

		option.appendChild(document.createTextNode(option_caption));

		select.appendChild(option);
	}

	/**
		апдейт опшинса
	*/
	function selectUpdateOption(select_id, option_value, option_caption)
	{
		if (select_id.tagName && select_id.tagName=="SELECT")
		{
			var select = select_id;
		}
		else
		{
			var select = document.getElementById(select_id);
		}

		for (var i=0; i<select.options.length; i++)
		{
			if (select.options[i].value==option_value)
			{
				select.options[i].text = option_caption;
			}
		}

	}

	/**
		reload opener

	function parentReload()
	{
		if (window.openner)
		{
			window.openner.location.href=window.openner.location.href;
		}
		else
		{
			window.parent.location.href=window.parent.location.href;
		}
	}
	*/

	/**
		getElementByName для инпутов типа чекбокс или радио, так как у них ID с добавкой обычно типа [val]
	*/
	function _getInputByName(name, value, type)
	{
		if (!type) type = "checkbox";

		var inputs = document.getElementsByTagName("input");

		for (var loop=0; loop<inputs.length; loop++)
		{
			//console.log(inputs[loop].type);
			if (inputs[loop].type==type && inputs[loop].name==name)
			{
				if (inputs[loop].id==name+'['+value+']')
				{
					return inputs[loop];
				}
			}
		}
		return false;
	}

	/**
		перебираем ветку xml и заполняем тем самым форму.
	*/
	function fetchXML2form2(xml)
	{
		/**
			чилды это только описание полей.
		*/
		var fields_branch = xml.getElementsByTagName("fields");
		var values_branch = xml.getElementsByTagName("values");

		if (!(values_branch.length==1 && fields_branch.length)) return false;


		var child = fields_branch[0].firstChild;
		while (child)
		{
			if (child.nodeName!="#text")
			{
				/**
					если тег обозван как "мультизначейный"
					или присутствует несколько таких тегов, то по нима топаем циклом
				*/
				var multilang = child.getAttribute("ml");
				var prefix = "";
				if (multilang)
				{
					// у мульти язычных полей идет приставка i_
					if (multilang)
					{
						//prefix = "i_";
						var values = values_branch[0].getElementsByTagName(prefix+child.tagName);
					}
					//console.log(values.length, prefix);
					// цикл по всем инстансам тега, и перебор объектов формы
					for (var loop=0; loop<values.length; loop++)
					{
						var ml = values[loop].getAttribute("lng");
						//console.log(values[loop], ml);
						if (ml)
						{
							var tmp_o = document.getElementById(values[loop].tagName+"["+ml+"]");
							if (tmp_o)
							{
								elementSetValue(tmp_o, getElementTextNS("", values[loop].tagName, values_branch[0], loop));
							}
						}
					}
					//console.log(11);
				}
				// один тег если, или не помечен как "мультизначейный"
				else
				{
					var values = values_branch[0].getElementsByTagName(child.tagName);
					if (values)
					{
						var tmp_o = document.getElementById(child.tagName);
						var value = getElementTextNS("", child.tagName, values_branch[0], 0);
						/**
							если не нашли элемент по айдишнику, то попробуем поискать по имени,
							но не стандартными средствами, которые не рекомендуются, а своиоми силами
						if (!tmp_o)
						{
							tmp_o = _getInputByName(child.tagName, value, "checkbox");
						}
						console.log(child.tagName, tmp_o);
						*/
						if (tmp_o)
						{
							elementSetValue(tmp_o, value);
						}
					}
				}
			}

			child = child.nextSibling;
		}
	}

	function elementSetValue(tmp_o, value)
	{
		//console.log(tmp_o, value);
		//устанавливаем селект
		if (tmp_o.tagName=="SELECT")
		{
			selectSetSelected(tmp_o.id, value, false);
		}
		else if (tmp_o.tagName=="INPUT" && tmp_o.getAttribute("type")=="checkbox")
		{
			/*

			*/
			if (value=="t")
			{
				tmp_o.checked = true;
				tmp_o.value = 't';
			}
			else
			{
				tmp_o.checked = false;
				//tmp_o.value = value;
			}
		}
		//	простой элемент
		else
		{
			//console.log(lng_rows[loop].tagName);
			tmp_o.value = value;
		}
	}

	function outputAjaxMessage(errreq)
	{
		//getElementTextNS("", "message", status[0], 0)
		var errors = errreq.getElementsByTagName("message");
		var outputblock = document.getElementById("msg_container");
		if (outputblock && errors)
		{
			outputblock.innerHTML = "";
			for (var loop=0; loop<errors.length; loop++)
			{
				var type = errors[loop].getAttribute("type");
				if (!type) type = "ok";
				var errdiv = document.createElement("DIV");
				errdiv.id = "msg_"+type;
				var t = document.createTextNode(getElementTextNS("", errors[loop].tagName, errreq, loop));
				if (t)
				{
					errdiv.appendChild(t);
					outputblock.appendChild(errdiv);
				}
			}
			//outputblock.innerHTML = txt+outputblock.innerHTML;
		}
	}


	function outputErrorMessage(errtxt, clean)
	{
		if (clean) outputblock.innerHTML = "";
		var outputblock = document.getElementById("msg_container");
		if (outputblock && errtxt)
		{
			var errdiv = document.createElement("DIV");
			errdiv.id = "msg_err";
			errdiv.appendChild(document.createTextNode(errtxt.replace("\'", "'")));
			outputblock.appendChild(errdiv);
			//outputblock.innerHTML = txt+outputblock.innerHTML;
		}
	}


	/**
		ищим первый не текстовой чилд в ноде
	*/
	function findFirstBlock(parentNode)
	{
		var fch = parentNode.firstChild;

		if (fch.nodeName!="#text")
		{
			return fch;
		}
		else
		{
			var ffch = fch.nextSibling;
			while (ffch && ffch.nodeName=="#text")
			{
				ffch = ffch.nextSibling;
			}

			if (ffch && ffch.nodeName!="#text")
			{
				return ffch;
			}
			else
			{
				return false;
			}
		}
	}

	function toggleDD(opn)
	{
		tmp = "DD";
		tgl = document.getElementById(tmp);

		tmp2 = "DD_btn";
		tgl2 = document.getElementById(tmp2);

		if (tgl)
		{
			if ( (tgl.className == 'closed') || opn)
			{
				tgl.className = "open";
				tgl2.className = "open";
				createCookie("cmsPanel_state", "open", 30);
			}
			else
			{
				tgl.className = "closed";
				tgl2.className = "closed";
				createCookie("cmsPanel_state", "close", 30);
			}
		}
	}

	/**
		открытие маленького попапа
	*/
	function openCmsSubWindow(e, w, h)
	{
		var o = e.srcElement ? e.srcElement : e.target;
		w = w?w:800;
		h = h?h:600;

		var win = window.open(o.href, '', 'top='+(screen.height/2-h/2)+', left='+(screen.width/2-w/2)+', width='+w+', height='+h+', location=yes, menubar=no, resizable=yes, directories=no, scrollbars=yes, status=no, toolbar=yes');
		//console.log(win.location.href);

		/*sometime needed win.onload = function(){win.location.href=o.href};*/
		//document.attachEvent("onload", function(){win.location.href=o.href});

		//alert(e.button);
		return false;
	}

	function createCookie(name,value,days)
	{
		if (days)
		{
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}

	function readCookie(name)
	{
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++)
		{
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	}

	/**
		для суперселекта нашего надо установить значение в ссылках для редактирования и добавления
	*/
	function setSuperSelectLinks(select, alt_start_href)
	{
		var ae = document.getElementById(select.name+'_select_edit_href');
		var aa = document.getElementById(select.name+'_select_add_href');
		var arem = document.getElementById(select.name+'_select_rem_href');
		try
		{
			var excepts = eval(select.name+"_select_disabled_elems");
		}
		catch (e)
		{
			var excepts = false;
		}
		if (ae && aa)
		{
			var link_begin = alt_start_href?alt_start_href:eval(select.name+"_select_start_href");
			if (select.selectedIndex>-1)
			{
				ae.href = link_begin+'_['+select.options[select.selectedIndex].value+']&select_id='+select.id;
				aa.href = link_begin+'_[0]&select_id='+select.id;
				//console.log(excepts.indexOf(parseInt(select.options[select.selectedIndex].value)));
				//console.log(select.options[select.selectedIndex].value);
				if (excepts.indexOf(parseInt(select.options[select.selectedIndex].value))>-1)
				{
					arem.style.display = 'none';
					//con
				}
				else
				{
					arem.style.display = 'inline';
				}
			}
			else
			{
				ae.href = link_begin+'_[0]&select_id='+select.id;
				aa.href = link_begin+'_[0]&select_id='+select.id;
			}
			//console.log(3);
		}

	}

	function dropSelectOption(select_id, option)
	{
		if (select_id.tagName && select_id.tagName=="SELECT")
		{
			var select = select_id;
		}
		else
		{
			var select = document.getElementById(select_id);
		}

		for (var i=0; i<select.options.length; i++)
		{
			if (select.options[i].value==option)
			{
				//select.options[i];
				select.removeChild(select.options[i]);
			}
		}
		setSuperSelectLinks(select);
	}

	/**
		апдейт элемента суперселккта в родительском окне
	*/
	function parentWindow_selectUpdateOption(list_id, option_value, option_caption)
	{
		var select = false;
		if (window.opener)
		{
			select = window.opener.document.getElementById(list_id);
		}
		else if (window.parent)
		{
			select = window.parent.getElementById(list_id);
		}

		//console.log(1);
		if (!select) return false;
		//console.log(2);

		selectUpdateOption(select, option_value, option_caption);
		selectSetSelected(select, option_value);
	}

	/**
		апдейт элемента суперселккта в родительском окне
	*/
	function parentWindow_selectAddOption(list_id, option_value, option_caption)
	{
		var select = false;
		if (window.opener)
		{
			select = window.opener.document.getElementById(list_id);
		}
		else if (window.parent)
		{
			select = window.parent.getElementById(list_id);
		}

		//console.log(1);
		if (!select) return false;
		//console.log(2);

		selectAddOption(select, option_value, option_caption);
		selectSetSelected(select, option_value);
	}

	/**
		открывает смарт эдитор для текущей текстареи
	*/
	function openSmart(tarea, fname, w, h)
	{
		var hrf = 'content.php?l='+XMLsLang_adm+'&container_id=smart_['+tarea.name+']['+fname+']';
		w = w?w:800;
		h = h?h:600;

		var win = window.open(hrf, tarea.name, 'top='+(screen.height/2-h/2+20)+', left='+(screen.width/2-w/2+20)+', width='+w+', height='+h+', location=yes, menubar=no, resizable=yes, directories=no, scrollbars=yes, status=no, toolbar=yes');
		//console.log(win.location.href);

		/*sometime needed win.onload = function(){win.location.href=o.href};*/
		//document.attachEvent("onload", function(){win.location.href=o.href});

		//alert(e.button);
		return false;
	}

	function attachEvent2(o, evt, todo)
	{
		if (o.addEventListener)
		{
			o.removeEventListener(evt, function(){}, true);
			o.addEventListener(evt, todo, false);
		}
		else
		{
			o.attachEvent("on"+evt, todo);
			o.detachEvent("on"+evt);
		}

		return o;
	}

	function isNumberKey(evt)
	{
		var charCode = (evt.which) ? evt.which : event.keyCode
		if (charCode > 31 && (charCode < 48 || charCode > 57))
		return false;
		return true;
	}
