// check Browsertype IE or NS
function notepadIs() {
	var agent = navigator.userAgent.toLowerCase();
	this.ns  = ((agent.indexOf('mozilla') != -1) && ((agent.indexOf('spoofer') == -1) && (agent.indexOf('compatible') == -1)));
	this.ie  = (agent.indexOf("msie") != -1);
}
var is = new notepadIs();

//#################### page navigation #################################
// popup - just modify by tt - dont copy it !!!!
// window_top=0 AND window_left=0 means: center window on screen
function openWindow(url,name,window_width,window_height,window_top,window_left,scroll,resize) 
	{
	var displayWindow = "";
	
	if (name == null)
	 	{name = "quokawindow";}
	if (window_width == null)
		{window_width = 150;}
	if (window_height == null)
		{window_height = 100;}
	if (window_top == null)
		{window_top = 0;}
	if (window_left == null)
		{window_left = 0;}
	if (scroll == null)
		{scroll = "no";}
	if (resize == null)
		{resize = "no";}
	
	if ((window_top==0) && (window_left==0))	//	center window
		{
		if (navigator.appVersion.substring(0,1)>'3')
			{
			window_top 		= ((screen.availHeight-window_height)/2);
			window_left 	= (screen.availWidth-window_width)/2;
			}
		else
			{
			window_width	+= 20; 
			window_height	+= 40;
			window_top 		= ((600-window_height)/2)-20;
			window_left 	= (800-window_width)/2;
			}
		}
	displayWindow = window.open(''+ url + '',''+ name +'','resizable=' + resize + ',menubar=no,scrollbars=' + scroll +
							',status=no,directories=no,width=' + window_width + ',height=' + window_height + ',top=' + window_top +
							 ',left=' + window_left);
	displayWindow.focus();
	return displayWindow;
	}  

// Werden Cookies akzeptiert
function isCookie()
	{document.cookie = "true";
	 if (document.cookie == "")
		return false;
	 else
		return true;
	}

// Routenplaner
function FindRoute(s_start_plz,s_start,s_start_country,s_target_plz,s_target,s_target_country)
		{
		if ((s_start == "") && (s_start_plz == ""))
			{
			s_start = prompt("Geben Sie bitte Ihren Startort an:","");
  			if (s_start == "")
  				{s_start = prompt("Ohne Startort kann leider keine Routenplanung gemacht werden!\nGeben Sie bitte Ihren Startort an:","");}
			}
		if ((s_start != "") && (s_start != null)) 
			{
			s_start 			= escape(s_start);
			s_start_plz			= escape(s_start_plz);
			s_start_country		= escape(s_start_country);
			s_target			= escape(s_target);
			s_target_plz		= escape(s_target_plz);
			s_target_country	= escape(s_target_country);
			var s_url 			= "http://link2.map24.com/?lid=8b581c76&action=route&maptype=RELOAD&rtype=fast"+"&szip="+s_start_plz+"&scity="+s_start+"&scountry="+s_start_country+"&dzip="+s_target_plz+"&dcity="+s_target+"&dcountry="+s_target_country;
			var RouteWindow = window.open(s_url,"Map24","InnerWidth=780,InnerHeight=500,width=800,height=500,top=0,left=0,location=yes,toolbar=no,resizable=yes,scrollbars=yes,menubar=no,status=yes");
			RouteWindow.focus();
			}
		}

// Ort in Karte anzeigen
function ShowCityMap(s_zipcode,s_cityname,s_country)
		{
		if ((s_zipcode != "") && (s_zipcode != null))
			{
			s_zipcode 		= escape(s_zipcode);
			s_cityname		= escape(s_cityname);
			s_country		= escape(s_country);
			var s_url 		= "http://link2.map24.com/?lid=8b581c76&maptype=RELOAD&rtype=fast"+"&zip0="+s_zipcode+"&city0="+s_cityname+"&country0="+s_country+"&width0=15000";
			var MapWindow = window.open(s_url,"Map24","InnerWidth=780,InnerHeight=500,width=800,height=500,top=0,left=0,location=yes,toolbar=no,resizable=yes,scrollbars=yes,menubar=no,status=yes");
			MapWindow.focus();
			}
		}
		
// replace a substring
function ReplaceString(oldString, newString, fullString)
	{
	var i = 0;
	while (i < fullString.length) 
		{
		if (fullString.substring(i, i + oldString.length) == oldString)
			{
			fullString = fullString.substring(0, i)
				+ newString
				+ fullString.substring(i + oldString.length, fullString.length);
			i += newString.length;
			}
		else
			{i++;}
		}
	return fullString;
	}

// trimming beidseitig	
function trim(s_string)
	{
	return ltrim(rtrim(s_string));
	}
	
function fastTrim (str) {
	var	str = str.replace( /^\s\s*/, '' ),
		ws = /\s/,
		i = str.length;
	while ( ws.test( str.charAt( --i ) ) );
	return str.slice( 0, i + 1 );
}
		
//#################### search in other category #################################
// JS-Submit of form by new CATID
// 06.11.2002	TT
function searchCAT(CATID,CATHITS) 
	{document.SEARCHFORM.CATID.value = CATID;
	 document.SEARCHFORM.MASK.value = "";
	 if (CATHITS!=null)		 // 17.11.2005 TT - list number of category-hits
	 	{	var hiddenfield = document.createElement("input");
			hiddenfield.type = "hidden";
			hiddenfield.name = "CATHITS";
			hiddenfield.value = CATHITS;
			// document.getElementById("srchfrm").appendChild(hiddenfield); 
			document.SEARCHFORM.appendChild(hiddenfield); 
		}
	 document.SEARCHFORM.submit();
	}
	
//#################### set cityid in searchform #################################
// set cityid at searchform
// 24.08.2007	TT
function setSearchCITYID(CITYID) 
	{document.SEARCHFORM.CITYID.value = CITYID;
	 document.SEARCHFORM.CITY.value = "";
	 document.SEARCHFORM.CITYCHECK.value = "";
	 document.SEARCHFORM.CITYCODES.value = "";
	 document.SEARCHFORM.CITYDISP.value = "";
	 document.SEARCHFORM.ZIP.value = "";
	 document.SEARCHFORM.VTLAT.value = "";
	 document.SEARCHFORM.VTLONG.value = "";
	 // set sorting to distance
	 for (i = 0; i < document.SEARCHFORM.SORTING.length; ++i)
	 	if (document.SEARCHFORM.SORTING.options[i].value == "distance")
			document.SEARCHFORM.SORTING.options[i].selected = true;
	 return true;
	}


//#################### search with help-searchargument ##############################
// JS-Submit of form
// 31.03.2003	TT	
function searchHELP(CATID,SEARCHHELPARGS) 
	{document.SEARCHFORM.CATID.value = CATID;
	 document.SEARCHFORM.SEARCHHELP.value = SEARCHHELPARGS;
	 document.SEARCHFORM.MASK.value = "";
	 document.SEARCHFORM.submit();
	}

	
//#################### display or hide extended searchparams (tablerows) ##############################
// 01.04.2005	TT	
function DisplayHideSearch(b_MESSAGEDISPLAY,s_MASK)
	{   var tablerow = document.getElementById('searchmask').getElementsByTagName('tr');
	    for (i = 0; i < tablerow.length; i++) 
	        if (tablerow[i].title == 'hide')
			  { 	if (is.ie)	// IE
			  		{	if (tablerow[i].style.display=="none")	// display
							{tablerow[i].style.display = 'inline';
							 document.SEARCHFORM.EXTMASK.value="TRUE";
							}
						else	// hide
						 	{tablerow[i].style.display = 'none';
							 document.SEARCHFORM.EXTMASK.value="FALSE";
							}
	            }
					else	// other browser
					{	if (tablerow[i].style.display=="none")	// display
	                   {tablerow[i].style.display = 'table-row';
							  document.SEARCHFORM.EXTMASK.value="TRUE";
							 }
	               else	// hide
						 	{tablerow[i].style.display = 'none';
							 document.SEARCHFORM.EXTMASK.value="FALSE";
							}
	            }
	        }
	}

	
