var loading = "<center><img src=\"files/img/loading.gif\" border=\"0\" alt=\"Loading...\" /></center>";

function get_element(id)
{
 return document.getElementById(id);
}

function $(element)
{
 return typeof element == "object" ? element : document.getElementById(element);
}

function show(element)
{
 if (element && typeof element == "object")
  element.style.display = "";
}

function hide(element)
{
 if (element && typeof element == "object")
  element.style.display = "none";
}

function show_hide(element)
{
 if (element && typeof element == "object")
  element.style.display = element.style.display == "none" ? "" : "none";
}

function show_elements(element, class_name)
{
 if (element.className && element.className == class_name) element.style.display = ""; else
 if (element.childNodes)
  for (var i = 0; i < element.childNodes.length; i++)
   show_elements(element.childNodes[i], class_name);
}

function hide_elements(element, class_name)
{
 if (element.className && element.className == class_name) element.style.display = "none"; else
 if (element.childNodes)
  for (var i = 0; i < element.childNodes.length; i++)
   hide_elements(element.childNodes[i], class_name);
}

function set_table_style(element, r1, r1h, r2, r2h)
{
 while (element && element.nodeName != "TR")
  element = element.childNodes.length ? element.childNodes[0] : element.nextSibling;
 var n = 0;
 while (element)
 {
  if (element.nodeName == "TR")
  {
   if (n % 2)
   {
    element.style.background = r1;
    if (r1h)
    {
     element.onmouseover = function() { this.style.background = r1h; }
     element.onmouseout = function() { this.style.background = r1; }
    }
   } else
   {
    element.style.background = r2;
    if (r2h)
    {
     element.onmouseover = function() { this.style.background = r2h; }
     element.onmouseout = function() { this.style.background = r2; }
    }
   }
   n++;
  }
  element = element.nextSibling;
 }
}

function set_table_classes(table, classes)
{
 if (table && classes)
 {
  var c = classes.length, i = 0;
  for (var b = 0; b < table.tBodies.length; b++)
   for (var r = 0; r < table.tBodies[b].rows.length; r++)
   {
    if (table.tBodies[b].rows[r].className)
     for (var j = 0; j < c; j++)
      remove_class(table.tBodies[b].rows[r], classes[j]);
    add_class(table.tBodies[b].rows[r], table.tBodies[b].rows[r].style.display == "none" ? "" : classes[i++ % c]);
   }
 }
}

function set_content(element, content)
{
 if (element && typeof element == "object")
  element.innerHTML = content;
}

function get_field(form, field)
{
 for (var i = 0; i < form.elements.length; i++)
  if (form.elements[i].name == field)
   return form.elements[i].value;
}

function get_fields(form)
{
 var element, values = {};
 for (var i = 0; i < form.elements.length; i++)
 {
  element = form.elements[i];
  if (element.name)
   switch (element.type)
   {
    case "checkbox": values[element.name] = element.checked ? element.value : ""; break;
    case "radio": if (!values[element.name]) values[element.name] = element.checked ? element.value : ""; break;
    default: values[element.name] = element.value;
   }
 }
 return values;
}

function set_fields(form, fields)
{
 for (var i = 0; i < form.elements.length; i++)
  if (typeof fields[form.elements[i].name] != "undefined")
   form.elements[i].value = fields[form.elements[i].name];
}

function clear_fields(form)
{
 var element, radiobuttons = [];
 for (var i = 0; i < form.elements.length; i++)
 {
  element = form.elements[i];
  if (element.name)
   switch (element.type)
   {
    case "checkbox": element.checked = ""; break;
    case "radio": if (!in_array(radiobuttons, element.name)) { element.checked = "checked"; radiobuttons.push(element.name); }; break;
    case "select-one":
    case "select-multiple": element.selectedIndex = 0; break;
    default: element.value = "";
   }
 }
}

function get_attribute(element, attribute)
{
 var node = element.getAttributeNode(attribute);
 return node ? node.value : "";
}

function add_select_option(element, text, value, is_default_selected, is_selected)
{
 var option = new Option(text, value, is_default_selected, is_selected);
 element.options.add(option);
 return option;
}

function add_select_options(element, list)
{
 for (var i in list)
  add_select_option(element, list[i], i, false, false);
 return false;
}

function remove_select_option(element, i)
{
 element.remove(i);
 return false;
}

function remove_select_options(element)
{
 for (var i = element.options.length - 1; i >= 0; i--)
  element.remove(i);
 for (var i = element.childNodes.length - 1; i >= 0; i--)
  element.removeChild(element.childNodes[i]);
 return false;
}

function set_select_options(element, list)
{
 remove_select_options(element);
 add_select_options(element, list);
 return false;
}

function set_select_options_ex(element, list)
{
 remove_select_options(element);
 var groups = {}, option;
 for (var i in list)
  if (typeof list[i] == "object")
  {
   option = add_select_option(element, list[i]["text"] || "", list[i]["value"] || i, list[i]["default"] || false, list[i]["selected"] || false);
   if (list[i]["title"])
    option.title = list[i]["title"];
   if (list[i]["group"])
   {
    if (!groups[list[i]["group"]])
     (groups[list[i]["group"]] = create_element("optgroup", element)).label = list[i]["group"];
    groups[list[i]["group"]].appendChild(option);
   }
  } else add_select_option(element, list[i], i, false, false);
 return false;
}

function set_select_value(element, value, onchange)
{
 for (var i = 0; i < element.options.length; i++)
  if (element.options[i].value == value)
  {
   element.selectedIndex = i;
   if (onchange) create_event(element, "change");
   return i;
  }
 return false;
}

