// (c) EIKONA AG, it.x informationssysteme gmbh, Alle Rechte vorbehalten.

// in diesem Hash werden die belegten Modul-Positionen markiert
var aktuelleModulKonfiguration = $H();
	
// in diesem Hash werden die belegten Farb-Positionen markiert
var aktuelleFarbKonfiguration = $H();

// dieser Hash wird letztendlich befüllt und an den Server geschickt
var konfiguration = $H();


// Hash mit den erlaubten Konfigurationen,
// wobei der Schlüssel die Anzahl der Module darstellt
var regelnErlaubterKonfigurationen = $H({
	'0': [
		$H({ 'EF12': 'basis', 'CD12': 'hc' }),
		$H({ 'EF12': 'basis', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'EF34': 'hc' })
		],
	'1': [
		$H({ 'EF12': 'basis', 'G1': 'modul' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'H1': 'modul' }), $H({ 'EF12': 'basis', 'H1': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'H1': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'G2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'D2': 'modul' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'H2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C2': 'modul' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'E3': 'modul' }), $H({ 'EF12': 'basis', 'E3': 'modul', 'EF45': 'hc' }),
		$H({ 'EF12': 'basis', 'F3': 'modul' }), $H({ 'EF12': 'basis', 'F3': 'modul', 'EF45': 'hc' }),
		$H({ 'EF12': 'basis', 'E4': 'modul' }), $H({ 'EF12': 'basis', 'E4': 'modul', 'EF56': 'hc' }),
		$H({ 'EF12': 'basis', 'F4': 'modul' }), $H({ 'EF12': 'basis', 'F4': 'modul', 'EF56': 'hc' })
		],
	'2': [
		$H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'H1': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'H1': 'modul', 'H2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'H1': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'E3': 'modul', 'F3': 'modul' }), $H({ 'EF12': 'basis', 'E3': 'modul', 'F3': 'modul', 'EF45': 'hc' }),
		$H({ 'EF12': 'basis', 'D2': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'G2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'G1': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'G1': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'G1': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'H1': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'H1': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'H1': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C2': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'H2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'D1': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'D1': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'D1': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'C2': 'modul', 'D2': 'modul' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'D2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'D2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'G1': 'modul', 'H1': 'modul' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'H1': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'H1': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'G2': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'G2': 'modul', 'H2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G2': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'D2': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'D2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'D2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'C2': 'modul', 'D1': 'modul' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'D1': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'D1': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'G2': 'modul', 'H1': 'modul' }), $H({ 'EF12': 'basis', 'G2': 'modul', 'H1': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G2': 'modul', 'H1': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'G1': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'H2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'H2': 'modul', 'IJ12': 'hc' })
		],
	'3': [
		$H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H1': 'modul' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H1': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H1': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'G2': 'modul', 'H1': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'G2': 'modul', 'H1': 'modul', 'H2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G2': 'modul', 'H1': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'C2': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'C2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'C2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'C1': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'C1': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'C1': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'D2': 'modul', 'C1': 'modul', 'C2': 'modul' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'C1': 'modul', 'C2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'C1': 'modul', 'C2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'D2': 'modul', 'G1': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'G1': 'modul', 'G2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'G1': 'modul', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G1': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G1': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G1': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'G1': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'G1': 'modul', 'G2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'G1': 'modul', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'C2': 'modul', 'G1': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'G1': 'modul', 'G2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'G1': 'modul', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'C2': 'modul', 'H1': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'H1': 'modul', 'H2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C2': 'modul', 'H1': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'D2': 'modul', 'H1': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'H1': 'modul', 'H2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D2': 'modul', 'H1': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'H2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'H2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'G2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'G1': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'G1': 'modul', 'G2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'G1': 'modul', 'G2': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'H1': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'H1': 'modul', 'H2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'H1': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'H1': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'H1': 'modul', 'H2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'H1': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'H1': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'H1': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'H1': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'H1': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'H1': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'H1': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'G1': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'G1': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'G1': 'modul', 'HI12': 'hc' }),
		$H({ 'EF12': 'basis', 'E3': 'modul', 'F3': 'modul', 'F4': 'modul' }), $H({ 'EF12': 'basis', 'E3': 'modul', 'F3': 'modul', 'F4': 'modul', 'EF56': 'hc' }),
		$H({ 'EF12': 'basis', 'E3': 'modul', 'F3': 'modul', 'E4': 'modul' }), $H({ 'EF12': 'basis', 'E3': 'modul', 'F3': 'modul', 'E4': 'modul', 'EF56': 'hc' })
		],
	'4': [
		$H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H1': 'modul', 'H2': 'modul' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H1': 'modul', 'H2': 'modul', 'CD12': 'hc' }), $H({ 'EF12': 'basis', 'G1': 'modul', 'G2': 'modul', 'H1': 'modul', 'H2': 'modul', 'IJ12': 'hc' }),
		$H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'D1': 'modul', 'D2': 'modul' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'D1': 'modul', 'D2': 'modul', 'AB12': 'hc' }), $H({ 'EF12': 'basis', 'C1': 'modul', 'C2': 'modul', 'D1': 'modul', 'D2': 'modul', 'GH12': 'hc' }),
		$H({ 'EF12': 'basis', 'E3': 'modul', 'E4': 'modul', 'F3': 'modul', 'F4': 'modul' }), $H({ 'EF12': 'basis', 'E3': 'modul', 'E4': 'modul', 'F3': 'modul', 'F4': 'modul', 'EF56': 'hc' }),
		$H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G1': 'modul', 'G2': 'modul' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G1': 'modul', 'G2': 'modul', 'BC12': 'hc' }), $H({ 'EF12': 'basis', 'D1': 'modul', 'D2': 'modul', 'G1': 'modul', 'G2': 'modul', 'HI12': 'hc' })
		]
});

