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 init()
{
 if (window.hs)
 {
  if (browser.msie)
   browser.version = navigator.appVersion.match(/MSIE (\d+\.\d+)/)[1] || 10;
  for (var i = 0; i < document.images.length; i++)
   if (has_class(document.images[i], "zoom"))
   {
    var img = document.images[i],
     p = document.images[i].parentNode;
    while (p && p.tagName != "A")
     p = p.parentNode;
    if (!p)
     replace_element(img, "<a class=\"zoom\" href=\"" + html_special_chars(img.src) + "\" rev=\"photos\">" + get_element_html(img) + "</a>");
   }
  for (var i = 0; i < document.links.length; i++)
   if (has_class(document.links[i], "zoom"))
   {
    var a = document.links[i];
    var f = "return hs.expand(this" + (a.rev ? ", { slideshowGroup: '" + a.rev + "', transitions: ['expand', 'crossfade'], align: 'center' }" : "") + ")";
    if (browser.msie && browser.version < 8)
     a.setAttribute("onclick", new Function(f));
    else
     a.setAttribute("onclick", f);
   }
 }
}
