function get_element_html(element)
{
 if (element.outerHTML)
  return element.outerHTML;
 var div = document.createElement("div");
 div.appendChild(element.cloneNode(true));
 return div.innerHTML;
}

function replace_element(element, html)
{
 if (element.outerHTML)
  element.outerHTML = html;
 else
 {
  var range = document.createRange();
  range.setStartBefore(element);
  var fragment = range.createContextualFragment(html);
  element.parentNode.replaceChild(fragment, element);
 }
 return false;
}

function format_price(value, integer)
{
 return round(floatval(value), integer ? 0 : 2).toFixed(integer ? 0 : 2).replace(/(\d)(?=(\d{3})+([^\d]|$))/g, "$1&nbsp;");
}

function switch_spoiler(element, state)
{
 var s = get_size(element), h = element.scrollHeight;
 if (s.h == 0 || s.h == h)
 {
  var c = s.h, r = typeof state == "undefined" ? (s.h < h ? h : 0) : (state ? h : 0);
  var t = setInterval(function() {
   var n = Math.round((c * 1.5 + r * 0.5) * 0.5);
   if (n == c) n = r; c = n;
   element.style.height = c < h ? c + "px" : "";
   if (c == r) clearInterval(t);
  }, 25);
 }
 return false;
}

function delay(element, action, timeout)
{
 if (element)
 {
  var index = -1;
  for (var i = 0; i < delay.delays.length; i++)
   if (delay.delays[i].element == element)
   {
    index = i;
    break;
   }
  if (index >= 0)
   clearTimeout(delay.delays[index].timer);
  else
   index = delay.delays.push({element: element, timer: null}) - 1;
  delay.delays[index].timer = setTimeout(function() {
   delay.delays.splice(index, 1);
   action();
  }, timeout);
 }
 return false;
}

delay.cancel = function(element)
{
 if (element)
 {
  var index = -1;
  for (var i = 0; i < delay.delays.length; i++)
   if (delay.delays[i].element == element)
   {
    index = i;
    break;
   }
  if (index >= 0)
  {
   clearTimeout(delay.delays[index].timer);
   delay.delays.splice(index, 1);
  }
 }
 return false;
}

delay.delays = [];

function show_delayed(element, delay)
{
 if (!delay) delay = 200;
 delay(element, function () { show(element); }, delay);
}

function hide_delayed(element, delay)
{
 if (!delay) delay = 200;
 delay(element, function () { hide(element); }, delay);
}

function validate_form(form, fields, message)
{
 if (form)
 {
  if (fields)
   switch (fields.constructor)
   {
    case Array:
     for (var i = 0; i < fields.length; i++)
      if (fields[i] && form.elements[fields[i]] && !form.elements[fields[i]].value)
      {
       if (message) setTimeout(function() { alert(message); }, 10);
       return false;
      }
    break;
    case Object:
     for (var i in fields)
      if (i && fields[i] && form.elements[i])
      {
       var regexp = new RegExp(fields[i]);
       if (!regexp.test(form.elements[i].value))
       {
        if (message) setTimeout(function() { alert(message); }, 10);
        return false;
       }
      }
    break;
   }
  else
   for (var i = 0; i < form.elements.length; i++)
    if ((form.elements[i].type == "input" || form.elements[i].type == "select-one") && !form.elements[i].value)
    {
     if (message) setTimeout(function() { alert(message); }, 10);
     return false;
    }
  return true;
 }
 else return false;
}

function update_search_form(form)
{
 if (form.elements.section)
 {
  var type = "";
  for (var i = 0; i < form.elements.type.length; i++)
   if (form.elements.type[i].checked)
   {
    type = form.elements.type[i].value;
    break;
   }
  if (type=="section")
  {
   //hide(form.elements.find);
   //show(form.elements.section);
   if (!window.searchform_autocomplete)
    window.searchform_autocomplete = add_autocomplete(form.elements.find, form.elements.section, 'update.php?mode=search_categories&find=', null);
  }
  else
  {
   //hide(form.elements.section);
   //show(form.elements.find);
   if (window.searchform_autocomplete)
   {
    window.searchform_autocomplete.remove();
    window.searchform_autocomplete = null;
   }
  }
 }
}

function submit_search_form(form)
{
 var type = "all", find = form.elements.find.value;
 for (var i = 0; i < form.elements.type.length; i++)
  if (form.elements.type[i].checked)
  {
   type = form.elements.type[i].value;
   break;
  }
 if (type && find)
  setTimeout(function() {
   location.href = form.action + url_encode(type) + "/" + url_encode(find) + "/";
  }, 10);
 return false;
}

function notepad_add(index, title)
{
 var organizations = get_cookie("notepad").split(",");
 if (!organizations[0])
  organizations = [];
 if (!in_array(organizations, index))
 {
  organizations.push(index);
  set_cookie("notepad", organizations.join(","), 30 * 86400, "/");
 }
 setTimeout(function() {
  alert("\"" + title + "\" додано у блокнот");
 }, 10);
 return false;
}

function notepad_remove(index)
{
 var organizations = get_cookie("notepad").split(","),
  i = index_of(organizations, index);
 if (i >= 0)
 {
  organizations.splice(i, 1);
  set_cookie("notepad", organizations.join(","), 30 * 86400, "/");
 }
 return false;
}

function notepad_get()
{
 var organizations = get_cookie("notepad").split(",");
 if (!organizations[0])
  organizations = [];
 return organizations;
}

function add_mouse_scroll(element)
{
 var drag = false;
 
 function stop_event(e)
 {
  e = fix_event(e);
  e.preventDefault();
  e.stopPropagation();
  return false;
 }
 
 function add_handlers()
 {
  add_event(document, "mousemove", mouse_move);
  add_event(document, "mouseup", mouse_up);
  add_event(document, "dragstart", stop_event);
  add_event(document.body, "selectstart", stop_event);
 }
 
 function remove_handlers()
 {
  remove_event(document, "mousemove", mouse_move);
  remove_event(document, "mouseup", mouse_up);
  remove_event(document, "dragstart", stop_event);
  remove_event(document.body, "selectstart", stop_event);
 }
 
 function mouse_down(e)
 {
  e = fix_event(e);
  if (e.which == 1)
  {
   drag = {};
   drag.start_x = e.pageX;
   drag.start_y = e.pageY;
   drag.scroll_x = element.scrollLeft;
   drag.scroll_y = element.scrollTop;
   add_handlers();
   return stop_event(e);
  }
  return true;
 }
 
 function mouse_move(e)
 {
  if (drag)
  {
   e = fix_event(e);
   drag.x = e.pageX;
   drag.y = e.pageY;
   drag.dx = drag.x - drag.start_x;
   drag.dy = drag.y - drag.start_y;
   element.scrollLeft = drag.scroll_x - drag.dx;
   element.scrollTop = drag.scroll_y - drag.dy;
   return stop_event(e);
  }
  return true;
 }
 
 function mouse_up(e)
 {
  if (drag)
  {
   e = fix_event(e);
   drag = false;
   remove_handlers();
   return stop_event(e);
  }
  return true;
 }
 
 add_event(element, "mousedown", mouse_down);
}
