var fw_tableAjaxRequests = new Array();
var fw_tableAjaxRequestsLoading = false;

if (fw_clearFeedbacks == undefined) {
	var fw_clearFeedbacks = true;
}

function fw_ajaxrequest()
{
	this.method = 'GET';
	this.async = true;
	this.path = '/';
	this.target = $('fw_main');
	this.content = null;
	this.form = null;
	this.evalScripts = true;
	this.scrollToTarget = false;
	this.showLoading = true;
	this.clearFeedbacks = fw_clearFeedbacks;
}

fw_ajaxrequest.prototype.setMethod = function(method)
{
	this.method = method;
}

fw_ajaxrequest.prototype.setPath = function(path)
{
	this.path = path;
}

fw_ajaxrequest.prototype.setForm = function(form)
{
	this.form = form;
}

fw_ajaxrequest.prototype.setTarget = function(target)
{
	this.target = target;
}

fw_ajaxrequest.prototype.setEvalScripts = function(evalScripts)
{
	this.evalScripts = evalScripts;
}

fw_ajaxrequest.prototype.setScrollToTarget = function(scrollToTarget)
{
	this.scrollToTarget = scrollToTarget;
}


fw_ajaxrequest.prototype.setContent = function(content)
{
	this.content = content;
}

fw_ajaxrequest.prototype.setAsync = function(async)
{
	this.async = async;
}

fw_ajaxrequest.prototype.setShowLoading = function(show)
{
	this.showLoading = show;
}

fw_ajaxrequest.prototype.clearFeedback = function()
{
	if ($('fw_feedback')) {
		fw_empty_node($('fw_feedback'));
	}
}

fw_ajaxrequest.prototype.send = function()
{
	if (this.content == null) {
		var content = "";
	} else {
		var content = this.content;
	}
	
	if (this.clearFeedbacks) {
		this.clearFeedback();
	}
	
	fw_addToAjaxRefreshTable(this.target, this.path);
		
	if(this.target == null) {
		var myAjax = new Ajax.Request( 
						this.path, 
						{
							method: this.method, 
							parameters: (this.form != null? Form.serialize(this.form): content), 
							evalScripts: this.evalScripts,
							onLoading: this.onAjaxLoading.bindAsEventListener(this),
							onLoaded: this.onAjaxLoaded.bindAsEventListener(this),
							onSuccess: this.onAjaxSuccess.bindAsEventListener(this),
							onFailure: this.onAjaxFailure.bindAsEventListener(this),
							onComplete: this.onAjaxComplete.bindAsEventListener(this)
						});
	} else {
		var myAjax = new Ajax.Updater( 
						this.target, this.path, 
						{
							method: this.method, 
							parameters: (this.form != null? Form.serialize(this.form): content), 
							evalScripts: this.evalScripts,
							onLoading: this.onAjaxLoading.bindAsEventListener(this),
							onLoaded: this.onAjaxLoaded.bindAsEventListener(this),
							onSuccess: this.onAjaxSuccess.bindAsEventListener(this),
							onFailure: this.onAjaxFailure.bindAsEventListener(this),
							onComplete: this.onAjaxComplete.bindAsEventListener(this)
						});
	}
}


fw_ajaxrequest.prototype.onAjaxSuccess = function(XMLHttpRequest, responseHttpHeader) {
}

fw_ajaxrequest.prototype.onAjaxFailure = function(XMLHttpRequest, responseHttpHeader) {
}

fw_ajaxrequest.prototype.onAjaxLoading = function(XMLHttpRequest, responseHttpHeader) {
	if (this.target && this.showLoading) {
		fw_working(this.target);
	}
	
	this.processAfterRequest();
}

fw_ajaxrequest.prototype.onAjaxLoaded = function(XMLHttpRequest, responseHttpHeader) {
	fw_done(this.target);
}

fw_ajaxrequest.prototype.onAjaxComplete = function(XMLHttpRequest, responseHttpHeader) {
	
	//location.href = location.href.replace(/(#.*|$)/, '#'+this.path);
	
	this.processAfterResponse();
	this.fw_checkFeedback(XMLHttpRequest, responseHttpHeader);
	fw_done(this.target);
	if (this.scrollToTarget == true) {
		fw_scrollTo(this.target);
	}
}

function appendChilds(node)
{
	if(node.childNodes.length > 1) {
		for(i=0; i<node.childNodes.length; i++) {
			node.appendChilds(node.childNodes[i]);
		}
	} else if(node.childNodes.length == 1) {
		
	} else {
		
	}
}

