String.prototype.trim = function() {
   return this.replace(/^\s+|\s+$/g, '')
}

function create_thunk_three(f, a, b, c)
{
   return function()
   {
      return f(a, b, c);
   }
}

function create_thunk_four(f, a, b, c, d)
{
   return function()
   {
      return f(a, b, c, d);
   }
}

function add_message(div_id, msg_id, message)
{
   var msg = document.getElementById(msg_id);
   if (msg)
   {
      msg.parentNode.removeChild(msg);
   }

   var d = document.getElementById(div_id);
   var newdiv = document.createElement('div');
   newdiv.setAttribute('id', msg_id);
   newdiv.innerHTML = message;
   d.appendChild(newdiv);
}

function validate_field(field, div_id, msg_id, message)
{
   if (field.value == null || field.value.trim() == "")
   {
      add_message(div_id, msg_id, message);

      return false;
   }

   field.value = field.value.trim();
   return true;
}

function validate_security_answer(form)
{
   var tmp = validate_field(form.ch_answer, 'ch_form', 'ch_err',
      'Answer required.');
   if (tmp)
   {
      document.getElementById('ch_answer_h').value =
         hex_md5(document.getElementById('ch_answer').value);
      document.getElementById('ch_answer').value = "";
   }

   return tmp;
}

function validate_new_password_chpwd(form)
{
   var valid = validate_field(form.ch_pwd, 'ch_form', 'ch_err',
      'New password required.');
   valid = valid && validate_field(form.ch_confirm, 'ch_form', 'ch_err',
      'Confirm new password.');

   if (valid)
   {
      if (form.ch_pwd.value != form.ch_confirm.value)
      {
         add_message('ch_form', 'ch_err', "Passwords do not match.");
         valid = false;
      }
      else
      {
         document.getElementById('ch_pwd_h').value =
            hex_md5(document.getElementById('ch_pwd').value);
         document.getElementById('ch_pwd').value = "";
         document.getElementById('ch_confirm').value = "";
      }
   }

   return valid;
}

function validate_account_password_chpwd(form)
{
   var valid = validate_field(form.cur_pwd, 'pwd_form', 'error',
      'Current password required.');
   valid = valid && validate_field(form.new_pwd, 'pwd_form', 'error',
      'New password required.');
   valid = valid && validate_field(form.con_pwd, 'pwd_form', 'error',
      'Confirm new password.');

   if (valid)
   {
      if (form.new_pwd.value != form.con_pwd.value)
      {
         add_message('pwd_form', 'error',
            "New and confirmed passwords do not match.");
         valid = false;
      }
      else
      {
         document.getElementById('cur_pwd_h').value =
            hex_md5(document.getElementById('cur_pwd').value);
         document.getElementById('cur_pwd').value = "";
         document.getElementById('new_pwd_h').value =
            hex_md5(document.getElementById('new_pwd').value);
         document.getElementById('new_pwd').value = "";
         document.getElementById('con_pwd').value = "";
      }
   }

   return valid;
}

function validate_account_sec_ans(form)
{
   var valid = validate_field(form.sec_pwd, 'sec_form', 'error',
      'Password required.');
   valid = valid && validate_field(form.sec_q, 'sec_form', 'error',
      'Security question required.');
   valid = valid && validate_field(form.sec_a, 'sec_form', 'error',
      'Security answer required.');

   if (valid)
   {
      document.getElementById('sec_pwd_h').value =
         hex_md5(document.getElementById('sec_pwd').value);
      document.getElementById('sec_pwd').value = "";
      document.getElementById('sec_a_h').value =
         hex_md5(document.getElementById('sec_a').value);
      document.getElementById('sec_a').value = "";
   }

   return valid;
}

function validate_point_adj(form)
{
   var valid = validate_field(form.point_adj_reason, 'point_adj_form',
      'error', 'Reason not provided.');
   valid = valid && validate_field(form.point_adj_amount, 'point_adj_form',
      'error', 'Amount required.');

   if (!isSignedInteger(form.point_adj_amount.value))
   {
      add_message('point_adj_form', 'error', "Invalid amount provided.");
      valid = false;
   }

   return valid;
}

