if(typeof(window.URLPARSER_DEFINED) == 'undefined') {
	window.URLPARSER_DEFINED = true;
	
	URLParser = function () {}
	
	URLParser.parse = function(url) {
		this.url = url;
		
		var result = this.url.match(this.regexp);
		
		this.protocol = result[1];
		this.host = result[2];
		this.port = result[4];
		this.path = result[5];
		this.query = result[6];
		this.baseurl = this.protocol + "://" + this.host
		if(this.port) {
			this.baseurl = this.baseurl + ":" + this.port;
		}
		if(this.path) {
			this.baseurl = this.baseurl + "/" + this.path;
		}
		return this;
	}
	
	URLParser.getQueryParams = function() {
		if(typeof(this.query) == 'undefined' || this.query == '') {
			return false;
		}
		
		if(typeof(this.queryParams) == 'Object') {
			return this.queryParams;
		}
		
		var paramPairs = this.query.split("&");
		if(paramPairs.length > 0) {
			this.queryParams = new Object();
			for(var i = 0;i < paramPairs.length;i++) {
				var paramPair = paramPairs[i].split("=");
				this.queryParams[paramPair[0]] = paramPair[1];
			}
		}
		return this.queryParams;
	}
	
	URLParser.prototype.parse = URLParser.parse;
	URLParser.prototype.getQueryParams = URLParser.getQueryParams;
	URLParser.prototype.regexp = /(https?):\/\/([a-zA-Z0-9_\-\.]+)(:([0-9]+))?\/?([a-zA-Z0-9_\.]+)?\??(.*)?/;
}

if(typeof(window.REQUESTPERAJAX_DEFINED) == 'undefined') {
	window.REQUESTPERAJAX_DEFINED = true;

	var ajaxResponseTargetQueues = false;
	var ajaxRequestStorage = new Object();
	
	function requestPerAjax(url, __target_id, title, timeout, __loader_id) {
		if(typeof(__target_id) == 'undefined') {
			return;
		}
		var urlParser = new URLParser();
		urlParser.parse(url);
	
		var storageKey = urlParser.query + "&__target_id=" + __target_id;
		storageKey = storageKey.replace(/[\?&=]/g,'');
		if(ajaxRequestStorage[storageKey] == 1) {
			var target_element = document.getElementById(__target_id);
			if(target_element && target_element.style.display != 'none' && __target_id == '__ajax_target') {
				return;
			}
		} else {
			ajaxRequestStorage[storageKey] = 1;
		}
	
		var ajaxAction = urlParser.baseurl;
		var ajaxArgs = urlParser.getQueryParams();
		
		var view = 'main';
		if(ajaxArgs['view']) {
			view = ajaxArgs['view'];
		} else if(ajaxArgs['page']) {
			view = ajaxArgs['page'];
			delete(ajaxArgs['page']);
		}
		ajaxArgs['view'] = 'ajax_result';
		ajaxArgs['fetchview'] = view;
		ajaxArgs['__target_id'] = __target_id;
		ajaxArgs['title'] = title;
		ajaxArgs['__loader_id'] = __loader_id;
		
		show(__loader_id);
		
		if(timeout) {
			ajaxArgs['timeout'] = timeout;
		}
		ajax_submit(ajaxAction, on_response, ajaxArgs);
	}
	
	function on_response(responseText, responseXML) {
		try {
			eval("var response="+responseText+";");
			if(typeof(response) == 'object') {
				handleResponse(response);
			} else {
				//Well well well what have we here...
			}
		} catch (exception) {
			alert(exception.toString());
		}
	}
	
	
	function handleResponse(response) {
		if(typeof(response) != 'object') return;
		try {
			var __target_id = response['sentdata']['__target_id'];
			var title = response['sentdata']['title'];
			
			hide(response['sentdata']['__loader_id']);
			
			var target_element = document.getElementById(__target_id);
			//We have a target for the response
			if(target_element) {
				//The target is free for our response
				if(target_element.style.display != 'none' && __target_id == '__ajax_target') {
					//We have to queue the response for the target
					getAjaxResponseTargetQueues().push(__target_id, response);				
				} else {
					var title_element = document.getElementById(__target_id + "_title");
					if(title_element) {
						title_element.innerHTML = title;
					}
					var content_element = document.getElementById(__target_id + "_content");
					if(content_element) {
						content_element.innerHTML = response['view'];
						if(content_element.scrollHeight > 400 && __target_id == '__ajax_target') {
							content_element.style.height = '400px';
							content_element.style.overflow = 'auto';
						}
						var timeout = response['sentdata']['timeout'];
						//target_element.style.display='inline';
						showTarget(__target_id, timeout);
					} else {
						target_element.innerHTML = response['view'];
					}
				}
			}
			//If no error occurred we can return true... the target element is
			//optional. if someone won't need it... well thats ok....
			return true;
		} catch (exception) {
			alert(exception.toString());
		}
		return false;
	}
}