var loading = true;
var shop_config = null;
var default_shop_config = {
  "asia":"Asia",
  "eu":"Europe",
  "us":["America", "United States"],
  "special_name_table":{}
};

function changeLocation(area, country, state) {
  if (loading) return;
  
  shoplistHTML = buildHTML(area, country, state);
  $("shop").style.backgroundImage = "url(../../common/images/shop/" + areaImage(area) + ")";

  var e = $("shoplist");
  e.innerHTML = shoplistHTML;

  appearPage("shoplist");
}

function areaImage(area) {
  if (area == shop_config["asia"]) {
    return "asia.gif";
  } else if (area == shop_config["eu"]) {
    return "eu.gif";
  } else {
    return "us.gif"
  }
}

function appearPage(name) {
  Element.hide("shoplist");
  Element.hide("all");
  new Effect.Appear(name, { duration: 0.5 }); 
  /* new Effect.Appear(name, { duration: 0.5, 
   afterFinish: function() {
    $("pageTop").style.top = (document.body.scrollHeight - 136) + "px";
   }}); */
  window.scrollTo(0,0);
}

function buildHTML(area, country, state) {
  if (! country) {
    var result = "";
    var countries = getCountries(area);
    for (var i = 0; i < countries.length; i++) {
      var c = countries[i];
      result += buildCountryHTML(area, c, null, true);
    }
    var o = { 'title': createTitleHTML(area), 'body': result, 'class':'areatitle' };
    return shoplist_template.evaluate(o);
  } else {
    return buildCountryHTML(area, country, state);
  }
}

function buildCountryHTML(area, country, state, isChild) {
  var shops = selectShops(area, country, state);
  var body = "";
  for (var i = 0; i < shops.length; i++) {
    var s = shops[i];
    body += s.HTML;
  }
  if (isChild) {
    var title = createTitleHTML(country);
  } else {
    var title = createTitleHTML(area, country, state);
  }
  var o = { 'title': title, 'body': body };
  return shoplist_template.evaluate(o);
}

function createTitleHTML(area, country, state) {
  var o = { area: area, country: country, location: state, h_area: nameToHash(area), h_country: nameToHash(country) };
  if (! country) {
    return title_template.evaluate(o);
  } else if (! state) {
    return country_title_template.evaluate(o);
  } else {
    return location_title_template.evaluate(o);
  }
}

function selectShops(area, country, state) {
  var result = [];
  for (var i = 0; i < shops.length; i++) {
    var s = shops[i];
    if (s.Area != area) continue;
    if (country && s.Country != country) continue;
    if (state && s.State != state) continue;
    result.push(s);
  }
  return result;
}

function getCountries(area) {
  var tmp = {};
  var result = [];
  for (var i = 0; i < shops.length; i++) {
    var c = shops[i].Country;
    if (shops[i].Area == area && ! tmp[c]) {
      tmp[c] = 1;
      result.push(c);
    }
  }
  return result;
}

function getStates(country) {
  var tmp = {};
  var result = [];
  for (var i = 0; i < shops.length; i++) {
    var s = shops[i].State;
    if (shops[i].Country == country && s != "" && ! tmp[s]) {
      tmp[s] = 1;
      result.push(s);
    }
  }
  result.sort();
  
  return result;
}

function init(conf) {
  if (conf) {
    shop_config = conf;
  } else {
    shop_config = default_shop_config;
  }

  var template_loaded = function(obj) {
    for (var k in obj) {
      window[k] = new Template(obj[k]);
    }
    
    new Ajax.Request("./MBshoplist.txt", 
    { method:'get',
    onSuccess: dataLoaded,
    onFailure: function(){ alert('Can\'t load data. Please try again later...') }
    } );
  }
  new Heredoc("./template.txt", template_loaded, function(){ alert('Can\'t load data. Please try again later...') });
}

function parseTsv(src) {
  var lines = src.split(/\r?\n/);
  var result = [];
  for (var i = 0; i < lines.length; i++) {
    var tokens = lines[i].split("\t");
    for (var j = 0; j < tokens.length; j++) {
      var m = null;
      if (! tokens[j]) {
        tokens[j] = "";
      } else if ((m = tokens[j].match(/"(.+)"/)) != null) {
        tokens[j] = m[1].replace(/""/, '"');
      }
    }
    result.push(tokens);
  }
  return result;
}

function dataLoaded(transport) {
  var src = transport.responseText;

  var data = parseTsv(src);
  var keys = data[0];
  for (var i = 0; i < keys.length; i++) {
    keys[i] = keys[i].replace(/[\r\n]/, "");
  }

  shops = [];
  for (var i = 1; i < data.length; i++) {
    if (! data[i][0]) {
      continue;
    }
    var shop = createShopData(keys, data[i]);
    shops.push(shop);
  }

  showStatesList($("usstates"), shop_config["us"][0], shop_config["us"][1]);
  
  $('main').innerHTML = loaded_template.evaluate();
  loading = false;
  
  parseUriFragment();
  currentUri = location.href;
  window.setInterval("checkUriFragment()", 100);
}

function checkUriFragment() {
  if (currentUri != location.href) {
    currentUri = location.href;
    parseUriFragment();
  }
}

function parseUriFragment() {
  var hash = location.hash;
  var result = null;
  if ((result = hash.match(/#(.+)/)) == null) {
    appearPage("all");
    return;
  }

  var fragment = result[1];
  fragment = fragment.split("/");
  var area = fragment[0];
  var country = fragment[1];
  var state = fragment[2];

  if (area) area = hashToName(area);
  if (country) country = hashToName(country);
  if (state) state = hashToName(state);
  
  if (! dataExists(area, country, state)) {
    appearPage("all");
    return;
  }
  changeLocation(area, country, state);
}

function dataExists(area, country, states) {
  return 0 < selectShops(area, country, states).length;
}

function hashNameTable(namekey) {
  var table = shop_config["special_name_table"];
  if (! namekey) {
    return table;
  }
  
  var k;
  var result = {};
  for(k in table) {
    result[table[k]] = k;
  }
  return result;
}

function hashToName(hash) {
  if (! hash) {
    return "";
  }
    var tbl = hashNameTable();
    if (tbl[hash]) {
        return tbl[hash];
    }
  return hash.replace("_", " ");
}

function nameToHash(name) {
  if (! name) {
    return "";
  }
    var tbl = hashNameTable(true);
    if (tbl[name]) {
        return tbl[name];
    }
    return name.replace(" ", "_");
}

function showStatesList(e, area, country) {
  var html ="";
  var states = getStates(country);
  var o = {area:area, country:country, h_area: nameToHash(area), h_country: nameToHash(country) };
  for (var i = 0; i < states.length; i++) {
    o.state = states[i];
    o.h_state = nameToHash(o.state);
    html += states_template.evaluate(o);
  }
  
  e.innerHTML = html;
  e.show();
}

function createShopData(keys, data) {
  var o = [];
  for (var j = 0; j < keys.length; j++) {
    if (data[j]) {
      o[keys[j]] = data[j].replace(/[\r\n]/, "");
    } else {
      o[keys[j]] = "";
    }
  }

  o['Tel'] = "<li>" + o['Tel1'] + "</li>";
  if (o['Tel2']) {
    o['Tel'] += "<li>" + o['Tel2'] + "</li>";
  }

  if (o['URI']) {
    o['Name'] = '<a href="' + o['URI'] + '" target="blank">' + o['Name'] + '</a>';
  }
  if (o['Location']) {
    o['Name'] += '<span class="area">' +  o['Location'] + '</span>';
  }

  o["HTML"] = shop_template.evaluate(o);

  return o;
}

