var maxCount = 25;
var inRaid = 0;
var outRaid = 0;
var hideBuffs = false;
var maxDebuffCount = -1;
var maxBuffCount = -1;
var showDebuffs = true;
var showBuffs = true;
var myEditPlayer = '';
var myEditPlayerLoc = -1;
var classList = ['DeathKnight', 'Druid', 'Hunter', 'Mage', 'Paladin', 'Priest', 'Rogue', 'Shaman', 'Warlock', 'Warrior'];
var classColor = ['C41E3A', 'FF7C0A', 'AAD372', '68CCEF', 'F48CBA', 'FFFFFF', 'FFF468', '2359FF', '9378C9', 'C5986D'];
var buffColor = ['777777', '00FF00', 'FF9900'];
var buffIcon = ['inactive.gif', 'active.gif', 'maybe.gif'];
var buffText = ['Inactive', 'Active', 'Maybe'];
var roleList = ['Tank', 'Healer', 'Range DPS', 'Melee DPS'];
function wowPlayer (n, c, r, s, d, b, h) {
  this.pName = n;
  this.pClass = c;
  this.pDisClass = classList[c];
  this.pRole = r;
  this.pSpec = s;
  this.pDebuffAbts = d;
  this.pDebuffs = AbilityToDebuff(c, d);
  this.pBuffAbts = b;
  this.pBuffs = AbilityToBuff(c, b);
  this.inRaid = false;
  this.pHash = h;
}
wowPlayer.prototype.pName;
wowPlayer.prototype.pClass;
wowPlayer.prototype.pRole;
wowPlayer.prototype.pSpec;
wowPlayer.prototype.pDebuffs;
wowPlayer.prototype.pDebuffAbts;
wowPlayer.prototype.pBuffs;
wowPlayer.prototype.pBuffAbts
wowPlayer.prototype.inRaid;
wowPlayer.prototype.pHash;
function wowBuff (lvl, data) {
  this.pLvl = lvl;
  this.buffData = data;
}
wowBuff.prototype.pLvl;
wowBuff.prototype.buffData;
String.prototype.format = function() {
  var pattern = /\{\d+\}/g;
  var args = arguments;
  return this.replace(pattern, function(capture){ return args[capture.match(/\d+/)]; });
}
// Formatting Strings
var strPlayerEdit = '<a href=\"javascript:showEditWindow(\'{0}\')\" class=\"nounder\" style=\"border: 0px;\"><img src=\"/images/edit.gif\" title=\"Edit {0}\" class=\"va-top playericon\" /></a>';
var strPlayerImage = '<img src=\"/images/{0}_{1}.gif\" title=\"{2}\" class=\"va-top playericon\" />';
var strBuffImage = '<img src=\"/images/{0}\" title=\"{1}\" class=\"va-mid bufficon\" />';
var strPlayerIconName = '<div class="playerpanel" onMouseOver=\"showUserPanel(\'{4}\');\" onMouseOut=\"hideUserPanel();\" id=\"p_{4}\">{3} <a href=\"javascript:{0}(\'{1}\')\" class=\"nounder\" style=\"border: 0px; color: #{2};\">{4}</a></div>';
var strPlayerName = '{3} <a href=\"javascript:{0}(\'{1}\')\" class=\"nounder\" style=\"border: 0px; color: #{2};\">{4}</a>';
var strBuff = '<tr><td align=\"left\"><strong><span style=\"color: #{0};\">{1}</span></strong></td>{2}</tr><tr><td align=\"right\">{3}</td></tr>';
var strBuffSingle = '<span style=\"color: #{1}\" onMouseOver=\"showBuffPanel(\'{3}\', {4});\" onMouseOut=\"setHideBuffPanel();\" id=\"{3}_{4}\">{0} {2}</span><br>';
var strBuffFull = '<span class=\"font-16\" style=\"color: #{1};\">{0} {2}</span><br /><span class=\"font-14\">{6}</span><br />{5}';
var strBuffPlayer = '{0} - <span class=\"font-10\">{1}</span><br />';
var strRaidList = '<strong>{0}</strong> ({1}):{2}\r';
var strPlayerPanel = 'Buffs:<br />{0}<hr />Debuffs:<br />{1}';
var strPlayerEditPanel = '<form id="editForm">Editing <input type=\"text\" name=\"pName\" value=\"{0}\" />:<br />{3}<hr /><div class=\"col-half col-left\">Buffs:<br />{1}</div><div class=\"col-half col-right\">Debuffs:<br />{2}</div><div class=\"col-clear text-right\"><hr /><input type=\"button\" name=\"exitButton\" value=\"Save\" onClick=\"javascript:saveEditPanel();\" /> <input type=\"button\" name=\"exitButton\" value=\"Cancel/Close\" onClick=\"javascript:hideEditPanel();\" /></div></form>{4}';
var strDataFeedLinkEdit = 'datalink.spc?id={0}&user={1}&hash={2}&cmd={3}&oldname={4}&newname={5}&class={6}&roll={7}&spec={8}&debuff={9}&buff={10}';
var strLinkFormat = 'User Link: http://wowraidsetup.com/?id={0}&user={1}&hash={2}';
var debuffList = [
  'Armor (Major)',			// 0
  'Armor (Minor)',			// 1
  'Physical Vulnerability',		// 2
  'Bleed Damage Increase',		// 3
  'Spell Critical Strike Chance',	// 4
  'Increased Spell Damage Taken',	// 5
  'Increased Spell Hit Chance',		// 6
  'Critical Strike Chance (All)',	// 7
  'Melee Attack Speed Slow',		// 8
  'Melee Hit Chance Reduction',		// 9
  'Reduced Healing',			// 10
  'Reduced Attack Power',		// 11
  'Cast Speed Slow'			// 12
];
var buffList = [
  'Melee Haste',			// 0
  'Melee Critical Strike Chance',	// 1
  'Attack Power (Flat)',		// 2
  'Attack Power (Multiplier)',		// 3
  'Ranged Attack Power',		// 4
  'Spell Haste',			// 5
  'Spell Critical Strike Chance',	// 6
  'Increased Spell Power',		// 7
  'Percentage Haste Increase (All)',	// 8
  'Percentage Damage Increase',		// 9
  'Stat Multiplier (Kings)',		// 10
  'Stat Add (Paw)',			// 11
  'Agility and Strength',		// 12
  'Stamina',				// 13
  'Health',				// 14
  'Intellect',				// 15
  'Spirit',				// 16
  'Damage Reduction Percentage',	// 17
  'Increase Healing Received',		// 18
  'Armor Increase Percentage',		// 19
  'Mana Battery',			// 20
  'Restore Mana (BoW)',			// 21
  'Restore Mana (Mana Tide)'  		// 22
];
function findPos(obj) {
  var curleft = curtop = 0;
  if (obj.offsetParent) {
    do {
      curleft += obj.offsetLeft;
      curtop += obj.offsetTop;
    } while (obj = obj.offsetParent);
  }
  return [curleft,curtop];
}
function loadDefaultArray() {
  myPlayers=new Array();
  for (i in defaultPlayers) {
    myPlayers[i] = defaultPlayers[i];
  }
  displayMemberList();
  displayRaid();
  displayDebuffs();
  displayBuffs();
}
function resetRaid() {
  for (i in myPlayers) {
    myPlayers[i].inRaid = false;
  }
  displayMemberList();
  displayRaid();
  displayDebuffs();
  displayBuffs();
}
function addUser(name) {
  if (inRaid >= maxCount) { exit; }
  for (i in myPlayers) {
    if (myPlayers[i].pName == name) {
      myPlayers[i].inRaid = true;
    }
  }
  displayMemberList();
  displayRaid();
  displayDebuffs();
  displayBuffs();
  hideUserPanel();
  hideBuffPanel();
}
function setRaidSize(sizeOf) {
  maxCount = sizeOf;
}
function removeUser(name) {
  for (i in myPlayers) {
    if (myPlayers[i].pName == name) {
      myPlayers[i].inRaid = false;
    }
  }
  displayMemberList();
  displayRaid();
  displayDebuffs();
  displayBuffs();
  hideUserPanel();
  hideBuffPanel();
}
function AbilityToDebuff(c, abStr) {
  var Result = '';
  var read = '';
  var abt = '';
  for (i = 0; i < abStr.length; i++) {
    abt = abStr.charAt(i);
    if (abt != '0') {
      if (myDebuffs[c + 'x' + i + 'x' + abt] != null) {
        read = myDebuffs[c + 'x' + i + 'x' + abt].pLvl;
      } else {
        read = '0';
      } 
    } else {
      read = '0';
    }
    Result = Result + read;
  }
  return Result;
}
function AbilityToBuff(c, abStr) {
  var Result = '';
  var read = '';
  var abt = '';
  for (i = 0; i < abStr.length; i++) {
    abt = abStr.charAt(i);
    if (abt != '0') {
      if (myBuffs[c + 'x' + i + 'x' + abt] != null) {
        read = myBuffs[c + 'x' + i + 'x' + abt].pLvl;
      } else {
        read = '0';
      } 
    } else {
      read = '0';
    }
    Result = Result + read;
  }
  return Result;
}
function getDisplayIcon(c, s, n, d) {
  if (myAdmin) {
    return strPlayerEdit.format(n) + strPlayerImage.format(String(classList[c]).toLowerCase(), s.toLowerCase(), n + d);
  } else if (n == myUserID) {
    return strPlayerEdit.format(n) + strPlayerImage.format(String(classList[c]).toLowerCase(), s.toLowerCase(), n + d);
  } else {
    return strPlayerImage.format(String(classList[c]).toLowerCase(), s.toLowerCase(), n + d);
  }
}
function getBuffIcon(c) {
  for (i in buffColor) {
    if (buffColor[i] == c) {
      return strBuffImage.format(buffIcon[i], buffText[i]);    
    }
  }
}
function getVisibleIcon(vis, n) {
  if (vis) {
    return '<a href=\"javascript:toggleVisible(\'' + n + '\')\" style=\"border: 0px;\"><img src=\"/images/minus.gif\" style=\"border: 0px;\" /></a>'; 
  } else {
    return '<a href=\"javascript:toggleVisible(\'' + n + '\')\" style=\"border: 0px;\"><img src=\"/images/plus.gif\" style=\"border: 0px;\" /></a>';
  }
}
function toggleVisible(n) {
  if (n == 'buff') { showBuffs = !showBuffs; }
  else if (n == 'debuff') { showDebuffs  = !showDebuffs; }
  displayDebuffs();
  displayBuffs();
}
function displayUserAsLink(n, c, s, f, showGray, showPanel) {
  if (showPanel == true) {
    return strPlayerIconName.format(f, n, classColor[c], getDisplayIcon(c, s, n, ' (' + s + ' ' + classList[c] + ')'), n); 
  } else {
    if (showGray == true) {
      return strPlayerName.format(f, n, buffColor[0], getDisplayIcon(c, s, n, ' (' + s + ' ' + classList[c] + ')'), n);
    } else {
      return strPlayerName.format(f, n, classColor[c], getDisplayIcon(c, s, n, ' (' + s + ' ' + classList[c] + ')'), n);
    }
  }
}
function getMaxDebuffTier() {
  var readDebuff = -1;
  if (maxDebuffCount == -1) {
    for (j in myPlayers) {
      for (i = 0; i < myPlayers[j].pDebuffs.length; i++) {
        readDebuff = parseInt(myPlayers[j].pDebuffs.charAt(i));
        if (readDebuff > maxDebuffCount) { maxDebuffCount = readDebuff; } 
      }
    }
  }
}
function getMaxBuffTier() {
  var readBuff = -1;
  if (maxBuffCount == -1) {
    for (j in myPlayers) {
      for (i = 0; i < myPlayers[j].pBuffs.length; i++) {
        readBuff = parseInt(myPlayers[j].pBuffs.charAt(i));
        if (readBuff > maxBuffCount) { maxBuffCount = readBuff; } 
      }
    }
  }
}
function getSingleDebuff(pos) {
  // Check out formatting output
  var outputStr = strBuffSingle;
  if (arguments.length == 2) {
    outputStr = arguments[1];
  }
  var data = '';
  var color = buffColor[0];
  var newDataIn = '';
  var newDataOut = '';
  var found = false;
  var abt = '';
  var abtDis = 'None';
  // First we check for the primary buff
  for (j in myPlayers) {
    if (myPlayers[j].pDebuffs.charAt(pos) == "1") {
      if (myPlayers[j].inRaid == true) { 
        newDataIn = newDataIn + '\r' + strBuffPlayer.format(displayUserAsLink(myPlayers[j].pName, myPlayers[j].pClass, myPlayers[j].pSpec, 'removeUser', false, false), myDebuffs[myPlayers[j].pClass + 'x' + pos + 'x' + myPlayers[j].pDebuffAbts.charAt(pos)].buffData);
        found = true;
        abt = myPlayers[j].pDebuffAbts.charAt(pos);
        abtDis = myDebuffs[myPlayers[j].pClass + 'x' + pos + 'x' + abt].buffData;        
      } else {
        newDataOut = newDataOut + '\r' + strBuffPlayer.format(displayUserAsLink(myPlayers[j].pName, myPlayers[j].pClass, myPlayers[j].pSpec, 'addUser', true, false), myDebuffs[myPlayers[j].pClass + 'x' + pos + 'x' + myPlayers[j].pDebuffAbts.charAt(pos)].buffData);
      }
    }   
  }
  data = data + '\r<hr />' + newDataIn + newDataOut;
  if (found) {
    color = buffColor[1];    
  }
  // Next we need to step through other (weaker) debuffs
  for (i = 2; i <= maxDebuffCount; i++) {
    newDataIn = '';
    newDataOut = '';
    for (j in myPlayers) {
      if (myPlayers[j].pDebuffs.charAt(pos) == String(i)) {
        if (myPlayers[j].inRaid == true) { 
          newDataIn = newDataIn + '\r' + strBuffPlayer.format(displayUserAsLink(myPlayers[j].pName, myPlayers[j].pClass, myPlayers[j].pSpec, 'removeUser', false, false), myDebuffs[myPlayers[j].pClass + 'x' + pos + 'x' + myPlayers[j].pDebuffAbts.charAt(pos)].buffData);
          if (found == false) {
            color = buffColor[2];
            found = true;
            abt = myPlayers[j].pDebuffAbts.charAt(pos);
            abtDis = myDebuffs[myPlayers[j].pClass + 'x' + pos + 'x' + abt].buffData;
          }
        } else {
          newDataOut = newDataOut + '\r' + strBuffPlayer.format(displayUserAsLink(myPlayers[j].pName, myPlayers[j].pClass, myPlayers[j].pSpec, 'addUser', true, false), myDebuffs[myPlayers[j].pClass + 'x' + pos + 'x' + myPlayers[j].pDebuffAbts.charAt(pos)].buffData);   
        }
      }   
    }
    if ((newDataIn + newDataOut) != '') {
      data = data + '<hr />' + newDataIn + newDataOut;
    }
  }
  return outputStr.format(getBuffIcon(color), color, debuffList[pos], 'd', pos, data, abtDis);
}
function getSingleBuff(pos) {
  // Check out formatting output
  var outputStr = strBuffSingle;
  if (arguments.length == 2) {
    outputStr = arguments[1];
  }
  var data = '';
  var color = buffColor[0];
  var newDataIn = '';
  var newDataOut = '';
  var found = false;
  var abt = '';
  var abtDis = 'None';
  // First we check for the primary buff
  for (j in myPlayers) {
    if (myPlayers[j].pBuffs.charAt(pos) == "1") {
      if (myPlayers[j].inRaid == true) { 
        newDataIn = newDataIn + '\r' + strBuffPlayer.format(displayUserAsLink(myPlayers[j].pName, myPlayers[j].pClass, myPlayers[j].pSpec, 'removeUser', false, false), myBuffs[myPlayers[j].pClass + 'x' + pos + 'x' + myPlayers[j].pBuffAbts.charAt(pos)].buffData);
        found = true;
        abt = myPlayers[j].pBuffAbts.charAt(pos);
        abtDis = myBuffs[myPlayers[j].pClass + 'x' + pos + 'x' + abt].buffData;
      } else {
        newDataOut = newDataOut + '\r' + strBuffPlayer.format(displayUserAsLink(myPlayers[j].pName, myPlayers[j].pClass, myPlayers[j].pSpec, 'addUser', true, false), myBuffs[myPlayers[j].pClass + 'x' + pos + 'x' + myPlayers[j].pBuffAbts.charAt(pos)].buffData);
      }
    }   
  }
  data = data + '\r<hr >' + newDataIn + newDataOut;
  if (found) {
    color = buffColor[1];    
  }
  // Next we need to step through other (weaker) debuffs
  for (i = 2; i <= maxBuffCount; i++) {
    newDataIn = '';
    newDataOut = '';
    for (j in myPlayers) {
      if (myPlayers[j].pBuffs.charAt(pos) == String(i)) {
        if (myPlayers[j].inRaid == true) { 
          newDataIn = newDataIn + '\r' + strBuffPlayer.format(displayUserAsLink(myPlayers[j].pName, myPlayers[j].pClass, myPlayers[j].pSpec, 'removeUser', false, false), myBuffs[myPlayers[j].pClass + 'x' + pos + 'x' + myPlayers[j].pBuffAbts.charAt(pos)].buffData);
          if (found == false) {
            color = buffColor[2];
            abt = myPlayers[j].pBuffAbts.charAt(pos);
            abtDis = myBuffs[myPlayers[j].pClass + 'x' + pos + 'x' + abt].buffData;             
          }
        } else {
          newDataOut = newDataOut + '\r' + strBuffPlayer.format(displayUserAsLink(myPlayers[j].pName, myPlayers[j].pClass, myPlayers[j].pSpec, 'addUser', true, false), myBuffs[myPlayers[j].pClass + 'x' + pos + 'x' + myPlayers[j].pBuffAbts.charAt(pos)].buffData);
        }
      }   
    }
    if ((newDataIn + newDataOut) != '') {
      data = data + '\r<hr />' + newDataIn + newDataOut;
    }
  }
  return outputStr.format(getBuffIcon(color), color, buffList[pos], 'b', pos, data, abtDis);
}
function displayMemberList() {
  var data = "";
  outRaid = 0;
  for (j in classList) {
    for (i in myPlayers) {
      if (myPlayers[i].pClass == j) {
        if (myPlayers[i].inRaid == false) {
          outRaid++;
          data = data + '\r' +
            displayUserAsLink(myPlayers[i].pName, myPlayers[i].pClass, myPlayers[i].pSpec, 'addUser', false, true);        
        }
      }
    }
    // data = data + '<div class=\"margin-div\"></div>'
  }
  document.getElementById('memList').innerHTML = "Members: (" + String(outRaid) + ")<br />" + data;
}
function displayRaid() {
  var data = "";
  inRaid = 0;
  for (r in roleList) {
    var addMe = "";
    var count = 0;
    for (i in myPlayers) {
      if (myPlayers[i].pRole == r) {
        if (myPlayers[i].inRaid == true) {
          inRaid++;
          count++;
          addMe = addMe + '\r' + 
            displayUserAsLink(myPlayers[i].pName, myPlayers[i].pClass, myPlayers[i].pSpec, 'removeUser', true, true);        
        }
      }
    }
    document.getElementById('inRaid_' + r).innerHTML = strRaidList.format(roleList[r], String(count), addMe);
  }
  document.getElementById('inRaid_c').innerHTML = "In Raid: (" + String(inRaid) + ")";
}
function getDisplayDebuffs() {
  var data = "";     
  // Our display list defaults to display everything
  var displayList = "1111111111111"
  // Check if we were passed a display list and validate that it's of the right length
  if (arguments.length == 1) {
    if (displayList.length = arguments[0].length) {
      displayList = arguments[0];
    }
  }
  getMaxDebuffTier();
  for (db in debuffList) {
    // Display the buff if we should
    if (displayList.charAt(db) != '0') {
      data = data + '\r' + getSingleDebuff(db);
    }
  }
  return data;
}
function displayDebuffs() {
  document.getElementById('debuffs').innerHTML = getDisplayDebuffs();
}
function getDisplayBuffs() {
  var data = "";
  // Our display list defaults to display everything
  var displayList = "11111111111111111111111"
  // Check if we were passed a display list and validate that it's of the right length
  if (arguments.length == 1) {
    if (displayList.length = arguments[0].length) {
      displayList = arguments[0];
    }
  }
  getMaxBuffTier();
  for (b in buffList) {
    if (displayList.charAt(b) != '0') {
      data = data + '\r' + getSingleBuff(b);
    }
  }
  return data;
}
function displayBuffs() {
  document.getElementById('buffs').innerHTML = getDisplayBuffs();
}
function showUserPanel(pos) {
  var panBuffs = '';
  var panDebuffs = '';
  var myPos = findPos(document.getElementById('p_' + pos));
  for (player in myPlayers) {
    if (myPlayers[player].pName == pos) {
      panBuffs = getDisplayBuffs(myPlayers[player].pBuffs);
      panDebuffs = getDisplayDebuffs(myPlayers[player].pDebuffs);
    }
  }
  var outputPanel = document.getElementById('pinfo'); 
  outputPanel.innerHTML = strPlayerPanel.format(panBuffs, panDebuffs);
  outputPanel.style.visibility = 'visible';
  outputPanel.style.top = myPos[1] - 2;
  outputPanel.style.left = myPos[0] + 138;
}
function hideUserPanel() {
  document.getElementById('pinfo').style.visibility = 'hidden';
}
function showBuffPanel(whatType, pos) {
  var myPos = findPos(document.getElementById(whatType + '_' + pos));
  hideBuffs = false;
  var outputPanel = document.getElementById('pbuff');
  if (whatType == 'd') {
    outputPanel.innerHTML = getSingleDebuff(pos, strBuffFull);
  } else {
    outputPanel.innerHTML = getSingleBuff(pos, strBuffFull);
  } 
  outputPanel.style.visibility = 'visible';
  outputPanel.style.top = myPos[1] - 2;
  outputPanel.style.left = myPos[0] - 290;
}
function checkHideBuffPanel() {
  if (hideBuffs) { hideBuffPanel(); }
}
function setHideBuffPanel() {
  hideBuffs = true;
  setTimeout(checkHideBuffPanel, 500);
}
function hideBuffPanel() {
  document.getElementById('pbuff').style.visibility = 'hidden';
}
function disableHideBuffPanel() {
  hideBuffs = false;
}
function showEditWindowNew() {
  var player = defaultPlayers[0];
  myEditPlayerLoc = -2;  

  // Get some Placement info
  var leftPan = findPos(document.getElementById("memList"));
  var rightPan = findPos(document.getElementById("buffs"));
  var disWidth = rightPan[0] - leftPan[0] - 158;

  // Hide Other Stuff
  hideBuffPanel();
  hideUserPanel();
  hideAboutPanel();
  hideAdminPanel();

  // Lets Do IT!
  var outputPanel = document.getElementById('pedit');
  outputPanel.style.visibility = 'visible';
  outputPanel.style.top = leftPan[1] + 25;
  outputPanel.style.left = leftPan[0] + 138;
  outputPanel.style.width = disWidth;  
  outputPanel.innerHTML = strPlayerEditPanel.format('', getBuffList(player.pClass, player.pBuffAbts), getDebuffList(player.pClass, player.pDebuffAbts), getClassSpec(player.pClass, player.pSpec), '');
}
function showEditWindow(n) {
  // Get the player to Edit
  var player = null;
  for (i in myPlayers) { 
    if (myPlayers[i].pName == n) { 
      player = myPlayers[i];
      myEditPlayer = n;
      myEditPlayerLoc = i;
    }
  }

  // Get some Placement info
  var leftPan = findPos(document.getElementById("memList"));
  var rightPan = findPos(document.getElementById("buffs"));
  var disWidth = rightPan[0] - leftPan[0] - 158;

  // Hide Other Stuff
  hideBuffPanel();
  hideUserPanel();
  hideAboutPanel();
  hideAdminPanel();

  // Lets Do IT!
  var outputPanel = document.getElementById('pedit');
  outputPanel.style.visibility = 'visible';
  outputPanel.style.top = leftPan[1] + 25;
  outputPanel.style.left = leftPan[0] + 138;
  outputPanel.style.width = disWidth;
  if (player.pHash != 'null') {
    outputPanel.innerHTML = strPlayerEditPanel.format(player.pName, getBuffList(player.pClass, player.pBuffAbts), getDebuffList(player.pClass, player.pDebuffAbts), getClassSpec(player.pClass, player.pSpec), strLinkFormat.format(myGuildID, player.pName, player.pHash)); 
  } else {
    outputPanel.innerHTML = strPlayerEditPanel.format(player.pName, getBuffList(player.pClass, player.pBuffAbts), getDebuffList(player.pClass, player.pDebuffAbts), getClassSpec(player.pClass, player.pSpec), ''); 
  }
}
function hideEditPanel() {
  document.getElementById('pedit').style.visibility = 'hidden';
}
function getDebuffList(c, spec) {
  var Result = '';
  var readValue = '0';
  var j = 1;
  var lineData = '';
  var readBuff = null;

  for (i in debuffList) {
    readValue = spec.charAt(i)
    j = 1;
    lineData = '';
    readBuff = myDebuffs[c + 'x' + i + 'x' + j];
    while (readBuff != null) {
      if (j == readValue) {
        lineData = lineData + '\r<option value=\"' + j + '\" selected>' + readBuff.buffData + '</option>';
      } else {
        lineData = lineData + '\r<option value=\"' + j + '\">' + readBuff.buffData + '</option>';
      }
      j++;
      readBuff = myDebuffs[c + 'x' + i + 'x' + j];
    } 
    if (lineData != '') {
      lineData = '<br />' + debuffList[i] + '<br /><select name=\"d' + i + '\"><option value=\"0\">None</option>' + lineData + '</select><br />';
      Result = Result + '\r' + lineData;
    }   
  }
  return Result;
}
function getBuffList(c, spec) {
  var Result = '';
  var readValue = '0';
  var j = 1;
  var lineData = '';
  var readBuff = null;

  for (i in buffList) {
    readValue = spec.charAt(i)
    j = 1;
    lineData = '';
    readBuff = myBuffs[c + 'x' + i + 'x' + j];
    while (readBuff != null) {
      if (j == readValue) {
        lineData = lineData + '\r<option value=\"' + j + '\" selected>' + readBuff.buffData + '</option>';
      } else {
        lineData = lineData + '\r<option value=\"' + j + '\">' + readBuff.buffData + '</option>';
      }
      j++;
      readBuff = myBuffs[c + 'x' + i + 'x' + j];
    } 
    if (lineData != '') {
      lineData = '<br />' + buffList[i] + '<br /><select name=\"b' + i + '\"><option value=\"0\">None</option>' + lineData + '</select><br />';
      Result = Result + '\r' + lineData;
    }   
  }
  return Result;
}
function getClassSpec(c, s) {
  var classOut = '';
  var specOut = '';

  for (i in classList) {
    if (i == c) {
      classOut = classOut + '\r<option value=\"' + i + '\" selected>' + classList[i] + '</option>';
    } else {
      classOut = classOut + '\r<option value=\"' + i + '\">' + classList[i] + '</option>';
    }
  }
  classOut = '<select name=\"pClass\" onchange=\"updateClassSelect();\">' + classOut + '</select>';

  for (i = c*3; i<((c*3)+3); i++) {
    if (s == defaultPlayers[i].pSpec) {
      specOut = specOut + '\r<option value=\"' + i + '\" selected>' + defaultPlayers[i].pSpec + '</option>';
    } else {
      specOut = specOut + '\r<option value=\"' + i + '\">' + defaultPlayers[i].pSpec + '</option>';
    }
  }
  specOut = '<select name=\"pSpec\">' + specOut + '</select>';

  return classOut + specOut + '<INPUT TYPE=\"button\" NAME=\"csButton\" Value="Load Spec" onClick="loadNewClassSpec();"/>';
}
function updateClassSelect() {
  var form = document.getElementById("editForm"); 
  var cValue = form.pClass.value;
  for (i = cValue*3; i<((cValue*3)+3); i++) {
    form.pSpec.options[i-cValue*3] = new Option(defaultPlayers[i].pSpec, i, (i%3 == 0), false);
  }  
}
function loadNewClassSpec() {
  var outputPanel = document.getElementById('pedit');
  var inputForm = document.getElementById("editForm");
  var pName = inputForm.pName.value;
  var pClass = inputForm.pClass.value;
  var pSpec = inputForm.pSpec.value;

  outputPanel.innerHTML = strPlayerEditPanel.format(pName, getBuffList(pClass, defaultPlayers[pSpec].pBuffAbts), getDebuffList(pClass, defaultPlayers[pSpec].pDebuffAbts), getClassSpec(pClass, defaultPlayers[pSpec].pSpec), '');
}
function saveEditPanel() {
  // If we don't have a player location, exit out;
  if (myEditPlayerLoc == -1) { return null; }

  // Get our Form and our Spec (for the default Array)
  var inputForm = document.getElementById("editForm");
  var pSpec = inputForm.pSpec.value;

  // Get our buff and debuff arrays
  var inputBuffAbt = '';
  for (i in buffList) {
    inputBuffAbt = inputBuffAbt + getValueFromComboBox(inputForm.elements['b' + i]);
  }
  var inputDebuffAbt = '';
  for (i in debuffList) {
    inputDebuffAbt = inputDebuffAbt + getValueFromComboBox(inputForm.elements['d' + i]);
  }

  // Make sure we provide a name!
  if (inputForm.pName.value == '') {
    alert('You must Provide a Name!');
    return null;
  }

  // Make sure that name is ours alone
  for (i in myPlayers) { 
    if (myPlayers[i].pName == inputForm.pName.value) { 
      if (i != myEditPlayerLoc) {
        alert('Player ' + inputForm.pName.value + ' Already Exists!');
        return null;
      } 
    }
  }

  if (myEditPlayerLoc == -2) {
    myPlayers[myPlayers.length] = new wowPlayer(inputForm.pName.value, defaultPlayers[pSpec].pClass, defaultPlayers[pSpec].pRole, defaultPlayers[pSpec].pSpec, inputDebuffAbt, inputBuffAbt, 'null');

    // DB-Link: access to a web page for DB Save
    document.getElementById('datalink').src = strDataFeedLinkEdit.format(myGuildID, myUserID, myGuildSecure, 'addplayer', inputForm.pName.value, inputForm.pName.value, defaultPlayers[pSpec].pClass, defaultPlayers[pSpec].pRole, defaultPlayers[pSpec].pSpec, inputDebuffAbt, inputBuffAbt);
  } else {
    // Save the Data.
    myPlayers[myEditPlayerLoc].pName = inputForm.pName.value;
    myPlayers[myEditPlayerLoc].pClass = defaultPlayers[pSpec].pClass;
    myPlayers[myEditPlayerLoc].pDisClass = defaultPlayers[pSpec].pDisClass;
    myPlayers[myEditPlayerLoc].pRole = defaultPlayers[pSpec].pRole;
    myPlayers[myEditPlayerLoc].pSpec = defaultPlayers[pSpec].pSpec;
    myPlayers[myEditPlayerLoc].pDebuffAbts = inputDebuffAbt;
    myPlayers[myEditPlayerLoc].pDebuffs = AbilityToDebuff(defaultPlayers[pSpec].pClass, inputDebuffAbt);
    myPlayers[myEditPlayerLoc].pBuffAbts = inputBuffAbt;
    myPlayers[myEditPlayerLoc].pBuffs = AbilityToBuff(defaultPlayers[pSpec].pClass, inputBuffAbt);

    // DB-Link: access to a web page for DB Save
    document.getElementById('datalink').src = strDataFeedLinkEdit.format(myGuildID, myUserID, myGuildSecure, 'editplayer', myEditPlayer, inputForm.pName.value, defaultPlayers[pSpec].pClass, defaultPlayers[pSpec].pRole, defaultPlayers[pSpec].pSpec, inputDebuffAbt, inputBuffAbt);
  }

  // Display and Close
  displayMemberList();
  displayRaid();
  displayDebuffs();
  displayBuffs();
  hideEditPanel();
  myEditPlayerLoc = -1;
}
function getValueFromComboBox(cb) {
  if (cb != null) { return cb.value; }
  else { return '0'; }
}
function showAdminPanel() {
  // Get some Placement info
  var leftPan = findPos(document.getElementById("memList"));
  var rightPan = findPos(document.getElementById("buffs"));
  var disWidth = rightPan[0] - leftPan[0] - 158;

  // Hide Other Stuff
  hideBuffPanel();
  hideUserPanel();
  hideAboutPanel();
  hideEditPanel();

  // Display User List
  var form = document.getElementById("pdelete"); 
  for (i in myPlayers) {
    form.player.options[i] = new Option(myPlayers[i].pName, myPlayers[i].pName, (i == 0), false);
  }  

  // Lets Do IT!
  var outputPanel = document.getElementById('padmin');
  outputPanel.style.visibility = 'visible';
  outputPanel.style.top = leftPan[1] + 25;
  outputPanel.style.left = leftPan[0] + 138;
  outputPanel.style.width = disWidth;
}
function hideAdminPanel() {
  document.getElementById('padmin').style.visibility = 'hidden';
}
function showAboutPanel() {
  // Get some Placement info
  var leftPan = findPos(document.getElementById("memList"));
  var rightPan = findPos(document.getElementById("buffs"));
  var disWidth = rightPan[0] - leftPan[0] - 158;

  // Hide Other Stuff
  hideBuffPanel();
  hideUserPanel();
  hideAdminPanel();
  hideEditPanel();

  // Lets Do IT!
  var outputPanel = document.getElementById('pabout');
  outputPanel.style.visibility = 'visible';
  outputPanel.style.top = leftPan[1] + 25;
  outputPanel.style.left = leftPan[0] + 138;
  outputPanel.style.width = disWidth;
}
function hideAboutPanel() {
  document.getElementById('pabout').style.visibility = 'hidden';
}
function checkSetup() {
  // Check to see if we need to load a default state so 
  // new users check out the site!
  if (!myAdmin) {
    // If we're not an admin and we have no users in our array, default state
    if (myPlayers.length == 0) {
      loadDefaultArray();
      showAboutPanel();
    }  
  }
}