fw_ajaxrequest.prototype.processAfterResponse = function() {
}

fw_ajaxrequest.prototype.processAfterRequest = function() {
}

fw_ajaxrequest.prototype.fw_checkFeedback = function(XMLHttpRequest, responseHttpHeader) {
	if (XMLHttpRequest.getResponseHeader('Astina-Feedback')) {
		request = new fw_ajaxrequest();
		
		request.processAfterResponse = function()
		{
			fw_feedback_fade(5000);
		};
		
		fw_get('/public/feedbacks.ajax', $('fw_feedback'), request);
	}
}

function fw_get(path, target, request, evalScripts, scrollToTarget, showLoading)
{
	if (request == undefined || request == null) {
		request = new fw_ajaxrequest();
	}
	if (evalScripts != undefined) {
		request.setEvalScripts(evalScripts);
	}
	if (scrollToTarget != undefined) {
		request.setScrollToTarget(scrollToTarget);
	}
	if (showLoading != undefined) {
		request.setShowLoading(showLoading);
	}
	
	request.setPath(path);
	request.setTarget(target);
	request.send();
}

function fw_get_once(path, target, request, evalScripts, scrollToTarget)
{
	if (target.childNodes.length == 0) {
		return fw_get(path, target, request, evalScripts, scrollToTarget);
	}
}

function fw_post(path, target, content, request, evalScripts)
{
	if (request == undefined) {
		var request = new fw_ajaxrequest();
	}
	
	if (evalScripts == undefined) {
		var evalScripts = false;
	}
	
	request.setMethod('POST');
	request.setPath(path);
	request.setTarget(target);
	request.setEvalScripts(evalScripts);
	request.setContent(content);
	request.send();
}

function fw_action(query, request)
{
	if (request == undefined) {
		request = new fw_ajaxrequest();
	}
	request.setPath('/public/null.ajax?' + query);
	request.setTarget(null);
	request.send();	
}

function fw_set_user_setting(name, value)
{
	fw_action('a-users-setUserSetting-name='+name+'&a-users-setUserSetting-value='+value);
}

function fw_set_user_session(name, value)
{
	fw_action('a-users-setUserSession-var='+name+'&a-users-setUserSession-value='+value);
}

function fw_submit(form, path, target, disable, evalScripts, request, scrollToTarget)
{
	if (path == undefined) { 
		path = form.action;
		path = path.replace(/\.html($|\?)/, '.ajax$1');
	}
	
	if (target == undefined) {
		target = form.parentNode;
	}
	
	if (disable == undefined) {
		disable = true;
	}
	
	if (evalScripts == undefined) {
		evalScripts = false;
	}
	
	if (request == undefined) {
		request = new fw_ajaxrequest();
	}
	
	if (scrollToTarget != undefined) {
		request.setScrollToTarget(scrollToTarget);
	}
	
	request.setForm(form);
	
	if (disable == true) {
		request.processAfterRequest = function() {
			fw_disableform(this.form);
		};
	}
	
	var content = null;
	
	fw_post(path, target, content, request, evalScripts);
}


function fw_working(target)
{
	if ($('fw_working')) {
		fw_show_node($('fw_working'));
	}
	//fw_working_timeout= window.setTimeout('fw_show_node($(\'fw_working\'))', 1000);
	//fw_working_timeout = window.setTimeout('fw_show_node($(\'fw_working_overlay\'))', 5000);
}

function fw_done(target)
{
	if ($('fw_working')) {
		fw_hide_node($('fw_working'));
	}
	//window.clearTimeout(fw_working_timeout);
	//fw_hide_node($('fw_working_overlay'));
}

function fw_disableform(form)
{
	for (i = 0; i < form.elements.length; i++) {
		if (   form.elements[i].getAttribute('type') == 'submit' 
			|| form.elements[i].getAttribute('type') == 'button' 
			|| form.elements[i].getAttribute('type') == 'reset') {
			form.elements[i].disabled = true;
		}
	}
}

/* field validation functions */

function fw_validateField(fieldId,url) {
	var validation = new fw_fieldValidation(fieldId,url);
	validation.execute();
}

function fw_fieldValidation(fieldId,url)
{
	this.url = url;
	this.fieldId = fieldId;
}

