window.addEvent('domready', init);

window.addEvent('domready', preventFormDefault);

function preventFormDefault() {
	$each($$('form'), function(el) {
		el.addEvent('submit', function(event) {
			event.preventDefault();
		});
	});
}

var http_request = false;
var http_requestList = new Array();

/* receive a http request object for a given key */
function createXmlHttpObject(handler, key) {
	http_request = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
			}
		}
	}
	if (!http_request) {
		alert('Es ist ein Systemfehler aufgetreten. Kontaktieren Sie bitte unseren Support!');
	}
	http_requestList[key] = http_request;
	http_request.onreadystatechange = handler;
    return true;
}

/* serialize a form tag and create the key value string */
function serializeForm(form) {

    /* iterate on all elements and create an array of key value pairs */
    function serializeElements (elements, func) {
        var elm = [];
        for(var i = 0; i < elements.length; i++) {
            var values = func(elements[i]);
            if (values != null) elm.push(values);
        }
        return elm;
    };

    /* create a key value pair */
    var getValueSequence = function(element) {
        if (element.name)
            return encodeURIComponent(element.name) + '=' + encodeURIComponent(element.value);
        else return '';
    };

    /* select all input fields in form */
    var inputfields = serializeElements(form.getElementsByTagName('input'),
            function(element) {
              if((element.type != 'radio' && element.type != 'checkbox') || element.checked) {
                 return getValueSequence(element);
              }
            });

    /* select all select fields in form */
    var selectfields = serializeElements(form.getElementsByTagName('select'), getValueSequence);

    /* select all text areas in form */
    var textfields = serializeElements(form.getElementsByTagName('textarea'), getValueSequence);

    /* concat all result string */
    return inputfields.concat(selectfields).concat(textfields).join('&');
};

function isResponseReady(response) {
	if(response.readyState == 4 && response.status == 200) {
		return true;
	}
	return false;
}

function init() {
}

function performService(action, key, parameters, handler) {
	createXmlHttpObject(handler, key);
	http_request.open('POST', action, true);
	http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8'");
	http_request.setRequestHeader("Content-length", parameters.length);
	http_request.setRequestHeader("Connection", "close");
	http_request.send(parameters);
}

function sendService(action, key, parameters, successTarget, failTarget, messageLayer, failHandler, successHandler) {
	performService(action, key, parameters, function() {
		var response = http_requestList[key];
		if(isResponseReady(response)) {
			var result = eval("("+response.responseText+")");
			if (result.state == 'successful') {
				if (successTarget != null) {
					window.location = successTarget;
				}
				if(successHandler != null) {
					if(result.results.length > 0) {
						successHandler(result.results);
					}
					else {
						successHandler();
					}
				}
			} else if (result.state == 'failed') {
				if($defined($("errorMessage"))) {
					$("errorMessage").innerHTML = result.errorMessage;
				}
				if (failTarget != null) {
					window.location = failTarget;
				}
				if(failHandler != null) {
					if(result.results.length > 0) {
						failHandler(result.results);
					}
					else {
						failHandler();
					}
				}
			}
			if (messageLayer != null) {
				var list = '';
				for (i=0; i < result.messages.length; i++)
					list += '' + result.messages[i].text + '<br />';
				list+='';
				$(messageLayer).innerHTML = list;
			}
		}
	});
}

function performServiceForm(form, handler) {
	performService(
					$(form).action,
					$(form).getAttribute("id"),
					serializeForm($(form)),
					handler);
}

function sendServiceForm(form, successTarget, failTarget, messageLayer, failHandler, successHandler) {
	sendService(
					$(form).action,
					$(form).getAttribute("id"),
					serializeForm($(form)),
					successTarget,
					failTarget,
					messageLayer,
					failHandler,
					successHandler);
}

/** Displaying Validation in Form */

var errorContainerList = new Array();
function validateForm(results) {
	if($defined($('successMessage'))) {
		$('successMessage').setStyle('display', 'none');
	}

	for (i=0; i < errorContainerList.length; i++) {
		$(errorContainerList[i]).removeClass('fieldError');
		$(errorContainerList[i]).addClass('noError');
	}

	errorContainerList = new Array();

	if(results != null) {
		for (i=0; i < results.length; i++) {
			$(results[i].key).removeClass('noError');
			$(results[i].key).addClass('fieldError');
			errorContainerList.push(results[i].key);
		}
	}
}

