
	var searchClient = Class.create({
		initialize: function(container){
			this.instID = 'search.' + parseInt(Math.random()*1000000);
			this.container = container;
			this.itemsPerPage = 10;
			this.currPage = 0;
		},
	
		doSearch : function(searchStr){
			var callAtServer = true;
			if (!searchStr){
				searchStr = this.lastSeachStr;
				this.buildResults();
				return;
			}
			if ((!searchStr) || (searchStr.length < 3) ){
				alert('Helaas, dat is geen geldig zoekwoord, of een te kort zoekwoord...');
				return;
			}
			$j("#containerPlus_search").mb_close();
			new Effect.BlindDown($('searchOverlay'), {duration:'0.3'});
			this.lastSeachStr =	searchStr;
//			new Effect.BlindDown(this.container);
			var wpsRPC = new wps.rpc;
			wpsRPC.debug = true;
			wpsRPC.attachWaiter(this.waiter, this);
			wpsRPC.attachUnWaiter(this.unWaiter, this);
			wpsRPC.createCall('leesmijSearch', this.buildResults.bind(this), this);
			wpsRPC.call('search', "searchStr=" + searchStr);		
		},
		
		throwError : function(msg){
			
		},
		
		buildResults : function(req){
			if (req){
				this.searchResultsDOM = req.responseXML;
				var dom = req.responseXML;
			}else{
				var dom = this.searchResultsDOM;
			}
			//this.container.innerHTML = '';
			var results = dom.getElementsByTagName('results').item(0);
			var rows = results.childNodes;
			this.rowCount = rows.length;

			var endRow = (this.itemsPerPage * (this.currPage+1));
			if ( endRow > this.rowCount ) endRow = this.rowCount;
			var startRow = (this.currPage * this.itemsPerPage);
			if (this.resultsContainer){
				this.resultsContainer.remove();
			}
			this.resultsContainer = new Element('div');
			$('searchResults').update(this.resultsContainer);
			
			for (var i = startRow;i<endRow;i++){
				var node = rows.item(i); 
				this.resultsContainer.insert(this.writeRow(node, i));
			}

			if (this.currPage > 0) {
				this.multiElemEffect('.navigatorPrevious', 'Appear');
			}else{
				this.multiElemEffect('.navigatorPrevious', 'Fade');
			}
			if (endRow < this.rowCount) {
				this.multiElemEffect('.navigatorNext', 'Appear');
			}else{
				this.multiElemEffect('.navigatorNext', 'Fade');
			}
			$('rowCount').innerHTML = '';
			$('rowCount').appendChild(document.createTextNode(this.rowCount+ ' resultaten. Pagina '+ (this.currPage +1) + ' v/d ' + parseInt((this.rowCount/this.itemsPerPage)+ 1) ));
			new Effect.Appear($('rowCount'), {duration : 0.5});
			new Effect.Appear($('closeMe'), {duration : 0.5});
		},
		
		writeRow : function(row, rowNum){
			var pageName = row.getAttribute("pageName");
			var foundAt = row.getAttribute('foundAt');
			var lmClientID = row.getAttribute('clientID');
			var navID = row.getAttribute('navID');
			var book = row.getAttribute('boek');
			// look for property:
			var props = row.getElementsByTagName('property');
			var propCount = props.length;
			var propNode = '';
			for (var i=0;i<propCount;i++){
				var node = props.item(i);
				//get property ID : 
				var propID = node.getElementsByTagName('property_id').item(0).childNodes.item(0).nodeValue;
				if (propID == foundAt){
					break;
				}
			}
			
			var propName = node.getElementsByTagName('key').item(0).childNodes.item(0).nodeValue; 
			var container = new Element('div', {className:'searchResultRow'});
	 		var rowTitle = new Element('div', {className:'rowTitle'});
	 		var link = new Element('a', {href:'/' + pageName + '/#'+lmClientID}).update(book);
	 		rowTitle.insert(link);
	 		container.insert(rowTitle);
	 		
	 		var desc = new Element('div', {className:'description'}).update(propName + ":" + this.getDescription(node));
	 		container.insert(desc);
	 		return container;
		},
		
		getDescription : function(node){
			// determine metaType;
			var metaType = node.getElementsByTagName('metaType').item(0).childNodes.item(0).nodeValue;
			
			switch (metaType) {
				case 'short_text':
					if (node.getElementsByTagName('value').item(0).childNodes.length > 0){
						return node.getElementsByTagName('value').item(0).childNodes.item(0).nodeValue;
					}else{
						return '';
					}
					break;
				case 'date_time':
					if (node.getElementsByTagName('value').item(0).childNodes.length > 0){
						return "Datum : " + node.getElementsByTagName('value').item(0).childNodes.item(0).nodeValue;
					}else{
						return '';
					}
					break;
				case 'html':
					if (node.getElementsByTagName('value').item(0).childNodes.length > 0){
						return node.getElementsByTagName('value').item(0).childNodes.item(0).nodeValue.toString().stripTags().substring(0, 150) + '...';
					}else{
						return '';
					}
					break;
				case 'blob':
					if (node.getElementsByTagName('fileName').item(0).childNodes.length > 0){
						return node.getElementsByTagName('fileName').item(0).childNodes.item(0).nodeValue;
					}else{
						return;
					}
					break;
				default:
					return '';
					break;
			}
		},
		
		setPulsateSearchStr : function(sourceNode){
			if (!this.lastSeachStr) return sourceNode;
			var i = 0;
			var newText= '';
			var searchString = new String(this.lastSeachStr);
			searchString = searchString.toLowerCase();
			var abb = new String(sourceNode.nodeValue);
		 	var lcAbb = abb.toLowerCase();
			var indexOf = lcAbb.indexOf(searchString);
			while (abb.length > 0) {
			    i = lcAbb.indexOf(searchString, i);
			    if (i < 0) {
			      newText += abb;
			      abb = "";
			    } else {
		    		  this.pulsators.push('repl_' + this.pulsators.length);
		    		  highlightStartTag =  '<span style="float:none;background:#adcbef;" id="repl_' + this.pulsators.length + '"  >';
		    		  var highlightEndTag = '</span>';
					  if (abb.lastIndexOf(">", i) >= abb.lastIndexOf("<", i)) {
							if (lcAbb.lastIndexOf("/script>", i) >= lcAbb.lastIndexOf("<script", i)) {
								newText += abb.substring(0, i) + highlightStartTag + abb.substr(i, searchString.length) + highlightEndTag;
			          			abb = abb.substr(i + searchString.length);
			          			lcAbb = abb.toLowerCase();
			          			i = -1;
			          		}
			          }
			     }
			}
			var retNode = document.createElement('span');
			retNode.innerHTML = newText;
			return retNode;
		},	
		
		multiElemEffect : function(className, effect, options){
			$$(className).each(
				function(elem){
					new Effect[effect](elem, options);
				}
			)
		},
		
		waiter : function(){
			$('searchWaiter').style.display = 'block';
		},
		
		unWaiter : function(){
			$('searchWaiter').style.display = 'none';
		}
		
	});