var t_SearchString;
var t_Part;
var t_NodeName;
var t_Pos;
var t_NumWords = 0;
var t_Return = '<'+'?xml version="1.0" encoding="UTF-8"?><resultset>';
var flashProxy;
var t_SearchArray;
var t_PageMarkerArray = new Array();
var t_ComboLength;
var t_OrSearch = true;
var t_PrefixSearch = false;
var t_Delim = '$$$';



var Base64 = {   
  
    // private property   
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",   
  
    // public method for encoding   
    encode : function (input) {   
        var output = "";   
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;   
        var i = 0;   
  
        //input = Base64._utf8_encode(input);   
  
        while (i < input.length) {   
  
            chr1 = input.charCodeAt(i++);   
            chr2 = input.charCodeAt(i++);   
            chr3 = input.charCodeAt(i++);   
  
            enc1 = chr1 >> 2;   
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);   
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);   
            enc4 = chr3 & 63;   
  
            if (isNaN(chr2)) {   
                enc3 = enc4 = 64;   
            } else if (isNaN(chr3)) {   
                enc4 = 64;   
            }   
  
            output = output +   
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +   
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);   
  
        }   
  
        return output;   
    },   
  
    // public method for decoding   
    decode : function (input) {   
        var output = "";   
        var chr1, chr2, chr3;   
        var enc1, enc2, enc3, enc4;   
        var i = 0;   
  
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");   
  
        while (i < input.length) {   
  
            enc1 = this._keyStr.indexOf(input.charAt(i++));   
            enc2 = this._keyStr.indexOf(input.charAt(i++));   
            enc3 = this._keyStr.indexOf(input.charAt(i++));   
            enc4 = this._keyStr.indexOf(input.charAt(i++));   
  
            chr1 = (enc1 << 2) | (enc2 >> 4);   
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);   
            chr3 = ((enc3 & 3) << 6) | enc4;   
  
            output = output + String.fromCharCode(chr1);   
  
            if (enc3 != 64) {   
                output = output + String.fromCharCode(chr2);   
            }   
            if (enc4 != 64) {   
                output = output + String.fromCharCode(chr3);   
            }   
  
        }   
  
        //output = Base64._utf8_decode(output);   
  
        return output;   
  
    },   
  
    // private method for UTF-8 encoding   
    _utf8_encode : function (string) {   
        string = string.replace(/\r\n/g,"\n");   
        var utftext = "";   
  
        for (var n = 0; n < string.length; n++) {   
  
            var c = string.charCodeAt(n);   
  
            if (c < 128) {   
                utftext += String.fromCharCode(c);   
            }   
            else if((c > 127) && (c < 2048)) {   
                utftext += String.fromCharCode((c >> 6) | 192);   
                utftext += String.fromCharCode((c & 63) | 128);   
            }   
            else {   
                utftext += String.fromCharCode((c >> 12) | 224);   
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);   
                utftext += String.fromCharCode((c & 63) | 128);   
            }   
  
        }   
  
        return utftext;   
    },   
  
    // private method for UTF-8 decoding   
    _utf8_decode : function (utftext) {   
        var string = "";   
        var i = 0;   
        var c = c1 = c2 = 0;   
  
        while ( i < utftext.length ) {   
  
            c = utftext.charCodeAt(i);   
  
            if (c < 128) {   
                string += String.fromCharCode(c);   
                i++;   
            }   
            else if((c > 191) && (c < 224)) {   
                c2 = utftext.charCodeAt(i+1);   
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));   
                i += 2;   
            }   
            else {   
                c2 = utftext.charCodeAt(i+1);   
                c3 = utftext.charCodeAt(i+2);   
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));   
                i += 3;   
            }   
  
        }   
  
        return string;   
    }     
}  





var Utf8 = {

	// public method for url encoding
	encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	},

	// public method for url decoding
	decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}

		}
		return string;
	}
}

