function trim(s) {
  return s.replace(/^\s*/, '').replace(/\s*$/, '');
}

function addLoadEvent(func) {
  var oldonload = window.onload;

  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {

      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

function getCookie(name) {
  var value = null;
  var cookies = document.cookie.split(';');
  name += "=";

  for(var i = 0; i < cookies.length; i++) {
    var cookie = trim(cookies[i]);

    if (cookie.indexOf(name) == 0) {
      value = cookie.substring(name.length, cookie.length);
      break;
    }
  }
  return value;
}

function setCookie(name, value, days, domain) {
  var expires = "";

  if (days) {
    var date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    expires = '; expires=' + date.toGMTString();
  }
  domain = domain == null ? '' : ('; domain=' + domain);
  document.cookie = name + '=' + value + expires + '; path=/' + domain;
}

function getParameter(parameterName) {
  var parameter = null;
  var parameters = document.location.search.substring(1, document.location.search.length).split("&");

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

    if (parameters[i].indexOf(parameterName + '=') == 0) {
      parameter = parameters[i].substr((parameterName + '=').length);
      break;
    }
  }
  return parameter;
}

function getCustomQuery() {
  var query = '';
  var blacklistParameters = new Object();
  blacklistParameters['storeId'] = true;
  blacklistParameters['catalogId'] = true;
  blacklistParameters['langId'] = true;
  blacklistParameters['categoryId'] = true;
  blacklistParameters['productId'] = true;
  blacklistParameters['ok'] = true;
  blacklistParameters['uk'] = true;
  blacklistParameters['suk'] = true;
  blacklistParameters['wtMssOutletId'] = true;
  blacklistParameters['redirect'] = true;
  blacklistParameters['outletId'] = true;
  blacklistParameters['destination'] = true;
  blacklistParameters['outletid'] = true;
  blacklistParameters['target'] = true;
  blacklistParameters['query'] = true;
  blacklistParameters[''] = true;
  var parameters = document.location.search.substring(1, document.location.search.length).split('&');

  for (var i = 0; i < parameters.length; i++) {
    keyValue = parameters[i].split('=');

    if (blacklistParameters[keyValue[0]] != true) {
      query += '&' + parameters[i];
    }
  }
  return query;
}

function prepareStoreSelect() {
  focused = document.getElementById('store_select').focused;
}

function toggleStoreSelect() {

  if (!focused) {
    var element = document.getElementById('store_select');
    element.style.display = 'block';
    element.focus();
  }
}

function storeSelected(value, text) {
  document.getElementById('store_submit').focus();
  document.storeForm.outletId.value = value;
  document.getElementById('store_selected_text').innerHTML = trim(text);
}

function storeKeyup(event) {
  repeat = false;
  var keyCode = event.which ? event.which : event.keyCode;

  if (keyCode == 13 || keyCode == 32) {
    var element = document.getElementById('store_select');
    storeSelected(element.value, element.options[element.selectedIndex].text);
  }
};

function storeKeypress(event, indent) {
  var keyCode = event.which ? event.which : event.keyCode;
  var element = document.getElementById('store_select');

  if (repeat && search.length == 1) {
    selectNextIndex(search, element, indent);
  } else {
    var newTimestamp = new Date().getTime();

    if (searchTimestamp + 750 < newTimestamp) {
      search = '';
    }
    searchTimestamp = newTimestamp;
    search += String.fromCharCode(keyCode);
    selectIndex(search, element, indent);
  }
  repeat = true;
};

function selectIndex(search, select, indent) {

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

    if (select.options[i].text.substr(indent, search.length).toLowerCase() == search.toLowerCase()) {
      select.selectedIndex = i;
      break;
    }
  }
}

function selectNextIndex(search, select, indent) {
  var selectedIndex = select.selectedIndex;
  var selected = false;

  for (var i = selectedIndex + 1; i < select.options.length; i++) {

    if (select.options[i].text.substr(indent, search.length).toLowerCase() == search.toLowerCase()) {
      selected = true;
      select.selectedIndex = i;
      break;
    }
  }

  if (!selected) {
    selectIndex(search, select, indent);
  }
}

function toggleBoxMiddle() {
  var element = document.getElementById('box_middle');

  if (element.style.display == 'none') {
    element.style.display = 'block';
  } else {
    element.style.display = 'none';
  }
}

function setContextOutletId(outletId) {
  contextOutletId = outletId;
}

