/** Copyright (c) 2006 UPT Ltd. Версия $Id: xsight.cDBTable.js,v 1.13.2.2 2007/11/07 17:52:33 viper Exp $ */

/**
 * Класс для работы со справочником cDBTable
 * @class
 * @extends cObject
 */
cDBTable = newClass(cObject, {

	/**
	* Свойство, указывающее на идентификатор текущей записи
	* @private
	* @type integer
	*/
	_iFormId:null,

	/**
	* Объект формы, с которой работает справочник
	* @private
	* @type object
	*/
	_oForm:null,

	/**
	* Имя сисобжа
	* @private
	* @type string
	*/
	_sSysObj:null,

	/**
	* Константа, тип сортировки по возрастанию
	* @private
	* @type string
	*/
	_cSortAsc:"ASC",

	/**
	* Константа, тип сортировки по убыванию
	* @private
	* @type string
	*/
	_cSortDesc:"DESC",

	/**
	* Константа, тип сортировки - сброс
	* @private
	* @type string
	*/
	_cSortReset:"reset",

	/**
	* Массив данных формы (используется в fOnLoad и fOnUnload
	* @private
	* @type string
	*/
	_aInitialData: new Array(),

	/**
	* Объект активной кнопки действия
	* @private
	* @type object
	*/
	actionButton: null,

	/**
	* Базовый URL сайта
	* @public
	* @type string
	*/
	baseURL: null,

	/**
	* URL раздела сайта
	* @public
	* @type string
	*/
	divURL: null,

	/**
	* Текущий язык сайта
	* @public
	* @type string
	*/
	currentLang: null,

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

	/**
	* Метод установки сисобжа формы
	* @public
	* @return boolean результат операции
	*/
	fSetSysObj:function()
	{
		this._sSysObj = null;
		if (typeof(this._oForm) != "undefined" && null != this._oForm)
		{
			this._sSysObj = this._oForm.getAttribute("sysobj");
			return (typeof(this._sSysObj) != "undefined" && null != this._sSysObj);
		}
	},

	/**
	* Метод установки формы
	* @public
	* @param string pName имя формы
	* @return boolean результат операции
	*/
	fSetForm:function(pName)
	{
		// находим форму
		this._oForm = this.fGetObj(pName);
		return (typeof(this._oForm) != "undefined" && null != this._oForm);
	},

	/**
	* Метод получения объекта формы
	* @public
	* @return object объект формы или false
	*/
	fGetForm:function()
	{
		return (null != this._oForm)?(this._oForm):false;
	},

	/**
	* Метод получения сисобжа формы
	* @public
	* @return string имя сисобжа или false
	*/
	fGetSysObj:function()
	{
		return (null != this._sSysObj)?(this._sSysObj):false;
	},

	/**
	* Метод получения значения текушего идентификатора записи
	*
	* @public
	* @param object pElement элемент управления
	* @param boolean pIsList флаг, указывающий на то, список это или форма
	*/
	fCheckElementId:function(pElement, pIsList)
	{
		switch(pIsList)
		{
			case true:
				return (pElement.name == "id" && pElement.checked == true)?(pElement.value):false;
			break;
			case false:
				return (pElement.name == "id")?(pElement.value):false;
			break;
		}
	},

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

		if (typeof(this._oForm) == "undefined" || null == this._oForm) return false;

		var els = this._oForm.elements;
		var i;
		if (typeof(els) != "undefined" && null != els)
		{
			for (i = 0; i < els.length; i++)
			{
				var el = els[i];
				var id = this.fCheckElementId(els[i], pIsList);
				if (id != false)
				{
					this._iFormId = id;
					return this._iFormId;
				}
			}
		}

		// если не найдено - возвращаем false
		return false;
	},

	/**
	* Метод получения элемента формы по его имени
	* @public
	* @param pName имя элемента формы
	* @return DomElement
	*/
	fGetFormElementByName: function(pName)
	{
		if (typeof(this._oForm) == "undefined" || null == this._oForm) return false;

		var els = this._oForm.elements;
		var i;
		if (typeof(els) != "undefined" && null != els)
		{
			for (i = 0; i < els.length; i++)
			{
				var el = els[i];
				if ((el.name && pName == el.name) ||
					(el.field_name && pName == el.field_name))
				{
					return el;
				}
			}
		}

		// если не найдено - возвращаем false
		return false;
	},

	/**
	* Метод submit'а формы для добавления записи
	* @public
	*/
	fAdd:function()
	{
		// если форма определена
		// отправляем форму на сервер
		if (this._oForm != null)
		this._oForm.submit();
	},

	/**
	* Метод submit'а формы для редактирования записи
	* @public
	*/
	fAlter:function()
	{
		// если форма определена
		// отправляем форму на сервер
		if (this._oForm != null)
		this._oForm.submit();
	},

	/**
	* Метод создания hidden элемента формы
	* @public
	* @param string pName имя элемента
	* @param string pValue значение элемента
	* @return boolean результат выполнения операции
	*/
	fCreateHidden:function(pName, pValue)
	{
		// если форма определена
		// создаем hidden input
		if (this._oForm != null)
		{
			var flag = document.createElement("input");
			flag.setAttribute("type", "hidden");
			flag.setAttribute("name", pName);
			flag.setAttribute("value", pValue);
			this._oForm.appendChild(flag);
			return true;
		}
		return false;
	},

	/**
	* Метод удаления. Вызывает диалог потдверждения удаления и сабмит формы
	* @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;
		}

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

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

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

		return true;
	},

	/**
	* Метод обновления списка
	* @public
	*/
	fRefresh:function()
	{
		document.location.href = this.fGetFullPath();
	},

	/**
	* Метод сохранения
	*/
	fSave:function()
	{
		// если форма определена
		// проверяем форму на предмет соответствия regexp'ам
		if (this._oForm != null)
		return this.fCheckFormRegexp(this._oForm);
		else return false;
	},

	/**
	* Метод получения полного пути к станице сайта
	* @public
	* @return string полный путь к странице
	*/
	fGetFullPath:function()
	{
		return this.baseURL + this.currentLang + '/' + this.divURL;
	},

	/**
	* Метод добавления значений к URLу
	* @param string pSuffix значения вида имя1=значение1&имя2=значение2...
	* @return string новый URL
	*/
	fAppendLocation:function(pSuffix)
	{
		return document.location.href +
			((document.location.href.indexOf("?") != -1)?"&":"?") +
			pSuffix;
	},

	/**
	* Метод добавления (в новом окне). Вызывает метод добавления в новом окне в
	* режиме single
	* @public
	*/
	fAddNew:function()
	{
		var location = this.fGetFullPath() +
				"?single=" + this._sSysObj + "&" +
				this._sSysObj.toLowerCase() + "[add]=add";

		var wnd = this.fShowModalDialog(location);

		if (wnd)
			this.fRefresh();
		return false;
	},

	/**
	* Метод просмотра (в новом окне). Вызывает метод просмотра в новом окне в
	* режиме single
	* @public
	*/
	fViewNew:function()
	{
		if (!this.fGetFormId(true))
		{
			alert(globals.fGet('ERR_NO_RECORD_SELECTED'));
			return false;
		}

		var location = this.fGetFullPath() +
				"?single=" + this._sSysObj + "&id=" + this._iFormId + "&" +
				this._sSysObj.toLowerCase() + "[view]=view";

		var wnd = this.fShowModalDialog(location);
		if (wnd)
			this.fRefresh();

		return false;
	},

	/**
	* Метод редактирования (в новом окне). Вызывает метод редактирования в новом окне в
	* режиме single
	* @public
	*/
	fAlterNew:function()
	{
		if (!this.fGetFormId(true))
		{
			alert(globals.fGet('ERR_NO_RECORD_SELECTED'));
			return false;
		}

		var wnd = this.fShowModalDialog(
			this.fGetFullPath() +
				"?single=" + this._sSysObj + "&id=" + this._iFormId + "&" +
				this._sSysObj.toLowerCase() + "[alter]=alter"
		);

		if (wnd)
			this.fRefresh();

		return false;
	},

	/**
	* Метод отмены действия в режиме диалога
	* @public
	*/
	fCancelNew:function()
	{
		window.returnValue = false;
    	window.close();
		return false;
	},

	/**
	* Метод получения элемента кнопки, на которую было осуществлено нажатие
	* @return object элемент кнопки или null
	*/
	fGetActionButton:function()
	{
		if (!window.event) return false;
		var btn = window.event.srcElement;
		if (typeof(btn) != "undefined" && null != btn)
		{
			this.actionButton = btn;
			return btn;
		}
	},

	/**
	* Метод сохранения диалога
	* @public
	*/
	fSaveNew: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;

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

	/**
	* Метод блокирования кнопки действия диалога
	* @protected
	* @param object pButton объект кнопки
	*/
	fDisableBtn:function(pButton)
	{
		if (typeof(pButton) != "undefined" && null != pButton)
		{
			pButton.disabled = true;
		}
	},

	/**
	* Метод включения активной кнопки родительского окна
	* @protected
	*/
	fEnableBtnParent:function()
	{
		if (null != this.actionButton)
		{
			this.actionButton.removeAttribute("disabled");
		}
	},

	/**
	* Метод подготовки данных к отправке на сервер. К форме добавляются все значения
	* checkbox'ов
	*/
	fPrepareData:function()
	{
		if (!this._oForm) return false;

		this._oForm.action = this.action;

		var els = this._oForm.elements;
		var i;

		for (i = 0; i < els.length; i++)
		{
			var el = els[i];
			if (el.type == "checkbox")
			{
				this.fCreateHidden(el.field_name, ((el.checked)?1:0));
			}
	    }
	},

	/**
	* Метод запрещения отправки формы по enter'у
	* @private
	*/
	fDisableSubmitOnEnter:function()
	{
	    var e = event;
	    return (13 == e.keyCode)?false:true;
	},

	/**
	* Метод переключения режима сортировки
	* @public
	* @param string pNamе признак сортировки
	* @param string pSortStatus направление сортировки (true или false)
	*/
	fSwitchSorting:function(pName, pSortStatus)
	{
		if (pSortStatus == "false")
			this.fSort(pName, this._cSortAsc);
		else
			this.fSort(pName, this._cSortReset);
	},

	/**
	* Метод сортировки
	* @public
	* @param string pName
	* @param string pDirection
	*/
	fSort:function(pName, pDirection)
	{
		if (pDirection == this._cSortReset)
			this.fCreateHidden("sort_reset", null);
		else
			this.fCreateHidden("sort[" + pName + "]", pDirection);
		this._oForm.submit();
	},

	/**
	* Обработчик доп. событий при загрузке dbtable
	*/
	fOnLoad:function()
	{
		var els = this._oForm.elements;
		for (var i = 0; i < els.length; i++)
			this._aInitialData[i] = els[i].value;
	},

	/**
	* Обработчик доп. событий при выгрузке dbtable
	*/
	fOnUnload:function()
	{
		if (!window.returnValue && this._aInitialData)
		{
			var els = this._oForm.elements;
			for (var i=0; i < els.length; i++)
			{
				if (els[i].value != this._aInitialData[i])
				{
					event.returnValue = "";
				}
			}
		}
	},

	/**
	* Обработчик события клика на плавающем тулбаре
	*/
	fFloatingToolbarClick:function()
	{
		var method = event.srcNode.getAttribute('method');
		eval(
			'if (typeof(this.' + method + ') != "undefined") this.' +
			method +
			'(); ' +
			'else alert("' + method + ' ' + globals.fGet('TXT_WAS_NOT_FOUND') + '!");'
		);
	},

	/**
	* Метод получения объекта активной вкладки для заданного элемента
	* @protected
	* @param object pElement элемент управления
	* @return object найденная вкладка или null
	*/
	fFindParentTab:function(pElement)
	{
		if (pElement.parentElement == null)
			return null;

		if ((pElement.parentElement.className == "xsTabPage") )
			return pElement.parentElement;
		else
			return this.fFindParentTab(pElement.parentElement);
	},

	/**
	* Метод установки вкладки активной для элемента, который в ней находится
	* @protected
	* @param object pElement элемент управления
	* @return boolean результат операции
	*/
	fSetActiveParentTab:function(pElement)
	{
		var tab = this.fFindParentTab(pElement);

		if (tab != null && null != cTabPane.tabpane)
		{
			for (i=0; i<=cTabPane.tabpane.pages.length-1; i++)
			{
				if (cTabPane.tabpane.pages[i].element.getAttribute("id") == tab.getAttribute("id"))
				{
					cTabPane.tabpane.pages[i].fSelect();
					cTabPane.tabpane.fSetSelectedIndex(i);
					return true;
				}
			}
			return false;
		}
		else return false;
	},

	/**
	* Метод получения элемента контейнера активной вкладки
	* @public
	* @return DomElement
	*/
	fGetActiveTab: function()
	{
		if (!cTabPane.tabpane) return null;
		return cTabPane.tabpane.pages[cTabPane.tabpane.selectedIndex].element;
	},

	/**
	* Метод получения элемента активной вкладки по имени контрола
	* @public
	* @return DomElement
	*/
	fGetActiveTabElementByName: function(pName, pParent)
	{
		var el = (pParent)?pParent:this.fGetActiveTab();
		if (!el) return null;
		//alert(el.tagName);
		if (el.hasChildNodes)
		for (var i = 0; i < el.childNodes.length; i++)
		{
			if (el.childNodes[i].name && el.childNodes[i].name == pName)
				return el.childNodes[i];

			var ch = this.fGetActiveTabElementByName(pName, el.childNodes[i]);
			if (ch) return ch;
		}
		return null;
	},

	/**
	* Метод получения значения элемента активной вкладки по имени контрола и типу
	* @public
	* @return string
	*/
	fGetActiveTabElementValue: function(pName, pType, pParent)
	{
		var el = (pParent)?pParent:this.fGetActiveTab();
		if (!el) return null;
		if (el.hasChildNodes)
		for (var i = 0; i < el.childNodes.length; i++)
		{
			var a = el.childNodes[i];
			if ((a.name && a.name == pName) ||
				(a.field_name && a.field_name == pName))
			{
				switch(pType)
				{
					case 'text':
						if (a.tagName && a.tagName.toLowerCase() == 'input' &&
							a.type && a.type.toLowerCase() == pType.toLowerCase())
						return a.value;
					break;
					case 'hidden':
						if (a.tagName && a.tagName.toLowerCase() == 'input' &&
							a.type && a.type.toLowerCase() == pType.toLowerCase())
						return a.value;
					break;
					case 'radio':
						if (a.tagName && a.tagName.toLowerCase() == 'input' &&
							a.type && a.type.toLowerCase() == pType.toLowerCase() &&
							a.checked)
							return a.value;
					break;
					case 'checkbox':
						if (a.tagName && a.tagName.toLowerCase() == 'input' &&
							a.type && a.type.toLowerCase() == pType.toLowerCase() &&
							a.checked)
							return a.value;
					break;
					case 'select':
					if (a.tagName && a.tagName.toLowerCase() == 'select')
							return a.options[a.selectedIndex].value;
					break;
				}
			}

			var ch = this.fGetActiveTabElementValue(pName, pType, a);
			if (ch) return ch;
		}
		return null;
	},

	/**
	* Метод проверки регулярных выражений во всех элементах всех форм
	* @public
	* @return boolean результат проверки
	*/
	fCheckForPatternMatching:function()
	{
		var args = arguments;
		var argsLen = args.length;
		if(argsLen == 0)
		{
			if(document.all.Forms)
				if(!this.fCheckForPatternMatchingInForm(document.all.Forms))
					return false;
		}
		else
		{
			for(var i=0; i<argsLen; i++)
			{
				var theForm = args[i];
				if(theForm)
					if(!this.fCheckForPatternMatchingInForm(theForm))
						return false;
			}
		}
		return true;
	},

	/**
	* Метод проверки регулярных выражений во всех элементах заданной формы
	* @public
	* @param object theForm форма
	* @return boolean результат проверки
	*/
	fCheckForPatternMatchingInForm:function(theForm)
	{
		for(var k=0; k<theForm.elements.length; k++)
		{
			var theEl = theForm.elements[k];
			if(!this.fCheckForPatternMatchingOperate(theEl))
				return false;
		}
		return true;
	},

	/**
	* Метод проверки регулярных выражений в элементах / элементе управления
	* На вход подается один или несколько объектов для проверки
	* @public
	* @return boolean результат проверки
	*/
	fCheckForPatternMatchingInElement:function()
	{
		var args = arguments;
		var argsLen = args.length;
		for(var i=0; i<argsLen; i++)
		{
			var theEl = args[i];
			if(theEl)
				if(!this.fCheckForPatternMatchingOperate(theEl))
					return false;
		}
		return true;
	},

	/**
	* Метод проверки на соответсвие регулярным выражениям и ограничениям
	* @protected
	* @param object oRef проверяемый контрол
	* @return boolean результат проверки
	*/
	fCheckForPatternMatchingOperate:function(oRef)
	{
		this.theEl = oRef;
		this.setFocus = function()
		{
			if(!/hidden/.test(this.theEl.type.toLowerCase())||!/hidden/.test(this.theEl.currentStyle.visibility)||!/none|^$/.test(this.theEl.currentStyle.display))this.theEl.focus();
			if(typeof(this.theEl.type)!='undefined'&&this.theEl.isTextEdit&&!/button|submit|reset|hidden/.test(this.theEl.type.toLowerCase()))
			{
				var theTSeletion=this.theEl.createTextRange();
				theTSeletion.select();
			}
			return;
		};
		this.checkLengths=function()
		{
			if((typeof(this.theEl.valuemaxlength)!='undefined'&&!isNaN(parseInt(this.theEl.valuemaxlength))&&typeof(this.theEl.value)!='undefined')||(typeof(this.theEl.valueminlength)!='undefined'&&!isNaN(parseInt(this.theEl.valueminlength))&&typeof(this.theEl.value)!='undefined'))
			{
				if(typeof(this.theEl.valuemaxlength)!='undefined'&&typeof(this.theEl.valueminlength)!='undefined')
				{
					if(parseInt(this.theEl.valuemaxlength)<parseInt(this.theEl.valueminlength))
					{
						var theMax=this.theEl.valuemaxlength;
						this.theEl.valuemaxlength=this.theEl.valueminlength;
						this.theEl.valueminlength=theMax;
					}
				}
				if(typeof(this.theEl.maxLength)!='undefined')
				{
					if(parseInt(this.theEl.valueminlength)>this.theEl.maxLength)this.theEl.valueminlength=this.theEl.maxLength;
				}
				if(this.theEl.value.length>parseInt(this.theEl.valuemaxlength)||this.theEl.value.length<parseInt(this.theEl.valueminlength))
				{
					if(typeof(this.theEl.valuelengthmessage)!='undefined'&&this.theEl.valuelengthmessage!='')
					{
						alert(this.theEl.valuelengthmessage.replace("\\n","\n"));
					}
					else
					{
						if(this.theEl.value.length>parseInt(this.theEl.valuemaxlength))
							alert('\n' +
							globals.fGet('TXT_ALERT_MAX_VALUE_VIOLATION') +
							"\n\n" +
							globals.fGet('TXT_ALERT_MAX_VALUE_CURRENT_VALUE') +
							': ' + this.theEl.valuemaxlength + '.\n\n');

						if(this.theEl.value.length<parseInt(this.theEl.valueminlength))

							alert('\n' +
							globals.fGet('TXT_ALERT_MIN_VALUE_VIOLATION') +
							"\n\n" +
							globals.fGet('TXT_ALERT_MIN_VALUE_CURRENT_VALUE') +
							': ' + this.theEl.valueminlength + '.\n\n');
					}
					fSetActiveParentTab(oRef);
					this.setFocus();
					return false;
				}
			}
			return true;
		};
		if(!this.theEl.readOnly&&!this.theEl.disabled)
		{
			if(!this.checkLengths())return false;
			if(typeof(this.theEl.regexp)!='undefined'&&this.theEl.regexp!='')
			{
				if(typeof(this.theEl.condition)!='undefined'&&this.theEl.condition!='')
				{
					var r=eval(this.theEl.condition);
					if(r!=null&&!r)return true;
					else if(r==null)return false;
				}
				var re=new RegExp(this.theEl.regexp);
				var result=re.test(this.theEl.value);
				if(result)return true;

				var msg_1 = globals.fGet('TXT_ALERT_INCORRECT_FIELD_FORMAT');
				var msg_2 = globals.fGet('TXT_ALERT_YOU_MUST_USE_THE_FOLLOWING_FIELD_FORMAT');

				if(typeof(this.theEl.message)!='undefined'&&this.theEl.message!='')
				{
					if (this.theEl.getAttribute("type")=="file"&&null!=this.theEl.getAttribute("loaded"))
					{
						return true;
					}
					alert(this.theEl.message.replace("\\n","\n"));
				}
				else alert('\n' + msg_1 + '\n\n' + ((this.theEl.format&&this.theEl.format!='')?(msg_2 + ':\n\n'+this.theEl.format+'\n\n'):''));
				this.fSetActiveParentTab(oRef);
				this.setFocus();
				return false;
			}
		}
		return true;
	},

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

		this.fCreateHidden(this._sSysObj + "[up]", 'up');
		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');
		this._oForm.submit();
		return true;
	},

	/**
	* Метод установки результата работы сисобжа через iframe
	* @public
	*/
	fSetSysobjResult: function(pResult)
	{
		// заглушка
	},

	fGetElementsByProperty:function(pProperty, pValue)
	{
		var result = new Array();

		var els = document.all;
		if (els && els.length > 0)
		for (var i=0; i< els.length; i++)
		{
			if (els[i].getAttribute(pProperty) == pValue)
			result[result.length] = els[i];
		}

		return result;
	},
	
	/**
	* Метод вызова RichText редактора
	*
	* @public
	* @param string pControlId идентификатор контрола
	*/
	fToggleRichTextEditor: function(pControlId)
	{
		var init = "dialogWidth:800px;";
			init += "dialogHeight:600px;";
			init += "edge:Raised;";
			init += "center: Yes;";
			init += "help: No;";
			init += "resizable: No;";
			init += "status: No;";
		var obj = {isOK: false, HTML: ''};
		obj.HTML = document.getElementById(pControlId).value;

		var location = this.fGetFullPath() + "?single=richtexteditor&richtexteditor[alter]=alter";
		var wnd = this.fShowModalDialog(location, obj, init);

		if(!obj.isOK)
		{
			return false;
		}
		else
		{
			document.getElementById(pControlId).value = obj.HTML;
			document.getElementById(pControlId + '_container').innerHTML = obj.HTML;
		}
		
		return false;
	}

});