function updateBasket(results) {
	for (i=0; i < results.length; i++) {
		if (results[i].key != null && results[i].key == 'basket') {
			$('basket').innerHTML = results[i].source;
		}
		if (results[i].key != null && results[i].key == 'basketTotalAmount') {
			$('basketTotalAmount').innerHTML = results[i].source;
		}
	}
}

function updateArticleCalculation() {
	var response = http_requestList['calculateArticleForm'];
	if(isResponseReady(response)) {
		var result = eval("("+response.responseText+")");
		for (i=0; i < result.results.length; i++)
			if (result.results[i].key != null && result.results[i].key == 'calculator') {
				$('calculator').innerHTML = result.results[i].source;
			}
	}
	
	preventFormDefault();
}

function updateTotalBasketAmount() {
	var response = http_requestList['addToBasketForm'];
	if(isResponseReady(response)) {
		var result = eval("("+response.responseText+")");
		var amount = null;
		var articleTitle = null;
		for (i=0; i < result.results.length; i++) {
			if (result.results[i].key != null && result.results[i].key == 'basketTotalAmount') {
				amount = result.results[i].source;
				$('basketTotalAmount').innerHTML = amount;
			}
			if (result.results[i].key != null && result.results[i].key == 'basketAddedArticle') {
				articleTitle = result.results[i].source;
			}
		}
		if(articleTitle != null) visualizeBasketAdd(articleTitle);
	}
}

function updateArticleWithNewArticle(results) {
	$('articleNbr').set('value', '');
	updateBasket(results);
}

function updateContactsAddress(key, results) {
	for (i = 0; i < results.length; i++) {
		if(results[i].key == "company" && $defined($(key + 'Company'))) $(key + 'Company').setAttribute('value', results[i].source);
		if(results[i].key == "name" && $defined($(key + 'Name'))) $(key + 'Name').setAttribute('value', results[i].source);
		if(results[i].key == "firstName" && $defined($(key + 'FirstName'))) $(key + 'FirstName').setAttribute('value', results[i].source);
		if(results[i].key == "department" && $defined($(key + 'Department'))) $(key + 'Department').setAttribute('value', results[i].source);
		if(results[i].key == "street" && $defined($(key + 'Street'))) $(key + 'Street').setAttribute('value', results[i].source);
		if(results[i].key == "streetNbr" && $defined($(key + 'StreetNbr'))) $(key + 'StreetNbr').setAttribute('value', results[i].source);
		if(results[i].key == "city" && $defined($(key + 'City'))) $(key + 'City').setAttribute('value', results[i].source);
		if(results[i].key == "zipCode" && $defined($(key + 'ZipCode'))) $(key + 'ZipCode').setAttribute('value', results[i].source);
		if(results[i].key == "salutation" && $defined($(key + 'Salutation'))) {
			for(j = 0; j < $(key + 'Salutation').length; j++) {
				if($(key + 'Salutation')[j].getAttribute('value') == results[i].source) $(key + 'Salutation').selectedIndex = j;
			}
		}
		if(results[i].key == "country" && $defined($(key + 'Country'))) {
			for(j = 0; j < $(key + 'Country').length; j++) {
				if($(key + 'Country')[j].getAttribute('value') == results[i].source) $(key + 'Country').selectedIndex = j;
			}
		}
	}
}

function updateContactsBillingAddress(results) {
	updateContactsAddress("contactsBilling", results);
}

function updateContactsDeliveryAddress(results) {
	updateContactsAddress("contactsDelivery", results);
}

function updateContactsAddressbook(results) {
	updateContactsAddress("contacts", results);
}

function displayOrderRequest(results) {
	orderRequestId = null;
	orderRequestSource = null;
	for (i = 0; i < results.length; i++) {
		if(results[i].key == "orderRequestSource") orderRequestSource = results[i].source;
		if(results[i].key == "orderRequestId") orderRequestId = results[i].source;
	}

	if(orderRequestId != null && orderRequestSource != null) {
		$("orderRequest" + orderRequestId).innerHTML = orderRequestSource;
		$("orderRequest" + orderRequestId).setStyle('display','block');
	}
}

function setContactMaskMode() {
	$('orderRequestDeliveryReceiverFields').className = ($('orderRequestDeliveryReceiverConfirmCB').checked) ? '' : 'hide';
}