var positionsCache = $H();

// für MouseOver
var vorschauBilder = $H();
var bilderNamen = $w('AB12 BC12 CD12 C1 D1 C2 D2 G1 H1 G2 H2 GH12 HI12 IJ12 E3 F3 E4 F4 EF34 EF45 EF56');


/************************************************************
 * erwartet Array mit gewünschter/en Position/en
 * und prüft ob dort auch Platz ist
 * ist der Platz in Ordnung liefert diese Funktion
 * den Positions-Schlüssel zurück, andernfalls NULL
 * bei HC werden zusätzlich die einzel-modul-plätze zurückgeliefert
 *
 * return	array mit Positionen
 *
 ************************************************************/
function pruefeModulPosition(position){
	
	var retValue = null;
	
	if (position) {
		position.each(function(item){
			
			// 2-stelliger Schlüssel
			if (item.length == 2) {
				if (parseInt(aktuelleModulKonfiguration.get(item)) == 0)
					retValue = $w(item);
				
			// 4-stelliger Schlüssel	
			}else if (item.length == 4){
				
				// 4-stelligen Schlüssel in 4 2-stellige Schlüssel umbauen und in ein Array stopfen
				var strKeys = ''.concat(item.charAt(0), item.charAt(2), ' ', item.charAt(0), item.charAt(3), ' ', item.charAt(1), item.charAt(2), ' ', item.charAt(1), item.charAt(3));
				var posKeys = $w(strKeys);
				var bitOK = true;
				
				// das Array mit den erstellten Schlüsseln abarbeiten
				posKeys.each(function(key){
					if (parseInt(aktuelleModulKonfiguration.get(key)) == 1)
						bitOK = bitOK && false;
				});
				
				if (bitOK) {
					retValue = $w(item.concat(' ', strKeys));
					throw $break;
				}
			}
		});
//log('pruefeModulPosition('.concat(Object.toJSON(position), ') retVal: ', Object.toJSON(retValue)));
	}
	
	return retValue;
}



/************************************************************
 * funktioniert wie pruefeModulPosition() allerdings intern andere prüfung
 *
 * return	array mit Positionen
 *
 ************************************************************/
