function getElementFromForm(elName, fmId)
{
	var list = document.getElementsByName(elName);
	for(var i=0; i<list.length; i++)
	{
		var pnode = list[i].parentNode;
		while( pnode != null )
		{
			if(pnode.id == fmId)
				return list[i];
			pnode = pnode.parentNode;
		}
	}
	return null;
}


/// checkType: 
///   - not-empty
///   - email
///   - email-or-empty
///   - bool
function checkFormValue(fmId, elName, checkType, minLength)
{
	var el = getElementFromForm(elName, fmId);

	if(el == null)
	{
		alert("checkFormValue. Element not found:  "+elName);
		return false;
	}

	var val = getValueFromElementEx(el);
	if( val == null )
		return false;

	if (checkType == 'email')
	{
		return checkEmail(val);
	}
	else
	if (checkType == 'email-or-empty')
	{
		if ( strHasData(val, 1) )
			return checkEmail(val);
		else
			return true; // empty - допустимо
	}
	else
	if (checkType == 'bool')
	{
		return val == 1;
	}
	else
	{
		if(minLength == null)
			minLength = 1;
		if(minLength < 1)
			minLength = 1;
		return strHasData(val, minLength);
	}
}

function getValueFromElement(elID)
{
	var el = document.getElementById(elID);
	if(el == null)
	{
		alert("Element not found:  "+elID);
	}
	
	return getValueFromElementEx(el);
}

function getValueFromElementEx(el)
{
	if(el == null)
	{
		alert("Element should be not null");
	}
	
	if(el.type == 'checkbox')
	{
		return el.checked - 0;
	}
	else
	{
		return el.value;
	}
}

function getValueFromElementAsParam(elID, pid)
{
	var el = document.getElementById(elID);
	if(el == null)
	{
		alert("Element not found:  "+elID);
	}
	
	var params = '';
	
	if((el.nodeName == 'div') || (el.nodeName == 'DIV'))
	{
		// обработка для даты-времени
		el = document.getElementById(elID + '_d');
		if(el != null)
			params += pid + '_d=' + el.value;

		el = document.getElementById(elID + '_m');
		if(el != null)
		{
			if(params != '')
				params += '&';
			params += pid + '_m=' + el.value;
		}

		el = document.getElementById(elID + '_y');
		if(el != null)
		{
			if(params != '')
				params += '&';
			params += pid + '_y=' + el.value;
		}

		el = document.getElementById(elID + '_t');
		if(el != null)
		{
			if(params != '')
				params += '&';
			params += pid + '_t=' + el.value;
		}
	}
	else
	{
		var val = getValueFromElementEx(el);
		val = encodeURIComponent(val);
		params = pid + '=' + val;
	}
	return params;
}

function isProcessResponseOk(responseText)
{
	if(responseText == null)
		return false;

	// Размер ответа должен быть не меньше длины служебного префикса
	if(responseText.length < 6)
		return false;
	
	var prefix = responseText.substring(0, 6);
	if(prefix == "-CORE-")
		return true;
		
	return false;
}

/// Отделяет служебный префикс, возвращает ответ в виде массива полученного с помощью split("|")
function getResponseData(responseText)
{
	var strData = responseText.substring(6, responseText.length);
	var arrData = strData.split("|");
	return arrData;
}

/// Отделяет служебный префикс, возвращает ответ в виде текста
function getResponseText(responseText)
{
	var strData = responseText.substring(6, responseText.length);
	return strData;
}

// Собирает значения свойств из add формы
function selectAddParams(objType)
{
	// добываем пиды из store_info
	var storeInfoId = "addo_store_info_" + objType;
	var storeInfo = document.getElementById(storeInfoId).firstChild.nodeValue;
	var pids = storeInfo.split("|");
	var elIdBase = "addo_" + objType + "_";
	var elId = "";
	var params = "obj_type=" + objType;
	for(i=0; i<pids.length; i++)
	{
		elId = elIdBase + pids[i];
		var prm = getValueFromElementAsParam(elId, pids[i]);
		params = params + '&' + prm;
	}
	return params;
}

// Собирает значения свойств из edit формы
function selectEditParams(objType)
{
	// добываем пиды из store_info
	var storeInfoId = "edo_store_info_" + objType;
	var storeInfo = document.getElementById(storeInfoId).firstChild.nodeValue;
	var pids = storeInfo.split("|");
	var elIdBase = "edo_" + objType + "_";
	var elId = "";
	var params = "obj_type=" + objType;
	for(i=0; i<pids.length; i++)
	{
		elId = elIdBase + pids[i];
		var prm = getValueFromElementAsParam(elId, pids[i]);
		params = params + '&' + prm;
	}
	return params;
}

function addObject(objType)
{
	var params = selectAddParams(objType);
	var loader=new net.ContentLoader('index.php?coreproc=add_obj', addObject_Reply, null, "POST", params);
}

