//Переменная AJAX запроса
var Req;
//Стек AJAX-запросов
var AJAXStack=new Array();
//Флаг, показывающий, что в данный момент происходит обработка запроса сервером
var MakingQuery=false;

//Изменение порядка объекта
function DegreeObject(ModelTableID,DegreeURL){
	SetAJAXQuery(DegreeURL);
	return false;
}

//Удаление объекта
function DeleteObject(ModelTableID,DeleteURL){
	if(!confirm('Вместе с этим объектом будут удалены все связанные файлы и все дочерние объекты. Вы действительно хотите удалить объект? '))
		return false;
	SetAJAXQuery(DeleteURL);
	return false;
}

//Выключение/включение объекта
function SwopSwitch(SwopURL){
	SetAJAXQuery(SwopURL);
	return false;
}

//Фильтрация объектов
function FilterObjects(ModelTableID,FilterURLPattern,Input){
	if(Input.value==undefined)
		return false;
	//Удаляем все ожидающие запросы из стека по фильтрации
	if(MakingQuery) {
		for(i=0;i<AJAXStack.length;i++){
			if(AJAXStack[i].IsFilter){
				AJAXStack.splice(i,1);
				i=0;
			}
		}
	}

	Query=new Object();
	URL=encodeURIComponent(Input.value);
	URL=URL.replace(/!/,	'%21');
	URL=URL.replace(/\*/,	'%2A');
	URL=URL.replace(/\(/,	'%28');
	URL=URL.replace(/\)/,	'%29');
	URL=URL.replace(/'/,	'%27');
	Query.URL=FilterURLPattern.replace(/{FILTER_VALUE}/,URL);
	Query.IsFilter=true;
	AJAXStack.push(Query);
	
	AJAXQuery();
}

//Изменение номера страницы
function ChangePage(ModelTableID,PageURL){
	SetAJAXQuery(PageURL);
	return false;
}

//Получение статуса обработки прайса
function GetPriceStatus(StatusID,StatusURL){
	SetAJAXQuery(StatusURL);
	setTimeout(GetPriceStatus,1000,StatusID,StatusURL);
	return false;
}

//Установка нового запроса в стек
function SetAJAXQuery(URL){
	Query=new Object();
	Query.URL=URL;
	Query.IsFilter=false;
	AJAXStack.push(Query);
	
	AJAXQuery();
}

//Выполнение запроса (выборка из стека)
function AJAXQuery(){
	//Если выполняется запрос в данный момент, откладываем выполнение
	if(MakingQuery)
		return;
	//Если стек пуст, тогда ничего не делаем
	if(!AJAXStack.length)
		return;

	MakingQuery=true;
	
	//Забираем данные из стека и выполняем
	Query=AJAXStack.shift();

	URL=Query.URL;
	
	//branch for native XMLHttpRequest object
	if(window.XMLHttpRequest){
		Req = new XMLHttpRequest();
		Req.onreadystatechange = HandleAJAXQuery;
		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.onreadystatechange = HandleAJAXQuery;
		Req.open("GET", URL, true);
		Req.send();
	    }
	}
}

function UnsetMakingQuery(){
	MakingQuery=false;
	AJAXQuery();
}

function HandleAJAXQuery(){
	if(Req.readyState!=4)return;
	if(Req.status!=200)return;
	HandleHTML();
	//Разрешаем использовать далее AJAX только через секунду
	setTimeout(UnsetMakingQuery,1000);
}

function HandleEntityReferences(XMLString){
	var String=XMLString;
	String=String.replace(/&amp;/g,'&');
	String=String.replace(/&lt;/g,'<');
	String=String.replace(/&gt;/g,'>');
	String=String.replace(/&apos;/g,'\'');
	String=String.replace(/&quot;/g,'"');
	return String;
}

