var dragdrop =
{
  dragdrop : function (save_function)
  {
    dragdrop.save_function = save_function;
    if (!save_function) save_function = function (item_id, layout) {};

    dragdrop._dragdrop_init(document.getElementsByTagName("div"));
    dragdrop._dragdrop_init(document.getElementsByTagName("span"));
  },


  addEv : function (o, e, func)
  {
    if (document.all)
    {
      o.attachEvent('on' + e, func);
    }
    else
    {
      o.addEventListener(e, func, false);
    }
  },


  remEv : function (o, e, func)
  {
    if (document.all)
    {
      o.detachEvent('on' + e, func);
    }
    else
    {
      o.removeEventListener(e, func, false);
    }
  },


  canEv : function (e)
  {
    if (document.all)
    {
      e.cancelBubble = true;
      e.returnValue = false;
    }
    else
    {
      e.preventDefault();
    }
  },


  _dragdrop_init : function (os)
  {
    var re = new RegExp('\\bP_dragdrop_handle\\b');
    for (i = 0; i < os.length; i++)
    {
      if (re.test(os[i].className))
      {
        os[i].style.cursor = 'move';
        dragdrop.remEv(os[i], 'mouseover', dragdrop._mouseover);
        dragdrop.addEv(os[i], 'mouseover', dragdrop._mouseover);
        dragdrop.remEv(os[i], 'mouseout', dragdrop._mouseout);
        dragdrop.addEv(os[i], 'mouseout', dragdrop._mouseout);
        dragdrop.remEv(os[i], 'mousedown', dragdrop._mousedown);
        dragdrop.addEv(os[i], 'mousedown', dragdrop._mousedown);
      }
    }
  },


  _mouseover : function (e)
  {
    dragdrop._shownavigation(e, true);
  },


  _mouseout : function (e)
  {
    dragdrop._shownavigation(e, false);
  },


  _shownavigation : function (e, show)
  {
    var o = (window.event) ? e.srcElement : e.target;

    var re = new RegExp('\\bP_dragdrop_handle\\b');
    do
    {
      if (re.test(o.className)) break;
    }
    while (o = o.parentNode);

    if (!o && (o.className != 'P_dragdrop_handle')) return ;


    var re = new RegExp('\\bP_dragdrop_item\\b');
    do
    {
      if (re.test(o.className)) break;
    }
    while (o = o.parentNode);

    if (!o && (o.className != 'P_dragdrop_item')) return ;

    dragdrop._navigation(o, show);
  },


  _navigation : function (o, show)
  {
    var re = new RegExp('\\bP_dragdrop_navigation\\b');
    for (var i = 0; i < o.childNodes.length; i++)
    {
      if (re.test(o.childNodes[i].className))
      {
        if (show)
        {
          o.childNodes[i].className = o.childNodes[i].className + ' P_dragdrop_navigation_active';
        }
        else
        {
          o.childNodes[i].className = o.childNodes[i].className.replace(/ P_dragdrop_navigation_active/, '');
        }
      }
      if (o.childNodes[i].childNodes.length > 0) dragdrop._navigation(o.childNodes[i], show);
    }
  },


  dragdrop_destroy : function ()
  {
    dragdrop._dragdrop_destroy(document.getElementsByTagName("div"));
    dragdrop._dragdrop_destroy(document.getElementsByTagName("span"));
  },


  _dragdrop_destroy : function (os)
  {
    var re = new RegExp('\\bP_dragdrop_handle\\b');
    for (i = 0; i < os.length; i++)
    {
      if (re.test(os[i].className))
      {
        os[i].style.cursor = 'move';
        dragdrop.remEv(os[i], 'mousedown', dragdrop._mousedown);
      }
    }
  },


  hasChildItem : function (o, childName)
  {
    var re = new RegExp('\\b' + childName + '\\b');
    for (var i = 0; i < o.childNodes.length; i++)
    {
      if (re.test(o.childNodes[i].className)) return true;
      if (o.childNodes[i].childNodes.length > 0) if (dragdrop.hasChildItem(o.childNodes[i], childName)) return true;
    }

    return false;
  },


  getParentByClassName : function (o, className)
  {
    var re = new RegExp('\\b' + className + '\\b');
    while (o = o.parentNode)
    {
      if (re.test(o.className)) return o;
    };

    return false;
  },


  getParentById : function (o, id)
  {
    while (o = o.parentNode)
    {
      if (dragdrop.id == id) return o;
    };

    return false;
  },


  _layout_json : function ()
  {
    var output = '';
    os = document.getElementsByTagName("div");
    var re = new RegExp('\\bP_dragdrop_container\\b');
    var re2 = new RegExp('\\bP_dragdrop_item\\b');
    for (var i = 0; i < os.length; i++)
    {
      if (re.test(os[i].className))
      {
        var output2 = '';
        os2 = os[i].getElementsByTagName("div");
        for (var j = 0; j < os2.length; j++)
        {
          if (re2.test(os2[j].className))
          {
            output2 += ((output2 != '') ? ',' : '') + '"' + os2[j].id + '"';
          }
        }
        output += ((output != '') ? ',' : '') + '"' + os[i].id + '":[' + output2 + ']';
      }
    }

    output = '{' + output + '}';
    return output;
  },


  _mouseup : function (e)
  {
//document.getElementById('P_dragdrop_obj').innerHTML = 'x';
//dragdrop.obj.childNodes[0].innerHTML = 'y';
    tmp = dragdrop.obj.childNodes[0].cloneNode(true);
    dragdrop.obj.parentNode.removeChild(dragdrop.obj);
    document.getElementById('P_dragdrop_obj').parentNode.insertBefore(tmp, document.getElementById('P_dragdrop_obj'));
    document.getElementById('P_dragdrop_obj').parentNode.removeChild(document.getElementById('P_dragdrop_obj'));

    dragdrop._iebug(false);

    dragdrop.remEv(window.document, 'mousemove', dragdrop._mousemove);
    dragdrop.remEv(window.document, 'mouseup', dragdrop._mouseup);

    dragdrop.dragdrop(dragdrop.save_function);

    layout = dragdrop._layout_json();
    if (dragdrop.oldLayout != layout) dragdrop.savePositions(tmp.id, layout);
  },


  _objx : function (o)
  {
    ox = 0;

    while (o)
    {
      ox += o.offsetLeft;
      o = o.offsetParent;
    };

    return ox;
  },


  _objy : function (o)
  {
    oy = 0;

    while (o)
    {
      oy += o.offsetTop;
      o = o.offsetParent;
    };

    return oy;
  },


  _iebug : function(start)
  {
    var re = new RegExp('\\b' + (start ? '' : '_bug_') + 'P_prechod100\\b');
    os = document.getElementsByTagName('div');
    for (i = 0; i < os.length; i++)
    {
      if (re.test(os[i].className)) 
      {
        if (start)
        {
          os[i].className = os[i].className.replace(/P_prechod100/, '_bug_P_prechod100');
        }
        else
        {
          os[i].className = os[i].className.replace(/_bug_P_prechod100/, 'P_prechod100');
        }
      }
    }
  },

  _mousedown : function (e)
  {
    var o = (window.event) ? e.srcElement : e.target;
    var x = e.clientX + ((document.all || (navigator.userAgent.indexOf("opera") == -1)) ? document.documentElement.scrollLeft + document.body.scrollLeft : window.scrollX);
    var y = e.clientY + ((document.all || (navigator.userAgent.indexOf("opera") == -1)) ? document.documentElement.scrollTop + document.body.scrollTop : window.scrollY);

    var re = new RegExp('\\bP_dragdrop_item\\b');
    do
    {
      if (re.test(o.className)) break;
      if (o.href) return false;
      if (o.tagName == 'INPUT') return false;
      if (o.onclick) return false;
    }
    while (o = o.parentNode);

    if (!o && (o.className != 'P_dragdrop_item')) return ;

    dragdrop.dragdrop_destroy();

    dragdrop.oldLayout = dragdrop._layout_json();

    dragdrop_dx = dragdrop._objx(o) - x;
    dragdrop_dy = dragdrop._objy(o) - y;

    dragdrop_ = document.createElement('div');
    dragdrop_.setAttribute('id','P_dragdrop_obj');
    dragdrop_.style.position = o.style.position;
    dragdrop_.style.width = o.offsetWidth + 'px';
    dragdrop_.style.height = o.offsetHeight + 'px';
    dragdrop_.style.display = 'block';
    dragdrop_.innerHTML = '<div class="P_dragdrop_item_source" style="height:100%"></div>';
    o.parentNode.insertBefore(dragdrop_, o.nextSibling);

    dragdrop.obj = document.createElement('div');
    dragdrop.obj.style.width = o.offsetWidth + 'px';
    dragdrop.obj.style.height = o.offsetHeight + 'px';
    dragdrop.obj.appendChild(o);
    //dragdrop.obj.style.backgroundColor = 'white';
    dragdrop.obj.style.filter='alpha(opacity=50)';
    dragdrop.obj.style.MozOpacity='0.5';
    dragdrop.obj.style.opacity='0.5';
    dragdrop.obj.style.position = 'absolute';
    dragdrop.obj.style.left = (x + dragdrop_dx) + 'px';
    dragdrop.obj.style.top = (y + dragdrop_dy) + 'px';
    dragdrop.obj.style.fontSize = '75%';
    dragdrop.obj.className = 'P_dragdrop_item_move';
    document.body.appendChild(dragdrop.obj);


    dragdrop.aContainers = new Array();
    dragdrop.aItems = new Array();
    var re = new RegExp('\\bP_dragdrop_container\\b');
    var re2 = new RegExp('\\bP_dragdrop_item\\b');

    os = document.getElementsByTagName("div");
    for (var i = 0; i < os.length; i++)
    {
      if (re.test(os[i].className)) dragdrop.aContainers.push(os[i]);
      if (re2.test(os[i].className)) dragdrop.aItems.push(os[i]);
    }

    dragdrop._iebug(true);

    dragdrop.addEv(window.document, 'mousemove', dragdrop._mousemove);
    dragdrop.addEv(window.document, 'mouseup', dragdrop._mouseup);

    dragdrop.canEv(e);
  },


  savePositions : function (item_id, layout)
  {
    if (dragdrop.save_function) dragdrop.save_function(item_id, layout);
  },


  _mousemove_elements : function (x, y)
  {
    oo = dragdrop_;
    var objy = dragdrop._objy(oo);
    if ((objy < y) && (y <= (objy + oo.offsetHeight)))
    {
      var objx = dragdrop._objx(oo);
      if ((objx < x) && (x <= (objx + oo.offsetWidth)))
      {
        return false;
      }
    }

    var overContainter = false;
    for (var i = 0; i < dragdrop.aContainers.length; i++)
    {
      oo = dragdrop.aContainers[i];
      if (oo == dragdrop.obj.childNodes[0]) continue;

      var objy = dragdrop._objy(oo);
      if ((objy < y) && (y <= (objy + oo.offsetHeight)))
      {
        var objx = dragdrop._objx(oo);
        if ((objx < x) && (x <= (objx + oo.offsetWidth)))
        {
          overContainter = true;
          if (!dragdrop.hasChildItem(oo, "P_dragdrop_item"))
          {
            tmp = dragdrop_.cloneNode(true);
            dragdrop_.parentNode.removeChild(dragdrop_);
            dragdrop_ = tmp;

            dragdrop.obj.style.width = oo.offsetWidth + 'px';
            tmp.style.width = oo.offsetWidth + 'px';

            oo.appendChild(tmp);
            break;
          }
        }
      }
    }
    if (!overContainter) return ;

    for (var i = 0; i < dragdrop.aItems.length; i++)
    {
      oo = dragdrop.aItems[i];
      if (oo == dragdrop.obj.childNodes[0]) continue;
      var objy = dragdrop._objy(oo);
      if ((objy < y) && (y <= (objy + oo.offsetHeight)))
      {
        var objx = dragdrop._objx(oo);
        if ((objx < x) && (x <= (objx + oo.offsetWidth)))
        {
          var umisteni_pod = (y < (dragdrop._objy(oo) + oo.offsetHeight / 2));

          tmp = dragdrop_.cloneNode(true);
          dragdrop_.parentNode.removeChild(dragdrop_);
          dragdrop_ = tmp;

          dragdrop.obj.style.width = oo.offsetWidth + 'px';
          tmp.style.width = oo.offsetWidth + 'px';

          if (!umisteni_pod)
          {
            oo.parentNode.insertBefore(tmp, oo.nextSibling);
          }
          else
          {
            oo.parentNode.insertBefore(tmp, oo);
          }
          break;
        }
      }
    }
  },


  _mousemove : function (e)
  {
    var x = e.clientX + ((document.all || (navigator.userAgent.indexOf("opera") == -1)) ? document.documentElement.scrollLeft + document.body.scrollLeft : window.scrollX);
    var y = e.clientY + ((document.all || (navigator.userAgent.indexOf("opera") == -1)) ? document.documentElement.scrollTop + document.body.scrollTop : window.scrollY);

    dragdrop.obj.style.left = (x + dragdrop_dx) + 'px';
    dragdrop.obj.style.top = (y + dragdrop_dy) + 'px';

    dragdrop._mousemove_elements(x, y);

    dragdrop.canEv(e);
  }
}


//dragdrop.dragdrop();

