var xmlHttp;
var stateChangeMethod;

var verwendungszweck;
var spezial1box;
var spezial1;
var spezial1Titel
var spezial2Box;
var spezial2;
var spezial2Titel
var spezial3Box;
var spezial3;
var preis;

// Create xmlHttp for both browsers
function createXMLHttpRequest(){

	var page_request = false

	if (window.XMLHttpRequest){ // if Mozilla, Safari etc

		page_request = new XMLHttpRequest()

	} else if (window.ActiveXObject){ // if IE
		try {
			page_request = new ActiveXObject("Msxml2.XMLHTTP")
		} catch (e){
			try{
				page_request = new ActiveXObject("Microsoft.XMLHTTP")
			} catch (e){}
		}
	} else {
		return false
	}

	return page_request;
}

// Helper to get the selected value of a dropdown box
function getSelectedValue( listbox ) {

	for (var i=0; i < listbox.options.length; i++) {

		if (listbox.options[i].selected) {

			return listbox.options[i].value;
		}
	}
	return -1;
};

// Browser dependent Event listeners
function addChangeEventListener( obj, listener ){

	if( obj.addEventListener ){

		obj.addEventListener( "change", listener, false );
		
		if( obj.type && obj.type == "checkbox" ){

			//try for safari
			obj.addEventListener( "click", listener, false );
		}
		//changelistener on text

		if( obj.type && obj.type == "text" ){

			obj.addEventListener( "keyup", listener, false );
		}

	} else if( obj.attachEvent ){

		obj.attachEvent( "onchange", listener );

		if( obj.type && obj.type == "checkbox" ){
			//for ie
			obj.attachEvent( "onclick", listener );
		}

		if( obj.type && obj.type == "text" ){

			obj.attachEvent( "onkeyup", listener );
		}

	} else {
		obj.onChange = listener;
	}
}

// Call by "onLoad"
function initcalc(){

	debug( "initCalc" );

	// Get references for the most important objects
	verwendungszweck = document.getElementById( "verwendungszweck" );
	spezial1 = document.getElementById( "spezial1" );
	spezial1Box = document.getElementById( "spezial1box" );
	spezial1Titel = document.getElementById( "spezial1titel" );
	spezial2 = document.getElementById( "spezial2" );
	spezial2Box = document.getElementById( "spezial2box" );
	spezial2Titel = document.getElementById( "spezial2titel" );
	spezial3 = document.getElementById( "spezial3" );
	spezial3Box = document.getElementById( "spezial3box" );
	preis = document.getElementById( "preis" );
	infoBox = document.getElementById( "info" );

	// Get EUR Sign from previous content.
	preis.firstChild.data = "";

	// Add event listener
	addChangeEventListener( verwendungszweck, onVerwendungszweckChange );
	addChangeEventListener( spezial1, calculate );
	addChangeEventListener( spezial2, calculate );

	// Create xmlHttp helper object
	xmlHttp = createXMLHttpRequest();

	// Init Verwendungszweck field
	xmlHttp.onreadystatechange = refreshVerwendungszwecke;
	xmlHttp.open( "GET", "/calculator.php?select=verwendungszweck", true );
	xmlHttp.send( null );
}

function refreshVerwendungszwecke(){

	if( xmlHttp.readyState != 4 || xmlHttp.status != 200 ){

		return;
	}

	debug( "refreshVerwendungszwecke" );

	// List of all items
	var verwendungszwecke = xmlHttp.responseXML.getElementsByTagName( "verwendungszweck" );

	for( var i = 0; i < verwendungszwecke.length; i++ ){

		// Name
		var names = verwendungszwecke[ i ].getElementsByTagName( "name" );
		var name = names[ 0 ].firstChild.nodeValue;

		// Id
		var ids = verwendungszwecke[ i ].getElementsByTagName( "id" );
		var id = ids[ 0 ].firstChild.nodeValue;

		// Create new Option
		var option = document.createElement( "option" );
		option.text = name;
		option.value = id;
		
		// Add option
		verwendungszweck.options[ verwendungszweck.options.length ] = option;
	}

	//onVerwendungszweckChange();
}

