var agt      = navigator.userAgent.toLowerCase();
var is_major = parseInt(navigator.appVersion);
var is_ie    = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie6   = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
var is_safari = ((agt.indexOf('safari')!=-1)&&(agt.indexOf('mac')!=-1))?true:false;


var singlesideapp;


var Ajaxloder = Class.create();
Ajaxloder.prototype = {
	initialize : function() {

		singlesideapp = true;

		Try.these( function() {Ajax.Responders.register(myAjaxLoaderHandler)} );
		

		this.overlay = new KPoverlay({overlayObjId: 'KPoverlay_loading', duration: 0.2, autoDestroy : false});
		this.overlay.create();
		

//		this.elementIds = arguments
//		this.self = document.location.pathname

		
		this.page = $('page');
		this.content = $('subTemplate');

		this.myMenuModifier = new MenuModifier();


		this.pageLinks = $A(this.page.getElementsByTagName('a'));
		this.pageLinks.each(this.setupLinks.bind(this));



		// initialize the DHTML History framework
		dhtmlHistory.initialize();
		// add ourselves as a DHTML History listener
		dhtmlHistory.addListener(this.handleHistoryChange.bindAsEventListener(this));
		
		var url = dhtmlHistory.getCurrentLocation();
		if (url != ""){
		  url = this.decodeUrl(url);
		  this.activateLink(url);
		} else {
		  url = document.location.href;
		}

		this.myMenuModifier.activate(url);

	},

	/** Handles history change events. */
	handleHistoryChange : function (url) {

		url = this.decodeUrl(url);
       	this.url = url;

   	    this.activateLink(url);

    },

	setupLinks : function(elm) {
		if(this.testLink(elm)){
			// this.modifyHref(elm);

			// Safari Hack (i hate this Browser)
			if(is_safari){
				elm.setAttribute('onclick', 'return false');
			}

			Event.observe(elm,'click',this.clickHandler.bindAsEventListener(this), false);

		}
	},

	clickHandler : function(ev) {
		Event.stop(ev);
		var elm = Event.findElement(ev, 'a');
		
		elm.blur(); // entfernen des punktrahmens
		
		//url = this.getUrl(elm);
		url = elm.href;
		
		this.url = url;


		this.activateLink(this.url);
	},

	activateLink :  function(url) {
		if(url.indexOf('?') != -1) { 
			url = url + '&type=2';
		} else {
			url = url + '?type=2';
		}

		
		this.overlay.show();

		new Ajax.Request(url, {
			onComplete : this.onCompleteHandler.bindAsEventListener(this)
//			, onComplete : this.onPageComplete.bindAsEventListener(this)
			});


		this.myMenuModifier.activate(url);
	},
	

	onCompleteHandler: function(transport){
		this.transport = transport;


	
		// array mit externen js ermitteln
    	exp = /<script.*?src="(.*?)".*?><\/script>/img
        res = transport.responseText.match(exp);

		this.scriptsLoading = 0;

		if(res){
		    var includedScripts = document.getElementsByTagName('script');
			for(var i=0; i<res.length; i++) {
	    		exp2 = /<script.*?src="(.*?)".*?><\/script>/im
    	    	res2 = res[i].match(exp2);
	    	    if(typeof(res2[1]) != 'unknown'){
					// prüfen ob script schon included wurde
					scriptAllreadyIn = false;
					for(var ii=0; ii<includedScripts.length; ii++) {
						if(includedScripts[ii].src.indexOf(res2[1]) != -1){
							scriptAllreadyIn = true;
						}
					}
					if(scriptAllreadyIn == false){
	    		    	this.include_js(res2[1]);
					}
	    	    }
			}
		}

		this.updateTimer();

	},

	updateTimer: function(){
		//console.info('scriptsLoading=' + this.scriptsLoading);

		if(this.scriptsLoading <= 0){
			console.info('update now');

			this.content.innerHTML = this.transport.responseText.stripScripts();
			window.setTimeout(this.onPageComplete.bind(this), 10);

		} else {
			console.info('start new timer ' + this.scriptsLoading);
			window.setTimeout(this.updateTimer.bind(this), 10);
		}
	},



    include_js: function(file) {

   		var html_doc = document.getElementsByTagName('head')[0];
    
	    js = document.createElement('script');
    	js.setAttribute('type', 'text/javascript');

		if(/WebKit|Khtml/i.test(navigator.userAgent)) {
			console.info('webkit test = true 2');
			file = baseURL + 'fileadmin/template/main/js/safariJSWrapper.php?file=' + file;
			console.info('file='+file);
    	}

	    js.setAttribute('src', file);

		this.scriptsLoading++;
		
    	html_doc.appendChild(js);


		var t = this;
		// Handler mit anonymer Funktion weil ich nicht wuste wie ich sonst "js.readyState" abfragen sollte.
	    js.onreadystatechange = function () {
//    	    if (/complete|loaded/.test(js.readyState)) {
    	    if (/loaded/.test(js.readyState)) {
       	        myAjaxloder.scriptsLoading--;
    	    }
	    }

		// so sollte es eigendlich functionieren
//		Event.observe(js, 'readystatechange', this.scriptReadystatechangeHandler.bind(this), false);
		Event.observe(js, 'load', this.scriptLoadingHandler.bindAsEventListener(this), false);





        //return false;
    },

	scriptReadystatechangeHandler: function(obj) {
	   	console.info('JS: ' + Object.toJSON(obj) );
	    if (this.readyState == 'complete') {
            console.info('JS onreadystatechange complete');
	        this.scriptsLoading--;
	    }

	},
	scriptLoadingHandler: function(ev) {
	   	console.info('JS load');
	    this.scriptsLoading--;
	},

	onPageCreate: function(){
	},


	onPageComplete: function() {

		this.overlay.hide();

		Element.scrollTo('top');

		if(is_ie6) {
			dhtmlHistory.add(escape(this.url), true);
		} else {
			dhtmlHistory.add(this.url, true);
		}

		this.transport.responseText.evalScripts();

		this.contentLinks = $A(this.content.getElementsByTagName('a'));
		this.contentLinks.each(this.setupLinks.bind(this));


//		this.pageLinks = $A(this.page.getElementsByTagName('a'));
//		this.pageLinks.each(this.setupLinks.bind(this));


		
	},


	testLink : function(elm) {
		test = true;

		if(elm.target == '_blank'){
			test = false;
		}
		if(elm.target == '_self'){
			test = false;
		}
		if(elm.href.match(/mailto:/)){
			test = false;
		}
		if(elm.href.match(/javascript:/)){
			test = false;
		}
		if(!(typeof elm.onclick == 'undefined' || elm.onclick == null)){
			test = false;
		}
		
		return test;
	},

	modifyHref : function(elm){
		url = elm.href;
//		url = elm.pathname;
		url = this.encodeUrl(url);
//		console.info(url)

		elm.href = 'index.php#' + url;
	},

	decodeUrl : function(url){
		url = unescape(url);
		
		return url;
	},

	encodeUrl : function(url){
		
		lio = url.indexOf(baseURL);

		if(lio == 0){
//			url = url.substring(baseURL.length, url.length);
		}

		return url;		
	},

	getUrl : function(elm) {
		url = elm.href.match(/#(.+)/)[1]; /* */
		return url;
	}

}


var MenuModifier = Class.create();
MenuModifier.prototype = {
	initialize : function(menuObj) {

		//this.topLevelUid = 1;

		this.menus = new Array(
			$H( { name : 'nav', rootId : 1 } ),
			$H( { name : 'footNav', rootId : 1 } )
		);


		this.setMenuObj();		

	},

	setMenuObj : function(){

		menuObjArr = new Array();

		this.menus.each(
			function(menu){
				console.info(menu.name);
				
				menuLinks = $A($(menu.name).getElementsByTagName('a'));
				menuLinks.each(
					function(elm){
						if(elm.id == 'menulink_137') {
							href = 'nachrichten';
						} else if(elm.id == 'menulink_144') {
							    href = 'gutetat';
						} else if(elm.id == 'menulink_86') {
						    href = "|startseite";
						} else {
							href = elm.href;
						}
						menuObjArr.push({ 'elm' : elm, href : href, id : elm.id.split('_')[1] })
					}
				);
				
			}
		)

		this.menuObjArr = menuObjArr;
	},


	activate : function(activeUrl) {
	
	        console.info('activeUrl: ' + activeUrl);
		//console.info('baseURL: ' + baseURL);

//		var myRegExp = new RegExp('^(' + baseURL + ')(.*?)([?#]|$).*$','i')
//		var activeUrl = activeUrl.replace(myRegExp, '$2');
		
//		urlParts = activeUrl.split('.');
//		path = urlParts[0];
//		console.info('path=' + path)
	
		this.activeUrl = activeUrl;

		this.activeUrlRest = this.activeUrl.replace(baseURL, '');
		//console.info('activeUrlRest: ' + this.activeUrlRest);

		this.deactivateAllLinks();

		this.menuObjArr.each(this.findActive.bind(this));
		
	},

	
	findActive : function(menuObj){

	        var hrefs = menuObj.href.split('|');

		var href;
		var hrefRest;

		for (var i=0; i < hrefs.length; i++) {
		    href = hrefs[i].replace('.html', '');
		    hrefRest = href.replace(baseURL, "");
		    //console.info('hrefRest: ' + hrefRest);
	
		    // Entweder hrefRest matcht activeUrlRest oder wir sind auf der startseite
		    if ((this.activeUrlRest.length == 0 && hrefRest.length == 0) ||
			(hrefRest.length != 0 && this.activeUrlRest.startsWith(hrefRest))) {
			//console.info('makeActive: ' + menuObj.elm + ' - ' + hrefRest);
			this.show(menuObj.elm);
		    }

		}

/*		if(this.activeUrl.indexOf(href) != -1 ){

			console.info(menuObj.elm + ' - ' + this.activeUrl.indexOf(href));

			this.show(menuObj.elm);
	
		} else {
		
		}
*/
	
	},



	show : function(elm) {

		elm.addClassName('active');

/*
		this.showListDownwards(elm);
		this.showListsUpwards(elm);
		
		menuArr = this.menuObj[uid];
		if(menuArr[0] != this.topLevelUid){
			this.show(menuArr[0]);
		}
*/
	},

	deactivateAllLinks : function() {

		this.menuObjArr.each(
			function(menuObj){

				menuObj.elm.removeClassName('active');
				menuObj.elm.removeClassName('navOpen');

/*
				menuArr = this.menuObj[uid];
				pid = menuArr[0];
				if(pid != this.topLevelUid){
					this.hideListsUpwards(elm);
				}
*/
			}
		)
	},

	showListDownwards : function(elm){
		listelm = elm.nextSibling;
		if (listelm) {
			if (listelm.tagName == 'UL') {
				$(listelm).show();
			}
		}
	},

	showListsUpwards : function(elm){
		listelm = elm.parentNode.parentNode;
		if (listelm) {
			if (listelm.tagName == 'UL') {
				Element.show(listelm);
			}
		}
	},
	
	hideListsUpwards : function(elm){
		listelm = elm.parentNode.parentNode;
		if (listelm) {
			if (listelm.tagName == 'UL') {
				Element.hide(listelm);
			}
		}
	}

}




