<!--

// Bowserabfrage 
	var agt=navigator.userAgent.toLowerCase();
    var is_major = parseInt(navigator.appVersion);
    var is_minor = parseFloat(navigator.appVersion);

    var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
                && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
                && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
    var is_nav2 = (is_nav && (is_major == 2));
    var is_nav3 = (is_nav && (is_major == 3));
    var is_nav4 = (is_nav && (is_major == 4));
    var is_nav4up = (is_nav && (is_major >= 4));
    var is_navonly      = (is_nav && ((agt.indexOf(";nav") != -1) ||
                          (agt.indexOf("; nav") != -1)) );
    var is_nav6 = (is_nav && (is_major == 5));
    var is_nav6up = (is_nav && (is_major >= 5));
    var is_gecko = (agt.indexOf('gecko') != -1);

    var is_ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
    var is_ie3    = (is_ie && (is_major < 4));
    var is_ie4    = (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) );
    var is_ie4up  = (is_ie && (is_major >= 4));
    var is_ie5    = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0")!=-1) );
    var is_ie5_5  = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
    var is_ie5up  = (is_ie && !is_ie3 && !is_ie4);
    var is_ie5_5up =(is_ie && !is_ie3 && !is_ie4 && !is_ie5);
    var is_ie6    = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.")!=-1) );
    var is_ie6up  = (is_ie && !is_ie3 && !is_ie4 && !is_ie5 && !is_ie5_5);

	// Bei diesen Browsern funktionier navigator.cookiesEnabled nicht zuverlässig
    var is_navigEnabledUnreliable = (is_nav6up || is_ie6up);
// Allgemeine Funktionen

/*
indexOfStr

Gibt die Position eines Strings in einem anderen String zurück, oder 0 falls der String nicht enthalten ist.
Case-Sensitive.

Parameter: 	string1 der String in dem gescucht wird
			string2 der Suchbegriff
*/
function indexOfStr(haystack,needle) {
	for (var i=0;i<haystack.length-needle.length+1;i++) {
		if (haystack.substring(i,i+needle.length)==needle) return i;
	}
	return -1;
}

/*
str_replace

Suchen / Ersetzen in einem String

Access: 	public
Parameter: 	string1 der String in dem gesucht wird
			string2 Der Begriff durch den er ersetzt werden soll
			string3 der Suchbegriff
Returns:	Den ersetzen String
*/
function str_replace(from,to,str) {
	var start=0;
	while (str.indexOf(from,start)!=-1) {
		t1=str.substring(0,str.indexOf(from,start));
		t2=str.substring(str.indexOf(from,start)+from.length,str.length);
		str=t1+to+t2;
		start=t1.length+to.length;
	}
	return str;
}

/*
Zerlegt einen Parameterstring &test=1&test2=bla in seine Bestandteile und gibt das Ergebnis als Hasharray zurück
*/
function analyseParameters(params) {
	var from=0;
	var test=0;
	var eqplus=0;
	startpos=0;
	var paramname='';
	var paramArray=new hashArray();
	while(startpos!=-1) {
		eqpos=params.indexOf("=",from);
		endpos=params.indexOf("&",startpos+1);
		var emptyval=false;
		var value="";
		if (eqpos==-1) {
			startpos=-1;
		} else {
			if (endpos < eqpos && endpos!=-1) { // Parameter in der Form ?parameter&param2=1
				eqpos=endpos;
				emptyval=true;
			}
			paramname=params.substring(startpos+(startpos==0?0:1),eqpos);
				
			if (endpos==-1) {
				//alert('st:'+startpos+'('+params.charAt(startpos)+'),eqpos:'+eqpos+'('+params.charAt(eqpos)+'),end:'+endpos+',from:'+from);
				endpos=params.length;
				startpos=-1;
			}
			if (!emptyval) {
				value=params.substring(eqpos+1,endpos);
				if (value.indexOf('+')!=-1) value=str_replace('+',' ',value);
				eqplus=0;
				if (!value) emptyval=true;
			} else {
				value="";
				eqplus=1;
			}
		}
		//alert('set:'+paramname+','+value+':'+emptyval);
		if (paramname && (value || emptyval)) {
			paramArray.set(paramname,unescapeStr(value));
		}
		if (startpos!=-1) {
			startpos=params.indexOf("&",endpos);
			from=endpos;
		}
		//if (test++ > 2) startpos=-1;
	}
	return paramArray;
}

