// cookie plugin
// Copyright (c) 2006 Klaus Hartl (stilbuero.de)
// Dual licensed under the MIT and GPL licenses:
jQuery.cookie = function(name, value, options) {
if (typeof value != 'undefined') { // name and value given, set cookie
  options = options || {};
  if (value === null) {
     value = '';
     options.expires = -1;
  }
  var expires = '';
  if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
    var date;
    if (typeof options.expires == 'number') {
        date = new Date();
        date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
    } else {
        date = options.expires;
    }
    expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
  }
  // CAUTION: Needed to parenthesize options.path and options.domain
  // in the following expressions, otherwise they evaluate to undefined
  // in the packed version for some reason...
  var path = options.path ? '; path=' + (options.path) : '';
  var domain = options.domain ? '; domain=' + (options.domain) : '';
  var secure = options.secure ? '; secure' : '';
  document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else { // only name given, get cookie
  var cookieValue = null;
  if (document.cookie && document.cookie != '') {
    var cookies = document.cookie.split(';');
    for (var i = 0; i < cookies.length; i++) {
      var cookie = jQuery.trim(cookies[i]);
      // Does this cookie string begin with the name we want?
      if (cookie.substring(0, name.length + 1) == (name + '=')) {
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
        break;
      }
    }
  }
  return cookieValue;
}
}; // cookie

// ----------------------------------------------------------------------------
// ----- now our code: -------------------------------------------------------
cfos.version = "1.4";
cfos.cfosspeed_de = "http://www.cfosspeed.de";
cfos.remote_addr=  "";
cfos.prot = "";
cfos.query =  "";
cfos.hash =  "";
cfos.url =  "";
cfos.domain =  "";
cfos.ret_str = "";
cfos.allow_track_page_view = true;

