// file: techhouse.js
// version: 1.4
// author: KBE20090512



// ----- object: TECHHOUSE
var TECHHOUSE = {};



// ----- object: gravity
TECHHOUSE.gravity = function() {

	var that = this;

	// method: create
	this.create = function( steps, max ) {

		// build sine array
		var sin = [];
		for( var s = 0; s < 360; s++ ) {
			sin[ s ] = Math.sin( s / 360 * 2 * Math.PI );
			}

		// create gravity values for all steps
		var steplist = [];
		for( s = 0; s < 90; s = s + ( 90 / steps ) ) {
			steplist.push( Math.round( ( max - 1 ) * sin[ Math.round( s ) ] ) );
			}

		return steplist;

		}

	}



// --- object: scroll
TECHHOUSE.scroll = {};



// --- object: scroll.verticalarrows
TECHHOUSE.scroll.verticalarrows = function( parms ) {

	this.vElem = document.getElementById( parms.viewport );
	this.cElem = document.getElementById( parms.content );
	this.pause = parms.pause;
	this.scroll = false;

	var that = this;

	// method: up
	function up() {
		that.scroll = true;
		var top = that.cElem.style.top;
		top = ( top ) ? parseInt( top.replace( /[a-z]|[A-Z]/g, "" ) ) : 0;
		var moveit = function() {
			if( that.scroll && ( top + 1 <= 0 ) ) {
				top++;
				that.cElem.style.top = top + "px";
				setTimeout( moveit, that.pause );
				}
			}
		setTimeout( moveit, that.pause );
		}

	// method: down
	function down() {
		that.scroll = true;
		var top = that.cElem.style.top;
		top = ( top ) ? parseInt( top.replace( /[a-z]|[A-Z]/g, "" ) ) : 0;
		var moveit = function() {
			if( that.scroll && ( ( 0 - ( top - that.vElem.offsetHeight ) ) < parseInt( that.cElem.offsetHeight ) ) ) {
				top--;
				that.cElem.style.top = top + "px";
				setTimeout( moveit, that.pause );
				}
			}
		setTimeout( moveit, that.pause );
		}

	function stop() {
		that.scroll = false;
		}

	// attach events
	if( that.vElem && that.cElem ) {

		var upb = document.getElementById( parms.up_button );
		if( upb ) {

			if( parms.event.toLowerCase() == 'click' ) {

				if( upb.addEventListener ) {
					upb.addEventListener( 'mousedown', up, false );
					upb.addEventListener( 'mouseup', stop, false );
					upb.addEventListener( 'mouseout', stop, false );
					}
				else if( upb.attachEvent ) { //IE
					upb.attachEvent( 'onmousedown', up );
					upb.attachEvent( 'onmouseup', stop );
					upb.attachEvent( 'onmouseout', stop );
					} 

				}

			else if( parms.event.toLowerCase() == 'hover' ) {

				if( upb.addEventListener ) {
					upb.addEventListener( 'mouseover', up, false );
					upb.addEventListener( 'mouseout', stop, false );
					}
				else if( upb.attachEvent ) { //IE
					upb.attachEvent( 'onmouseover', up );
					upb.attachEvent( 'onmouseout', stop );
					} 

				}

			}

		var downb = document.getElementById( parms.down_button );
		if( downb ) {

			if( parms.event.toLowerCase() == 'click' ) {

				if( downb.addEventListener ) {
					downb.addEventListener( 'mousedown', down, false );
					downb.addEventListener( 'mouseup', stop, false );
					downb.addEventListener( 'mouseout', stop, false );
					}
				else if( downb.attachEvent ) { //IE
					downb.attachEvent( 'onmousedown', down );
					downb.attachEvent( 'onmouseup', stop );
					downb.attachEvent( 'onmouseout', stop );
					}

				}

			else if( parms.event.toLowerCase() == 'hover' ) {

				if( downb.addEventListener ) {
					downb.addEventListener( 'mouseover', down, false );
					downb.addEventListener( 'mouseout', stop, false );
					}
				else if( downb.attachEvent ) { //IE
					downb.attachEvent( 'onmouseover', down );
					downb.attachEvent( 'onmouseout', stop );
					}

				}
			
			}

		}

	}



