_grabObj = null;

function EventCtrl(div)
{
    this.div = div;
    this.type = '';
    this.mask = 0;
    this.pageX = 0;
    this.pageY = 0;
}

EventCtrl.prototype.linkCtrl = function(obj)
{
    if(obj && !obj.eventCtrl)
    {
        obj.eventCtrl = this;
    }
    
    return this;
}

EventCtrl.prototype.setThreshold = function(threshold)
{
    this.threshold = threshold;
    
    return this;
}

function getCtrlFromElementIE(el,tagName)
{
    for(;el;el=el.parentElement)
    
    if((tagName==null || el.tagName==tagName) && el.eventCtrl)
    {
        return el.eventCtrl;
    }
    
    return null;
}

function getCtrlFromEventIE(e,tagName)
{
    var ctrl=_grabObj;
    var event=window.event;
    var fromCtrl, toCtrl;
  
    if (ctrl==null)
    {
        var mask=0, type=event.type;
        
        switch(type)
        {
            case 'mouseover':
                fromCtrl = getCtrlFromElementIE(event.fromElement,tagName);
                toCtrl = getCtrlFromElementIE(event.toElement,  tagName);
                
                if(fromCtrl!=toCtrl)
                {
                    ctrl=toCtrl;
                }
                
                if(!ctrl || (ctrl.mask&1) == 0)
                {
                    ctrl=null;
                }
                break;
                
            case 'mouseout':
                fromCtrl = getCtrlFromElementIE(event.fromElement,tagName);
                toCtrl = getCtrlFromElementIE(event.toElement,  tagName);
                
                if(fromCtrl!=toCtrl)
                {
                    ctrl=fromCtrl;
                }
                
                if(!ctrl || (ctrl.mask&1) == 0)
                {
                    ctrl=null;
                }
                break;
            
            case 'mousedown': 
            case 'mousemove': 
            case 'mouseup':
                ctrl = getCtrlFromElementIE(event.srcElement,tagName);
                if(ctrl && (ctrl.mask&2)!=0) 
                {
                    break;
                }
            default: 
                ctrl=null; 
                break;
        }
    }
    
    if(ctrl)
    {
        ctrl.pageX = document.body.scrollLeft+event.clientX;
        ctrl.pageY = document.body.scrollTop +event.clientY;
        ctrl.type  = event.type;
    }
  
    return ctrl;
}

function getCtrlFromEventNN4(e,tagName)
{
    var ctrl=_grabObj;
    
    if(ctrl==null)
    {
        ctrl=e.target.eventCtrl;
    }
    
    if(ctrl)
    {
        var mask=0;
    
        switch(e.type)
        {
            case 'mouseover': 
            case 'mouseout':
                mask|=1; 
                break;
            case 'mousedown': 
            case 'mousemove': 
            case 'mouseup':
                mask|=2; 
                break;
        }
    
        if((ctrl.mask&mask)!=0)
        {
            ctrl.pageX = e.pageX; 
            ctrl.pageY = e.pageY;
            ctrl.type  = e.type;
        }
        else
        {
            ctrl=null;
        }
    }
  
    return ctrl;
}

function getCtrlFromEventMz(e,tagName)
{
    var ctrl = _grabObj;
    
    if(ctrl==null)
    {
        for(var t=e.target; t!=null; t=t.parentNode)
        {
            if(( tagName == null || (t.nodeType == Node.ELEMENT_NODE && t.tagName == tagName)) && ('undefined' != typeof(t.eventCtrl)) )
            {
                ctrl=t.eventCtrl;
                break;
            }
        }
    }
    
    if(ctrl)
    {
        ctrl.pageX = e.clientX+window.scrollX;
        ctrl.pageY = e.clientY+window.scrollY;
        ctrl.type  = e.type;
    }
    
    return ctrl;
}

function getCtrlFromEventNop(e,tagName)
{ 
    return null;
}

getCtrlFromEvent = (_dom == 1 || _dom == 2) ? getCtrlFromEventIE : (_dom == 3 ? getCtrlFromEventNN4 : (_dom == 4 ? getCtrlFromEventMz : getCtrlFromEventNop));

function ech_mouseover(e)
{
    var ctrl = getCtrlFromEvent(e,null);
    
    if(ctrl && ctrl.mouseover && !ctrl.mouseoverState)
    {
        ctrl.mouseoverState = true;
        if(ctrl.mouseover)
        {
            ctrl.mouseover(ctrl,ctrl.mouseoverClient);
        }
    }
}


function ech_mouseout(e)
{
    var ctrl = getCtrlFromEvent(e,null);
    
    if(ctrl && ctrl.mouseover && ctrl.mouseoverState)
    {
        ctrl.mouseoverState = false;
        
        if(ctrl.mouseout)
        { 
            ctrl.mouseout(ctrl,ctrl.mouseoutClient);
        }
    }
}

function ech_mousedown(e)
{
    var ctrl = getCtrlFromEvent(e,null);
    
    if(ctrl && !ctrl.dragging)
    {
        _grabObj = ctrl; 
        ctrl.dragging = true; 
        ctrl.dragged = false;
        ctrl.startX = ctrl.curX = ctrl.pageX;
        ctrl.startY = ctrl.curY = ctrl.pageY;
        
        if(ctrl.mousedown)
        {
            ctrl.mousedown(ctrl,ctrl.mousedownClient);
        }
        
        return false;
    }
    
    return true;
}

