function pad(number, length) {
   
    var str = '' + number;
    while (str.length < length) {
        str = '0' + str;
    }
   
    return str;

}

function isiPad(){
    return (navigator.platform.indexOf("iPad") != -1);
}


function Helper ()
{
	var t = this;
	this.history = window.History; // Note: We are using a capital H instead of a lower h    
	
	this.setLocationAppendix = function (appendix)
	{
		/*var p = (window.location+'').split('#')[0];
		this.log('base='+p);
		window.location = p+'#'+appendix*/
		
		
	}
	this.setPage = function(pid)
	{
		t.history.pushState({state:pid},"DesignBook 2011 : Seite "+pid,"?page="+pid);
		//this.setLocationAppendix('page='+pid)
	}
	this.log = function(msg)
	{
		/** nur für firefox **/
		if ( $.browser.mozilla )
			t.internalLog(msg);		
	}
	this.debug = function(msg)
	{
		/** debug **/
		t.internalLog(msg);
	}
	this.internalLog = function(msg)
	{
		if ( $.browser.mozilla )
			console.log(msg);
		else
			alert(msg);
	}
}

function IPAD ( frame, slider, maxPages, realIpad )
{
	var t = this;	
	this.frame = frame;	
	this.slider = slider;
	this.isLandscape = true;
	this.currentPosition = 0;	
	this.previousPosition = 0;
	this.preventPositionToggleCounter = 0;
	this.hlp = new Helper();
	this.maxPages = maxPages;
	this.realIpad = realIpad;
	
	/** settings **/
	this.rotateDuration = 1000;
	this.slideDuration = 1000;
	this.tileWidth = 872;
	this.generalOffset = 0;
	this.portraitRanges = [ [63,81] ];
	this.pageRange = [ 0, this.maxPages ];
	
	this.setLandscape = function ( b , force )
	{
		if ( t.realIpad )
			return;
		
		var visH = $(window).height();
		var ipH = t.frame.height();
		var ipW = t.frame.width();
		
		var factor = visH / ipH;
		
		if ( !b )
			 factor = visH / ipW;
		
		var moveY = -( ipH - visH )/2;
		
		if ( factor > 1 )
		{
			factor = 1;
			moveY = 0;
		}
		 
		
		if ( (b && !t.isLandscape) || ( b && force ) )
		{
			t.frame.stop(true,true);
			t.frame.animate( { transform: 'rotate(0deg) scale('+factor+') translateY('+moveY+'px)'}, t.rotateDuration );
			t.isLandscape = true;
			
		} else if ( ( !b && t.isLandscape ) || ( !b && force ) ) {
			t.frame.stop(true,true);
			t.frame.animate( { transform: 'rotate(90deg) scale('+factor+') translateY('+moveY+'px)'}, t.rotateDuration );
			t.isLandscape = false;
			
			
		}
	}
	
	this.loadImage = function (pid)
	{
		var destID = "page_"+pad(pid,3);
		var dest = $('#'+destID);
		var realSrc = dest.attr('full');
		//t.hlp.debug(realSrc);
		//if ( $.browser.mozilla )
			dest.attr('src',realSrc);
		//else
		//	dest.get(0).src = realSrc;
	}
	
	this.showProcessing = function (b)
	{
		var pdiv = $('#processing');
		if ( b )
			pdiv.fadeIn();
		else
			pdiv.fadeOut();
	}
	
	this.slideToPreview = function (offset) {
		var pixPos = - t.currentPosition * t.tileWidth + t.generalOffset;
		pixPos+=offset;
		t.slider.animate({ transform: 'translateX('+pixPos+'px)' },1);
	}
	
	this.slideTo = function (newpos) {
		
		if ( newpos < 0 )
			newpos = 0;
		if ( newpos > t.maxPages )
			newpos = t.maxPages;
		
		t.loadImage(newpos);
		
		
		
		if ( newpos > t.pageRange[0] )
			t.loadImage(newpos-1);
		if ( newpos < t.pageRange[1] )
			t.loadImage(newpos+1);
		
		
		
		
		var diff = newpos - t.currentPosition; 
		var pixPos = - newpos * t.tileWidth + t.generalOffset;
		
		var shouldBeLandscape = true;
		for ( var i = 0 ; i < t.portraitRanges.length ; i++ )
		{
			var range =  t.portraitRanges[i];
			if ( newpos >= range[0] && newpos <= range[1] )
				shouldBeLandscape = false;
		}
		
		t.showProcessing(true);
		
		t.setLandscape(shouldBeLandscape,false);
		
		t.slider.stop(true, true);
		t.slider.animate({ transform: 'translateX('+pixPos+'px)' },1000, function () {
			t.showProcessing(false);
		});
		
		t.previousPosition = t.currentPosition;
		t.currentPosition = newpos;
		
		t.hlp.setPage(newpos);
		
		
		
	}
	
	
	
}


