var FALLBACK_LOCALE = "en_DE";
var FALLBACK_COUNTRY = "DE";
var VAT_GERMANY = 0.19; // the tax rate for Germany
var VATCOSTS_GERMANY_FIXCOSTS = 32;

/* The country model. */
function Country(code, names, languages) {
	this.code = code;
	this.names = names;
	this.languages = languages;
}

function Language(code, names) {
	this.code = code;
	this.names = names;
}

function model_localizeTextsOnModel(modelId) {
  var model = models.get(modelId);  
  for (var propertyName in model) {
    if ((typeof model[propertyName]) == "string") {
      switch (propertyName) {
        // Prevent some string properties from modification:
        case "id": 
          break;
        // Do replacements:
        default:
          
          // TODO Remove this replacement, because the better way is to do it 'DatabaseImporter' (mantis#6912). teilermann, 2010-10-04
          var propertyValue = model[propertyName];
          model[propertyName] = propertyValue
            .replace("g/", LABELS.get("unit.g") + "/")
            .replace("kg/", LABELS.get("unit.kg") + "/")
            .replace("l/", LABELS.get("unit.liter") + "/")
            .replace("km", LABELS.get("unit.km"))
            .replace("-trg.", LABELS.get("label.model.replacement.doors"))  
            .replace("Benzinbetrieb", LABELS.get("label.model.replacement.gasolineMode"))
            .replace("Erdgasbetrieb", LABELS.get("label.model.replacement.gasMode"))
            .replace("Autogasbetrieb", LABELS.get("label.model.replacement.autoGasMode"));
            
            // NOTE Here you can add additional replacements.
      }//switch       
    }//if    
  }//for
}


/* The static countries assoc. array. */
var countries = new Hash(); 
// these are the countries without their country specific language
// if a new language is supported remove the line below and uncomment the matching one above
countries.set("DE", new Country("DE", ["Germany", "Deutschland"],						["de", "en"]));
countries.set("IS", new Country("IS", ["Iceland", "Island"],							["en"]));
countries.set("IR", new Country("IR", ["Ireland", "Irland"],							["en"]));
countries.set("GB", new Country("GB", ["United Kingdom", "Großbritannien"],				["en"]));
countries.set("FR", new Country("FR", ["France", "Frankreich"],							["en"]));
countries.set("PT", new Country("PT", ["Portugal", "Portugal"],							["en"]));
countries.set("ES", new Country("ES", ["Spain", "Spanien"],								["en"]));
countries.set("IT", new Country("IT", ["Italy", "Italien"],								["en"]));
countries.set("MT", new Country("MT", ["Malta", "Malta"],								["en"]));
countries.set("CH", new Country("CH", ["Switzerland", "Schweiz"],						["de", "en"]));
countries.set("BE", new Country("BE", ["Belgium", "Belgien"],							["en"]));
countries.set("NL", new Country("NL", ["Netherlands", "Niederlande"],					["en"]));
countries.set("DK", new Country("DK", ["Denmark", "Dänemark"],							["en"]));
countries.set("NO", new Country("NO", ["Norway", "Norwegen"],							["en"]));
countries.set("SE", new Country("SE", ["Sweden", "Schweden"],							["en"]));
countries.set("FI", new Country("FI", ["Finland", "Finnland"],							["en"]));
countries.set("RU", new Country("RU", ["Russian Federation", "Russische Föderation"],	["ru", "en"]));
countries.set("EE", new Country("EE", ["Estonia", "Estland"],							["en"]));
countries.set("LV", new Country("LV", ["Latvia", "Lettland"],							["en"]));
countries.set("LT", new Country("LT", ["Lithuania", "Litauen"],							["en"]));
countries.set("PL", new Country("PL", ["Poland", "Polen"],								["en"]));
countries.set("CZ", new Country("CZ", ["Czech Republic", "Tschechische Republik"],		["en"]));
countries.set("AT", new Country("AT", ["Austria", "Österreich"],						["de", "en"]));
countries.set("SK", new Country("SK", ["Slovak Republic", "Slowakische Republik"],		["en"]));
countries.set("BY", new Country("BY", ["Belarus", "Belarus"],							["en"]));
countries.set("UA", new Country("UA", ["Ukraine", "Ukraine"],							["en"]));
countries.set("TR", new Country("TR", ["Turkey", "Türkei"],								["tr", "en"]));
countries.set("CY", new Country("CY", ["Cyprus", "Zypern"],								["en"]));
countries.set("GR", new Country("GR", ["Greece", "Griechenland"],						["en"]));
countries.set("BG", new Country("BG", ["Bulgaria", "Bulgarien"],						["en"]));
countries.set("RS", new Country("RS", ["Serbia", "Serbien"],							["en"]));
countries.set("HR", new Country("HR", ["Croatia", "Kroatien"],							["en"]));
countries.set("SI", new Country("SI", ["Slovenia", "Slovenien"],						["en"]));
countries.set("HU", new Country("HU", ["Hungary", "Ungarn"],							["en"]));
countries.set("RO", new Country("RO", ["Romania", "Rumänien"],							["en"]));