/*
Mozilla Kompatibles Escapen
*/

function escapeStr(str) {
	/*if (encodeURI) return encodeURI(str);
	else */if(escape) return escape(str);
	else return str;
}

function unescapeStr(str) {
	/*if (decodeURI) return decodeURI(str);
	else*/ if(unescape) return unescape(str);
	else return str;
}

/*
Hasharray

Diese Klasse verwaltet ein komfortableres Array
*/
// Methodendeklaration
/*
hashArray::get(name)
Liest einen Wert aus dem hashArray aus

Access:		public
Parameter: 	name	Name des Werts der aus der Session ausgelesen werden soll
Return:		

*/
function haGet(name) {
	if (!this.isset[name]) return "";
	else return this.values[this.names[name]];

}

/*
hashArray::set()
Trägt einen Wert die in das Array ein

Access:		public
Parameter: 	name	Name unter dem der Wert gespeichert wird.
Parameter: 	value	Der Wert
Return:		
*/
function haSet(name,value) {
	if (!this.names[name] && (typeof this.names[name]!='number')) {
		this.names[name]=this.length;
		this.isset[name]=1;
		this.index[this.length]=name;
		this.length++;
	}
	var index=this.names[name];
	this.values[index]=value;
	this.values[name]=value;
}

/*
hashArray::set()
Trägt alle Wert eines Arrays ein

Access:		public
Parameter: 	arr	Array dessen Werte eingetragen werden sollen.
Parameter: 	asso Wenn es sich um ein assoziatives Array handelt auf true setzten.
Return:		
*/
function haSetArray(arr,asso)
{
	if(asso)
	{
		for(var key in arr)
		{
			this.set(key,arr[key]);
		}
	}
	else
	{
		for(var i=0; i<arr.length; i++)
		{
			this.set(i, arr[i]);
		}
	}
}

function haGetArray()
{
	var arr = new Array();
	var value=this.each();
	
	while (value) {
		arr[value['k']] = value['v'];
		value=this.each();
	}
	
	return arr;
}

function haSetDump(dump, seperator)
{
	if(dump!='')
	{
		if(!seperator) seperator = "\n";
		var tmp_arr	= dump.split(seperator);
		
		for(var i=0; i<tmp_arr.length; i++)
		{
			var entry_str = tmp_arr[i];
			entry_arr = entry_str.split(':');
			this.set(entry_arr[0], entry_arr[1]);
		}
	}
}

/*
hashArray::each()
Schleifenverarbeitung des hashArrays mit zugriff auf key und value
Setzt den internen Zeiger des hashArrays vor.

Access:		public
Parameter: 	
Return:		array['k']='Name des Wertes'; array['v']='der Wert'; 
*/
function haEach() {
	if (this.index[this.current]) {
		var retVal=new Array();
		retVal['k']=this.index[this.current];
		retVal['v']=this.values[retVal['k']];
		this.current++;
		return retVal;
	} else {
		return false;
	}
}

/*
hashArray::next()
Schleifenverarbeitung des hashArrays
Setzt den internen Zeiger des hashArrays vor.

Access:		public
Parameter:	
Return:		wert
*/
function haNext() {
	if (this.names[this.current]) {
		return this.values[this.current];
	} else {
		return false;
	}
}