function ech_mousemove(e)
{
    var ctrl = getCtrlFromEvent(e,null);
    
    if(ctrl && ctrl.dragging)
    {
        if(ctrl.curX!=ctrl.pageX || ctrl.curY!=ctrl.pageY)
        {
            if(Math.abs(ctrl.pageX-ctrl.startX)>ctrl.threshold || Math.abs(ctrl.pageY-ctrl.startY)>ctrl.threshold)
            {
                ctrl.dragged = true;
            }
            
            if(ctrl.mousemove)
            {
                ctrl.mousemove(ctrl,ctrl.mousemoveClient);
            }
            
            ctrl.curX = ctrl.pageX; 
            ctrl.curY = ctrl.pageY;
        }
        
        return false;
    }
    
    return true;
}

function ech_mouseup(e)
{
    var ctrl = getCtrlFromEvent(e,null);
    
    if(ctrl && ctrl.dragging)
    {
        _grabObj = null; 
        ctrl.dragging = false;
        
        if(ctrl.mouseup)
        {
            ctrl.mouseup(ctrl,ctrl.mouseupClient);
        }
        
        if(!ctrl.dragged && ctrl.mouseclick)
        {
            ctrl.mouseclick(ctrl,ctrl.mouseclickClient);
        }
      
        ctrl.curX = ctrl.pageX; 
        ctrl.curY = ctrl.pageY;
    
        return false;
    }
    
    return true;
}

function ech_attachMouseOverOut(div,ovrf,ovrc,outf,outc)
{
    if(!div.eventCtrl)
    {
        div.eventCtrl = new EventCtrl(div);
    }
  
    var ctrl = div.eventCtrl;
    ctrl.mouseoverState = false;
    ctrl.mouseover = ovrf; 
    ctrl.mouseoverClient = ovrc;
    ctrl.mouseout = outf; 
    ctrl.mouseoutClient = outc;
    div.onmouseover = ech_mouseover;
    div.onmouseout = ech_mouseout;
    ctrl.mask|=1;
    
    return ctrl;
}

function ech_detachMouseOverOut(div)
{
    var ctrl = div.eventCtrl;
    
    if(ctrl)
    {
        ctrl.div.onmouseover = null;
        ctrl.div.onmouseout  = null;
        ctrl.mask=~1;
    }
}

function ech_attachMouseDrag(div,dwnf,dwnc,movf,movc,upf,upc,clkf,clkc)
{
  var doc;
  
  if(_dom==1||_dom==2)
  {
    doc = div;
    doc.onmousedown = ech_mousedown;
    document.onmousemove = ech_mousemove;
    document.onmouseup = ech_mouseup;
  }
  else if(_dom==3)
  {
    doc = div.document;
    doc.onmousedown = ech_mousedown;
    doc.onmousemove = ech_mousemove;
    doc.onmouseup = ech_mouseup;
    doc.captureEvents(Event.MOUSEDOWN|Event.MOUSEMOVE|Event.MOUSEUP);
  }
  else if(_dom==4)
  {
    doc = div;
    div.onmousedown = ech_mousedown;
    document.body.onmousemove = ech_mousemove;
    document.body.onmouseup = ech_mouseup;
  }
  else
  {
    return null;
  }
  
  if(!doc.eventCtrl)
  {
    doc.eventCtrl = new EventCtrl(div);
  }
  
  var ctrl=doc.eventCtrl;
  ctrl.dragging = false; 
  ctrl.dragged = false;
  ctrl.startX = 0;     
  ctrl.startY = 0;
  ctrl.curX = 0;     
  ctrl.curY = 0;
  ctrl.mousedown = dwnf; 
  ctrl.mousedownClient = dwnc;
  ctrl.mousemove = movf; 
  ctrl.mousemoveClient = movc;
  ctrl.mouseup = upf;  
  ctrl.mouseupClient = upc;
  ctrl.mouseclick = clkf; 
  ctrl.mouseclickClient = clkc;
  ctrl.threshold = 5;
  ctrl.mask|=2;
  
  return ctrl;
}

function ech_detachMouseDrag(div)
{
    var ctrl = null;
    
    if(_dom==1||_dom==2)
    {
        ctrl=div.eventCtrl;
        
        if(ctrl)
        {
            ctrl.div.onmousedown=null;
        }
    }
    else if(_dom==3)
    {
        ctrl = div.document.eventCtrl;
        
        if(ctrl)
        {
            var doc = ctrl.div.document;
            doc.releaseEvents(Event.MOUSEDOWN|Event.MOUSEMOVE|Event.MOUSEUP);
            doc.onmousedown = null;
            doc.onmousemove = null;
            doc.onmouseup   = null;
        }
    }
    else if(_dom==4)
    {
        ctrl = div.eventCtrl;
        if(ctrl)
        {
            ctrl.div.onmousedown=null;
        }
    }
    
    if(ctrl)
    {
        ctrl.mask&=~2;
    }
}