function validate_account_char(form)
{
   var valid = validate_field(form.char_name, 'char_form_div', 'error',
      'Character name required.');

/*
   if (!isAlpha(form.char_name.value))
   {
      add_message('char_form_div', 'error', "Illegal characters in name.  Please use only alphabetical characters.");
      valid = false;
   }
*/

   return valid;
}

function validate_event(form)
{
   var valid = validate_field(form.event_title, 'event_form', 'error',
      'Title should not be blank.');
   valid = valid && validate_field(form.event_time, 'event_form', 'error',
      'Date missing.');

   return valid;
}

function change_role(select)
{
   var iddiv = document.getElementById('selected_char_id');
   if (iddiv && select)
   {
      var oldrolediv = document.getElementById('role_div' + iddiv.value);
      var newrolediv = document.getElementById('role_div' + select.value);

      if (oldrolediv && newrolediv)
      {
         oldrolediv.style.display = "none";
         newrolediv.style.display = "block";
         iddiv.value = select.value;
      }
   }
}

function change_item_list(select)
{
   var iddiv = document.getElementById('selected_boss');
   if (iddiv && select)
   {
      var olditemdiv =
         document.getElementById('award_item_list' + iddiv.value);
      var newitemdiv =
         document.getElementById('award_item_list' + select.value);

      if (olditemdiv && newitemdiv)
      {
         olditemdiv.style.display = "none";
         newitemdiv.style.display = "block";
         iddiv.value = select.value;
      }
   }
}

function validate_news_item(form)
{
   var valid = validate_field(form.news_title, 'news_form', 'error',
      'Title should not be blank.');

   return valid;
}

function get_object_by_id(id)
{
   if (document.getElementById)
   {
      var returnVar = document.getElementById(id);
   }
   else if (document.all)
   {
      var returnVar = document.all[id];
   }
   else if (document.layers)
   {
      var returnVar = document.layers[id];
   }
   return returnVar;
}

function toggle_id(id)
{
   var div = get_object_by_id(id)

   div.style.display =
      (div.style.display == "none" ||
      (div.style.display == '' && div.offsetWidth == 0)) ? "block" : "none";
   return div.style.display;
}

function toggle_raid_attend_id(arr, id, inprefix, outprefix)
{
   var sty = toggle_id(inprefix + id);
   toggle_id(outprefix + id);
   arr[id] = sty == "block";
}

function validate_application(form)
{
   var valid = validate_field(form.app_name, 'name_div', 'error',
      'Character name required.');
   valid = valid && validate_field(form.app_pwd, 'pwd_div', 'error',
      'A password is required.');
   valid = valid && validate_field(form.app_pwd_conf, 'conf_div', 'error',
      'Please confirm your selected password.');
   valid = valid && validate_field(form.app_sec, 'sec_div', 'error',
      'A security question is required.');
   valid = valid && validate_field(form.app_ans, 'ans_div', 'error',
      'An answer to your security question is required.');

   if (valid)
   {
      if (!isAlpha(form.app_name.value))
      {
         add_message('name_div', 'error', "Illegal characters in name.  Please use only alphabetical characters.");
         valid = false;
      }
      else if (form.app_pwd.value != form.app_pwd_conf.value)
      {
         add_message('conf_div', 'error', "Passwords do not match.");
         valid = false;
      }
      else
      {
         document.getElementById('pwd_h').value =
            hex_md5(document.getElementById('app_pwd').value);
         document.getElementById('app_pwd').value = "";
         document.getElementById('app_pwd_conf').value = "";
         document.getElementById('ans_h').value =
            hex_md5(document.getElementById('app_ans').value);
         document.getElementById('app_ans').value = "";
      }
   }
   else
   {
      scroll(0,0);
   }

   return valid;
}

function toggle_group(group_name, that)
{
   var cont = document.getElementById('memberbox');
   var groups = getElementsByClassName("group_" + group_name,
      "div", cont);
   for (var i = 0, j = groups.length; i < j; i++)
   {
      groups[i].style.display = (that.checked ? "block" : "none");
   }
}