/*
hashArray::seek()
Setzt den internen Zeiger des hashArrays.

Access:		public
Parameter: 	index zu dem gesprungen werden soll (erstes Element = 0)
Return:		
*/
function haSeek(index) {
	this.current=index;
}

/*
hashArray::dump()
Erzeigt eine String-Repräsentation des hashArray Inhalts (debugging)

Access:		public
Parameter: 	
Return:		text
*/
function haDump(separator) {
	var str="";
	var c="";
	if(!separator) separator = "\n";
	
	for (var i=0;i<this.length;i++) {
		str+=c+this.index[i]+':'+this.values[i];
		c=separator;
	}
	return str;
}

/*
hashArray::isset()
Ist ein Wert schon gesezt?

Access:		public
Parameter: 	name des Wert
Return:		true / false
*/
function haIsset(name) {
	if (this.isset[name]) return true; else return false;
}

function hashArray() {
	this.names=new Array();
	this.values=new Array();
	this.index=new Array();
	this.isset=new Array();
	this.length=0;
	this.current=0;
	
	this.set=haSet;
	this.get=haGet;
	this.next=haNext;
	this.seek=haSeek;
	this.each=haEach;
	this.dump=haDump;
	this.setArray=haSetArray;
	this.setDump=haSetDump;
	this.getArray=haGetArray;
}


// Sessionverwaltung

// Methodendeklaration

/*
sessionManager::get()
Liest einen Wert aus der Session aus

Access:		public
Parameter: 	name	Name des Werts der aus der Session ausgelesen werden soll
Parameter: 	forceCookie	WEnn gesetzt werden nur Cookies verwendet, URL Basiertes Session Management (für NS Cookiecheck)
Return:		Der Inhalt
*/
function smGet(cookiename,forceCookie) {
	if (!forceCookie) {
		/*
		if (cookiename=="city2") {
			alert(this.session.dump());
			alert('sm:'+this.session.get('city'));
			alert('lidlnewsletter:'+lidlnewsletter.StoreCity.value);
		}
		*/
		return this.session.get(cookiename);
	} else {
		var cookiestring=""+document.cookie;
		var index1=cookiestring.indexOf(cookiename);
		if (index1==-1 || cookiename=="") return ""; 
		var index2=cookiestring.indexOf(';',index1);
		if (index2==-1) index2=cookiestring.length;
		return unescapeStr (cookiestring.substring(index1+cookiename.length+1,index2)); 
	}
}
/*
sessionManager::getExpiryDate()
Rechnet einen Anzahl Tage so um, das sie als Cookie-Haltbarkeitsangaber werwendet werden kann

Access:		public
Parameter: 	tage	Anzahl der Tage
Return:		string	UTC Formatiertes Datum
*/
function smgetExpiryDate(nodays){
    var UTCstring;
    var Today = new Date();
    var nomilli=Date.parse(Today);
    Today.setTime(nomilli+nodays*24*60*60*1000);
    var UTCstring = Today.toUTCString();
    return UTCstring;
}

/*
sessionManager::set()
Trägt einen Wert im Cookie ein

Access:		public
Parameter: 	name		Name unter dem der Wert gespeichert wird.
Parameter: 	value		Der Wert
Parameter: 	duration	optional	Haltbarkeit, wenn nicht angegeben wird die Haltbarkeit aus der Konfigurationsdatei verwendet
Parameter: 	forceCookie	WEnn gesetzt werden nur Cookies verwendet, URL Basiertes Session Management (für NS Cookiecheck)
Return:		
*/
function smSet(name,value,duration,forceCookie){
	if (this.cookiesEnabled || forceCookie) {
		if (!duration) duration=this.defaultDuration;
		if (!this.session.isset[name] || value!=this.get(name)) { // wenn der user bei jedem Cookie einen Prompt kriegt
			cookiestring = name + "=" + escapeStr(value) + ";EXPIRES=" + this.getExpiryDate(duration);
			//alert(cookiestring);
			document.cookie=cookiestring;
		}
	}
	if (!forceCookie) this.session.set(name,value);
}

