	/**
	 *  CMF Common Functions Library v2.1
	 *  (c) 2005-2007 Semantica-IT Ltd.
	 */
	// Trying to detect Safari browser
	var	_isSafari	=	(navigator.userAgent && navigator.userAgent.indexOf('Safari') != -1);
	/**
	 * clear all select values
	 *
	 * @param _select target SELECT object
	 *
	 * @return void
	 */
	function	cmfClearOptions(_select)
	{
		if (_select)
		{
			var	optionCount	=	_select.options.length;
			for (var oc = 0; oc < optionCount; oc++)
				_select.remove(0);
		}
	}
	/**
	 * add option into select
	 *
	 * @param _select   target SELECT object
	 * @param _value    value for option to be added
	 * @param _caption  caption for option to be added
	 * @param _selected make the option selected
	 * 
	 * return bool
	 */
	function	cmfAddOption(_select, _value, _caption, _selected)
	{
		if (_select)
		{
			var oOption	=	document.createElement("OPTION");
			// Safari fix: not checked but seems to be work
			if (_isSafari)
				_select.add(oOption, null);
			else
				_select.options.add(oOption);
			oOption.text		=	_caption;
			oOption.value		=	_value;
			if (_selected)
			{
				oOption.selected   =    true;
			}
			return true;
		}
		return false;
	}
	/**
	 * Reloading select values base upon _data array. Additionally calls target onchange() handler.
	 *
	 * @param _form     form object
	 * @param _value    current value
	 * @param _target   target SELECT name (should be in _form)
	 * @param _data     array with data to apply filter
	 * @param _index    value index in _data array
	 * @param _option   option index in _data array
	 * @param _text     text index in _data array
	 * @param _empty    text for empty option (if needed)
	 * @param _emptyval value for empty option (if needed)
	 * @param _last     if true - empty option will be added at the end of list (otherwise at the beginning)
	 *
	 * @return void
	 */
	function	cmfSelectReload(_form, _value, _target, _data, _index, _option, _text, _empty, _emptyval, _last)
	{
		if (_form)
		{
			var	_select = _form[_target]
			if (_select)
			{
				cmfClearOptions(_select);
			}
			if (_empty && !_last)
			{
				cmfAddOption(_select, _emptyval, _empty, false);
			}
			if (_data  && _data.length)
			{
				for (var idx = 0; idx < _data.length; idx++)
				{
				    if ((_index != null && _data[idx][_index] == _value) || _index == null)
						cmfAddOption (_select, 	_data[idx][_option], _data[idx][_text], false);
				}
			}
			if (_empty && _last)
			{
				cmfAddOption(_select, _emptyval, _empty, false);
			}
			if (_select && _select.onchange)
			{
				_select.onchange();
			}
		}
	}
	/**
	 * @deprecated
	 */
	function toggleTreeElement(object, subitems_id) 
	{
	   alert ('toggleTreeElement deprecated. Use cmftree.js instead');
	}
	/**
	 * @deprecated
	 */
	function createSelectOption (_targetArray, _emptyText, _selectObj, _selected)
	{
	   alert ('createSelectOption: deprecated. Use cmfSelectReload');
	} 
