﻿//Capturing Mouse Clicks
//Moving an Item


 function GetScrollHeight(Fader, PathElem, PathElemOuter, ScrollElem, ScrollElemInner, TopScroll, BottomScroll)
{   var H = ScrollElem.offsetHeight;
    var h = ScrollElemInner.offsetHeight;
    if(H<h)
    {   var FH = PathElemOuter.offsetHeight - TopScroll.offsetHeight - BottomScroll.offsetHeight;
        Fader.style.height = (FH*(H/h))+'px';
        PathElem.style.height = FH+'px';
        PathElemOuter.style.visibility = 'visible';
        ScrollElem.onmouseover = function(){EventScroll.Fader =Fader;EventScroll.ScrollElem=ScrollElem; EventScroll.ScrollElemInner=ScrollElemInner;EventScroll.H = FH-FH*(H/h); addWheelEventScroll()};
        ScrollElem.onclick = ScrollElem.onmouseover;
    }
}
function addWheelEventScroll()
{   addHandler(EventScroll.ScrollElem, 'DOMMouseScroll', EventScroll.DO);
    addHandler(EventScroll.ScrollElem, 'mousewheel', EventScroll.DO);
}
var EventScroll = 
{   ScrollElem: null,
    DO:function(event)
    {   var delta = 0;
        if (!event) event = window.event;
        if (event.wheelDelta)
        {   delta = event.wheelDelta/120;
            if (window.opera) delta = -delta;
        }
        else if (event.detail) delta = -event.detail/3;
        
        if (delta)
        {   var top = (!isNaN(parseInt(EventScroll.ScrollElem.scrollTop))?parseInt(EventScroll.ScrollElem.scrollTop):0);
            if(delta<0) EventScroll.ScrollElem.scrollTop += 15;
            else EventScroll.ScrollElem.scrollTop -= 15;
            if(delta<0 && EventScroll.ScrollElem.scrollTop==0)EventScroll.ScrollElem.scrollTop = 15;
            else if(delta>0 && EventScroll.ScrollElem.scrollTop==(EventScroll.ScrollElemInner.offsetHeight-EventScroll.ScrollElem.offsetHeight)) EventScroll.ScrollElem.scrollTop = (EventScroll.ScrollElemInner.offsetHeight-EventScroll.ScrollElem.offsetHeight)-15;
            top = (EventScroll.ScrollElem.scrollTop/(EventScroll.ScrollElemInner.offsetHeight-EventScroll.ScrollElem.offsetHeight))*EventScroll.H;
            top = top<=0 ? 0: (top>EventScroll.H?EventScroll.H:top);
    	    
            //$('test').innerHTML = delta + ':' +EventScroll.ScrollElem.scrollTop;
            EventScroll.Fader.style.position = 'relative';
            EventScroll.Fader.style.top = (top)+'px';
            
        }
        else if (event.preventDefault) event.preventDefault();
    }
}
var dragObjectOld  = null;
var dragScroll = {scrollEl: null,H:0};
var dragObject  = null; 
var mouseOffset = null;  
var dragArea = null; 
var dragEndFunc = null;
var dragLimits = {X:[],Y:[],min:0,max:0,MinPoint:0,MaxPoint:0};
var dragResultEl = null;
var dragStep = 0;
function makeClickable(object){ 
    object.onmousedown = function(){ 
        dragObject = this; 
    } 
}
function makeDraggable(item, area, ev, Xelem, Yelem, rsEl,min,max, minLimitEl, MaxLimitEl,startFunc,endFunc, ScrollElem, ScrollElemInner){ 
    if(!item) return;
    area.onmousedown = function(ev)
    {   
        document.onmousemove = mouseMove; 
        document.onmouseup   = mouseUp;
        dragObject  = item; 
        dragArea = area;
        if(dragObjectOld)dragObjectOld.style.zIndex = '';
        dragObject.style.zIndex = '999999';
        if(dragEndFunc)dragEndFunc();
        dragEndFunc = endFunc;
        dragLimits.X=[];dragLimits.Y=[];dragLimits.min=0;dragResultEl=null;dragLimits.max=0;
        if(Xelem || Yelem)
        {   if(Yelem && ScrollElem && ScrollElemInner)
            {   dragScroll.scrollEl = ScrollElem;
                dragScroll.scrollElInner = ScrollElemInner;
                dragScroll.H = Yelem.offsetHeight - dragObject.offsetHeight;
                dragScroll.top = (!isNaN(parseInt(dragObject.style.top))?parseInt(dragObject.style.top):0);
                mouseOffset = mouseCoords(ev);
            }
            else
            {   var w;
                if(Xelem)
                {   var XY = getPosition(Xelem);
                    dragLimits.X[0] = XY.x;
                    dragLimits.X[1] = XY.x+Xelem.offsetWidth - dragObject.offsetWidth;
                    dragLimits.Y = [XY.y];
                    w = Math.abs(dragLimits.X[1]-dragLimits.X[0]);
                    dragLimits.MinPoint = dragLimits.X[0];
                    dragLimits.MaxPoint = dragLimits.X[1];
                    if(minLimitEl) dragLimits.X[0] = getPosition(minLimitEl).x + minLimitEl.offsetWidth;
                    else if(MaxLimitEl)dragLimits.X[1] = getPosition(MaxLimitEl).x-dragObject.offsetWidth;
                }
                else
                {   var XY = getPosition(Yelem);
                    dragLimits.Y[0] = XY.y;
                    dragLimits.Y[1] = XY.y+Xelem.offsetHeight - dragObject.offsetHeight;
                    dragLimits.X = [XY.x];
                    w = Math.abs(dragLimits.Y[1]-dragLimits.Y[0]);
                    dragLimits.MinPoint = dragLimits.Y[0];
                    dragLimits.MaxPoint = dragLimits.Y[1];
                    if(minLimitEl) dragLimits.Y[0] = getPosition(minLimitEl).y + minLimitEl.offsetHeight;
                    else if(MaxLimitEl)dragLimits.Y[1] = getPosition(MaxLimitEl).y-dragObject.offsetHeight;
                }
                var W = Math.abs(max - min);
                dragStep = Math.round(W/w);
                dragLimits.min = Math.round(Math.min(Math.abs(min),Math.abs(max)));
                dragLimits.max = Math.round(Math.max(Math.abs(min),Math.abs(max)));
            }
        }
        if(rsEl && (!ScrollElem || !ScrollElemInner))dragResultEl = rsEl;
        if(!ScrollElem || !ScrollElemInner)mouseOffset = getMouseOffset(dragObject, ev); 
        if(startFunc) startFunc();
        return false; 
    } 
    area.onmousedown(ev);
}
function getMouseOffset(target, ev){ 
    ev = ev || window.event; 
    var docPos    = getPosition(target); 
    var mousePos  = mouseCoords(ev); 
    return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y}; 
} 
 