function filter_checked(labels)
{
   for (var i = 0, len = labels.length; i < len; i++)
   {
      var cbox = document.getElementById('filter_' + labels[i]);
      if (cbox)
      {
         toggle_group(labels[i], cbox);
      }
   }
}

function get_filter_string(labels)
{
   var fstr = "";
   for (var i = 0, len = labels.length; i < len; i++)
   {
      var cbox = document.getElementById('filter_' + labels[i]);
      fstr = fstr + (cbox && cbox.checked ? "1" : "0");
   }

   return fstr;
}

function validate_new_char_raid(form, id_arr)
{
   var tmp = validate_field(form.new_char_name, 'new_char_form', 'error',
      'Name required.');
   if (tmp)
   {
      var str = create_id_string(id_arr);
      document.getElementById('new_char_list').value = str;
      document.getElementById('new_char_title').value =
         document.getElementById('new_raid_title').value;
      document.getElementById('new_char_inst').value =
         document.getElementById('new_raid_inst').value;
   }
   return tmp;
}

function validate_new_char(form)
{
   var tmp = validate_field(form.new_char_name, 'new_char_form', 'error',
      'Name required.');
   return tmp;
}

function validate_award(form)
{
   var valid = validate_field(form.award_points, 'award_form', 'error',
      'Amount required.');
   if (valid && !isNumber(form.award_points.value))
   {
      add_message('award_form', 'error', "Invalid amount provided.");
      valid = false;
   }
   return valid;
}

function validate_bid_info(form)
{
   var valid = validate_field(form.bid_info, 'bid_info_form', 'error',
      'Bid information required.');
   return valid;
}

function validate_new_raid(form, id_arr)
{
   var tmp = validate_field(form.new_raid_title, 'new_raid_form', 'error',
      'Title required.');
   if (tmp)
   {
      var str = create_id_string(id_arr);
      document.getElementById('new_raid_list').value = str;
   }
   return tmp;
}

function create_id_string(id_arr)
{
   var str = "";

   for (var i = 0, j = id_arr.length; i < j; i++)
   {
      str = str + (id_arr[i] ? (":" + i) : "");
   }

   return str.substring(1, str.length);
}

function Member(name, id, gid, label, sid, create, create_format,
   last, last_format)
{
   this.name = name;
   this.id = id;
   this.gid = gid;
   this.label = label;
   this.sid = sid;
   this.create = create;
   this.create_format = create_format;
   this.last = last;
   this.last_format = last_format;
}

function RaidMember(toon_id, toon_name, points, class_id, times)
{
   this.toon_id = toon_id
   this.name = toon_name
   this.points = points
   this.times = times
   this.class_id = class_id
}

function Group(name, id)
{
   this.name = name;
   this.id = id;
}

function Subrank(gid, sid, desc)
{
   this.gid = gid;
   this.sid = sid;
   this.desc = desc;
}

function PointEntry(name, points, id, cid)
{
   this.name = name;
   this.points = points;
   this.id = id;
   this.cid = cid;
}

function UserStats(name, signups, attends, noshows)
{
   this.name = name;
   this.signups = signups;
   this.attends = attends;
   this.noshows = noshows;
}

function construct_group_labels(groups, subranks)
{
   var group_labels = new Array()
   for (var i = 0, len = groups.length; i < len; i++)
   {
      var prefix = groups[i].name;
      var labels = new Array();

      for (var j = 0, slen = subranks.length; j < slen; j++)
      {
         if (subranks[j].gid == groups[i].id)
         {
            var suffix = subranks[j].desc == "" ? ""
               : (" (" + subranks[j].desc + ")");
            labels[subranks[j].sid] = prefix + suffix;
         }
      }

      group_labels[groups[i].id] = labels;
   }

   return group_labels;
}

function change_group(select, mid, home_url, labels)
{
   var filter_string = get_filter_string(labels);
   var newgroup = select.value;
   var g_id = newgroup.substring(0, newgroup.indexOf(':'))
   var s_id = newgroup.substring(newgroup.indexOf(':') + 1)

   location.href =
      home_url + "/php/change_group.php?id=" + mid + "&gid=" + g_id
      + "&sid=" + s_id + "&fstr=" + filter_string;
}