//#################### reset form-searchparams ##############################
// 01.04.2005	TT	
function DeleteSearchParams(s_MODE,s_MASK)
	{	var b_ALL=(s_MODE=="all");
	
		if (b_ALL)
		{	if(document.SEARCHFORM.SEARCH1)		document.SEARCHFORM.SEARCH1.value="";
			if(document.SEARCHFORM.SEARCHBOOL)	document.SEARCHFORM.SEARCHBOOL.value="and";
			if(document.SEARCHFORM.PRICELIMIT)	document.SEARCHFORM.PRICELIMIT.value="lower";
			if(document.SEARCHFORM.PRICE)			document.SEARCHFORM.PRICE.value="";
			if(document.SEARCHFORM.CITY)			document.SEARCHFORM.CITY.value="";
			if (ViewName == 'quoka_at')
			   {
			   	if(document.SEARCHFORM.COUNTRY)		document.SEARCHFORM.COUNTRY.value="A";
			   }
			  else
			   {
			   	if(document.SEARCHFORM.COUNTRY)		document.SEARCHFORM.COUNTRY.value="D";
			   }
			if(document.SEARCHFORM.RADIUS)		document.SEARCHFORM.RADIUS.value="50";
			if(document.SEARCHFORM.SORTING)		document.SEARCHFORM.SORTING.value="date_desc";
			if(document.SEARCHFORM.DISPADS)		document.SEARCHFORM.DISPADS.value="20";
			// car/oldcar/motorbike/...
			if(document.SEARCHFORM.PRODUCER)		document.SEARCHFORM.PRODUCER.value="";
			if(document.SEARCHFORM.MODEL)			document.SEARCHFORM.MODEL.value="";
		}
		else if (s_MASK.toLowerCase()!="default")
		{	if(document.SEARCHFORM.SEARCH1)		document.SEARCHFORM.SEARCH1.value="";
			if(document.SEARCHFORM.SEARCHBOOL)	document.SEARCHFORM.SEARCHBOOL.value="and";
		}
		
		if (!b_ALL && (s_MASK.toLowerCase()!="motorbike"))
		{	if(document.SEARCHFORM.PRICELIMIT)	document.SEARCHFORM.PRICELIMIT.value="lower";
			if(document.SEARCHFORM.PRICE)			document.SEARCHFORM.PRICE.value="";
		}
		
		// custom
		if(document.SEARCHFORM.SEARCH2)		document.SEARCHFORM.SEARCH2.value="";
		// car/oldcar/motorbike
		if(document.SEARCHFORM.BODY)			document.SEARCHFORM.BODY.value="";
		if(document.SEARCHFORM.KM_MIN)		document.SEARCHFORM.KM_MIN.value="-1";
		if(document.SEARCHFORM.KM_MAX)		document.SEARCHFORM.KM_MAX.value="-1";
		if(document.SEARCHFORM.BUILT_MIN)	document.SEARCHFORM.BUILT_MIN.value="-1";
		if(document.SEARCHFORM.BUILT_MAX)	document.SEARCHFORM.BUILT_MAX.value="-1";
		if(document.SEARCHFORM.POWER)			document.SEARCHFORM.POWER.value="0,0";
		if(document.SEARCHFORM.COLOR)			document.SEARCHFORM.COLOR.value="";
		// tire
		if(document.SEARCHFORM.TIRETYPE)		document.SEARCHFORM.TIRETYPE.value="";
		if(document.SEARCHFORM.TIREWIDTH)	document.SEARCHFORM.TIREWIDTH.value="0";
		if(document.SEARCHFORM.TIREHEIGHT)	document.SEARCHFORM.TIREHEIGHT.value="0";
		if(document.SEARCHFORM.TIREDIAMETER)	document.SEARCHFORM.TIREDIAMETER.value="0";
		// bike
		if(document.SEARCHFORM.BIKETYPE)		document.SEARCHFORM.BIKETYPE.value="";
		if(document.SEARCHFORM.BIKEINCH)		document.SEARCHFORM.BIKEINCH.value="0";
		
		// love
		/* if(document.SEARCHFORM.IAM)
			{document.SEARCHFORM.IAM[0].checked=true;
			 document.SEARCHFORM.IAM[1].checked=false;}
		if(document.SEARCHFORM.ISEARCH)
			{document.SEARCHFORM.ISEARCH[0].checked=false;
			 document.SEARCHFORM.ISEARCH[1].checked=true;}
		if(document.SEARCHFORM.IWANT)
			document.SEARCHFORM.IWANT.checked=true;
		*/
	}
	

//#################### check if extended search can be closed ##############################
// 01.04.2005	TT	
function EXTENDEDSEARCH(s_MODE,s_MASK)
		{var b_OPENCLOSE=true;
		 var s_LINKTEXT="Einfache Suche";
		 var s_HREF="javascript:EXTENDEDSEARCH('OFF','" + s_MASK + "')";
		 var b_ASKCLOSE=false;
		 if (s_MODE == "OFF")
			{s_LINKTEXT="Erweiterte Suche";
		  	 s_HREF="javascript:EXTENDEDSEARCH('ON','" + s_MASK + "')";
			 
			 if (document.SEARCHFORM.PRICE.value!="")
			 	b_ASKCLOSE=true;
			 else if (document.SEARCHFORM.SEARCH2)
			 	if(document.SEARCHFORM.SEARCH2.value!="")
					b_ASKCLOSE=true;
			 
			 if (b_ASKCLOSE)
				{b_OPENCLOSE=confirm("Beim Schliessen der 'erweiterten Suche' werden die entsprechenden Suchkriterien geloescht!\n\nErweiterte Suche wirklich schliessen?");}
			 if (b_OPENCLOSE)	DeleteSearchParams('extended',s_MASK);
			}
			
		 if (b_OPENCLOSE) 
		 	{
			 if (document.getElementById)
			 	{	// alert("1a - ok");
					document.getElementById("EXT_LINK").firstChild.nodeValue = s_LINKTEXT;
			      document.getElementById("EXT_LINK").href = s_HREF;
			   }
			 else if (document.all)
			 	{// alert("2");				// DEBUG!!!
			      document.all["EXT_LINK"].innerText = s_LINKTEXT;
			      document.all["EXT_LINK"].href = s_HREF;
			   }
			 else if (document.layers)
			 	{// alert("3");				// DEBUG!!!
					s_LINKTEXT="<a href='javascript:EXTENDEDSEARCH();'>"+s_LINKTEXT+"</a>";
			      document.layers["EXT_LINK"].document.write(s_LINKTEXT);
			      document.layers["EXT_LINK"].document.close();
			   }
			 	DisplayHideSearch(true,s_MASK);
			}
		}
		

//#################### call any url ##############################
// 12.04.2005	TT	
function CallURL(s_URL)
	{window.location.href=s_URL;}
		
