/***  made with love by smarter-ecommerce.com ***/
jQuery.fn.extend({
	smecsearch: function(url, options) {
		options = jQuery.extend({
			url: url,
			delay: 500,
			fields: 'name',
			type: 'overview',
			dataType: 'jsonp',
			groupImageUrl: options.imageUrl,
			groupUrl: options.itemUrl,
			cssClass: 'smec-search-ajax',
			clusterlink: function(clusterId, query, simGroup) {
				return String.format(options.detailsUrl, encodeURIComponent(query), encodeURIComponent(clusterId), encodeURIComponent(simGroup) );
			},
			highlight: function(value, terms) {
				var splitted = terms.split(/\s+/)
				var pattern = ''
				for (var i=0; i< splitted.length; i++) {
					if (i > 0) pattern += '|';
					pattern += splitted[i].replace(/[^-a-zA-Z0-9öäüÖÄÜß:]+/gi, '')
					
				}
				return value.replace(new RegExp('(' + pattern + ')', 'gi'), "<strong>$1</strong>");
			},
			applyAfterEffects: function(){} 
		}, options);

	    return this.each(function() {
			new $.SmecSearch(this, options);
		});
	}
});


$.SmecSearch = function(input, options) {
	var $input = $(input);
	var needsInit = true;
	var searchContainer;
	var lastKeyPressCode;
	var timeout;
	var previousValue = "";
	var messages = options.messages;
	var header = $('<div/>').attr('class', 'header').append($('<h2/>').text(messages.heading));
	var closeDiv = $('<div/>');
	var KEY = {
			UP: 38,
			DOWN: 40,
			DEL: 46,
			TAB: 9,
			RETURN: 13,
			ESC: 27,
			COMMA: 188,
			PAGEUP: 33,
			PAGEDOWN: 34,
			BACKSPACE: 8
	};	
	
	$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
		if(needsInit) {
			searchContainer= $('<div/>');
			if (! $.browser.opera) searchContainer.hide();
			needsInit = false;
			var offset = $(input).offset();

			closeDiv.text('x');
			header.append(closeDiv)
				.append($('<br/>').attr('class', 'clear'));
				
			searchContainer.appendTo(document.body).attr('class',options.cssClass);
						searchContainer.css({
				width: searchContainer.css('width') ? searchContainer.css('width') : $(input).width(),
				top: offset.top + input.offsetHeight,
				left: offset.left,
				position: 'absolute'
			});
		}
		switch(event.keyCode) {
			case KEY.ESC:
				hideContainer();
				break;
			case KEY.RETURN:
				break;
			case  KEY.DEL, KEY.BACKSPACE :
				if($input.val() == '') {
					hideContainer(); break;
				}
				if ($input.val().length >= 5) {
					clearTimeout(timeout);
					timeout = setTimeout(onChange, options.delay);
				}
				break;
			case KEY.TAB:
				break;
			default:
				clearTimeout(timeout);
				timeout = setTimeout(onChange, options.delay);
				break;
		}
		
		function onChange() {
			if($input.val() != '' && previousValue != $input.val() && $input.val().length>=3) {
				previousValue = $input.val();
				smeccookie.setCookie(smeccookie.COOKIE_NAME, $input.val());
				request(buildUrl(), {query:$input.val(),type:options.type, lang:options.locale, shopSessionId:options.shopSessionId});
			}
		}
		
		function request(url, params) {
			$.getJSON(url, params, formatResult);
		}
		
		function buildUrl() {
			var callback ='';
			if(options.dataType == 'jsonp') {
				callback = '&callback=?';
			}
			return options.url + '?fields=' + options.fields + callback;
		}
		
		String.format = function(text) {
		    if ( arguments.length <= 1 ) {
		        return text;
		    }
		    var tokenCount = arguments.length - 2;
		    for( var token = 0; token <= tokenCount; token++ ) {
		        text = text.replace( new RegExp("\\{" + token + "\\}", "gi" ),arguments[ token + 1 ] );
		    }
		    return text;
		};
		
		function formatResult(data){
			var totalHits = data.result.totalHits;
			
			searchContainer.html('').append(header);
			closeDiv.click(hideContainer);
			var isFirst=true;
			if(data.result.totalHits > 0) {
				searchContainer.show();
				var clusters = data.result.clusters;
				for(var i = 0; i < clusters.length; i++) {
					var clusterResults = clusters[i].results;
					
					if(clusterResults.length > 0) {
						var clusterName = clusters[i].name;
						var moreHitsText = 'Treffer';
						if (options.locale=='de' && clusters[i].id != 'de-categories' && clusters[i].id != 'de-global') clusterName = 'Produktkategorie ' + clusterName;
						if (options.locale=='de' && clusters[i].id == 'de-categories') moreHitsText = 'Produktkategorien';

						var clusterNameDiv = $('<div/>').attr('class', 'cluster').append($('<span/>').text(clusterName));
						var clusterHits= clusters[i].id == 'de-categories' ? messages.hitsCategory : messages.hits;
						
						var href=options.clusterlink(clusters[i].name, $input.val(), '');
						searchContainer.append(clusterNameDiv);
						clusterNameDiv.append($('<br/>'));
						clusterNameDiv.append($('<a/>').attr('href', href).text(clusters[i].totalHits + " " +  clusterHits));
						
						var clusterResultsDiv = $('<div/>').attr('class', 'result');
						var list = $('<ol/>'); 
						if (isFirst) {
							list.attr('class', 'first');
							isFirst = false;
						}
						clusterResultsDiv.append(list);
						
						for(var j = 0; j < clusterResults.length; j++) {
							var clientId = clusterResults[j].clientId;
							var name = clusterResults[j].name;
							var imgUrl = options.imageUrl;
							var link = options.itemUrl;
							var info = clusterResults[j].details;
							var simGroup =  clusterResults[j].similarityGroup;
							var articleId =  clusterResults[j].artikelNummer;
							var herstellerId =  clusterResults[j].herstellerNummer;
							
							if(clusterResults[j].isCategory) {
								imgUrl = options.groupImageUrl;
								link = options.groupUrl;
								info = clusterResults[j].details;
							}
							link += "?query=" + encodeURIComponent($input.val());
							
							var entryMarkupBuilder = function(clientId, name, imgUrl, link, info, simGroup) {
								var imgLink = $('<a/>')
									.attr('class','image')
									.attr('href', String.format(link, clientId));
								var img = $('<img/>').attr("src", String.format(imgUrl, clientId)).attr('alt','');
								imgLink.append(img);
								
								var a = $('<a/>')
									.attr('class', 'text')
									.attr('href', String.format(link, clientId))					
									.text(name);		
								a.html(options.highlight(a.html(),$input.val()));
								
								a.append('<br />');
								if (articleId) a.append($('<span/>').attr('class', 'articleId').text(messages.articleid + ' ' + articleId ));
								if (herstellerId) a.append($('<span/>').attr('class', 'herstellerId').text(messages.manu + ' ' + herstellerId));
								
								var s;
								if (simGroup) {
									s = $('<div/>').attr('class', 'related');
									s.append($('<a/>').attr('href',  options.clusterlink(clusters[i].name, $input.val(), simGroup)).html(messages.similar));									
								} else {
									s = $('<div/>').attr('class', 'related').html('&nbsp;');
								}
														
								var detailInfo = $('<span/>').attr('class', 'details').text(info);
								var li = $('<li/>').append(imgLink).append(a).append(s).append(detailInfo);
						
				
								
								li.append($('<br/>').attr('class', 'clear'));
								return li;
							};
							
							list.append(entryMarkupBuilder(clientId, name, imgUrl, link, info, simGroup, articleId, herstellerId));
						
							if (j == (clusterResults.length - 1) && clusterResults.length > 1) {
								list.append($('<li />').attr('class', 'more-details').append($('<a/>').attr('href', href).text(String.format(messages.showhits, clusters[i].totalHits, moreHitsText))));
							}
						
						}
						searchContainer.append(clusterResultsDiv);
						searchContainer.append($('<br/>').attr('class', 'clear'));
					}					
				}
				searchContainer.append($('<div/>').attr('class', 'footer').html('<a class="smecsearch" href="javascript:;" onclick="javascript:window.open(\'http://smecsearch.com\', \'smecsearch\'); return false;" target="_smec" title=""></a>'));
				searchContainer.show();
				options.applyAfterEffects.call(this);
			} else {
				hideContainer();
			}
		}
		
		function hideContainer() {
			searchContainer.html('').hide();
			options.applyAfterEffects.call(this);
		}
		
	});
};

var smeccookie = {
	
	COOKIE_NAME : '__smecsearchquery',
	
	getCookie: function(name) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) {return null;}
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) {end = document.cookie.length;}
	return unescape( document.cookie.substring( len, end ) );
	},
	
 	setCookie: function ( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
	}

}
