/** Copyright (c) 2006 UPT Ltd. Версия $Id: xsight.cDivEditor.js,v 1.26 2008/04/23 13:45:18 andy Exp $ */

/**
 * Класс для работы со редактором разделов cDivEditor
 * @class
 * @extends cDBTable
 */
cDivEditor = newClass(cDBTable, {

	/**
	* Объект плавающего контейнера
	* @protected
	* @type object
	*/
	_oFloatingMenu: null,

	/**
	* Объект динамического соединения
	* @protected
	* @type object
	*/
	_oConnection: null,

	/**
	* Объект дерева разделов
	* @protected
	* @type object
	*/
	_oTree: null,

	/**
	* Флаг видимости плавающего контейнера
	* @protected
	* @type boolean
	*/
	_treeIsVisible: false,

	/**
	* Флаг видимости разделов / страниц
	* @protected
	* @type boolean
	*/
	_treeIsPageView: false,

	/**
	* Объект div_editor'а в iframe'е wizard'а добавления нового раздела
	* @protected
	* @type object
	*/
	_sWizardDivEditor: null,
	
	/**
	* Url помощи экземпляра редатора разделов, загруженном в iframe на втором шаге создания нового раздела
	* @protected
	* @type string
	*/
	_sWizardHelpUrl: null,

	/**
	* Конструктор класса
	* @public
	* @constructor
	* @param {string} pName имя формы
	* @param {string} pBase базовый URL сайта
	* @param {string} pCurrentLang аббревиатура текущего языка
	* @param {string} pDivUrl путь к текущему разделу
	*/
	constructor:function(pName, pBase, pCurrentLang, pDivUrl)
	{
		// вызов родительского конструктора
		this.constructor.prototype.constructor.call(this, pName, pBase, pCurrentLang, pDivUrl);

		if (typeof(cFloatingDiv) != 'undefined')
		this._oFloatingMenu = new cFloatingDiv('floating_diveditor', 200, 35, 1, 35, this._treeIsVisible);
		this._oConnection = new cConnection();
		this._oConnection.onreadystatechange = function(){this.fOnCallback()}.bind(this);
		this._oConnection.caching = false;
		this._oTree = new cTreeView('tree_diveditor');
		this._oTree.fOnExpand = this.fTreeOnExpand;
		this._oTree.fOnCollapse = this.fTreeOnCollapse;
		this._oTree.fOnHrefClick = this.fTreeOnHrefClick.bind(this);
		this._oTree.fSetDynamicLoad(this.fTreeLoadData, this);
		this.fSetOnloadHandler(function(){this.fOnLoad(pName);}.bind(this));
	},

	/**
	* Метод получения флага видимости дерева из формы
	* @public
	* @return boolean
	*/
	fGetTreeIsVisible:function(pFormName)
	{
		this.fSetForm(pFormName);
		if (typeof(this._oForm) != "undefined" && null != this._oForm)
		{
			var visible = this._oForm.getAttribute("treeIsVisible");
			return (typeof(visible) != "undefined" && visible == 'true');
		}
		return false;
	},

	/**
	* Метод получения ширины дерева из формы
	* @public
	* @return boolean
	*/
	fGetTreeWidth:function(pFormName)
	{
		this.fSetForm(pFormName);
		if (typeof(this._oForm) != "undefined" && null != this._oForm)
		{
			var width = this._oForm.getAttribute("treeWidth");
			return (typeof(width) != "undefined" && !isNaN(parseInt(width)))?(parseInt(width)):200;
		}
		return 200;
	},

	/**
	* Событие, происходяшее при загрузке документа
	*
	*/
	fOnLoad:function(pFormName)
	{
		this._treeIsVisible = this.fGetTreeIsVisible(pFormName);
		var width = this.fGetTreeWidth(pFormName);

		this._oTree.fDraw();

		if (typeof(cFloatingDiv) != 'undefined' &&
			typeof(this._oFloatingMenu) != 'undefined')
		{
			this._oFloatingMenu.fSetDivVisibility(this._treeIsVisible);
			this._oFloatingMenu.fSetWidth(width);
		}

		var tmpl_id = this.fGetObj('tmpl_id');
		if (typeof(tmpl_id) != 'undefined' && null != tmpl_id)
			this.fAddHandler(
				tmpl_id,
				'change',
				function() { this.fOnTemplateChanged(tmpl_id); }.bind(this)
			);
			this.fOnTemplateChanged(tmpl_id);

		var href_divs_view = this.fGetObj('href_divs_view');
		if (typeof(href_divs_view) != 'undefined' && null != href_divs_view)
			this.fAddHandler(
				href_divs_view,
				'click',
				function() { this.fOnSetViewPages(false); return false; }.bind(this)
			);

		var href_pages_view = this.fGetObj('href_pages_view');
		if (typeof(href_pages_view) != 'undefined' && null != href_pages_view)
			this.fAddHandler(
				href_pages_view,
				'click',
				function() { this.fOnSetViewPages(true); return false; }.bind(this)
			);

		if (this._oForm)
		{
			var is_page_view = this._oForm.getAttribute('treeIsPageView');
			this.fOnSetViewPages((is_page_view == 'true')?true:false);
		}
	},

	/**
	* Метод получения корневого элемента дерева
	* @public
	* @return object узел cTreeRoot
	*/
	fTreeGetRoot:function()
	{
		return this._oTree.fGetRoot();
	},

	/**
	* Метод динамической загрузки данных в дерево
	* @protected
	* @param object pNode узел дерева, в который надо загрузить дочерние узлы
	* @param object onComplateCallback call-back метод
	* @param oObj ссылка на текущий объект
	*/
	fTreeLoadData:function(pNode, onCompleteCallback, oObj)
	{
		if (pNode.expanded)
		{
			onCompleteCallback();
			return;
		}

		var id = pNode.data.id;
		var location = oObj.fGetFullPath();

		oObj._oConnection.fOpen('POST', location, true);

		sysObj = (oObj.fGetThisSysObj())? oObj.fGetThisSysObj() : oObj._sSysObj;

		// параметры запроса
		var params = {
        	single: sysObj,
        	parent_id: id,
        	ajax: true,
        	ajax_method: 'fTreeDrawChild'
		};

		params[sysObj] = {GetChildNodesElement: true};


        // Посылаем данные запроса (задаются в виде хэша).
        oObj._oConnection.fSend(params);

        oObj._oLoadingNode = pNode;
        oObj._oLoadingNodeCompleteCallback = function(){onCompleteCallback()};
	},

	/**
	* Callback-метод при асинхронном ответе от удаленного соединения
	* @protected
	*/
	fOnCallback:function()
	{
		if (this._oConnection.readyState == 4)
		{
        	if (this._oConnection.responseJS)
        	{
        		var method = this._oConnection.responseJS.name;
        		//alert(method);
        		eval(
        			'if (typeof(this.' + method + ') != "undefined") this.' +
        			method +
        			'(this._oConnection.responseJS.recordset); ' +
        			'else alert("' + method + ' ' + globals.fGet('TXT_WAS_NOT_FOUND')+ '");'
        		);
        	}
		}
	},

	/**
	* Метод динамической отрисовки дочерних элементов дерева
	* @protected
	* @param object pRecordset объект с набором данных
	*/
	fTreeDrawChild:function(pRecordset)
	{
		for(var i=0; i < pRecordset.length; i++ )
		{
			var data = [];
			var fields = pRecordset[i].fields;
			for (var j=0; j< fields.length; j++)
			{
				if (fields[j].name == 'DIV_ID')
				{
					data['id'] = fields[j]._value;
					data['value'] = fields[j]._value;
				}

				if (fields[j].name == 'DIV_NAME')
				data['label'] = fields[j]._value;

				if (this._oLoadingNode.checkable)
				{
					data['name'] = this._oLoadingNode.name;
					data['checkable'] = true;
				}

				if (fields[j].name == 'DIV_URL' && this._oLoadingNode.href != '')
				{
					data['href'] = this.baseURL + this.currentLang + '/' +
						fields[j]._value;
				}
			}

  			var tmpNode = new cDivNode(
	  			data,
	  			this._oLoadingNode,
  				false
  			);
		}

		this._oLoadingNodeCompleteCallback();
		this._oLoadingNode = null;
	},

	/**
	* Обработчик события при разворачивании ветки дерева
	* @public
	* @param object pNode узел дерева
	*/
	fTreeOnExpand:function(pNode)
	{
	},

	/**
	* Обработчик события при сворачивании ветки дерева
	* @public
	* @param object pNode узел дерева
	*/
	fTreeOnCollapse:function(pNode)
	{
	},

	/**
	* Обработчик события при клике на заданную ссылку
	*
	* Передает также состояние открытых веток дерева и видимость дерева
	* @public
	* @param string pHref ссылка
	*/
	fTreeOnHrefClick:function(pHref)
	{
		var expanded = this.fGetExpandedId();

		if (typeof(this._oForm) != 'undefined')
		{
			this._oForm.action = pHref;

			if (this._treeIsVisible)
				this.fCreateHidden('divtree_visible', 'true');

			if (this._treeIsPageView)
				this.fCreateHidden('divtree_page_view', 'true');

			if (expanded && expanded.length > 0)
				this.fCreateHidden('open_id', expanded.join(','));

			if (typeof(this._oFloatingMenu) != 'undefined')
			{
				this.fCreateHidden(
					'divtree_width',
					this._oFloatingMenu._width
				);
			}

			this._oForm.submit();
		}
	},

	/**
	* Метод включения / выключения видимости плавающего контейнера
	* @public
	*/
	fTreeToggleVisible:function()
	{
		var visible = !this._oFloatingMenu.fGetDivIsVisible();
		this._oFloatingMenu.fSetDivVisibility(visible);
		this._treeIsVisible = visible;
	},

	/**
	* Метод получения массива выбранных элементов дерева
	* @public
	* @return array массив выбранных элементов дерева
	*/
	fGetSelectedId:function()
	{
		var result = new Array();

        for (var i in this._oTree._nodes)
        {
            var n = this._oTree._nodes[i];
            if (n.data && n.checked)
            {
                result.push(n.data.id);
            }
        }

		return result;
	},

	/**
	* Метод получения массива идентификатора развернутых узлов дерева
	* @public
	* @return array массив идентификаторов развернутых узлов дерева
	*/
	fGetExpandedId:function()
	{
		var result = new Array();

        for (var i in this._oTree._nodes)
        {
            var n = this._oTree._nodes[i];
            if (n.data && n.children.length > 0 && n.expanded)
            {
                result.push(n.data.id);
            }
        }

		return result;
	},

	/**
	* Метод получения идентификатора формы (или выбранного идентификатора списка)
	* @param boolean pIsList флаг, указывающий на то список это или форма
	* @return integer идентификатор или false
	*/
	fGetFormId:function(pIsList, pIsAllowMultiple)
	{
		this._iFormId = null;
		var ids = this.fGetSelectedId();
		var am = pIsAllowMultiple || false;

		if (ids.length > 0)
		{
			this._iFormId = ids.join(',');
			return this._iFormId;
		}

		return false;
	},

	/**
	* Метод создания нового раздела с помощью мастера
	* на первом шаге выбирается шаблон и управление передается
	* на страницу загрузки, которая ждет, когда в iframe загрузится код
	* @public
	*/
	fAddNew:function()
	{
		var wnd = this.fShowModalDialog(
			this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" +
				this._sSysObj.toLowerCase() + "[Wizard]=Wizard"
		);

		if (wnd)
			this.fRefresh();

		return false;
	},

	/**
	* Метод загрузки формы добавления раздела в IFRAME wizard'а
	* @public
	* @return boolean признак выбранности шаблона
	*/
	fAddBeforeNext:function(pSysObjName)
	{
		var tmpl = this.fGetObj('tmpl_id');
		var iframe = this.fGetObj('iframe_add');

		if (tmpl && iframe && tmpl.options.length > 0)
		{
			var tmpl_id = tmpl.options[tmpl.selectedIndex].value;

			iframe.src = this.fGetFullPath() +
			"?single=" + pSysObjName + "&" +
			pSysObjName.toLowerCase() + "[DEAdd]&tmpl_id=" +
			tmpl_id;
			
			this.currentFlag = 'add';
		}

		else
		{
			alert(globals.fGet('ERR_NO_TEMPLATES_FOUND'));
			this.fCancelNew();
		}

		return (typeof(tmpl) != 'undefined');
	},

	/**
	* Метод перехода на следующий шаг в мастере добавления нового раздела
	*
	* Выключает кнопки навигации
	* @public
	*/
	fAddNext:function(pSysObjName)
	{
		var wizard = this.fGetObj('MainPage');
		wizard.setNextEnabled(false);
		wizard.setBackEnabled(false);
	},

	/**
	* Метод перехода на предыдущий шаг в мастере добавления нового раздела
	*
	* Пропускает страницу состояния загрузки и вызывает показ страницы
	* выбора шаблона
	* @public
	*/
	fAddPrevious:function(pSysObjName)
	{
		var wizard = this.fGetObj('MainPage');
		wizard.SelectedIndex = 0;
		this.currentFlag = 'wizard';
		this._sWizardHelpUrl = null;
		wizard.ViewPage(0);
	},

	/**
	* Метод выхода из мастера создания нового раздела
	* @public
	*/
	fAddCancel:function(pSysObjName)
	{
		this.fCancelNew();
	},

	/**
	* Метод установки имени diveditor'а, который находится в iframe'е
	* мастера добпавления нового раздела
	* @public
	* @param string pDivEditor имя объекта div_editor'а
	*/
	fSetWizardDivEditor:function(pDivEditor)
	{
		this._sWizardDivEditor = pDivEditor;
	},
	
	/**
	* Метод установки URL'а помощи, экземпляр diveditor'а который находится в iframe'е
	* мастера добпавления нового раздела
	* @public
	* @param string pModule имя модуля div_editor'а
	*/
	fSetWizardHelpUrl:function(pUrl)
	{
		this._sWizardHelpUrl = pUrl;
	},	

	/**
	* Метод сохранения результатов работы мастера добавления нового раздела
	* @public
	*/
	fAddFinish:function(pSysObjName)
	{
		if (typeof(this._sWizardDivEditor) != 'undefined')
		{
			var iframe = this.fGetObj('iframe_add');
			if (typeof (iframe) != 'undefined')
			{
				var icw = iframe.contentWindow;
				if (typeof(icw[this._sWizardDivEditor]) != 'undefined')
				{
					var de = icw[this._sWizardDivEditor];
					var result = de.fSaveWizard(pSysObjName);
				}
			}
		}
		return false;
	},

	/**
	* Метод сохранения создания нового раздела
	* @public
	* @param string pSysObjName имя сисобжа diveditor'а, в котором происходит
	* сохранение, ибо если вызвать в single сохранение с требуемым сисобжем,
	* то ничего не произойдет
	*/
	fSaveWizard:function(pSysObjName)
	{
		var f = parent.document.getElementById('MainPage');
		if (typeof(f) == 'undefined') return false;

		var tmpl = parent.document.getElementById('tmpl_id');
		if (!tmpl) return false;

		var tmpl_id = tmpl.options[tmpl.selectedIndex].value;

		var parent_ids = this.fGetSelectedId();
		if (parent_ids.length == 0)
		{
			alert(globals.fGet('ERR_NO_PARENT_DIV_SELECTED'));
			return false;
		}

		if (this.fCheckForPatternMatchingInForm(this._oForm))
		{
			this._oForm.target = "oFrame";
			this.action = this.fGetFullPath() +
				"?single=" + pSysObjName + "&" +
				pSysObjName + '[DESaveAdd]&tmpl_id=' + tmpl_id;

			f.setFinishEnabled(false);
			f.setBackEnabled(false);
			this.fPrepareData();
			this._oForm.submit();
			parent.window.returnValue = true;
		}
	   	return false;
	},

	/**
	* Метод включения кнопок в родительском окне мастера
	* @public
	*/
	fEnableBtnParent:function()
	{

		var f = parent.document.getElementById('MainPage');
		if (typeof(f) != 'undefined' && null != f)
		{
			f.setFinishEnabled(true);
			f.setBackEnabled(true);
		}
		else
		{
			if (null != this.actionButton)
			{
				this.actionButton.removeAttribute("disabled");
			}
		}
	},

	/**
	* Обработчик события, возникающего при выборе шаблона
	*
	* Подгружает картинку шаблона и выводит его краткое описание
	* @public
	*/
	fOnTemplateChanged:function(pTemplateObj)
	{
		var p = this.fGetObj('tmpl_preview_img');
		if (null != p && null != pTemplateObj && typeof(p) != 'undefined' && typeof(pTemplateObj) != 'undefined')
		{
			alert(p);
			var op = pTemplateObj.options[pTemplateObj.selectedIndex];

			p.innerHTML = (op.img == '')?'':("<img src='uploads/dbtable/" + op.img + "' valign='right' hspace='0' vspace='0'/>");

			p.innerHTML += '<p>' + op.desc + '</p>';
		}
	},

	fGetPageStatus:function()
	{
		var result = this._oForm.getAttribute('current_status_id');
		return result;
	},

	/**
	* Метод редактирования (в новом окне).
	* Вызывает метод редактирования в новом окне в
	* режиме single
	* @public
	*/
	fAlterNew:function()
	{
		var status_id = this.fGetPageStatus();

		var obj = {redirect: ''};
		
		var wnd = this.fShowModalDialog(
			this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" +
				this._sSysObj.toLowerCase() + "[Alter]" +
				"&status_id=" + status_id,
			obj
		);

		if (wnd)
			this.fRefresh(obj.redirect);

		return false;
	},

	fGetThisSysObj:function()
	{
		if (typeof(this._oForm) != "undefined" && null != this._oForm)
		{
			var s = this._oForm.getAttribute("this_sysobj");
			return (typeof(s) != "undefined" && null != s)?s:false;
		}
		return false;
	},

	/**
	* Метод сохранения раздела
	* @public
	* @param string pSysObjName имя сисобжа diveditor'а, в котором происходит
	* сохранение, ибо если вызвать в single сохранение с требуемым сисобжем,
	* то ничего не произойдет
	*/
	fSaveNew:function()
	{
		this.fGetFormId(false);

		var btn = this.fGetActionButton();

		if (!btn)
		{
			alert(globals.fGet('ERR_NO_ACTION_BUTTON_CATCHED'));
			return false;
		}

		var parent_ids = this.fGetSelectedId();
		if (parent_ids.length == 0)
		{
			alert(globals.fGet('ERR_NO_PARENT_DIV_SELECTED'));
			return false;
		}

		//if (this.fCheckForPatternMatchingInForm(this._oForm))
		{
			this._oForm.target = "oFrame";
			this.action = this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" + btn.name;

			this.fPrepareData();
			this.fDisableBtn(btn);
			this._oForm.submit();
			window.returnValue = true;
		}
	   	return false;
	},

	fOnStatusChange:function(pObject)
	{
		alert(pObject.options[pObject.selectedIndex].value);
	},

	/**
	* Метод вывода диалога изменения шаблона.
	* @public
	*/
	fChangeTemplate:function()
	{
		var init = new Array();
		init[init.length] = "dialogWidth:700px;";
		init[init.length] = "dialogHeight:220px;";
		init[init.length] = "edge:Raised;";
		init[init.length] = "center: Yes;";
		init[init.length] = "help: No;";
		init[init.length] = "resizable: No;";
		init[init.length] = "status: No;";

		var wnd = this.fShowModalDialog(
			this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" +
				this._sSysObj.toLowerCase() + "[ChangeTemplate]",
				'',
				init.join('')
		);

		if (wnd)
			this.fRefresh();

		return false;
	},

	/**
	* Метод получения элемента формы по его имени
	* @public
	* @param string pName имя элемента
	* @return mixed false или элемент
	*/
	fGetFormElementByName:function(pName)
	{
		if (typeof(this._oForm) != 'undefined' && null != this._oForm)
		for (var i=0; i<this._oForm.elements.length; i++)
		{
			if (this._oForm.elements[i].name == pName)
			{
				return this._oForm.elements[i];
			}
		}

		return false;
	},

	/**
	* Метод вызова обновления списка доступных статусов
	* в форме изменения шаблона
	*
	* Отправляет через cConnection данные для отрисовки статусов
	* @public
	* @param DomElement pElement элемент, содержащий список шаблонов
	*/
	fRefreshStatuses:function(pElement)
	{
		var tmpl_id = pElement.options[pElement.selectedIndex].value;
		var statuses = this.fGetFormElementByName('T_DIVISION[TMPL_STATUS_ID]');
		if (statuses)
		{
			statuses.setAttribute('disabled', 'disabled');
			var location = this.fGetFullPath();

			this._oConnection.fOpen('POST', location, true);

			// параметры запроса
			var params = {
	        	single: this._sSysObj,
	        	tmpl_id: tmpl_id,
	        	ajax: true,
	        	ajax_method: 'fDrawStatuses'
			};

			params[this._sSysObj] = {GetTemplateStatusesElement: true};

	        // Посылаем данные запроса (задаются в виде хэша).
	        this._oConnection.fSend(params);
		}
	},

	/**
	* Callback функция для перерисовки drop-down'а с переченем доступных
	* статусов при смене шаблона
	* @public
	* @param object pRecordset объект с данными, пришедшими от cConnection
	*/
	fDrawStatuses:function(pRecordset)
	{
		var statuses = this.fGetFormElementByName('T_DIVISION[TMPL_STATUS_ID]');
		if (statuses)
		{

			if (statuses.options.length > 0)
				statuses.options.length = 0;

			var values = pRecordset[0].fields[0]._value;
			for(var i=0; i < values.length; i++ )
			{
				var op = document.createElement('option');
				op.setAttribute('value', values[i].id);
				op.innerHTML = values[i].value;
				statuses.appendChild(op);
			}

			statuses.removeAttribute('disabled', 'disabled');
		}
	},

	/**
	* Метод сохранения данных диалога смены шаблона
	* @public
	*/
	fSaveChangeTemplate:function()
	{
		this.fGetFormId(false);

		var btn = this.fGetActionButton();

		if (!btn)
		{
			alert(globals.fGet('ERR_NO_ACTION_BUTTON_CATCHED'));
			return false;
		}

		var status = this.fGetFormElementByName('T_DIVISION[TMPL_STATUS_ID]');
		if (!status || status.disabled || status.options.length == 0)
		{
			alert(globals.fGet('ERR_NO_NEW_STATUS_SELECTED'));
			return false;
		}

		//if (this.fCheckForPatternMatchingInForm(this._oForm))
		{
			this._oForm.target = "oFrame";
			this.action = this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" + btn.name;

			if (confirm(globals.fGet('TXT_CHANGE_TEMPLATE_ALERT')))
			{
				this.fPrepareData();
				this.fDisableBtn(btn);
				this._oForm.submit();
				window.returnValue = true;
			}
		}
	   	return false;
	},

	/**
	* Метод вывода диалога изменения статуса.
	* @public
	*/
	fChangeStatus:function()
	{
		var init = new Array();
		init[init.length] = "dialogWidth:700px;";
		init[init.length] = "dialogHeight:220px;";
		init[init.length] = "edge:Raised;";
		init[init.length] = "center: Yes;";
		init[init.length] = "help: No;";
		init[init.length] = "resizable: No;";
		init[init.length] = "status: No;";

		var status_id = this.fGetPageStatus();

		var wnd = this.fShowModalDialog(
			this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" +
				this._sSysObj.toLowerCase() + "[ChangeStatus]" +
				"&status_id=" + status_id,
				'',
				init.join('')
		);

		if (wnd)
			this.fRefresh();

		return false;
	},

	/**
	* Метод сохранения данных диалога смены статуса
	* @public
	*/
	fSaveChangeStatus:function()
	{
		this.fGetFormId(false);

		var status_id = this.fGetPageStatus();

		var btn = this.fGetActionButton();

		if (!btn)
		{
			alert(globals.fGet('ERR_NO_ACTION_BUTTON_CATCHED'));
			return false;
		}

		//if (this.fCheckForPatternMatchingInForm(this._oForm))
		{
			this._oForm.target = "oFrame";
			this.action = this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" + btn.name +
				"&status_id=" + status_id;

			this.fPrepareData();
			this.fDisableBtn(btn);
			this._oForm.submit();
			window.returnValue = true;
		}
	   	return false;
	},

	/**
	* Обработчик события смены статуса страницы из панели инструментов
	* @public
	*/
	fOnPageStatusChange:function(pElement)
	{
		this.fGetFormId(false);
		var status_id = pElement.options[pElement.selectedIndex].value;
		if (status_id && this._oForm)
		{
			this.fCreateHidden('status_id', status_id);
			this._oForm.submit();
		}
	},

	/**
	* Обработчик события смены языка страницы из панели инструментов
	* @public
	*/
	fOnPageLanguageChange:function(pElement)
	{
		this.fGetFormId(false);
		var lang_id = pElement.options[pElement.selectedIndex].value;
		if (lang_id && this._oForm)
		{
			this._oForm.action = this.baseURL + lang_id + '/' + this.divURL;
			this._oForm.submit();
		}
	},

	/**
	* Метод создания черновой версии текущей языковой версии
	* Вызывает метод редактирования в новом окне в
	* режиме single
	* @public
	*/
	fCreateDraft:function()
	{
		var status_id = this.fGetPageStatus();

		var wnd = this.fShowModalDialog(
			this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" +
				this._sSysObj.toLowerCase() + "[CreateDraft]" +
				"&status_id=" + status_id
		);

		if (wnd)
			this.fRefresh();

		return false;
	},

	/**
	* Метод сохранения черновика языковой версии
	* @public
	*/
	fSaveDraft:function()
	{
		this.fGetFormId(false);

		var btn = this.fGetActionButton();

		if (!btn)
		{
			alert(globals.fGet('ERR_NO_ACTION_BUTTON_CATCHED'));
			return false;
		}

		//if (this.fCheckForPatternMatchingInForm(this._oForm))
		{
			this._oForm.target = "oFrame";
			this.action = this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" + btn.name

			//alert(this.action);

			this.fPrepareData();
			this.fDisableBtn(btn);
			this._oForm.submit();
			window.returnValue = true;
		}
	   	return false;
	},

	fSwapRDA:function(pRoleId)
	{
		var controls = this.fGetElementsByProperty('group', 'role_' + pRoleId);
		for (var i=0; i<controls.length; i++)
			controls[i].style.display =
				(controls[i].style.display == '')?'none':'';
	},

	fOnSetViewPages:function(pIsPage)
	{
		this._treeIsPageView = pIsPage;

		// получение контейнеров дерева / страниц
		var tab_divs = this.fGetObj('tab_divs');
		var tab_pages = this.fGetObj('tab_pages');

		// return в случае диалога
		if (null == tab_divs || typeof(tab_divs) == 'undefined')
			return;

		// установка стиля показа дерева / страниц
		tab_divs.style.display = (pIsPage)?'none':'';
		tab_pages.style.display = (pIsPage)?'':'none';
		// получение ссылок
		var href_divs = this.fGetObj('href_divs_view');
		var href_pages = this.fGetObj('href_pages_view');
		// установка ссылок
		href_divs.className = (pIsPage)?'xsTreeType':'xsTreeTypeSelected';
		href_pages.className = (pIsPage)?'xsTreeTypeSelected':'xsTreeType';
	},

	/**
	* Метод удаления. Вызывает диалог потдверждения удаления и сабмит формы
	* @public
	* @return boolean результат выполнения операции
	*/
	fDelete:function()
	{
		// если пользователь не подтвердил удаление
		// возвращаем false
		if (!confirm(globals.fGet('MSG_CONFIRM_DELETE_RECORD'))) return false;

		// если не удалось найти форму
		// выдаем alert, возвращаем false
		if (!this.fGetForm())
		{
			alert(globals.fGet('ERR_FORM_NOT_FOUND'));
			return false;
		}

		// если не удалось найти имя сисобжа
		// выдаем alert, возвращаем false
		if (!this.fGetSysObj())
		{
			alert(globals.fGet('ERR_SYSOBJ_NOT_FOUND'));
			return false;
		}

		// добавляем hidden поле к списку с действием удаления
		this.fCreateHidden(this._sSysObj + "[delete]", "delete");

		// отправка формы на сервер
		this._oForm.submit();

		return true;
	},

	/**
	* Метод перемещения записи на одну позицию вверх
	* @public
	*/
	fMoveUp:function()
	{
		if (!this.fGetFormId(true))
		{
			alert(globals.fGet('ERR_NO_RECORD_SELECTED'));
			return false;
		}

		this.fCreateHidden(this._sSysObj + "[up]", 'up');

		var expanded = this.fGetExpandedId();

		if (this._treeIsVisible)
			this.fCreateHidden('divtree_visible', 'true');

		if (this._treeIsPageView)
			this.fCreateHidden('divtree_page_view', 'true');

		if (expanded && expanded.length > 0)
			this.fCreateHidden('open_id', expanded.join(','));

		if (typeof(this._oFloatingMenu) != 'undefined')
		{
			this.fCreateHidden(
				'divtree_width',
				this._oFloatingMenu._width
			);
		}

		this._oForm.submit();
		return true;
	},

	/**
	* Метод перемещения записи на одну позицию вниз
	* @public
	*/
	fMoveDown:function()
	{
		if (!this.fGetFormId(true))
		{
			alert(globals.fGet('ERR_NO_RECORD_SELECTED'));
			return false;
		}

		this.fCreateHidden(this._sSysObj + "[down]", 'down');

		var expanded = this.fGetExpandedId();

		if (this._treeIsVisible)
			this.fCreateHidden('divtree_visible', 'true');

		if (this._treeIsPageView)
			this.fCreateHidden('divtree_page_view', 'true');

		if (expanded && expanded.length > 0)
			this.fCreateHidden('open_id', expanded.join(','));

		if (typeof(this._oFloatingMenu) != 'undefined')
		{
			this.fCreateHidden(
				'divtree_width',
				this._oFloatingMenu._width
			);
		}

		this._oForm.submit();
		return true;
	},
	
	/**
	* Метод вывода модального диалога для выбора внешней ссылки на раздел
	* @public
	*
	*/
	fDialogSymlinkUrl: function()
	{
		var obj = {isOK: false, Url: ''};
		var url = this.fGetFormElementByName('T_DIVISION[SYMLINK_URL]');
		obj.Url = url.value;

		var wnd = this.fShowModalDialog(
			this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" +
				this._sSysObj.toLowerCase() + "[dialogsymlinkurl]=" + "dialogsymlinkurl", obj
		);

		if(!obj.isOK)
		{
			return false;
		}
		else
		{
			url.value = obj.Url;
		}

		return false;

	},
	
	/**
	* Метод отображения контекстной справки
	* в режиме single
	* @public
	*/
	fHelp:function()
	{
		var params = (null == this._sWizardHelpUrl)?(this.currentModule + '/' + 
				this._sSysObj.toLowerCase() + '/' + 
				this.currentFlag):this._sWizardHelpUrl;
				
		//alert(params);
		
		var location = this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" +
				this._sSysObj.toLowerCase() + "[help]=" + 
				params;

		var wnd = this.fShowHelpDialog(location);

		return false;
	}	

});