// ----- object: scroll.horizontalarrows
TECHHOUSE.scroll.horizontalarrows = function( parms ) {
	this.vElem = document.getElementById( parms.viewport );
	this.cElem = document.getElementById( parms.content );
	this.pause = parms.pause;
	this.scroll = false;

	var that = this;

	function left() {
		that.scroll = true;
		var left = that.cElem.style.left;
		left = ( left ) ? parseInt( left.replace( /[a-z]|[A-Z]/g, "" ) ) : 0;
		var moveit = function() {
			if( that.scroll && ( left + 1 <= 0 ) ) {
				left++;
				that.cElem.style.left = left + "px";
				setTimeout( moveit, that.pause );
				}
			}
		setTimeout( moveit, that.pause );
		}

	 function right() {
		that.scroll = true;
		var left = that.cElem.style.left;
		left = ( left ) ? parseInt( left.replace( /[a-z]|[A-Z]/g, "" ) ) : 0;
		var moveit = function() {
			if( that.scroll && ( ( 0 - ( left - that.vElem.offsetWidth ) ) < parseInt( that.cElem.offsetWidth ) ) ) {
				left--;
				that.cElem.style.left = left + "px";
				setTimeout( moveit, that.pause );
				}
			}
		setTimeout( moveit, that.pause );
		}

	function stop() {
		that.scroll = false;
		}

	// attach events
	if( that.vElem && that.cElem ) {

		var leftb = document.getElementById( parms.left_button );
		if( leftb ) {

			if( parms.event.toLowerCase() == 'click' ) {
			
				if( leftb.addEventListener ) {
					leftb.addEventListener( 'mousedown', left, false );
					leftb.addEventListener( 'mouseup', stop, false );
					leftb.addEventListener( 'mouseout', stop, false );
					}
				else if( leftb.attachEvent ) { //IE
					leftb.attachEvent( 'onmousedown', left );
					leftb.attachEvent( 'onmouseup', stop );
					leftb.attachEvent( 'onmouseout', stop );
					}

				}

			else if( parms.event.toLowerCase() == 'hover' ) {

				if( leftb.addEventListener ) {
					leftb.addEventListener( 'mouseover', left, false );
					leftb.addEventListener( 'mouseout', stop, false );
					}
				else if( leftb.attachEvent ) { //IE
					leftb.attachEvent( 'onmouseover', left );
					leftb.attachEvent( 'onmouseout', stop );
					}

				}

			}

		var rightb = document.getElementById( parms.right_button );
		if( rightb ) {

			if( parms.event.toLowerCase() == 'click' ) {

				if( rightb.addEventListener ) {
					rightb.addEventListener( 'mousedown', right, false );
					rightb.addEventListener( 'mouseup', stop, false );
					rightb.addEventListener( 'mouseout', stop, false );
					}
				else if( rightb.attachEvent ) { //IE
					rightb.attachEvent( 'onmousedown', right );
					rightb.attachEvent( 'onmouseup', stop );
					rightb.attachEvent( 'onmouseout', stop );
					}

				}

			else if( parms.event.toLowerCase() == 'hover' ) {

				if( rightb.addEventListener ) {
					rightb.addEventListener( 'mouseover', right, false );
					rightb.addEventListener( 'mouseout', stop, false );
					}
				else if( rightb.attachEvent ) { //IE
					rightb.attachEvent( 'onmouseover', right );
					rightb.attachEvent( 'onmouseout', stop );
					}

				}		

			}

		}

	}



// ----- object: marquee

TECHHOUSE.marquee = {};



// ----- object: marquee.horizontal