function getPosition(e){ 
    var left = 0; 
    var top  = 0; 
    while (e.offsetParent){ 
        left += e.offsetLeft;
        top  += e.offsetTop; 
        e     = e.offsetParent; 
    } 
 
    left += e.offsetLeft; 
    top  += e.offsetTop;
    
    return {x:left, y:top}; 
} 
 
function mouseMove(ev){
    if(main)
    {   ev = ev || window.event; 
        var mousePos = mouseCoords(ev); 
        if(dragObject){
            if(dragScroll.scrollEl)
            {   var dragTo = dragScroll.top + (mousePos.y - mouseOffset.y);
                
                dragTo = dragTo>=dragScroll.H ? dragScroll.H : (dragTo<=0 ? 0 : dragTo);
                dragObject.style.position = 'relative';
                dragObject.style.top = dragTo+'px';
                var st = ((dragTo/dragScroll.H)*100)*((dragScroll.scrollElInner.offsetHeight-dragScroll.scrollEl.offsetHeight)/100);
                dragScroll.scrollEl.scrollTop = st;
                
                return false;
            }
            else
            {   dragObject.style.position = 'absolute';
                var top = mousePos.y - mouseOffset.y;
                var left = mousePos.x - mouseOffset.x;
                if(dragLimits.Y.length>0) top = dragLimits.Y.length==1?dragLimits.Y[0]:(top<dragLimits.Y[0]?dragLimits.Y[0]:(top>dragLimits.Y[1]?dragLimits.Y[1]:top));
                if(dragLimits.X.length>0) left = dragLimits.X.length==1?dragLimits.X[0]:(left<dragLimits.X[0]?dragLimits.X[0]:(left>dragLimits.X[1]?dragLimits.X[1]:left));
                dragObject.style.top  = top+'px'; 
                dragObject.style.left = left+'px';
                
                if(dragResultEl != null)
                {   var v = '';
                    if(left==dragLimits.MaxPoint) v = dragLimits.max;
                    else v = dragLimits.min + (left - dragLimits.MinPoint)*dragStep;
                    dragResultEl.innerHTML = v;
                }
                return false;
            }
        } 
    }
}
function mouseUp(){ 
    dragObjectOld = dragObject;
    dragObject = null;
    if(dragEndFunc)dragEndFunc();
    dragEndFunc = null;
    dragLimits = {X:[],Y:[],min:0,max:0,MinPoint:0,MaxPoint:0};
    document.onmousemove = null; 
    document.onmouseup   = null; 
} 

function mouseCoords(ev){ 
    ev = ev || window.event; 
    if(ev.pageX || ev.pageY){ 
        return {x:ev.pageX, y:ev.pageY}; 
    } 
    return { 
        x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, 
        y:ev.clientY + document.body.scrollTop  - document.body.clientTop 
    }; 
}
function getClientParams()
{   var H = 0;
    if (window.innerHeight) H=window.innerHeight;
    else if (document.documentElement && document.documentElement.clientHeight) H=document.documentElement.clientHeight;
    else if (document.body) H=document.body.clientHeight;
    
    var W = 0;
    if (document.body) W=document.body.clientWidth;
    else if (window.innerWidth) W=window.innerWidth;
    else if (document.documentElement && document.documentElement.clientWidth) W=document.documentElement.clientWidth;
    
    
    var ScrollT = 0;
    if (document.documentElement && document.documentElement.scrollTop)ScrollT = document.documentElement.scrollTop;
    else if (document.body && document.body.scrollTop)ScrollT = document.body.scrollTop;
    
    var ScrollL = 0;
    if (document.documentElement && document.documentElement.scrollLeft)ScrollL = document.documentElement.scrollLeft;
    else if (document.body && document.body.scrollLeft)ScrollL = document.body.scrollLeft;
    
    return {height:H, width:W, scrollTop:ScrollT, scrollLeft:ScrollL};
}