//#################### call one submit ##############################
// 02.03.2006	AT	
var b_FORMSENT=false;
      function CallOneSUBMIT(s_formID)
      { var b_SUBMIT=true;
		 if (!b_FORMSENT)
				{b_FORMSENT=true;
				 //document.getElementById(s_formID).submit();
				}
			else
				{alert("Sie haben Ihre Daten bereits abgesendet!\nBitte warten Sie ...");
				 b_SUBMIT=false;
				}
	    return b_SUBMIT;
	   } 
	   
	function CallHLSUBMIT(s_hl_value)
      {  //alert(s_hl_value);
	     var b_SUBMIT=true;
		 if (s_hl_value == "")
		 	{
				alert("Schlagzeile fehlt!\nBitte eingeben ...");
				 b_SUBMIT=false;
			}
		 if (s_hl_value == "Schlagzeile")
		 	{
				alert("Bitte geben Sie Ihre Schlagzeile ein");
				 b_SUBMIT=false;
			}
		 return b_SUBMIT;
		
	   } 

//########## detail-preview (insert) - alert at links and forms ###############
// 04.03.2007	TT
	function NoPreviewService()
	{	var s_TEXT="Diese Funktion steht in der Vorschau nicht zur Verfügung.";
		alert(s_TEXT);
	}
	
// ########## navigator: switch content ON/OFF ###############
// 08.07.2008	TT
	function SwitchNavigator(s_NAVIGATOR,b_TOPNAVIGATOR)
	{	var s_NAVHEAD_BASECLASS = "NAV_HEAD_";
		if ( b_TOPNAVIGATOR )
		{
			s_NAVHEAD_BASECLASS = "NAV_HEAD_TOP_";
		}
		var obj_CONTENT=document.getElementById( "NAV_CONTENT_" + s_NAVIGATOR );
		var obj_HEAD=document.getElementById( s_NAVHEAD_BASECLASS + s_NAVIGATOR );
		var s_OBJ_STATUS="";
		if ( obj_CONTENT )
		{	s_OBJ_STATUS = obj_CONTENT.style.display;
			if (obj_CONTENT.className == "NAV_CONTENT_CLOSED")
				{	obj_CONTENT.className = "NAV_CONTENT_OPEN";
					obj_HEAD.className = s_NAVHEAD_BASECLASS + "OPEN";
				}
			else
				{	obj_CONTENT.className = "NAV_CONTENT_CLOSED";
					obj_HEAD.className = s_NAVHEAD_BASECLASS + "CLOSED";
				}
		}
		return false;
	}
	
// ########## navigator: formfield handling ###############
// 08.07.2008	TT
	function NaviSearch_Set(s_FIELDNAME,s_VALUE,b_PERFORMSEARCH)
	{	var s_FORMFIELD=eval("document.NAVISEARCH."+s_FIELDNAME);
		// alert("s_FIELDNAME: " + s_FIELDNAME + "\ns_VALUE: " + s_VALUE + "\nb_PERFORMSEARCH: " + b_PERFORMSEARCH)
		if (s_FORMFIELD)
		{	
			if (b_PERFORMSEARCH == 1)
			{	// check dependence to other variables
				NaviSearch_CheckPrice(s_FIELDNAME,s_VALUE);
				// set value & submit
				s_FORMFIELD.value=s_VALUE;
				NaviSearch_Submit();
			}
			else
				s_FORMFIELD.value=s_VALUE;
		}
		return false;
	}
	
// ########## navigator: check price ###############
// 08.07.2008	TT
	function NaviSearch_CheckPrice(s_FIELDNAME,s_VALUE)
	{	var s_FORMFIELD_PRICE = document.NAVISEARCH.PRICE;
		var s_FORMFIELD_PRICELOW = document.NAVISEARCH.PRICELOW;
		var s_FORMFIELD_PRICETOP = document.NAVISEARCH.PRICETOP;
		if (s_FORMFIELD_PRICE && s_FORMFIELD_PRICELOW && s_FORMFIELD_PRICETOP)
		{
			if (s_FIELDNAME == "PRICE")
			{	if ((s_VALUE == "") || (s_VALUE == "FREE") || (s_VALUE == "NOPRICE"))	// all prices
				{	// NaviSearch_ClearPriceSelection();
					// document.NAVISEARCH.PRICELOW.selectedIndex = 0;
					// document.NAVISEARCH.PRICETOP.selectedIndex = 0;
					// s_FORMFIELD_PRICE.value=s_VALUE;
					document.NAVISEARCH.PRICELOW.value = "von";
					document.NAVISEARCH.PRICETOP.value = "bis";
				}
				else		// von - bis
					s_FORMFIELD_PRICE.value="";	// set PRICE to ""
			}
			// else if ((document.NAVISEARCH.PRICELOW.selectedIndex != 0) || (document.NAVISEARCH.PRICETOP.selectedIndex != 0))
			else if ( (document.NAVISEARCH.PRICELOW.value != "von") || (document.NAVISEARCH.PRICETOP.value != "bis") )
			{	s_FORMFIELD_PRICE.value="";	}	// set PRICE to ""
		}
		return true;
	}
	
// ########## navigator: submit form ###############
// 08.07.2008	TT	
	function NaviSearch_Submit()
	{	// 12.02.2009	set PAGENO and mode to default, cause new search is performed
		document.NAVISEARCH.PAGENO.value = "1";
		document.NAVISEARCH.NOTEPAGENO.value = "1";
		document.NAVISEARCH.MODE.value = "search";
	
		b_SWITCH_SUBTREE = false;	// do not display/hide subtree <li>-onclick, when <a>-onclick is performed
		document.NAVISEARCH.submit();
		return false;
	}

// ########## navigator: switch "more elements" ON/OFF ###############
// 08.07.2008	TT
	function MoreElements(s_NAVIGATOR,s_ACTION)
	{	var obj_MORELINK=document.getElementById( "NAV_CONTENT_" + s_NAVIGATOR + "_MORELINK" );
		var obj_MOREELEMENTS=document.getElementById( "NAV_CONTENT_" + s_NAVIGATOR + "_MOREELEMENTS" );
		if ( obj_MORELINK && obj_MOREELEMENTS)
		{	if (s_ACTION == "open")
			{	obj_MORELINK.style.display = "none";
				obj_MOREELEMENTS.style.display = "block";
			}
			else	// close
			{	obj_MOREELEMENTS.style.display = "none";
				obj_MORELINK.style.display = "block";
			}
		}
		return true;
	}
	
	
//########## navigator: check searchforms and send one of defined forms ###############
// 01.07.2008	TT
	function SearchformSend()
	{	// move input-params to Navigator
		if ( (document.NAVISEARCH) && (document.SEARCHFORM) )
		{	document.NAVISEARCH.SEARCH1.value = document.SEARCHFORM.SEARCH1.value;
			document.NAVISEARCH.CITY.value = document.SEARCHFORM.CITY.value;
			document.NAVISEARCH.RADIUS.value = document.SEARCHFORM.RADIUS.value;
			document.NAVISEARCH.submit();
		}
		else	// send "old" form
		{	if (document.SEARCHFORM.SEARCHBUTTON)
				document.SEARCHFORM.SEARCHBUTTON.value = "YES";
			document.SEARCHFORM.submit();
		}
		return;
	}	
	

//########## check form-values to defautl-value: on focus -> delete default-value / onblur -> set default-value ###############
// 09.07.2008	TT
	function CheckFormFieldDefaultValue(s_ACTION,s_FORMELEMENT,s_DEFAULTVALUE)
	{	var s_ELEMENTVALUE = s_FORMELEMENT.value;
		s_ELEMENTVALUE = s_ELEMENTVALUE.replace(/^\s+/,'').replace(/\s+$/,'');	// trim
		
		if ( s_ACTION == "focus" )
		{	if ( s_ELEMENTVALUE == s_DEFAULTVALUE )
			s_FORMELEMENT.value = "";
		}
		else  // blur
		{	if ( s_ELEMENTVALUE == "" )
			s_FORMELEMENT.value = s_DEFAULTVALUE;
		}
		return false;
	}
	