function getURLParam(strParamName)
{ 
  var strReturn = "";
  var strHref = window.location.href; 
  if ( strHref.indexOf("?") > -1 )
  {
    var strQueryString = strHref.substr(strHref.indexOf("?")+1).toLowerCase();
    var aQueryString = strQueryString.split("&"); 
    
    if(aQueryString.length > 0) 
    {
        for ( var iParam = 0; iParam < aQueryString.length; iParam++ )
        {            
          if (aQueryString[iParam].indexOf(strParamName + "=") > -1 )
          {
            var aParam = aQueryString[iParam].split("=");
            strReturn = aParam[1];            
            break;
          }
        }
    } else 
    {
         var aParam = strQueryString.split("=");
         if(aParam[0] == strParamName) {
            strReturn = aParam[1];  
         }
    }
  }
  return strReturn;
}

function readNode()
{
	t_SearchString = getURLParam("query");
	t_NodeName = t_SearchString.charAt(0);
	includeNode(t_NodeName);
}

function includeNode(a_Name, a_IndexPath)
{
	//alert("including: "+a_IndexPath+a_Name+'.js');
	//setTimeout("",1000);

	var head = document.getElementsByTagName('head').item(0)
	var scriptTag = document.getElementById('loadScript');
	if(scriptTag) 
		head.removeChild(scriptTag);
	script = document.createElement('script');
	script.src = a_IndexPath+a_Name+'.js';
	script.type = 'text/javascript';
	script.id = 'loadScript';
	head.appendChild(script);
}


function doSearch(a_String, a_IndexPath, a_PrefixSearch)
{
	//alert(a_String+" "+a_IndexPath+" "+a_PrefixSearch);
	t_PrefixSearch = a_PrefixSearch;
	if(a_String == "")
	{
		return;
	}
	//////alert('YEAH!');
	//alert('Word: '+a_String);
	a_String = Base64.decode(a_String);
	//////alert('Bla: '+a_String);
	t_OrSearch = false;
	//////alert('uid: '+uid);
	var t_Domain = window.location.hostname;
	if(t_Domain.indexOf(".angel") < 0 && t_Domain.indexOf("lpcms.") < 0)
	{
		//////alert("no angel");
		flashProxy = new FlashProxy(uid, 'http://akamai.livepaper.de.edgesuite.net/cache/emv/lp2.3/js/papersearch/JavaScriptFlashGateway.swf');
	}
	else
	{
		//////alert("angel");
		flashProxy = new FlashProxy(uid, '/content/js/papersearch/JavaScriptFlashGateway.swf');
	}
	t_SearchString = a_String.toLowerCase();
	t_PageMarkerArray = new Array();
	t_SearchArray = new Array();
	t_PagesFoundArray = new Array();
	t_SearchArray = t_SearchString.split(" ");
	t_NumWords = t_SearchArray.length;
	//////alert("NumWords: "+t_NumWords);
	t_ComboLength = t_NumWords;
	for(var t_Index = t_NumWords-1; t_Index >= 0; t_Index--)
	{
		t_Word = t_SearchArray[t_Index];
		//////alert("Current word: "+t_Word);
		t_NodeName = t_Word.charAt(0);
		//we use the first couple of ascii positions for umlaute:
		switch (t_NodeName)
		{
			case 'ä':
				t_NodeName = 1;
				break;
			case 'ü':
				t_NodeName = 2;
				break;
			case 'ö':
				t_NodeName = 3;
				break;
			case 'ß':
				t_NodeName = 4;
				break;
			default:
				t_NodeName = t_NodeName.charCodeAt(0);
				break;
		}
		includeNode(t_NodeName, a_IndexPath);
		/*var t_MillisW = 2000;
		var t_DateW = new Date();
		var t_CurDateW = null;
	
		do 
		{ 
			////alert("YEAH+++");
			t_CurDateW = new Date(); 
		} 
		while(t_CurDateW-t_DateW < t_MillisW);*/
	}
	////alert("all included");
}