cfos.valid_email = function(id) {
   $('#'+id).removeClass("red_border");
   $('#'+id+'_err').hide();
   if ($('#'+id).val().replace(/\s/g, '') == "") {
   $('#'+id).addClass("red_border");
   $('#'+id+'_err').show();
   return false;
   } else {
      var re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
      if ($('#'+id).val().match(re))
         return true;
      else {
         $('#'+id).addClass("red_border");
         $('#'+id+'_err').show();
         return false;
      }
   }
};
cfos.not_empty = function(id) {
      $('#'+id).removeClass("red_border");
      $('#'+id+'_err').hide();
   if ($('#'+id).val().replace(/\s/g, '') == "") {
      $('#'+id).addClass("red_border");
      $('#'+id+'_err').show();
      return false;
   } else return true;
}
cfos.put_remote_address = function(ra) {
   this.remote_addr = ra;
   this.initLogo();
};
cfos.delegate = function(obj, method) {
   return function() { return method.call(obj); }
};
cfos.initLogo = function() {
   if (!cfos.remote_addr) return;
   if (cfos.remote_addr.indexOf(":") != -1) {
      $('#logo > span').html('<img src="/images/logo_119_v6.png" width="119" height="42" alt="cFos IPv6 logo" />');
      this.set_event("ip", "v6");
   }
//   else this.set_event("ip", "v4");
   $("#ip_addr").text(cfos.remote_addr);
};
cfos.set_event = function(name, value) {
   if (!window._gaq) window._gaq = [];
   window._gaq.push(['_setAccount', "UA-11297254-27"]);
   window._gaq.push(['_trackEvent', name, value]);
};
cfos.track_page_view = function(pid) {
   if (this.remote_addr.indexOf(':') != -1) return;
   if (this.allow_track_page_view) {
      window.google_analytics_uacct = pid; // adsense/analytics linking
      if (!window._gaq) window._gaq = [];
      window._gaq.push(['_setAccount', pid]);
      if (window._gat) window._gat._anonymizeIp();
      window._gaq.push(['_trackPageview', cfos.url]);
      window._gaq.push(['t2._setAccount', 'UA-11297254-27']);
      var ua = cfos.url.split('/');
      if (this.lang_selector.langs[ua[0]]) ua.shift();
      var nu = '/' + ua.join('/');
      window._gaq.push(['t2._trackPageview', nu]);
      var sw_called = false;
      var q = cfos.query.split('&');
      for (var i=0; i < q.length; ++i) {
         var f = q[i].split('=');
         if (f.length == 1) {
            cfos.set_event('query', f[0]);
            if (f[0].match(/^(sw-|reg-)/)) sw_called = true;
         }
         else cfos.set_event("q_" + f[0], f[1]);
      }
      if (sw_called) {
         if (nu == "/cfos-personal-net/cfos-personal-net.htm") cfos.set_event("q_install", "pnet");
      }
   }
   var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
   ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
   var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
};
cfos.parse_url = function(u) {
   this.url = u;
   var idx = this.url.lastIndexOf('#');
   if (idx != -1) {
      this.hash = this.url.substr(idx + 1);
      this.url = this.url.substr(0, idx);
   }
   else this.hash = "";
   idx = this.url.lastIndexOf('?');
   if (idx != -1) {
      this.query = this.url.substr(idx + 1);
      this.url = this.url.substr(0, idx);
   }
   else this.query = "";
   this.url = this.url.replace(/^(https?:\/\/)?(www\.)?cfos\.(de|com)\//, "");
   while (this.url.charAt(0) == '/') this.url = this.url.substr(1);
};
cfos.make_rel = function(lnk) {
   if (lnk.charAt(0) != '/') {
      alert("make_rel: link must begin with /");
   }
   return this.ret_str + lnk.substr(1);
};
cfos.initSearch = function() {
   if (typeof (window.no_search) == "undefined") {
      if ($('#google_search').length > 0) {
         $('#google_search').attr('class', 'toplinks');
         $('#google_search').html('<form action="' + this.prot + '//www.cfos.de/en/search-results.htm" id="cse-search-box"><div><input type="hidden" name="cx" value="partner-pub-3444656488522610:hl81he-4o3f" /><input type="hidden" name="cof" value="FORID:10" /><input type="hidden" name="ie" value="UTF-8" /><input type="text" name="q" size="18" /><input type="submit" name="sa" value="Search" /></div></form><script type="text/javascript" src="' + this.prot + '//www.google.com/cse/brand?form=cse-search-box&amp;lang=en"></script>');
      }
   }
};
cfos.cookies_enabled = function() {
   if (navigator.cookieEnabled && navigator.cookieEnabled == true) return true;
   document.cookie = "test_cookie";
   return document.cookie.indexOf("test_cookie") != -1;
};
cfos.get_cookie_key = function(name, def) {
   var v = $.cookie(name);
   return v != null ? v : def;
};
cfos.set_cookie_key = function(name, val) {
   if (this.domain == "") {
      var m = window.location.href.match(/^(http:\/\/|https:\/\/)?(www\.)?cfos(\.de|\.com)\//);
      if (m) this.domain = m[3] == ".com" ? "cfos.com" : "cfos.de";
   }
   $.cookie(name, val, { expires: 365, path: "/", domain: this.domain });
};
cfos.delete_cookie = function(name) { $.cookie(name, null); };
cfos.show_selector = function() {
   $("#selector").load('/select-language.htm',
   function() {
//      $('.agents div').hide();
//      $('.link').removeClass('link').addClass('agents');
      $("#selector_box").fadeIn('fast');
      $("#selector").fadeIn('slow');
      $(".agent_img").each(function() { $(this).qtip({ content: $(this).next().html(), show: "mouseover", hide: { when: "mouseout", fixed: true }, position: { corner: { target: 'topLeft', tooltip: 'topLeft'} }, style: { background: '#ffffd0', border: { color: '#3366cc'}} }); });
   });
};
cfos.select_language = function(lang) {
   this.set_cookie_key("l2", lang);
   $('#selector').fadeOut('slow');
   this.set_event('select_lang', lang);
   $("#used_lang").hide();
   this.lang_selector.init_language();
   return false;
};
cfos.navigate = function(s) {
   if (window.location.href == s) return;
   if (s.indexOf('?') == -1 && cfos.query != "") s += "?" + cfos.query;
   // give analytics time to transmit events
   _gaq.push(function() { window.location.href = s; });
};
cfos.cleanup_id = function(id) {
   var c = id.split('|');
   var nc = [];
   for (var i = 0; i < c.length; ++i) {
      var f = c[i].split(':');
      if (f[0] == "t" || f[0] == "rn" || f[0] == "l") nc.push(c[i]);
   }
   nc = nc.join('|');
   if (nc != c) this.set_cookie_key("id", nc);
   return nc;
};
cfos.check_user_id = function() {
   var id = this.get_cookie_key("id", "");
   if (id.indexOf("t:") == -1 || id.indexOf("rn:") == -1 || id.indexOf("l:") == -1) id = "";   // invalid id
   if (id) id = this.cleanup_id(id);
   else {
      var d = new Date();
      var t = d.getTime() + "/" + d.getTimezoneOffset();
      var rnd = Math.floor(Math.random() * 2147483648);
      var bl = navigator.language ? navigator.language : navigator.userLanguage;
      id = 't:' + t + '|rn:' + rnd + '|l:' + bl;
      this.set_cookie_key("id", id);
   }
   if (window.id_callback) id_callback(id);
};
cfos.add_script = function(url) {
   var script = document.createElement('script');
   script.type = "text/javascript";
   script.src = url;
   $("body").append(script);
};
cfos.add_stylesheet = function(url) {
   var link = $("<link>");
   link.attr({ type: "text/css", rel: "stylesheet", href: url });
   $("head").append(link);
};
cfos.patch_q = function() {
   if ($.browser.msie && parseInt($.browser.version) < 8) return;
   if ($.browser.opera && parseInt($.browser.version) < 10) return;
   var strong = cfos.get_cookie_key("qs", "") == "s";
   var q = $("q");
   for (var i = 0; i < q.length; ++i) {
      if (q[i].id.indexOf("ml_") != 0) continue;
      var o = {
         id: q[i].id.substr(3),   // strip ml_
         invoke_translation: function () {
            cfos.translate.current_key = this.id;
            $("#translate").load("/translate.htm");
            return false;
         }
      };
      var jqo = $(q[i]);
      jqo.click(cfos.delegate(o, o.invoke_translation));
      jqo.removeClass(strong ? "light" : "strong");
      jqo.addClass(strong ? "strong" : "light");
   }
};
cfos.set_q_style = function(is_strong) {
   cfos.set_cookie_key("qs", is_strong ? "s" : "l");
   cfos.patch_q();
};
cfos.prepare_q = function(is_init) {
   var kl = [];
   var q = $("q");
   for (var i = 0; i < q.length; ++i) kl.push(q[i].id.substr(3));   // strip ml_
   if (kl.length > 0) {
      var st = cfos.get_cookie_key("trm", "") == "a" ? 1 : 2;
      var s = "lang=" + cfos.ll_lang + "&state=" + st + "&keys=" + encodeURIComponent(kl.join(','));
      var a = { data: s, dataType: "jsonp", url: "http://www.cfosspeed.de/ml/translate_keys.jss",
         error: function() {
            cfos.patch_q();
         },
         success: function(d, st) {
            for (var i in d) document.getElementById("ml_" + i).innerHTML = d[i];
            cfos.patch_q();
         }
      }
      $.ajax(a);
      if (is_init) {
         $("#disp_style_light").attr("checked", cfos.get_cookie_key("qs", "") != "s");
         $("#disp_style_strong").attr("checked", cfos.get_cookie_key("qs", "") == "s");
         $("#view_trans_strict").attr("checked", cfos.get_cookie_key("trm", "") != "a");
         $("#view_trans_all").attr("checked", cfos.get_cookie_key("trm", "") == "a");
         $("#used_lang").append('<img style="margin-right: 5px; padding-right: 8px; border-width: 0px 1px 0px 0px; border-style: solid; border-color: #e0e0e0" id="button_tr_settings" onclick="$(\'#tr_settings\').toggle(\'fast\'); cfos.set_event(\'open_dialog\', \'q_display\');" class="hand" style="float: right" width="21" height="14" alt="" src="/images/translation.png"/>');
      }
   }
};
cfos.set_tr_mode = function(is_strict) {
   cfos.set_cookie_key("trm", is_strict ? "s" : "a");
   _gaq.push(function() { window.location.reload(); });
};
cfos.google_lang = function(gl) {
   gl = gl.toLowerCase();
   if (gl == "zh-cn" || gl == "zh-tw") return gl;
   gl = gl.replace(/-.*/, "");
   if (gl == "he") return "iw";
   if (gl in { af: 1, sq: 1, ar: 1, be: 1, bg: 1, ca: 1, hr: 1, cs: 1, da: 1, nl: 1, en: 1, et: 1, tl: 1, fi: 1, fr: 1, gl: 1,
      de: 1, el: 1, ht: 1, hi: 1, hu: 1, is: 1, id: 1, ga: 1, it: 1, ja: 1, lv: 1, lt: 1, mk: 1, ms: 1, mt: 1, no: 1, fa: 1,
      pl: 1, pt: 1, ro: 1, ru: 1, sr: 1, sk: 1, sl: 1, es: 1, sw: 1, sv: 1, th: 1, tr: 1, uk: 1, vi: 1, cy: 1, yi: 1
   }) return gl;
   return "";
};
cfos.bing_lang = function(tl) {
   tl = tl.toLowerCase();
   if (tl == "zh-cn") return "zh-CHS";
   if (tl == "zh-tw") return "zh-CHT";
   tl = tl.replace(/-.*/, "");
   if (tl in {
      ar: 1, bg: 1, ca: 1, cs: 1, da: 1, nl: 1, en: 1, et: 1, fi: 1, fr: 1, de: 1, el: 1, ht: 1, he: 1, hu: 1, id: 1, it: 1,
      ja: 1, ko: 1, lv: 1, lt: 1, no: 1, pl: 1, pt: 1, ro: 1, ru: 1, sk: 1, sl: 1, es: 1, sv: 1, th: 1, tr: 1, uk: 1, vi: 1
   }) return tl;
   return "";
}
// tr members:
//   src: array with texts to be translated
//   dst: array with translations
// when finished: callback(tr)
cfos.google_translate = function(tr, callback) {
   var s = "key=AIzaSyABO6ly8RMI88NNS0_MUWQl9bGLQ7_-VVU&format=html&target=en";
   var gl = cfos.google_lang(cfos.ll_lang);
   if (gl) s += "&source=" + gl;
   if (tr.src.length == 0) {
      callback(tr);
      return;
   }
   for (var i=0; i < tr.src.length; ++i)
      s += "&q=" + encodeURIComponent('<q id="' + i + '">' + tr.src[i] + '</q>');
   $.ajax({ data: s, dataType: "jsonp", url: "https://www.googleapis.com/language/translate/v2",
      success: function(rsp, st) {
         if (rsp.data && rsp.data.translations) {
            tr.dst = [];
            if (rsp.data.translations.length == 0) tr.dst = tr.src;
            else {
               for (var i=0; i < rsp.data.translations.length; ++i) {
                  var ts = rsp.data.translations[i].translatedText.replace(/<\/q>\s*$/, "");
                  var m = ts.match(/^\s*<q\s+id="(\d+)"\s*>/);
//alert(m);
                  if (!m) {
                     tr.dst = tr.src;
                     callback(tr);
                     return;
                  }
                  var id = m[1];
                  tr.dst[id] = ts.substr(m[0].length);
               }
            }
         }
         else tr.dst = tr.src;
         callback(tr);
      },
      error: function() { tr.dst = tr.src; }
   });
};
cfos.bing_translate = function(tr, callback) {
   var s = "appId=3FAE223257E3EC35AA981332DF6FA9EF1F1269EC&to=en";
   var tl = cfos.bing_lang(cfos.ll_lang);
   if (tl) s += "&from=" + tl;
   if (tr.src.length == 0) {
      callback(tr);
      return;
   }
   var c = "[";
   for (var i=0; i < tr.src.length; ++i) {
      if (i > 0) c += ",";
      c += '"' + tr.src[i].replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"';
   }
   c += "]";
   var ta = "&texts=" + encodeURIComponent(c);
   s += ta;
   $.ajax({ data: s, dataType: "jsonp", url: "http://api.microsofttranslator.com/V2/Ajax.svc/TranslateArray",
      jsonp: "oncomplete",
      success: function(rsp, st) {
         tr.dst = [];
         for (var i=0; i < rsp.length; ++i) tr.dst.push(rsp[i].TranslatedText);
         callback(tr);
      },
      error: function() { tr.dst = tr.src; }
   });
};
cfos.translate_func = cfos.bing_translate;
// options:
//      validate: function() { return true/false; }  true, if form ok
//      success: function()   // called after successful form submission
//      ajax: function(a)     // $.ajax mock function
//      translate_fields: string or array of field names to be translated
//      id: optional id of <form> to use
cfos.submit_form = function(options) {
   var je;
   if (options && options.id) je = $("#" + options.id);
   else {
      var e = window.event.target || window.event.srcElement;
      do {
         e = e.parentNode;
      } while (e.tagName != "form");
      je = $(e);
   }
   var tr_n = { };
   if (options) {
      if (options.validate && !options.validate()) return false;
      if (typeof(options.translate_fields) == "string") tr_n[options.translate_fields] = true;
      else {
         for (var i=0; i < options.translate_fields.length; ++i) tr_n[options.translate_fields[i]] = true;
      }
   }

   var tr = { src: [], name: [], no_tr: [], no_tr_name: [] };

   function tr_add(n, v) {
      var sl = cfos.ll_lang.replace(/-.*/, "")
      if (tr_n[n] && (sl != "en" && sl != "de")) {
         tr.src.push(v);
         tr.name.push(n);
      }
      else {
         tr.no_tr.push(v);
         tr.no_tr_name.push(n);
      }
   }

   var a = je.find("input,textarea");
   for (var i=0; i < a.length; ++i) {
      var ie = a[i];
      if ((ie.type == "radio" || ie.type == "checkbox") && !ie.checked) continue;
      tr_add(ie.name, ie.value);
   }
   a = je.find("select");
   for (i=0; i < a.length; ++i) {
      var s = a[i];
      for (var j=0; j < s.length; ++j) {
         if (!s.options[j].selected) continue;
         tr_add(s.name, s.options[j].value);
      }
   }
   cfos.translate_func(tr, function (tr) {
      var data = "";
      for (var i = 0; i < tr.name.length; ++i) {
         var nt = tr.src[i] + " [" + tr.dst[i] + "]";
         data += "&" + encodeURIComponent(tr.name[i]) + "=" + encodeURIComponent(nt);
      }
      for (i = 0; i < tr.no_tr_name.length; ++i) {
         data += "&" + encodeURIComponent(tr.no_tr_name[i]) + "=" + encodeURIComponent(tr.no_tr[i]);
      }
      data = data.substr(1);
      var a = { data: data, dataType: "html", error: function (x, t, e) { alert(t + ", " + t + ", " + x.status + " " + x.statusText); },
         type: je.attr("method") || "POST", url: je.attr("action")
      };
      if (options && options.success) a.success = options.success;
      if (options && options.ajax) options.ajax(a);
      else  $.ajax(a);
   });
};

cfos.inject_download_events = function () {
   var aa = document.getElementsByTagName("a");
   for (var i=0; i < aa.length; ++i) {
      var a = aa[i];
      if (a.href && a.href.match(/(\.exe|\.zip|\.msi)/)) {
         var idx = a.href.lastIndexOf('/');
         var n = idx == -1 ? a.href : a.href.substr(idx+1);
         n = n.replace(/['"\s]/g, "");
         if (n.length == 0) continue;
         a.innerHTML = "<span onclick=\"cfos.set_event('download','" + n + "')\">" + a.innerHTML + "</span>";

      }
   }
}

cfos.init_social_buttons = function() {
   var gp = document.getElementById("_gp");
   if (gp) {
      gp.innerHTML = '<g:plusone annotation="none" size="medium"></g:plusone>';
      (function() {
         var lang = cfos.google_lang(cfos.ll_lang);
         if (lang != "" && lang != "en" && lang != "en-us") {
            if (lang == "zh-cn") lang = "zh-CN";
            else if (lang == "zh-tw") lang = "zh-TW";
            window.___gcfg = {lang: lang};
         }
         var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
         po.src = 'https://apis.google.com/js/plusone.js';
         var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
      })();
   }
   var tw = document.getElementById("_tweet");
   if (tw) {
      if (cfos.ll_lang in { nl:1, de:1, fr:1, id:1, it:1, ja:1, ko:1, pt:1, ru:1, es:1, tr:1 })
         tw.innerHTML = '<a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-via="cFosSoftware" data-lang="'
            + cfos.ll_lang + '">Tweet</a>';
      else tw.innerHTML = '<a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-via="cFosSoftware">Tweet</a>';
      var title = $("title").text();
      title = title.replace(/\s*-\s*cFos Software GmbH\s*$/, "");
      title = title.replace(/(\s+-\s+)|(\s*\|\s*)/g, ", ");
      $("#_tweet>a").attr("data-text", title);
      var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
      po.src = 'https://platform.twitter.com/widgets.js';
      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
   }
}

cfos.init = function() {
   this.prot = document.location.protocol;
   if (this.prot == "file:") this.prot = "http:";
   var u = new this.parse_url(window.location.href);
   this.url = u.url; this.query = u.query; this.hash = u.hash;
   for (var i=0; i < this.ll_ret; ++i) this.ret_str += "../";
   this.check_user_id();
   this.initSearch();
   this.lang_selector.init_language();
   if (this.query.indexOf("freeware") != -1 && $('#notifier').length > 0) $('#notifier').css('display', 'inline');
   if (this.query.toLowerCase().indexOf("asrock") != -1) {
      $('.asrock').show();
      this.set_cookie_key('oem', 'asrock');
   }
   this.add_script(this.make_rel("/remote_address.shtml"));
   this.prepare_q(true);
   this.init_social_buttons();
};
cfos.lang_selector = {
   langs: {
      ar: "العربية", "zh-hk": "繁體中文", "zh-tw": "繁體中文", bg: "България", cs: "Česky", de: "Deutsch", el: "Ελληνικά", en: "English", es: "Castellano", fr: "Français", he: "ישראלי",
      hu: "Magyar", it: "Italiano", ja: "日本語", ko: "한국어", nl: "Nederlands", pl: "Polski", "pt-br": "Português Brasileiro", ro: "Română",
      ru: "Русский", sv: "Svenska", th: "ไทย", tr: "Türkçe", id: "Indonesia", uk: "Українська", be: "Беларуская", sl: "Slovenščina", vi: "Tiếng Việt",
      mk: "македонски", hi: "हिन्दी", "zh-cn": "简体中文", "de-ch": "Schweiz", "en-gb": "British English", "es-mx": "Castellano (México)",
      "it-ch": "Italiano (Svizzera)", pt: "Português", "en-au": "Australian English", "fr-ca": "Français (Canada)",
      "en-ca": "Canadian Englisch", "fr-ch": "Français (Suisse)", "en-us": "American English", t1: "test lang1", t2: "test lang2"
   },
   fallback: {
      "zh-hk": "zh-tw", "zh-cn": "zh-tw", "zh-tw": "zh-cn", es: "es-mx", pt: "pt-br,es", "de-ch": "de", "fr-ch": "fr", "it-ch": "it", uk: "ru", be: "ru",
      "fr-ca": "fr", "pt-br": "pt,es", "es-mx": "es"
   },
   get_document_languages: function () {
      var a = $("div._langs").children("a");
      var r = {};
      for (var i = 0; i < a.length; ++i) {
         var h = a[i].getAttribute("href");
         var li = this.parse_link(h, cfos.ll_ret);
         if (li.lang && this.langs[li.lang]) r[li.lang] = true;
      }
      return r;
   },
   get_fallback_languages: function (dest_lang) {
      var l = this.fallback[dest_lang] ? this.fallback[dest_lang].split(',') : [];
      l.unshift(dest_lang); l.push("en");
      return l;
   },
   set_language: function (dest_lang) {
      var d = this.get_document_languages();
      var l = this.get_fallback_languages(dest_lang);
      for (var i = 0; i < l.length; ++i) {
         if (!(l[i] in d)) continue;
         var u = cfos.url.split('/');
         if (u[0] == l[i]) return false;
         u[0] = l[i];
         cfos.set_event("switch_lang", l[i]);
         cfos.allow_track_page_view = false;
         cfos.navigate('/' + u.join('/'));
         return true;
      }
      return false;
   },
   parse_link: function (link, ll_ret) {
      var abs = "";
      if (link.charAt(0) == '/') { link = link.substr(1); abs = '/'; }
      var ua = link.split('/');
      var ofs = 0;
      for (; ofs < ll_ret && ua[ofs] == ".."; ++ofs);
      var lang = "";
      if (ofs == ll_ret && this.langs[ua[ofs]]) lang = ua[ofs];
      return { abs: abs, ofs: ofs, lang: lang, ua: ua };
   },
   patch_links: function (dest_lang) {
      function strip(s, c) {
         var idx = s.lastIndexOf(c);
         return idx == -1 ? s : s.substr(0, idx);
      }
      var a = $("a");
      for (var i = 0; i < a.length; ++i) {
         if ($(a[i]).parent().hasClass("_langs")) continue;
         var h = a[i].getAttribute("href");
         if (!h) continue;
         h = $.trim(h);
         if (h.indexOf("javascript") == 0) continue;
         if (h.indexOf("http") == 0 && !h.match(/^http(s)?:\/\/(www\.)?cfos(speed)?\.(de|com)/)) continue;
         if (!strip(strip(h, '#'), '?').match(/\.s?html?$/)) continue;
         var li = this.parse_link(h, cfos.ll_ret);
         if (!this.langs[li.lang]) continue;
         nl_link = li.ua.join('/');
         target_langs = ',' + (cfos.ll_map[nl_link] || cfos.ll_map_def) + ',';
         var fb = this.get_fallback_languages(dest_lang);
         for (var j = 0; j < fb.length; ++j) {
            if (target_langs.indexOf(fb[j]) == -1) continue;
            li.ua[li.ofs] = fb[j];
            a[i].setAttribute("href", li.abs + li.ua.join('/'));
            break;
         }
      }
      for (var i = 0; i < a.length; ++i) {
         if (!$(a[i]).parent().hasClass("_langs")) continue;
         var h = a[i].getAttribute("href");
         if (!h) continue;
         h = $.trim(h);
         var li = this.parse_link(h, cfos.ll_ret);
         if (!li.lang) continue;
         var o = { lang: li.lang, select: function () { cfos.select_language(this.lang); } };
         a[i].onclick = cfos.delegate(o, o.select);
      }
   },
   init_language: function () {
      cfos.delete_cookie("ln"); //!!!unneccessary after 02/2012
      var dest_lang = cfos.get_cookie_key("l2", "");
      if (dest_lang != "") cfos.set_cookie_key("l2", dest_lang);  // refresh
      else dest_lang = (navigator.language ? navigator.language : navigator.userLanguage).toLowerCase();
      var br_map = { "zh-hans": "zh-cn", "zh-hant": "zh-tw", "zh-chs": "zh-cn", "zh-cht": "zh-tw", "zh-sg": "zh-cn", "zh-mo": "zh-tw" };
      dest_lang = br_map[dest_lang] || dest_lang;
      var doc_lang = cfos.url.split('/')[0];
      // check if document in language tree
      if (this.langs[doc_lang] && doc_lang != dest_lang && cfos.url.indexOf("/order.pl") == -1) {
         if (this.set_language(dest_lang)) return;
         var iu = "/images/flag_sm_" + dest_lang + ".png";
         var res = '(' + this.langs[dest_lang] + '<img id="used_lang_img" style="margin-left:2px" src="' + iu + '" width="18" height="14" alt=""/>)';
         $("#used_lang").html(res);
         $("#used_lang_img").fadeTo("fast", 0.5);
      }
      this.patch_links(dest_lang);
   }
};                  //  lang_selector
cfos.translate = {};

cfos.init();