//########## reset cityvalues to get new citydata ###############
// 16.07.2008	TT
	function NAVI_CHANGECITY(n_CITYID)
	{	NaviSearch_Set('CITY','',0);
		NaviSearch_Set('CITYCHECK','',0);
		NaviSearch_Set('VTLAT','0',0);
		NaviSearch_Set('VTLONG','0',0);
		NaviSearch_Set('CITYID',n_CITYID,1);
		return false;
	}
	
//########## switch navigator-sublevels on/off ###############
// 14.07.2008	TT

	// do or do not display/hide subtree <li>-onclick, when <a>-onclick is performed
	var b_SWITCH_SUBTREE = true;

	function NAVI_SWITCH(s_OBJECTID)
	{	var s_OBJECT = document.getElementById(s_OBJECTID);
		if (b_SWITCH_SUBTREE && s_OBJECT)
		{	
			if (s_OBJECT.style.display == "none")
				s_OBJECT.style.display = "block";
			else
				s_OBJECT.style.display = "none";
		}
		return false;
	}
	
// ########## call detail-ad from newestads, poleposition, videoads, ...
function DETAIL_SHOWAD(n_ADNO,b_HBACK)
{	var s_LINK = "/searchdetail.cfm?SHOWADNO=" + n_ADNO;
	var b_HBACK = (b_HBACK == null) ? true : b_HBACK;	// set default param [true|false] if not defined
	if ( b_HBACK )
		 s_LINK = s_LINK + "&hback=TRUE";
	window.location.href = s_LINK;
	return true;
}

//########## switch navigator-sublevels on/off ###############
// 20.01.2009	TT
function SUBMIT_SEARCHFORM(s_ACTIONLINK,s_PARAMETERS)
{	
	var ary_PARAMETERS = new Array();
	var ary_PARAMVALUE = new Array();
	var s_DELIM_PARAMETERS = "&";
	var s_DELIM_PARAMVALUE = "=";
	var s_FIELDNAME = "";
	var s_VALUE = "";
	
	s_FIELDNAME=s_FIELDNAME.toUpperCase();
	
	if (s_ACTIONLINK != '') {
		// alert("set action to:\n"+s_ACTIONLINK);
		document.NAVISEARCH.action = s_ACTIONLINK;
	}
	
	// alert(s_PARAMETERS);
	if ( s_PARAMETERS.length > 1 ) {
		// split s_PARAMETERS to separate pairs (variable=value)
		ary_PARAMETERS = s_PARAMETERS.split(s_DELIM_PARAMETERS);
		// set formfields by s_FIELDNAME and s_VALUE
		for (var i=0; i<ary_PARAMETERS.length; i++) {
			s_PAIR = ary_PARAMETERS[i];
			ary_PARAMVALUE = s_PAIR.split(s_DELIM_PARAMVALUE);
			s_FIELDNAME = ary_PARAMVALUE[0];
			s_VALUE = ary_PARAMVALUE[1];
			// alert("Param: " + s_FIELDNAME + "\nValue: '" + s_VALUE + "'");
			
			// check existing field - no exist: create field
			if ( typeof document.NAVISEARCH.elements[s_FIELDNAME] == 'undefined') {
				NewElement = document.createElement("input");	
				NewElement.setAttribute("type","hidden");
				NewElement.setAttribute("name",s_FIELDNAME);
				NewElement.setAttribute("value",s_VALUE);
				document.NAVISEARCH.appendChild(NewElement);
			}
			else {	// if exists: set value
				// document.NAVISEARCH.getElementsByName(s_FIELDNAME).value = s_VALUE;
				document.NAVISEARCH.elements[s_FIELDNAME].value = s_VALUE;
			}
		}	// for
	} // if

	document.NAVISEARCH.submit();

	// return true;
}

function isSSLActive(){
	return ('https:' == document.location.protocol);
}

function pintSSLNotifycation(strId){
	objLayer = self.document.getElementById(strId);
	if(objLayer) {
		if(isSSLActive()){
			objLayer.innerHTML = "Diese Seite ist SSL-gesch&uuml;tzt! <img src=\"/images/common/secure.gif\" border=\"0\" align=\"texttop\" alt=\"SSL-gesch&uuml;tzt\">";
		} else {
			objLayer.innerHTML = "&nbsp;";
		}
	}
}

/***
 * create a href
 *
 * @param	string strUrl		url to link
 * @param	string strLabel		text for the link
 * @param	string strTarget	optional target where url will be opend
 * @param	string strTitle		optional url title
 * @param	string strClass		optional css class
 * @param 	string strStyle		optional style params
 * @param	string strOnClick	optional onClick event handel
 */
function aNoFollow(strUrl,strLabel,strTarget,strTitle,strClass,strStyle,strOnClick){
	if(strUrl == '' || strLabel == ''){
		return false;
	}
	strHRef = '<a href="'+strUrl+'"';
	if(strTarget != ''){
		strHRef += ' target="'+strTarget+'"';
	}
	if(strTitle != ''){
		strHRef += ' title="'+strTitle+'"';
	}
	if(strClass != ''){
		strHRef += ' class="'+strClass+'"';
	}
	if(strStyle != ''){
		strHRef += ' style="'+strStyle+'"';
	}
	if(strOnClick != ''){
		strHRef += ' onClick="'+strOnClick+'"';
	}
	strHRef += '>'+strLabel+'</a>';
	document.write(strHRef);
}

/***
 * create image map link
 *
 * @param	string strUrl			url to link
 * @param	string strCoords		coords to use
 * @param	string strShape			shape type
 * @param	string strId			optional id
 * @param	string strOnMouseOver	optional handle mouse over
 * @param	string strOnMouseOut	optional handle mouse out
 * @param	string strTitle			optional title
 * @param	string strAlt			optional alternate text
 */ 
function aImageArea(strUrl,strCoords,strShape,strId,strOnMouseOver,strOnMouseOut,strTitle,strAlt,strTarget,strOnClick){
	if( strUrl == '' || strCoords == '' || strShape == ''){
		return false;
	}
	strHRefArea = '<area href="'+strUrl+'" coords="'+strCoords+'" shape="'+strShape+'"';
	if(strId){
		strHRefArea += ' id="'+strId+'"';
	}
	if(strOnMouseOver){
		strHRefArea += ' onMouseOver="'+strOnMouseOver+'"';
	}
	if(strOnMouseOut){
		strHRefArea += ' onMouseOut="'+strOnMouseOut+'"';
	}
	if(strTitle){
		strHRefArea += ' title="'+strTitle+'"';
	}
	if(strAlt){
		strHRefArea += ' alt="'+strAlt+'"';
	}
	if(strTarget){
		strHRefArea += ' target="'+strTarget+'"';
	}
	if(strOnClick){
		strHRefArea += ' onClick="'+strOnClick+'"'
	}
	strHRefArea += '>';
	document.write(strHRefArea);
}

// Check if actual site is opened in iframe, popup or main-window (needed for payment-/ad-confirmation)
function GetSiteEnvironment()
{
	//alert("top.location:\n" + top.location + "\n\nself.location:\n" + self.location + "\n\nopener:\n" + opener);
	
	if (top.location != self.location) {
		return "FRAME";       // is frameset
	}
	else if (window.opener) {
		return "POPUP";       // is popup
	}
	else {
		return "MAIN";        // is mainpage
	}
}