fw_fieldValidation.prototype.execute = function() {
	
	// get the field name out of the action param
	reg_search = /.*\[(.*)\]/;
	
	if(matches = reg_search.exec($(this.fieldId).name)) {
		elemName = matches[1];
	} else {
		elemName = elem.id;
	}
	
	params = ''+elemName+'='+$(this.fieldId).value;
	
	var myAjax = new Ajax.Request(
		this.url, 
		{
			method: 'get', 
			parameters: params, 
			onComplete: this.showValidationResult.bindAsEventListener(this)
		});
		
}

fw_fieldValidation.prototype.showValidationResult = function(request) {
	
	var xmlDoc = request.responseXML;

	var validationNode = xmlDoc.documentElement.getElementsByTagName("validation")[0];
	
	var styleClass = '';
			
	/*if(currField.getAttribute("style_class") != '') {
		styleClass = validationNode.getAttribute("style_class") + ' ';
	} */
	
	if(validationNode.getAttribute('result') == "success") {
		if(validationNode.getAttribute('display_type') == "both" || validationNode.getAttribute('display_type') == "field") {
			$(this.fieldId).className = styleClass + 'success';
		} else {
			$(input_id).className = validationNode.getAttribute("style_class");
		}
		
		if(validationNode.getAttribute('display_type') == "both" || validationNode.getAttribute('display_type') == "label") {
			$("label_"+this.fieldId).className = 'success';
		}
	} else {
	
		formMessageTexts = "<ul>";
		
		if(validationNode.getAttribute('display_type') == "both" || validationNode.getAttribute('display_type') == "field") {
			$(this.fieldId).className = style_class+'failed';
		}
		
		if(validationNode.getAttribute('display_type') == "both" || validationNode.getAttribute('display_type') == "label") {
			$("label_"+this.fieldId).className = 'failed';
		}
		
		var messages = xmlDoc.documentElement.getElementsByTagName("message");
		var messageTexts = "";
		for(var i = 0; i < messages.length;i++) {
			var messageTextNode = messages[i].childNodes[0];
			var message = messageTextNode.nodeValue;
			messageTexts += message+"\n";
			formMessageTexts += "<li>"+message+"</li>";
		}
		
		formMessageTexts += "</ul>";
		
		$(this.fieldId).title = messageTexts;
		if($("forms_form_"+validationNode.getAttribute('form')+"_validation_messages") && (validationNode.getAttribute('message_type') == "both" || validationNode.getAttribute('message_type') == "field")) {
			$("forms_form_"+validationNode.getAttribute('form')+"_validation_messages").innerHTML = formMessageTexts;
		}
	}
}

/* form validation functions */

function fw_validateForm(form, url)
{
	var validation = new fw_formValidation(form, url);
	validation.execute();
}

function fw_formValidation(form, url)
{
	this.url = url;
	this.form = form;
}

fw_formValidation.prototype.execute = function() {
	
	fw_working(this.target);
	
	var params = '';
	for (i = 0; i < this.form.elements.length; i++) {
		elem = this.form.elements[i];
		if (   elem.name == ''
			|| ((elem.getAttribute('type') == 'radio'
				|| elem.getAttribute('type') == 'checkbox')				
				&& elem.checked == false)) {
			continue;
		}
		if (i > 0) {
			params = params + '&';
		}
		
		// get the field name out of the action param
		reg_search = /.*\[(.*)\]/;
		
		if(matches = reg_search.exec(elem.name)) {
			elemName = matches[1];
		} else {
			elemName = elem.id;
		}
		
		params += elemName + '=' + encodeURIComponent(elem.value);
	}

	
	var myAjax = new Ajax.Request(
		this.url, 
		{
			method: 'post', 
			parameters: params, 
			onComplete: this.showValidationResult.bindAsEventListener(this)
		});
		
}

