  // Create associative array of languages
  // id   = unique language identifier
  // code = language code [RFC1766]
  // name = country name

  // Create Kraun Module
  var kraun = {
    name: 'Kraun Module 1.1',

    isNumber: function(strinput) {
      return (typeof parseInt(strinput) == 'number') && isFinite(strinput) && (strinput !== '');
    },

    getQueryString: function(strinput) {
      var querystring = window.location.search.substring(1);
      var elements    = querystring.split("&");

      for (i=0; i<elements.length; i++) {
        element = elements[i].split("=");
        if (element[0] == strinput) {
          return element[1];
        }
      }
    },

    isArray: function(testObject) {
      return testObject && !(testObject.propertyIsEnumerable('length')) && typeof testObject === 'object' && typeof testObject.length === 'number';
    },


    fixHTMLObjects: function() {
      $A(document.getElementsByTagName('object')).each(function(element, index) {
        element.outerHTML = element.outerHTML; 
      });
    }
  };

  var arrLanguages = new Array();
  arrLanguages[0] = '{ "id": "0", "code": "it", "name": "Italiano" }'.evalJSON();
  arrLanguages[1] = '{ "id": "1", "code": "en", "name": "English" }'.evalJSON();

  // Create associative array of menus
  var arrMenus = new Array()

  // Creating 2D arrays of languages menu
  for (i=0; i < arrLanguages.size(); i++) {
    arrMenus[i]=new Array()
  }

  arrMenus[0][1] = ['Home','Home Page','/pages/products/'];
  arrMenus[0][2] = ['Il marchio','Informazioni e comunicati stampa','/pages/corporate/'];
  arrMenus[0][3] = ['Prodotti','Prodotti','/pages/products/'];
  arrMenus[0][4] = ['Punti Vendita','Punti Vendita','/pages/dealers/'];
  arrMenus[0][5] = ['Download','Download','/pages/downloads/'];
  arrMenus[0][6] = ['Supporto tecnico','Supporto Tecnico','/pages/support/'];
  arrMenus[0][7] = ['Contatti','Contatti','/pages/contacts/'];
  arrMenus[0][8] = ['Area Trade','Accesso area riservata','/pages/dealers/reserved/'];

  arrMenus[1][1] = ['Home','Home Page','/pages/products/'];
  arrMenus[1][2] = ['Corporate','About Kraun and Press Releases','/pages/corporate/'];
  arrMenus[1][3] = ['Products','Products','/pages/products/'];
  arrMenus[1][4] = ['Dealers','Dealers','/pages/dealers/'];
  arrMenus[1][5] = ['Downloads','Downloads','/pages/downloads/'];
  arrMenus[1][6] = ['Technical support','Technical Support','/pages/support/'];
  arrMenus[1][7] = ['Contacts','Contacts','/pages/contacts/'];
  arrMenus[1][8] = ['Area Trade','Accesso area riservata','/pages/dealers/reserved/'];

  // Set language object
  objLanguage = LanguageSet(kraun.getQueryString("language"));

  Event.observe(window, 'load', function() {
    init();
  });

  function init() {
    // Show language elements
    $$('[class="language"][lang="' + objLanguage.code + '"]').each(function (element) {
      element.setStyle({
        visibility: 'visible',
        display: 'block'
      });
    });
  }

  function LanguageSet(code) {
    // Verify language code
    if(code == null || code.blank()) {
      // Set default language
      return {"id":arrLanguages[0].id, "code":arrLanguages[0].code, "name":arrLanguages[0].name};
    } else {
      for (var i = 0; i < arrLanguages.length; ++i) {
        if (arrLanguages[i].code == code.toLowerCase()) {
          return {"id":arrLanguages[i].id, "code":arrLanguages[i].code, "name":arrLanguages[i].name};
        }
      }
    }
    // No language matchs, set default language
    return {"id":arrLanguages[0].id, "code":arrLanguages[0].code, "name":arrLanguages[0].name};
  }

  function LanguageChange(code) {
    var location = window.location.toString();

    // Verify if window location includes querystring language option
    if (location.match('language=[a-z]{2}')) 
    {
      // Replace querystring language value
      location = location.sub('language=[a-z]{2}', 'language=' + code);
    } else {
      // Append querystring language value
      if (location.indexOf('?') == -1) {
        location += '?language=' + code;
      } else {
        location += '&language=' + code;
      }
    }
    // Refresh client browser
    document.location.href = location;
  }

  function showAjaxLoader(element) {
    element = $(element);

    var loader;
    var img;

    loader = new Element('span', { 'name': 'loader', 'class': 'loader' });

    if (document.images) {
      img = new Element('img', { 'src': '/img/commons/ajax_loader.gif', 'align': 'absmiddle', 'width': '16', 'height': '16', 'title': 'Loading...', 'border': '0', 'style': 'margin: 0px 5px 0px 5px' });
      loader.appendChild(img);
    }
    Insertion.Bottom(loader, 'Caricamento in corso...');

    element.appendChild(loader);
  }

  function removeAjaxLoader(element) {
    element = $(element);

    // Remove the ajax loader in the element container
    if (element.down('span.loader')) {
      element.down('span.loader').remove();
    }
  }

  function showAjaxError(element, message) {
    element = $(element);

    // Remove ajax loader
    removeAjaxLoader(element);

    // Clear container
    element.update();

    // Set the default error message if omitted
    if (message === undefined) {
      message = 'Errore elaborazione dati, ricaricare la pagina';
    }
    // Create and append the age reload link
    var a = new Element('a', { 'href': 'javascript:document.location.reload()', 'style': 'color: #E00000' }).update(message.escapeHTML());
    new Insertion.Bottom(element, a);
  }

  // Register global responders that will occur on all AJAX requests
  Ajax.Responders.register({
    onCreate: function(request) {
      request['AjaxTimeoutId'+Ajax.activeRequestCount] = window.setTimeout(
        function() {
          // If we have hit the timeout and the AJAX request is active, abort it and let the user know
          if (callInProgress(request.transport)) {
            request.transport.abort();
            // Run the onFailure method if we set one up when creating the AJAX object
            if (request.options['onFailure']) {
              request.options['onFailure'](request.transport, request.json);
            }
          }
        },
        20000 // 10000 = 10 seconds
      );
      // Increment ajax requests counter
      Ajax.activeRequestCount++;
    },
    onComplete: function(request) {
      // Clear the timeout, the request completed ok
      window.clearTimeout(request['AjaxTimeoutId'+Ajax.activeRequestCount]);
      // Decrement ajax requests counter
      Ajax.activeRequestCount--;
    }
  });

  function callInProgress (xmlhttp) {
    switch (xmlhttp.readyState) {
      case 1: case 2: case 3:
        return true;
        break;
      // Case 4 and 0
      default:
        return false;
      break;
    }
  }