/*
*  verticalScroll.js
* ----------------------------------------------------------------------------
*  Copyright © 1995-2005 Intesys S.r.l. Verona (Italy). All rights reserved.
* ----------------------------------------------------------------------------
*  Data e versione:
*	30/03/2005 - 3.0
* ----------------------------------------------------------------------------
*  Descrizione:
*	Libreria per la gestione di scrolling verticali
* ----------------------------------------------------------------------------
*/

var verticalScrollLayers = new Array()
var currentVerticalScrollLayer
var verticalScrollTimerId = null


function setCurrentVerticalScrollLayer(name) {
	if (currentVerticalScrollLayer != verticalScrollLayers[name]) {
		verticalScrollDragStop()
	}
	currentVerticalScrollLayer = verticalScrollLayers[name]
}


function getMousePositionY(e) {
	return document.all ? event.clientY : e.pageY;
}


function initVerticalScroll(divContent, divBox, divUp, divDown, verticalTrack, verticalDrag, verticalBegin, verticalEnd) {

	initLayer(divContent)
	initLayer(divBox)

	divContent.setTopPos(0)
	divContent.verticalOverflow = divContent.getLayerHeight() - divBox.getLayerHeight()
	var scroll = (divContent.verticalOverflow > 0)

	if (typeof(divContent.verticalScrollSpeed) == 'undefined') {
		divContent.verticalScrollSpeed = 10
	}

	if (verticalBegin) {
		initLayer(verticalBegin)
		if (scroll) {
			verticalBegin.setEventHandler('onmousedown', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollGoToBegin(); })
		} else {
			verticalBegin.setEventHandler('onmousedown', doNothing)
		}
	}

	if (verticalEnd)	{
		initLayer(verticalEnd)
		if (scroll) {
			verticalEnd.setEventHandler('onmousedown', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollGoToEnd(); })
		} else {
			verticalEnd.setEventHandler('onmousedown', doNothing)
		}
	}

	if (scroll) {
		divContent.setEventHandler('onmousewheel', function(e){setCurrentVerticalScrollLayer(divContent.id); verticalWheel(e); })
	} else {
		divContent.setEventHandler('onmousewheel', doNothing)
	}


	if (divUp) {
		initLayer(divUp)
		if (scroll) {
			divUp.showMe()
			if (divContent.verticalScrollStartOnOver || divUp == verticalBegin) {
				divUp.setEventHandler('onmouseover', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollUp(); })
				divUp.setEventHandler('onmousedown', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollGoToBegin(); })
			} else {
				divUp.setEventHandler('onmousedown', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollUp(); })
				divUp.setEventHandler('onmouseup',   function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollStop(); })
			}
			divUp.setEventHandler('onmouseout', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollStop(); })
		} else {
			divUp.setEventHandler('onmousedown', doNothing)
			divUp.setEventHandler('onmouseup',   doNothing)
			divUp.setEventHandler('onmouseout',  doNothing)
			divUp.setEventHandler('onmouseover', doNothing)
			if (divContent.hideVerticalScrollIfNotNecessary) {
				divUp.hideMe()
			}
		}
	}


	if (divDown) {
		initLayer(divDown)
		if (scroll) {
			divDown.showMe()
			if (divContent.verticalScrollStartOnOver || divDown == verticalEnd) {
				divDown.setEventHandler('onmouseover', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollDown();    })
				divDown.setEventHandler('onmousedown', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollGoToEnd(); })
			} else {
				divDown.setEventHandler('onmousedown', function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollDown(); })
				divDown.setEventHandler('onmouseup',   function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollStop(); })
			}
			divDown.setEventHandler('onmouseout',  function(){setCurrentVerticalScrollLayer(divContent.id); verticalScrollStop(); })
		} else {
			divDown.setEventHandler('onmousedown', doNothing)
			divDown.setEventHandler('onmouseup',   doNothing)
			divDown.setEventHandler('onmouseout',  doNothing)
			divDown.setEventHandler('onmouseover', doNothing)
			if (divContent.hideVerticalScrollIfNotNecessary) {
				divDown.hideMe()
			}
		}
	}


	if (verticalTrack && verticalDrag) {
		initLayer(verticalTrack)
		initLayer(verticalDrag)
		verticalDrag.setTopPos(0)

		verticalDrag.endPos = verticalTrack.getLayerHeight() - verticalDrag.getLayerHeight()
		verticalDrag.trackTopPos = verticalTrack.getTopPos()
		if (scroll) {
			verticalTrack.showMe()
			verticalDrag.showMe()
			divContent.dragSpeedScroll = verticalDrag.endPos / divContent.verticalOverflow
			verticalTrack.setEventHandler('onmousedown', function(e){setCurrentVerticalScrollLayer(divContent.id); verticalTrackOnMouseDown(e); })
			verticalTrack.setEventHandler('onmousewheel', function(e){setCurrentVerticalScrollLayer(divContent.id); verticalWheel(e); })
		} else {
			if (divContent.hideVerticalScrollIfNotNecessary) {
				verticalTrack.hideMe()
			}
			verticalTrack.setEventHandler('onmousedown', doNothing)
			verticalTrack.setEventHandler('onmousewheel', doNothing)
		}
		divContent.verticalDrag = verticalDrag
	}

	verticalScrollLayers[divContent.id] = divContent
}