function create_group_dropdown(subranks, group_labels, member_data,
   home_url, labels)
{
   var div = document.createElement('div');
   var select = document.createElement('select');

   for (var i = 0, len = subranks.length; i < len; i++)
   {
      var option = document.createElement("option");
      option.value = subranks[i].gid + ":" + subranks[i].sid;
      option.innerHTML = group_labels[subranks[i].gid][subranks[i].sid];
      option.selected = subranks[i].gid == member_data.gid &&
         subranks[i].sid == member_data.sid;
      select.appendChild(option);
   } 

   select.onchange =
      create_thunk_four(change_group, select, member_data.id, home_url,
         labels);

   div.appendChild(select);
   return div;
}

function display_members(m_data, boxname, sortf, groups, subranks, labels,
   home_url)
{
   var member_data = m_data.sort(sortf);
   var group_labels = construct_group_labels(groups, subranks);
   var mbox = document.getElementById(boxname);
   if (mbox)
   {
      for (var i = mbox.childNodes.length - 1; i >= 0; i--)
      {
         mbox.removeChild(mbox.childNodes[i]);
      }
      for (var i = 0, len = member_data.length; i < len; i++)
      {
         var newdiv = document.createElement('div');
            newdiv.className = "member group_" + member_data[i].label;
         var namediv = document.createElement('div');
            namediv.className = "member_name";
            namediv.innerHTML =
               "<a href=\"" + home_url + "/php/view_member.php?id=" +
               member_data[i].id + "\">" + member_data[i].name + "</a>";
         newdiv.appendChild(namediv);
         var joindiv = document.createElement('div');
            joindiv.className = "member_join";
            joindiv.innerHTML = member_data[i].create_format;
         newdiv.appendChild(joindiv);
         var lastdiv = document.createElement('div');
            lastdiv.className = "member_last";
            lastdiv.innerHTML = member_data[i].last_format;
         newdiv.appendChild(lastdiv);
         var grpdiv =
               create_group_dropdown(subranks, group_labels,
                  member_data[i], home_url, labels);
            grpdiv.className = "member_group";
         newdiv.appendChild(grpdiv);
         var deldiv = document.createElement('div');
            deldiv.className = "member_delete";
            var del_link = document.createElement('a');
            del_link.href = home_url + "/php/remove_member.php?id=" +
               member_data[i].id;
            del_link.innerHTML = "delete";
            del_link.onclick =
               create_thunk_three(delete_user, member_data[i], home_url,
                  labels);
            deldiv.appendChild(del_link);
         newdiv.appendChild(deldiv);
         var clrdiv = document.createElement('div');
            clrdiv.className = "clear";
         newdiv.appendChild(clrdiv);
         mbox.appendChild(newdiv);
      }
   }
}