/*=====================================================================================================*/    
	function	mb_checkSubmit(_form, _message)
	{
		if (_form)
		{
			if (isAnyChecked(_form))
			{
				return	confirm(_message)
			}
		}
		return	false;
	}
	function	updateSelection (_form, _name, _target)
	{
		if (_form)
		{
			var	oColl		=	_form.elements;
			var _chkStatus	=	true;
			if (oColl && oColl.length)
			{
				for (var i=0; i<oColl.length; i++)
				{
					var oObject	=	oColl.item(i);
					if (oObject && oObject.name && oObject.name.indexOf(_name) != -1 && oObject.type == "checkbox")
					{
						_chkStatus	=	(oObject.checked) ? _chkStatus : false;
					}
				}
			}
			if (_form[_target])
			{
				_form[_target].checked	=	_chkStatus;
			}
			return true;
		}
	}
	function	checkAll (_form, _name, _mode)
	{
		if (_form)
		{
			var	oColl	=	_form.elements;
			if (oColl && oColl.length)
			{
				for (var i=0; i<oColl.length; i++)
				{
					var oObject	=	oColl.item(i);
					if (oObject && oObject.name && oObject.name.indexOf(_name) != -1 && oObject.type == "checkbox")
					{
						oObject.checked = _mode;
						if (oObject.onclick)
						{
							oObject.onclick();
						}
					}
				}
			}
			return true;
		}
	}
	/**
	 *
	 * @todo perform check by pattern too
	 */
	function	isAnyChecked(_form)
	{
		if (_form)
		{
			var	oColl	=	_form.elements;
			if (oColl && oColl.length)
			{
				for (var i=0; i<oColl.length; i++)
				{
					var oObject	=	oColl.item(i);
					if (oObject && oObject.type == "checkbox")
					{
						if (oObject.checked)
						return true;
					}
				}
			}
		}
		return false;
	}
	/**
	 * Администрирование, конфигурация сайта. Восстановление настроек по умолчанию для формы
	 * @todo вынести в шаблон 
	 */
	function setDefaultValues() {
		form = $("configForm");

		if (!form) return;

		for (groupKey in configDefaultValues) {
			for (itemKey in configDefaultValues[groupKey]) {

				formItem = form.elements["fd["+groupKey+"]["+itemKey+"]"];
			
				if (!formItem) continue;

				// @todo add other supported types
				if (formItem.type=="text"    || 
					formItem.type=="textarea" ) 
				{
					formItem.value=configDefaultValues[groupKey][itemKey];
				}
			}
		}
	}
	/**
	 * Переключение видимости элементов. 
	 * При включении элемента предыдущий видимый прячется
	 */
	var toggleItemVisibilityObject = null;

	function toggleItemVisibility(id) {
		object = document.getElementById(id);
		if (!object) return;

		if (toggleItemVisibilityObject && toggleItemVisibilityObject!=object)
			toggleItemVisibilityObject.style.display = "none";

		object.style.display = object.style.display?"":"none";
	
		toggleItemVisibilityObject = object;
	}
	/**
	 * Переключение видимости панелей для tabctrl в настройках сайта
	 */
	var toggleTabVisibilityTab = null;

	function toggleTabVisibility(tabObj, id) {
		if (toggleItemVisibilityObject==document.getElementById(id)) return;

		toggleItemVisibility(id);

		if (toggleTabVisibilityTab)
			toggleTabVisibilityTab.className="tabctrl_tab";

		toggleTabVisibilityTab = tabObj;
		toggleTabVisibilityTab.className="tabctrl_tab_active";
	}

	/**
	 * указатель мыши над вкладкой таба
	 */
	function onTabMouseOver(tabObj, over) {
		if (toggleTabVisibilityTab == tabObj) return;

		if (over)
			tabObj.className="tabctrl_tab_over";
		else
			tabObj.className="tabctrl_tab";
	}

	/**
	 * @usedby addElementToBuffer
	 * @usedby reloadOrder
	 * @usedby reloadPageOrder
	 */
	function addSelectOption (_targetArray, _emptyText, _selectObj, _selected)
	{					
		if (_selectObj)
		{
            var _selectEmpty    =   true;
			cmfClearOptions (_selectObj);
			for (var i = 0; i < _targetArray.length; i++)
			{	
				if (_targetArray[i])
				{
				    var _optionSelected   =   (_targetArray[i][0] && _targetArray[i][0] == _selected);
				    _selectEmpty    =   (_optionSelected) ? false : _selectEmpty;
                    cmfAddOption(_selectObj, _targetArray[i][0], _targetArray[i][1], _optionSelected);
				}
			}
			if (_emptyText)
			{
                cmfAddOption(_selectObj, "0", _emptyText, _selectEmpty);
            }
		}
	}	



	/**
	 * Tab Control functions 
	 * @see CMS module
	 */
	var currentTab = {};
	function showTab(curr_tab, mode) {
		var obj;

		obj = $(curr_tab);
		if (obj)
			obj.className = mode?'selected':'';
		else
			alert('Tab shortcut #'+curr_tab+' was not found');

		obj = $(curr_tab+'_tab');
		if (obj)
			obj.style.display = mode?'':'none';
		else
			alert('Tab #'+curr_tab+'_tab'+' was not found');
	}

	function switchTab(obj, tab_ctrl_id, tab_id) 
	{
		if (currentTab[tab_ctrl_id]) {
			showTab(currentTab[tab_ctrl_id], false);
		}

		currentTab[tab_ctrl_id] = tab_id;

		showTab(currentTab[tab_ctrl_id], true);

		if ((tab_ctrl_id == 'pe_tab') && $('current_tab'))
			$('current_tab').value = tab_id;

		if (obj && obj.old_onclick) 
			obj.old_onclick();
	}
	
	function initTabCtrl(tab_ctrl_id, default_tab_id)
	{
		var objs = $$('#'+tab_ctrl_id+' a');
		
		for (var i=0;i<objs.length;i++) {
			if (objs[i].onclick)
				objs[i].old_onclick = objs[i].onclick;
			objs[i].onclick = new Function("", "switchTab(this, '"+tab_ctrl_id+"','"+objs[i].id+"');return false;");
		}

		switchTab($(default_tab_id), tab_ctrl_id, default_tab_id);
	}
	/**
	 * Output messages to console or display it as popup
	 * 
	 * @param error_message
	 */
	function cmf_logError()
	{
		if (arguments && arguments.length)
			for (var i = 0; i < arguments.length; i++)
				if (window.console) // FF && Safari && IE featured with Companion.JS
					console.error(arguments[i]);
				else if (opera) // Opera
					opera.postError(arguments[i]);
				else // IE && others
					alert (arguments[i]);
	}
	/**
	 * Toggle TinyMCE JavaScript Editor Control (version 2 and 3 compatible)
	 *
	 * @param id element id to be toggled into WYSIWYG
	 */
	function	cmf_toggleWYSIWYGEditor(id)
	{
		if (typeof(tinyMCE) != 'undefined')
		{
			var version = (typeof(tinymce) != 'undefined' && tinymce.majorVersion) || tinyMCE.majorVersion;
			if (version > 2) // Version 3 and greater
			{
				var mceCommand = (!tinyMCE.get(id)) ? 'mceAddControl' : 'mceRemoveControl';
				if (arguments[1])
				{
					if (tinyMCE.get(id))
						return true;
					mceCommand	=	'mceAddControl';
				}
				tinyMCE.execCommand(mceCommand, false, id); 
			}
			else // Version 2
			{
				var control = document.getElementById(id);
				if (control)
				{
					if (arguments[1])
					{
						if (control.cmf_mce_control)
							return true;
						tinyMCE.addMCEControl(control, control.id);	
					}
					else
					{
						(control.cmf_mce_control) ? tinyMCE.removeMCEControl(control.id) : tinyMCE.addMCEControl(control, control.id);
					}
					control.cmf_mce_control = !control.cmf_mce_control;
				}
			}
		}
		else
		{
			cmf_logError('TinyMCE instance not found.');
		}
	}
	/**
	 * Init TinyMCE JavaScript Editor
	 *
	 * @param id element id to be toggled into WYSIWYG
	 * @param cmf_WYSIWYG_optionset options for editor (simple,mini,medium,maxi,full)
	 */
	function	cmf_tinyMCEInit(id, cmf_WYSIWYG_optionset, cmf_WYSIWYG_params)
	{
		try {
			if (!cmf_WYSIWYG_params || typeof cmf_WYSIWYG_params != 'object'){
				cmf_WYSIWYG_params = {};
			}
            var cmf_WYSIWYG_default_options = {
                    mode        : 'exact',
                    elements    : id,
                    skin        : cmf_WYSIWYG_skin,
                    skin_variant: cmf_WYSIWYG_variant,
                    theme       : (cmf_WYSIWYG_optionset == 'simple') ? 'simple' : cmf_WYSIWYG_theme,
                    language    : cmf_WYSIWYG_language || 'en',
                    
                    theme_advanced_toolbar_location   : cmf_WYSIWYG_toolbar.location,
                    theme_advanced_toolbar_align      : cmf_WYSIWYG_toolbar.align,
                    theme_advanced_statusbar_location : cmf_WYSIWYG_statusbar.location,
                    theme_advanced_resizing           : cmf_WYSIWYG_resize,
                    
                    plugin_cmf_media_link_url    : cmf_HTTP_URL + 'media/browse/',
                    plugin_cmf_media_link_width  : '800',
                    plugin_cmf_media_link_height : '520',
                    
                    plugin_insertdate_dateFormat    : cmf_DATE_FORMAT || '',
                    plugin_insertdate_timeFormat    : cmf_TIME_FORMAT || '',
                    
		    directionality    : 'ltr', // default ltr
		    keep_styles	      : true, // default true
                    forced_root_block : false,
		relative_urls			: false,
		paste_auto_cleanup_on_paste : true,
                    content_css       : cmf_THEME_PATH + "css/content.css",
                    width             : "100%",
                    height            : "360px"
            };
			tinyMCE.init(Object.extend( Object.extend(cmf_WYSIWYG_default_options, cmf_WYSIWYG_options[cmf_WYSIWYG_optionset] || {}), cmf_WYSIWYG_params));
		}
		catch (e)
		{
			cmf_logError('TinyMCE initialization failed.');
		}
	}