/*
sessionManager::checkCookieEnabled()

Access:		private
Return:		
*/
function smCheckCookieEnabled() {
	//alert(navigator.cookieEnabled);
	var checkEnabled=true;
	var checkSetGet=true;
	if(navigator.cookieEnabled == false) {
		this.cookiesEnabled=false;
		checkEnabled=false;
		checkSetGet=false;
	}
	if(checkEnabled && navigator.cookieEnabled == true) {
		if (is_navigEnabledUnreliable) {// Für Seiten die über ausnahmeliste gesperrt sind
			// check via set/get
			//alert('check setget');
		} else {
			this.cookiesEnabled=true;
			var checkSetGet=false;
		}
	}
	if (checkSetGet) { // Netscape 4.x IE6 mit Ausnahmeliste
		if(this.get("SindCookiesaktiv",true) == "Der Benutzer muss seine Filiale nicht immer wieder eingeben"){					
			this.cookiesEnabled=true;
		} else {
			this.set("SindCookiesaktiv","Der Benutzer muss seine Filiale nicht immer wieder eingeben", 2,true);
			var strCookieVal = this.get("SindCookiesaktiv",true);
			if(strCookieVal != "Der Benutzer muss seine Filiale nicht immer wieder eingeben"){					
				this.cookiesEnabled=false;
			} else{			
				this.cookiesEnabled=true;
			}
		}
	}
}

/*
sessionManager::addSessionParameters()

Access:		private
Return:		
*/
function smAddSessionParameters(params) {
	if (!this.cookiesEnabled) {
		this.session.seek(0);
		var value=this.session.each();
		var c="";
		var fieldstring="";
		while (value) {
			params['params'].set(value['k'],value['v']);
			fieldstring+=c+value['k'];
			c=",";
			value=this.session.each();
		}
		params['params'].set('smVars',fieldstring);
	}
	return params;
}

/*
sessionManager

Dieses Objekt wird zum Zugriff auf Sessiondaten verwendet.
Der Sessionmanager verwendet entweder Cookies zur Datenspeicherung oder übergibt die Daten über URL Parameter

*/
function SessionManager() {
	// Objekt Methoden
	this.checkCookieEnabled=smCheckCookieEnabled;
	this.set=smSet;
	this.get=smGet;
	this.getExpiryDate=smgetExpiryDate;
	this.addSessionParameters=smAddSessionParameters;
	
	this.session = new hashArray();
	this.checkCookieEnabled();
	//alert('cookies are:'+this.cookiesEnabled);
	
	// Konfiguration einlesen
	this.defaultDuration=config['cookies']['defaultDuration'];
	
	// Daten einlesen aus Cookie oder URL
	if (!this.cookiesEnabled) {
		params=analyseParameters(location.search);
		if (params.get('smVars')) {
			var fieldString=','+params.get('smVars')+',';
			var parm=params.each();
			while (parm) {
				if (indexOfStr(fieldString,','+parm['k']+',')!=-1) this.session.set(parm['k'],parm['v']);
				parm=params.each();
			}
		}
	} else {
		var cookiestring=""+document.cookie;
		if (cookiestring && !cookiestring.indexOf(';') || cookiestring.charAt(cookiestring.length-1)!=";") cookiestring+=";";
		var from=0;
		var begin=0;
		var count=0;
		while (cookiestring.indexOf(';',from)!=-1 && count++ < 100) {
			var end=cookiestring.indexOf(';',from);
			if (end==-1) end=cookiestring.length;
			var eq=cookiestring.indexOf('=',from);
			var name=cookiestring.substring(begin,eq);
			var value=unescapeStr(cookiestring.substring(eq+1,end));
			this.session.set(name,value);
			from=end+1;
			begin=from+1;
		}
	}
}

/*
Klasse page

Diese Klasse repräsentiert eine Seite, klassifiziert eine Seite anhand der URL, ändert Links
*/