function display_stats(s_data, boxname, sortf)
{
   var stats_data = s_data.sort(sortf);
   var mbox = document.getElementById(boxname);
   if (mbox)
   {
      for (var i = mbox.childNodes.length - 1; i >= 0; i--)
      {
         mbox.removeChild(mbox.childNodes[i]);
      }
      for (var i = 0, len = stats_data.length; i < len; i++)
      {
         var newdiv = document.createElement('div');
            newdiv.className = "stats_item" + (i % 2 == 0 ? "" : " stats_odd");
         var namediv = document.createElement('div');
            namediv.className = "stats_name";
            namediv.innerHTML = stats_data[i].name;
         newdiv.appendChild(namediv);

         /* ONE WEEK */
         var onediv = document.createElement('div');
            onediv.className = "stats_group";
         var signupdiv = document.createElement('div');
            signupdiv.className = "signup";
            signupdiv.innerHTML =
               stats_data[i].signups[ONEWEEK][0] +
                  " (" + Math.round(stats_data[i].signups[ONEWEEK][1] * 100) + "%)";
         onediv.appendChild(signupdiv);
         var attenddiv = document.createElement('div');
            attenddiv.className = "attend";
            attenddiv.innerHTML =
               stats_data[i].attends[ONEWEEK][0] +
                  " (" + Math.round(stats_data[i].attends[ONEWEEK][1] * 100) + "%)";
         onediv.appendChild(attenddiv);
         var noshowdiv = document.createElement('div');
            noshowdiv.className = "noshow";
            noshowdiv.innerHTML = stats_data[i].noshows[ONEWEEK];
         onediv.appendChild(noshowdiv);
         newdiv.appendChild(onediv);

         /* TWO WEEKS */
         var twodiv = document.createElement('div');
            twodiv.className = "stats_group";
         var signupdiv = document.createElement('div');
            signupdiv.className = "signup";
            signupdiv.innerHTML =
               stats_data[i].signups[TWOWEEKS][0] +
                  " (" + Math.round(stats_data[i].signups[TWOWEEKS][1] * 100) + "%)";
         twodiv.appendChild(signupdiv);
         var attenddiv = document.createElement('div');
            attenddiv.className = "attend";
            attenddiv.innerHTML =
               stats_data[i].attends[TWOWEEKS][0] +
                  " (" + Math.round(stats_data[i].attends[TWOWEEKS][1] * 100) + "%)";
         twodiv.appendChild(attenddiv);
         var noshowdiv = document.createElement('div');
            noshowdiv.className = "noshow";
            noshowdiv.innerHTML = stats_data[i].noshows[TWOWEEKS];
         twodiv.appendChild(noshowdiv);
         newdiv.appendChild(twodiv);

         /* THIRTY DAYS */
         var thirtydiv = document.createElement('div');
            thirtydiv.className = "stats_group";
         var signupdiv = document.createElement('div');
            signupdiv.className = "signup";
            signupdiv.innerHTML =
               stats_data[i].signups[THIRTYDAYS][0] +
                  " (" + Math.round(stats_data[i].signups[THIRTYDAYS][1] * 100) + "%)";
         thirtydiv.appendChild(signupdiv);
         var attenddiv = document.createElement('div');
            attenddiv.className = "attend";
            attenddiv.innerHTML =
               stats_data[i].attends[THIRTYDAYS][0] +
                  " (" + Math.round(stats_data[i].attends[THIRTYDAYS][1] * 100) + "%)";
         thirtydiv.appendChild(attenddiv);
         var noshowdiv = document.createElement('div');
            noshowdiv.className = "noshow";
            noshowdiv.innerHTML = stats_data[i].noshows[THIRTYDAYS];
         thirtydiv.appendChild(noshowdiv);
         newdiv.appendChild(thirtydiv);

         var clrdiv = document.createElement('div');
            clrdiv.className = "clear";
         newdiv.appendChild(clrdiv);
         mbox.appendChild(newdiv);
      }
   }
}

function delete_user(member_data, home_url, labels)
{
   var filter_string = get_filter_string(labels);
   var warn = "Are you sure you wish to delete user '" +
      member_data.name + "'?  This cannot be undone.";
   if (confirm(warn))
   {
      location.href =
         home_url + "/php/remove_member.php?id=" + member_data.id
         + "&fstr=" + filter_string;
   }

   return false;
}

function member_by_name(one, two)
{
   var onelower = one.name.toLowerCase();
   var twolower = two.name.toLowerCase();

   if (onelower == twolower)
   { return 0; }
   else if (onelower < twolower)
   { return -1; }
   else
   { return 1; }
}

function member_by_join(one, two)
{
   if (one.create == two.create)
   { return 0; }
   else if (one.create < two.create)
   { return -1; }
   else
   { return 1; }
}

function member_by_last(one, two)
{
   if (one.last == two.last)
   { return 0; }
   else if (one.last < two.last)
   { return -1; }
   else
   { return 1; }
}

function member_by_group(one, two)
{
   if (one.gid == two.gid)
   { return two.sid - one.sid; }
   else if (one.gid < two.gid)
   { return -1; }
   else
   { return 1; }
}

function toon_by_name(one, two)
{
   var onelower = one.name.toLowerCase();
   var twolower = two.name.toLowerCase();

   if (onelower == twolower)
   { return 0; }
   else if (onelower < twolower)
   { return -1; }
   else
   { return 1; }
}

function toon_by_class(one, two)
{
   var diff = one.class_id - two.class_id;
   return (diff == 0) ? -toon_by_points(one, two) : diff;
}

