var set = new NameGeneratorSet();
var categories = {};
var backgrounds = {};
var previous = null;
var generator = null;
var big = true;
var gender = null;
var format = null;

function selectGenerator(id) {
  var gen = set.getGenerator(id);

  var element = $('div.item:hover');
  var index = element.index();
  var parent = element.parent();

  element.detach();
  element = element.clone();

  if(index > 0) {
    element.insertAfter(parent.children().eq(index - 1));
  } else {
    parent.prepend(element);
  }

  if(gen != null) {
    setGenerator(id, gen);
  } else {
    setMode(0);

    $.get('/d/' + id, {}, function(data) {
      var fullId = data.catId + '/' + data.id;
      setGenerator(fullId, set.addGenerator(fullId, data, true));
    });
  }
}

function setMode(mode) {
  $('#loading-screen').hide();
  $('#generator-screen').hide();

  switch(mode) {
    case 0: $('#loading-screen').show(); break;
    case 1: $('#generator-screen').show(); break;
  }
}

function setGenerator(id, gen) {
  setCookie('last_generator', id, 14);
  $('#gi-header').html(gen.name);

  $('#gi-genders').html('');
  $('#gi-formats').html('');

  if(gen.genders.length > 1) {
    for(var i = 0; i < gen.genders.length; ++i) {
      var className = '';
      if(i == 0) {
        className = "selected";
      }

      $('#gi-genders').append($('<a class="'+className+'" onclick="selectGender(this);">'+gen.genders[i]+'</a>'));
    }
  }

  var prev = null;
  var keys = Object.keys(gen.formats);
  if(keys.length > 1) {
    for(var i = 0; i < keys.length; ++i) {
      var className = '';
      if(i == 0) {
        className = "selected";
      }

      $('#gi-formats').append($('<a class="'+className+'" onclick="selectFormat(this);" data-id="'+keys[i]+'">'+gen.formats[keys[i]].name+'</a>'));
    }
  }

  setMode(1);
  selectBackground(id);

  gender = gen.genders[0];
  format = keys[i];
  generator = gen;

  $('#gi-button').focus();
  if(previous != id) {
    generate();
  }
  previous = id;
}

function selectBackground(id) {
  if(backgrounds.hasOwnProperty(id)) {
    setBackground(backgrounds[id]);
  } else {
    $.get('/b/' + id, {}, function(data) {
      backgrounds[id] = data;
      setBackground(backgrounds[id]);
    });
  }
}

function setBackground(fileName) {
  $('#generator-style').html('body { background-image: url(' + fileName + '); }');
}

function hideFooter() {
  $('.ngn4-footer').hide();
  setCookie('hide_footer', 'yes', 60);
}

function generate() {
  if(generator != null) {
    $('#gi-name').html(generator.generate(format, gender));
  }
}

function updateLists() {
  $('#menu-items').html("Loading...");

  $.get('/l/generators', function(data, err) {
    if(!err) {
      setList(data);
    }
  });
}

function setList(data) {
  // 1. Categories
  var keys = Object.keys(data.categories);
  var items = {};
  $('#menu-items').html('');
  for(var i = 0; i < keys.length; ++i) {
    var key = keys[i];
    var item = $('<div class="item" data-id="'+key+'"><span>'+data.categories[key]+'</span><div class="ngn4-panel"></div></div>');

    items[key] = item;
    $('#menu-items').append(item);

    categories[key] = data.categories[key];
  }

  // 2. Sub menus
  keys = Object.keys(data.generators);
  for(var i = 0; i < keys.length; ++i) {
    var key = keys[i];
    var item = $('<a href="javascript:selectGenerator(\''+key+'\')">'+data.generators[key]+'</a>');

    $('div', items[key.split('/')[0]]).append(item);
  }

  applyMediaQueries(true);
}

function applyMediaQueries(force) {
  var mq = window.matchMedia("(max-width: 980px)");

  if(typeof(force) !== 'boolean') {
    force = false;
  }

  if (mq.matches && (!big || force)) {
    $('#menu-items .item').each(function(index) {
      $('span', this).html($(this).data('id').toUpperCase());
    });

    big = true;
  }

  if (!mq.matches && (big || force)) {
    $('#menu-items .item').each(function(index) {
      $('span', this).html(categories[$(this).data('id')]);
    });

    big = false;
  }
}

function selectGender(elem) {
  gender = $(elem).text();

  $('#gi-genders a.selected').attr('class', '');
  $(elem).attr('class', 'selected');
}

function selectFormat(elem) {
  format = $(elem).data('id');

  $('#gi-formats a.selected').attr('class', '');
  $(elem).attr('class', 'selected');
}

$(document).ready(function() {
  if(getCookie('hide_footer') === 'yes') {
    $('.ngn4-footer').hide();
  }

  if(inited !== true) {
    var lastGenerator = getCookie('last_generator');
    if(lastGenerator.length > 0) {
      selectGenerator(lastGenerator);
    } else {
      selectGenerator('default');
    }

    updateLists();
  } else {
    var fullId = initData.catId + '/' + initData.id;
    setGenerator(fullId, set.addGenerator(fullId, initData, true));

    setList(genList);
  }
});

$(window).resize(applyMediaQueries);

// http://www.w3schools.com/js/js_cookies.asp
function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
    }
    return "";
}
function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+d.toUTCString();
    document.cookie = cname + "=" + cvalue + "; " + expires;
}