
/*
 * horizontal scrolling
 * ver 1.1.2
 *
 * last modified: 20071107
 *
 * --------------------------------
 *  1.1.2
 *  fixed javascript error if element not available 
 *  
 * --------------------------------
 * 1.1.0
 * fixed scrollbar problem if less elements displayed
 * (elemts to show > elements count) 
 * 
 * --------------------------------
 * 1.0.8
 * fixed text select during scrolling with scrollbar  
 *   
 * --------------------------------
 * 1.0.4
 * fixed IE bug if site is being scrolled in browser
 *
 *    
 */

/*
 * you may change
 */
	var elementsToShow = 4; //elements to show
	var scrollInc = 3; // elements to scroll
	var firstElement = 0; // first element 0 = standard
	
	var elementsWidth = 165; // width of the elements
	var elementsMargin = new Array( 0, 1, 0, 0); // margin of the elements (top, right, bottom, left);
	
	var parentClip = new Array(0, 663, 145, 0); // clipping of the scrollContainer
	
/*
 *
 * don't change anything below this line -----------------
 *
 */
	var elem;
	var elemsWidth;
	
	var actLeft;
	var startLeft;
	var elementsWidth;
		
	var bar;
	var actBarLeft;
	var scrollBarWidth;
	
	var clickedOnBar;
	var startXPos;
	var moved = 0;
	var actAmt = 0;
	var actPos = 0;
	var toMove = 0;
	var lessToMove = false;
	var toShow = 0;
	var temp = 0;
	var time = false;
	
/*
 * need to set up some variables ...
 */

	// initialize the vars and reset positions of elements and scrollbar
	function init() {
		if (!(document.getElementById && document.getElementById("scrollList"))) {
      return;
    }
    
		elem = document.getElementById("scrollList");
		
		//startLeft = elem.offsetLeft;
		startLeft = 0;
		actLeft = startLeft;

		bar = document.getElementById("bar");
		actBarLeft = bar.offsetLeft;
		scrollBarWidth = parseInt(document.getElementById("scrollbar").style.width);
		clickedOnBar = false;		
				
		elemsLiCount = elem.getElementsByTagName("li").length;
		
		if (elemsLiCount > elementsToShow) {
		  elemsWidth = (elemsLiCount * elementsWidth) + elemsLiCount * (elementsMargin[1] + elementsMargin[3]);
		}
		else {
      elemsWidth = elementsToShow * (elementsWidth + elementsMargin[1] + elementsMargin[3]);
    }
		
		toMove = scrollInc * elementsWidth + (scrollInc) * (elementsMargin[1] + elementsMargin[3]);
		toShow = elementsToShow * elementsWidth + (elementsToShow) * (elementsMargin[1] + elementsMargin[3]);		
		temp = toMove;
		// NOTE: probs with IE (6 & 7)
		// getClipping(document.getElementById("scrollContainer").style.clip);		
		
		clipping =  "rect("+parentClip[0]+"px, "+toShow + "px, "+parentClip[2]+"px, "+parentClip[3]+"px)";		

		// probs with IE (6 & 7) ?
		document.getElementById("scrollContainer").style.clip = clipping;		
		
		if (elemsLiCount > elementsToShow) {
		  bar.style.width = (scrollBarWidth / elemsLiCount) * elementsToShow  + "px";
		}
		bar.style.position = "absolute";
		bar.style.left = actBarLeft + "px";
        
		elem.style.width =  elemsWidth + "px";
		elem.style.position = "absolute";	
		elem.style.left = startLeft + "px";
		
		if (firstElement != 0  && firstElement <= elemsLiCount - elementsToShow) {
			moveElems((firstElement-1) * (elementsWidth + elementsMargin[1] + elementsMargin[3]) *-1);
		}
		else if (elemsLiCount > elementsToShow && firstElement > elemsLiCount - elementsToShow && firstElement <= elemsLiCount) {
			moveElems((elemsLiCount - elementsToShow) * (elementsWidth + elementsMargin[1] + elementsMargin[3]) *-1);
		}
		
		document.getElementById("scrollContainer").onselectstart = new Function("return false");
    document.getElementById("scrollContainer").ondragstart = new Function("return false");
    document.getElementById("scrolling").onselectstart = new Function("return false");
    document.getElementById("scrolling").ondragstart = new Function("return false");
      
    if (document.captureEvents)
      document.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP |Event.MOUSEMOVE);
		document.onmousedown = down;
		document.onmouseup = up;
		document.onmousemove = move;	
		
	}

