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 (typeof element == "object")
  element.style.display = "";
}

function hide(element)
{
 if (typeof element == "object")
  element.style.display = "none";
}

function show_hide(element)
{
 if (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 add_hover_class(element, class_name, tag_name)
{
 if (tag_name)
 {
  if (element.childNodes)
   for (var i = 0; i < element.childNodes.length; i++)
    add_hover_class(element.childNodes[i], class_name, element.childNodes[i].tagName == tag_name ? "" : tag_name);
 }
 else
 {
  add_event(element, "mouseover", function(e) { add_class(element, class_name); });
  add_event(element, "mouseout", function(e) { remove_class(element, class_name); });
 }
 return false;
}

function add_hover_action(element, action, tag_name)
{
 if (tag_name)
 {
  if (element.childNodes)
   for (var i = 0; i < element.childNodes.length; i++)
    add_hover_action(element.childNodes[i], action, element.childNodes[i].tagName == tag_name ? "" : tag_name);
 }
 else
 {
  add_event(element, "mouseover", function(e) { action(element, "over"); });
  add_event(element, "mouseout", function(e) { action(element, "out"); });
 }
 return false;
}

function set_table_style(element, classes)
{
 while (element && element.nodeName != "TR")
  element = element.childNodes.length ? element.childNodes[0] : element.nextSibling;
 var i = 0, l = classes.length, n;
 while (element)
 {
  if (element.nodeName == "TR")
  {
   n = i % l;
   if (typeof classes[n] == "string")
    add_class(element, classes[n]); else
   if (typeof classes[n] == "array" && classes[n].length > 1)
   {
    add_class(element, classes[n][0]);
    add_hover_class(element, classes[n][1]);
   }
   i++;
  }
  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);
 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)
{
 if (loading)
  set_content(container, loading);
 ajax_request({
  url: url,
  post: post,
  onsuccess: function(request) {
   set_content(container, request.responseText);
   if (typeof IE7 == "object" && IE7.loaded)
    setTimeout(function() { IE7.recalc(); }, 100);
   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, onchange)
{
 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);
   if (onchange) create_event(element, "change");
  },
  onerror: function(request) {
   set_select_options(element, ["Error " + request.status + ": " + request.statusText]);
   if (typeof onerror == "function") onerror(request);
  }
 });
 return false;
}

function load_select_options_ex(url, post, element, onsuccess, onerror, onchange)
{
 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_ex(element, jso);
   else
    set_select_options(element, [request.responseText]);
   if (typeof onsuccess == "function") onsuccess(request);
   if (onchange) create_event(element, "change");
  },
  onerror: function(request) {
   set_select_options(element, ["Error " + request.status + ": " + request.statusText]);
   if (typeof onerror == "function") onerror(request);
  }
 });
 return false;
}

