searchParameter = '';
fdmg = {};

fdmg.fd = {};

/*-------------------------------------
 *- Generic search criteria functions -
 *-------------------------------------
 */

jstringify = function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    }
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = jstringify(v);
            json.push((arr ? "" : '"' + n + '":') + String(v));
        }
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    }
};

fdmg.fd.search = {
	startTime:0,
	classNameHidden : 'jqHide',
	classNameSelected : 'jqSelected',
	classNameBtnMore : 'jqBtnMore',
	classNameBtnLess : 'jqBtnLess',
	current_search : {
		searchTerm : '',
		page : 1,
		sortOrder : 'publishdate desc',
		registered_facets : [],
		facets : {},
		advQuery: '',
		source : '',
		company: '',
		section: '',
		sector: '',
		tags: '',
		fromDate: '',
		toDate: '',
		store: {},
		alertId: null,
		author: ''
	},
	printArray : {},
	search_config : {
	processedUriFacets: false,
		baseUrl : 'http://85.112.25.67:8080/solr/select/',
//		baseUrl : 'http://test.fdmg.nl:8080/solr/select/',
		pageSize : 10,
		paginationDiff : 5,
		defaultParams : '?wt=json&indent=on&hl=on&hl.fl=title_fd,intro_fd&hl.simple.pre=<span class=\'cbBe2 fBold\'>&hl.simple.post=</span>&facet=true&fq=state:published',
		facets : {
			source : {
				name : 'source',
				type : 'field',
				field : 'bron_fd',
				translate_prefix : ''
			},
			sector : {
				name : 'sector',
				type : 'field',
				field : 'icb_fd',
				translate_prefix : 'Sector_'
			},
			section : {
				name : 'section',
				type : 'field',
				field : 'section_fd',
				translate_prefix : 'section_'
			},
			company : {
				name : 'company',
				type : 'field',
				field : 'company_fd',
				translate_prefix : ''
			},
			person : {
				name : 'person',
				type : 'field',
				field : 'person_fd',
				translate_prefix : ''
			},
			author : {
				name : 'author',
				type : 'field',
				field : 'author_fd',
				translate_prefix : ''
			},
			tags : {
				name : 'tags',
				type : 'field',
				field : 'tag_fd',
				translate_prefix : ''
			}
		}

	},
	getFacetByField : function(field) {
		sc = fdmg.fd.search.search_config;
		for (facet in sc.facets) {
			if (sc.facets[facet].field==field) {
			 return sc.facets[facet];
			}
		}		
	},
  getUrlVarsArray : function(url){
    var vars = {}, hash;
    var hashes = url.slice(url.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
      hash = hashes[i].split('=');
      if (!vars[hash[0]]) {
      	vars[hash[0]] = [];
      }
      vars[hash[0]].push(hash[1]);
    }
    return vars;
  },
	parseQueryUrl : function(queryUrl) {
		cs = fdmg.fd.search.current_search;
		var urlVars=fdmg.fd.search.getUrlVarsArray(queryUrl);
		if (urlVars['q']) {
			var solrTerm = unescape(urlVars['q'][0]).replace('{!df=text_fd}', '');
			if ((typeof(solrTerm)!='undefined') && (solrTerm!='')){
				cs.searchTerm = solrTerm;
			}
			var fq = urlVars['fq'];
			if (fq) {
				cs.facets = {};
				for (var index=0; index<fq.length; index++) { 
					var term = unescape(fq[index]);
					var re = /(?:\{!tag=.*?\})?(.*?):"(.*?)"(?:$|(?:\+or\+))/gi;
					var match;
					while (match = re.exec(term)) {
						facet = fdmg.fd.search.getFacetByField(match[1]);
						
						cs.facets[facet.name];
						
						fct = cs.facets[facet.name];
						if (!fct) {	
							fct = {};
							cs.facets[facet.name] = fct;
						}

						facetItem = fct[match[2]];
						if (!facetItem) {
							facetItem = {
								name : match[2],
								count : 0,
								selected : true 
							};
							fct[match[2]] = facetItem;
						}
						facetItem.selected = true;
					}
				}
			}	
			var sort = urlVars['sort'];
			cs.sortOrder = sort ? unescape(sort[0]) : 'publishdate desc';

			var start = urlVars['start'];
			var rows  = urlVars['rows'];
			var id    = urlVars['alertid'];


			if (start) {
					cs.start = unescape(start[0]);
			}
			if (rows) {
					cs.page = (parseInt(unescape(rows[0]))/sc.pageSize)+1;
			}
			if (id) {
			                cs.alertId = id;
			}
		}
	},
	readStore : function(store) {
		cs.page = 1;
		cs.facets = {};

		cs.searchTerm = store.options['search'];
		cs.toDate     = store.options['to'];
		cs.fromDate   = store.options['from'];
		cs.sortOrder  = store.options['sort'];
 		$('#searchBox .srcSearchField').val(cs.searchTerm);

		for(var name in store.facets) {
			fct = {};
			cs.facets[name] = fct;

			for(var i = 0; i < store.facets[name].length; i++) {
				var item = store.facets[name][i];

				var facetItem = {
					name : item[0],
					count : item[1],
					selected : true 
				};
				fct[item[0]] = facetItem;
			}
		}
		fdmg.fd.search._searchList();
		fdmg.fd.search._searchTop();
	},
	
	search : function(options, first) {
		sc = fdmg.fd.search.search_config;
		cs = fdmg.fd.search.current_search;
		$.extend(sc, options);
		cs.tagSearch = false;
		if (first) {
			if (cs.searchTerm=='') {
				fdmg.fd.search.parseQueryUrl(window.location.href);
			}
			if (cs.searchTerm=='') {
				var searchTermUrl = decodeURI(searchParameter);
				
				if ((typeof(searchTermUrl)!='undefined')){
					searchTermUrl = searchTermUrl.replace(/\+/g," ");
				}
				if ((typeof(searchTermUrl)!='undefined') && (searchTermUrl!='')){
					cs.searchTerm = decodeURIComponent(searchTermUrl);
				}
			}
			if (cs.searchTerm=='') {
				var searchTermUrl = decodeURI($.getUrlVar('tag'));
				
				if ((typeof(searchTermUrl)!='undefined') && (searchTermUrl!='')){
					searchTermUrl = searchTermUrl.replace(/\+/g," ");
					searchTermUrl = decodeURIComponent(searchTermUrl);
					searchTermUrl = '\"' + searchTermUrl + '\"';
					cs.tags = decodeURI(searchTermUrl);
					if($('#advancedSearch').hasClass('jqHide')){
						$('#advancedSearch').removeClass('jqHide');
					}
					$('#advanced_tag').val(searchTermUrl);
					//cs.tagSearch = true;
				}
				else {
					return;
				}
			}		
		}
		
		// remove white space
		cs.searchTerm = cs.searchTerm.replace(/^\s*/, "").replace(/\s*$/, "").replace(/\s+/, " ");
		cs.searchTerm = cs.searchTerm;

		fdmg.fd.search._searchList();
		fdmg.fd.search._searchTop();
	},
	_searchList : function() {
		$('.jqhover').css('cursor','wait');
		$('#page').css('cursor','wait');
		fdmg.fd.search.startTime=new Date().getTime();
		
		
		fdmg.fd.search._search("list");
		//console.log('after _search("list")'+(new Date().getTime()-fdmg.fd.search.startTime))
		fdmg.fd.search.drawSearchBox();
		//console.log('after drawSearchBox()'+(new Date().getTime()-fdmg.fd.search.startTime))
		fdmg.fd.search.drawFacetsLine();
		//console.log('after drawFacetLine()'+(new Date().getTime()-fdmg.fd.search.startTime))
		
	},
       assembleFacets : function() {
		var query = sc.baseUrl + '?wt=json&indent=on&facet=true&fq=state:published&fq=contenttype:article&q=text_fd:A&start=0&rows=0&facet.field=bron_fd&facet.field=author_fd&facet.field=tag_fd&facet.field=company_fd';
		var callBackFunction = 'fdmg.fd.search.callback.facetResults';
		$.ajax({
			url : query,
			dataType : 'jsonp',
			jsonpCallback : callBackFunction,
			jsonp : 'json.wrf'
		});
	},
	_searchTop : function() {
		fdmg.fd.search._search("top");
	},
	_search : function(type) {
		var sc = fdmg.fd.search.search_config;
		var cs = fdmg.fd.search.current_search;
		
		var query = sc.baseUrl + sc.defaultParams;
		
		var searchTermField = 'text_fd';
		if (type=='top') {
			query += '&fq=(contenttype:company+AND+isin_fd:[""%20TO%20*])+OR+(contenttype:topic)';
			//query += '&fq=contenttype:company+OR+contenttype:topic';
			//query += '&fq=isin_fd:[""%20TO%20*]'; // Company has to have a isin code. Can't link to companyinfo
			searchTermField = 'title_fd';
		} else {
			query += '&fq=contenttype:article';

			//if(cs.tagSearch == true){
				//searchTermField = 'tag_fd';
			//} else {
				if(cs.advQuery != '' && cs.advQuery != null) {
					searchTermField = cs.advQuery;
				}
			//}
		}
		var terms = [];
		if(cs.searchTerm != '' && cs.searchTerm != null)
			terms.push(searchTermField+":"+cs.searchTerm);
		
		if(cs.source != '' && cs.source != null){
			terms.push('bron_fd:(' + cs.source.join('+OR+') + ')');
		}
		
		if(cs.company != ''){
			terms.push('company_fd:' + cs.company);
		}
		
		if(cs.section != ''){
			terms.push('section_fd:' + cs.section);
		}
		
		if(cs.sector != ''){
			terms.push('icb_fd:' + cs.sector);
		}
		
		if(cs.tags != ''){
			terms.push('tag_fd:(' + cs.tags.split(/[,;\s]+/).join('+') + ')');
		}
		
		if(cs.fromDate != '' && cs.toDate != '') {
			
			var newFromDate = new Date($.datepicker.parseDate('dd-mm-yy', cs.fromDate));
			var fromDateOffset = newFromDate.getTimezoneOffset()/60;
			newFromDate.setHours(fromDateOffset , 0, 0, 0);
			
			var newFromDateString = $.format.date(newFromDate, 'yyyy-MM-ddTHH:mm:ss');
			
			var newToDate = new Date($.datepicker.parseDate('dd-mm-yy', cs.toDate));
			var toDateOffset = newToDate.getTimezoneOffset()/60;
			newToDate.setHours(23 + toDateOffset, 59, 59, 999);
			
			var newToDateString = $.format.date(newToDate, 'yyyy-MM-ddTHH:mm:ss');
			
			terms.push('publishdate:[' + newFromDateString + '.000Z TO ' + newToDateString + '.999Z]');
		}
		
		if(cs.author != ''){
			if(cs.author.indexOf(" ") >= 0){
				terms.push('author_fd:\"' + cs.author + '\"');
			} else{
				terms.push('author_fd:' + cs.author + '*');	
			}
		}
		
		query += '&q='+terms.join('+');
		
		query += '&start='+(cs.page-1)*sc.pageSize;
		query += '&rows='+sc.pageSize;
		query += '&sort='+cs.sortOrder;

		cs.shortQuery = '';
		cs.shortQuery += escape('{!df=text_fd}' + cs.searchTerm) ;
		cs.shortQuery += '&sort='+cs.sortOrder;
		
		
		$.each(cs.registered_facets, function(index, facet) {
			var field = facet.field;
			var facetName = facet.name;
			var exclude=false;
			if (field!='') {
				var first = true;
				if (cs.facets[facetName]) {
					$.each(cs.facets[facetName], function(key, facetItem) {
						if (facetItem.selected) {
							if (first) {
								first = false;
								exclude = true;
								query += '&fq=' + escape('{!tag=' + field + '}' + field+':"' + facetItem.name + '"');
								cs.shortQuery += '&fq=' + escape('{!tag=' + field + '}' + field+':"' + facetItem.name + '"');
								//cs.shortQuery += '&fq='+escape(field+':"' + facetItem.name + '"');
							} else { 
								query += escape('+OR+' + field + ':"' + facetItem.name + '"');
								cs.shortQuery += escape('+OR+' + field + ':"' + facetItem.name + '"');
							}
						}
					});
				}
				excludeQuery = "";
				if (exclude) excludeQuery = '{!ex=' + field + '}';
				query += '&facet.field='+escape(excludeQuery + field);
				cs.shortQuery += '&facet.field='+escape(excludeQuery + field);
			}
		});

		cs.shortQuery += "&alertid=" + (cs.alertId ? cs.alertId : -1);
		
		var callBackFunction = 'fdmg.fd.search.callback.searchResults';
		if (type=='top') {
			callBackFunction = 'fdmg.fd.search.callback.searchTopResults';
		}
		
		//console.log('query = ' + query);
		
		$.ajax({
			url : query,
			context : $('#resultList'),
			dataType : 'jsonp',
			jsonpCallback : callBackFunction,
			jsonp : 'json.wrf'
		});
	},
	callback : {
		searchResults : function(data) {
			//console.log('start callback'+(new Date().getTime()-fdmg.fd.search.startTime))
			
			cs = fdmg.fd.search.current_search;

			fdmg.fd.search.processFacets(data);
			//console.log('after processFacets'+(new Date().getTime()-fdmg.fd.search.startTime))

			fdmg.fd.search.drawResultList(data);
			//console.log('after drawResultList'+(new Date().getTime()-fdmg.fd.search.startTime))
			fdmg.fd.search.drawFacets();
			//console.log('after drawFacets'+(new Date().getTime()-fdmg.fd.search.startTime))
			fdmg.fd.search.drawCountsLine(data);
			//console.log('after drawCountsLine'+(new Date().getTime()-fdmg.fd.search.startTime))
			fdmg.fd.search.drawPagination(data);
			//console.log('after drawPagination'+(new Date().getTime()-fdmg.fd.search.startTime))

			$('.jqhover').css('cursor','hand');
			$('#page').css('cursor','default');
		},
              facetResults : function(data) {
			fdmg.fd.search.retrieveFacets(data);
		},
		searchTopResults : function(data) {
			cs = fdmg.fd.search.current_search;

			fdmg.fd.search.drawTopResults(data);
		},
		searchImage : function(data) {
      // Show the jqSearchImage.
      $('#jqSearchImage_'+data.id).removeClass("jqHide");
      // We hide the jqSearchArticle because we're going to copy its HTML content to the jqSearchImage to
      // make the text wrap nicely arround the image.
      $('#jqSearchImage_'+data.id).parent().find(".jqSearchArticle").addClass('jqHide');
			$('#jqSearchImage_'+data.id).html('<img class="left pr10" src="'+data.url+'"/>' + 
                                        $('#jqSearchImage_'+data.id).parent().find(".jqSearchArticle").html());
		}

	},
	onClickLess : function(id) {
		sc = fdmg.fd.search.search_config;
		var displayMinItems = sc.facets[id].displayMinItems;
		var countDisplayed = 0;
		$('div#facet_' + id+' >.fctItemContainer >div')
				.each(
						function(index, element) {
							if ($(element).hasClass(
									fdmg.fd.search.classNameSelected)) {
								// show selected filters
							} else {
								if (countDisplayed < displayMinItems) {
									// show not selected filter
									countDisplayed++;
								} else {
									$(element).addClass(
											fdmg.fd.search.classNameHidden);
								}
							}
						});
		$('div#facet_' + id+' > div.' + fdmg.fd.search.classNameBtnMore).removeClass(fdmg.fd.search.classNameHidden);
		$('div#facet_' + id+' > div.' + fdmg.fd.search.classNameBtnLess).addClass(fdmg.fd.search.classNameHidden);
		
	},
	onClickMore : function(id) {
		$.each(cs.registered_facets, function(index, facet) {
			if (facet.name == id) fdmg.fd.search.drawFacet(facet,true);
		});		
		
		var currentSelected = 0;
		var currentNotSelected = 0;
		$('div#facet_' + id+' >.fctItemContainer > div').removeClass(fdmg.fd.search.classNameHidden);
		$('div#facet_' + id+' > div.' + fdmg.fd.search.classNameBtnMore).addClass(fdmg.fd.search.classNameHidden);
		$('div#facet_' + id+' > div.' + fdmg.fd.search.classNameBtnLess).removeClass(fdmg.fd.search.classNameHidden);
	},
	prevPage : function() {
		cs.page--;
		fdmg.fd.search._searchList();

		return cs.page + "__" + cs.shortQuery;
	},
	nextPage : function() {
		cs.page++;
		fdmg.fd.search._searchList();

		return cs.page + "__" + cs.shortQuery;
	},
	gotoPage : function(page) {
		$('html, body').animate({scrollTop:0}, 'slow');
		cs.page = page;
		fdmg.fd.search._searchList();
	},
	setSortOrder : function(order) {
		if (order=='score') {
			$('#sortOrder div.orderRelevance').show();
			$('#sortOrder div.orderDate').hide();
		} else {
			$('#sortOrder div.orderRelevance').hide();
			$('#sortOrder div.orderDate').show();
		}
		cs.page = 1;
		cs.sortOrder = order + ' desc';
		fdmg.fd.search._searchList();
	},
       doTranslate : function(name, value) {
		var facet = fdmg.fd.search.getRegisteredFacet(name);
		for (key in facet.translations)
			if (value == facet.translations[key])
				return key.substr(key.indexOf('_') + 1);

		return value;
	},
        addQuotes: function(text) {
			   return text.search(/ /) == -1 ? text : '"' + text + '"' ;
	},
	searchBoxSubmit : function() {
		cs.page = 1;
		cs.facets = {};
		cs.searchTerm = $('#searchBox .srcSearchField').val();
		cs.advQuery = $('input[name=advanced_query]:checked').val();
		cs.source = $('#advanced_source').val();
		cs.company = fdmg.fd.search.addQuotes($('#advanced_company').val());		
		cs.section = fdmg.fd.search.addQuotes(fdmg.fd.search.doTranslate('section', $('#advanced_section').val()));
		cs.sector  = fdmg.fd.search.addQuotes(fdmg.fd.search.doTranslate('sector', $('#advanced_sector').val()));
		cs.tags = $('#advanced_tag').val();
		cs.fromDate = $('#advancedDateFrom').val();
		cs.toDate = $('#advancedDateTo').val();
		cs.author = fdmg.fd.search.addQuotes($('#advanced_author').val());

		fdmg.fd.search.search();
	},
	facetItemClick : function(event) {
		event.data.facetItem.selected = event.data.selected;
		cs.page=1;
		fdmg.fd.search.search();
		event.preventDefault();
	},
	searchDate : function() {
		cs.fromDate = $('#dateCriteriaFrom').val();
		cs.toDate = $('#dateCriteriaUntil').val();
		fdmg.fd.search.search();
	},
	clearDate : function() {
		cs.fromDate = '';
		cs.toDate = '';
		$('#dateCriteriaFrom').val('vanaf');
		$('#dateCriteriaUntil').val(dateToday);
		fdmg.fd.search.search();
	},
	articleLinkClick : function(event) {
		cs.store.options['search'] = cs.searchTerm;
		cs.store.options['to']     = cs.toDate;
		cs.store.options['from']   = cs.fromDate;
		cs.store.options['sort']   = cs.sortOrder;
		$.cookie("search", jstringify(cs.store));

		window.location = publicationUrl+'?service=searchRedirect&id='+event.data.id;
		event.preventDefault();
	},
	articleLinkClickProfiel : function(event) {
		cs.store.options['search'] = cs.searchTerm;
		cs.store.options['to']     = cs.toDate;
		cs.store.options['from']   = cs.fromDate;
		cs.store.options['sort']   = cs.sortOrder;
		$.cookie("search", jstringify(cs.store));

		window.location = publicationUrl+'?service=searchRedirect&tab=profiel&id='+event.data.id;
		event.preventDefault();
	},
	articleLinkClickNieuws : function(event) {
		cs.store.options['search'] = cs.searchTerm;
		cs.store.options['to']     = cs.toDate;
		cs.store.options['from']   = cs.fromDate;
		cs.store.options['sort']   = cs.sortOrder;
		$.cookie("search", jstringify(cs.store));

		window.location = publicationUrl+'?service=searchRedirect&tab=algemeen&id='+event.data.id;
		event.preventDefault();
	},
	articleLinkClickKoersen : function(event) {
		cs.store.options['search'] = cs.searchTerm;
		cs.store.options['to']     = cs.toDate;
		cs.store.options['from']   = cs.fromDate;
		cs.store.options['sort']   = cs.sortOrder;
		$.cookie("search", jstringify(cs.store));

		window.location = publicationUrl+'?service=searchRedirect&tab=koersen&id='+event.data.id;
		event.preventDefault();
	},
	articleLinkClickKerncijfers : function(event) {
		cs.store.options['search'] = cs.searchTerm;
		cs.store.options['to']     = cs.toDate;
		cs.store.options['from']   = cs.fromDate;
		cs.store.options['sort']   = cs.sortOrder;
		$.cookie("search", jstringify(cs.store));

		window.location = publicationUrl+'?service=searchRedirect&tab=kerncijfers&id='+event.data.id;
		event.preventDefault();
	},
	articleCheckChanged : function(event) {
		if(this.checked == true) {
			fdmg.fd.search.printArray[event.data.articleId] = true;
		} else {
			fdmg.fd.search.printArray[event.data.articleId] = false;
		}
	},
	checkAllArticles : function() {
		if($('input[name=checkAllArticles]')[0].checked == true) {
			$('.jqSearchCheck').each(function() {
				this.checked = true;
				$(this).change();
			});			
		} else {
			$('.jqSearchCheck').each(function() {
				this.checked = false;
				$(this).change();
			});			
		}
	},
	printAllChecked : function() {
		var map = fdmg.fd.search.printArray;
		var idString = "";
		for(elem in map){
			if (map[elem] == true) {
				idString += elem + ',';
			}
		}
		window.open('?printId=' + idString, 'print', 'scrollbars=yes,resizable=yes,toolbar=no,location=no,directories=no,menubar=no,status=no,left=0,top=0');
	},
	getRegisteredFacet : function(name) {
		var facets = fdmg.fd.search.current_search.registered_facets;
		
		for(facet in facets) {
			if(facets[facet].name == name) {
				return facets[facet];
			}
		}
	},
	getHtmlAdvFields : function(){
		var facet = fdmg.fd.search.getRegisteredFacet('source');
		var html = '';

		for (key in facet.translations) { 
			html += '<option value="' + key +'">' + facet.translations[key] + '</option>';
		}
		return html;
	},
	getSourceAdvFields : function(name){
		var array = [];
		var facet = fdmg.fd.search.getRegisteredFacet(name);
		/*
		for (key in facet.translations) { 
			if ((name == 'section' && facet.visibilities[key]!=false) || (name == 'sector')) {
				array.push({label:facet.translations[key], value:key.substring(8)});
			}
		}*/

		for (key in facet.translations) 
			array.push(facet.translations[key]);

		return array;
	},
	setAdvancedFields : function() {
		$('#advanced_section').autocomplete({
			source: fdmg.fd.search.getSourceAdvFields('section')
		});
		$('#advanced_sector').autocomplete({
			source: fdmg.fd.search.getSourceAdvFields('sector')
		});
		$('#advanced_source').html(fdmg.fd.search.getHtmlAdvFields());
		
		$('#advancedDateFrom').datepicker({changeMonth: true, changeYear: true, yearRange:'1985:+1'});
		$('#advancedDateTo').datepicker({changeMonth: true, changeYear: true, yearRange:'1985:+1'});
	},
	setQueryUrl : function () {
		$('#query').attr('href', securePublicationUrl + 'mijnfd/?alertQuery=' + escape(fdmg.fd.search.current_search.shortQuery) + '#newsAlertContent');
	},
	getPageRange : function(page, pageSize, numFound, diff) {
		var rangeSize = 2 * diff + 1;
		var maxPage = Math.round(((numFound + pageSize - 1) / pageSize) - 0.5);
		if (maxPage <= rangeSize)
			return [ maxPage, 1, maxPage ];
		if (page <= diff)
			return [ maxPage, 1, rangeSize ];
		if (page > maxPage - diff)
			return [ maxPage, maxPage - rangeSize + 1, maxPage ];
		return [ maxPage, page - diff, page + diff ];
	},
	processFacets : function(data) {
		cs = fdmg.fd.search.current_search;

		$.each(cs.registered_facets, function(index, facet) {
			if ((facet.field!='') && (data.facet_counts.facet_fields)) {
				var facet_data = data.facet_counts.facet_fields[facet.field];

				fct = cs.facets[facet.name];
				if (!fct) {
					fct = {};
					cs.facets[facet.name] = fct;
				}

				if (facet_data) {
					for (i = 0; i < facet_data.length; i += 2) {
						facetItem = fct['_'+facet_data[i]];
						if (!facetItem) {
							facetItem = {
								name : facet_data[i],
								count : facet_data[i + 1],
								selected : false
							};
							fct['_'+facet_data[i]] = facetItem;
						}
						facetItem.count = facet_data[i + 1];
					}
				}
			}
		});
	},
	drawResultList : function(data) {
		var resultListContainter = $('#resultList .resultListItemContainer');
		var template = $('#resultListItemTemplate');
		
		resultListContainter.empty();

		var allChecked = true;
		$.each(data.response.docs, function(index, result) {
							var clone = template.clone();
							allChecked = fdmg.fd.search.drawResultFields(clone,result, data) && allChecked;
							//console.log('allChecked: '+allChecked);
							clone.appendTo(resultListContainter);
							clone.show();
						});
		$('input[name=checkAllArticles]')[0].checked = allChecked;
		$('#resultList .resultListItemContainer .jqHover').fdHover();
	},
	drawTopResults : function(data) {
		var resultListContainter = $('#topResultList .resultListItemContainer');
		var template = $('#topResultItemTemplate');
		
		resultListContainter.empty();
		$.each(data.response.docs, function(index, result) {
			var clone = template.clone();
			fdmg.fd.search.drawResultFields(clone,result, data);
			clone.appendTo(resultListContainter);
			clone.show();
			clone.find('.jqSearchImage').attr('id', 'jqSearchImage_'+result.objectid);
			$.ajax({
				url : publicationUrl+'?service=searchImageUrl&id='+result.objectid,
				context : $('#resultList'),
				dataType : 'jsonp',
				jsonpCallback : 'fdmg.fd.search.callback.searchImage',
				jsonp : 'callback'
			});			

		});
		$('#topResultList .resultListItemContainer .jqHover').fdHover();
	},
	drawResultFields : function(clone, result, data) {
		var contentType_translate = { 
				'article': 'artikel',
				'company': 'Bedrijf',
				'topic': 'topic'
				};
		
		cs = fdmg.fd.search.current_search;

		var title = result.title_fd;
		if ((data.highlighting[result.id]) && (data.highlighting[result.id].title_fd)) {
			title = data.highlighting[result.id].title_fd[0];
		}
		var intro = result.intro_fd;
		if ((data.highlighting[result.id]) && (data.highlighting[result.id].intro_fd)) {
			intro = data.highlighting[result.id].intro_fd[0];
		}
		clone.find('.jqSearchTitle').html(title);
		clone.find('.jqSearchArticle').html(intro);
		
		// Date in format : 2011-02-24T07:01:00Z
		var dt = result.publishdate;
		// Create right format for Date object (MM/dd/yyyy hh:mm:ss)
		var strippedDate = dt.substring(5,7)+ '/' + dt.substring(8,10) + '/' + dt.substring(0,4) + ' ' + dt.substring(11,13) + ':' + dt.substring(14,16) + ':' + dt.substring(17,19);
		var pubDate = new Date(strippedDate);
		var offset = pubDate.getTimezoneOffset()/60;

		pubDate.setHours(pubDate.getHours() - offset, pubDate.getMinutes(), pubDate.getSeconds(), pubDate.getMilliseconds());
		
		// format to correct date string (dd-MM-YYYY)
		var dateString = (pubDate.getDate() < 10 ? "0" : "") + pubDate.getDate() + "-" + (pubDate.getMonth() + 1 < 10 ? "0" : "") + (pubDate.getMonth() + 1) + "-" + pubDate.getFullYear();
		
		clone.find('.jqSearchDate').text(dateString);
		clone.find('.jqSearchSource').text(fdmg.fd.search.translate(cs.registered_facets[0], result.bron_fd));
		clone.find('.jqSearchContentType').text(contentType_translate[result.contenttype]);		
		clone.find('a').click({id: result.objectid}, fdmg.fd.search.articleLinkClick);
    // We now determine if it's a company.
    if(result.contenttype == 'company')
    {
      // In case of a company we don't want to show the Search date.
      clone.find('.jqSearchDate').addClass("jqHide");
      clone.find('.searchArticleSep').addClass("jqHide");
      // Get the description of the company widget.
      $.getJSON(publicationUrl+'?service=showCompanyDescription&id='+result.objectid, function(data) {
        // We now check if the showCompanyProfile check is true.
        if(data.description.length > 0)
        {
          clone.find('.jqSearchArticle').html(data.description);
          $('#jqSearchImage_'+result.objectid).html($('#jqSearchImage_'+result.objectid).html() + data.description);
        }
      });
      
      $.getJSON(publicationUrl+'?service=showCompanyStock&id='+result.objectid, function(data) {
        // Check if there is stock information for the given company.
        // This will only return true if there is a ISIN code and the quote price and difference are filled.
        if(data.showStock == "true")
        {
          // We show the stock information.
          clone.find('.stock').removeClass("jqHide");
          // Fill the price.
          clone.find('.price').html(data.price);
          // Fill the difference.
          clone.find('.difference').html(data.difference);

          // Now we need to show the vwdPages div which holds the seperate URL to the VWD pages.
          clone.find('.vwdPages').removeClass("jqHide");
          // nieuws, koersen and kerncijfers are shown by default.
          clone.find('.nieuws').removeClass("jqHide");
          clone.find('.koersen').removeClass("jqHide");
          clone.find('.kerncijfers').removeClass("jqHide");
          // We add the clicks to nieuws, koersen and kerncijfers.
          clone.find('.nieuws').click({id: result.objectid}, fdmg.fd.search.articleLinkClickNieuws);
          clone.find('.koersen').click({id: result.objectid}, fdmg.fd.search.articleLinkClickKoersen);
          clone.find('.kerncijfers').click({id: result.objectid}, fdmg.fd.search.articleLinkClickKerncijfers);
          $.getJSON(publicationUrl+'?service=showCompanyProfile&id='+result.objectid, function(data) {
            // We now check if the showCompanyProfile check is true.
            if(data.showProfile == "true")
            {
              // We show profiel.
              clone.find('.profiel').removeClass("jqHide");
              // Add click to profiel.
              clone.find('.profiel').click({id: result.objectid}, fdmg.fd.search.articleLinkClickProfiel);
            }
          });
        }
      });
    }
		clone.find('.jqSearchCheck').change({articleId: result.objectid},fdmg.fd.search.articleCheckChanged);
		var isChecked = fdmg.fd.search.printArray[result.objectid]==true;
		clone.find('.jqSearchCheck').attr('checked', isChecked);
		return isChecked;
	},
	retrieveFacets : function(data) {
		var advanced = [ 'company', 'tag', 'author' ];
		for (var i = 0; i < advanced.length; i++) 
			fdmg.fd.search.retrieveFacet(advanced[i], data);

	},
	retrieveFacet : function(name, data) {
		$('#advanced_' + name).autocomplete({
				source: data['facet_counts']['facet_fields'][name + '_fd']
		});
	},
	drawFacets : function() {
		$.each(cs.registered_facets, function(index, facet) {
			if (facet.field!='') fdmg.fd.search.drawFacet(facet);
			//console.log('after drawFacet '+facet.name+' '+(new Date().getTime()-fdmg.fd.search.startTime))
			
		});
		if(fdmg.fd.search.search_config.processedUriFacets === false)
		{
			var uris = fdmg.fd.search.getUrlVars();
			var groupName = "";
			$.each(uris, function(index, value){
			if(value == 'groupName')
			{
				groupName = unescape(uris[value]);
			}
			else if(value == 'facetName')
			{
			// Also replace # character from URI.
				fdmg.fd.search.simulateClickFacet(groupName, unescape(uris[value].replace(/#/g, "")));
			}
			});
			fdmg.fd.search.search_config.processedUriFacets = true;
		}
	},
	drawFacet : function(facet, noHide) {
		cs = fdmg.fd.search.current_search;

		$('div#facet_' + facet.name+' > .fctItemContainer').empty();
		var template = $('div#facet_' + facet.name).find('#fctItemTemplate');
		var expanded = $('div#facet_' + facet.name+' > div.'+fdmg.fd.search.classNameBtnMore).hasClass(fdmg.fd.search.classNameHidden);
		
		var countDisplayMax = 0;
		var countShown = 0;
		var csFacet = cs.facets[facet.name];
//              var menulist = new Array();

		if (csFacet) {
			for (key in csFacet) {
				var facetItem = csFacet[key];
				if ((fdmg.fd.search.isFacetVisible(facet, facetItem.name)) && (facetItem.count>0)) {
                                   //menulist.push(facetItem.name);
					var hide = false; 
					if (countDisplayMax <= facet.displayMinItems && !facetItem.selected) { 
						countDisplayMax++; 
					} 
					if (!facet.showAll && !expanded && !facetItem.selected && countDisplayMax > facet.displayMinItems) {
					  hide = true; 
					} else { 
						countShown++; 
					}
					if(noHide) {
					  hide = false;
					}
					if(!hide) {
						var clone = template.clone();
						if (i == 0)
							clone.removeClass('pt2');
			
						if ((facetItem.count == 0)||(facetItem.selected)) {
							clone.find('.fctItemNormal').remove();
						}
						if ((facetItem.count == 0)||(!facetItem.selected)) {
							clone.find('.fctItemSelected').remove();
						}
						if ((facetItem.count != 0)||(facetItem.selected)) {
							clone.find('.fctItemEmpty').remove();
						}
						if ((facetItem.count != 0)||(!facetItem.selected)) {
							clone.find('.fctItemEmptySelected').remove();
						}
			
						if ((facetItem.count == 0)&&(facetItem.selected)) {
							clone.find('.fctItemEmptySelected a').click({facetItem: facetItem, selected:false}, fdmg.fd.search.facetItemClick);
							clone.addClass(fdmg.fd.search.classNameSelected);
						}
						if ((facetItem.count != 0)&&(!facetItem.selected)) {
							clone.find('.fctItemNormal a').click({facetItem: facetItem, selected:true}, fdmg.fd.search.facetItemClick);
						}
						if ((facetItem.count != 0)&&(facetItem.selected)) {
							clone.find('.fctItemSelected a').click({facetItem: facetItem, selected:false}, fdmg.fd.search.facetItemClick);
							clone.addClass(fdmg.fd.search.classNameSelected);
						}
						
						clone.find('.fctItemText').text(fdmg.fd.search.translate(facet, facetItem.name));
						clone.find('.fctItemCount').text('(' + facetItem.count + ')');
			
						clone.removeAttr('id');
						if (!hide) clone.removeClass('jqHide');
						clone.appendTo($('div#facet_' + facet.name+' .fctItemContainer'));
					}
				}
			}
			
			if (facet.showAll) {
				$('div#facet_' + facet.name+' > div.' + fdmg.fd.search.classNameBtnMore).addClass(fdmg.fd.search.classNameHidden);
				$('div#facet_' + facet.name+' > div.' + fdmg.fd.search.classNameBtnLess).addClass(fdmg.fd.search.classNameHidden);
			}

			$('div#facet_' + facet.name+' .fctItemContainer .jqHover').fdHover();
		}
/*
		var advanced = [ 'company', 'tags', 'author' ];

		for (var i = 0; i < advanced.length; i++) {
	              if (advanced[i] == facet.name) {
				$('#advanced_' + facet.name).autocomplete({
					source: menulist
				});
			}
		}*/
	},
	drawFacetsLine : function() {
		var list = $('#searchBox .srcFacetList');
		list.empty();

		cs.store = { options : {}, facets : {} };
		var templateFacet = $('#searchBox .srcFacetListFacet');
		var templateFacetItem = $('#searchBox .srcFacetListFacetItem');
		
		$.each(cs.registered_facets, function(index, facet) {
			if (cs.facets[facet.name]) {
				var selectedItems = [];
				$.each(cs.facets[facet.name], function(index, facetItem) {
					if (facetItem.selected) selectedItems.push(facetItem);
				});

				if (selectedItems.length>0) {
					cs.store.facets[facet.name] = [];
					cloneFacet = templateFacet.clone();
					$.each(selectedItems, function(index, facetItem) {
						cs.store.facets[facet.name].push( [ facetItem.name, facetItem.count ] );
						cloneFacetItem = templateFacetItem.clone();
						
						cloneFacetItem.find('.srcFacetListFacetItemName').text(fdmg.fd.search.translate(facet, facetItem.name));
						cloneFacetItem.find('a').click({facetItem: facetItem, selected:false}, fdmg.fd.search.facetItemClick);
						if (index==selectedItems.length-1) {
							cloneFacetItem.find('.srcFacetListFacetItemSeparator').remove();
						}
						cloneFacetItem.show();
						cloneFacet.append(cloneFacetItem);
					});
					cloneFacet.find('.srcFacetListFacetName').text('+' + facet.displayName + ': ');
					cloneFacet.show();
					list.append(cloneFacet);
				}
			}
		});
		$('#searchBox .srcFacetList .jqHover').fdHover();
		
	},
	drawFacetsLineMyfd : function() {
		cs = fdmg.fd.search.current_search;
		var list = $('#facets .srcFacetList');
		list.empty();

		var templateFacet = $('#facets .srcFacetListFacet');
		var templateFacetItem = $('#facets .srcFacetListFacetItem');
		
		$.each(cs.facets, function(index, facet) {

			var selectedItems = [];
			$.each(facet, function(index, facetItem) {
				if (facetItem.selected) selectedItems.push(facetItem);
			});
			if (selectedItems.length>0) {
				cloneFacet = templateFacet.clone();
				$.each(selectedItems, function(index, facetItem) {
					cloneFacetItem = templateFacetItem.clone();
					cloneFacetItem.find('.srcFacetListFacetItemName').text(facetItem.name);
					if (index==selectedItems.length-1) {
						cloneFacetItem.find('.srcFacetListFacetItemSeparator').remove();
					}
					cloneFacetItem.show();
					cloneFacet.append(cloneFacetItem);
				});
				cloneFacet.find('.srcFacetListFacetName').text('+' + facet.displayName + ': ');
				cloneFacet.show();
				list.append(cloneFacet);
			}
		});
		$('#facets .srcFacetList .jqHover').fdHover();
		
	},	
	drawCountsLine : function(data) {
		cs = fdmg.fd.search.current_search;
		$('#searchCountsLine').text('Pagina '+cs.page+' van '+data.response.numFound+' resultaten.');
	},
	drawPagination : function(data) {
		cs = fdmg.fd.search.current_search;
		sc = fdmg.fd.search.search_config;

		var pageRange = fdmg.fd.search.getPageRange(cs.page, sc.pageSize, data.response.numFound, sc.paginationDiff);
		
		var templateCurrent = $('#resultListPagination > div > .pgnTemplateCurrent');
		var templateOther = $('#resultListPagination > div > .pgnTemplateOther');
		var pageNumberContainer = $('#resultListPagination > div > .pgnPageNumbers');
		pageNumberContainer.empty();
		
		for (var page=pageRange[1]; page <=pageRange[2]; page++) {
			if (page==cs.page) {
				templateCurrent.clone()
					.text(page)
					.removeClass(fdmg.fd.search.classNameHidden)
					.appendTo(pageNumberContainer);
			} else {
				templateOther.clone()
					.text(page)
					.attr('href', '#' + page + "__" + cs.shortQuery)
					//.click({page: page}, function(event) { fdmg.fd.search.gotoPage(event.data.page); event.preventDefault();})
					.removeClass(fdmg.fd.search.classNameHidden)
					.appendTo(pageNumberContainer);
			}
		}
	},
	drawSearchBox : function() {
		cs = fdmg.fd.search.current_search;
		if (cs.searchTerm)
			$('#searchBox .srcSearchTerm').html('&#8216;'+cs.searchTerm+'&#8217;');
		$('#searchBox .srcSearchField').val(cs.searchTerm);
	},
	registerFacet : function(facetName, minDisplayItems, showAll, displayName) {
		sc = fdmg.fd.search.search_config;
		cs = fdmg.fd.search.current_search;

		var facet = sc.facets[facetName];
		facet.showAll = showAll;
		facet.displayMinItems = minDisplayItems;
		facet.displayName = displayName;
		
		if (facet && (jQuery.inArray(facet, cs.registered_facets) == -1)) {
			cs.registered_facets.push(facet);
		}
	},
	translate : function(facet, name) {
		var translated;
		if (facet.translations) translated=facet.translations[facet.translate_prefix+name];
		if (typeof(translated)=='undefined') translated=name;
		return translated;
	},
	isFacetVisible : function(facet, name) {
		var visible;
		if (facet.visibilities) visible=facet.visibilities[facet.translate_prefix+name];
		if (typeof(visible)=='undefined') visible=true;
		return visible;
	},
	facetTranslations : function(facetName, translations) {
		cs = fdmg.fd.search.current_search;
		$.each(cs.registered_facets, function(index, facet) {
			if (facet.name==facetName) {
				if (typeof(facet.translations)=='undefined') facet.translations = {};
				$.extend(facet.translations, translations);
			}
		});
	},
	facetVisibilities : function(facetName, visibilities) {
		cs = fdmg.fd.search.current_search;
		$.each(cs.registered_facets, function(index, facet) {
			if (facet.name==facetName) {
				if (typeof(facet.visibilities)=='undefined') facet.visibilities = {};
				$.extend(facet.visibilities, visibilities);
			}
		});
	},
	simulateClickFacet : function(groupName, facetName) {
		var result = false;
		fdmg.fd.search.onClickMore(groupName);

		$('body').find('.fctItemText').each(function(index, element){
			if($(this).html().indexOf(facetName) >= 0)
			{
				$(this).trigger('click');
				result = true;
			}
		});

		fdmg.fd.search.onClickLess(groupName);
		return result;
	},
	getUrlVars : function getUrlVars() {
		var vars = [], hash;
		var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');

		for(var i = 0; i < hashes.length; i++)
		{
			hash = hashes[i].split('=');
			vars.push(hash[0]);
			vars[hash[0]] = hash[1];
		}
		return vars;
	}	
};

