var data;
var primary;
var secondary;

function sorter(a,b) {
  var c = a[primary];   var d = b[primary];
  var e = a[secondary]; var f = b[secondary];
  return ((c < d) ? -1 : ((c > d) ? 1 : (e < f) ? -1 : ((e > f) ? 1 : 0)));
}

function quest(n, t, l, d, o, c, i) {
  this.name = n;    this.difficulty = parseInt(i);
  this.type = t;    this.level = parseInt(l);
  this.creator = c; this.description = d;
  this.location = o;
}

function getData() {
  var xml   = loadXML("/xlib/xml/quests.xml");
  var names = xml.getElementsByTagName("name");
  var types = xml.getElementsByTagName("type");
  var lvls  = xml.getElementsByTagName("lvl");
  var descs = xml.getElementsByTagName("desc");
  var locs  = xml.getElementsByTagName("loc");
  var creas = xml.getElementsByTagName("creator");
  var diffs = xml.getElementsByTagName("diff");

  this['level_quest'] = new Array();
  this['area_quest'] = new Array();

  for (var i=0;i<names.length;i++)
    this[types[i].childNodes[0].nodeValue][this[types[i].childNodes[0].nodeValue].length++] =
                                  new quest(names[i].childNodes[0].nodeValue,
                                            types[i].childNodes[0].nodeValue,
                                            (types[i].childNodes[0].nodeValue=="level_quest"?lvls[i].childNodes[0].nodeValue:0),
                                            descs[i].childNodes[0].nodeValue,
                                            (locs[i].childNodes.length <= 0?" ":locs[i].childNodes[0].nodeValue),
                                            creas[i].childNodes[0].nodeValue,
                                            diffs[i].childNodes[0].nodeValue);
}

function resortLists(sortBy) {
  primary = sortBy;
  switch(sortBy) {
    case 'level':      secondary = 'name';  break;
    case 'name':       secondary = 'level'; break;
    case 'difficulty': secondary = 'level'; break;
  }

  getField("nameSort").style.color='';
  getField("difficultySort").style.color='';
  getField("levelSort").style.color='';
  getField(sortBy+"Sort").style.color='#BEF';

  data.level_quest.sort(sorter);
  data.area_quest.sort(sorter);
}

function generateList(sort) {
  var cFrame = getField("qContentFrame");
  var i;
  var out = '<h2 id="questTypeHeader">Level Quests</h2><div style="width:300px;display:inline-block;"></div><div id="questDiffBar">Difficulty scale: Easy to Hard.</div><br>';

  resortLists(sort);

  for (i=0;i<data.level_quest.length;i++) {
    var name = ucFirst(data.level_quest[i].name);
    var lvl = data.level_quest[i].level;
    var diff = data.level_quest[i].difficulty;

    out += getLink(name, i, diff, lvl, "level");
  }

  out += '<br><br><h2 id="questTypeHeader">Area Quests</h2><div style="width:300px;display:inline-block;"></div><div id="questDiffBar">Difficulty scale: Easy to Hard.</div><br>';

  for (i=0;i<data.area_quest.length;i++) {
    var name = ucFirst(data.area_quest[i].name);
    var diff = data.area_quest[i].difficulty;

    out += getLink(name, i, diff, 0, "area");
  }

  cFrame.innerHTML = out;
  updateTiles();
}

function getLink(name, i, diff, lvl, type) {
  var link = '<a href="?str='+name.replace(/ /g,'+')+'" id="'+type+'Quest" title="'+i+'"><div id="questFrame" class="Quest" title="'+diff+'"><div id="quest';

  if (type == "level") 
    link += 'Level">Level '+lvl+'</div><div id="questNFrame';
  if (type == "area")
    link += 'NFrame2';
    
  link += '"><div id="questName">'+name+'</div></div></div></a>';

  return link;
}

function generateQuest(datum) {
  var popupFrame = getField("popupContent");
  var popupHead = getField("popupHeader");
  var qInfo = '';
  
  qInfo += '<div id="popupField"><span class="qKey">Difficulty:</span> '+difficultyRating(datum.difficulty)+'</div>';
  qInfo += '<div id="popupField"><span class="qKey">Creator:</span> <a href="/help/finger?str='+datum.creator+'">'+ucFirst(datum.creator)+'</a></div>';
  qInfo += (datum.location != " " ? '<div><span class="qKey">Location:</span> '+datum.location+'</div>' : "");
  qInfo += '<div><hr></div>';
  qInfo += '<div class="qPre">'+datum.description+'</div>';

  popupHead.innerHTML = 'Quest: '+ucFirst(datum.name)+' <span class="subtext">[<a href="?str='+datum.name.replace(/ /g,'+')+'">permalink</a>]</span>';
  popupFrame.innerHTML = qInfo;
}

function generateLQuest(i) { generateQuest(data.level_quest[(typeof i == "number"?i:this.title)]);centerPopup();loadPopup();return false; }
function generateAQuest(i) { generateQuest(data.area_quest[(typeof i == "number"?i:this.title)]);centerPopup();loadPopup();return false; }

function difficultyRating(rating) {
  switch(rating) {
    case 1: return "Easy";
    case 2: return "Not Very Hard";
    case 3: return "Challenging";
    case 4: return "Very Hard";
    case 5: return "IMPOSSIBLE!";
  }
}

function updateTiles() {
  var i, q, image, myTitle, myParent, quests;

  quests = getElementsByClass("Quest", "div");

  for(i=0;i<quests.length;i++) {
    myTitle = quests[i].title;
    quests[i].style.backgroundImage = "url('/xlib/img/"+myTitle+".jpg')";
    quests[i].title='Difficulty: '+difficultyRating(parseInt(myTitle));
    
    myParent = quests[i].parentNode;

    if (myParent.id == "areaQuest")
      myParent.onclick = generateAQuest;
    if (myParent.id == "levelQuest")
      myParent.onclick = generateLQuest;
  }
}

function initData() { 
  getField("qOptionFrame").innerHTML = 'Sort Options: [ <a href="javascript:void(0);" id="levelSort" onClick="generateList(\'level\');return false;">Level</a> | <a href="javascript:void(0);" id="nameSort" onClick="generateList(\'name\');return false;">Name</a> | <a href="javascript:void(0);" id="difficultySort" onClick="generateList(\'difficulty\');return false;">Difficulty</a> ]';
  data = new getData();
  resortLists("level");
}