/*
 * scrolling for scrolling buttons
 *
 */
	
	// calculates if full toMove way can be taken, or not
	// then moves the elements
	function scroll(amt, timeout) {
		if(time) return;
		if (amt < 0) {
			if (actLeft - toMove < elemsWidth - toShow)
				lessToMove = Math.abs((elemsWidth - toShow) + actLeft);
		}
		else {
			if (actLeft + toMove > 0)
				lessToMove = 0 - actLeft;
		}
		scrollTrue(amt, timeout);
	}
	
	// move elements and scrollbar 'amt' pixels every 'timeout' millisecond
	function scrollTrue(amt, timeout) {
		if (lessToMove && lessToMove < toMove)
			allowedToMove = lessToMove;
		else
			allowedToMove = toMove;

		if (moved + Math.abs(amt) <= allowedToMove && !stopscrolling(amt)) {
			
			moveElems(amt);
			
			moved += Math.abs(amt);
			
			time = setTimeout("scrollTrue("+amt+", "+timeout+")", timeout);
		}
		else if (moved < allowedToMove && moved + Math.abs(amt) > allowedToMove) {
		
			if (amt < 0) amt = (allowedToMove - moved) * -1;
			else amt = allowedToMove - moved;
							
			moveElems(amt);
			
			moved += Math.abs(amt);
			
			time = setTimeout("scrollTrue("+amt+", "+timeout+")", timeout);
		}
		else {
			actAmt = 0;
			lessToMove = false;
			moved = 0;
			time = false;
			resetToMove();
		}
		
	}
	
	// can be scrolled or are the elements out of field
	function stopscrolling(amt) {
		nextLeft = actLeft + amt;
		if (nextLeft <= 0 && nextLeft >= -(elemsWidth - toShow))
			return false;
		else
			return true;
	}
	
	// moves the elements amt pixels
	function moveElems(amt) {
		actLeft += amt;
		elem.style.left = actLeft + "px";
		actBarLeft -= scrollBarWidth * amt/elemsWidth;
		bar.style.left = actBarLeft+"px";
		return true;
	}


/*
 * mouse events for scrollbar
 *
 * scrolling for scrollbar
 */
 
	// handler for mousedown event
	// if mouse is pressed on the scrollbar, enable scrolling
	function down(e) {
		barL = getX(bar);
		barT = getY(bar);
		barW = parseInt(bar.style.width);
		barH = parseInt(bar.style.height);
		
		startXPos =  e ? e.pageX : window.event.x;
		var startYPos =  e ? e.pageY : window.event.y;
		if (document.all && !document.captureEvents && typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
      startXPos += document.documentElement.scrollLeft;
			startYPos += document.documentElement.scrollTop;
    }
		else if (document.all && !document.captureEvents) {
			startXPos += document.body.scrollLeft;
			startYPos += document.body.scrollTop;
		}
        
		if  (startXPos > barL-5 && startXPos < (barL + barW)+5 &&  startYPos > barT-5 && startYPos < (barT + barH)+5) {
			clickedOnBar = true;
            		    
            if(window.getSelection) {
                var sel = window.getSelection()
                sel.removeAllRanges();
            }
			return;
		}
		else {
		  up(e);
      return; 
    }
	}
	// handler for mousemove event
	// if scrolling enabled moves the scrollbar
	function move(e) {

		if (clickedOnBar) {
		
			actXPos = e ? e.pageX : window.event.x;
			
  		if (document.all && !document.captureEvents && typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') {
        actXPos += document.documentElement.scrollLeft;
      }
  		else if (document.all && !document.captureEvents) {
  			actXPos += document.body.scrollLeft;
  		}
			
			amt = Math.ceil((startXPos - actXPos) * elemsWidth / scrollBarWidth);
			if (!stopscrolling(amt))
				moveElems(amt);
			startXPos = actXPos;
			
			return false;
		}
    else return;	
	}
	// handler for mouseup event
	// stops scrolling if scrolling enabled
  function up() {
		if (clickedOnBar) {
            
			clickedOnBar = false;
			
			oneWidth = elementsWidth + elementsMargin[1] + elementsMargin[3];
			
			for (i = 0; i < elemsLiCount; i++) {
				width = i * oneWidth;
				if (Math.abs(actLeft) != width) {
					if (Math.abs(actLeft) < width) {
						temp = toMove;						
						if (Math.abs(actLeft) > width - oneWidth/2) {
							toMove = Math.abs(i * oneWidth - Math.abs(actLeft));
							if (!stopscrolling(toMove))
								scroll(-30, 25);
						}
						else {
							toMove = Math.abs(Math.abs(actLeft) - (i-1) * oneWidth);
							if (!stopscrolling(toMove))
								scroll(30, 25);
						}
						
						clickedOnBar = false;
                        return;
					}
				}
			}
			
		}
        
        return;
		
	}
	
	function resetToMove() {
		toMove = temp;
	}
	
/*
 * some helping functions
 *
 */
 	
	// returns the values of a clipping string (i.e. 'getClipping(rect(4 5 6 7))' will produce
	// parentClip[0] = 4
	// parentClip[1] = 5
	// parentClip[2] = 6
	// parentClip[3] = 7
	function getClipping(s) {
		alert(s);
		stemp = s.split(", ");
		alert(stemp);
		for (i = 0; i < stemp.length; i++) {
			parentClip[i] = parseInt(stemp[i].replace("rect(", ""));
		}
	}
	
	// returns x position of given element
	function getX(el) {
		x = el.offsetLeft;
		if (!el.offsetParent) return x;
		else return (x+getX(el.offsetParent));
	}
	// returns y position of given element
	function getY (el) {
		y = el.offsetTop;
		if (!el.offsetParent) return y;
		else return (y+getY(el.offsetParent));
	}