function toon_by_points(one, two)
{
   return one.points - two.points;
}

function stats_by_name(one, two)
{
   var onelower = one.name.toLowerCase();
   var twolower = two.name.toLowerCase();

   if (onelower == twolower)
   { return 0; }
   else if (onelower < twolower)
   { return -1; }
   else
   { return 1; }
}

var ONEWEEK = 0;
var TWOWEEKS = 1;
var THIRTYDAYS = 2;

function stats_by_signups_one(one, two)
{
   var l = one.signups[ONEWEEK][1];
   var r = two.signups[ONEWEEK][1];
   return l - r;
}

function stats_by_signups_two(one, two)
{
   var l = one.signups[TWOWEEKS][1];
   var r = two.signups[TWOWEEKS][1];
   return l - r;
}

function stats_by_signups_30(one, two)
{
   var l = one.signups[THIRTYDAYS][1];
   var r = two.signups[THIRTYDAYS][1];
   return l - r;
}

function stats_by_attends_one(one, two)
{
   var l = one.attends[ONEWEEK][1];
   var r = two.attends[ONEWEEK][1];
   return l - r;
}

function stats_by_attends_two(one, two)
{
   var l = one.attends[TWOWEEKS][1];
   var r = two.attends[TWOWEEKS][1];
   return l - r;
}

function stats_by_attends_30(one, two)
{
   var l = one.attends[THIRTYDAYS][1];
   var r = two.attends[THIRTYDAYS][1];
   return l - r;
}

function stats_by_noshows_one(one, two)
{
   var l = one.noshows[ONEWEEK];
   var r = two.noshows[ONEWEEK];
   return l - r;
}

function stats_by_noshows_two(one, two)
{
   var l = one.noshows[TWOWEEKS];
   var r = two.noshows[TWOWEEKS];
   return l - r;
}

function stats_by_noshows_30(one, two)
{
   var l = one.noshows[THIRTYDAYS];
   var r = two.noshows[THIRTYDAYS];
   return l - r;
}

function chg_asc(f)
{
   return f;
}

function chg_desc(f)
{
   return function (a, b)
   {
      return -1 * f(a,b);
   }
}

function display_toons(t_data, boxname, home_url, sortf)
{
   var toon_data = t_data.sort(sortf);
   var mbox = document.getElementById(boxname);
   if (mbox)
   {
      for (var i = mbox.childNodes.length - 1; i >= 0; i--)
      {
         mbox.removeChild(mbox.childNodes[i]);
      }
      for (var i = 0, len = toon_data.length; i < len; i++)
      {
         var newdiv = document.createElement('div');
            newdiv.className = "list_item";
            newdiv.onclick =
               location_change(home_url + "/php/view_points.php?id=" +
               toon_data[i].id);
         var icondiv = document.createElement('div');
            icondiv.className = "list_icon";
            icondiv.innerHTML = "<img src=\"" + class_images[toon_data[i].cid]
               + "\"/>";
         newdiv.appendChild(icondiv);
         var namediv = document.createElement('div');
            namediv.className = "list_name";
            namediv.innerHTML = niceName(toon_data[i].name);
         newdiv.appendChild(namediv);
         var pointsdiv = document.createElement('div');
            pointsdiv.className =
               "list_points" + point_color(toon_data[i].points);
            pointsdiv.innerHTML = toon_data[i].points;
         newdiv.appendChild(pointsdiv);
         var clrdiv = document.createElement('div');
            clrdiv.className = "clear";
         newdiv.appendChild(clrdiv);
         mbox.appendChild(newdiv);
      }
   }
}