function addObject_Reply()
{
	if( ! isProcessResponseOk(this.req.responseText) )
	{
		alert(this.req.responseText);
		return;
	}
	
	var objInfo = getResponseData(this.req.responseText); // objInfo[0] -> object type, objInfo[1] -> object id
	setCurObject(objInfo[0], objInfo[1], false);

	refreshObjList(objInfo[0], null, false);
	refreshEditObjForm(objInfo[0]); 
}

function editObject(objType, objId)
{
	var params = selectEditParams(objType);
	params += '&obj_id=' + objId;
	var loader=new net.ContentLoader('index.php?coreproc=ed_obj', editObject_Reply, null, "POST", params);
}

function editObject_Reply()
{
	if( ! isProcessResponseOk(this.req.responseText) )
	{
		alert(this.req.responseText);
		return;
	}
	
	var objInfo = getResponseData(this.req.responseText); // objInfo[0] -> object type, objInfo[1] -> object id
	refreshObjList(objInfo[0], null, false);
}

function refreshObjList(objType, curPg, async)
{
	var historyAtrb = getHistoryAtribute();

	if(curPg != null)
		curPgPrm = "&cur_page=" + curPg;
	else
		curPgPrm = "";
	
	var params = "obj_type=" + objType + historyAtrb + curPgPrm;

	var loader=new net.ContentLoader('index.php?coreproc=list_obj', refreshObjList_Reply, null, "POST", params, null, async );
	if(!async)
	{
		refreshObjList_Reply_Proc(loader.req.responseText);
	}
}

function refreshObjList_Reply_Proc(responseText)
{
	if( ! isProcessResponseOk(responseText) )
	{
		alert(responseText);
		return;
	}
	
	document.getElementById('eof_obj_list').innerHTML = getResponseText(responseText);
}

function refreshObjList_Reply()
{
	refreshObjList_Reply_Proc(this.req.responseText);
}

function setCurObject(objType, id, async)
{
	var params = "obj_type=" + objType + "&obj_id="+id;
	var loader=new net.ContentLoader('index.php?coreproc=cur_obj', setCurObject_Reply, null, "POST", params, null, async );
}

function setCurObject_Reply()
{
	if( ! isProcessResponseOk(this.req.responseText) )
	{
		alert(this.req.responseText);
		return;
	}
	
	//var objInfo = getResponseData(this.req.responseText); // objInfo[0] -> object type, objInfo[1] -> object id
}

/// Удаление текущего объекта указанного типа
function deleteObject(objType)
{
	var params = "obj_type=" + objType;
	var loader=new net.ContentLoader('index.php?coreproc=del_obj', deleteObject_Reply, null, "POST", params);
}

function deleteObject_Reply()
{
	if( ! isProcessResponseOk(this.req.responseText) )
	{
		alert(this.req.responseText);
		return;
	}
	
	var objInfo = getResponseData(this.req.responseText); // objInfo[0] -> object type
	refreshObjList(objInfo[0], null, false);
	refreshEditObjForm(objInfo[0]);
}

function refreshEditObjForm(objType)
{
	var params = "obj_type=" + objType;
	var loader=new net.ContentLoader('index.php?coreproc=refresh_edit_obj', refreshEditObjForm_Reply, null, "POST", params);
}

function refreshEditObjForm_Reply()
{
	var el = document.getElementById("eof_obj_edit");
	el.innerHTML = this.req.responseText;
}

function onSelectRow(objType, id)
{
	setCurObject(objType, id, false);
	refreshEditObjForm(objType);
}

// parentPid родительского объекта в котором находится "ссылка" редактируемый объект edObjType
function privateListEdit(parentObjType, parentPid, edObjType)
{
	var historyAtrb = getHistoryAtribute();

	var params = "parent_obj_type=" + parentObjType + "&parent_obj_pid=" + parentPid + "&ed_obj_type=" + edObjType + historyAtrb;
	var loader=new net.ContentLoader('index.php?coreproc=private_list', privateListEdit_Reply, null, "POST", params);
}

function privateListEdit_Reply()
{
	document.getElementById("core_obj_editor").innerHTML = this.req.responseText;
}

function privateObjEdit(parentObjType, parentPid, objType, objId)
{
	var historyAtrb = getHistoryAtribute();
	var params = "parent_obj_type=" + parentObjType + "&parent_obj_pid=" + parentPid + "&obj_type=" + objType + "&obj_id=" + objId + historyAtrb;
	var loader=new net.ContentLoader('index.php?coreproc=private_obj', privateObjEdit_Reply, null, "POST", params);
}

function privateObjEdit_Reply()
{
	document.getElementById("core_obj_editor").innerHTML = this.req.responseText;
}