function pruefeFarbPosition(position){
	
	var retValue = null;
	
	position.each(function(item){
		
		// 2-stelliger Schlüssel
		if (item.length == 2) {
			if (parseInt(aktuelleModulKonfiguration.get(item)) == 1)
				retValue = $w(item);
			
		// 4-stelliger Schlüssel
		}else if (item.length == 4){
			retValue = $w(item);
		}
	});
//log('pruefeFarbPosition('.concat(Object.toJSON(position), ') retVal: ', Object.toJSON(retValue)));	
	return retValue;
}


function sendeKonfiguration(restart){
	
//log('aktuelle MatrixKonfiguration: '.concat(aktuelleModulKonfiguration.toJSON()));
//log('Sende folgende Konfiguration: '.concat(konfiguration.toJSON()));
	
	// Ladeanimation starten
	startLadeAnimation();
	
	// AJAX Aufruf absetzen
	Cycon.Konfigurator.Konfigurator.rendernKonfiguration({
		parameters: { konfig: konfiguration.toJSON(), restart: restart },
		onSuccess: function (objResponse){
			
			stopLadeAnimation();
			
			var bild = objResponse.responseJSON;
			
			$('renderbild').src = bild['bild_src'];
			$('renderbild').width = bild['bild_breite'];
			$('renderbild').height = bild['bild_hoehe'];
			
		}
	});
	
	setzeBildausschnitt();
	
	erneuernModulBeschreibung();
}


function entferneModulPosition(dragged, konfiguration, test){
	var entfernPosition = dragged.positions.get('this');
	var retVal = false;
	
	// dann war es ein normales Modul
	if (konfiguration.get(entfernPosition) != undefined) {
		
		// ist überhaupt ein Modul an der Stelle vorhanden?
		if (!test) {
			aktuelleModulKonfiguration.set(entfernPosition, 0);
			aktuelleFarbKonfiguration.set(entfernPosition, new Array(null, null));
		}
		
		konfiguration.unset(entfernPosition);
		retVal = true;
	
	// oder handelt es sich um ein HC
	}else{
		var entfernPositionen = dragged.positions.get('hc');
		
		entfernPositionen.each(function(entfernPosition){
			if(konfiguration.get(entfernPosition) != undefined){
				
				if (!test) {
					// den 4-stelligen Key korrigieren
					aktuelleModulKonfiguration.set(entfernPosition, 0);
					aktuelleFarbKonfiguration.set(entfernPosition, new Array(null, null));
					
					// 4-stelligen Schlüssel in 4 2-stellige Schlüssel umbauen und in ein Array stopfen
					var strKeys = ''.concat(entfernPosition.charAt(0), entfernPosition.charAt(2), ' ', entfernPosition.charAt(0), entfernPosition.charAt(3), ' ', entfernPosition.charAt(1), entfernPosition.charAt(2), ' ', entfernPosition.charAt(1), entfernPosition.charAt(3));
					var posKeys = $w(strKeys);
					
					posKeys.each(function(posKey){
						aktuelleModulKonfiguration.set(posKey, 0);
					});
				}
				
				konfiguration.unset(entfernPosition);
				retVal = true;
				
				throw $break;
			}
			
		});
	}
	//log(konfiguration.toJSON());
	return retVal;
}


/*
 * diese Funktion initialisiert die Modul- bzw. Farb-Besetzungsarrays,
 * sowie das Hash mit der aktuellen Konfiguration (muss noch in $H()
 * umgewandelt werden)
 *
 * return $H(), die Konfiguration, wie sie der Server versteht
 */