// Open a link in main-window, independed if site is opened in frameset, popup or main-window
// s_LINK = [link to new site] / b_ClosePopup = [true|false]  (true = close popup, if opened in popup)
function MainWindowOpener(s_LINK,b_ClosePopup)
{
	var s_ENVIRONMENT = GetSiteEnvironment();
	if (s_ENVIRONMENT == "FRAME") {
		top.location.href = s_LINK;
	}
	else if (s_ENVIRONMENT == "POPUP") {
		window.opener.location.href = s_LINK;
		if (b_ClosePopup) {
			window.close();
		}
	}
	else {
		window.location.href = s_LINK;
	}
}


/* --- START tooltip functionality ----------------------------------------- */
var g_qtt = null;
var g_qttFx = null;
var g_qttTimerId = 0;
var g_qttSettingsDefault = {
	numQTooltipWidth:      null, // Default width is set via CSS
	strQTooltipPosition:   'dyn-bottom-right',
	blnUseFadeIn:          false,
	blnUseFadeOut:         false,
	numFadeDuration:       200,
	numHideDelay:          0,
	strReferenceElementId: null
};
var g_qttSettingsRuntime = {};

function initQTooltip( objConfig )
{
	// Override default settings with "global" settings (if provided)
	if ( objConfig ) {
		if ( objConfig.numQTooltipWidth ) {
			g_qttSettingsDefault.numQTooltipWidth = objConfig.numQTooltipWidth;
		}
		if ( objConfig.strQTooltipPosition ) {
			g_qttSettingsDefault.strQTooltipPosition = objConfig.strQTooltipPosition;
		}
		if ( objConfig.blnUseFadeIn ) {
			g_qttSettingsDefault.blnUseFadeIn = objConfig.blnUseFadeIn;
		}
		if ( objConfig.blnUseFadeOut ) {
			g_qttSettingsDefault.blnUseFadeOut = objConfig.blnUseFadeOut;
		}
		if ( objConfig.numFadeDuration ) {
			g_qttSettingsDefault.numFadeDuration = objConfig.numFadeDuration;
		}
		if ( objConfig.numHideDelay ) {
			g_qttSettingsDefault.numHideDelay = objConfig.numHideDelay;
		}
		if ( objConfig.strReferenceElementId ) {
			g_qttSettingsDefault.strReferenceElementId = objConfig.strReferenceElementId;
		}
	}
	
	document.onmousemove = updateQTooltip;
}

function updateQTooltip( objEvent )
{
	if ( g_qtt != null ) {
		g_qtt = $( g_qtt );
		
		var x = parseInt( ( document.all ) ? window.event.x + g_qtt.offsetParent.scrollLeft : objEvent.pageX );
		var y = parseInt( ( document.all ) ? window.event.y + g_qtt.offsetParent.scrollTop  : objEvent.pageY );
		
		// Get necessary runtime settings
		var numQTooltipWidth    = ( g_qttSettingsRuntime.numQTooltipWidth    ? g_qttSettingsRuntime.numQTooltipWidth    : ( g_qttSettingsDefault.numQTooltipWidth ? g_qttSettingsDefault.numQTooltipWidth : g_qtt.getStyle( 'width' ).toInt() ) );
		var strQTooltipPosition = ( g_qttSettingsRuntime.strQTooltipPosition ? g_qttSettingsRuntime.strQTooltipPosition : g_qttSettingsDefault.strQTooltipPosition );
		strQTooltipPosition = new String( strQTooltipPosition );
		
		// Adjust tooltip dimensions and move to necessary position
		if ( strQTooltipPosition.indexOf( 'static' ) === 0 ) {
			var aryStatic = strQTooltipPosition.split( '|' );
			strQTooltipPosition = aryStatic[ 0 ];
			var numStaticX = parseInt( aryStatic[ 1 ] );
			var numStaticY = parseInt( aryStatic[ 2 ] );
		} else if ( strQTooltipPosition.indexOf( 'relative' ) === 0 ) {
			var objRef = $( g_qttSettingsRuntime.strReferenceElementId );
			var aryRelative = strQTooltipPosition.split( '|' );
			strQTooltipPosition = aryRelative[ 0 ];
			var numRelativeX = objRef.getLeft().toInt() + parseInt( aryRelative[ 1 ] );
			var numRelativeY = objRef.getTop().toInt()  + parseInt( aryRelative[ 2 ] );
		}
		
		switch ( strQTooltipPosition ) {
			case 'dyn-top-left':
				numQTooltipHeight = g_qtt.getStyle( 'height' ).toInt();
				numQTooltipTop  = y - numQTooltipHeight - 25;
				numQTooltipLeft = x - 25 - g_qttSettingsRuntime.numQTooltipWidth;
				break;
				
			case 'dyn-top-right':
				numQTooltipHeight = g_qtt.getStyle( 'height' ).toInt();
				numQTooltipTop  = y - numQTooltipHeight - 25;
				numQTooltipLeft = x + 20;
				break;
				
			case 'dyn-bottom-left':
				numQTooltipTop  = y + 20;
				numQTooltipLeft = x - 25 - parseInt( g_qttSettingsRuntime.numQTooltipWidth );
				break;
				
			case 'dyn-bottom-right':
				numQTooltipTop  = y + 20;
				numQTooltipLeft = x + 20;
				break;
				
			case 'static':
				numQTooltipTop  = numStaticY;
				numQTooltipLeft = numStaticX;
				break;
				
			case 'relative':
				numQTooltipTop  = numRelativeY;
				numQTooltipLeft = numRelativeX;
				break;
				
			default:
				numQTooltipTop  = y + 20;
				numQTooltipLeft = x + 20;
				break;
		}
		
		g_qtt.setStyle( 'width', numQTooltipWidth );
		g_qtt.setStyle( 'top',   numQTooltipTop );
		g_qtt.setStyle( 'left',  numQTooltipLeft );
	}
}

function showQTooltip( strId, objOptions )
{
	if ( g_qttTimerId > 0 ) {
		// Hide delay timer still running => stop timer
		window.clearTimeout( g_qttTimerId );
		g_qttTimerId = 0;
		
		if ( g_qttSettingsRuntime.strTooltipId && g_qttSettingsRuntime.strTooltipId == strId ) {
			return; // Do not show same tooltip, which is still visible (would look strange, if using fading)
		}
	}
	
	if ( g_qttFx ) {
		// Transition still running => stop Fx and hide former tooltip
		g_qttFx.stop();
		g_qttFx = null;
		
		g_qtt.setStyle( 'display', 'none' );
		g_qtt = null;
	}
	
	resetRuntimeSettings();
	g_qttSettingsRuntime.strTooltipId = strId;
	
	g_qtt = $( strId );
	
	// Get runtime settings from options (or from default settings, if not provided via options)
	g_qttSettingsRuntime.numQTooltipWidth      = ( objOptions ? ( objOptions.numQTooltipWidth      ? objOptions.numQTooltipWidth      : ( g_qttSettingsDefault.numQTooltipWidth ? g_qttSettingsDefault.numQTooltipWidth : g_qtt.getStyle( 'width' ).toInt() ) ) : g_qtt.getStyle( 'width' ).toInt() );
	g_qttSettingsRuntime.strQTooltipPosition   = ( objOptions ? ( objOptions.strQTooltipPosition   ? objOptions.strQTooltipPosition   : g_qttSettingsDefault.strQTooltipPosition   ) : g_qttSettingsDefault.strQTooltipPosition );
	g_qttSettingsRuntime.blnUseFadeIn          = ( objOptions ? ( objOptions.blnUseFadeIn          ? objOptions.blnUseFadeIn          : g_qttSettingsDefault.blnUseFadeIn          ) : g_qttSettingsDefault.blnUseFadeIn );
	g_qttSettingsRuntime.blnUseFadeOut         = ( objOptions ? ( objOptions.blnUseFadeOut         ? objOptions.blnUseFadeOut         : g_qttSettingsDefault.blnUseFadeOut         ) : g_qttSettingsDefault.blnUseFadeOut );
	g_qttSettingsRuntime.numFadeDuration       = ( objOptions ? ( objOptions.numFadeDuration       ? objOptions.numFadeDuration       : g_qttSettingsDefault.numFadeDuration       ) : g_qttSettingsDefault.numFadeDuration );
	g_qttSettingsRuntime.numHideDelay          = ( objOptions ? ( objOptions.numHideDelay          ? objOptions.numHideDelay          : g_qttSettingsDefault.numHideDelay          ) : g_qttSettingsDefault.numHideDelay );
	g_qttSettingsRuntime.strReferenceElementId = ( objOptions ? ( objOptions.strReferenceElementId ? objOptions.strReferenceElementId : g_qttSettingsDefault.strReferenceElementId ) : g_qttSettingsDefault.strReferenceElementId );
	
	// Display tooltip (with fading, if enabled)
	if ( g_qttSettingsRuntime.blnUseFadeIn ) {
		g_qtt.setStyle( 'opacity', 0 );
		g_qtt.setStyle( 'display', 'block' );
		
		g_qttFx = new Fx.Style( g_qtt, 'opacity', { duration: g_qttSettingsRuntime.numFadeDuration } );
		g_qttFx.start( 0, 1 );
	} else {
		g_qtt.setStyle( 'display', 'block' );
	}
}