function getHistoryAtribute()
{
	var el = document.getElementById('eof_history');
	if (el == null)
		return "";

	el = el.firstChild;
	if (el == null)
		return "";
		
	var historyInfo = el.nodeValue;
	if(historyInfo == null)
		historyInfo = "";

	return "&eof_history=" + historyInfo;
}

function goToEditor(objType)
{
	var historyAtrb = getHistoryAtribute();

	var params = "obj_type=" + objType + historyAtrb;
	var loader = new net.ContentLoader('index.php?coreproc=refresh_editor', goToEditor_Reply, null, "POST", params);
}

function goToEditor_Reply()
{
	document.getElementById("core_obj_editor").innerHTML = this.req.responseText;
}

/// Вызов формы редактирования списка выбора нескольких значений 
/// Входные параметры:
/// тип объекта базового списка; тип объекта который владеет списком; id объекта который владеет списком; pid свойства которое представляет список в объекте
function multiListEdit(objTypeBase, objTypeOwner, objIdOwner, pidInOwner)
{
	var params = "obj_type_base=" + objTypeBase;
	params += "&obj_type_owner=" + objTypeOwner;
	params += "&owner_id=" + objIdOwner;
	params += "&pid_in_owner=" + pidInOwner;
	params += "&for_result_func=multiListResultApply";
	
	var loader = new net.ContentLoader('index.php?coreproc=select_form', multiListEdit_Reply, null, "POST", params);
}

function multiListEdit_Reply()
{
	var responseText = this.req.responseText;
	if( ! isProcessResponseOk(responseText) )
	{
		alert(responseText);
		return;
	}

	elBody = document.body;
	if(elBody == null)
		alert('body не найден');
	elBody.innerHTML = elBody.innerHTML + getResponseText(responseText);
}

function multiListResultApply(objOwnerType, objOwnerId, pidInOwner, arrSelectedId)
{
	var strSelectedId = "";
	var count = arrSelectedId.length;
	for(var i=0; i < count; i++)
	{
		if(strSelectedId == "")
			strSelectedId = arrSelectedId[i];
		else
			strSelectedId += "|" + arrSelectedId[i];
	}
	
	var params = "obj_owner_type=" + objOwnerType;
	params += "&obj_owner_id=" + objOwnerId;
	params += "&pid_in_owner=" + pidInOwner;
	params += "&selected_ids=" + strSelectedId;

	var loader = new net.ContentLoader('index.php?coreproc=select_form_result', multiListResult_Reply, null, "POST", params);
}

function multiListResult_Reply()
{
	var responseText = this.req.responseText;
	if( ! isProcessResponseOk(responseText) )
	{
		alert(responseText);
		return;
	}
	var objInfo = getResponseData(responseText);// objInfo[0] - obj_owner_type; objInfo[1] - obj_owner_id;
	refreshEditObjForm(objInfo[0]);
}

function multiListOnOk(divId, divIdForm, dataRowStartIndex, checkerColInd, applyFuncName, obj_owner_type, obj_owner_id, pid_in_owner)
{
	var elMainDiv = document.getElementById(divId);
	var tbl = elMainDiv.firstChild;


	var rows = tbl.firstChild.childNodes;
	var count = rows.length;

	var resArr = new Array();
	var ind = 0;
	for(var i=dataRowStartIndex; i<count; i++)
	{
		var cell = rows[i].childNodes[checkerColInd];
		var ch = cell.firstChild;
		if(ch.checked)
		{
			resArr[ind] = ch.value;
			ind++;
		}
	}
	
	// event
	if(applyFuncName != null)
	{
		eval(applyFuncName+"(obj_owner_type, obj_owner_id, pid_in_owner, resArr);");
	}

	// - удаляем форму выбора со страницы
	closeMultiListForm(divId, divIdForm);
}

function multiListOnCancel(divId, divIdForm)
{
	closeMultiListForm(divId, divIdForm);
}

function closeMultiListForm(divId, divIdForm)
{
	// - удаляем форму выбора со страницы
	var elContent = document.getElementById(divId);
	var elParent = elContent.parentNode;
	elParent.removeChild(elContent);
	// - удаляем подложку
	elContent = document.getElementById(divIdForm);
	elParent = elContent.parentNode;
	elParent.removeChild(elContent);
}

function onFileUploadComplete(doc)
{
	if(doc == null)
	{
		//alert('onFileUploadComplete doc == null');
		return;
	}
	
	if( ! isProcessResponseOk(doc.body.innerHTML) )
		alert('FileUploadError. ' + doc.body.innerHTML);
}

