
function getMouseCoords(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 disableSelection(target){
target = document.getElementById(target);

if (typeof target.onselectstart!="undefined") //IE route

    target.onselectstart=function(){return false}

else if (typeof target.style.MozUserSelect!="undefined") //Firefox route

    target.style.MozUserSelect="none"

else //All other route (ie: Opera)

    target.onmousedown=function(){return false}
    target.style.cursor = "default"

}

function hookEvent(element, eventName, callback)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.addEventListener)
  {
    if(eventName == 'mousewheel')
    {
      element.addEventListener('DOMMouseScroll',
        callback, false); 
    }
    element.addEventListener(eventName, callback, false);
  }
  else if(element.attachEvent)
    element.attachEvent("on" + eventName, callback);
}

function unhookEvent(element, eventName, callback)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.removeEventListener)
  {
    if(eventName == 'mousewheel')
    {
      element.removeEventListener('DOMMouseScroll',
        callback, false); 
    }
    element.removeEventListener(eventName, callback, false);
  }
  else if(element.detachEvent)
    element.detachEvent("on" + eventName, callback);
}

function cancelEvent(e)
{
  e = e ? e : window.event;
  if(e.stopPropagation)
    e.stopPropagation();
  if(e.preventDefault)
    e.preventDefault();
  e.cancelBubble = true;
  e.cancel = true;
  e.returnValue = false;
  return false;
}

var scroll = 0;
var container = '';
var content = '';
var arrow_top = '';
var arrow_bottom = '';
var scroll_container ='';
var scrollbar = '';
function scroller_func(e)
{
  e = e ? e : window.event;
  var wheelData = e.detail ? e.detail * -1 : e.wheelDelta / 40;
  //do something
  var el = document.getElementById(content);
  var cont=document.getElementById(container);
  if (cont.offsetHeight-el.offsetHeight < 0){ //activate scroll only if content is longer than container
	  scroll = scroll + wheelData*5;
	  if (scroll > 0) 
	  	scroll = 0;
	  if ( scroll  < (cont.offsetHeight-el.offsetHeight-30) )
	 	scroll = cont.offsetHeight-el.offsetHeight-30;
	 
	  //el.style.marginTop = scroll+'px';  
	  scroll_update();
  return cancelEvent(e);
  } 
}

mouse_pos = '';
function move_scroll_func(e)
{
  current_pos = getMouseCoords(e);
  dy = current_pos.y-mouse_pos.y;
  
  var el = document.getElementById(content);
  var cont=document.getElementById(container);
  var scroll_el = document.getElementById(scrollbar);
  var scroll_cont_el=document.getElementById(scroll_container);
	 ds  = dy*(cont.offsetHeight-el.offsetHeight-30)/(scroll_cont_el.offsetHeight-scroll_el.offsetHeight);
	 scroll+=ds;
	  if (scroll > 0) 
	  	scroll = 0;
	  if ( scroll  < (cont.offsetHeight-el.offsetHeight-30) )
	 	scroll = cont.offsetHeight-el.offsetHeight-30;	
	
	scroll_update();
	mouse_pos = current_pos;
}

function scroll_up()
{
  var el = document.getElementById(content);
  var cont=document.getElementById(container);
	 scroll+=15;
	  if (scroll > 0) 
	  	scroll = 0;
	  if ( scroll  < (cont.offsetHeight-el.offsetHeight-30) )
	 	scroll = cont.offsetHeight-el.offsetHeight-30;	
	scroll_update();
}
function scroll_down()
{
  var el = document.getElementById(content);
  var cont=document.getElementById(container);
	 scroll-=15;
	  if (scroll > 0) 
	  	scroll = 0;
	  if ( scroll  < (cont.offsetHeight-el.offsetHeight-30) )
	 	scroll = cont.offsetHeight-el.offsetHeight-30;
	scroll_update();
}

var dragging = false;
function start_scroll_drag(e)
{
	if (!dragging)
	{
		mouse_pos = getMouseCoords(e);
		hookEvent(document, 'mousemove', move_scroll_func);
		dragging = true;
	}
}

function end_scroll_drag()
{
	if (dragging)
	{
		unhookEvent(document, 'mousemove', move_scroll_func);
		dragging = false;
	}
	document.getElementById('container_top').onclick();	
}

function scroll_update()
{
  var el = document.getElementById(content);
  var cont=document.getElementById(container);
	 //update content
	  el.style.marginTop = scroll+'px';
	 //update scrollbar
  var scroll_el = document.getElementById(scrollbar);
  var scroll_cont_el=document.getElementById(scroll_container);
  scroll_el.style.marginTop = (scroll_cont_el.offsetHeight-scroll_el.offsetHeight)*scroll/(cont.offsetHeight-el.offsetHeight-30)+'px';
  	  
}

function activateScroll(container_name, content_name, scroll_cont_name,scrollbar_name, arrow_top_name, arrow_bottom_name)
{
	container = container_name;
	content = content_name;
	scroll_container = scroll_cont_name;
	scrollbar = scrollbar_name;
	arrow_top = arrow_top_name;
	arrow_bottom = arrow_bottom_name;

	var el = document.getElementById(content);
  	var cont=document.getElementById(container);
  	if (cont.offsetHeight-el.offsetHeight < 0) //activate scroll only if content is longer than container
	{
		hookEvent(container, 'mousewheel', scroller_func);
		hookEvent(scrollbar, 'mousedown', start_scroll_drag);		
		hookEvent(scrollbar, 'mouseup', end_scroll_drag);
		hookEvent(document, 'mouseup', end_scroll_drag);
			
		hookEvent(scrollbar, 'click', function(){ document.getElementById('container_top').onclick();});
		hookEvent(arrow_top, 'click', scroll_up);
		hookEvent(arrow_bottom, 'click', scroll_down);	
		
		var el = document.getElementById(scroll_container);
		el.style.display = 'block';
		var el = document.getElementById(arrow_top);
		el.style.display = 'block';
		var el = document.getElementById(arrow_bottom);
		el.style.display = 'block';
	}	
}