var firstDeleted = false;
var oldVZId = -1;
function onVerwendungszweckChange(){

	var currentId = getSelectedValue( verwendungszweck );

	// Delete Select message
	if( ! firstDeleted ){
		verwendungszweck.options[ 0 ] = null;
		firstDeleted = true;
	}

	if( currentId != oldVZId ){

		debug( "onVerwendungszweckChange" );

		oldVZId = currentId;

		// Create xmlHttp helper object
		xmlHttp = createXMLHttpRequest();

		xmlHttp.onreadystatechange = handleVerwendungszweckChange;
		var query = "/calculator.php?select=spezial&verwendungszweck_id=" + currentId;
		xmlHttp.open( "GET", query, true );
		xmlHttp.send( null );
	}
}

var isVZChanging = false;
function handleVerwendungszweckChange(){

	if( xmlHttp.readyState != 4 || xmlHttp.status != 200 ){
		return;
	}

	debug( "handleVerwendungszweckChange" );

	isVZChanging = true;

	// Spezial 1 ----

	// Titel
	try { // Try to catch 0-pointer errors
		var spezial1TitelText = xmlHttp.responseXML.getElementsByTagName( "spezial1_titel" )[ 0 ].firstChild.nodeValue;
		spezial1Titel.firstChild.nodeValue = spezial1TitelText;

		// Info
		var info = xmlHttp.responseXML.getElementsByTagName( "info" )[0].firstChild.nodeValue;

	} catch(e){}

	if( !info ){ info = ""; }
	infoBox.firstChild.data = info;

	// Clear
	while( spezial1.length > 0 ){
		spezial1.removeChild( spezial1.childNodes[ 0 ] );
	}

	var spezial1s = xmlHttp.responseXML.getElementsByTagName( "spezial1" );

	if( spezial1s.length > 0 ){

		// Insert
		for( var i = 0; i< spezial1s.length; i++ ){

			var name = spezial1s[ i ].getElementsByTagName( "name" )[ 0 ].firstChild.nodeValue;
			var id   = spezial1s[ i ].getElementsByTagName( "id" )[ 0 ].firstChild.nodeValue;

			var option = document.createElement( "option" );
			option.text = name;
			option.value = id;

			// Add option the DOM0-Way
			spezial1.options[ spezial1.options.length ] = option;
		}
		spezial1Box.style.display="block";
	} else {
		spezial1Box.style.display="none";
	}

	// Spezial 2 ----

	try { // Try to catch 0-pointer errors
	var spezial2TitelText = xmlHttp.responseXML.getElementsByTagName( "spezial2_titel" )[ 0 ].firstChild.nodeValue;
	spezial2Titel.firstChild.nodeValue = spezial2TitelText;
	} catch(e){}

	// Clear
	while( spezial2.length > 0 ){
		spezial2.removeChild( spezial2.childNodes[ 0 ] );
	}

	var spezial2s = xmlHttp.responseXML.getElementsByTagName( "spezial2" );

	if( spezial2s.length > 0 ){

		for( var i = 0; i< spezial2s.length; i++ ){

			var name = spezial2s[ i ].getElementsByTagName( "name" )[ 0 ].firstChild.nodeValue;
			var id   = spezial2s[ i ].getElementsByTagName( "id" )[ 0 ].firstChild.nodeValue;

			var option = document.createElement( "option" );
			option.text = name;
			option.value = id;

			//spezial2.appendChild( option );
			//spezial2.options.add( option );
			spezial2.options[ spezial2.options.length ] = option;
		}
		spezial2Box.style.display="block";
	} else {
		spezial2Box.style.display="none";
	}

	// Spezial 3 ----

	// Clear
	var content = spezial3.firstChild;
	if( content != null ) spezial3.removeChild( content );

	content = document.createElement( "div" );
	content.id="spezial3content";

	spezial3.appendChild( content );

	var spezial3s = xmlHttp.responseXML.getElementsByTagName( "spezial3" );
	if( spezial3s.length > 0 ){

		for( var i = 0; i< spezial3s.length; i++ ){

			var name = spezial3s[ i ].getElementsByTagName( "name" )[ 0 ].firstChild.nodeValue;
			var id   = spezial3s[ i ].getElementsByTagName( "id" )[ 0 ].firstChild.nodeValue;
			var typ  = spezial3s[ i ].getElementsByTagName( "typ" )[ 0 ].firstChild.nodeValue;

			var div = document.createElement( "div" );

			// Checkbox

			// hidden false value to be overridden by checkbox
			var input;
			input = document.createElement( "input" );
			input.type="hidden";
			input.name="spezial3_0_id_"+id+"_bool";
			input.value="false";
			div.appendChild( input );

			// the checkbox
			var cb;
			db = document.createElement( "input" );
			db.type="checkbox";
			db.name="spezial3_0_id_"+id+"_bool";
			db.value="true";
			db.className="boolean";

			addChangeEventListener( db, calculate );

			div.appendChild( db );

			// Text
			if( typ == "INT" ){

				name += ": ";
			}
			var text = document.createTextNode( name );
			div.className="spezial3element";
			div.appendChild( text );

			// Int
			if( typ == "INT" ){
			
				var it;
				it = document.createElement( "input" );
				it.type="text";
				it.name="spezial3_0_id_"+id+"_int";
				it.value="1";
				it.className="int";

				addChangeEventListener( it, calculate );

				div.appendChild( it );
			}

			content.appendChild( div );
		}
		spezial3Box.style.display="block";
	} else {
		spezial3Box.style.display="none";
	}

	isVZChanging = false;

	calculate();
}