function HandleHTML(){
	ResponseXML=Req.responseXML.getElementsByTagName('ajaxxml')[0];
	for(i=ResponseXML.childNodes.length-1;i>=0;i--){
		Node=ResponseXML.childNodes[i];
		if(Node.nodeType==1){
			if(ID=Node.getAttribute('id')){
				if(E=document.getElementById(ID)){
					if(E.tagName.toLowerCase()==Node.tagName.toLowerCase()){
						if(Node.tagName.toLowerCase()=='tbody' || Node.tagName.toLowerCase()=='thead' || Node.tagName.toLowerCase()=='tfoot'){
							if(Node.xml==undefined){
								VirtualTable=document.createElement('table');
								VirtualTable.appendChild(Node);
								NewTBodyContent=HandleEntityReferences(VirtualTable.innerHTML.replace(/^<t(body|head|foot)[^>]*>|<\/t(body|head|foot)>$/gi,''));
								E.innerHTML=NewTBodyContent;
							}
							else {
								while(E.firstChild!=undefined)
									E.removeChild(E.firstChild);
								TRs=Node.getElementsByTagName('tr');
								for(TRi=0;TRi<TRs.length;TRi++){
									VirtualTR=document.createElement('tr');
									TDs=TRs[TRi].getElementsByTagName('td');
									for(TDi=0;TDi<TDs.length;TDi++){
										VirtualTD=document.createElement('td');
										VirtualTD.innerHTML=HandleEntityReferences(TDs[TDi].xml.replace(/^<td[^>]*>|<\/td>$/gi,''));
										for(Ai=0;Ai<TDs[TDi].attributes.length;Ai++)
											VirtualTD.setAttribute(TDs[TDi].attributes[Ai].name,TDs[TDi].attributes[Ai].value);
										VirtualTR.appendChild(VirtualTD);
									}
									E.appendChild(VirtualTR);
								}
							}
						}
						else {
							R=new RegExp('^\\s*<'+Node.tagName+'[^>]*>|<\\/'+Node.tagName+'>\\s*$','gi');
							if(Node.xml==undefined){
								VirtualDIV=document.createElement('div');
								VirtualDIV.appendChild(Node);
								NewEContent=HandleEntityReferences(VirtualDIV.innerHTML.replace(R,''));
							}
							else {
								NewEContent=HandleEntityReferences(Node.xml.replace(R,''));
							}
							E.innerHTML=NewEContent;
						}
					}
				}
			}
		}
	}
}

/*------------------------------------------*/

var OptionalFieldsStatus=true;
var HideFieldsSpan;
var ShowFieldsSpan;
var OptionalDIVs;

function AdminOnload(){
	HideFieldsSpan=document.getElementById('hide_fields');
	ShowFieldsSpan=document.getElementById('show_fields');
	OptionalDIVs=new Array();
	for(i=0;i<document.forms.length;i++){
		DIVs=document.forms[i].getElementsByTagName('DIV');
		for(j=0;j<DIVs.length;j++){
			if(DIVs[j].className=='optional_field')
				OptionalDIVs.push(DIVs[j]);
		}
	}

	if(OptionalFieldsStatus)
		ShowOptionalFields();
	else
		HideOptionalFields();
}

function TurnOptionalFields(TurnURL){
	if(!HideFieldsSpan || !ShowFieldsSpan)
		return false;
	if(HideFieldsSpan.style.display=='inline' && ShowFieldsSpan.style.display=='none')
		HideOptionalFields();
	else
	if(HideFieldsSpan.style.display=='none' && ShowFieldsSpan.style.display=='inline')
		ShowOptionalFields();
	SetAJAXQuery(TurnURL);
	return false;
}

function ShowOptionalFields(){
	if(HideFieldsSpan)HideFieldsSpan.style.display='inline';
	if(ShowFieldsSpan)ShowFieldsSpan.style.display='none';
	for(i=0;i<OptionalDIVs.length;i++){
		OptionalDIVs[i].style.display='block';
	}
}

function HideOptionalFields(){
	if(HideFieldsSpan)HideFieldsSpan.style.display='none';
	if(ShowFieldsSpan)ShowFieldsSpan.style.display='inline';
	for(i=0;i<OptionalDIVs.length;i++){
		OptionalDIVs[i].style.display='none';
	}
}

/*------------------------------------------*/

function ChangeFileSource(Link,TableName,ChangeURLPattern){
	if(
		ChangeURLPattern.indexOf('{FIELD_NAME}')==-1
		||
		ChangeURLPattern.indexOf('{TABLE_NAME}')==-1
	){
		alert('Wrong ChangeURLPattern. It does not contains {FIELD_NAME} or {TABLE_NAME}.');
		return false;
	}
	if(Label=Link.parentNode.parentNode){
		Inputs=Label.getElementsByTagName('INPUT');
		if(!Inputs.length)
			return false;
		Input=Inputs[0];
		FieldName=Input.name;
		if(Input.type=='file'){
			Input.type='text';
			Input.size='';
			Input.value='';
		}
		else {
			Input.type='file';
			Input.size='61';
		}
		ChangeURL=ChangeURLPattern;
		ChangeURL=ChangeURL.replace(/{TABLE_NAME}/ig,TableName);
		ChangeURL=ChangeURL.replace(/{FIELD_NAME}/ig,FieldName);
		SetAJAXQuery(ChangeURL);
	}
	return false;
}

function ChangeDate(DateID){
	if(!(Year=document.getElementById(DateID+'_year')))
		return false;
	if(!(Month=document.getElementById(DateID+'_month')))
		return false;
	if(!(Day=document.getElementById(DateID+'_day')))
		return false;
	Inputs=Year.parentNode.getElementsByTagName('INPUT');
	for(i=0;i<Inputs.length;i++)
		if(Inputs[i].name==DateID)
			Date=Inputs[i];
	Year=Year.options[Year.options.selectedIndex].value;
	Month=Month.options[Month.options.selectedIndex].value;
	Day=Day.options[Day.options.selectedIndex].value;
	Date.value=Year+'-'+(Month<10?'0'+Month:Month)+'-'+(Day<10?'0'+Day:Day);
}