function setLanguageId(langId) {
  languageId = langId;
}

function addOutlet(outletId, storeId, catalogId, reservation) {
  var outlet = new Object();
  outlet.storeId = storeId;
  outlet.catalogId = catalogId;
  outlet.reservation = reservation;
  outlets[outletId] = outlet;
}

function replaceParameters(query) {
  var queryElements = query.split('%');
  query = '';

  for (var i = 0; i < queryElements.length; i++) {
    var queryElement = queryElements[i];

    if (queryElement.indexOf('=') == -1) {
      queryElement = getParameter(queryElement);
      queryElement = queryElement == null ? '' : queryElement;
    }
    query += queryElement;
  }
  return query;
}

function redirectStore(outletId) {
  var outlet = outlets[outletId];
  var result = outlet != null;

  if (result) {
    var destination = getParameter('destination');
    var ok = getParameter('ok');
    var uk = getParameter('uk');
    var suk = getParameter('suk');
    
    var id = sitemap[destination] ? destination : sitemap[suk] ? suk : sitemap[uk] ?uk : sitemap[ok] ? ok : null;
    var sitemapEntry = sitemap[id];

    if (sitemapEntry == null) {

      for (var entry in sitemap) {
        sitemapEntry = sitemap[entry];
        break;
      }
    }

    var protocol = sitemapEntry.ssl ? 'https' : 'http';
    var path = window.location.pathname;
    path = path.substring(0, path.lastIndexOf('/') + 1);
    var servlet = 'main';
    var customQuery = getCustomQuery();
    var query = sitemapEntry.parameters.replace(/%outletId%/g, outletId);
    query = replaceParameters(query);
    
    if (uk == 'S_SHOPPINGLIST' && outlet.reservation) {
      query = query.replace(/S_SHOPPINGLIST/g, 'S_RESERVATIONLIST');
    }

    if (sitemapEntry.externalUrl == null) {
      query = 'storeId=' + outlet.storeId + '&catalogId=' + outlet.catalogId + '&langId=' + languageId + '&' + query;
    }
    var url = sitemapEntry.externalUrl ? sitemapEntry.externalUrl : protocol + '://' + window.location.host + path + servlet;
    var topDomain = window.location.hostname;
    topDomain = topDomain.substring(topDomain.substring(0, topDomain.lastIndexOf('.')).lastIndexOf('.') + 1);
    //setCookie('outletId', outletId, 30); TODO use this cookie as soon as saturn3 storelocator has been switched off
    setCookie('SATURN_OUTLETID', outletId, 30, topDomain);
    // saturn3 content requires this cookie to redirect to our saturn4 content:
    setCookie('HOME', outletId, 30, topDomain);
    window.location.href = url + '?' + query + customQuery;
  }
  return result;
}

function selectStore(outletId) {
  var result = false;
  var select = document.getElementById('store_select');

  for (var i = 0; i < select.options.length; i++) {
    var option = select.options[i];

    if (option.value == outletId) {
      select.selectedIndex = i;
      storeSelected(outletId, option.text);
      result = true;
      break;
    }
  }
  return result;
}

function autoRedirectStore() {
  var redirect = getParameter('redirect');
  var outletId = getParameter('outletId');
  //var cookieOutletId = getCookie('outletId'); TODO use this cookie as soon as saturn3 storelocator has been switched off
  var cookieOutletId = getCookie('SATURN_OUTLETID');

  if (redirect == null || redirect.toLowerCase() != 'false') {
    redirectStore(outletId) || redirectStore(contextOutletId) || redirectStore(cookieOutletId);
  }
  addLoadEvent(function() {
    selectStore(outletId) || selectStore(contextOutletId) || selectStore(cookieOutletId);
  });
}

function submitStore(outletId) {
  var outlet = outlets[outletId];

  if (outlet == null) {
    alert(unescape('Bitte w%E4hlen Sie einen Markt aus!'));
  } else {
    redirectStore(outletId);
  }
  return false;
}

function addSitemap(id, ssl, parameters, externalUrl) {
  var entry = new Object();
  entry.ssl = ssl;
  entry.parameters = parameters;
  entry.externalUrl = externalUrl;
  sitemap[id] = entry;
}

var focused = false;
var contextOutletId = null;
var languageId = -3;
var outlets = new Object();
var sitemap = new Object();
var search = '';
var searchTimestamp = 0;
var repeat = false;
