var eventhandlers = new Hash();

/**
 * Errechnet den Preis der aktuellen Produktkonfiguration und speichert
 * - den Preis im Feld document.CalculationOptions.preis
 * - die product_id im Feld document.CalculationOptions.product_id
 */
function Calculate() {
	if (CheckData()) {
		var i = 0;
		var params = new Hash();

		document.CalculationOptions.action.value = "calculate";
		
		Loader.GetInstance().ShowLoader();

		for (i = 0; i < document.CalculationOptions.elements.length; i++) {
			if (document.CalculationOptions.elements[i].name == "menge")
				params
						.set(
								document.CalculationOptions.elements[i].name,
								chrwParseInt(document.CalculationOptions.elements[i].value));
			else
				params.set(document.CalculationOptions.elements[i].name,
						document.CalculationOptions.elements[i].value);
		}

		
		var ajax = new Ajax.Request("../../ajax/calculate.php", {
			method : 'post',
			'evalJSON' : 'force',
			parameters : params.toQueryString(),
			onFailure : function(originalRequest) {
				Loader.GetInstance().HideLoader();
			},
			onComplete : function(originalRequest) {
				var data;

				data = originalRequest.responseJSON;

				document.CalculationOptions.preis.value = data.result;
				if (document.CalculationOptions.ppt)
					document.CalculationOptions.ppt.value = data.ppt;
				document.CalculationOptions.product_id.value = data.product_id;

				Handling();
                                CalculateServices();
				
				Loader.GetInstance().HideLoader();
			}
		});
		
	}
}

/**
 * Berechnet die Versandkosten eines Artikels und schreibt Sie in das Feld
 * document.CalculationOptions.handling
 */
function Handling() {
	var i = 0;
	var params = new Hash();

	if (!document.CalculationOptions.plz
			|| !document.CalculationOptions.plz.value
			|| !document.CalculationOptions.handling)
		return;

	document.CalculationOptions.action.value = "calculate";

	for (i = 0; i < document.CalculationOptions.elements.length; i++) {
		if (document.CalculationOptions.elements[i].name == "menge")
			params
					.set(
							document.CalculationOptions.elements[i].name,
							chrwParseInt(document.CalculationOptions.elements[i].value));
		else
			params.set(document.CalculationOptions.elements[i].name,
					document.CalculationOptions.elements[i].value);
	}

	var ajax = new Ajax.Request("../../ajax/handling.php", {
		method : 'post',
		'evalJSON' : 'force',
		parameters : params.toQueryString(),
		onComplete : function(originalRequest) {
			var data;

			data = originalRequest.responseJSON;

			if (data.result)
				document.CalculationOptions.handling.value = data.result == "0,00" ? 'Auf Anfrage' : data.result;
			else
				document.CalculationOptions.handling.value = "";
		}
	});
}

/**
 * Berechnet die Kosten der im Formular ausgewählten Servicelsietungen
 * und schreibt diese, falls vorhanden, in das Felder preisService.
 * 
 * Der Gesamtpreis der Kalkulation wird in das optionale Feld preisSumme
 * geschrieben.
 */
function CalculateServices() {
    var sum = 0.0;
    for (var i = 0; i < document.CalculationOptions.elements.length; i++) {
        var groups = document.CalculationOptions.elements[i].name.match(/(service_)([0-9]{1,})/);
        if (groups != null && groups.length == 3)
        {
            if (document.CalculationOptions.elements['service_' + groups[2]].value  > 0)
            {
                var service = new Service(groups[2]);
                var price = service.getPrice();
                sum += chrwParseFloat(price) * document.CalculationOptions.elements['service_' + groups[2]].value;
            }
        }
    }
    if (document.CalculationOptions.preisService != null)
        document.CalculationOptions.preisService.value = chrwNumberFormat(sum, 2);

    if (document.CalculationOptions.preisSumme != null)
    {
        var summe = chrwParseFloat(document.CalculationOptions.preis.value) + sum;
        document.CalculationOptions.preisSumme.value = chrwNumberFormat(summe, 2);
        if (document.CalculationOptions.mwst != null)
        {
            document.CalculationOptions.mwst.value = chrwNumberFormat(summe * 0.19, 2);
        }
    }
}