function calculate(){

	if( isVZChanging ) return;

	debug( "calculate" );

	var verwendungszweckId = getSelectedValue( verwendungszweck );
	var spezial1Id = getSelectedValue( spezial1 );
	var spezial2Id = getSelectedValue( spezial2 );

	var spezial3Settings = "";

	var query = "/calculator.php?select=calculate" + 
			"&verwendungszweck_id=" + verwendungszweckId +
			"&spezial1_id=" + spezial1Id +
			"&spezial2_id=" + spezial2Id

	inputs = spezial3.getElementsByTagName( "input" );
	for( var i = 0; i < inputs.length; i++ ){

		var input = inputs[ i ];

		if( input.type == "hidden" ) continue;

		//query += "&" + input.getAttribute( "name" );
		query += "&" + input.name;

		if( input.type == "checkbox" ){

			if( input.checked ){

				query += "=true";
			} else {
				query += "=false";
			}
		} else {
			query += "=" + input.value;
		}
	}

	debug( query );
	
	// Create xmlHttp helper object
	xmlHttp = createXMLHttpRequest();

	xmlHttp.onreadystatechange = handleCalculate;

	xmlHttp.open( "GET", query, true );
	xmlHttp.send( null );
}

function handleCalculate(){

	// Only valid results
	if( xmlHttp.readyState != 4 || xmlHttp.status != 200 ){
		return;
	}

	debug( "handleCalculate" );

	var preisValue = xmlHttp.responseXML.getElementsByTagName( "preis" )[ 0 ].firstChild.nodeValue;
	try{
	var messageText = xmlHttp.responseXML.getElementsByTagName( "message" )[ 0 ].firstChild.nodeValue;
	}catch(e){}

	//debug( preisValue );

	var content = preis.firstChild;

	document.getElementById( "outer_preis" ).style.display = "block";

	if( preisValue > 0 ){

		content.data = ""+preisValue+String.fromCharCode( 0x2009 )+String.fromCharCode( 0x20AC );
	} else {
		content.data = preisValue;
	}

	//preis.appendChild( content );

	if( messageText ){
		debug( messageText );
	} else {
		//hideDebug();
	}
}

function debug( text ){

	if( document.getElementById( "debug" ) != null ){
		var debug = document.getElementById( "debug" );
		debug.value += "\n" + text;
		//debug.value = text;
		//debug.style.display="block";
	} else {
		alert( text );
	}
}
function hideDebug(){

	if( document.getElementById( "debug" ) != null ){
		var debug = document.getElementById( "debug" );
		debug.style.display="none";
	}
}