function initVerticalScrollByName(divContentName, divBoxName, divUpName, divDownName
								, divTrackName, divDragName
								, divBeginName, divEndName
								, hideScrollIfNotNecessary // opzionale default true
								, startScrollOnOver        // opzionale default false
								, scrollSpeed              // opzionale default 10
								) {

	var divBox      = getLayer(divBoxName)
	var divContent  = getLayer(divContentName, divBox)

	var divUp       = (divUpName ? getLayer(divUpName)   : null)
	var divDown     = (divUpName ? getLayer(divDownName) : null)

	var divTrack    = (divTrackName && divDragName ? getLayer(divTrackName)          : null)
	var divDrag     = (divTrackName && divDragName ? getLayer(divDragName, divTrack) : null)

	var divBegin    = (divBeginName ? getLayer(divBeginName) : null)
	var divEnd      = (divEndName   ? getLayer(divEndName)   : null)

	// Opzioni di funzionamento
	divContent.hideVerticalScrollIfNotNecessary = typeof(hideScrollIfNotNecessary)=='undefined' ? true : hideScrollIfNotNecessary
	divContent.verticalScrollStartOnOver        = startScrollOnOver
	divContent.verticalScrollSpeed              = scrollSpeed
	initVerticalScroll(divContent, divBox, divUp, divDown, divTrack, divDrag, divBegin, divEnd)
}


function verticalScrollTo(newVerticalPos) {

	if (newVerticalPos == 'top')	{
		newVerticalPos = 0
	} else if (newVerticalPos == 'bottom')	{
		newVerticalPos = -currentVerticalScrollLayer.verticalOverflow
	} 

	if (newVerticalPos > 0) {
		newVerticalPos = 0
	} else if (newVerticalPos < -currentVerticalScrollLayer.verticalOverflow) {
		newVerticalPos = -currentVerticalScrollLayer.verticalOverflow
	}
	currentVerticalScrollLayer.setTopPos(newVerticalPos)
	if (currentVerticalScrollLayer.verticalDrag) {
		var newVerticalDragPos = - Math.round(newVerticalPos * currentVerticalScrollLayer.dragSpeedScroll)
		currentVerticalScrollLayer.verticalDrag.setTopPos(newVerticalDragPos)
	}
	return false
}


function verticalScrollDragTo(newVerticalDragPos) {

	if (newVerticalDragPos == 'top')	{
		newVerticalDragPos = 0
	} else if (newVerticalDragPos == 'bottom')	{
		newVerticalDragPos = currentVerticalScrollLayer.verticalDrag.endPos
	} 

	if (newVerticalDragPos < 0) {
		newVerticalDragPos = 0
	} else if (newVerticalDragPos > currentVerticalScrollLayer.verticalDrag.endPos) {
		newVerticalDragPos = currentVerticalScrollLayer.verticalDrag.endPos
	}
	var newVerticalPos = - Math.round((newVerticalDragPos) / currentVerticalScrollLayer.dragSpeedScroll);
	currentVerticalScrollLayer.setTopPos(newVerticalPos)
	currentVerticalScrollLayer.verticalDrag.setTopPos(newVerticalDragPos)
	return false
}


/* event handler */

function verticalWheel(e) {
	var newVerticalPos = currentVerticalScrollLayer.getTopPos() + 4 * currentVerticalScrollLayer.verticalScrollSpeed * event.wheelDelta / Math.abs(event.wheelDelta)
	verticalScrollTo(newVerticalPos)
	return false
}

function verticalScrollUp() {
	return verticalScrollStart(currentVerticalScrollLayer.verticalScrollSpeed)
}


function verticalScrollDown() {
	return verticalScrollStart(-currentVerticalScrollLayer.verticalScrollSpeed)
}


function verticalScrollGoToBegin() {
	verticalScrollTo(0)
}


function verticalScrollGoToEnd() {
	verticalScrollTo(-currentVerticalScrollLayer.verticalOverflow)
}


function verticalTrackOnMouseDown(e) {
	var m = getMousePositionY(e) - currentVerticalScrollLayer.verticalDrag.trackTopPos
	if (m < currentVerticalScrollLayer.verticalDrag.getTopPos()
		|| m > currentVerticalScrollLayer.verticalDrag.getTopPos() + currentVerticalScrollLayer.verticalDrag.getLayerHeight()) {
		// jumpOnTrack
		var newVerticalDragPos = m - (currentVerticalScrollLayer.verticalDrag.getLayerHeight() / 2)
		verticalScrollDragTo(newVerticalDragPos)
	}
	// Ora il mouse è sul drag
	currentVerticalScrollLayer.verticalDrag.dSM = getMousePositionY(e)
	currentVerticalScrollLayer.verticalDrag.dSO = currentVerticalScrollLayer.verticalDrag.getTopPos()
	return verticalScrollDrag()
}


function verticalScrollDrag() {
	document.setEventHandler("onmousemove", verticalScrollDragMove)
	document.setEventHandler("onmouseup",   verticalScrollDragStop)
	return false
}


function verticalScrollDragStop() {
	document.removeEventHandler("onmousemove");
	document.removeEventHandler("onmouseup")
}


function verticalScrollDragMove(e) {
	var newVerticalDragPos = currentVerticalScrollLayer.verticalDrag.dSO + getMousePositionY(e) - currentVerticalScrollLayer.verticalDrag.dSM
	verticalScrollDragTo(newVerticalDragPos)
	return false
}


function verticalScrollStart(delta) {
	clearTimeout(verticalScrollTimerId)
	var newVerticalPos = currentVerticalScrollLayer.getTopPos() + delta
	verticalScrollTo(newVerticalPos)
	verticalScrollTimerId = setTimeout("verticalScrollStart("+delta+")", 25)
	return false
}


function verticalScrollStop() {
	if (verticalScrollTimerId) {
		clearTimeout(verticalScrollTimerId);
		verticalScrollTimerId = null
	}
}


function doNothing() {
	return false
}