fw_formValidation.prototype.showValidationResult = function(request)
{
	var xmlDoc = request.responseXML;
	
	var validationNode = xmlDoc.documentElement.getElementsByTagName("validation")[0];
	
	if(validationNode.getAttribute('result') == "success") {
		this.form.submit();
	} else {
		
		var messages = xmlDoc.documentElement.getElementsByTagName("message");
		var messageTexts = "<ul>";
		for(var i = 0; i < messages.length;i++) {
			var messageTextNode = messages[i].childNodes[0];
			var message = messageTextNode.nodeValue;
			messageTexts += "<li>"+message+"</li>";
		}
		
		messageTexts += "</ul>";
		
		var fields = xmlDoc.documentElement.getElementsByTagName("field");
		
		for(var i = 0; i < fields.length;i++) {
			
			var currField = fields[i];
			var input_id = currField.getAttribute('input_id');
			var styleClass = '';
			
			if(currField.getAttribute("style_class") != '') {
				styleClass = currField.getAttribute("style_class") + ' ';
			} 
			
			if(currField.getAttribute("result") == "success") {			
				
				if(validationNode.getAttribute('display_status_type') == "both" || validationNode.getAttribute('display_status_type') == "success") {
					if($(input_id) && (validationNode.getAttribute('display_type') == "both" || validationNode.getAttribute('display_type') == "field")) {
						$(input_id).className = styleClass + 'success';
					}
						
					if($("label_"+input_id) && (validationNode.getAttribute('display_type') == "both" || validationNode.getAttribute('display_type') == "label")) {
						$("label_"+input_id).className = 'success';
					}
				} else {
					if ($(input_id)) {
						$(input_id).className = currField.getAttribute("style_class");
					}
					if($("label_"+input_id)) {
						$("label_"+input_id).className = '';
					}
				}
				
			} else {
					
				var fieldMessages = currField.getElementsByTagName("message");
				var fieldMessageTexts = "";
				for(var j = 0; j < fieldMessages.length;j++) {
					var fieldMessageTextNode = fieldMessages[j].childNodes[0];
					var fieldMessage = fieldMessageTextNode.nodeValue;
					fieldMessageTexts += fieldMessage+"\n";
				}
				 
				
				if($(input_id) && (validationNode.getAttribute('display_type') == "both" || validationNode.getAttribute('display_type') == "field")) {
					$(input_id).className = styleClass + 'failed';
					$(input_id).title = fieldMessageTexts;	
				}
				
				if($("label_"+input_id) && (validationNode.getAttribute('display_type') == "both" || validationNode.getAttribute('display_type') == "label")) {
					$("label_"+input_id).className = 'failed';
					$("label_"+input_id).title = fieldMessageTexts;	
				}

			}		
		}
		
		if($("forms_form_"+validationNode.getAttribute('form')+"_validation_messages")) {
			$("forms_form_"+validationNode.getAttribute('form')+"_validation_messages").innerHTML = messageTexts;
		}
	}
	
	fw_done(this.target);
}

function fw_ajaxRefresh() {
	fw_tableAjaxRequestsLoading = true;
	for(i = fw_tableAjaxRequests.length-1; i>0; i--) {
		fw_get(fw_tableAjaxRequests[i]["path"], fw_tableAjaxRequests[i]["target"]);
	}
	fw_tableAjaxRequestsLoading = false;
}

function fw_ajaxBack(target)
{
	path = fw_getAjaxLastPath(target);
	if (path) {
		fw_get(path, target);
		return true;
	}
	return false;
}

function fw_addToAjaxRefreshTable(target, path)
{
	if (target == undefined) {
		return null;
	}

	if(fw_tableAjaxRequestsLoading == false) {		
		j = fw_tableAjaxRequests.length;
		
		var lastPath = null;
		for(k=0; k<fw_tableAjaxRequests.length; k++) {
			if(fw_tableAjaxRequests[k]["target"] == target) {
				j = k; 
				lastPath = fw_tableAjaxRequests[k]['path']
			}
		}
		
		fw_tableAjaxRequests[j] = new Object();
		fw_tableAjaxRequests[j]["target"] = target; 
		fw_tableAjaxRequests[j]["path"] = path;
		fw_tableAjaxRequests[j]['lastPath'] = lastPath;
		fw_tableAjaxRequests[j]['id'] = target.getAttribute('id'); 
	}
}

function fw_getAjaxPath(target)
{
	for (i = 0; i < fw_tableAjaxRequests.length; i++) {
		if (fw_tableAjaxRequests[i]['target'] == target) {
			return fw_tableAjaxRequests[i]['path'];
		}
	}
	return null;
}

function fw_getAjaxLastPath(target)
{
	for (i = 0; i < fw_tableAjaxRequests.length; i++) {
		if (fw_tableAjaxRequests[i]['target'] == target) {
			return fw_tableAjaxRequests[i]['lastPath'];
		}
	}
	return null;
}

function fw_getAjaxPathById(id)
{
	for (i = 0; i < fw_tableAjaxRequests.length; i++) {
		if (fw_tableAjaxRequests[i]['id'] == id) {
			return fw_tableAjaxRequests[i]['path'];
		}
	}
	return null;
}

function fw_clearAjaxPath(target)
{
	for (i = 0; i < fw_tableAjaxRequests.length; i++) {
		if (fw_tableAjaxRequests[i]['target'] == target) {
			fw_tableAjaxRequests[i]['path'] = null;
			return true;
		}
	}
}