TECHHOUSE.marquee.horizontal = function( parms ) {

	var that = this;

	// calculate gravity
	var g = new TECHHOUSE.gravity();
	var gravity_dec = g.create( parms.steps, parms.jump );
	gravity_dec.reverse();
	var gravity_inc = g.create( parms.steps, parms.jump );

	// viewport and content
	var vElem = document.getElementById( parms.viewport );
	var cElem = document.getElementById( parms.content );

	// left and right arrows
	var alElem = document.getElementById( parms.arrowleft );
	var arElem = document.getElementById( parms.arrowright );

	// functions to play and pause
	function play() { scroll = true; }
	function pause() { scroll = false; }

	// pause and play when mouse moves over content
	if( cElem ) {
		if( cElem.addEventListener ) {
			cElem.addEventListener( 'mouseover', pause, false );
			cElem.addEventListener( 'mouseout', play, false );
			}
		else if( cElem.attachEvent ) { //IE
			cElem.attachEvent( 'onmouseover', pause );
			cElem.attachEvent( 'onmouseout', play );
			}
		}

	// functions to go left and right
	function left() { direction = 0; scroll = true; }
	function right() { direction = 1; scroll = true; }

	// pause and play when mouse moves over left arrow
	if( alElem ) {
		if( alElem.addEventListener ) {
			alElem.addEventListener( 'mousedown', left, false );
			alElem.addEventListener( 'mouseup', pause, false );
			alElem.addEventListener( 'mouseover', pause, false );
			alElem.addEventListener( 'mouseout', play, false );
			}
		else if( alElem.attachEvent ) { //IE
			alElem.attachEvent( 'onmousedown', left );
			alElem.attachEvent( 'onmouseup', pause );
			alElem.attachEvent( 'onmouseover', pause );
			alElem.attachEvent( 'onmouseout', play );
			}
		}

	if( arElem ) {
		if( arElem.addEventListener ) {
			arElem.addEventListener( 'mousedown', right, false );
			arElem.addEventListener( 'mouseup', pause, false );
			arElem.addEventListener( 'mouseover', pause, false );
			arElem.addEventListener( 'mouseout', play, false );
			}
		else if( arElem.attachEvent ) { //IE
			arElem.attachEvent( 'onmousedown', right );
			arElem.attachEvent( 'onmouseup', pause );
			arElem.attachEvent( 'onmouseover', pause );
			arElem.attachEvent( 'onmouseout', play );
			}
		}

	direction = 1; //0=left, 1=right
	var scroll = true;

	if( vElem && cElem ) {

		var cEnd = parseInt( cElem.offsetWidth ) - parseInt( vElem.offsetWidth ) - parms.steps;
		
		var left = cElem.style.left;
		left = ( left ) ? parseInt( left.replace( /[a-z]|[A-Z]/g, "" ) ) : 0;

		var moveit = function() {

			// calculate gravity jump
			var gravity_jump = parms.jump;
			if( 0 - left < parms.steps ) {
				gravity_jump = gravity_inc[ 0 - left ] + 1;
				}
			else if( 0 - left > cEnd ) {
				gravity_jump = gravity_dec[ 0 - left - cEnd - 1 ] + 1;
				}

			var pause = parms.pause;

			switch( direction ) {

				// left
				case 0:
					if( scroll ) {

						// move content
						if( left + parms.jump <= 0 ) {
							left = left + gravity_jump;
							cElem.style.left = left + "px";
							}
						else {
							direction = 1;
							pause = parms.wait;
							}
						
						}

					break;

				// right
				case 1:
					if( scroll ) {

						// move content
						if( ( 0 - ( left - vElem.offsetWidth ) ) < parseInt( cElem.offsetWidth ) ) {
							left = left - gravity_jump;
							cElem.style.left = left + "px";
							}
						else {
							direction = 0;
							pause = parms.wait;
							}

						}

					break;

				}

			setTimeout( moveit, pause );
			}

		setTimeout( moveit, parms.pause );
		}

	}



// ----- object: image

TECHHOUSE.image = {};



// ----- object: image.doublefade