function doOrSearch(a_String)
{
	//////alert("OR-SEARCH");
	t_OrSearch = true;
	var t_Domain = window.location.hostname;
	if(t_Domain.indexOf(".angel") < 0 && t_Domain.indexOf("lpcms.") < 0)
	{
		//////alert("no angel");
		flashProxy = new FlashProxy(uid, 'http://akamai.livepaper.de.edgesuite.net/cache/emv/lp2.3/js/papersearch/JavaScriptFlashGateway.swf');
	}
	else
	{
		//////alert("angel");
		flashProxy = new FlashProxy(uid, '/content/js/papersearch/JavaScriptFlashGateway.swf');
	}
	t_SearchString = a_String.toLowerCase();
	t_SearchArray = t_SearchString.split(" ");
	t_NumWords = t_SearchArray.length;
	//////alert("NumWords: "+t_NumWords);
	t_ComboLength = t_NumWords;
	for(var t_Index = t_NumWords-1; t_Index >= 0; t_Index--)
	{
		t_Word = t_SearchArray[t_Index];
		t_NodeName = t_Word.charAt(0);
		//we use the first couple of ascii positions for umlaute:
		switch (t_NodeName)
		{
			case 'ä':
				t_NodeName = 1;
				break;
			case 'ü':
				t_NodeName = 2;
				break;
			case 'ö':
				t_NodeName = 3;
				break;
			case 'ß':
				t_NodeName = 4;
				break;
			default:
				t_NodeName = t_NodeName.charCodeAt(0);
				break;
		}
		includeNode(t_NodeName);
	}
}

function doAndSearch(a_Part)
{	
	t_NumWords--;
	//////alert("doAndSearch called: "+t_NumWords);
	//////alert("WORD: "+t_SearchArray[t_NumWords]);
	//////alert("PART: "+a_Part);
	//////alert("words: "+t_SearchArray);
	var t_Pos = 0;
	var t_PagesFoundArray = new Array();
	if(t_PrefixSearch != 'true')
	{
		t_Delim = '';
	}
	//alert("delim: "+t_Delim);
	do
	{
		t_Pos = a_Part.indexOf(t_Delim+t_SearchArray[t_NumWords], t_Pos);
		//alert("Pos: "+t_Pos);
		//do-while is crap, so:
		if(t_Pos < 0)
		{
			break;
		}
		//////alert(t_SearchArray[t_NumWords]+" "+t_Pos);
		var t_Rest = a_Part.substring(t_Pos);
		var t_Entry = t_Rest.substring(t_Rest.indexOf(':')+1, t_Rest.indexOf(';$$$'));
		//////alert(t_Entry);
		var t_PageEntries = t_Entry.split(";");
		var t_PageOcc;
		var t_Page;
		var t_PageID;
		var t_PageCoords;
		var t_Rest;
		var t_Coords;
		//loop over pages:
		for(var t_Index = 0; t_Index < t_PageEntries.length; t_Index++)
		{
			t_PageOcc = t_PageEntries[t_Index];
			if(!isInArray(t_PagesFoundArray, t_PageOcc))
			{
				t_PagesFoundArray.push(t_PageOcc);
			}
		}
		//move iterator:
		if(t_Pos >= 0)
		{
			t_Pos++;
		}
	}
	while(t_Pos >=0);
	
	t_PageMarkerArray[t_NumWords] = new Array();
	t_PageMarkerArray[t_NumWords] = t_PagesFoundArray;;
	////alert("PagesFoundArray for "+t_SearchArray[t_NumWords]+": "+t_PagesFoundArray);
	//////alert("Marker "+t_NumWords+": "+t_PageMarkerArray);

	if(t_NumWords < 1)
	{
		//all words have been looked up, now match their arrays by AND:
		matchOccurrences();
		t_Return = t_Return+'</resultset>';
		//alert("Return AndSearch: "+t_Return);
		t_Return = Utf8.encode(t_Return);
		flashProxy.call('setReturn', t_Return);
		//reset:
		t_NumWords = 0;
		t_Return = '<'+'?xml version="1.0" encoding="UTF-8"?><resultset>';
	}
}

function isInArray(a_Array, a_Needle)
{
	for(var t_Index = 0; t_Index < a_Array.length; t_Index++)
	{
		if(a_Array[t_Index] == a_Needle)
		{
			return true;
		}
	}
	return false;
}

