/**
 * @vesrion 1.0
 * menu is based on the te genereared menu lists
 * and the menu css frame 
 * 
 											button and bottom onder de button 				(default "bottom") 
 * @option[ajax] 			(Object)		de ajax jquery object integrateed in the menu	
 											set false to turn of
 * @option[ajax][type] 		(String)		type of "method" 								default "POST"
 * @option[ajax][dataType]	(String) 		type data 										default "html"
 * @option[ajax][text]		(String) 		text message loader 							default "Bezig met zoeken"
 * @option[ajax][url] 		(String)		the content request handler						default "plugins/websearch/request/search.php"
 * @option[ajax][target] 	(String)		the target 	of the content 						default "#content"
 * @option[ajax][imgLoader] (String)		the image to view by the loading prosses		default "images/ajax-loader.gif"
 * @option[ajax][success] 	(Function)		method callback method execute when 
 											finished request

 */


NS.Package('NS.Site.Search');

(function($){
	NS.Site.Search = function(options){
		
			var _option = {};
			var _method = {			
				// ---
				init : function(opt){
					opt = opt || {};
					return {
						query : opt.query || false,
						ajax : (function(ajax){
							ajax = ajax || {};
							return {
								type 		: ajax.type 		|| 'POST',
								dataType 	: ajax.dataType 	|| 'html',
								data 	    : ajax.data 		|| {},
								url  		: ajax.url  		|| 'plugins/websearch/request/search.php',
								text  		: ajax.text  		|| 'Bezig met zoeken',
								target	 	: ajax.target       || '#content',
								imgLoader   : ajax.imgLoader    || 'images/loader.gif',
								success 	: ajax.success      || false
							}
						})(opt.ajax)		
					}
				},
				loader : function (option){
					  	NS.UT.Tools.loader({
				  			target   : option.ajax.target,
							cssClass : 'pageLoader',
							text	 : option.ajax.text,
							src      : option.ajax.imgLoader,
							appendLoader: Site.global.loader.appendLoader || false,
							center	 	: Site.global.loader.appendLoader || false,
							overlay	 	: Site.global.loader.appendLoader || false,
							modal	 	: Site.global.loader.appendLoader || false,
							top			: Site.global.loader.positionTop  || false						
					  	});
					  	var _textLoader = $('.pageLoader').find('div');
					  	var _c=0;
						_timer = NS.UT.Tools.timer(function (){
							_c++;
							var _point = '.';
							if(_c == 4){
								_c=0;
							}
							for(var i=0; i< _c; i++){
								_point +='.';
							}
							_textLoader.html(option.ajax.text+_point+'');
						},800);
						return _timer;						
				},
				// --- request handler --- 
				request : function() {
					
					var _timer = function(){};
					var _data  = $.extend({'query' : _option.query}, _option.ajax.data );
					$.ajax({
					  type			: _option.ajax.type,
					  url			: _option.ajax.url,
					  data			: _data,
					  dataType		: _option.ajax.dataType,
					  beforeSend 	: function(){
					  	if(!Site.global.loader.appendLoader){
					  		$(_option.ajax.target).html('');
					  	}
					  	// set loader
					  	_timer = _method.loader(_option);
				  	
					  },
					  success : function(respons){
					  		// set content
					  		_timer.stop();
					   		$(_option.ajax.target).html( respons );
					   		// collback
					    	if( _option.ajax.success){
					    	 	_option.ajax.success(respons);
					    	}
							var _fnClick = function(){
								// set click event.. op results...
							    $('.s-result a').click(function(){						     	
							     	if($(this).attr('href') !== ''){
							     		// request handler...
							     		var _handler = new Site.Menu({
								     			ajax : {
								     				target  : _option.ajax.target,
													appendLoader: Site.global.loader.appendLoader || false,
													center	 	: Site.global.loader.appendLoader || false,
													overlay	 	: Site.global.loader.appendLoader || false,
													modal	 	: Site.global.loader.appendLoader || false,
													top			: Site.global.loader.positionTop,									     				
													success : function(data, url){
														if(url.search){										
								     						$(_option.ajax.target).highlight(url.search);
														}
								     				}							     					     				
								     			},
								     			breadcrumb : true						     			
							     			});
							     			_handler.request( $(this) );  
							     	}
							     	return false;
							     });								
							};
					    	// set pagination...
							var _pagination = Site.Pagination({
								ajax : {
									data 	 : _data,
									url 	 : _option.ajax.url,
									dataType : 'html',
									beforeSend : function(){
										if(!Site.global.loader.appendLoader){
											$(_option.ajax.target).html('');
										}
										_timer = _method.loader(_option);
									},
									success : function(data){
										$(_option.ajax.target).html( data );
										_pagination.setEvents();
										_fnClick();	
										_timer.stop();
																				
									}
								}
							});									    	
							_fnClick();						    	
					  }
					});			
				}
		};	
		_option = _method.init(options);
		// execute search...
		_method.request();
	};
})(jQuery);



jQuery.fn.highlight = function(pat) {
	 function innerHighlight(node, pat) {
	  var skip = 0;
	  if (node.nodeType == 3) {
	   var pos = node.data.toUpperCase().indexOf(pat);
	   if (pos >= 0) {
	    var spannode = document.createElement('span');
	    spannode.className = 'highlight';
	    var middlebit = node.splitText(pos);
	    var endbit = middlebit.splitText(pat.length);
	    var middleclone = middlebit.cloneNode(true);
	    spannode.appendChild(middleclone);
	    middlebit.parentNode.replaceChild(spannode, middlebit);
	    skip = 1;
	   }
	  }
	  else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
	   for (var i = 0; i < node.childNodes.length; ++i) {
	    i += innerHighlight(node.childNodes[i], pat);
	   }
	  }
	  return skip;
	 }
	 return this.each(function() {
	  innerHighlight(this, pat.toUpperCase());
	 });
	};
	
	jQuery.fn.removeHighlight = function() {
	 return this.find("span.highlight").each(function() {
	  this.parentNode.firstChild.nodeName;
	  with (this.parentNode) {
	   replaceChild(this.firstChild, this);
	   normalize();
	  }
	 }).end();
};