TECHHOUSE.image.doublefade = function( parms ) {

	this.img1elem = document.getElementById( parms.image1 );
	this.img2elem = document.getElementById( parms.image2 );
	this.speed = ( parms.speed ) ? parms.speed : 5;
	this.change = ( parms.change ) ? parms.change : 5;

	TECHHOUSE.image.changeOpacity( this.img1elem, 100 );
	TECHHOUSE.image.changeOpacity( this.img2elem, 0 );

	this.img1opacity = 100;
	this.img2opacity = 0;

	this.timer = null;
	this.fadeOperation = 0; // 0=no fading, 1=1down2up in progress, 2=1up2down in progress

	var that = this;

	function fade1down2up() {
		that.fadeOperation = 1;
		beginFade();
		}

	function fade1up2down() {
		that.fadeOperation = 2;
		beginFade();
		}

	function beginFade() {
		if( that.timer ) { clearTimeout( that.timer ); }

		var fade = function() {
			if( ( that.fadeOperation == 1 ) && ( that.img1opacity > 0 ) ) {
				that.img1opacity -= that.change;
				that.img1opacity = ( that.img1opacity < 0 ) ? 0 : that.img1opacity;
				that.img2opacity += that.change;
				that.img2opacity = ( that.img2opacity > 100 ) ? 100 : that.img2opacity;
				TECHHOUSE.image.changeOpacity( that.img1elem, that.img1opacity );
				TECHHOUSE.image.changeOpacity( that.img2elem, that.img2opacity );
				that.timer = setTimeout( fade, that.speed );
				}
			else if ( ( that.fadeOperation == 2 ) && ( that.img1opacity < 100 ) )
			{
				that.img1opacity += that.change;
				that.img1opacity = ( that.img1opacity > 100 ) ? 100 : that.img1opacity;
				that.img2opacity -= that.change;
				that.img2opacity = ( that.img2opacity < 0 ) ? 0 : that.img2opacity;
				TECHHOUSE.image.changeOpacity( that.img1elem, that.img1opacity );
				TECHHOUSE.image.changeOpacity( that.img2elem, that.img2opacity );
				that.timer = setTimeout( fade, that.speed );
				}
			else {
				that.fadeOperation = 0;
				}
			}
		that.timer = setTimeout( fade, that.speed );

		}

	// attach events
	if( this.img1elem && this.img2elem ) {

		if( this.img1elem.addEventListener ) {
			this.img1elem.addEventListener( 'mouseover', fade1down2up, false );
			this.img1elem.addEventListener( 'mouseout', fade1up2down, false );
			}
		else if( this.img1elem.attachEvent ) { //IE
			this.img1elem.attachEvent( 'onmouseover', fade1down2up );
			this.img1elem.attachEvent( 'onmouseout', fade1up2down );
			} 

		}

	}



// ----- function: image.changeOpacity

TECHHOUSE.image.changeOpacity = function( elem, value ) {

	if( elem ) {
		elem.style.opacity = ( value / 100 );
		elem.style.MozOpacity = ( value / 100 );
		elem.style.KhtmlOpacity = ( value / 100 );
		elem.style.filter = "alpha(opacity=" + value + ")"; 
		}

	}



// ----- function: setColorBack

TECHHOUSE.setColorBack = function( down, color ) {

	var IE7 = ( navigator.appVersion.indexOf( "MSIE 7." ) == -1 ) ? false : true;

	var colorbackE = document.getElementById( 'colorback' );
	if( ! colorbackE ) {
		colorbackE = document.createElement( 'div' );
		colorbackE.setAttribute( 'id', 'colorback' );
		colorbackE.style.position = 'absolute';
		colorbackE.style.left = '0px';
		colorbackE.style.width = '100%';
		colorbackE.style.backgroundColor = color;
		colorbackE.style.zIndex = '-1';
		document.body.appendChild( colorbackE );
		}

	var sidecentreringE = document.getElementById( 'sidecentrering' );

	var offsetTop = sidecentreringE.offsetTop;
	if( IE7 ) { offsetTop = offsetTop / 2; }

	if( colorbackE && sidecentreringE ) {
		colorbackE.style.top = ( offsetTop + down ) + 'px';
		var height = document.body.scrollHeight - offsetTop;
		colorbackE.style.height = ( height - down ) + 'px';
		}

	}