/*
page::analyseLink

Zerlegt eine URL in ihre Bestandteile und gibt das Ergebnis als Array zurück
Das Array hat die Einträge 

http://www.lidl.de/de/index.nsf/pages/c.o.oow.20030220.index?OpenDocument&id=6723&country=D&#unten

name			Beschr								Bsp.

protocol		Protokoll							http://
host			Servername 							www.lidl.de
dir				Verzeichnispfad auf dem Server 		de/index.nsf/pages
file			Dateiname 							c.o.oow.20030220.index
params			URL parameter als Hasharray mit Name => Wert
paramsString	Query String 						?OpenDocument&id=6723&country=D&
anchor			Anker (#)							unten

*/
function pgAnalyseLink(url) {
	rest=url;
	var protocol="";
	var host="";
	var dir="";
	var file="";
	var params="";
	var anchor="";
	var protoTemp="";
	for (var i=0;i<rest.length;i++) {
		if (rest.substring(i,i+3)=="://") {
			protocol=protoTemp+"://";
			rest=rest.substring(i+3,rest.length);
			i=rest.length;
		}
		protoTemp=protoTemp+rest.charAt(i);
	}
	var pos=rest.indexOf("#");
	if (pos==-1) {
		var anchor="";
	} else {
		anchor=rest.substring(pos+1,rest.length);
		rest=rest.substring(0,pos);
	}
	var pos=rest.indexOf("?");
	if (pos==-1) {
		var rest=rest;
		var params="";
	} else {
		params=rest.substring(pos+1,rest.length);
		rest=rest.substring(0,pos);
	}
	if (protocol) {
		var pos=rest.indexOf("/");
		host=rest.substring(0,pos);
		rest=rest.substring(pos,rest.length);
	}
	if (rest) {
		var pos=rest.lastIndexOf("/");
		dir=rest.substring(0,pos);
		file=rest.substring(pos+1,rest.length);
	}
	//alert('protocol:'+protocol+"\n"+"host:"+host+"\n"+"dir:"+dir+"\n"+"file:"+file+"\n"+"params:"+params+"\n"+"anchor:"+anchor);
	var linkArray=Array();
	linkArray['protocol']=protocol;
	linkArray['host']=host;
	linkArray['dir']=dir;
	linkArray['file']=file;
	linkArray['paramsString']=params;
	linkArray['anchor']=anchor;
	linkArray['params']=analyseParameters(params);
	linkArray['url']=url;
	return linkArray;
}

/*
Erstellt aus einem url array (s. page::analyseLink) einen URL-String

Access:		public
Parameter: 	array		Das url-array
Return:		urlstring	Die URL als String

*/
function pgMakeLink(urlArray) {
	if (!urlArray) urlArray=this.urlArray;
	var url="";
	if(this.urlArray['protocol']) url+=urlArray['protocol'];
	
	url+=urlArray['host'];
	if (urlArray['dir']) {
		url+=urlArray['dir']+'/';
	}
	url+=urlArray['file'];
	var c="?";
	urlArray['params'].seek(0);
	param=urlArray['params'].each();
	while (param) {
		if (param['k']=='penDocument') param['k']='OpenDocument';
		url+=c+param['k']+'='+escapeStr(param['v']);
		c="&";
		param=urlArray['params'].each();
	}		
	url+=urlArray['anchor'];
	
	if (this.urlArray['checkForHTTP'] && url.indexOf('://')==-1) url='http://'+url;	
	
	return url;
}

