/*
	erste stiftung page manager
	(c) 2008 mass:werk - media environments, www.masswerk.at
*/

var PageManager = {

	// config

	flashContainerId: 'header_flashcontainer',
	flashContainerHeight: 359,
	pageContainerId: 'page',
	spacerId: 'header_bottomspacer',
	spacerHeight: 24,
	copystatementId: 'copystatement',
	navContainerId:  'header_topbar_nav',
	preferedFlashObject: -1, // ordinal number or negative value for random
	preferedFlashObjectProbability: 0.6, // 0 <= value <= 1

	/*
		config-objects for flash movies from left to right:

		swf: filename without extension
		config: path to config file or empty string
		bgImage: path to bg-image or empty
		bgColor: solid bg-color (hex string)
		urlParams: array of strings to match
	*/
	flashObjects: [
		{
			swf: '/swf/ErsteStiftungByProgram',
			config: '/configByProgram.xml',
			bgImage: '/grafik/flash_bg_0.jpg',
			bgColor: '#3c3c3c',
			toolTip: 'View by Programme',
			urlParams: [ 'programme', 'viewbyprogram', 'program', 'viewbyprogramme' ]
		},
		{
			swf: '/swf/ErsteStiftungByConcept',
			config: '/configByConcept.xml',
			bgImage: '/grafik/flash_bg_1.jpg',
			bgColor: '#a2b9a9',
			toolTip: 'View by Concept',
			urlParams: [ 'concept', 'viewbyconcept' ]
		},
		{
			swf: '/swf/ErsteStiftungDanube',
			config: '/configDanubePanorama.xml',
			bgImage: '',
			bgColor: '#0a0d0d',
			toolTip: 'Danube Panorama',
			urlParams: [ 'danube','panorama', 'danubepanorama', 'danube-panorama' ]
		}
	],
	
	navImages: {
		'off': '/grafik/navpoint_off.gif',
		'over': '/grafik/navpoint_over.gif',
		'on': '/grafik/navpoint_on.gif'
	},
	
	navIdPrefix: 'topbar_nav_',
	
	// public
	
	writeNavigation: function(initialOpen) {
		this._checkUrlParam();
		if (this._initial) {
			initialOpen=true;
		}
		else {
			initialOpen=(self.location.pathname == '/' && self.location.search=='');
		}
		if (initialOpen && this._initialFlashFile<0) {
			if (this.preferedFlashObject>=0) {
				this._initialFlashFile=(Math.random()<this.preferedFlashObjectProbability)? this.preferedFlashObject:Math.floor(Math.random()*this.flashObjects.length);
			}
			else {
				this._initialFlashFile=Math.floor(Math.random()*this.flashObjects.length);
			}
		}
		var element = this.getElementById(this.navContainerId);
		if (!element) return;
		var s='<table border="0" cellspacing="0" cellpadding="0" align="right">\n<tbody>\n<tr>\n';
		for (var i=0; i<this.flashObjects.length; i++) {
			var imgsrc = (initialOpen && i==this._initialFlashFile)? this.navImages.on:this.navImages.off;
			var fo=this.flashObjects[i];
			var title = (fo && fo.toolTip)? fo.toolTip:'';
			s+='<td height="22" valign="bottom"><a href="#" onclick="PageManager.showFlash('+i+'); return false;" onmouseover="PageManager.hilite('+i+', true); return true;" onmouseout="PageManager.hilite('+i+', false); return true;" onfocus="if (this.blur) this.blur();"><img id="topbar_nav_'+i+'" src="'+imgsrc+'" alt="'+title+'" title="'+title+'" border="0" width="16" height="16" /></a></td>';
		}
		s+='<td width="13"></td>\n</tr>\n<tr>\n</tbody>\n</table>';
		if (initialOpen) {
			this._selectedNavItem=this._initialFlashFile;
			this._initial=this._flashExpanded=true;
			this.writeFlashTag(this._initialFlashFile);
			var el = this.getElementById(this.flashContainerId);
			if (el && el.style) {
				el.style.height=this.flashContainerHeight+'px';
				el.style.display='block';
			}
			el = this.getElementById(this.spacerId);
			if (el && el.style) {
				el.style.height=this.spacerHeight+'px';
				el.style.display='block';
			}
		}
		element.innerHTML=s;
	},

	hideFlash: function() {
		this._hideFlash();
	},

	showFlash: function(n) {
		this._showFlash(n);
	},
	
	showPage: function(url) {
		this._nextPage=url;
		this._hideFlash();
	},
	
	hilite: function(n, val, changeSelection) {
		if ((!changeSelection && n==this._selectedNavItem) || !document.images) return;
		if (changeSelection) {
			if (n==this._selectedNavItem) {
				if (!val) {
					document.images[this.navIdPrefix+n].src=this.navImages.off;
					this._selectedNavItem=-1;
				}
			}
			else if (val) {
				document.images[this.navIdPrefix+n].src=this.navImages.on;
				if (this._selectedNavItem>=0) {
					var img = document.images[this.navIdPrefix+this._selectedNavItem];
					if (img) img.src=this.navImages.off;
				}
				this._selectedNavItem=n;
			}
		}
		else {
			document.images[this.navIdPrefix+n].src = (val)? this.navImages.over:this.navImages.off
		}
	},
	
	// private
	
	_checkUrlParam: function() {
		// detect any url params for initial view
		var s = self.location.search;
		if (s.length>0) {
			var urlParams2ordinal=new Object();
			for (var j=this.flashObjects.length-1; j>=0; j--) {
				var params=this.flashObjects[j].urlParams;
				if (params && params.length) {
					for (var k=0; k<params.length; k++) urlParams2ordinal[params[k]]=j;
				}
			}
			s=s.substring(1);
			var parts=s.split('&');
			for (var i=0; i<parts.length; i++) {
				var p = parts[i].split('=',2);
				var key=p[0];
				var value=p[1];
				if (key!='' && key.toLowerCase()=='flash' && value!='') {
					value=urlParams2ordinal[value.toLowerCase()];
					if (value != undefined) {
						this._initialFlashFile=value;
						this._initial=true;
						return;
					}
				}
			}
		}
	},
	
	_flashExpanded: false,
	_locked: false,
	_initial: false,
	
	_selectedNavItem: -1,
	_nextPage: '',
	_initialFlashFile: -1,

	_hideFlash: function() {
		if (!this._flashExpanded || this._locked) return;
		this._locked=true;
		if (this._selectedNavItem>=0) this.hilite(this._selectedNavItem, false, true);
		if (window._isGenricMSIE6) {
			var el=this.getElementById(this.flashContainerId);
			if (el) el.innerHTML='&nbsp;';
		}
		if (this._initial) {
			this.collapseClipping(this.flashContainerId, this.flashContainerHeight, 1000, 20, this._hideFlashNextStep);
			this.collapseClipping(this.spacerId, this.spacerHeight, 1000, 10);
			//this.fadeOut(this.copystatementId, 1000, 15);
			this._initial=false;
		}
		else {
			this.collapseClipping(this.flashContainerId, this.flashContainerHeight, 1000, 20, this._hideFlashFinished);
		}
	},
	
	_hideFlashNextStep: function() {
		//PageManager.fadeIn(PageManager.pageContainerId, 1000, 15, PageManager._hideFlashFinished);
		setTimeout('PageManager._hideFlashFinished()', 1);
	},
	
	_hideFlashFinished: function() {
		var element = PageManager.getElementById(PageManager.flashContainerId);
		if (element) element.innerHTML='';
		PageManager._flashExpanded=false;
		if (PageManager._nextPage) {
			window.location.href=PageManager._nextPage;
		}
		else {
			PageManager._locked=false;
		}
	},

	_showFlash: function(n) {
		this._nextPage='';
		if (n==this._selectedNavItem && !this._initial) {
			this._hideFlash();
			return;
		};
		var el=this.getElementById(this.flashContainerId);
		if (!el) return;
		this.hilite(n, true, true);
		var fo = this.flashObjects[n];
		el.style.bacgroundColor = fo.bgColor;
		if (!this._flashExpanded && window._isGenricMSIE6) {
			el.innerHTML='&nbsp;';
			if (fo.bgImage) {
				el.style.backgroundImage='url("'+fo.bgImage+'")';
				el.style.backroundRepeat='repeat-y';
			}
			else {
				el.style.backgroundImage='none';
			}
		}
		else {
			this.writeFlashTag(n);
		}
		if (this._flashExpanded || this._locked) return;
		this._locked=true;
		PageManager.expandClipping(PageManager.flashContainerId, PageManager.flashContainerHeight, 1200, 22, PageManager._showFlashFinished);
	},
	
	_showFlashFinished: function() {
		if (window._isGenricMSIE6) PageManager.writeFlashTag(PageManager._selectedNavItem);
		PageManager._flashExpanded=true;
		PageManager._locked=false;
	},
	
	// basic methods
	
	getElementById: function(id) {
		if (document.getElementById) {
			return document.getElementById(id);
		}
		else if (document.all) {
			return document.all[id];
		}
		else {
			return null;
		}
	},
	
	setOpacity: function(element, value) {
		// 0 > value < 1.0
		if (element && element.style) {
			if (value>1) value=1
			else if (value<=0) value=0;
			if (typeof element.style.opacity != 'undefined') {
				element.style.opacity=value;
			}
			if (typeof element.style.filter != 'undefined') {
				var fstr=(value<1)? 'Alpha(Opacity='+parseInt(value*100)+')' : '';
				element.style.filter=fstr;
				if (element.style.position != 'absolute') {
					if (element.children) {
						var cil=element.children.length;
						for (var i=0; i<cil; i++) {
							var ci=element.children[i];
							if (ci.style) {
								ci.style.filter=fstr
							}
						}
					}
				}
			}
			else if (typeof element.style.MozOpacity != 'undefined') {
				element.style.MozOpacity=value;
			}
			else if (typeof element.style.KhtmlOpacity != 'undefined') {
				element.style.KhtmlOpacity=value;
			}
		}
	},
	
	Fader: function(element, duration, steps, direction, callback) {
		this.element= element;
		this.delay=Math.round(duration/steps);
		this.callback=callback;
		this.steps=steps;
		var values=new Array();
		for (var i=0; i<=steps; i++) values.push( i/steps );
		if (direction>0) {
			this.fadeOut=false;
		}
		else {
			this.fadeOut=true;
			values.reverse();
		}
		this.values = values;
		this.cnt=0;
		this.fade = function() {
			var finished = false;
			if (this.cnt<this.steps) {
				PageManager.setOpacity(this.element, this.values[++this.cnt]);
				var that=this;
				setTimeout(function() { that.fade(); }, this.delay);
			}
			else {
				if (this.fadeOut) {
					this.element.style.display='none';
				}
				if (this.callback) this.callback();
				this.callback=null;
				this.fade = this.callback = this.element = null;
			}
		};
	},
	
	fadeIn: function(elementOrId, duration, steps, callback) {
		var element = (typeof elementOrId == 'object')? elementOrId:PageManager.getElementById(elementOrId);
		var effect=new PageManager.Fader(element, duration, steps, 1, callback);
		PageManager.setOpacity(element, 0);
		element.style.display='block';
		element.style.visible='visible';
		effect.fade();
	},
	
	fadeOut: function(elementOrId, duration, steps, callback) {
		var element = (typeof elementOrId == 'object')? elementOrId:PageManager.getElementById(elementOrId);
		var effect=new PageManager.Fader(element, duration, steps, -1, callback);
		effect.fade();
	},
	
	VerticalClipper: function(element, height, duration, steps, direction, callback) {
		this.element= element;
		this.delay=Math.round(duration/steps);
		this.callback=callback;
		this.cnt=0;
		this.steps=steps;
		var values=new Array();
		for (var i=0; i<=steps; i++) values.push( PageManager.easeInOutQuad(i, 0, height, steps) );
		if (direction>0) {
			this.fadeOut=false;
		}
		else {
			this.fadeOut=true;
			values.reverse();
		}
		this.values = values;
		this.clip = function() {
			if (this.cnt<this.steps) {
				this.element.style.height=this.values[++this.cnt]+'px';
				var that=this;
				setTimeout(function() { that.clip(); }, this.delay);
			}
			else {
				if (this.fadeOut) {
					this.element.style.display='none';
				}
				if (this.callback) this.callback();
				this.clip = this.callback = this.element = null;
			}
		};
	},
	
	expandClipping: function(elementOrId, height, duration, steps, callback) {
		var element = (typeof elementOrId == 'object')? elementOrId:PageManager.getElementById(elementOrId);
		var effect = new PageManager.VerticalClipper(element, height, duration, steps, 1, callback);
		element.style.overflow='hidden';
		element.style.height='0px';
		element.style.display='block';
		element.style.visible='visible';
		effect.clip();
	},
	
	collapseClipping: function(elementOrId, height, duration, steps, callback) {
		var element = (typeof elementOrId == 'object')? elementOrId:PageManager.getElementById(elementOrId);
		var effect = new PageManager.VerticalClipper(element, height, duration, steps, -1, callback);
		element.style.overflow='hidden';
		effect.clip();
	},
	
	/**
	 * Easing equation function for a quadratic (t^2) easing in/out: acceleration until halfway, then deceleration.
	 *
	 * @param t		Current time (in frames or seconds).
	 * @param b		Starting value.
	 * @param c		Change needed in value.
	 * @param d		Expected easing duration (in frames or seconds).
	 * @return		The correct value.
	 */
	easeInOutQuad: function(t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	
	writeFlashTag: function(n) {
		var element=this.getElementById(this.flashContainerId);
		if (!element) return;
		var wmode;
		var fo=this.flashObjects[n];
		if (fo.bgImage) {
			element.style.backgroundImage='url("'+fo.bgImage+'")';
			element.style.backroundRepeat='repeat-y';
			wmode='transparent';
		}
		else {
			element.style.backgroundImage='none';
			wmode='opaque';
		}
		var hasRequestedVersion = this.detectFlashVer(9, 0, 0);
		if (hasRequestedVersion) {
			var fvars=(fo.config)? 'config='+fo.config: '';
			element.innerHTML= this.AC_FL_RunContent(
				"src", fo.swf.replace(/\.swf$/,''),
				"width", "961",
				"height", "359",
				"align", "middle",
				"id", "flashnav_"+n,
				"quality", "high",
				"bgcolor", fo.bgColor,
				"wmode", wmode,
				"name", "flashnav_"+n,
				"allowScriptAccess","sameDomain",
				"type", "application/x-shockwave-flash",
				"pluginspage", "http://www.adobe.com/go/getflashplayer",
				"flashvars", fvars
			);
		}
		else {
			element.innerHTML='<p><a href="http://www.adobe.com/go/getflash/">Get Flash Player</a></p>'
		}
	},
	
	// Embedded version of Adobe AC_OETags.js
	
	browserSet: false,
	getBrowser: function() {
		this.isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
		this.isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
		this.isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
		this.browserSet=true;
	},
	
	getAXOVersion: function() {
		var version;
		var axo;
		var e;
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
			version = axo.GetVariable("$version");
		} catch (e) {}
		if (!version) {
			try {
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
				version = "WIN 6,0,21,0";
				axo.AllowScriptAccess = "always";
				version = axo.GetVariable("$version");
	
			} catch (e) {}
		}
		if (!version) {
			try {
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				version = axo.GetVariable("$version");
			} catch (e) {}
		}
		if (!version) {
			try {
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
				version = "WIN 3,0,18,0";
			} catch (e) {}
		}
		if (!version) {
			try {
				// version will be set for 2.X player
				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
				version = "WIN 2,0,0,11";
			} catch (e) {
				version = -1;
			}
		}
		return version;
	},
	
	getSwfVer: function() {
		var flashVer = -1;
		if (navigator.plugins != null && navigator.plugins.length > 0) {
			if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
				var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
				var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
				var descArray = flashDescription.split(" ");
				var tempArrayMajor = descArray[2].split(".");			
				var versionMajor = tempArrayMajor[0];
				var versionMinor = tempArrayMajor[1];
				var versionRevision = descArray[3];
				if (versionRevision == "") {
					versionRevision = descArray[4];
				}
				if (versionRevision[0] == "d") {
					versionRevision = versionRevision.substring(1);
				} else if (versionRevision[0] == "r") {
					versionRevision = versionRevision.substring(1);
					if (versionRevision.indexOf("d") > 0) {
						versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
					}
				}
				var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
			}
		}
		else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
		else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
		else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
		else if ( this.isIE && this.isWin && !this.isOpera ) {
			flashVer = this.getAXOVersion();
		}	
		return flashVer;
	},
	
	detectFlashVer: function(reqMajorVer, reqMinorVer, reqRevision) {
		if (!this.browserSet) this.getBrowser();
		var versionStr = this.getSwfVer();
		if (versionStr == -1 ) {
			return false;
		} else if (versionStr != 0) {
			if(this.isIE && this.isWin && !this.isOpera) {
				tempArray         = versionStr.split(" ");
				tempString        = tempArray[1];
				versionArray      = tempString.split(",");
			} else {
				versionArray      = versionStr.split(".");
			}
			var versionMajor      = versionArray[0];
			var versionMinor      = versionArray[1];
			var versionRevision   = versionArray[2];
	
			if (versionMajor > parseFloat(reqMajorVer)) {
				return true;
			} else if (versionMajor == parseFloat(reqMajorVer)) {
				if (versionMinor > parseFloat(reqMinorVer))
					return true;
				else if (versionMinor == parseFloat(reqMinorVer)) {
					if (versionRevision >= parseFloat(reqRevision))
						return true;
				}
			}
			return false;
		}
	},
	
	AC_AddExtension: function(src, ext) {
	  if (src.indexOf('?') != -1)
		return src.replace(/\?/, ext+'?'); 
	  else
		return src + ext;
	},
	
	AC_Generateobj: function(objAttrs, params, embedAttrs) { 
		if (!this.browserSet) this.getBrowser();
		var str = '';
		if (this.isIE && this.isWin && !this.isOpera) {
			str += '<object ';
			for (var i in objAttrs)
				str += i + '="' + objAttrs[i] + '" ';
			str += '>';
			for (var i in params)
				str += '<param name="' + i + '" value="' + params[i] + '" /> ';
			str += '</object>';
		} else {
			str += '<embed ';
			for (var i in embedAttrs)
				str += i + '="' + embedAttrs[i] + '" ';
			str += '> </embed>';
		}
	
		return str;
	},
	
	AC_FL_RunContent: function() {
	  var ret = 
		this.AC_GetArgs
		(  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
		 , "application/x-shockwave-flash"
		);
	  return this.AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
	},
	
	AC_GetArgs: function(args, ext, srcParamName, classid, mimeType){
	  var ret = new Object();
	  ret.embedAttrs = new Object();
	  ret.params = new Object();
	  ret.objAttrs = new Object();
	  for (var i=0; i < args.length; i=i+2){
		var currArg = args[i].toLowerCase();    
	
		switch (currArg){	
		  case "classid":
			break;
		  case "pluginspage":
			ret.embedAttrs[args[i]] = args[i+1];
			break;
		  case "src":
		  case "movie":	
			args[i+1] = this.AC_AddExtension(args[i+1], ext);
			ret.embedAttrs["src"] = args[i+1];
			ret.params[srcParamName] = args[i+1];
			break;
		  case "onafterupdate":
		  case "onbeforeupdate":
		  case "onblur":
		  case "oncellchange":
		  case "onclick":
		  case "ondblClick":
		  case "ondrag":
		  case "ondragend":
		  case "ondragenter":
		  case "ondragleave":
		  case "ondragover":
		  case "ondrop":
		  case "onfinish":
		  case "onfocus":
		  case "onhelp":
		  case "onmousedown":
		  case "onmouseup":
		  case "onmouseover":
		  case "onmousemove":
		  case "onmouseout":
		  case "onkeypress":
		  case "onkeydown":
		  case "onkeyup":
		  case "onload":
		  case "onlosecapture":
		  case "onpropertychange":
		  case "onreadystatechange":
		  case "onrowsdelete":
		  case "onrowenter":
		  case "onrowexit":
		  case "onrowsinserted":
		  case "onstart":
		  case "onscroll":
		  case "onbeforeeditfocus":
		  case "onactivate":
		  case "onbeforedeactivate":
		  case "ondeactivate":
		  case "type":
		  case "codebase":
			ret.objAttrs[args[i]] = args[i+1];
			break;
		  case "id":
		  case "width":
		  case "height":
		  case "align":
		  case "vspace": 
		  case "hspace":
		  case "class":
		  case "title":
		  case "accesskey":
		  case "name":
		  case "tabindex":
			ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
			break;
		  default:
			ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
		}
	  }
	  ret.objAttrs["classid"] = classid;
	  if (mimeType) ret.embedAttrs["type"] = mimeType;
	  return ret;
	}

};


function loadPage(url) {
	PageManager.showPage(url);
}