function matchOccurrences()
{
	//////alert("matchOccurrences");
	var t_FirstWordArray = t_PageMarkerArray[0];
	////alert("firstwordarray: "+t_FirstWordArray);
	//loop over all pages for the first word:
	for(var t_Index = 0; t_Index < t_FirstWordArray.length; t_Index++)
	{
		var t_CurrentPage = t_FirstWordArray[t_Index];
		//one-word-lookup: no AND-search. just output the result:
		if(t_PageMarkerArray.length == 1)
		{
			//////alert("one-word");
			t_Return = t_Return+'<page number="'+t_CurrentPage+'" match="'+t_SearchArray[t_NumWords]+'">';
			t_Return = t_Return+'</page>';
			continue;
		}
		var t_PageFound = true;
		//match this page with the rest of the words:
		for(var t_WIndex = 1; t_WIndex < t_PageMarkerArray.length; t_WIndex++)
		{
			var t_FoundOnce = false;
			var t_CurrentWordArray = t_PageMarkerArray[t_WIndex];
			//////alert("currentwordarray: "+t_CurrentWordArray);
			//look for match in current array:
			for(var t_PIndex = 0; t_PIndex < t_CurrentWordArray.length; t_PIndex++)
			{
				if(t_CurrentPage == t_CurrentWordArray[t_PIndex])
				{
					t_FoundOnce = true;
					break;
				}
			}
			//AND-search: whenever a page is not found in a word-array, AND equals false:
			if(!t_FoundOnce)
			{
				t_PageFound = false;
				break;
			}
		}
		if(t_PageFound)
		{
			////alert("FOUND: "+t_CurrentPage+" match: "+t_SearchArray[t_NumWords]);
			t_Return = t_Return+'<page number="'+t_CurrentPage+'" match="'+t_SearchArray[t_NumWords]+'">';
			t_Return = t_Return+'</page>';
		}
	}
}

function generateAndSend(a_Part)
{
	//////alert('Generate and send: '+a_Part);
	//return;
	if(!t_OrSearch)
	{
		doAndSearch(a_Part);
	}
	else
	{
		t_NumWords--;
		var t_Pos = 0;
		do
		{
			t_Pos = a_Part.indexOf(t_SearchArray[t_NumWords], t_Pos);
			//////alert("POS: "+t_Pos+" Word: "+t_SearchArray[t_NumWords]);
			//do-while is crap, so:
			if(t_Pos < 0)
			{
				break;
			}
			//////alert(t_SearchArray[t_NumWords]+" "+t_Pos);
			var t_Rest = a_Part.substring(t_Pos);
			var t_Entry = t_Rest.substring(t_Rest.indexOf(':')+1, t_Rest.indexOf(',$$$'));
			//////alert(t_Entry);
			var t_PageEntries = t_Entry.split(";");
			var t_PageOcc;
			var t_Page;
			var t_PageID;
			var t_PageCoords;
			var t_Rest;
			var t_Coords;
			//loop over pages:
			for(var t_Index = 0; t_Index < t_PageEntries.length; t_Index++)
			{
				t_PageOcc = t_PageEntries[t_Index];
				t_Page = t_PageOcc.substring(0, t_PageOcc.indexOf("["));
				t_PageID = t_PageOcc.substring(t_PageOcc.indexOf("[")+1, t_PageOcc.indexOf("]"));
				t_Rest = t_PageOcc.substring(t_PageOcc.indexOf("|")+1);
				t_PageCoords = t_Rest.split(",");
				//loop over occurrences on page:
				t_Return = t_Return+'<page page_id="'+t_PageID+'" number="'+t_Page+'" match="'+t_SearchArray[t_NumWords]+'">';
				for(var t_CIndex = 0; t_CIndex < t_PageCoords.length; t_CIndex++)
				{
					t_Coords = t_PageCoords[t_CIndex].split(" ");
					t_Return = t_Return+'<area x1="'+t_Coords[0]+'" y1="'+t_Coords[1]+'" x2="'+t_Coords[2]+'" y2="'+t_Coords[3]+'" />';
				}
				t_Return = t_Return+'</page>';
			}
			//move iterator:
			if(t_Pos >= 0)
			{
				t_Pos++;
			}
		}
		while(t_Pos >=0);
	
		if(t_NumWords < 1)
		{
			t_Return = t_Return+'</resultset>';
			//////alert("Return: "+t_Return);
			t_Return = Utf8.encode(t_Return);
			flashProxy.call('setReturn', t_Return);
			//reset:
			t_NumWords = 0;
			t_Return = '<'+'?xml version="1.0" encoding="UTF-8"?><resultset>';
		}
	}
}

