application.search = {

	exaleadUrl : '',
	
	lastResult : '',
	
	numberPerPage: 10,
	hasPrecPage: false,
	hasNextPage: false,
	
	searchString: '',
	criteriaList : new Array(),

	init: function() {
		this.exaleadUrl = application.baseUrl + '/search';
		application.search.firstLaunch();
	},
	
	firstLaunch: function() {
		var defaultSearch = '';
		
		application.search.lastResult = null;
		
		if (application.initIdList.length > 0) {
			defaultSearch = "";
			for (var i=0; i<application.initIdList.length; i++) {
				defaultSearch += "id:(" + application.initIdList + ")";
				if (i < application.initIdList.length-1)
					defaultSearch += " OR ";
			}
		}
		
		application.search.searchString = defaultSearch;
		application.search.launch(0);
	},
	
	launchSimpleSearch: function() {
		application.display.hideDialogs();
		application.search.searchString = $("#simpleSearch").val();
		application.search.lastResult = null;
		application.search.launch(0);
		
		application.search.makeReinitActive();
	},
	
	launchAdvancedSearch: function() {
		application.search.lastResult = null;
		application.search.launch(0);
		
		application.search.makeReinitActive();
	},
	
	_selectedCriteriaAttribute: null,
	selectCriteria: function(event, options) {
		if (options.index > 0)
			application.search._selectedCriteriaAttribute = options.value;
		else
			application.search._selectedCriteriaAttribute = null;
	},
	
	addCriteria: function() {
		if (application.search._selectedCriteriaAttribute) {
			var attribute = application.search._selectedCriteriaAttribute;
			var column = null;
			for (var i=0; i<application.display.table.columnList.length; i++) {
				if (application.display.table.columnList[i].attributeName == attribute
					|| application.display.table.columnList[i].groupAttributeFunction == attribute) {
					column = application.display.table.columnList[i];
					break;
				}
			}
			
			if (column) {
				var criteria = new application.search.Criteria(column);
				application.search.criteriaList.push(criteria);
			}
			
			application.display.updateCriteriaList();
		}
	},
	
	removeCriteria: function(index) {
		application.search.criteriaList.splice(index,1);
		application.display.updateCriteriaList();
	},
	
	setCriteriaValue: function(rank) {
		var criteria = application.search.criteriaList[rank];
		criteria.searchValue = $("#criteriaValue_" + rank).val();
	},
	
	setCriteriaValueBySelect: function(event, options) {
		var id = event.target.id;
		id = id.replace("criteriaValues_","");
		var rank = parseInt(id);
		var criteria = application.search.criteriaList[rank];
		
		var value = options.value
		
		if (criteria.column.searchByLabel) {
			var lexiqueEntry = application.getLexiqueItemFromKey(criteria.column.lexiqueName,value);
			value = lexiqueEntry.value;
		}

		criteria.searchValue = value;
	},
	
	setCriteriaFilter: function(event, options) {
		var id = event.target.id;
		id = id.replace("criteriaOperator_","");
		var rank = parseInt(id);
		var criteria = application.search.criteriaList[rank];
		criteria.selectedOperator = options.value;
	},
	
	setCriteriaLink: function(event, options) {
		var id = event.target.id;
		id = id.replace("criteriaLink_","");
		var rank = parseInt(id);
		var criteria = application.search.criteriaList[rank];
		criteria.linkOperator = options.value;
	},
	
	nextPage: function() {
		if (application.result.isEdited()) {
			application.display.dialog.alertDialog("Attention","Vous devez d'abord valider vos modifications");
		} else {
			if (application.search.hasNextPage) {
				var lastHits = application.search.lastResult.search.hits;
			
				var currentOffset = lastHits.start;
				var newOffset = currentOffset + application.search.numberPerPage;
				
				application.search.launch(newOffset);
			}
		}
	},
	
	precPage: function() {
		if (application.result.isEdited()) {
			application.display.dialog.alertDialog("Attention","Vous devez d'abord valider vos modifications");
		} else {
			if (application.search.hasPrecPage) {
				var lastHits = application.search.lastResult.search.hits;
			
				var currentOffset = lastHits.start;
				var newOffset = currentOffset - application.search.numberPerPage;
				
				application.search.launch(newOffset);
			}
		}
	},
	
	goToPage: function(page) {
		if (application.result.isEdited()) {
			application.display.dialog.alertDialog("Attention","Vous devez d'abord valider vos modifications");
		} else {
			if (application.search.lastResult) {
				var newOffset = (page-1) * application.search.numberPerPage;
				
				application.search.launch(newOffset);
			}
		}
	},
	
	refineSearch: function(refineUrl) {
//		application.display.dialog.alertDialog("Attention","Fonction temporairement d&eacute;sactiv&eacute;e.");


		if (application.result.isEdited()) {
			application.display.dialog.alertDialog("Attention","Vous devez d'abord valider vos modifications");
		} else {
			if (application.search.lastResult) {
				application.search.launch(0,refineUrl);
			}
		}
		application.search.makeReinitActive();

	},
	
	pageSizeChanged: function(event, options) {
		application.search.setPageSize(options.value);
	},
	
	setPageSize: function(pageSize) {
		application.search.numberPerPage = pageSize;
		application.search.launch(0);
	},
	
	sortChanged: function(event, options) {
		//alert(options.value);
	},
	
	makeReinitActive: function() {
		if (!$("#refreshButton").hasClass("isActive")) {
			$("#refreshButton").addClass("isActive");
			
			$("#refreshButton").click(function() {
				application.search.reinit();
			});
		}
		
	},
	
	reinit: function() {
		$("#refreshButton").removeClass("isActive");
		$("#refreshButton").unbind('click');
		
		application.search.criteriaList = new Array();
		$("#simpleSearch").val("");
		application.display.updateCriteriaList();
		
		application.search.firstLaunch();
		
	},
	
	launch: function(offSet, refineUrl) {
		application.result.isModified = false; 
		var searchValue = application.search.searchString;
	
		if (this.criteriaList.length > 0) {
			searchValue = application.search.makeAdvancedSearchArray();
		}
		
		var params = {
			search: searchValue,
			offSet: offSet,
			pageSize: application.search.numberPerPage
		};

		if (application.search.lastResult) {
			params.context = application.search.lastResult.search.query.context;
		}
		
		if (refineUrl) {
			params.refine = refineUrl;
		}
		
		
		$("#Attente").show();
		
		var result = $.ajax({
			url:application.search.exaleadUrl, 
			async: false,
			type: "POST",
			cache: false,
			data: params,
			error: function (request, status, error) {
				application.display.dialog.errorDialog(request.status);
		    },
		    success: function (data, text) {
		    	application.search.makeResult(eval('('+data+')'));
		    }
			}).responseText;
		$("#Attente").hide();

	},
	
	makeAdvancedSearchString: function() {
		var searchString = "";
		
		for (var i=0; i<application.search.criteriaList.length; i++) {
			var criteria = application.search.criteriaList[i];
			if (i==0) {
				searchString = criteria.getSearchString();
			} else {
				if (criteria.linkOperator == 'AND') {
					searchString += " AND " + criteria.getSearchString();
				} else {
					var precCriteria = application.search.criteriaList[i-1].getSearchString();
					searchString = searchString.replace(precCriteria, "(" + precCriteria + " OR " +  criteria.getSearchString() + ")");
				}
			}
		}
		
		return searchString;
	},
	
	makeAdvancedSearchArray: function() {
		var searchArray = [];
		
		for (var i=0; i<application.search.criteriaList.length; i++)
			searchArray.push(application.search.criteriaList[i].getSearchObject());
		
		return searchArray;
	},
	
	makeResult: function(data) {
		if (application.isFirstSearch) {
			application.total = data.search.hits.nMatches;
			application.isFirstSearch = false;
		}
		
		application.result.init();
		
		application.search.lastResult = data;
		
		if (data.search.hits.hits) {

			for (var i=0; i<data.search.hits.hits.length; i++) {
				var newRow = new application.result.Row();
				var hit = data.search.hits.hits[i];
				
				newRow.data.id = application.search.getValueFromHit('id',hit);
				newRow.data.oaiId.value =  application.search.getValueFromHit('oai_id',hit);
				newRow.data.adhId = application.search.getValueFromHit('adh_id',hit);
				newRow.data.adhName = application.search.getValueFromHit('adh_name',hit);
				
				var urlValideAtt = application.search.getValueFromHit('UrlValide',hit);
				if (urlValideAtt)
					newRow.data.isUrlValide = urlValideAtt[0];
				
				newRow.data.thumbnailUrl = 'http://vignettes.toutsurlenvironnement.fr/images/metadata?id=' + newRow.data.id + '&url=' + hit.url64;
				
				var title = application.search.getValueFromHit('title',hit);
				var state = application.search.getValueFromHit('visible',hit);
				if (title.indexOf("--BROUILLON--") > -1) {
					title = title.replace("--BROUILLON--","");
					state = -1;
				}
				
				newRow.data.state.value = state;
				newRow.data.title.value = title;
				newRow.data.alternateTitle.value = application.search.getValueFromHit('alternatetitle',hit);
				newRow.data.description.value = application.search.getValueFromHit('description',hit);
				newRow.data.url.value = application.search.getValueFromHit('url',hit);
	
				newRow.data.dataDate.value = application.search.makeDate(application.search.getValueFromHit('dataDate',hit));
				newRow.data.creationDate.value = application.search.makeDate(application.search.getValueFromHit('creation_date',hit));
				newRow.data.revisionDate.value = application.search.makeDate(application.search.getValueFromHit('revision_date',hit));
				newRow.data.publicationDate.value = application.search.makeDate(application.search.getValueFromHit('publication_date',hit));
	
				newRow.data.rights.value = application.search.getValueFromHit('rights',hit);
				newRow.data.lang.value = application.search.getValueFromHit('lang',hit);
				newRow.data.portail.value = application.search.getValueFromHit('portail_name',hit);
				
				newRow.data.contact.value = application.search.getValueFromHit('contact',hit);
				newRow.data.owner.value =  application.search.getValueFromHit('owner',hit);
				newRow.data.originator.value =  application.search.getValueFromHit('originator',hit);
				newRow.data.publisher.value =  application.search.getValueFromHit('publisher',hit);
				newRow.data.contributor.value =  application.search.getValueFromHit('contributor',hit);
				newRow.data.pointOfContact.value =  application.search.getValueFromHit('pointofcontact',hit);
				
				newRow.data.nature.values = application.search.getValueFromHit('DocumentNature',hit);
				newRow.data.niveauLecture.values = application.search.getValueFromHit('Audience',hit);
	
				newRow.data.geographie.values = application.search.getValueFromHit('Place',hit);
				
				newRow.data.codeCommune.value = application.search.getValueFromHit('com_code',hit);
				newRow.data.nomCommune.value = application.search.getValueFromHit('com_name',hit);
				
				var otherPlace = application.search.getValueFromHit('other_place_names',hit);
				if (otherPlace)
					newRow.data.otherplaceNames.values = otherPlace.split('--!!--');
					
				if (newRow.data.otherplaceNames.values != null) {
					for (var o=0; o<newRow.data.otherplaceNames.values.length; o++) {
						if (newRow.data.otherplaceNames.values[o] == 'no Geography') {
							newRow.data.geographie.values = ['no_geog'];
						}
					}
				}
				
				newRow.data.importSourceType.value = application.search.getValueFromHit('importSourceType',hit);
				newRow.isEditable = (newRow.data.importSourceType.value != 'HARVEST_OAIPMH');
				
				var kw = application.search.getValueFromHit('keywords',hit)
				if (kw)
					newRow.data.keywords.values = kw.split('--!!--');
				
				newRow.data.themes.values = application.search.concatThemes(application.search.getValueFromHit('Theme1',hit),application.search.getValueFromHit('Theme2',hit),application.search.getValueFromHit('Theme3',hit));
	
				application.search.appendDefaultValues(newRow);
				
				application.result.rowList.push(newRow);
			}
		}

		//display result
		application.display.displayResult();
	},
	
	getValueFromHit: function(attributeName, hit) {
		if (attributeName == 'url')
			return hit.url;
		else {
			for (var i=0; i<hit.hitFields.length; i++) {
				if (hit.hitFields[i].name == attributeName) {
					if (hit.hitFields[i].value)
						return hit.hitFields[i].value;
					else {
						var textSegs = hit.hitFields[i].textSegs;
						if (textSegs) {
							var total = "";
							for (var t=0;t< textSegs.length; t++) {
								total += textSegs[t].value;
							}
							return total;
						}
					}	
				}
			}
			
			for (var i=0; i<hit.hitGroups.length;i++) {
				if (hit.hitGroups[i].title.indexOf(attributeName) > -1) {
					var result = new Array();
					for (var j=0;j<hit.hitGroups[i].hitCategories.length;j++) {
						var hitCategory = hit.hitGroups[i].hitCategories[j];
						var value = application.search.getValueFromHitCategory(hitCategory);
						result.push(value);
					}
					return result;
				}
			}
		}
		return null;
	},
	
	getValueFromHitCategory: function(hitCategory, fatherValue) {
		var value = hitCategory.name;
		if (fatherValue && fatherValue.length > 0)
			value = fatherValue + "/" + value;
		
		if (hitCategory.categorie)
			value = application.search.getValueFromHitCategory(hitCategory.categorie,value);
		
		return value;
	},
	
	concatThemes: function(theme1, theme2, theme3) {
		var total = new Array();
		if (theme1) {
			var themeArray = application.appendPrefix(theme1, "Milieux et environnement/");
			total = total.concat(themeArray);
		}
		if (theme2) {
			var themeArray = application.appendPrefix(theme2, "Vos pr\u00E9occupations/");
			total = total.concat(themeArray);
		}
		if (theme3) {
			var themeArray = application.appendPrefix(theme3, "Les secteurs d'activit\u00E9/");
			total = total.concat(themeArray);
		}
		return total;
	},
	
	makeDate: function(exaleadDate) {
		if (exaleadDate && exaleadDate.length > 0) {
			var completeDay = exaleadDate.split(" ")[0];
			var completeHour = exaleadDate.split(" ")[1];
			
			var year = completeDay.split("-")[0];
			var month = completeDay.split("-")[1];
			var day = completeDay.split("-")[2];
			
			var hour = completeHour.split(":")[0];
			var minute = completeHour.split(":")[1];
			var second = completeHour.split(":")[2];
			
			var result = new Date();
			if (day.indexOf("0") == 0) 
				day = day.substring(1); 
			result.setFullYear(year, parseInt(month)-1, parseInt(day)); //month commenece a 0 -- day : exalead indexe sans time zone
			result.setHours(hour, minute, parseFloat(second));
			
			return result;
		}
		return null;
	},
	
	appendDefaultValues: function(row) {
		if (
			(!row.data.themes.values 
				|| row.data.themes.values.length == 0
				|| row.data.themes.isDefaultValue == true
			) 
			&& application.defaultValues.data.themes.values.length > 0) {
			row.data.themes.values = application.defaultValues.data.themes.values.slice(0);
			row.data.themes.isDefaultValue = true;
		}
		if (
			(!row.data.geographie.values 
				|| row.data.geographie.values.length == 0
				|| row.data.geographie.isDefaultValue == true
			) 
			&& application.defaultValues.data.geographie.values.length > 0) {
			row.data.geographie.values = application.defaultValues.data.geographie.values.slice(0);
			row.data.geographie.isDefaultValue = true;
		}
		if (
			(!row.data.nature.values 
				|| row.data.nature.values.length == 0
				|| row.data.nature.isDefaultValue == true
			) 
			&& application.defaultValues.data.nature.values.length > 0) {
			row.data.nature.values = application.defaultValues.data.nature.values.slice(0);
			row.data.nature.isDefaultValue = true;
		}
		if (
			(!row.data.niveauLecture.values
				|| row.data.niveauLecture.values.length == 0
				|| row.data.niveauLecture.isDefaultValue == true
			) 
			&& application.defaultValues.data.niveauLecture.values.length > 0) {
			row.data.niveauLecture.values = application.defaultValues.data.niveauLecture.values.slice(0);
			row.data.niveauLecture.isDefaultValue = true;
		}
		if (
			(!row.data.lang.value
				|| row.data.lang.value.length == 0
				|| row.data.lang.isDefaultValue == true
			) 
			&& application.defaultValues.data.lang.value.length > 0) {
			row.data.lang.value = application.defaultValues.data.lang.value;
			row.data.lang.isDefaultValue = true;
		}
		if (
			(!row.data.rights.value
				|| row.data.rights.value.length == 0
				|| row.data.rights.isDefaultValue == true
			) 
			&& application.defaultValues.data.rights.value.length > 0) {
			row.data.rights.value = application.defaultValues.data.rights.value;
			row.data.rights.isDefaultValue = true;
		}
		if (
			(!row.data.portail.value
				|| row.data.portail.value.length == 0
				|| row.data.portail.isDefaultValue == true
			) 
			&& application.defaultValues.data.portail.value.length > 0) {
			row.data.portail.value = application.defaultValues.data.portail.value;
			row.data.portail.isDefaultValue = true;
		}
		if (
			(!row.data.owner.value
				|| row.data.owner.value.length == 0
				|| row.data.owner.isDefaultValue == true
			) 
			&& application.defaultValues.data.owner.value.length > 0) {
			row.data.owner.value = application.defaultValues.data.owner.value;
			row.data.owner.isDefaultValue = true;
		}
		if (
			(!row.data.originator.value
				|| row.data.originator.value.length == 0
				|| row.data.originator.isDefaultValue == true
			) 
			&& application.defaultValues.data.originator.value.length > 0) {
			row.data.originator.value = application.defaultValues.data.originator.value;
			row.data.originator.isDefaultValue = true;
		}
		if (
			(!row.data.publisher.value
				|| row.data.publisher.value.length == 0
				|| row.data.publisher.isDefaultValue == true
			) 
			&& application.defaultValues.data.publisher.value.length > 0) {
			row.data.publisher.value = application.defaultValues.data.publisher.value;
			row.data.publisher.isDefaultValue = true;
		}
		if (
			(!row.data.contributor.value
				|| row.data.contributor.value.length == 0
				|| row.data.contributor.isDefaultValue == true
			) 
			&& application.defaultValues.data.contributor.value.length > 0) {
			row.data.contributor.value = application.defaultValues.data.contributor.value;
			row.data.contributor.isDefaultValue = true;
		}
		if (
			(!row.data.contact.value
				|| row.data.contact.value.length == 0
				|| row.data.contact.isDefaultValue == true
			) 
			&& application.defaultValues.data.contact.value.length > 0) {
			row.data.contact.value = application.defaultValues.data.contact.value;
			row.data.contact.isDefaultValue = true;
		}
		if (
			(!row.data.pointOfContact.value
				|| row.data.pointOfContact.value.length == 0
				|| row.data.pointOfContact.isDefaultValue == true
			) 
			&& application.defaultValues.data.pointOfContact.value.length > 0) {
			row.data.pointOfContact.value = application.defaultValues.data.pointOfContact.value;
			row.data.pointOfContact.isDefaultValue = true;
		}
	}
	
};
