var Rx = {
	sExecuteActionUrl: 'rx/public/ajax/show/',
	sReturnActionUrl: '/rx/public/ajax/exec/',
	sValuesActionUrl: '/rx/public/ajax/values/',

	addEvent: function (obj, type, fn)
	{
		if (obj.addEventListener){
			obj.addEventListener( type, fn, false );
		} else if(obj.attachEvent) {
			obj.attachEvent( "on"+type, fn );
		} else {
			obj["on"+type] = fn;
		}
	},

	removeEvent: function (obj, type, fn)
	{
		if (obj.removeEventListener) {
			obj.removeEventListener( type, fn, false );
		} else if (obj.detachEvent){
			obj.detachEvent( "on"+type, obj[type+fn] );
		} else {
			obj["on"+type] = null;
		}
	},

	ajax: function (oParams)
	{
		JsHttpRequest.query(
			oParams['Url'],
			oParams['Params'],
			oParams['OnReady'],
			true
		);

		return true;
	},

	getValuesList: function (sModule, sModel, aCriteria, sTargetId, sNotSelectedText, sFieldName)
	{
		var aRequest = new Object();
		if (aCriteria) {
			aRequest['Criteria'] = aCriteria;
		}

		if (sModule == 'Structure' && sModel == 'Pages') {
			aRequest['Order'] = new Array();
			aRequest['Order']['TreePath'] = 'ASC';
		}

		if (!sNotSelectedText) {
			sNotSelectedText = '- Не выбрано -';
		}

		if (!sFieldName) {
			sFieldName = ':Name:';
		}

		aRequest['Limit']   = 10000;
		aRequest['Offset']  = 0;
		aRequest['_Module'] = sModule;
		aRequest['_Model']  = sModel;
		aRequest['Format']  = sFieldName;
		aRequest['Default']  = sNotSelectedText;

		Rx.ajax({
			Url: Rx.sValuesActionUrl,
			Params: aRequest,
			OnReady: function (result, errors)
			{
				var sel = $$(sTargetId + 'Field');
				while (sel.options.length) {
					sel.options[0] = null;
				}

				for (a in result) {
					sel[sel.options.length] = new Option(result[a]['Name'], result[a]['Value']);
				}
			}

		});


	},

	getLeftOffset: function (oElement)
	{
		var _left = 0;

		do {
			_left += oElement.offsetLeft;
		} while(oElement = oElement.offsetParent);

	  	return _left;
	},

	getTopOffset: function (oElement)
	{
		var _top = 0;

		do {
			_top += oElement.offsetTop;
		} while(oElement = oElement.offsetParent);

	  	return _top;
	},

	getWidth: function (oElement)
	{
		return oElement.offsetWidth;
	},

	getHeight: function (oElement)
	{
		return oElement.offsetHeight;
	},

	findAjaxScripts: function (sString)
	{
		var oTarget = document.createElement('div');

		var js_ScriptFragment = '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)';
		var js_ScriptSrcFragment = '<script.+(src[ ]*=[ ]*\'(.*?)\'|src[ ]*=[ ]*"(.*?)").+';

		var matchAll = new RegExp(js_ScriptFragment, 'img');
		var matchOne = new RegExp(js_ScriptFragment, 'im');
		var matchSrc = new RegExp(js_ScriptSrcFragment, 'im');

		var arr = sString.match(matchAll) || [];
		var res = [];

		for (var i = 0; i < arr.length; i++)
		{
			var srcMt = arr[i].match(matchSrc);
			if (srcMt) {
				var script = document.createElement("script");
				script.language = "JavaScript";
				script.type = "text/javascript";
				script.src =  (srcMt.length > 3 ? srcMt[3] : srcMt[2]);
				oTarget.appendChild(script);
			}

			var mtCode = arr[i].match(matchOne) || ['', ''];
			if (mtCode[1] != '') {
				var script = document.createElement("script");
				script.language = "JavaScript";
				script.type = "text/javascript";
				script.text =  mtCode[1];
				oTarget.appendChild(script);
			}
		}


		sString = sString.replace(js_ScriptFragment, "");
		sString = sString.replace(js_ScriptSrcFragment, "");

		var oText = document.createElement('div');
		oText.innerHTML = sString;
		oTarget.appendChild(oText);

		//oTarget.innerHTML = sString;

		//alert(sString);

		return oTarget;
	},

	reloadCaptcha: function (sId, sUrl)
	{
		var dt = new Date();
		document.getElementById(sId).src = sUrl + '&' + dt.getTime()
	},

	showSearchString: function (sModule, sModel, sField, sFieldName, oElement)
	{
		if (oElement.value.length >= 2) {
			var aRequest = new Object();

			aRequest['Criteria'] = new Array();
			aRequest['Criteria'][sField] = {
				Value: '%' + oElement.value + '%',
				Type: 'LIKE'
			};


			if (!sFieldName) {
				sFieldName = ':Name:';
			}

			aRequest['Limit']   = 10;
			aRequest['Offset']  = 0;
			aRequest['_Module'] = sModule;
			aRequest['_Model']  = sModel;
			aRequest['Format']  = sFieldName;
			aRequest['NoDefault']  = 1;

			Rx.ajax({
				Url: Rx.sValuesActionUrl,
				Params: aRequest,
				OnReady: function (result)
				{
					var oBox = $$(oElement.id + 'SearchBox');

					var sHtml = '';
					for (a in result) {
						sHtml += '<div class="string_search_row" onclick="$$(\'' + oElement.id + '\').value = \'' + result[a]['Name'] + '\'; $$(\'' + oElement.id + 'Real\').value = \'' + result[a]['Value'] + '\'; Rx.hideSearchString(\'' + oElement.id + '\');" onmouseover="this.className = \'string_search_row_active\';" onmouseout="this.className = \'string_search_row\';">' + result[a]['Name'] + '</div>';
					}

					oBox.innerHTML = sHtml;
					if (sHtml != '') {
						oBox.style.display = 'block';
					} else {
						oBox.style.display = 'none';
					}
				}

			});
		}
	},

	hideSearchString: function (sFieldId)
	{
		if ($(sFieldId + 'SearchBox')) {
			$$(sFieldId + 'SearchBox').style.display = 'none';
		}

		return true;
	},

	showComponentDialog: function (sModule, sModel, sComponent, aParams, sTitle, nWidth, nHeight)
	{
		var aRequest = new Object;
		aRequest = aParams;

		aRequest['_Module']     = sModule;
		aRequest['_Model']      = sModel;
		aRequest['_Component']  = sComponent;


		Rx.ajax({
			Url: Rx.sExecuteActionUrl,
			Params: aRequest,
			OnReady: function (result)
			{
				var oText = Rx.findAjaxScripts(result['html']);
				Rx.showDialog(sTitle, '', oText, nWidth, nHeight);
			}

		});
	},

	showDialog: function (sTitle, sText, oText, nWidth, nHeight)
	{
		var sBoxId = 'ModalDialogBox';

		if (!nWidth) {
			nWidth = 400;
		}

		if (!nHeight) {
			nHeight = 300;
		}

		$$(sBoxId).title = sTitle;
		if (oText) {
			$$(sBoxId).innerHTML = '';
			$$(sBoxId).appendChild(oText);
		} else {
			$$(sBoxId).innerHTML = sText;
		}

		$('#' + sBoxId).dialog(
			{
				bgiframe: true,
				width: nWidth,
				height: nHeight,
				modal: true,
				resizable: false,
				buttons: {
					'Закрыть': function() {
						$(this).dialog('close');
					}
				},
				close: function() {$(this).dialog('destroy');}
			}
		);
	}
};