function initKonfiguration(konfigurationJSON){
	
	var konfiguration = $H();
	
	// Prototype-Hashes initialisieren
	konfigurationJSON.each(function(item){
		konfiguration.set(item.key, $H(item.value));
	});
	
	aktuelleModulKonfiguration = $H({
		'A1': 0, 'A2': 0, 'B1': 0, 'B2': 0, 'C1': 0, 'C2': 0, 'D1': 0, 'D2': 0,
		'G1': 0, 'G2': 0, 'H1': 0, 'H2': 0, 'I1': 0, 'I2': 0, 'J1': 0, 'J2': 0,
		'E1': 0, 'E2': 0, 'E3': 0, 'E4': 0, 'E5': 0, 'E6': 0,
		'F1': 0, 'F2': 0, 'F3': 0, 'F4': 0, 'F5': 0, 'F6': 0,
		'AB12': 0, 'BC12': 0, 'CD12': 0,
		'EF12': 0,
		'GH12': 0, 'HI12': 0, 'IJ12': 0,
		'EF34': 0, 'EF45': 0, 'EF56': 0
		});
		
	// in diesem Hash werden die belegten Farb-Positionen markiert
	aktuelleFarbKonfiguration = $H({
		'A1': new Array(null, null), 'A2': new Array(null, null), 'B1': new Array(null, null), 'B2': new Array(null, null), 'C1': new Array(null, null), 'C2': new Array(null, null), 'D1': new Array(null, null), 'D2': new Array(null, null),
		'G1': new Array(null, null), 'G2': new Array(null, null), 'H1': new Array(null, null), 'H2': new Array(null, null), 'I1': new Array(null, null), 'I2': new Array(null, null), 'J1': new Array(null, null), 'J2': new Array(null, null),
		'E1': new Array(null, null), 'E2': new Array(null, null), 'E3': new Array(null, null), 'E4': new Array(null, null), 'E5': new Array(null, null), 'E6': new Array(null, null),
		'F1': new Array(null, null), 'F2': new Array(null, null), 'F3': new Array(null, null), 'F4': new Array(null, null), 'F5': new Array(null, null), 'F6': new Array(null, null),
		'AB12': new Array(null, null), 'BC12': new Array(null, null), 'CD12': new Array(null, null),
		'EF12': new Array(null, null),
		'GH12': new Array(null, null), 'HI12': new Array(null, null), 'IJ12': new Array(null, null),
		'EF34': new Array(null, null), 'EF45': new Array(null, null), 'EF56': new Array(null, null)
		});
	
	// nun Modul/Farbmarker setzen
	konfiguration.each(function(position){
		if (position.key != "BUS") {
			//var objektdaten = ;
			var farbCodes = $H(position.value).get('farbe_code');
			var farben = new Array(null, null);
			
			farben[0] = farbCodes[0];
			farben[1] = farbCodes[1];
			
			aktuelleModulKonfiguration.set(position.key, 1);
			aktuelleFarbKonfiguration.set(position.key, farben);
			//log('position: '.concat(position.key, ' => ', farben));
		}
	});
	
	return konfiguration;
}

function resetKonfiguration() {
	konfiguration = initKonfiguration(leereKonfiguration);
	sendeKonfiguration(true);
}

function setzeBildausschnitt(){
	
	var offsets = $H({
		'A': 0, 'B': 50, 'C': 0, 'D': 0, 'E': 0, 'F': 0, 'G': 0, 'H': 0, 'I': -50, 'J': -50,
		'1': 0, '2': 0, '3': 0, '4': 0, '5': -60, '6': 0
		});
	var x = -50;
	var y = 0;
	
	konfiguration.each(function(position){
		if (position.key.length == 2){
			if (offsets.get(position.key.charAt(0)))
				x = x + offsets.get(position.key.charAt(0));
			if (offsets.get(position.key.charAt(1)))
				y = y + offsets.get(position.key.charAt(1));
			
			offsets.unset(position.key.charAt(0));
			offsets.unset(position.key.charAt(1));
		
		}else{
			if (position.key != 'BUS') {
				//log(''.concat(position.key, ', ', position.key.charAt(0)));
				if (offsets.get(position.key.charAt(0)))
					x = x + offsets.get(position.key.charAt(0));
				if (offsets.get(position.key.charAt(1)))
					x = x + offsets.get(position.key.charAt(1));
				
				if (offsets.get(position.key.charAt(2)))
					y = y + offsets.get(position.key.charAt(2));
				if (offsets.get(position.key.charAt(3)))
					y = y + offsets.get(position.key.charAt(3));
				
				offsets.unset(position.key.charAt(0));
				offsets.unset(position.key.charAt(1));
				offsets.unset(position.key.charAt(2));
				offsets.unset(position.key.charAt(3));
			}
		}
	});
	
	// an Position verschieben
	new Effect.Move('viewport', { 'x': x, 'y': y, 'mode': 'absolute' });
}