function ITDSSlider( ip, slO, maxPages, realIpad )
{
	var t = this;
	
	this.realIpad = realIpad;
	this.slider = slO;
	this.sbox = null;
	this.ipad = null;
	this.scrollOffset = 872;
	this.scrollCurrent = 0;
	
	this.maxPages = maxPages;
	
	this.rotateDuration = 1000;
	
	this.init = function() {
		
		if ( t.realIpad )
		{
			ip.css('background-image','none');
			ip.css('margin','0');
			t.slider.css('top','0px');
			t.slider.css('left','90px');
			t.slider.css('background-image','none');
			t.slider.css('border-style','none');
			var hb = $('#home_button');
			hb.css('background-image','url(\'images/fw/home.png\')');
			hb.css('width','94px');
			hb.css('height','100px');
			hb.css('left','0px');
			hb.css('top','272px');
			var pb = $('#processing');
			pb.css('top','275px');
			pb.css('left','413px');
			var hlpb = $('#help');
			hlpb.css('top','218px');
			hlpb.css('left','376px');
		}
		
		var oc = t.slider.html();
		t.slider.html("<div class=\"slidebox\">"+oc+"</div>");
		t.sbox = $( t.slider.find('.slidebox:first') );
		t.slider.mousewheel( function (ev,delta) { t.scrollEvent(ev,delta) } )
		
		t.slider.gestures({ showTrail: false, advancedShapes: false, tolerance: 50, eventHandler: function (evName,cmPoint) {
			t.ipad.hlp.log('Gesture Event '+evName);
			
			
			if ( t.ipad.isLandscape )
			{			
				if ( evName == 'S' || evName == 'W')
					t.ipad.slideTo(t.ipad.currentPosition+1);
				if ( evName == 'N' || evName == 'E')
					t.ipad.slideTo(t.ipad.currentPosition-1);
			} else {
				if ( evName == 'S' || evName == 'E')
					t.ipad.slideTo(t.ipad.currentPosition-1);
				if ( evName == 'N' || evName == 'W')
					t.ipad.slideTo(t.ipad.currentPosition+1);
			}
			
		}, eventHandlerAdvanced: function (directions) {
			// Local variable directions, returns a list of direction objects to be used to form a "shape"
			//var output = GetCombinedName(directions, false, false);

			//t.ipad.hlp.log('Gesture Event - advancend : ')
			//t.ipad.hlp.log(directions);
		}, executeOnMove: function (dx,dy) {
			//t.ipad.hlp.log('Gesture onMove '+dx+"/"+dy);
			if ( t.ipad.isLandscape )
			{
				t.ipad.slideToPreview(dx);
			} else {
				t.ipad.slideToPreview(dy);
			}
		} });
		
		
		if ( t.realIpad )
		{
			t.slider.touchwipe({
				wipeLeft : function() {
					t.ipad.slideTo(t.ipad.currentPosition+1);
				},
				wipeRight : function() {
					t.ipad.slideTo(t.ipad.currentPosition-1);
				},
				preventDefaultEvents: true
			});
		}
			
		t.ipad = new IPAD(ip,t.sbox,t.maxPages,t.realIpad);
		
		if ( $.browser.mozilla )
		{
			$(document).keypress( function (event) {
				t.keyHandler(event);
			});
		} else {
			$(document).keyup( function (event) {
				t.keyHandler(event);
			});
		}
		
		// Prepare
	    var History = window.History; // Note: We are using a capital H instead of a lower h
	    if ( !History.enabled ) {
	         // History.js is disabled for this browser.
	         // This is because we can optionally choose to support HTML4 browsers or not.
	        return false;
	    }

	    // Bind to StateChange Event
	    History.Adapter.bind(window,'statechange',function(){ // Note: We are using statechange instead of popstate
	        var State = History.getState(); // Note: We are using History.getState() instead of event.state
	        t.ipad.hlp.log("state changed");
	        t.ipad.hlp.log(State);
	        var state_page_id = State.data.state;
	        if ( state_page_id != t.ipad.currentPosition )
	        {
	        	if ( state_page_id == t.ipad.previousPosition )
	        		t.ipad.preventPositionToggleCounter++;
	        	else
	        		t.ipad.preventPositionToggleCounter = 0;
	        	
	        	if ( t.ipad.preventPositionToggleCounter < 5 )
	        	{
	        		t.ipad.hlp.log("state changed - handle as change request -> slide to requested state");
	        		t.ipad.slideTo(state_page_id);
	        	} else {
	        		
	        		t.ipad.preventPositionToggleCounter = 0;
	        	}
	        }
	        //History.log(State.data, State.title, State.url);
	    });
		
	    t.slider.fadeIn();
		
	}
	
	this.keyHandler = function (event) {
		t.ipad.hlp.log('key='+event.keyCode);
		
		switch ( event.keyCode )
		{
		case 38: /*up*/
		case 39: /*right*/
			event.preventDefault();
			t.ipad.slideTo(t.ipad.currentPosition+1);
			break;
		case 40: /*down*/
		case 37: /*left*/
			event.preventDefault();
			t.ipad.slideTo(t.ipad.currentPosition-1);
			break;
		}
	}
	
	
	this.scrollEvent = function(event,delta) {		
		t.ipad.hlp.log(delta)		
		event.preventDefault();
		if ( delta > 0  )
		{
			t.ipad.slideTo(t.ipad.currentPosition+1);
			
		}
		else if ( delta < 0 )
		{
			t.ipad.slideTo(t.ipad.currentPosition-1);
			
		}
	}
	
	this.init();
}