function display_raid_members(raid_id, m_data, home_url, sortf, active, admin)
{
   var mem_data = m_data.sort(sortf);
   var mbox = document.getElementById("members_list_container");
   if (mbox)
   {
      for (var i = mbox.childNodes.length - 1; i >= 0; i--)
      {
         mbox.removeChild(mbox.childNodes[i]);
      }
      for (var i = 0, len = mem_data.length; i < len; i++)
      {
         var newdiv = document.createElement('div');
            newdiv.className = "members_item";
         var icondiv = document.createElement('div');
            icondiv.className = "members_icon";
            icondiv.innerHTML = "<img src=\"" +
               class_images[mem_data[i].class_id] + "\"/>";
         newdiv.appendChild(icondiv);
         var namediv = document.createElement('div');
            namediv.className = "members_name";
            namediv.innerHTML = niceName(mem_data[i].name);
         newdiv.appendChild(namediv);
         if (active)
         {
            var pointsdiv = document.createElement('div');
               pointsdiv.className =
                  "members_points" + point_color(mem_data[i].points);
               pointsdiv.innerHTML = mem_data[i].points;
            newdiv.appendChild(pointsdiv);

            if (admin && !mem_data[i].times[mem_data[i].times.length - 1][1])
            {
               var award = document.createElement('div');
                  award.className = "members_award";
                  award.innerHTML = "award";
                  award.onclick = award_item(mem_data[i].toon_id,
                     mem_data[i].name);
               newdiv.appendChild(award);
            }
         }
         var clrdiv = document.createElement('div');
            clrdiv.className = "clear";
         newdiv.appendChild(clrdiv);

         var inraid = false;
         var times = mem_data[i].times;
         for (var t = 0, s = times.length; t < s; t++)
         {
            var timediv = document.createElement('div');
               timediv.className = "members_time_item";
            var start_date =
               getDateFromFormat(times[t][0], "yyyy-MM-dd HH:mm:ss")
            var strtdiv = document.createElement('div');
               strtdiv.className = "members_time_start";
               strtdiv.innerHTML = "in: " + formatDate(start_date, "h:mm a");
            timediv.appendChild(strtdiv);
            if (!times[t][1])
            {
               inraid = true;
               if (active && admin)
               {
                  var leavediv = document.createElement('div');
                     leavediv.className = "members_time_leave";
                     leavediv.innerHTML = "<a href='" + home_url +
                        "/php/jsps_leave_raid.php?t=" + mem_data[i].toon_id +
                        "&r=" + raid_id + "'>leave</a>";
                  timediv.appendChild(leavediv);
               }
               var end_str = "pending";
            }
            else
            {
               if (!inraid && (t == (s-1)) && active && admin)
               {
                  var joindiv = document.createElement('div');
                     joindiv.className = "members_time_leave";
                     joindiv.innerHTML = "<a href='" + home_url +
                        "/php/jsps_join_raid.php?t=" + mem_data[i].toon_id +
                        "&r=" + raid_id + "'>join</a>";
                  timediv.appendChild(joindiv);
               }
               var end_date =
                  getDateFromFormat(times[t][1], "yyyy-MM-dd HH:mm:ss")
               var end_str = formatDate(end_date, "h:mm a");
            }
            var enddiv = document.createElement('div');
               enddiv.className = "members_time_end";
               enddiv.innerHTML = "out: " + end_str;
            timediv.appendChild(enddiv);
            var cdiv = document.createElement('div');
               cdiv.className = "clear";
            timediv.appendChild(cdiv);

            newdiv.appendChild(timediv);
         }

         /* show it */
         mbox.appendChild(newdiv);
      }
   }
}

function award_item(tid, tname)
{
   function f()
   {
      var namediv = document.getElementById("award_toon_name_div");
      namediv.innerHTML = niceName(tname);

      var nameipt = document.getElementById("award_toon_name");
      nameipt.value = tname;

      var tiddiv = document.getElementById("award_toon_id");
      tiddiv.value = tid;

      var intdiv = document.getElementById("award_interface");
      intdiv.style.display="block";
   }

   return f;
}

function verify_raid_end_time(form)
{
   var start_time = form.raid_start_time.value;
   var end_time = form.raid_end_time.value;

   if (end_time != "")
   {
      if (compareDates(start_time, "yyyy-MM-dd HH:mm:ss",
         end_time, "yyyy-MM-dd HH:mm:ss") == 1)
      {
         alert(
            "The raid cannot end before it has begun.  Stop being a noodle.");
         return false;
      }
   }

   return confirm("Are you sure you wish to end this raid?");
}

function niceName(str)
{
   return str.substr(0,1).toUpperCase() + str.substring(1).toLowerCase()
}