function SetDefault(pair) {
	for (i = 0; i < document.CalculationOptions.elements.length; i++) {
		element = document.CalculationOptions.elements[i];
		if (element.name == "param_" + pair.key) {
			element.value = pair.value;
		}
	}
}

function CheckData() {
	if (!Limits.GetInstance().CheckValue(document.CalculationOptions.menge.value)) {
		document.CalculationOptions.menge.focus();
		document.CalculationOptions.menge.select();
		return false;
	}
	return true;
}
function Order() {
	if (CheckData()) {
		if (!document.CalculationOptions.bez.value) {
			alert("Bitte geben Sie einen Projektbezeichner ein!");
			document.CalculationOptions.bez.focus();
			return;
		}
		document.CalculationOptions.action.value = "order";
		document.CalculationOptions.submit();
	}
}

function RequestOffer() {
	if (CheckData()) {
		if (!document.CalculationOptions.bez.value) {
			alert("Bitte geben Sie einen Projektbezeichner ein!");
			document.CalculationOptions.bez.focus();
			return;
		}
		document.CalculationOptions.action.value = "offer";
		document.CalculationOptions.target = "_new";
		document.CalculationOptions.submit();
		document.CalculationOptions.target = "";
	}
}

function OnCustomAction(type, param) {
	var parameter = labels.get(param);
	var field = "param_" + param;
	var value = document.CalculationOptions[field].options[document.CalculationOptions[field].options.selectedIndex].text;

	action = eventhandlers.get(type);
	if (action)
		action(parameter, value);
}

function RegisterEventHandler(event, action) {
	eventhandlers.set(event, action);
}

function ClearCombo(comboBox) {
	var idx;
	for (idx = comboBox.options.length; idx >= 0; idx--) {
		comboBox.options[idx] = null;
	}
}

function Restrict(param) {
	var i = 0;
	var params = new Hash();
	
	Loader.GetInstance().ShowLoader();

	for (i = 0; i < document.CalculationOptions.elements.length; i++) {
		var groups = document.CalculationOptions.elements[i].name.match(/(param_)([0-9]{1,})/);
		if (groups != null && groups.length == 3)
		{
			params.set("param_" + groups[2], document.CalculationOptions.elements[i].value);
			if (document.CalculationOptions.elements[i].name == "param_" + param)
			{
				break;
			}
		}
	}
	params.set('article', document.CalculationOptions.article.value);
	params.set('action', 'restrict_ex');

	var ajax = new Ajax.Request("../../ajax/customize.php", {
		method : 'post',
		'evalJSON' : 'force',
		parameters : params.toQueryString(),
		onFailure : function(originalRequest) {
			Loader.GetInstance().HideLoader();
		},
		onComplete : function(originalRequest) {
			var data;

			data = originalRequest.responseJSON;
			
			if (Object.isArray(data.result) && data.result.size() == 0) {
				Loader.GetInstance().HideLoader();				
			}
			else {
				for (key in data.result) {
					var elem = data.result[key];
					var combo = "param_" + key;
					var comboBox = document.CalculationOptions.elements[combo];
					var selectedValue = comboBox.value;
					ClearCombo(comboBox);
					for (idx = 0; idx < elem.length; idx++) {
						node = document.createElement("option");
						node.value = elem[idx].values.value_id;
						node.text = elem[idx].values.value;
						comboBox[idx] = node;
					}
					comboBox.value = selectedValue;
					if (comboBox.selectedIndex == -1)
						comboBox.selectedIndex = 0;
					
					Restrict(key);
					break;
				}
			}
	}
	});
}