function includePageValues(a_Page)
{
	//////alert("including: "+a_Page+".js");
	var head = document.getElementsByTagName('head').item(0)
	var scriptTag = document.getElementById('loadScript');
	if(scriptTag) 
		head.removeChild(scriptTag);
	script = document.createElement('script');
	script.src = "files\/"+a_Page+'.js';
	script.type = 'text/javascript';
	script.id = 'loadScript';
	head.appendChild(script);
}


function getPageCoords(a_Page, a_SearchString, a_IndexPath)
{
	//alert("getting page coords..."+a_Page);
	var t_Domain = window.location.hostname;
	if(t_Domain.indexOf(".angel") < 0 && t_Domain.indexOf("lpcms.") < 0)
	{
		//////alert("no angel");
		flashProxy = new FlashProxy(uid, 'http://akamai.livepaper.de.edgesuite.net/cache/emv/lp2.3/js/papersearch/JavaScriptFlashGateway.swf');
	}
	else
	{
		//////alert("angel");
		flashProxy = new FlashProxy(uid, '/content/js/papersearch/JavaScriptFlashGateway.swf');
	}
	t_SearchString = a_SearchString.toLowerCase();
	t_SearchArray = new Array();
	t_SearchArray = t_SearchString.split(" ");
	var head = document.getElementsByTagName('head').item(0)
	var scriptTag = document.getElementById('loadScript');
	if(scriptTag) 
	{
		head.removeChild(scriptTag);
	}
	script = document.createElement('script');
	script.src = a_IndexPath+a_Page+'.js';
	script.type = 'text/javascript';
	script.id = 'loadScript';
	head.appendChild(script);
}


function generateCoordsAndSend(a_Part)
{
	//////alert("generateCoordsAndSend");
	var t_Return = "";
	//loop over words:
	if(t_PrefixSearch != 'true')
	{
		t_Delim = '';
	}
	//alert("delim coords: "+t_Delim);
	for(var t_Index = 0; t_Index < t_SearchArray.length; t_Index++)
	{
		var t_CurrentWord = t_SearchArray[t_Index];
		//////alert("currentWord: "+t_CurrentWord);
		var t_Pos = 0;
		do
		{
			t_Pos = a_Part.indexOf(t_Delim+t_CurrentWord, t_Pos);
			//////alert("t_Pos: "+t_Pos);
			if(t_Pos < 0)
			{
				break;
			}
			var t_Rest = a_Part.substring(t_Pos);
			//////alert("Rest: "+t_Rest);
			var t_Entry = t_Rest.substring(t_Rest.indexOf(':')+1, t_Rest.indexOf(',$$$'));
			var t_PageCoords = t_Entry.split(",");
			//////alert("Coords: "+t_PageCoords);
			for(var t_CIndex = 0; t_CIndex < t_PageCoords.length; t_CIndex++)
			{
				t_Coords = t_PageCoords[t_CIndex].split(" ");
				t_Return = t_Return+'<area x1="'+t_Coords[0]+'" y1="'+t_Coords[1]+'" x2="'+t_Coords[2]+'" y2="'+t_Coords[3]+'" />';
			}
			t_Pos++;
		}
		while(t_Pos >= 0);
	}
	
	//return result to flash:
	t_Return = '<'+'?xml version="1.0" encoding="UTF-8"?><resultset>'+t_Return+'</resultset>';
	t_Return = Utf8.encode(t_Return);
	//////alert("RETURN: "+t_Return);
	flashProxy.call('setCoordsReturn', t_Return);
	//reset:
	t_NumWords = 0;
	t_Return = '<'+'?xml version="1.0" encoding="UTF-8"?><resultset>';
}