function pruefeRegeln(position, modul, modus, konfiguration){
	
	var retValue = false;
	
	if (positionsCache.get(position) == undefined) {
		
		// das neue und das bestehende verbinden
		var neueKonfig = konfiguration.clone();
		
		// fügen wir ein oder nehmen wir weg?
		switch (modus) {
			
			case 'insert':
				if (neueKonfig.get(position)) {
					positionsCache.set(position, false);
					return false;
				}
				neueKonfig.set(position, $H(modul));
				break;
				
			case 'remove':
				if (getAnzahlModule(neueKonfig) > 0) {
					neueKonfig.unset(position);
					positionsCache.unset(position);
				}
				break;
			
			default:
		}

		// Module prüfen, die nur einfach platziert werden dürfen.
		if (modul.modul_mehrfachnutzung == 0) {
			anzahl = 0;
			neueKonfig.each(function(position) {
				if (position.value.get('modul_id') == modul.modul_id)
					anzahl++;
			});
			if (anzahl > 1) {
				if (modus == 'insert')
					positionsCache.set(position, false);
				return false;
			}
		}
		
		// die nun gültigen Regeln ermitteln
		var aktuelleRegeln = regelnErlaubterKonfigurationen.get(getAnzahlModule(neueKonfig));
		
		if (aktuelleRegeln){
			
			aktuelleRegeln.each(function(variante){
				if(varianteOK(neueKonfig, variante)) {
					retValue = true;
					throw $break;
				}
			});
		}
		
		if (modus == 'insert')
			positionsCache.set(position, retValue);
		
	}else
		retValue = positionsCache.get(position);
	
	return retValue;
}



function varianteOK(konfiguration, variante){
	var retValue = true;
	
	konfiguration.each(function(item){
//log(item.value.toJSON());
		if (item.key != 'BUS' && variante.get(item.key) != item.value.get('modul_typ')) {
//log('Position: '.concat(item.key, ', erwartet: ', variante.get(item.key), ', gefunden: ', item.value.get('modul_typ')));
			retValue = false;
			throw $break;
		}
	});
	
	return retValue;
}


function getAnzahlModule(konfiguration){
	var i = 0;
	konfiguration.each(function(item){
		if (item.value.get('modul_typ') == 'modul')
			i++;
	});
	
	return i;
}


function erneuernModulBeschreibung(){
	var html = '';
	
	konfiguration.each(function(item){
		if (item.key != 'BUS' && item.key != 'EF12'){
			var modulId = item.value.get('modul_id');
			var modulName = $('modul'.concat(modulId)).modul_beschreibung;
			html = html.concat(', ', modulName);
		}
	});
	
	$('modulBeschrieb').innerHTML = html.substr(2);
}