//The static languages assoc. array.
var languages = new Hash();
languages.set("de", new Language("de", ["German",		"Deutsch"]));
languages.set("ga", new Language("ga", ["Irish",		"Irisch"]));
languages.set("en", new Language("en", ["English",		"Englisch"]));
languages.set("fr", new Language("fr", ["French",		"Französisch"]));
languages.set("pt", new Language("pt", ["Portuguese",	"Portugiesisch"]));
languages.set("es", new Language("es", ["Spanish",		"Spanisch"]));
languages.set("it", new Language("it", ["Italian",		"Italienisch"]));
languages.set("nl", new Language("nl", ["Dutch",		"Niederländisch"]));
languages.set("da", new Language("da", ["Danish",		"Dänisch"]));
languages.set("sv", new Language("sv", ["Swedish",		"Schwedisch"]));
languages.set("fi", new Language("fi", ["Finnish",		"Finnisch"]));
languages.set("ru", new Language("ru", ["Russian",		"Russisch"]));
languages.set("et", new Language("et", ["Estonian",		"Estnisch"]));
languages.set("lv", new Language("lv", ["Latvian",		"Lettisch"]));
languages.set("lt", new Language("lt", ["Lithuanian",	"Litauisch"]));
languages.set("pl", new Language("pl", ["Polish",		"Polnisch"]));
languages.set("cs", new Language("cs", ["Czech",		"Tschechisch"]));
languages.set("be", new Language("be", ["Belarusian",	"Belarussisch"]));
languages.set("uk", new Language("uk", ["Ukrainian",	"Ukrainisch"]));
languages.set("tr", new Language("tr", ["Turkish",		"Türkisch"]));
languages.set("el", new Language("el", ["Greek",		"Griechisch"]));
languages.set("bg", new Language("bg", ["Bulgarian",	"Bulgarisch"]));
languages.set("sr", new Language("sr", ["Serbian",		"Serbisch"]));
languages.set("hr", new Language("hr", ["Croatian",		"Kroatisch"]));
languages.set("sk", new Language("sk", ["Slovak",		"Slowakisch"]));
languages.set("hu", new Language("hu", ["Hungarian",	"Ungarisch"]));
languages.set("ro", new Language("ro", ["Romanian",		"Rumänisch"]));

var ENGLISH_LANGUAGE_INDEX = 0;
var GERMAN_LANGUAGE_INDEX = 1;

/*
 @return the index of the language required for resolving the country and language names
 */
function getLanguageIndex(languageCode) {
	return ("de" == languageCode ? GERMAN_LANGUAGE_INDEX : ENGLISH_LANGUAGE_INDEX);
}

function renderCountrySelectBox(languageCode) {
	var langIdx = getLanguageIndex(languageCode);
	
	// get all countries sorted by name
	var optionLabelValueHash = new Hash();
	countries.each(function(pair) {
		optionLabelValueHash.set(pair.value.names[langIdx], pair.key);
	});
	var sortedLabels = optionLabelValueHash.keys().sort(StringComparator); // sort the labels by name
	
	var html = "";
	sortedLabels.each(function(label) {
		html = html + "<option value='" + optionLabelValueHash.get(label) + "'>" + label +"</option>";
	});
	// render country span incl. select box
	$("countrySelectBox").insert(html);
	$("countrySelectBox").value = ""; // pre-select default option
}

function renderLanguageSelectBox(countryCode, languageCode, languageLabel) {
	if (countryCode != "") {
		var langIdx = getLanguageIndex(languageCode);
		// fetch country with specified code
		var country = countries.get(countryCode);
		if (country.languages.length == 1) {
			// forward directly to intro page
			forwardToSelection(country.languages[0], country.code);
			//window.location.href="intro.htm?locale=" + country.languages[0] + "_" + country.code;
			return;
		}
		var html = "<select id=\"languageSelectBox\" onChange=\"forwardToSelection(this.value, '" + country.code + "');\">";
		if (country.languages.length > 1) {
			html = html + "<option value=''>" + languageLabel + "</option>";
		}

		// get all languages available for country (sorted by localized name)
		var optionLabelValueHash = new Hash();
		for (var i = 0; i < country.languages.length; i++) {
			var langCode = country.languages[i];
			optionLabelValueHash.set(languages.get(langCode).names[langIdx], langCode);
		}
		var sortedLabels = optionLabelValueHash.keys().sort(StringComparator); // sort the labels by name
		
		sortedLabels.each(function(label) {
			html = html + "<option value='" + optionLabelValueHash.get(label) + "'>" + label +"</option>";
		});
				
		
		html = html + "</select>";
		// render language span incl. select box
		$("languageSpan").update(html);
		$("languageSpan").show();
		$("languageSelectBox").value = ""; // pre-select default option
	} else {
		// hide and clear language span
		$("languageSpan").update("");
		$("languageSpan").hide();
	}
}