function add_autocomplete(edit, list, url, post)
{
 // RETURN 13
 // ENTER  14
 // ESCAPE 27
 // SPACE  32
 // LEFT   37
 // UP     38
 // RIGHT  39
 // DOWN   40
 var t = null, h = null;
 
 function edit_focus(e)
 {
  if (list.options.length > 0)
  {
   if (edit.offsetWidth)
    list.style.width = edit.offsetWidth + "px";
   show(list);
  }
 }
 
 function edit_keydown(e)
 {
  if ((e || (e = window.event)) && e.keyCode == 13)
   stop_event(e);
 }
 
 function edit_keyup(e)
 {
  if ((e || (e = window.event)) && e.keyCode == 40)
  {
   list.focus();
   stop_event(e);
  }
  else if (e && e.keyCode != 37 && e.keyCode != 38 && e.keyCode != 39)
  {
   if (t)
    clearTimeout(t);
   t = setTimeout(function() {
    load_select_options(url + url_encode(edit.value), post, list, function() {
     if (list.options.length > 0)
     {
      if (edit.offsetWidth)
       list.style.width = edit.offsetWidth + "px";
      show(list);
     }
    });
    t = null;
   }, 400);
  }
 }
 
 function edit_blur(e)
 {
  h = setTimeout(function() {
   hide(list);
   if (edit.value != list.text)
   {
    var n = -1;
    for (var i = 0; i < list.options.length; i++)
     if (list.options[i].text == edit.value)
     {
      n = i;
      break;
     }
    if (n >= 0)
     list.selectedIndex = n;
    else
    {
     edit.value = "";
     list.selectedIndex = -1;
    }
   }
  }, 100);
 }
 
 function list_focus(e)
 {
  if (h)
  {
   clearTimeout(h);
   h = null;
  }
  if (list.options.length && (list.selectedIndex < 0 || list.selectedIndex >= list.options.length))
  {
   list.selectedIndex = 0;
   edit.value = list.options[list.selectedIndex].text;
  }
 }
 
 function list_change(e)
 {
  edit.value = list.selectedIndex >= 0 ? list.options[list.selectedIndex].text : "";
 }
 
 function list_click(e)
 {
  edit.focus();
 }
 
 function list_keydown(e)
 {
  if ((e || (e = window.event)) && e.keyCode == 13)
   stop_event(e);
 }
 
 function list_keyup(e)
 {
  if ((e || (e = window.event)) && e.keyCode == 13)
  {
   edit.focus();
   stop_event(e);
  }
 }
 
 function list_blur(e)
 {
  h = setTimeout(function() {
   hide(list);
  }, 100);
 }
 
 add_event(edit, "focus", edit_focus);
 add_event(edit, "keydown", edit_keydown);
 add_event(edit, "keyup", edit_keyup);
 add_event(edit, "blur", edit_blur);
 add_event(list, "focus", list_focus);
 add_event(list, "change", list_change);
 add_event(list, "click", list_click);
 add_event(list, "keydown", list_keydown);
 add_event(list, "keyup", list_keyup);
 add_event(list, "blur", list_blur);
 list.style.zIndex = 1000;
 
 return {
  remove: function() {
   hide(list);
   remove_event(edit, "focus", edit_focus);
   remove_event(edit, "keydown", edit_keydown);
   remove_event(edit, "keyup", edit_keyup);
   remove_event(edit, "blur", edit_blur);
   remove_event(list, "focus", list_focus);
   remove_event(list, "change", list_change);
   remove_event(list, "click", list_click);
   remove_event(list, "keydown", list_keydown);
   remove_event(list, "keyup", list_keyup);
   remove_event(list, "blur", list_blur);
  }
 }
}

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 = 0; i < array.length; i++)
  if (array[i] == element) return i;
 return -1;
}

function include(array, element)
{
 if (array.constructor == Array)
 {
  var found = false;
  for (var i = 0; i < array.length; i++)
   if (array[i] == element) found == true;
  if (!found) array.push(element);
 }
 return array;
}

function exclude(array, element)
{
 if (array.constructor == Array)
  for (var i = 0; i < array.length; i++)
   if (array[i] == element) array.splice(i, 1);
 return array;
}

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 (name)
 {
  var cookie = [escape(name) + "=" + escape(value)];
  if (expires)
  {
   var date = new Date();
   date.setTime(date.getTime() + expires * 1000);
   cookie.push("expires=" + date.toGMTString());
  }
  if (path)
   cookie.push("path=" + escape(path));
  if (domain)
   cookie.push("domain=" + escape(domain));
  if (secure)
   cookie.push("secure");
  document.cookie = cookie.join(";");
  return true;
 }
 else return false;
}

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[unescape(cookie[0])] = unescape(cookie[1]);
 }
 return result;
}

function get_cookie(name)
{
 var cookies = get_cookies();
 return cookies[name] || "";
}

function delete_cookie(name, path, domain)
{
 if (name)
 {
  var cookie = [name + "=", "expires=" + new Date(0).toGMTString()];
  if (path)
   cookie.push("path=" + escape(path));
  if (domain)
   cookie.push("domain=" + escape(domain));
  document.cookie = cookie.join(";");
  return true;
 }
 else return false;
}