/**
* Глобальная ф-ция просмотра файла. Открывает новое окно с просмотром содержимого.
* @public
* @param string pControlId идентификатор контрола
* @param string pFileName имя файла
* @param string pFileType тип файла
* @param string pBase базовый url сайта
*/
cDBTable.fViewFile = function(pControlId, pFileName, pFieldType, pBase)
{
	var wWidth = 400;
	var wHeight = 400;
	var wLeft = screen.availWidth/2-wWidth/2;
	var wTop = screen.availHeight/2-wHeight/2;

	var wndAttributes = "width="+wWidth+",height="+wHeight+",left="+wLeft+",top="+wTop+
		"scrollbars=1,status=0,resizable=0,toolbar=0,location=0";

	switch (pFieldType)
	{
		case "sfile":
			window.open(pBase + "getfile.php?id=" + pFileName, "", wndAttributes);
		break;
		case "file":
		case "img":
			window.open(pBase + "uploads/dbtable/" + pFileName, "", wndAttributes);
		break;
	}
}

/**
* Глобальная ф-ция удаления файла.
* @public
* @param string pControlId идентификатор контрола
* @param string pFileName имя файла
* @param string pFileType тип файла
*/
cDBTable.fDeleteFile = function(pControlId, pFileName, pFieldType)
{
	var btn_view = document.getElementById("btn_view_" + pControlId);
	if (null != btn_view && btn_view != "undefined")
		btn_view.style.display = "none";

	var btn_delete = document.getElementById("btn_delete_" + pControlId);
	if (null != btn_delete && btn_delete != "undefined")
		btn_delete.style.display = "none";

	var el = document.getElementById("file_id_" + pControlId);
	if (null != el && el != "undefined") el.value = "delete";

	var control = document.getElementById(pControlId);
	if (null != control && control != "undefined")
		control.style.display = "none";

	var preview = document.getElementById("preview_" + pControlId);
	if (null != preview && preview != "undefined")
		preview.style.display = "none";
}