// We create a function which is called immediately,
// returning the actual function object.  This allows us to
// work in a separate scope and only return the functions
// we require.
var pricecalculator_events = (function() {

  // For DOM2-compliant browsers.
  function addEventW3C(el, ev, f) {
    // Since IE only supports bubbling, for
    // compatibility we can't use capturing here.
    return el.addEventListener(ev, f, false);
  }

  function removeEventW3C(el, ev, f) {
    el.removeEventListener(ev, f, false);
  }

  // The function as required by IE.
  function addEventIE(el, ev, f) {
    // This is to work around a bug in IE whereby the
    // current element doesn't get passed as context.
    // We pass it via closure instead and set it as the
    // context using call().
    // This needs to be stored for removeEvent().
    // We also store the original wrapped function as a
    // property, _w.
    ((el._evts = el._evts || [])[el._evts.length]
        = function(e) { return f.call(el, e); })._w = f;

    // We prepend "on" to the event name.
    return el.attachEvent("on" + ev,
        el._evts[el._evts.length - 1]);
  }

  function removeEventIE(el, ev, f) {
    for (var evts = el._evts || [], i = evts.length; i--; )
      if (evts[i]._w === f)
        el.detachEvent("on" + ev, evts.splice(i, 1)[0]);
  }

  // A handler to call all events we've registered
  // on an element for legacy browsers.
  function addEventLegacyHandler(e) {
    var evts = this._evts[e.type];
    for (var i = 0; i < evts.length; ++i)
      if (!evts[i].call(this, e || event))
        return false;
  }

  // For older browsers.  We basically reimplement
  // attachEvent().
  function addEventLegacy(el, ev, f) {
    if (!el._evts)
      el._evts = {};

    if (!el._evts[ev])
      el._evts[ev] = [];

    el._evts[ev].push(f);

    return true;
  }

  function removeEventLegacy(el, ev, f) {
    // Loop through the handlers for this event type
    // and remove them if they match f.
    for (var evts = el._evts[ev] || [], i = evts.length; i--; )
      if (evts[i] === f)
        evts.splice(i, 1);
  }

  // Select the appropriate functions based on what's
  // available on the window object and return them.
  return window.addEventListener
      ? {addEvent: addEventW3C, removeEvent: removeEventW3C}
      : window.attachEvent
          ? {addEvent: addEventIE, removeEvent: removeEventIE}
          : {addEvent: addEventLegacy, removeEvent: removeEventLegacy};
})();

// Der Kalkulator soll sowohl mit numerischen ids als auch mit Strings funktionieren,
// Wenn Die Eingabe ein String ist => auf id mappen
function lang2Id(str){
	var ret = str;
	switch (str) {
		case '-- Bitte wählen --' 	: ret='0';	break;
		case 'Deutsch'			: ret='99';	break;
		case 'Arabisch'			: ret='1';	break;
		case 'Chinesisch (simplified)'	: ret='23';	break;
		case 'Dänisch'			: ret='3';	break;
		case 'Englisch'			: ret='4';	break;
		case 'Finnisch'			: ret='5';	break;
		case 'Französisch'		: ret='6';	break;
		case 'Griechisch'		: ret='24';	break;
		case 'Italienisch'		: ret='7';	break;
		case 'Japanisch'		: ret='20';	break;
		case 'Chinesisch (traditional)'	: ret='22';	break;
		case 'Koreanisch'		: ret='21';	break;
		case 'Niederländisch'		: ret='8';	break;
		case 'Norwegisch'		: ret='9';	break;
		case 'Polnisch'			: ret='10';	break;
		case 'Portugiesisch'		: ret='11';	break;
		case 'Rumänisch'		: ret='12';	break;
		case 'Russisch'			: ret='13';	break;
		case 'Schwedisch'		: ret='14';	break;
		case 'Slowakisch'		: ret='15';	break;
		case 'Spanisch'			: ret='16';	break;
		case 'Tschechisch'		: ret='17';	break;
		case 'Türkisch'			: ret='18';	break;
		case 'Ungarisch'		: ret='19';	break;
	}
	return ret;
}

function customer2Id(str){
	var ret = str;
	switch (str) {
		case '-- Bitte wählen --' 	: ret='0';	break;
		case 'Ohne 19% MwSt'		: ret='99';	break;
		case 'Mit 19% MwSt'		: ret='1';	break;
	}
	return ret;
}

function correction2Id(str){
	var ret = str;
	switch (str) {
		case '-- Bitte wählen --' 	: ret='0';	break;
		case 'Übersetzung'		: ret='99';	break;
		case 'Übersetzung + Korrektur'	: ret='1';	break;
	}
	return ret;
}