function get_url_component(s, name)
{
 var p = s.indexOf("?" + name + "=");
 if (p == -1) p = s.indexOf("&" + name + "=");
 if (p >= 0)
 {
  p += name.length + 2;
  var e = s.indexOf("&", p);
  if (e == -1) e = s.length;
  return (p <= e) ? s.substring(p, e) : "";
 }
 else return "";
}

function load_url(url, post, container, onsuccess, onerror)
{
 set_content(container, loading);
 ajax_request({
  url: url,
  post: post,
  onsuccess: function(request) {
   set_content(container, request.responseText);
   if (typeof onsuccess == "function") onsuccess(request);
  },
  onerror: function(request) {
   set_content(container, "Error " + request.status + ": " + request.statusText);
   if (typeof onerror == "function") onerror(request);
  }
 });
 return false;
}

function submit_form(form, container, onsuccess, onerror)
{
 if (get_attribute(form, "enctype") == "multipart/form-data")
 {
  var div = create_element("DIV", document.body);
  div.style.display = "none";
  var name = "loader" + rand(1, 999999);
  div.innerHTML = "<iframe name = \"" + name + "\"></iframe>";
  var iframe = div.childNodes[0];
  add_event(iframe, "load", function() {
   var doc = (iframe.contentWindow && iframe.contentWindow.document || iframe.contentDocument);
   if (doc && doc.location.href != "about:blank")
   {
    set_content(container, doc.body.innerHTML);
    setTimeout(function() { div.parentNode.removeChild(div); }, 1000);
    if (onsuccess) onsuccess(null);
   }
  });
  form.setAttribute("target", name);
  form.submit();
  setTimeout(function() { set_content(container, loading); }, 1);
 }
 else
 {
  var url = get_attribute(form, "action"), post = null;
  if (get_attribute(form, "method").toLowerCase() == "post") post = serialize_form(form);
  else url += (url.indexOf("?") >= 0 ? "&" : "?") + serialize_form(form);
  if (url) load_url(url, post, container, onsuccess, onerror);
 }
 return false;
}

function load_json(url, post, onload, onsuccess, onerror)
{
 ajax_request({
  url: url,
  post: post,
  onsuccess: function(request) {
   try { var jso = eval("(" + request.responseText + ")"); }
    catch (e) { jso = null; if (request.responseText) alert(request.responseText); };
   onload(jso);
   if (typeof onsuccess == "function") onsuccess(request);
  },
  onerror: function(request) {
   onload(null);
   if (typeof onerror == "function") onerror(request);
  }
 });
 return false;
}

function load_select_options(url, post, element, onsuccess, onerror)
{
 set_select_options(element, ["..."]);
 ajax_request({
  url: url,
  post: post,
  onsuccess: function(request) {
   try { var jso = eval("(" + request.responseText + ")"); }
    catch (e) { jso = null; if (request.responseText) alert(request.responseText); };
   if (typeof jso == "object")
    set_select_options(element, jso);
   else
    set_select_options(element, [request.responseText]);
   if (typeof onsuccess == "function") onsuccess(request);
  },
  onerror: function(request) {
   set_select_options(element, ["Error " + request.status + ": " + request.statusText]);
   if (typeof onerror == "function") onerror(request);
  }
 });
 return false;
}

function intval(value)
{
 return parseInt(value) || 0;
}

function floatval(value)
{
 return parseFloat(value) || 0;
}

function round(value, precision)
{
 if (precision && precision > 0)
 {
  var p = Math.pow(10, precision);
  return Math.round(value * p) / p;
 }
 else
  return Math.round(value);
}

function in_array(array, element)
{
 for (var i in array)
  if (array[i] == element) return true;
 return false;
}

function index_of(array, element)
{
 for (var i in array)
  if (array[i] == element) return i;
 return -1;
}

function rand(a, b)
{
 var r = Math.random();
 if (typeof a == "undefined") return r;
 if (typeof b == "undefined") { b = a; a = 0; }
 return a + Math.floor(r * (b - a + 1));
}

function trim(s)
{
 return s.replace(/(^\s+)|(\s+$)/g, "");
}

function nl2br(s)
{
 return s.replace(/\n/g, "<br />\n");
}

function html_special_chars(s)
{
 return s.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}

function clone(o)
{
 if (typeof o == "object")
 {
  var n = new o.constructor();
  for (var p in o)
   if (o.hasOwnProperty(p))
    n[p] = clone(o[p]);
  return n;
 }
 else return o;
}

function set_cookie(name, value, expires, path, domain, secure)
{
 if (expires)
 {
  date = new Date();
  date.setTime(date.getTime() + expires * 1000);
  expires = date.toGMTString();
 }
 document.cookie = name + "=" + escape(value) +
  (expires ? ";expires=" + expires : "") +
  (path ? ";path=" + path : "") + 
  (domain ? ";domain=" + domain : "") +
  (secure ? ";secure" : "");
 return true;
}

function get_cookies()
{
 var cookies = document.cookie.split(";"), cookie, result = [];
 for (var i = 0; i < cookies.length; i++)
 {
  cookie = trim(cookies[i]).split("=");
  if (cookie.length == 2)
   result[cookie[0]] = unescape(cookie[1]);
 }
 return result;
}

function get_cookie(name)
{
 var cookies = get_cookies();
 return cookies[name] || "";
}

function delete_cookie(name, path, domain)
{
 var date = new Date(0), expires = date.toGMTString();
 document.cookie = name + "=" +
  ";expires=" + expires +
  (path ? ";path=" + path : "") + 
  (domain ? ";domain=" + domain : "");
 return true;
}