function hideQTooltip( strId )
{
	var hideTooltip = function() {};
	g_qtt = $( strId );
	
	// Prepare hide function (with fading, if enabled)
	if ( g_qttSettingsRuntime.blnUseFadeOut ) {
		hideTooltip = function() {
			g_qttFx = new Fx.Style( g_qtt, 'opacity', { duration: g_qttSettingsRuntime.numFadeDuration, onComplete: function() {
				g_qtt.setStyle( 'opacity', 1 );
				g_qtt.setStyle( 'display', 'none' );
				g_qtt = null;
				
				g_qttFx = null;
			} } );
			g_qttFx.start( 1, 0 );
		};
	} else {
		hideTooltip = function() {
			g_qtt.setStyle( 'display', 'none' );
			g_qtt = null;
			
			g_qttFx = null;
		};
	}
	
	// Hide tooltip (with delay, if set)
	if ( g_qttSettingsRuntime.numHideDelay > 0 ) {
		g_qttTimerId = window.setTimeout( function() { hideTooltip(); g_qttTimerId = 0; }, g_qttSettingsRuntime.numHideDelay );
	} else {
		hideTooltip();
	}
}

function resetRuntimeSettings()
{
	// Reset runtime settings
	g_qttSettingsRuntime.numQTooltipWidth      = null;
	g_qttSettingsRuntime.strQTooltipPosition   = null;
	g_qttSettingsRuntime.blnUseFadeIn          = null;
	g_qttSettingsRuntime.blnUseFadeOut         = null;
	g_qttSettingsRuntime.numFadeDuration       = null;
	g_qttSettingsRuntime.numHideDelay          = null;
	g_qttSettingsRuntime.strReferenceElementId = null;
	
	g_qttSettingsRuntime.strTooltipId = '';
}
/* --- END tooltip functionality ------------------------------------------- */



/* --- START class "AutoCompleter" ----------------------------------------- */

var g_blnAcDebugEnabled  = false;

var g_arrayAutoCompleter = new Array();
var g_numAutoCompleterId = 0;
var g_numActiveId = 0;

function initAutoCompleter( p_objAcInit )
{
	if ( typeof( p_objAcInit ) == 'object' ) {
		return function() {
			g_arrayAutoCompleter[ g_numAutoCompleterId ] = new AutoCompleter( p_objAcInit, g_numAutoCompleterId );
			g_numAutoCompleterId++;
		};
	} else {
		return function() {};
	}
}