/*
page::analysePage
Stellt denn Typ der Seite anhand der config fest und liest die Config

Access:		private
Parameter: 	
Return:		

*/
function pgAnalysePage() {
	this.urlArray=this.analyseLink(this.url);
	//alert('analysis of '+this.url+':'+this.analyseLink(this.url));
	config['pageTypes'].seek(0);
	eachpage=config['pageTypes'].each();
	while (eachpage) {
		if (eachpage['v']['keyword']) {
			if (indexOfStr(this.url,eachpage['v']['keyword'])!=-1) {
				this.type=eachpage['k'];
				this.typeDefinition=eachpage['v'];
			}
		}
		eachpage=config['pageTypes'].each();
	}
	if (!this.type) {
		this.type='default';
		if (config['pageTypes'].get('default')) this.typeDefinition=config['pageTypes'].get('default');
		else this.typeDefinition=new Array();
	}
}

/*
page::modifyLink
Manipuliert einen link

Access:		public
Parameter: 	link als url-array. Default : page.urlArray
Return:		der geänderte Link

*/
function pgModifyLink(url,p1,p2,p3,p4) {
	if (!url) {
		url=this.urlArray;
	}
	if (url['url'].toLowerCase().indexOf('javascript:')!=-1) return url;
	url['params'].set('OpenDocument','');
	var newUrl=url;
	if (this.typeDefinition['modifyLinksMethod']) {
		eval('this.modifyLinksMethod='+this.typeDefinition['modifyLinksMethod']+';');
		newUrl=this.modifyLinksMethod(url,p1,p2,p3,p4);
	}
	if (newUrl['file']) newUrl=sessionManager.addSessionParameters(newUrl);
	if (newUrl['params'].length==1) newUrl['params']=new hashArray();
	return newUrl;
}

/*
page::goTo
JS-Weiterleitung

Access:		public
Parameter: 	url als String
Return:		

*/
function pgGoTo(url) {
	//alert('go to:'+url);
	location.href=url;
	//prompt(url,url);
}

/*
page::storeAngebotsDaten
Speichert neue Filialdaten aus der URL im Sessionmanager

Access: 	public
Parameter: 	newsletterlink wenn Daten aus dem Newsletter übernommen werden sollen
Returns:	
*/
function pgStoreAngebotsDaten(newsLetterLink) {
	var parameters=this.urlArray['params'];
	if ((sessionManager.cookiesEnabled && 
		sessionManager.get('FilialDaten')==1 && 
		!parameters.get('resetFilialDaten') && 
		!newsLetterLink)
		|| parameters.get('skipReloadNF')
		) {
		return;
	}
	param=parameters.each();
	while (param) {
		if (indexOfStr(config['readDataFields'],','+param['k']+',')!=-1) {
			if (sessionManager.cookiesEnabled) {
				this.filialCookie=true;
				sessionManager.set('filialLastUpdate',uDate.getTime());
				if (this.urlArray['params'].get('aktualisierung') && param['k']=='id') {
					var adat=uID[param['v']].getTime();
					sessionManager.set('aDatum',adat);
				}
			}
			sessionManager.set('FilialDaten',1);
			sessionManager.set(param['k'],param['v']);
		}
		if (param['k']=='EMID') { // Newsletter ID gesondert speichern wg. Expire
			this.setEMID(param['v']);
		}
		param=parameters.each();
	}
}
/*
	Newsletter ID setzen, Datum merken für Expire
*/
function pgSetEMID(EMID) {
	sessionManager.set('EMID',EMID);
	now=new Date();
	sessionManager.set('EMIDtime',now.getTime());
}

/*
	Newsletter ID nach Ablauf löschen, wird auf jeder Seite überprüft
*/
var EMIDExpireChecked=false;
function pgEMIDExpire() {
	if (sessionManager.get('EMID') && !EMIDExpireChecked) {
		now=new Date().getTime();
		expires=parseInt(sessionManager.get('EMIDtime'))+(config['newsletterExpiration']*60*1000);
		//alert(expires+'='+sessionManager.get('EMIDtime')+'+'+(config['newsletterExpiration']*60*1000));
		nowdb=new Date();
		nowdb.setTime(now);
		expdb=new Date();
		expdb.setTime(expires);
		
		EMIDExpireChecked=true;
		//alert('check expire: '+nowdb+'>'+expdb+'(\n'+now+'/\n'+expires+')');
		if (now > expires) {
			sessionManager.set('EMID','');
			sessionManager.set('updateNL','');
			//alert('expire!');
		}
	}
}

