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_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);
}

function add_select_options(element, list)
{
 for (var i in list)
  add_select_option(element, list[i], i, false, false);
}

function remove_select_option(element, i)
{
 element.remove(i);
}

function remove_select_options(element)
{
 for (var i = element.options.length - 1; i >= 0; i--) element.remove(i);
}

function set_select_options(element, list)
{
 remove_select_options(element);
 add_select_options(element, list);
}

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; 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; 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 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;");
}