function dropItem(dragged, dropped, event){
	
	// Position in der Matrix anhand des Types ermitteln
	var positionen = dragged.modul_typ != null ? pruefeModulPosition(dropped.positions.get(dragged.modul_typ)) : null;
	var konfigGespeichert = false;
	
	// Position OK? Oder handelt es sich um eine Farbzuweisung
	if (positionen) {
		
		// Beim verschieben das Modul temporär von alter Position entfernen
		var konf = konfiguration.clone();
		if (dragged.hasClassName('droppable'))
			entferneModulPosition(dragged, konf, true);
		
		// das Positionsarray abarbeiten
		positionen.each(function(position, index){
			
			// Konfiguration aktualisieren
			aktuelleModulKonfiguration.set(position, 1);

			if (index == 0) {
				var konfigDaten = {
					'modul_id': dragged.modul_id,
					'modul_typ': dragged.modul_typ,
					'farbe_code': dragged.farbe_code || $w('')
				};
				
				// Konfiguration erneuern
				konfigGespeichert = true;
				konfiguration.set(position, $H(konfigDaten));
			}
				
			
		});
		
		if (konfigGespeichert) {
			// Modul wurde erfolgreich platziert, beim verschieben von alter Position löschen
			if (dragged.hasClassName('droppable'))
				entferneModulPosition(dragged, konfiguration);
			
			// an den Server versenden
			sendeKonfiguration();
		}
		else
			log('Durch Regel verboten!');
		
	}
	// es wurde ein Farbwert auf einen Modulplatzhalter gezogen:
	else if(dragged.hasClassName('farbe')){
		
		// Farb-Position in der Matrix anhand des Types ermitteln
		var positionen = $A();
		var positionenHC = dropped.positions.get('hc');
		var positionenM = dropped.positions.get('modul');
		var positionenB = dropped.positions.get('basis');
		
		if (positionenHC != null)
			positionen = positionen.concat(positionenHC);
		
		if (positionenM != null)
			positionen = positionen.concat(positionenM);
		
		if (positionenB != null)
			positionen = positionen.concat(positionenB);
		
		// prüfen ob an der Position ein Modul hinterlegt ist
		if (positionen.length > 0){
			
			// das Positionsarray abarbeiten
			positionen.each(function(position){
			
				if (aktuelleModulKonfiguration.get(position) == 1) {
					
					var farben = aktuelleFarbKonfiguration.get(position);
					if (position.length == 2)
						farben[0] = dragged.farbe_code[0].toLowerCase();
					else {
						var _this = dropped.positions.get('this');
						if (_this.charAt(1) == position.charAt(2))
							farben[0] = dragged.farbe_code[0].toLowerCase();
						else
							farben[1] = dragged.farbe_code[0].toLowerCase();
					}
					aktuelleFarbKonfiguration.set(position, farben);
					
					// nur den Farbwert überschreiben
					var alteKonfiguration = konfiguration.get(position);
					if (alteKonfiguration) {
						
						var konfigDaten = {
							'modul_id': alteKonfiguration.get('modul_id'),
							'modul_typ': alteKonfiguration.get('modul_typ'),
							'farbe_code': farben
							};
							
						// Konfiguration erneuern
						konfiguration.set(position, $H(konfigDaten));
					}
					
					// an den Server versenden
					sendeKonfiguration();
					
					throw $break;
				}
				
			});
			
		}else
			log('An dieser Position ist kein Modul hinterlegt.');
		
	}
	else
		log('Modul passt hier nicht hin.');
}





/*
 * ermittelt die Überlappung 2er HTMLElemente
 *
 * return boolean
 */
function detectCollision(el1, el2){
	
	var retVal = true;
	var obj1 = Object.extend(el1.getDimensions(), el1.cumulativeOffset());
	var obj2 = Object.extend(el2.getDimensions(), el2.cumulativeOffset());
	
	if ((obj1.top + obj1.height < obj2.top) ||
		(obj1.top > obj2.top + obj2.height) ||
		(obj1.left > obj2.left + obj2.width) ||
		(obj1.left + obj1.width < obj2.left))
			retVal = false;
	
	return retVal;
}


function startLadeAnimation(){
	$('loadingAnimation').show();
}


function stopLadeAnimation(){
	$('loadingAnimation').hide();
}

function log(text){
	$('debugLog').innerHTML = $('debugLog').innerHTML.concat('&nbsp;>&nbsp;', text, '<br/>');
}

function hideHoverBilder() {
	$$('#renderhover .hoverbild').each(function(item){ item.hide(); });
}