var AutoCompleter = new Class( {
	
	initialize: function( p_objAcInit, p_numId ) {
		
		// Initialize properties with default values
		this.formElement = $(p_objAcInit.formElement);
		this.strURL = p_objAcInit.strURL;
		this.strRequestProxy = null;
		this.strCallback = null;
		this.strCallbackNoResult = null;
		this.strCallbackReset = null;
		this.arrayInfusion = null;
		
		this.numAcItems = 20;
		this.numMinLengthNumeric = 2;
		this.numMinLengthNonNumeric = 3;
		
		this.blnAcContainerShown = false;
		this.numSelectedItem = 0;
		this.lastResponse = null;
		this.fadeDuration = 300;
		this.fullOpacity = 0.95;
		
		this.numLatency = 250;
		this.timerId = false;
		
		
		// Set class instance id
		if ( $defined( p_numId ) ) {
			this.acId = p_numId;
		} else {
			this.acId = 0;
		}
		
		// Set properties according to respective values passed in init object
		if ( $defined( p_objAcInit.arrayInfusion ) ) {
			this.arrayInfusion = p_objAcInit.arrayInfusion;
		}
		if ( $defined( p_objAcInit.strCallback ) ) {
			this.strCallback = p_objAcInit.strCallback;
		}
		if ( $defined( p_objAcInit.strCallbackNoResult ) ) {
			this.strCallbackNoResult = p_objAcInit.strCallbackNoResult;
		}
		if ( $defined( p_objAcInit.strCallbackReset ) ) {
			this.strCallbackReset = p_objAcInit.strCallbackReset;
		}
		if ( $defined( p_objAcInit.numAcItems ) ) {
			this.numAcItems = p_objAcInit.numAcItems;
		}
		if ( $defined( p_objAcInit.numMinLengthNumeric ) ) {
			this.numMinLengthNumeric = p_objAcInit.numMinLengthNumeric;
		}
		if ( $defined( p_objAcInit.numMinLengthNonNumeric ) ) {
			this.numMinLengthNonNumeric = p_objAcInit.numMinLengthNonNumeric;
		}
		if ( $defined( p_objAcInit.strRequestProxy ) ) {
			this.strRequestProxy = p_objAcInit.strRequestProxy
		}
		
		
		this.acAjax = new Ajax();
		this.blnNeedRequest = false;
		
		// Add event to form element
		this.formElement.addEvent( 'keyup', this.processRequestEventPrep.bindWithEvent( this, '' ) );
		this.formElement.addEvent( 'focus', this.processRequestEventPrep.bindWithEvent( this, '' ) );
		
		// Add properties to form element
		this.formElement.setProperty( 'autocomplete', 'off' );
		
		// Add auto-completion container to DOM (if it does not already exist)
		if ( $('AutoCompleteContainer') ) {
			this.acContainer = $('AutoCompleteContainer');
			this.acContainer.addClass( 'AutoCompleteContainer' );
		} else {
			this.acContainer = $(document.createElement( 'div' ));
			this.acContainer.addClass( 'AutoCompleteContainer' );
			$(document.getElementsByTagName( 'body' )[ 0 ]).appendChild( this.acContainer );
		}
		
		// Add event(s) to document
		if ( ! window.opera ) {
			// => only add event when NOT using Opera, because selecting an item with "enter" would send form in Opera
			$(document).addEvent( 'keydown', this.processDocumentKeyEvent.bindWithEvent( this, '' ) );
		}
		$(document).addEvent( 'click', this.processDocumentClickEvent.bindWithEvent( this, '' ) );
		
		// Display debug message container, if debug is enabled
		if ( g_blnAcDebugEnabled && $('AcDebugContainer') ) {
			$('AcDebugContainer').setStyle( 'display', 'block' );
		}
	},
	
	
	// Function is called on "keyup" event from auto-completion form element, calls function that starts AJAX request to fetch auto-completion response, with a certain latency
	processRequestEventPrep: function( event, myarg ) {
		if ( $defined( event ) ) {
			// Check for certain keys, which should not trigger a request
			this.debugMessage( 'event.key = ' + event.key );
			if (
					event.key == 'esc' || 
					event.key == 'left' || 
					event.key == 'right' || 
					event.key == 'up' || 
					event.key == 'down' || 
					event.key == 'enter'
			) {
				return false;
			}
		}
		
		var _strValue = this.getFormElementValue();
		if ( _strValue != '' ) {
			// Auto-completion term has changed => call reset function, if defined
			if ( $defined( this.strCallbackReset ) && event.type != 'focus' ) {
				var _strOperation = this.strCallbackReset + '();';
				_strOperation = _strOperation.replace( /"/g, "'" );
				eval( _strOperation );
			}
		}
		
		g_numActiveId = this.acId;
		if ( this.timerId ) { window.clearTimeout( this.timerId ); }
		this.timerId =
			window.setTimeout( function() {
				g_arrayAutoCompleter[ g_numActiveId ].processRequestEvent();
				g_arrayAutoCompleter[ g_numActiveId ].debugMessage( 'Timer re-triggered processing of request event.' );
			}, this.numLatency );
		
	},
	
	
	// Function is called on "keyup|focus" event from auto-completion form element, starts AJAX request to fetch auto-completion response
	processRequestEvent: function( event, myarg ) {
		if ( this.acAjax && ! this.acAjax.running ) {
			
			var _numMinLength = 0;
			var _strValue = this.getFormElementValue();
			if ( _strValue != '' ) {
				
				if ( isNaN( _strValue ) ) {
					_numMinLength = this.numMinLengthNonNumeric;
				} else {
					_numMinLength = this.numMinLengthNumeric;
				}
				
				if ( _strValue.length >= _numMinLength ) {
					this.debugMessage( 'Starting request, act=' + _strValue + '.' );
					
					if ( $defined( this.strRequestProxy ) ) {
						var _strURLParams = 'act=' + _strValue;
					} else {
						var _strURLParams = 'act=' + escape( _strValue );
					}
					
					// Add infused data to URL parameters
					if ( $defined( this.arrayInfusion ) ) {
						this.arrayInfusion.forEach( function( obj, index ) {
							if ( obj.type == 'static' ) {
								_strURLParams += '&' + obj.name + '=' + obj.value;
							} else {
								_strURLParams += '&' + obj.name + '=' + obj.source.value;
							}
						}, this );
					}
					
					if ( $defined( this.strRequestProxy ) ) {
						var _strRequestURL = this.strRequestProxy + '?url=' + this.strURL + escape( '?' + _strURLParams );
					} else {
						var _strRequestURL = this.strURL + '?' + _strURLParams;
					}
					this.debugMessage( 'Request URL: ' + _strRequestURL );
					
					this.acAjax = new Ajax( _strRequestURL, { method: 'get', onComplete: this.processAcData } );
					this.acAjax.acClassInstance = this;
					this.acAjax.request();
				}
			} else {
				// Empty form element => fade-out auto-completion div (only if it is displayed)
				if ( this.blnAcContainerShown ) {
					//var _acFx = new Fx.Style( this.acContainer, 'opacity', { duration: this.fadeDuration, onComplete: this.clearAcContainer } );
					//_acFx.acClassInstance = this;
					//_acFx.start( this.fullOpacity, 0 );
					
					this.acContainer.setStyle( 'opacity', 0 );
					this.clearAcContainerNoFade();
				}
				
				// Empty form element => call reset function, if defined
				if ( $defined( this.strCallbackReset ) ) {
					var _strOperation = this.strCallbackReset + '();';
					_strOperation = _strOperation.replace( /"/g, "'" );
					eval( _strOperation );
				}
			}
		} else {
			this.blnNeedRequest = true;
			this.debugMessage( 'Need to re-trigger processing of request event.' );
		}
	},
	
	
	// Function is called on "keydown" event from document, selects item in auto-completion div
	processDocumentKeyEvent: function( event, myarg ) {
		event = new Event( event );
		
		if( this.blnAcContainerShown ) {
			
			// Determine number of auto-completion items
			var _numAcItems = this.numAcItems;
			for ( var _i = 0; _i < this.numAcItems; _i++ ) {
				var _id = $('acItem_' + _i);
				if ( $defined( _id ) ) {
					_id.removeClass( 'AcItemHighlight' );
				} else {
					_numAcItems = _i;
					break;
				}
			}
			
			switch ( event.key ) {
				case 'up':
					this.numSelectedItem--;
					if ( this.numSelectedItem < 0 ) {
						this.numSelectedItem = _numAcItems - 1;
					}
					
					var _idPrev = $('acItem_' + this.numSelectedItem);
					if ( $defined( _idPrev ) ) {
						_idPrev.addClass( 'AcItemHighlight' );
					}
					
					event.stop();
					break;
					
				case 'down':
					this.numSelectedItem++;
					if ( this.numSelectedItem >= _numAcItems ) {
						this.numSelectedItem = 0;
					}
					
					var _idNext = $('acItem_' + this.numSelectedItem);
					if ( $defined( _idNext ) ) {
						_idNext.addClass( 'AcItemHighlight' );
					}
					
					event.stop();
					break;
					
				case 'enter':
 					// Insert currently selected auto-completion item into form element or call callback function
					
					var _acData = this.lastResponse;
					var _numSelectedItem = this.numSelectedItem;
					var _strText = this.lastResponse.result_set[ _numSelectedItem ].display_text;
					
					// Prepare operation string
					if ( $defined( this.strCallback ) ) {
						// Replace ' with URL-encoded \' , so nothing will break
						$each( _acData.result_set[ _numSelectedItem ], function( item, key ) {
							if ( typeof( item ) == 'string' ) {
								eval( '_acData.result_set[ _numSelectedItem ].' + key + ' = _acData.result_set[ _numSelectedItem ].' + key + '.replace( /\'/g, "%5C%27" );' );
							}
						} );
						
						var _strOperation = this.strCallback + "(" + Json.toString( _acData.result_set[ _numSelectedItem ] ) + ");";
						_strOperation = _strOperation.replace( /"/g, "'" );
					} else {
						var _strOperation = "document.forms['" + this.formElement.form.name + "'].elements['" + this.formElement.name + "'].value='" + _strText + "';";
					}
					
					// Execute operation string
					eval( _strOperation );
					
					// Empty form element => undisplay auto-completion div (only if it is displayed)
					if ( this.blnAcContainerShown ) {
						this.acContainer.setStyle( 'display', 'none' );
						this.blnAcContainerShown = false;
						this.acContainer.setHTML( '' );
					}
					this.numSelectedItem = -1;
					
					event.stop();
					return false;
					break;
					
				case 'esc':
					this.numSelectedItem = -1;
					
					if ( this.blnAcContainerShown ) {
						//var _acFx = new Fx.Style( this.acContainer, 'opacity', { duration: this.fadeDuration, onComplete: this.clearAcContainer } );
						//_acFx.acClassInstance = this;
						//_acFx.start( this.fullOpacity, 0 );
						
						this.acContainer.setStyle( 'opacity', 0 );
						this.clearAcContainerNoFade();
					}
					
					event.stop();
					return false;
					break;
			}
		}
	},
	
	
	// Function is called on "click" event from document, undisplays auto-completion div
	processDocumentClickEvent: function( event, myarg ) {
		event = new Event( event );
		
		this.numSelectedItem = -1;
		
		if ( this.blnAcContainerShown ) {
			//var _acFx = new Fx.Style( this.acContainer, 'opacity', { duration: this.fadeDuration, onComplete: this.clearAcContainer } );
			//_acFx.acClassInstance = this;
			//_acFx.start( this.fullOpacity, 0 );
			
			this.acContainer.setStyle( 'opacity', 0 );
			this.clearAcContainerNoFade();
		}
	},
	
	
	// Functon is called after fade-out of auto-completion div completed, clears and undisplays auto-completion div
	clearAcContainer: function() {
		// NOTE: "this" is the "Effect object"; "this.acClassInstance" is the "AutoCompleter object"
		
		this.acClassInstance.acContainer.setStyle( 'display', 'none' );
		this.acClassInstance.blnAcContainerShown = false;
		this.acClassInstance.acContainer.setHTML( '' );
	},
	
	
	// Functon clears and undisplays auto-completion div (used w/o fade-out)
	clearAcContainerNoFade: function() {
		this.acContainer.setStyle( 'display', 'none' );
		this.blnAcContainerShown = false;
		this.acContainer.setHTML( '' );
	},
	
	
	// Function is called after completed AJAX request, processes response of AJAX request
	processAcData: function( response ) {
		// NOTE: "this" is the "Ajax object"; "this.acClassInstance" is the "AutoCompleter object"
		
		this.acClassInstance.debugMessage( response );
		var response = Json.evaluate( response );
		this.acClassInstance.debugMessage( 'Processing ac response, act=' + response.ac_term + '.' );
		
		this.numSelectedItem = -1;						// Reset currently selected item
		this.acClassInstance.lastResponse = response;	// Store response data
		this.acClassInstance.displayAcData();			// Display stored response data
		
		// Call "no result" callback function (# of results is zero or an error occurred, i.e. result_set is false)
		if ( ( response.number_of_results == 0 || response.result_set == false ) && $defined( this.acClassInstance.strCallbackNoResult ) ) {
			var _strCallbackNoResult = this.acClassInstance.strCallbackNoResult + "();";
			eval( _strCallbackNoResult );
		}
		
		// Send another request by triggering event in form input, if necessary
		// (i.e. another event has happened, when a request was still running)
		if ( this.acClassInstance.blnNeedRequest ) {
			g_numActiveId = this.acClassInstance.acId;
			this.acClassInstance.blnNeedRequest = false;
			window.setTimeout( function() {
				g_arrayAutoCompleter[ g_numActiveId ].processRequestEvent();
				g_arrayAutoCompleter[ g_numActiveId ].debugMessage( 'Re-triggered processing of request event.' );
			}, 200 );
			this.acClassInstance.debugMessage( 'Preparing to re-trigger processing of request event.' );
		}
	},
	
	displayAcData: function() {
		var _formElementDimension = this.formElement.getCoordinates();
		
		// Generate content for auto-completion div
		var _acData = this.lastResponse;
		var _strHTML = '';
		
		if ( _acData.result_set != false ) {
			var _numResults = ( _acData.number_of_results > this.numAcItems ? this.numAcItems : _acData.number_of_results );
			for ( var _i = 0; _i < _numResults; _i++ ) {
				var _strText = _acData.result_set[ _i ].display_text;
				
				if ( $defined( this.strCallback ) ) {
					// Replace ' with URL-encoded \' , so nothing will break
					$each( _acData.result_set[ _i ], function( item, key ) {
						if ( typeof( item ) == 'string' ) {
							eval( '_acData.result_set[ _i ].' + key + ' = _acData.result_set[ _i ].' + key + '.replace( /\'/g, "%5C%27" );' );
						}
					} );
					
					var _strOperation = this.strCallback + "(" + Json.toString( _acData.result_set[ _i ] ) + ");";
					_strOperation = _strOperation.replace( /"/g, "'" );
				} else {
					var _strOperation = "document.forms['" + this.formElement.form.name + "'].elements['" + this.formElement.name + "'].value='" + _strText + "';";
				}
				
				_strHTML += '<div id="acItem_' + _i + '" class="AutoCompleteItem' + ( _i == this.numSelectedItem ? ' AcItemHighlight' : '' ) + '" onclick="' + _strOperation + ' $(this).getParent().setStyle(\'display\',\'none\'); g_arrayAutoCompleter[ g_numActiveId ].blnAcContainerShown=false; g_arrayAutoCompleter[ g_numActiveId ].numSelectedItem=0;" onmouseover="g_arrayAutoCompleter[ g_numActiveId ].uhl(); $(this).addClass(\'AcItemHighlight\'); g_arrayAutoCompleter[ g_numActiveId ].numSelectedItem=' + _i + ';" onmouseout="$(this).removeClass(\'AcItemHighlight\'); g_arrayAutoCompleter[ g_numActiveId ].numSelectedItem=-1;">' + _strText + '</div>';
				_strHTML = unescape( _strHTML ); // Replace URL-encoded \' with respective decoded characters
			}
		}
		
		// Set content and styles of auto-completion div
		if ( _acData.number_of_results > 0 && _acData.result_set != false ) {
			this.acContainer.setHTML( _strHTML );
			this.acContainer.setStyle( 'left', _formElementDimension.left + 1 );
			this.acContainer.setStyle( 'top', _formElementDimension.bottom + 1 );
			
			// Fade-in auto-completion div (only if it is NOT displayed)
			if ( ! this.blnAcContainerShown ) {
				this.acContainer.setStyle( 'opacity', 0 );
				this.acContainer.setStyle( 'display', 'block' );
				this.blnAcContainerShown = true;
				//var _acFx = new Fx.Style( this.acContainer, 'opacity', { duration: this.fadeDuration } );
				//_acFx.start( 0, this.fullOpacity );
				
				this.acContainer.setStyle( 'opacity', this.fullOpacity );
			}
		} else {
			this.acContainer.setHTML( '' );
			this.acContainer.setStyle( 'display', 'none' );
			this.blnAcContainerShown = false;
		}
	},
	
	
	// Function removes "highlight" class from all auto-completion items
	uhl: function() {
		for ( var _i = 0; _i < this.numAcItems; _i++ ) {
			var _id = $('acItem_' + _i);
			if ( $defined( _id ) ) {
				_id.removeClass( 'AcItemHighlight' );
			} else {
				break;
			}
		}
	},
	
	
	// Function returns prepared value of form element
	getFormElementValue: function() {
		return this.formElement.getValue().trim();
	},
	
	
	// Function writes debug message to container div, if debug mode is enabled via global variable "g_blnAcDebugEnabled"
	debugMessage: function( p_strMessage ) {
		if ( g_blnAcDebugEnabled ) {
			var _date = new Date();
			var _strTime = _date.getHours() + ':' + ( _date.getMinutes() < 10 ? '0' + _date.getMinutes() : _date.getMinutes() ) + ':' + ( _date.getSeconds() < 10 ? '0' + _date.getSeconds() : _date.getSeconds() ) + '.' + _date.getMilliseconds();
			if ( $('AcDebugContainer') ) {
				$('AcDebugContainer').setHTML( $('AcDebugContainer').innerHTML + '<strong>' + _strTime + '</strong>: ' + p_strMessage + '<br />' );
			}
		}
	}
	
} ); // class "AutoCompleter"

/* --- END class "AutoCompleter" ------------------------------------------- */