function category2Id(str){
	var ret = str;
	switch (str) {
		case '-- Bitte wählen --' 						: ret='0';	break;
		case 'Allgemeiner Text' 						: ret='99';	break;
		case 'Beglaubigte Übersetzungen (Handelsregisterauszug, Urkunden etc.)' : ret='1';	break;
		case 'Betriebs- und Wartungsanleitungen' 				: ret='2';	break;
		case 'Betriebsanleitungen' 						: ret='3';	break;
		case 'Elektrotechnik' 							: ret='4';	break;
		case 'IT & Softwarelokalisierung' 					: ret='5';	break;
		case 'Esotherik' 							: ret='6';	break;
		case 'Marketing' 							: ret='7';	break;
		case 'Maschinenbau' 							: ret='8';	break;
		case 'Medizin' 								: ret='9';	break;
		case 'Medizinische Geräte' 						: ret='10';	break;
		case 'Recht/Verträge' 							: ret='11';	break;
		case 'Sonstige technische Dokumente' 					: ret='12';	break;
		case 'Sport' 								: ret='13';	break;
		case 'Wirtschaft/Handel/Finanzen' 					: ret='14';	break;
		case 'Zahnheilkunde' 							: ret='15';	break;
	}
	return ret;
}

function pricecalculator_calculate(){
	var customer = document.forms["pricecalculator"].uid1.value;
	var langIn = document.forms["pricecalculator"].uid2.value;
	var langOut = document.forms["pricecalculator"].uid3.value;
	var category = document.forms["pricecalculator"].uid4.value;
	var text = document.forms["pricecalculator"].uid5.value;
	var correctionOption = document.forms["pricecalculator"].uid16.value;
	var numChars = '';
	var numWords = '';
	var unit = '';
	var num = '';
	var unitPrice = '';
	var unitPriceDiscount = 0;
	var correction = 0;
	var multiplier = 0;
	var subtotal = '';
	var price = '';
	var total = '';
	var delivery = '';
	var ready = true;


	// Fuer langsame Rechner schonmal die alten Werte loeschen
	document.forms["pricecalculator"].uid6.value = 'Bitte warten...';
	document.forms["pricecalculator"].uid7.value = 'Bitte warten...';

	customer = customer2Id(customer);
	langIn = lang2Id(langIn);
	langOut = lang2Id(langOut);
	category = category2Id(category);
	correctionOption = correction2Id(correctionOption);

	if (langIn == 0 || langOut == 0) {
		ready = false;
	} else if (langIn==langOut) {
		ready = false;
		alert('Ausgangs- und Zielsprache muessen verschieden sein.');
	} else if (langIn != 99 && langIn != 4 && langOut != 99 && langOut != 4) {
		ready = false;
		alert('Ausgangs- oder Zielsprache Deutsch oder Englisch sein.');
	}

	if (customer == 0 || langIn == 0 || langOut == 0 || category == 0 || correctionOption == 0) {
		ready = false;
	}

	if (ready){
		// Zeichen zaehlen (ohne Zeilenumbrueche)
		numChars = text.replace(/(\r|\n)/g, "").length;

		// Whitespace kollabieren fuer Wortzaehlung
		text = text.replace(/\s+/g ,' ');
		// Whitespace fuer Wortzaehlung am Anfang und Ende entfernen
		text = text.replace(/(^\s|\s$)/gim ,'');
		// Worte zaehlen
		numWords = text.replace(/[^\s]/g ,'').length+1;

		// Ermittelung der Berechnungsgrundlage
		switch (langIn) {
			case '20':
			case '21':
			case '22':
			case '23':
				unit = 'chars';
				num = numChars;
				break;
			default:
				unit = 'words';
				num = numWords;
				;
		}

		// Vom Deutschen oder Englischen
		if (langIn == 99 || langIn == 4){
			switch (langOut){
				case '99'	: unitPrice = 0.12; break;
				case '1'	: unitPrice = 0.09; break;
//				case '2'	: unitPrice = 0.10; break;
				case '3'	: unitPrice = 0.17; break;
				case '4'	: unitPrice = 0.12; break;
				case '5'	: unitPrice = 0.17; break;
				case '6'	: unitPrice = 0.13; break;
				case '7'	: unitPrice = 0.12; break;
				case '8'	: unitPrice = 0.13; break;
				case '9'	: unitPrice = 0.17; break;
				case '10'	: unitPrice = 0.08; break;
				case '11'	: unitPrice = 0.095; break;
				case '12'	: unitPrice = 0.09; break;
				case '13'	: unitPrice = 0.08; break;
				case '14'	: unitPrice = 0.14; break;
				case '15'	: unitPrice = 0.09; break;
				case '16'	: unitPrice = 0.10; break;
				case '17'	: unitPrice = 0.09; break;
				case '18'	: unitPrice = 0.09; break;
				case '19'	: unitPrice = 0.10; break;

				case '24'	: unitPrice = 0.09; break;

				case '20'	: unitPrice = 0.10; break;
				case '21'	: unitPrice = 0.13; break;
				case '22'	: unitPrice = 0.13; break;
				case '23'	: unitPrice = 0.10; break;
				default : alert('Unbekannte Zielsprache: '  + langOut);
 			}
		}

		// Ins Deutsche oder Englische
		else{
			switch (langIn){
				case '99'	: unitPrice = 0.12; break;
				case '1'	: unitPrice = 0.14; break;
//				case '2'	: unitPrice = 0.14; break;
				case '3'	: unitPrice = 0.16; break;
				case '4'	: unitPrice = 0.12; break;
				case '5'	: unitPrice = 0.16; break;
				case '6'	: unitPrice = 0.12; break;
				case '7'	: unitPrice = 0.12; break;
				case '8'	: unitPrice = 0.12; break;
				case '9'	: unitPrice = 0.16; break;
				case '10'	: unitPrice = 0.12; break;
				case '11'	: unitPrice = 0.13; break;
				case '12'	: unitPrice = 0.13; break;
				case '13'	: unitPrice = 0.13; break;
				case '14'	: unitPrice = 0.16; break;
				case '15'	: unitPrice = 0.13; break;
				case '16'	: unitPrice = 0.12; break;
				case '17'	: unitPrice = 0.13; break;
				case '18'	: unitPrice = 0.13; break;
				case '19'	: unitPrice = 0.13; break;

				case '24'	: unitPrice = 0.12; break;

				case '20'	: unitPrice = 0.14; break;
				case '21'	: unitPrice = 0.14; break;
				case '22'	: unitPrice = 0.14; break;
				case '23'	: unitPrice = 0.14; break;
				default : alert('Unbekannte Ausgangssprache: ' + langIn);
			}
		}

		// Abzug: Vom oder ins Englische
		if (langIn == 4 || langOut == 4){
			unitPriceDiscount = -0.10;
		}

		// Korrektur gewuenscht? +30%
		if (correctionOption == 1){
			correction = 0.30;
		}

		// Zuschlaege
		if (langIn == 20 || langIn == 21 || langIn == 22 || langIn == 23 ||
		    langOut == 20 || langOut == 21 || langOut == 22 || langOut == 23){
			switch (category){
				case '99'  : multiplier = -0.06; break; // Allgemeiner Text
				case '1'  : multiplier =  0.30; break; // BeglaubigteUebersetzungen
				case '9'  : multiplier =  0.10; break; // Medizin
				case '11' : multiplier =  0.10; break; // Recht/Vertraege
				case '15' : multiplier =  0.10; break; // Zahnheilkunde
				default : multiplier = 0;
			}
		} else {
			switch (category){
				case '99'  : multiplier = -0.06; break; // Allgemeiner Text
				case '1'  : multiplier =  0.30; break; // BeglaubigteUebersetzungen
				case '9'  : multiplier =  0.12; break; // Medizin
				case '11' : multiplier =  0.12; break; // Recht/Vertraege
				case '15' : multiplier =  0.12; break; // Zahnheilkunde
				default : multiplier = 0;
			}
		}
		
		subtotal = num * unitPrice * (1 + (unitPriceDiscount + correction + multiplier));
		price = subtotal;
		if (price < 35){
			price = 35.0;
		}
//		price = Math.round(price * 100) / 100;

		if (customer == 99){
			total = Math.round(price * 100) / 100;
		} else {
			total = Math.round(price * 1.19 * 100) / 100; // + Mehrwertsteuer
		}
		total = total.toFixed(2);

		if (num <= 2000){
			delivery = '1-2 Arbeitstage';
		} else {
			delivery = 1 + Math.ceil((num-2000)/1500);
			delivery = delivery + '-' + (delivery+1) + ' Arbeitstage';
		}

	}
	
//	document.forms["pricecalculator"].numChars.value = numChars;
//	document.forms["pricecalculator"].numWords.value = numWords;
//	document.forms["pricecalculator"].unit.value = unit;
//	document.forms["pricecalculator"].num.value = num;
//	document.forms["pricecalculator"].unitPrice.value = unitPrice;
//	document.forms["pricecalculator"].unitPriceDiscount.value = unitPriceDiscount;
//	document.forms["pricecalculator"].multiplier.value = multiplier;
//	document.forms["pricecalculator"].subtotal.value = subtotal;
//	document.forms["pricecalculator"].price.value = price;
	document.forms["pricecalculator"].uid6.value = total;
	document.forms["pricecalculator"].uid7.value = delivery;

}

function pricecalculator_init(){
	if (document.forms["pricecalculator"]){
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid1, "change", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid2, "change", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid3, "change", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid4, "change", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid16, "change", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid5, "change", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid5, "keyup", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid5, "keydown", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid5, "input", pricecalculator_calculate);
		pricecalculator_events.addEvent(document.forms["pricecalculator"].uid5, "propertychange", pricecalculator_calculate);
		pricecalculator_calculate();
	}
}

pricecalculator_events.addEvent(window, "load", pricecalculator_init);