function onEditorTabSwitch(activeId, prevActiveId)
{
	var elActive = document.getElementById(activeId);
	if (elActive == null)
	{
		alert("Элемент - активная страница не найден - " + activeId);
		return;
	}
	
	var elPrevActive = document.getElementById(prevActiveId);
	if (elPrevActive == null)
	{
		alert("Элемент - предыдущая активная страница не найден - " + prevActiveId);
		return;
	}

	elActive.style.display = "block";
	elPrevActive.style.display = "none";
}

function changePage(objType, pageNum, perPage)
{
	refreshObjList(objType, pageNum, false);// вызываем refreshObjList и refreshEditObjForm здесь, так как setCurObject с параметром async=false в итоге setCurObject_Reply() не вызывается 
	refreshEditObjForm(objType); 
}

/// открывает, закрывает списковые свойства в редакторе свойств
function openCloseList(holderId)
{
	var elHolder = document.getElementById(holderId);
	if (elHolder == null)
	{
		alert("Элемент - list Holder не найден - " + holderId);
		return;
	}
	if(elHolder.style.display != "none")
		elHolder.style.display = "none";
	else
		elHolder.style.display = "inline";
}

// !!! в name нельзя пробелы и лучше только латиница, т.к. это имя, а не заголовок
function coreFormPopup(name, uri, elID_Id, wdt, hgt)
{
	var el = document.getElementById(elID_Id);
	if(el != null)
	{
		var val = getValueFromElementEx(el);
		uri += '&obj_id=' + val;
	}
	popupWin(name, uri, wdt, hgt);	
}

function coreFormEditObject(objType, objId, elID_Id, elID_Title, func)
{
	var params = selectEditParams(objType);
	params += '&obj_id=' + objId;
	var loader=new net.ContentLoader('./?coreproc=ed_obj', null, null, "POST", params, null, false );
	var responseText = loader.req.responseText;
	if( ! isProcessResponseOk(responseText) )
	{
		alert(responseText);
		return;
	}
	var objInfo = getResponseData(responseText); // objInfo[0] -> obj_type, objInfo[1] -> object_id, objInfo[2] -> object_title

	if (window.opener && !window.opener.closed)
	{
		if(func != null)
			eval("window.opener."+ func +"("+ objType+", '"+objInfo[1]+"', '"+ objInfo[2]+"');");
		else
			window.opener.coreFormObjChangesApply(elID_Id, elID_Title, objInfo[1], objInfo[2]);

		window.opener.focus();
	}
	window.close();
}

function coreFormNewObject(objType, elID_Id, elID_Title, func)
{
	var params = selectAddParams(objType);
	var loader=new net.ContentLoader('./?coreproc=add_obj', null, null, "POST", params, null, false );
	var responseText = loader.req.responseText;
	if( ! isProcessResponseOk(responseText) )
	{
		alert(responseText);
		return;
	}
	var objInfo = getResponseData(responseText); // objInfo[0] -> obj_type, objInfo[1] -> object_id, objInfo[2] -> object_title

	if (window.opener && !window.opener.closed)
	{
		if(func != null)
			eval("window.opener."+ func +"("+ objType+", '"+objInfo[1]+"', '"+ objInfo[2]+"');");
		else
			window.opener.coreFormObjChangesApply(elID_Id, elID_Title, objInfo[1], objInfo[2]);
		window.opener.focus();
	}
	window.close();
}

function coreFormSetSelectedObject(elID_Id, elID_Title, id, title, func)
{
	if (window.opener && !window.opener.closed)
	{
		if(func != null)
			eval("window.opener."+ func +"('" + id + "', '" + title + "');");
		else
			window.opener.coreFormObjChangesApply(elID_Id, elID_Title, id, title);
		window.opener.focus();
	}
	window.close();
}

function coreFormObjChangesApply(elID_Id, elID_Title, id, title)
{
	var el = document.getElementById(elID_Id);
	if(el == null)
	{
		alert("[func.coreFormNewObjectApply or edit]: Element (for id) not found:  "+elID_Id);
		return;
	}
	el.value = id;
	
	el = document.getElementById(elID_Title);
	if(el == null)
	{
		alert("[func.coreFormNewObjectApply or edit]: Element (for title) not found:  "+elID_Title);
		return;
	}
	var nodeName = el.nodeName.toLowerCase();
	if( nodeName == 'span' )
	{
		if(el.firstChild == null)
		{
			var textNode = document.createTextNode(title);
			el.appendChild(textNode); 			
		}
		else
			el.firstChild.nodeValue = title;
	}
	else
		el.nodeValue = title;
		
	coreFormSetVisibleEdBn(elID_Id);
}

function coreFormSetVisibleEdBn(elID_Id)
{
	var el = document.getElementById(elID_Id + 'ed_bn');
	if(el == null)
		return;
	el.style.display = "inline";	
}

/// Закрытие окна браузера открытое из родительского окна
function coreCloseChildWnd()
{
	if (window.opener && !window.opener.closed)
		window.opener.focus();
	window.close();
}