function forwardToIntro(langCode) {
	var countryCode = $("countrySelectBox").value;
	window.location.href="intro.htm?locale=" + langCode + "_" + countryCode;
}

function forwardToSelection(langCode, countryCode) {
	if (countryCode == "DE" ) {
		window.location.href="http://www.fuel-pilot.de/" + langCode + "/";
	} else {
		window.location.href="selection.htm?v=l&reset=true&locale=" + langCode + "_" + countryCode;
	}
}

function getLanguagesWithoutCurrent(currentLanguage, currentCountry) {
  var country = countries.get(currentCountry);
  if (country == undefined) {
    country = countries.get(FALLBACK_COUNTRY);
  }
  var result = [];  
  for (var i = 0; i < country.languages.length; i++) {
    if (currentLanguage != country.languages[i]) {
      result.push(country.languages[i]);
    }
  }
  return result;
}



function setNaviLinks(locale, requestUri, showCalcBaseLink) {
	// set language links
	var currentLanguage = locale.split("_")[0];
	var currentCountry = locale.split("_")[1];
	var country = countries.get(currentCountry);
	if (country == undefined) {
		country = countries.get(FALLBACK_COUNTRY);
	}
	var languageLinks = "";
	for (var l = 0; l < country.languages.length; l++) {
		var link = "";
		switch (country.languages[l]) {
			case "de":
				if (currentLanguage != "de") {
					link = "<a href='" + requestUri + "?locale=de_" + country.code + "'>Deutsch</a>";
				}
				break;
			case "en":
				if (currentLanguage != "en") {
					link = "<a href='" + requestUri + "?locale=en_" + country.code + "'>English</a>";
				}
				break;
			default: link = ""; break;
		}
		if (languageLinks != "" && link != "") {
			languageLinks = languageLinks + "&nbsp;|&nbsp;";
		}
		languageLinks = languageLinks + link;
	}
	if (languageLinks == "") languageLinks = "&nbsp;"; // div must contain at least one char to render correctly
	$('languagesBox').update(languageLinks);
	
	// set logo, contact, imprint and calcbase links
	var boschInfo = localeDB.get(locale);
	var fbBoschInfo = localeDB.get(FALLBACK_LOCALE);
	if (boschInfo == undefined) {
		// use english_country as locale to find a matching BoschInfo
		boschInfo = localeDB.get("en_" + locale.split("_")[1]);
	}
	if (boschInfo == undefined) {
		// use fallback locale matching BoschInfo
		boschInfo = fbBoschInfo;
	}
	
	// logo link
	var websiteURL = boschInfo.websiteURL;
	if (websiteURL == "") {
		websiteURL = fbBoschInfo.websiteURL;
	}
	$('logoLink').href = websiteURL;
	
	// contact link
	var contactURL = boschInfo.contactURL;
	if (contactURL == "") {
		contactURL = fbBoschInfo.contactURL;
	}
	$('contactLink').onclick = function() { popUp(contactURL, "Bosch", "no", 490, 532); };
	
	// imprint link
	var imprintURL = boschInfo.imprintURL;
	if (imprintURL == "") {
		imprintURL = fbBoschInfo.imprintURL;
	}
	$('imprintLink').onclick = function() { popUp(imprintURL, "Bosch", "yes", 710, 750); };
	
	if (!showCalcBaseLink) {
		$('calcbaseLink').hide();
	}
}

function getLanguagesWithoutCurrent(currentLanguage, currentCountry) {
  var country = countries.get(currentCountry);
  if (country == undefined) {
    country = countries.get(FALLBACK_COUNTRY);
  }
  var result = [];  
  for (var i = 0; i < country.languages.length; i++) {
    if (currentLanguage != country.languages[i]) {
      result.push(country.languages[i]);
    }
  }
  return result;
}