function showHelp()
{
	
	$('#help').fadeIn();
	
}
function closeHelp()
{
	$('#help').fadeOut();
}
function showSearch()
{
	resetSearch();
	var sc = document.getElementById("search_container");
	sc.style.display = "block";
	document.getElementById("searchField").focus();
}
function closeSearch()
{
	var sc = document.getElementById("search_container");
	sc.style.display = "none";
	resetSearch();
}
function resetSearch()
{
	document.getElementById("output").innerHTML = "";
	document.getElementById("searchField").value = "";
} 

var suggestions = new Array();

function loadSuggestions(request)
{
	var data = request.responseText;
	var dataA = data.split("\n");
	for ( var i = 0 ; i < dataA.length ; i++ )
	{
		var dataA2 = new Array();
		dataA2[0] = dataA[i].split("\"")[3];
		dataA2[1] = dataA[i].split("\"")[1];
		suggestions[suggestions.length] = dataA2;
	}
	window.setInterval("lookAt()", 100);
	
	document.onkeydown = keygetter; //needed for Opera...
	document.onkeyup = keyHandler;
	var t = document.getElementsByName("text")[0];
	t.value = "";
}

/*********** Autocomplete ************************/
/** SRC: http://www.vonloesch.de/node/18  **/

	
	var outp;
	var oldins;
	var posi = -1;
	var words = new Array();
	var input;
	var key;

	function setVisible(visi){
		var x = document.getElementById("shadow");
		var t = document.getElementsByName("text")[0];
		//x.style.position = 'absolute';
		//x.style.top =  (findPosY(t)+3)+"px";
		//x.style.left = (findPosX(t)+2)+"px";
		x.style.visibility = visi;
	}

	function init_autocomplete(){
		outp = document.getElementById("output");
		setVisible("hidden");
		var t = document.getElementsByName("text")[0];
		t.value = "Lade Daten, bitte warten...";
		var file = "keywords.csv";
		ajax_request(file,"loadSuggestions",new Array());
		
	}

	function findPosX(obj)
	{
		var curleft = 0;
		if (obj.offsetParent){
			while (obj.offsetParent){
				curleft += obj.offsetLeft;
				obj = obj.offsetParent;
			}
		}
		else if (obj.x)
			curleft += obj.x;
		return curleft;
	}

	function findPosY(obj)
	{
		var curtop = 0;
		if (obj.offsetParent){
			curtop += obj.offsetHeight;
			while (obj.offsetParent){
				curtop += obj.offsetTop;
				obj = obj.offsetParent;
			}
		}
		else if (obj.y){
			curtop += obj.y;
			curtop += obj.height;
		}
		return curtop;
	}
	
	function lookAt(){
		var ins = document.getElementsByName("text")[0].value;
		if (oldins == ins) return;
		else if (posi > -1);
		else if (ins.length > 0){
			words = getWord(ins);
			if (words.length > 0){
				clearOutput();
				for (var i=0;i < words.length; ++i) addWord (words[i]);
				setVisible("visible");
				input = document.getElementsByName("text")[0].value;
			}
			else{
				setVisible("hidden");
				posi = -1;
			}
		}
		else{
			setVisible("hidden");
			posi = -1;
		}
		oldins = ins;
	}
	
	function addWord(word){
		var sp = document.createElement("div");
		sp.appendChild(document.createTextNode(word[0]));
		sp.onmouseover = mouseHandler;
		sp.onmouseout = mouseHandlerOut;
		sp.onclick = function() {
			slider.ipad.slideTo(word[1]*1.0+0);
			closeSearch();
		};
		outp.appendChild(sp);
	}
	
	function clearOutput(){
		while (outp.hasChildNodes()){
			noten=outp.firstChild;
			outp.removeChild(noten);
		}
		posi = -1;
	}
	
	function getWord(beginning){
		var words = new Array();
		for (var i=0;i < suggestions.length; ++i){
			var j = -1;
			var correct = 1;
			while (correct == 1 && ++j < beginning.length){
				var s = suggestions[i];
				var sw = s[0];
				if ( sw )
				{
					var lc = sw.toLowerCase();
					if ( lc.charAt(j) != beginning.toLowerCase().charAt(j)) correct = 0;
				} else {
					correct = 0;
				}
			}
			
			if (correct == 1) {
				words[words.length] = suggestions[i];
			}
		}
		return words;
	}
	
	function setColor (_posi, _color, _forg){
		outp.childNodes[_posi].style.background = _color;
		outp.childNodes[_posi].style.color = _forg;
	}
	
	function keygetter(event){
		if (!event && window.event) event = window.event;
		if (event) key = event.keyCode;
		else key = event.which;
	}
		
	function keyHandler(event){
		if (document.getElementById("shadow").style.visibility == "visible"){
		var textfield = document.getElementsByName("text")[0];
		if (key == 40){ //Key down
			//alert (words);
			if (words.length > 0 && posi < words.length-1)
			{
				if (posi >=0) setColor(posi, "#fff", "black");
				else input = textfield.value;
				setColor(++posi, "darkgrey", "white");
				textfield.value = outp.childNodes[posi].firstChild.nodeValue;
				textfield.form.action = outp.childNodes[posi].getAttribute("url");
			}
		}
		else if (key == 38){ //Key up
			if (words.length > 0 && posi >= 0){
				if (posi >=1){
					setColor(posi, "#fff", "black");
					setColor(--posi, "darkgrey", "white");
					textfield.value = outp.childNodes[posi].firstChild.nodeValue;
					textfield.form.action = outp.childNodes[posi].getAttribute("url");
				}
				else{
					setColor(posi, "#fff", "black");
					textfield.value = input;
					textfield.focus();
					posi--;
				}
			}
		}
		else if (key == 27){ // Esc
			textfield.value = input;
			setVisible("hidden");
			posi = -1;
			oldins = input;
		}
		else if (key == 8){ // Backspace
			posi = -1;
			oldins=-1;
		}
		}
	}
	
	var mouseHandler=function(){
		for (var i=0; i < words.length; ++i)
			setColor (i, "white", "black");
	
		this.style.background = "darkgrey";
		this.style.color= "white";
	}
	
	var mouseHandlerOut=function(){
		this.style.background = "white";
		this.style.color= "black";
	}
	
	var mouseClick=function(){
		document.getElementsByName("text")[0].value = this.firstChild.nodeValue;
		setVisible("hidden");
		posi = -1;
		oldins = this.firstChild.nodeValue;
	}
	
	/* AJAX-Request...  ( Quelle: ITDS SimpleCRM )
	  url:          XML-Request an den Server
	  callback:     fï¿½hrt zum Aufruf callback(myreq,opt1,opt2,..);
	  callbackopts: new Array('opt1','opt2',...);
	*/
	function ajax_request(url,callback,callbackopts)
	{
	   var myreq;
	   // XML-Request vorbereiten
	   if (window.XMLHttpRequest) {
	       myreq = new XMLHttpRequest();
	   } else if (window.ActiveXObject) {
	       myreq = new ActiveXObject("Microsoft.XMLHTTP");
	   } else {
	       alert("Your Browser does probably not support XMLHTTP-Requests\nThis application requires XMLHTTP-Requests.");
	       return null;
	   }  
	   
	   // Abfrage senden
	   myreq.open("GET", url, true);
	   
	   // Funktion erstellen, welche die Resultate verarbeitet
	   myreq.onreadystatechange = function() {
	        // state kontrollieren
	        if (myreq.readyState == 4) {
	            // wenn alles klappt gibt's ein HTTP-200
	            if (myreq.status == 200) {
	            
	                // argumente zusammenbasteln
	                var fstring = "";
	                for ( var i = 0; i<callbackopts.length; i++ )
	                {
	                    fstring += ",\""+callbackopts[i]+"\"";
	                }

	                // funktion zusammensetzen & ausfï¿½hren
	                eval(callback+"(myreq"+fstring+");");
	              
	                    
	            } else {
	            	if ( myreq.status != 0 )
	    		        alert("Ooups... AJAX Error:\nCould not read XML-Data: "+myreq.status);
		        }
	        }
	   };
	   myreq.send(null);
	}	
	
	
	function showForm()
	{
		document.getElementById("formIF").style.display = "none";
		document.getElementById("form").style.display = "block";
		document.getElementById("form").reset();
		var f = $("#formular");
		f.fadeIn();
	}
	function hideForm()
	{
		var f = $("#formular");
		f.fadeOut();
	}
	function sendForm(form)
	{
		var el = form.elements;
		var data = "";
		for ( var i = 0 ; i < el.length ; i++ )
		{
			var e = el[i];
			var en = e.name+"";
			var et = e.type+""
			if ( en.length > 0 && et != "submit" && et != "reset" )
			{
				data += "&"+en+"="+e.value;	
			}
		}
		//alert(data);
		document.getElementById("formIF").style.display = "block";
		document.getElementById("formIF").src = "http://mkobel.itds.ch/DesignBook/send2012.php?"+data;
		document.getElementById("form").style.display = "none";
	}



	
	