function page(url) {
	// Eigenschaften
	this.url=url;

	// Objektmethoden
	this.analyseLink=pgAnalyseLink;
	this.modifyLink=pgModifyLink;
	this.analysePage=pgAnalysePage;
	this.goTo=pgGoTo;
	this.makeLink=pgMakeLink;
	this.storeAngebotsDaten=pgStoreAngebotsDaten;
	this.setEMID=pgSetEMID;
	this.EMIDExire=pgEMIDExpire;
	
	// Init
	this.analysePage();
	if (this.typeDefinition['initMethod']) {
		var evl='this.customInit='+this.typeDefinition['initMethod']+';';
		eval(evl);
		this.customInit();
	}
	this.EMIDExire();

}

// Objektunabhängige Seitenfunktionen

var linksRewritten=new Array();
var linkNameCounter=0;

/*
linkTo

Manipuliert einen Link.
Aufruf über Events im HTML-Tag oder automatische Mechanismen (modifyAllLinks,Event Handler)

Beispiel für Events: <a href="http://www.lidl.de/de/index.nsf/pages/c.o.oow.20030519.index" onMouseOver="linkTo(this);" onFocus="linkTo(this);" onClick="linkTo(this);">weiter</a>

Access:		public
Parameter: 	url als anchor (Link) Objekt
Return:		
*/
function linkTo(link) {
	// Alle links müssen einen Namen haben
	if (!link.name) link.name='agLinkLink'+(linkNameCounter++);
	if (!linksRewritten[link.name]) { // Links nur einmal verändern
		linksRewritten[link.name]=true;
		var linkpage=new page(link.href);
		var newURL=linkpage.modifyLink(page.urlArray);
		//alert('ändere link:'+link.name+':'+link.href);
		link.href=linkpage.makeLink(newURL);
		//alert('neu:'+link.href);
	}
}

/*
rewriteURL

Manipuliert einen Link für Redirect / Popup

Beispiel für redirect:

<script>
<!-- 
location.href=rewriteURL('http://www.lidl.de/de/index.nsf/pages/c.o.oow.20030519.index');
// -->
</script>

Meta Refresh für nicht JS-User benutzen.

Access:		public
Parameter: 	url String
Return:		geänderte URL als String
*/
function rewriteURL(url) {
	var linkpage=new page(url);
	var newURL=linkpage.modifyLink(newURL);
	return linkpage.makeLink(newURL);
}

// Alle Links im Dokument überarbeiten, im Fuß der Seite aufrufen

function modifyAllLinks() {
	for(var i=0; i < document.links.length; ++i)
		linkTo(document.links[i]);
}

// Eventhandler für die Manipulation der Links initialisieren

function handlerObjectSourceIsLink(obj) {
	var type=false;
	if (is_ie4up) {
		if ("A"==obj.tagName) type=true;
	} else {
		if (obj.text && obj.href) type=true;
	}
	return type;
}

function handleEvents(event) {
	if (is_nav4up) obj=event.target;
	else obj=window.event.srcElement;
	if (!obj.taggedByMe) {
		obj.taggedByMe=true;
		if (handlerObjectSourceIsLink(obj)) {
			linkTo(obj);
		}
	}
}

if (is_nav4up) {
	window.captureEvents(Event.MOUSEOVER);
	window.captureEvents(Event.CLICK);
	window.captureEvents(Event.FOCUS);
	window.onmouseover=handleEvents;
	window.onclick=handleEvents;
	window.onfocus=handleEvents;
} else {
	document.onmouseover=handleEvents;
	document.onclick=handleEvents;
	document.onfocus=handleEvents;
}
//-->