function setNaviLinks_boschJVM(locale, requestUri, menuitems) {
  
  // set language links
  var currentLanguage = locale.split("_")[0];
  var currentCountry = locale.split("_")[1];
  var country = countries.get(currentCountry);
  if (country == undefined) {
    country = countries.get(FALLBACK_COUNTRY);
  }
  // set logo, contact, imprint and calcbase links
  var boschInfo = localeDB.get(locale);
  var fbBoschInfo = localeDB.get(FALLBACK_LOCALE);
  if (boschInfo == undefined) {
    // use english_country as locale to find a matching BoschInfo
    boschInfo = localeDB.get("en_" + currentCountry);
  }
  if (boschInfo == undefined) {
    // use fallback locale matching BoschInfo
    boschInfo = fbBoschInfo;
  } 
  
  // language link(s)
  if ($('languagesBox')) {
    var languageLinks = "";
    var otherLanguages = getLanguagesWithoutCurrent(currentLanguage, currentCountry)
    for (var l = 0; l < otherLanguages.length; l++) {
      var linkLanguageCode = otherLanguages[l];
      var linkText = LABELS.get("languages." + linkLanguageCode);
      var link = "<a href='" + requestUri + "?locale=" + linkLanguageCode + "_" + country.code + "'>" + linkText + "</a>";
      if (languageLinks != "" && link != "") {
        languageLinks = languageLinks + "&nbsp;|&nbsp;";
      }
      languageLinks = languageLinks + link;
    }
    if (languageLinks == "") languageLinks = "&nbsp;"; // div must contain at least one char to render correctly
    $('languagesBox').update(languageLinks);
  }
  
  // bosch website link on logo (website)
  var websiteURL = boschInfo.websiteURL;
  if (websiteURL == "") {
    websiteURL = fbBoschInfo.websiteURL;
  }
  $('logoLink').href = websiteURL;
  
  // faq (overlay)
  if (jQuery.inArray("faq", menuitems) != -1) {
	  $('faqLink').onclick = function() { showOverlay('#faqOverlay'); };
	  //contact links in FAQ
	  var contactURL = boschInfo.contactURL;
	  if (contactURL == "") {
		contactURL = fbBoschInfo.contactURL;
	  }
	  $('faqContactLink').onclick = function() { popUp(contactURL, "Bosch", "no", 490, 532); };
	  $('faqContactLink1').onclick = function() { popUp(contactURL, "Bosch", "no", 490, 532); };
	  $('faqContactLink2').onclick = function() { popUp(contactURL, "Bosch", "no", 490, 532); };
  }
  
  // bosch diesel advantages website link (website)
  if (jQuery.inArray("diesel", menuitems) != -1) {
	  if (currentLanguage = "de") {
		  $('dieselLink').href = "http://www.bosch-kraftfahrzeugtechnik.de/de/de/powertrain/powertrain_systems_for_passenger_cars_1/diesel_2/diesel_3.html#tab_1";
	  } else {
		  $('dieselLink').href = "http://www.bosch-kraftfahrzeugtechnik.de/en/de/powertrain/powertrain_systems_for_passenger_cars_1/diesel_2/diesel_3.html#tab_1";
	  }
  }

  // calcbase link (overlay)
  if(jQuery.inArray("calcbase", menuitems) != -1) {
	  $('calcbaseLink').onclick = function() { showOverlay('#calcbaseOverlay'); };
	  renderCalculationBaseOverlayContent_boschJVM(LABELS.get("CALCBASE_TEXT"));
  }
  
  // imprint link (popup)
  if (jQuery.inArray("imprint", menuitems) != -1) {
	  var imprintURL = boschInfo.imprintURL;
	  if (imprintURL == "") {
	    imprintURL = fbBoschInfo.imprintURL;
	  }
	  $('imprintLink').onclick = function() { popUp(imprintURL, "Bosch", "yes", 710, 750); };
  }
  
  
  
}

function setNaviLinks_dekra(locale, requestUri, showCalcBaseLink) {
	// set language links
	var currentLanguage = locale.split("_")[0];
	var currentCountry = locale.split("_")[1];
	var country = countries.get(currentCountry);
	if (country == undefined) {
		country = countries.get(FALLBACK_COUNTRY);
	}
	
	// set logo, contact, imprint and calcbase links
	var boschInfo = localeDB.get(locale);
	var fbBoschInfo = localeDB.get(FALLBACK_LOCALE);
	if (boschInfo == undefined) {
		// use english_country as locale to find a matching BoschInfo
		boschInfo = localeDB.get("en_" + locale.split("_")[1]);
	}
	if (boschInfo == undefined) {
		// use fallback locale matching BoschInfo
		boschInfo = fbBoschInfo;
	}	
	
	if (!showCalcBaseLink) {
		$('imprintLink_postSeparator').hide();
		$('calcbaseLink').hide();
	}
}

function popUp(url, name, showScrollbar, height, width) {
	var settings = 'height=' + height + ',';
	settings += 'width=' + width + ',';
	settings += 'left=' + (screen.width - width) / 2 + ',';
	settings += 'top=' + (screen.height - height) / 2 + ',';
	settings += 'scrollbars=' + showScrollbar + ",";
	settings += 'status=yes,';
	settings += 'resizable=no';

	win = window.open(url, name, settings);

	if (parseInt(navigator.appVersion) >= 4) {
		win.window.focus();
	}
}