function location_change(url)
{
   function chg()
   {
      location.href = url;
   }

   return chg;
}

function point_color(points)
{
   return (points > 0 ? " positive" : (points < 0 ? " negative" : ""));
}

/*
   From Stephen Chapman.
   http://javascript.about.com/library/blvalid02.htm
*/

var numb = '0123456789';
var lwr = 'abcdefghijklmnopqrstuvwxyz';
var upr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function isValid(parm,val) {
if (parm == "") return true;
for (var i=0; i<parm.length; i++) {
if (val.indexOf(parm.charAt(i),0) == -1) return false;
}
return true;
}

function isNumber(parm) {return isValid(parm,numb);}
function isLower(parm) {return isValid(parm,lwr);}
function isUpper(parm) {return isValid(parm,upr);}
function isAlpha(parm) {return isValid(parm,lwr+upr);}
function isAlphanum(parm) {return isValid(parm,lwr+upr+numb);} 

/* Additional is functions */
function isInteger (s)
{
   var i

   if (isEmpty(s))
   if (isInteger.arguments.length == 1) return 0
   else return (isInteger.arguments[1] == true)

   for (i = 0; i < s.length; i++)
   {
      var c = s.charAt(i)

      if (!isDigit(c)) return false
   }

   return true
}

function isPositiveInteger (s)
{
   var nonzero = false
   var i

   if (isEmpty(s))
   if (isInteger.arguments.length == 1) return 0
   else return (isInteger.arguments[1] == true)

   for (i = 0; i < s.length; i++)
   {
      var c = s.charAt(i)

      if (!isDigit(c)) return false
      if (c != "0") nonzero = true
   }

   return nonzero
}

function isEmpty(s)
{
   return ((s == null) || (s.length == 0))
}

function isDigit (c)
{
   return ((c >= "0") && (c <= "9"))
}
function isSignedInteger (s)
{
   if (isEmpty(s))
      if (isSignedInteger.arguments.length == 1) return false;
      else return (isSignedInteger.arguments[1] == true);

   else {
      var startPos = 0;
      var secondArg = false;

      if (isSignedInteger.arguments.length > 1)
         secondArg = isSignedInteger.arguments[1];

      // skip leading + or -
      if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") ) startPos = 1;
      return (isInteger(s.substring(startPos, s.length), secondArg))
   }
}

/*
   From Stuart Colville.
   http://muffinresearch.co.uk/archives/2006/04/29/getelementsbyclassname-deluxe-edition/
*/

function getElementsByClassName(strClass, strTag, objContElm) {
  strTag = strTag || "*";
  objContElm = objContElm || document;
  var objColl = objContElm.getElementsByTagName(strTag);
  if (!objColl.length &&  strTag == "*" &&  objContElm.all) objColl = objContElm.all;
  var arr = new Array();
  var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
  var arrClass = strClass.split(delim);
  for (var i = 0, j = objColl.length; i < j; i++) {
    var arrObjClass = objColl[i].className.split(' ');
    if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
    var c = 0;
    comparisonLoop:
    for (var k = 0, l = arrObjClass.length; k < l; k++) {
      for (var m = 0, n = arrClass.length; m < n; m++) {
        if (arrClass[m] == arrObjClass[k]) c++;
        if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
          arr.push(objColl[i]);
          break comparisonLoop;
        }
      }
    }
  }
  return arr;
}

// To cover IE 5.0's lack of the push method
Array.prototype.push = function(value) {
  this[this.length] = value;
}

var class_image_url = "http://www.junglestyle.net/images/blizzard/"
var class_images =
   [
      "",
      /* druid */          class_image_url + "11.gif",
      /* hunter */         class_image_url + "3.gif",
      /* mage */           class_image_url + "8.gif",
      /* paladin */        class_image_url + "2.gif",
      /* priest */         class_image_url + "5.gif",
      /* rogue */          class_image_url + "4.gif",
      /* shaman */         class_image_url + "7.gif",
      /* warlock */        class_image_url + "9.gif",
      /* warrior */        class_image_url + "1.gif",
      /* death knight */   class_image_url + "6.gif"
   ]
