libreavous/squelettes/javascript/scrutarijs/scrutarijs.js

2914 lines
101 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* version: 1.3.2 */
var Scrutari = {};
Scrutari.log = function (msg) {
if ((console) && (console.log)) {
console.log(msg);
}
};
Scrutari.logError = function (error) {
var errorMessage = "Scrutari Request Error [key = " + error.key + " | parameter = " + error.parameter;
if (error.hasOwnProperty("value")) {
errorMessage += " | value = " + error.value;
}
if (error.hasOwnProperty("array")) {
errorMessage += " | array = (";
for(var i = 0; i < error.array.length; i++) {
if (i > 0) {
errorMessage += ";";
}
var obj = error.array[i];
errorMessage += obj.key;
if (obj.hasOwnProperty("value")) {
errorMessage += "=" + obj.value;
}
}
errorMessage += ")";
}
errorMessage += "}";
Scrutari.log(errorMessage);
};
Scrutari.convert = function (jqArgument) {
if (jqArgument.jquery) {
return jqArgument;
} else {
return $(jqArgument);
}
};
Scrutari.exists = function (jqArgument) {
return Scrutari.convert(jqArgument).length > 0;
};
Scrutari.escape = function (text) {
var result = "";
for(var i = 0; i < text.length; i++) {
carac = text.charAt(i);
switch (carac) {
case '&':
result += "&amp;";
break;
case '"':
result += "&quot;";
break;
case '<':
result += "&lt;";
break;
case '>':
result += "&gt;";
break;
case '\'':
result += "&#x27;";
break;
default:
result += carac;
}
}
return result;
};
Scrutari.$ = function (jqArgument, properties) {
if (!properties) {
properties = jqArgument;
jqArgument = null;
}
var query = Scrutari.toCssQuery(properties);
if (jqArgument) {
return Scrutari.convert(jqArgument).find(query);
} else {
return $(query);
}
};
Scrutari.$children = function (jqArgument, properties) {
return Scrutari.convert(jqArgument).children(Scrutari.toCssQuery(properties));
};
Scrutari.$parents = function (jqArgument, properties) {
return Scrutari.convert(jqArgument).parents(Scrutari.toCssQuery(properties));
};
Scrutari.toCssQuery = function (properties) {
var query = "";
var elementName = false;
var suffix = "";
for(let key in properties) {
let value = properties[key];
if (!key.startsWith("_")) {
if (value === true) {
query += "[" + Scrutari.toDataAttribute(key) + "]";
} else {
query += "[" + Scrutari.toDataAttribute(key) + "='" + value + "']";
}
} else if (key === "_checked") {
if (value) {
suffix += ":checked";
} else {
suffix += ":not(:checked)";
}
} else if (key === "_type") {
query += "[type='" + value + "']";
} else if (key === "_name") {
query += "[name='" + value + "']";
} else if (key === "_value") {
query += "[value='" + value + "']";
} else if (key === "_element") {
elementName = value;
}
}
if (elementName) {
query = elementName + query;
}
query += suffix;
return query;
};
Scrutari.toDataAttribute = function (camelCaseString) {
return "data-" + camelCaseString.replace(/[A-Z]/g, function (upperLetter) {
return "-" + upperLetter.toLowerCase();
});
};
Scrutari.Config = function (name, engineUrl, lang, origin, options) {
this.name = name;
this.engineUrl = engineUrl;
this.lang = lang;
this.origin = origin;
this.options = {
dataType: "json",
queryVariant: "query",
ficheFields: null,
motcleFields: null,
paginationLength: 50,
subsearchThreshold: 250,
groupSortFunction: _ficheCountSort
};
if (options) {
for(var key in options) {
this.options[key] = options[key];
}
}
function _ficheCountSort(group1, group2) {
let count1 = group1.ficheCount;
let count2 = group2.ficheCount;
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
} else {
let rank1 = group1.category.rank;
let rank2 = group1.category.rank;
if (rank1 < rank2) {
return -1;
} else if (rank1 > rank2) {
return 1;
} else {
return 0;
}
}
}
};
Scrutari.Config.prototype.getJsonUrl = function () {
return this.engineUrl + "json";
};
Scrutari.Config.prototype.getDownloadUrl = function (qId, extension) {
switch(extension) {
case "ods":
case "csv":
return this.engineUrl + "export/" + "result_" + qId + "_" + this.lang + "." + extension;
case "atom":
return this.engineUrl + "feed/" + "fiches_" + this.lang + ".atom?qid=" + qId + "&all=" + _getCurrentDate();
default:
Scrutari.log("Unknown extension: " + extension);
return "";
}
function _getCurrentDate() {
var date = new Date();
var dateString = date.getFullYear() + "-";
var mois = date.getMonth() + 1;
if (mois < 10) {
dateString += "0";
}
dateString += mois;
dateString += "-";
var jour = date.getDate();
if (jour < 10) {
dateString += "0";
}
dateString += jour;
return dateString;
}
};
Scrutari.Config.prototype.getPermalinkUrl = function (qId, permalinkPattern) {
var permalink = permalinkPattern.replace("$LANG", this.lang);
permalink = permalink.replace("$QID", qId);
return permalink;
};
Scrutari.Ajax = {};
Scrutari.Ajax.loadBaseArray = function (scrutariConfig, requestParameters, baseArrayCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "base";
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, "baseArray", baseArrayCallback);
}
});
};
Scrutari.Ajax.loadCategoryArray = function (scrutariConfig, requestParameters, categoryArrayCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "category";
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, "categoryArray", categoryArrayCallback);
}
});
};
Scrutari.Ajax.loadCorpusArray = function (scrutariConfig, requestParameters, corpusArrayCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "corpus";
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, "corpusArray", corpusArrayCallback);
}
});
};
Scrutari.Ajax.loadEngineInfo = function (scrutariConfig, requestParameters, engineInfoCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "engine";
Scrutari.Ajax.check(requestParameters, "info", "all");
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, "engineInfo", engineInfoCallback);
}
});
};
Scrutari.Ajax.loadFicheArray = function (scrutariConfig, requestParameters, ficheArrayCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "fiche";
Scrutari.Ajax.check(requestParameters, "fieldvariant", "data");
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, ["ficheArray", "motcleArray"], ficheArrayCallback);
}
});
};
Scrutari.Ajax.loadGeoJson = function (scrutariConfig, requestParameters, geojsonCallback, apiErrorCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "geojson";
if ((scrutariConfig.options.ficheFields) || (scrutariConfig.options.motcleFields)) {
Scrutari.Ajax.check(requestParameters, "fichefields", scrutariConfig.options.ficheFields);
Scrutari.Ajax.check(requestParameters, "motclefields", scrutariConfig.options.motcleFields);
}
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "fieldvariant", scrutariConfig.options.queryVariant);
Scrutari.Ajax.check(requestParameters, "origin", scrutariConfig.origin);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
if (data.hasOwnProperty("error")) {
if (apiErrorCallback) {
apiErrorCallback(data.error);
} else {
Scrutari.logError(data.error);
}
} else {
Scrutari.Ajax.logWarnings(data);
geojsonCallback(data);
}
}
});
};
Scrutari.Ajax.loadMotcleArray = function (scrutariConfig, requestParameters, motcleArrayCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "motcle";
Scrutari.Ajax.check(requestParameters, "fieldvariant", "data");
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, "motcleArray", motcleArrayCallback);
}
});
};
Scrutari.Ajax.loadThesaurusArray = function (scrutariConfig, requestParameters, thesaurusArrayCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "thesaurus";
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, "thesaurusArray", thesaurusArrayCallback);
}
});
};
Scrutari.Ajax.loadFicheSearchResult = function (scrutariConfig, requestParameters, ficheSearchResultCallback, apiErrorCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "q-fiche";
if (scrutariConfig.options.ficheFields !== null) {
Scrutari.Ajax.check(requestParameters, "fichefields", scrutariConfig.options.ficheFields);
}
if (scrutariConfig.options.motcleFields !== null) {
Scrutari.Ajax.check(requestParameters, "motclefields", scrutariConfig.options.motcleFields);
}
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "fieldvariant", scrutariConfig.options.queryVariant);
Scrutari.Ajax.check(requestParameters, "q-mode", "intersection");
Scrutari.Ajax.check(requestParameters, "origin", scrutariConfig.origin);
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
Scrutari.Ajax.check(requestParameters, "start", 1);
Scrutari.Ajax.check(requestParameters, "limit", scrutariConfig.options.paginationLength * 2);
Scrutari.Ajax.check(requestParameters, "starttype", "in_all");
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, "ficheSearchResult", ficheSearchResultCallback, apiErrorCallback);
}
});
};
Scrutari.Ajax.loadExistingFicheSearchResult = function (scrutariConfig, requestParameters, existingFicheSearchResultCallback) {
if (!requestParameters) {
requestParameters = new Object();
}
requestParameters.type = "q-fiche";
if ((scrutariConfig.options.ficheFields) || (scrutariConfig.options.motcleFields)) {
Scrutari.Ajax.check(requestParameters, "fichefields", scrutariConfig.options.ficheFields);
Scrutari.Ajax.check(requestParameters, "motclefields", scrutariConfig.options.motcleFields);
}
Scrutari.Ajax.check(requestParameters, "lang", scrutariConfig.lang);
Scrutari.Ajax.check(requestParameters, "fieldvariant", scrutariConfig.options.queryVariant);
Scrutari.Ajax.check(requestParameters, "insert", "-searchmeta,-motclearray");
Scrutari.Ajax.check(requestParameters, "warnings", 1);
Scrutari.Ajax.check(requestParameters, "version", 3);
Scrutari.Ajax.check(requestParameters, "start", 1);
Scrutari.Ajax.check(requestParameters, "limit", scrutariConfig.options.paginationLength * 2);
$.ajax({
url: scrutariConfig.getJsonUrl(),
dataType: scrutariConfig.options.dataType,
data: requestParameters,
success: function (data, textStatus) {
Scrutari.Ajax.success(data, "ficheSearchResult", existingFicheSearchResultCallback);
}
});
};
Scrutari.Ajax.success = function(ajaxResult, objectNames, objectCallback, apiErrorCallback) {
if (ajaxResult.hasOwnProperty("error")) {
if (apiErrorCallback) {
apiErrorCallback(ajaxResult.error);
} else {
Scrutari.logError(ajaxResult.error);
}
} else {
Scrutari.Ajax.logWarnings(ajaxResult);
if (Array.isArray(objectNames)) {
let apiObjectArray = new Array();
for(let objectName of objectNames) {
if (!ajaxResult.hasOwnProperty(objectName)) {
apiObjectArray.push(null);
} else {
apiObjectArray.push(ajaxResult[objectName]);
}
}
objectCallback.apply(this, apiObjectArray);
} else {
let objectName = objectNames;
if (!ajaxResult.hasOwnProperty(objectName)) {
$.error(objectName + " object is missing in json response");
} else {
objectCallback(ajaxResult[objectName]);
}
}
}
};
Scrutari.Ajax.logWarnings = function (ajaxResult) {
if (ajaxResult.hasOwnProperty("warnings")) {
var warningsMessage = "Scrutari Request Warnings [";
for(var i = 0; i < ajaxResult.warnings.length; i++) {
if (i > 0) {
warningsMessage += ";";
}
var warning = ajaxResult.warnings[i];
warningsMessage += "key = ";
warningsMessage += warning.key;
warningsMessage += " | parameter = ";
warningsMessage += warning.parameter;
if (warning.hasOwnProperty("value")) {
warningsMessage += " | value = ";
warningsMessage += warning.value;
}
}
warningsMessage += "]";
Scrutari.log(warningsMessage);
}
};
Scrutari.Ajax.check = function (obj, name, defaultValue) {
if (!obj.hasOwnProperty(name)) {
if (defaultValue) {
obj[name] = defaultValue;
} else {
obj[name] = "";
}
}
};
Scrutari.Meta = function (engineInfo) {
this.engineInfo = engineInfo;
};
Scrutari.Meta.load = function(scrutariConfig, callback) {
Scrutari.Ajax.loadEngineInfo(scrutariConfig, null, function (engineInfo) {
let scrutariMeta = new Scrutari.Meta(engineInfo);
if (callback) {
callback(scrutariMeta);
}
});
};
Scrutari.Meta.prototype.getAttributeArray = function (familyName) {
if (!this.engineInfo.hasOwnProperty("attributes")) {
return new Array();
}
if (!this.engineInfo.attributes.hasOwnProperty(familyName)) {
return new Array();
}
return this.engineInfo.attributes[familyName];
};
Scrutari.Meta.prototype.getBase = function (code) {
var key = "code_" + code;
if (this.engineInfo.baseMap.hasOwnProperty(key)) {
return this.engineInfo.baseMap[key];
} else {
return null;
}
};
Scrutari.Meta.prototype.getBaseArray = function (sortFunction) {
var array = new Array();
var baseMap = this.engineInfo.baseMap;
var p=0;
for(let prop in baseMap) {
array[p] = baseMap[prop];
p++;
}
if (sortFunction) {
array = array.sort(sortFunction);
}
return array;
};
Scrutari.Meta.prototype.getCategory = function (categoryName) {
if (this.engineInfo.hasOwnProperty("categoryMap")) {
if (this.engineInfo.categoryMap.hasOwnProperty(categoryName)) {
return this.engineInfo.categoryMap[categoryName];
} else {
return null;
}
} else {
return null;
}
};
Scrutari.Meta.prototype.getCategoryArray = function (sortFunction) {
var array = new Array();
if (!this.engineInfo.hasOwnProperty("categoryMap")) {
return array;
}
var categoryMap = this.engineInfo.categoryMap;
var p=0;
for(let prop in categoryMap) {
array[p] = categoryMap[prop];
p++;
}
if (sortFunction) {
array = array.sort(sortFunction);
}
return array;
};
Scrutari.Meta.prototype.getCategoryForCorpus = function (code) {
if (!this.engineInfo.hasOwnProperty("categoryMap")) {
return null;
}
var categoryMap = this.engineInfo.categoryMap;
for(let prop in categoryMap) {
let category = categoryMap[prop];
for(let codecorpus of category.codecorpusArray) {
if (codecorpus === code) {
return category;
}
}
}
return null;
};
Scrutari.Meta.prototype.getComplementTitle = function(code, complementNumber) {
var corpus = this.getCorpus(code);
if (!corpus) {
return "";
}
var key = "complement_" + complementNumber;
if (corpus.phraseMap.hasOwnProperty(key)) {
return corpus.phraseMap[key];
} else {
return key;
}
};
Scrutari.Meta.prototype.getCorpus = function (code) {
var key = "code_" + code;
if (this.engineInfo.corpusMap.hasOwnProperty(key)) {
return this.engineInfo.corpusMap[key];
} else {
return null;
}
};
Scrutari.Meta.prototype.getCorpusArray = function (sortFunction) {
var array = new Array();
var corpusMap = this.engineInfo.corpusMap;
var p=0;
for(let prop in corpusMap) {
array[p] = corpusMap[prop];
p++;
}
if (sortFunction) {
array = array.sort(sortFunction);
}
return array;
};
Scrutari.Meta.prototype.getCorpusArrayForBases = function (baseArray) {
var result = new Array();
for(let codebase of baseArray) {
let key = "code_" +codebase;
if (this.engineInfo.baseMap.hasOwnProperty(key)) {
result = result.concat(this.engineInfo.baseMap[key].codecorpusArray);
}
}
return result;
};
Scrutari.Meta.prototype.getCorpusArrayForCategories = function (categoryArray) {
var result = new Array();
if (!this.engineInfo.hasOwnProperty("categoryMap")) {
return result;
}
for(let categoryName of categoryArray) {
if (this.engineInfo.categoryMap.hasOwnProperty(categoryName)) {
result = result.concat(this.engineInfo.categoryMap[categoryName].codecorpusArray);
}
}
return result;
};
Scrutari.Meta.prototype.getCorpusFicheCount = function (code) {
var corpus = this.getCorpus(code);
if (!corpus) {
return 0;
}
return corpus.stats.fiche;
};
Scrutari.Meta.prototype.getCorpusLangFicheCount = function (code, langArray) {
var corpus = this.getCorpus(code);
if (!corpus) {
return 0;
}
var ficheCount = 0;
for(let langObj of corpus.stats.langArray) {
if ($.inArray(langObj.lang, langArray) !== -1) {
ficheCount += langObj.fiche;
}
}
return ficheCount;
};
Scrutari.Meta.prototype.getDefaultOptions = function () {
var options = {};
var attrMap = this.engineInfo.metadata.attrMap;
for(let key in attrMap) {
if (key.indexOf("scrutarijs:") === 0) {
let name = key.substring("scrutarijs:".length);
let values = attrMap[key];
if (values.length === 1) {
let value = values[0];
if (value === "false") {
value = false;
} else if (value === "true") {
value = true;
}
options[name] = value;
} else {
options[name] = values;
}
}
this[key] = options[key];
}
return options;
};
Scrutari.Meta.prototype.getEngineInfo = function () {
return this.engineInfo;
};
Scrutari.Meta.prototype.getGlobalFicheCount = function () {
return this.engineInfo.stats.fiche;
};
Scrutari.Meta.prototype.getGlobalLangFicheCount = function (langArray) {
var ficheCount = 0;
for(let langObj of this.engineInfo.stats.langArray) {
if ($.inArray(langObj.lang, langArray) !== -1) {
ficheCount += langObj.fiche;
}
}
return ficheCount;
};
Scrutari.Meta.prototype.getLangArray = function (sortFunction) {
var array = new Array();
var length = this.engineInfo.stats.langArray.length;
for(let i = 0; i < length; i++) {
array[i] = this.engineInfo.stats.langArray[i];
}
if (sortFunction) {
array = array.sort(sortFunction);
}
return array;
};
Scrutari.Meta.prototype.getLangLabel = function (iso) {
if (this.engineInfo.langMap.hasOwnProperty(iso)) {
return this.engineInfo.langMap[iso];
} else {
return iso;
}
};
Scrutari.Meta.prototype.getThesaurus = function (code) {
var key = "code_" + code;
if (this.engineInfo.thesaurusMap.hasOwnProperty(key)) {
return this.engineInfo.thesaurusMap[key];
} else {
return null;
}
};
Scrutari.Meta.prototype.getThesaurusArray = function (sortFunction) {
var array = new Array();
var thesaurusMap = this.engineInfo.thesaurusMap;
var p=0;
for(let prop in thesaurusMap) {
array[p] = thesaurusMap[prop];
p++;
}
if (sortFunction) {
array = array.sort(sortFunction);
}
return array;
};
Scrutari.Meta.prototype.getTitle = function () {
return this.engineInfo.metadata.title;
};
Scrutari.Meta.prototype.withCategory = function () {
return this.engineInfo.hasOwnProperty("categoryMap");
};
Scrutari.Complete = {};
Scrutari.Complete.bythesaurusArray = function (fiche, scrutariMeta, motcleProvider) {
if (!fiche.hasOwnProperty("bythesaurusMap")) {
return false;
}
let thesaurusArray = scrutariMeta.getThesaurusArray();
let _bythesaurusArray = new Array();
for(let thesaurus of thesaurusArray) {
let codethesaurus = thesaurus.codethesaurus;
let key = "code_" + codethesaurus;
if (fiche.bythesaurusMap.hasOwnProperty(key)) {
let motcleArray = new Array();
for(let codemotcle of fiche.bythesaurusMap[key]) {
let motcle = motcleProvider(codemotcle);
if (motcle) {
motcleArray.push(motcle);
}
}
_bythesaurusArray.push({
thesaurus: thesaurus,
motcleArray: motcleArray
});
}
}
fiche._bythesaurusArray = _bythesaurusArray;
return true;
};
Scrutari.Complete.complementTitle = function (fiche, scrutariMeta) {
if (fiche.hasOwnProperty("mcomplementArray")) {
for(let mcomplement of fiche.mcomplementArray) {
mcomplement.title = scrutariMeta.getComplementTitle(fiche.codecorpus, mcomplement.number);
}
return true;
} else {
return false;
}
};
Scrutari.Complete.icon = function (fiche) {
if (fiche.hasOwnProperty("icon")) {
fiche._icon = fiche.icon;
return true;
} else if (fiche.hasOwnProperty("ficheicon")) {
fiche._icon = fiche.ficheicon;
return true;
} else {
return false;
}
};
Scrutari.Complete.markedAttributeArray = function (fiche, scrutariMeta, familyName ) {
let attributeArray = scrutariMeta.getAttributeArray(familyName);
if (attributeArray.length === 0) {
return false;
}
let objArray = new Array();
for(let attribute of attributeArray) {
if (fiche.mattrMap.hasOwnProperty(attribute.name)) {
objArray.push({
name: attribute.name,
title: attribute.title,
type: attribute.type,
valueArray: fiche.mattrMap[attribute.name]
});
}
}
fiche["_" + familyName + "AttributeArray"] = objArray;
return true;
};
Scrutari.Complete.motcleArray = function (fiche, motcleProvider) {
if (!fiche.hasOwnProperty("codemotcleArray")) {
return false;
}
let motcleArray = new Array();
for(let codemotcle of fiche.codemotcleArray) {
let motcle = motcleProvider(codemotcle);
if (motcle) {
motcleArray.push(motcle);
}
}
if (motcleArray.length > 0) {
fiche._motcleArray = motcleArray;
return true;
} else {
return false;
}
};
Scrutari.Complete.target = function (fiche, target) {
fiche._target = target;
return true;
};
Scrutari.Complete.thumbnail = function (fiche) {
if (fiche.hasOwnProperty("thumbnail")) {
fiche._thumbnail = fiche.thumbnail;
return true;
} else if (Scrutari.Complete.hasAttribute(fiche, "sct:thumbnail")) {
fiche._thumbnail = fiche.attrMap["sct:thumbnail"][0];
return true;
} else {
return false;
}
};
Scrutari.Complete.hasAttribute = function (fiche, attributeKey) {
if (!fiche.attrMap) {
return false;
}
if (attributeKey) {
return fiche.attrMap.hasOwnProperty(attributeKey);
} else {
return true;
}
};
Scrutari.Complete.hasMarkedAttribute = function (fiche, attributeKey) {
if (!fiche.mattrMap) {
return false;
}
if (attributeKey) {
return fiche.mattrMap.hasOwnProperty(attributeKey);
} else {
return true;
}
};
Scrutari.Result = function (ficheSearchResult, requestParameters, groupSortFunction) {
this.ficheSearchResult = ficheSearchResult;
this.requestParameters = requestParameters;
this.searchMeta = ficheSearchResult.searchMeta;
this.ficheGroupArray = ficheSearchResult.ficheGroupArray;
if ((groupSortFunction) && (this.ficheGroupArray.length > 1)) {
this.ficheGroupArray = this.ficheGroupArray.sort(groupSortFunction);
}
this.motcleMap = new Object();
if (ficheSearchResult.hasOwnProperty("motcleArray")) {
for(let motcle of ficheSearchResult.motcleArray) {
this.motcleMap["code_" + motcle.codemotcle] = motcle;
}
}
};
Scrutari.Result.newSearch = function (scrutariConfig, requestParameters, callback, apiErrorCallback) {
Scrutari.Ajax.loadFicheSearchResult(scrutariConfig, requestParameters, _ficheSearchResultCallback, apiErrorCallback);
function _ficheSearchResultCallback(ficheSearchResult) {
callback(new Scrutari.Result(ficheSearchResult, requestParameters, scrutariConfig.options.groupSortFunction));
}
};
Scrutari.Result.prototype.getQId = function () {
if (this.searchMeta) {
return this.searchMeta.qId;
} else {
return "";
}
};
Scrutari.Result.prototype.getQ = function () {
if (this.searchMeta) {
return this.searchMeta.q;
} else {
return "";
}
};
Scrutari.Result.prototype.getFicheCount = function () {
if (this.searchMeta) {
return this.searchMeta.ficheCount;
} else {
return -1;
}
};
Scrutari.Result.prototype.getFicheGroupType = function () {
var type = this.ficheSearchResult.ficheGroupType;
if (type === "none") {
type = "unique";
}
return type;
};
Scrutari.Result.prototype.getUniqueFicheArray = function () {
if (this.ficheGroupArray.length === 0) {
return new Array();
}
return this.ficheGroupArray[0].ficheArray;
};
Scrutari.Result.prototype.selectUniqueFicheArray = function (paginationLength, paginationNumber) {
var selectionArray = new Array();
if (this.ficheGroupArray.length === 0) {
return selectionArray;
}
var ficheArray = this.ficheGroupArray[0].ficheArray;
var startIndex = paginationLength * (paginationNumber - 1);
var length = ficheArray.length;
if (startIndex >= length) {
return selectionArray;
}
var min = Math.min(ficheArray.length, startIndex + paginationLength);
for(let i = startIndex; i < min; i++) {
selectionArray.push(ficheArray[i]);
}
return selectionArray;
};
Scrutari.Result.prototype.isUniquePaginationLoaded = function (paginationLength, paginationNumber) {
if (this.ficheGroupArray.length === 0) {
return true;
}
var ficheCount = this.getFicheCount();
var ficheArray = this.ficheGroupArray[0].ficheArray;
var length = ficheArray.length;
if (length === ficheCount) {
return true;
}
var endIndex = (paginationLength * paginationNumber) - 1;
if (endIndex < length) {
return true;
}
return false;
};
Scrutari.Result.prototype.loadUniquePagination = function (scrutariConfig, paginationLength, paginationNumber, callback) {
if (this.ficheGroupArray.length === 0) {
return true;
}
var group = this.ficheGroupArray[0];
if (!group) {
return;
}
var ficheCount = this.getFicheCount();
var ficheArray = group.ficheArray;
var length = ficheArray.length;
if (length === ficheCount) {
return;
}
var _existingFicheSearchResultCallback = function (ficheSearchResult) {
var newCount = ficheSearchResult.ficheGroupArray.length;
if (newCount > 0) {
group.ficheArray = group.ficheArray.concat(ficheSearchResult.ficheGroupArray[0].ficheArray);
}
if (callback) {
callback();
}
};
var requestParameters = {
qid: this.getQId(),
start: length +1,
limit: (paginationLength * (paginationNumber + 2)) - length
};
Scrutari.Ajax.loadExistingFicheSearchResult(scrutariConfig, requestParameters, _existingFicheSearchResultCallback);
};
Scrutari.Result.prototype.isCategoryPaginationLoaded = function (categoryName, paginationLength, paginationNumber) {
var group = this.getFicheGroupByCategoryName(categoryName);
if (!group) {
return true;
}
var categoryFicheCount = group.ficheCount;
var ficheArray = group.ficheArray;
var length = ficheArray.length;
if (length === categoryFicheCount) {
return true;
}
var endIndex = (paginationLength * paginationNumber) - 1;
if (endIndex < length) {
return true;
}
return false;
};
Scrutari.Result.prototype.loadCategoryPagination = function (scrutariConfig, categoryName, paginationLength, paginationNumber, callback) {
var group = this.getFicheGroupByCategoryName(categoryName);
if (!group) {
return;
}
var categoryFicheCount = group.ficheCount;
var ficheArray = group.ficheArray;
var length = ficheArray.length;
if (length === categoryFicheCount) {
return;
}
var requestParameters = {
qid: this.getQId(),
start: length +1,
limit: (paginationLength * (paginationNumber + 2)) - length,
starttype: "in:" + categoryName
};
Scrutari.Ajax.loadExistingFicheSearchResult(scrutariConfig, requestParameters, _existingFicheSearchResultCallback);
function _existingFicheSearchResultCallback(ficheSearchResult) {
for(let newGroup of ficheSearchResult.ficheGroupArray) {
if (newGroup.category.name === group.category.name) {
group.ficheArray = group.ficheArray.concat(newGroup.ficheArray);
}
}
callback();
}
};
Scrutari.Result.prototype.selectCategoryFicheArray = function (categoryName, paginationLength, paginationNumber) {
var selectionArray = new Array();
var ficheArray = this.getCategoryFicheArrayByName(categoryName);
var startIndex = paginationLength * (paginationNumber - 1);
var length = ficheArray.length;
if (startIndex >= length) {
return selectionArray;
}
var min = Math.min(ficheArray.length, startIndex + paginationLength);
for(let i = startIndex; i < min; i++) {
selectionArray.push(ficheArray[i]);
}
return selectionArray;
};
Scrutari.Result.prototype.getCategoryCount = function () {
return this.ficheGroupArray.length;
};
Scrutari.Result.prototype.getCategory = function (index) {
return this.ficheGroupArray[index].category;
};
Scrutari.Result.prototype.getFicheGroupByCategoryName = function (categoryName) {
var groupCount = this.ficheGroupArray.length;
for(let i = 0; i < groupCount; i++) {
let group = this.ficheGroupArray[i];
if ((group.category) && (group.category.name === categoryName)) {
return group;
}
}
return null;
};
Scrutari.Result.prototype.getCategoryFicheCount = function (index) {
return this.ficheGroupArray[index].ficheCount;
};
Scrutari.Result.prototype.getCategoryFicheCountByName = function (categoryName) {
for(let group of this.ficheGroupArray) {
if ((group.category) && (group.category.name === categoryName)) {
return group.ficheCount;
}
}
return 0;
};
Scrutari.Result.prototype.getCategoryFicheArray = function (index) {
return this.ficheGroupArray[index].ficheArray;
};
Scrutari.Result.prototype.getCategoryFicheArrayByName = function (categoryName) {
var categoryCount = this.getCategoryCount();
for(let i = 0; i < categoryCount; i++) {
let category = this.getCategory(i);
if (category.name === categoryName) {
return this.getCategoryFicheArray(i);
}
}
return new Array();
};
Scrutari.Result.prototype.getMotcle = function (code) {
var key = "code_" + code;
if (this.motcleMap.hasOwnProperty(key)) {
return this.motcleMap[key];
} else {
return null;
}
};
Scrutari.Result.prototype.getMotcleArray = function (motcleFilter) {
if (!motcleFilter) {
motcleFilter = _accept;
}
var result = new Array();
if (this.ficheSearchResult.hasOwnProperty("motcleArray")) {
for(let motcle of this.ficheSearchResult.motcleArray) {
if (motcleFilter(motcle)) {
result.push(motcle);
}
}
}
return result;
function _accept(motcle) {
return true;
}
};
Scrutari.Utils = {};
Scrutari.Utils.divideIntoColumns = function (objectArray, jqArgument, objectTemplate) {
var objectCount = objectArray.length;
if (objectCount === 0) {
return;
}
var $elements = Scrutari.convert(jqArgument);
var elementCount = $elements.length;
if (elementCount === 0) {
Scrutari.log("HtmlElement selection with jqArgument is empty ");
return;
}
var objectCount = objectArray.length;
if (objectCount <= elementCount) {
for(var i = 0; i < objectCount; i++) {
$($elements[i]).append(objectTemplate(objectArray[i]));
}
return;
}
var modulo = objectCount % elementCount;
var columnLength = (objectCount - modulo) / elementCount;
var start = 0;
var stop = 0;
for(var i = 0; i< elementCount; i++) {
var $element = $($elements[i]);
stop += columnLength;
if (i < modulo) {
stop++;
}
for(var j = start; j < stop; j++) {
$element.append(objectTemplate(objectArray[j]));
}
start = stop;
}
};
Scrutari.Utils.getTabArray = function (ficheCount, paginationLength, currentPaginationNumber) {
var result = new Array();
var paginationCount;
if (ficheCount <= paginationLength) {
paginationCount = 1;
return result;
} else {
var modulo = ficheCount % paginationLength;
paginationCount = (ficheCount - modulo) / paginationLength;
if (modulo > 0) {
paginationCount ++;
}
}
if (currentPaginationNumber > paginationCount) {
currentPaginationNumber = paginationCount;
}
var paginationNumberStart = 1;
var paginationNumberEnd = 9;
if (currentPaginationNumber > 6) {
paginationNumberStart = currentPaginationNumber - 3;
paginationNumberEnd = currentPaginationNumber + 3;
}
if (paginationNumberEnd > paginationCount) {
paginationNumberEnd = paginationCount;
}
if (paginationNumberStart > 1) {
result.push({
number: 1,
title: "1",
state: 'enabled'
});
result.push({
number: 0,
title: "…",
state: 'disabled'
});
}
for(var i = paginationNumberStart; i <= paginationNumberEnd; i++) {
var state = 'enabled';
if (i === currentPaginationNumber) {
state = 'active';
}
result.push({
number: i,
title: i.toString(),
state: state
});
}
if (paginationNumberEnd < paginationCount) {
result.push({
number: 0,
title: "…",
state: 'disabled'
});
}
return result;
};
Scrutari.Utils.disable = function (jqArgument) {
var $elements = Scrutari.convert(jqArgument);
$elements.prop('disabled', true);
return $elements;
};
Scrutari.Utils.enable = function (jqArgument) {
var $elements = Scrutari.convert(jqArgument);
$elements.prop('disabled', false);
return $elements;
};
Scrutari.Utils.uncheck = function (jqArgument) {
var $elements = Scrutari.convert(jqArgument);
$elements.prop('checked', false);
return $elements;
};
Scrutari.Utils.check = function (jqArgument) {
var $elements = Scrutari.convert(jqArgument);
$elements.prop('checked', true);
return $elements;
};
Scrutari.Utils.toggle = function (jqElement, stateDataKey) {
var state = jqElement.data(stateDataKey);
if (state === 'off') {
state = 'on';
} else {
state = 'off';
}
jqElement.data(stateDataKey, state);
return state;
};
Scrutari.Utils.toggle.disabled = function (jqArgument, state) {
var $elements = Scrutari.convert(jqArgument);
if (state === 'off') {
$elements.prop('disabled', true);
} else {
$elements.prop('disabled', false);
}
return $elements;
};
Scrutari.Utils.toggle.text = function (jqArgument, alterDataKey) {
var $elements = Scrutari.convert(jqArgument);
var length = $elements.length;
for(var i = 0; i < length; i++) {
var jqEl = $($elements[i]);
var currentText =jqEl.text();
var alterText = jqEl.data(alterDataKey);
jqEl.text(alterText);
jqEl.data(alterDataKey, currentText);
}
return $elements;
};
Scrutari.Utils.toggle.classes = function (jqArgument, state, onClass, offClass) {
var $elements = Scrutari.convert(jqArgument);
if (state === 'off') {
$elements.addClass(offClass).removeClass(onClass);
} else {
$elements.removeClass(offClass).addClass(onClass);
}
return $elements;
};
Scrutari.Utils.getBaseSortFunction = function (baseSortType, locales) {
var compareFunction = Scrutari.Utils.getCompareLocaleFunction(locales);
switch(baseSortType) {
case "fiche-count":
return _ficheCountSort;
case "title":
return _titleSort;
default:
return null;
}
function _ficheCountSort(base1, base2) {
var count1 = base1.stats.fiche;
var count2 = base2.stats.fiche;
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
} else {
return Scrutari.Utils.compareCodebase(base1, base2);
}
}
function _titleSort(base1, base2) {
var title1 = base1.title;
var title2 = base2.title;
if (!title1) {
title1 = "";
}
if (!title2) {
title2 = "";
}
var comp = compareFunction(title1, title2);
if (comp !== 0) {
return comp;
} else {
return Scrutari.Utils.compareCodebase(base1, base2);
}
}
};
Scrutari.Utils.getCorpusSortFunction = function (corpusSortType, locales) {
var _ficheCountSort = function (corpus1, corpus2) {
var count1 = corpus1.stats.fiche;
var count2 = corpus2.stats.fiche;
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
} else {
return Scrutari.Utils.compareCodecorpus(corpus1, corpus2);
}
};
var compareFunction = Scrutari.Utils.getCompareLocaleFunction(locales);
var _titleSort = function (corpus1, corpus2) {
var title1 = corpus1.title;
var title2 = corpus2.title;
if (!title1) {
title1 = "";
}
if (!title2) {
title2 = "";
}
var comp = compareFunction(title1, title2);
if (comp !== 0) {
return comp;
} else {
return Scrutari.Utils.compareCodecorpus(corpus1, corpus2);
}
};
switch(corpusSortType) {
case "fiche-count":
return _ficheCountSort;
case "title":
return _titleSort;
default:
return null;
}
};
Scrutari.Utils.getCategorySortFunction = function (categorySortType, locales) {
var compareFunction = Scrutari.Utils.getCompareLocaleFunction(locales);
switch(categorySortType) {
case "rank":
return _rankSort;
case "fiche-count":
return _ficheCountSort;
case "title":
return _titleSort;
default:
return null;
}
function _rankSort(category1, category2) {
let count1 = category1.rank;
let count2 = category2.rank;
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
} else {
var code1 = category1.name;
var code2 = category2.name;
if (code1 < code2) {
return -1;
} else if (code1 > code2) {
return 1;
} else {
return 0;
}
}
}
function _ficheCountSort(category1, category2) {
let count1 = category1.stats.fiche;
let count2 = category2.stats.fiche;
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
} else {
return _rankSort(category1, category2);
}
}
function _titleSort(category1, category2) {
let title1 = category1.title;
let title2 = category2.title;
if (!title1) {
title1 = "";
}
if (!title2) {
title2 = "";
}
let comp = compareFunction(title1, title2);
if (comp !== 0) {
return comp;
} else {
return _rankSort(category1, category2);
}
}
};
Scrutari.Utils.getLangSortFunction = function (langSortType, locales) {
var compareFunction = Scrutari.Utils.getCompareLocaleFunction(locales);
switch(langSortType) {
case "code":
return _codeSort;
case "fiche-count":
return _ficheCountSort;
case "title":
return _titleSort;
default:
return null;
}
function _codeSort(lang1, lang2) {
let code1 = lang1.lang;
let code2 = lang2.lang;
if (code1 < code2) {
return -1;
} else if (code1 > code2) {
return 1;
} else {
return 0;
}
}
function _ficheCountSort(lang1, lang2) {
let count1 = lang1.fiche;
let count2 = lang2.fiche;
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
} else {
return _codeSort(lang1, lang2);
}
}
function _titleSort(lang1, lang2) {
let title1 = lang1.title;
let title2 = lang2.title;
if (!title1) {
title1 = lang1.lang;
}
if (!title2) {
title2 = lang2.lang;
}
let comp = compareFunction(title1, title2);
if (comp !== 0) {
return comp;
} else {
return _codeSort(lang1, lang2);
}
}
};
Scrutari.Utils.getGroupSortFunction = function (groupSortType) {
switch(groupSortType) {
case "fiche-count":
return _ficheCountSort;
default:
return null;
}
function _ficheCountSort(group1, group2) {
let count1 = group1.ficheCount;
let count2 = group2.ficheCount;
if (count1 > count2) {
return -1;
} else if (count1 < count2) {
return 1;
} else {
let rank1 = group1.category.rank;
let rank2 = group1.category.rank;
if (rank1 < rank2) {
return -1;
} else if (rank1 > rank2) {
return 1;
} else {
return 0;
}
}
}
};
Scrutari.Utils.mark = function (markArray, classAttribute) {
if (!classAttribute) {
classAttribute = "scrutari-Mark";
}
var html = "";
var length = markArray.length;
for (var i = 0; i < length; i++) {
var obj = markArray[i];
if (typeof obj === 'string') {
html += Scrutari.escape(obj);
} else if (obj.s) {
html += "<span class='" + classAttribute + "'>";
html += Scrutari.escape(obj.s);
html += "</span>";
}
}
return html;
};
Scrutari.Utils.formatSearchSequence = function (client, scrutariResult) {
var q = scrutariResult.getQ();
q = q.replace(/\&\&/g, client.loc('_ and'));
q = q.replace(/\|\|/g, client.loc('_ or'));
return q;
};
Scrutari.Utils.render = function (templateString, object) {
var result = templateString;
for(var key in object) {
var normalReplace = new RegExp("{{:" + key + "}}", 'g');
var escapeReplace = new RegExp("{{>" + key + "}}", 'g');
var value = object[key];
result = result.replace(normalReplace, value);
result = result.replace(escapeReplace, Scrutari.escape(value));
}
return result;
};
Scrutari.Utils.compareCodebase = function (obj1, obj2) {
var code1 = obj1.codebase;
var code2 = obj2.codebase;
if (code1 < code2) {
return -1;
} else if (code1 > code2) {
return 1;
} else {
return 0;
}
};
Scrutari.Utils.compareCodecorpus = function (obj1, obj2) {
var code1 = obj1.codecorpus;
var code2 = obj2.codecorpus;
if (code1 < code2) {
return -1;
} else if (code1 > code2) {
return 1;
} else {
return 0;
}
};
Scrutari.Utils.getCompareLocaleFunction = function (locales) {
var _localeCompareSupportsLocales = function () {
try {
"a".localeCompare("b", "i");
} catch (exception) {
return exception.name === "RangeError";
}
return false;
};
var _localesCompare = function (string1, string2) {
return string1.localeCompare(string2, locales, {
usage: "sort",
sensitivity: "base",
ignorePunctuation: true});
};
var _oldCompare = function (string1, string2) {
string1 = string1.toLowerCase();
string2 = string2.toLowerCase();
return string1.localeCompare(string2);
};
if (_localeCompareSupportsLocales()) {
return _localesCompare;
} else {
return _oldCompare;
}
};
Scrutari.Utils.buildCorpusMap = function (scrutariMeta, arrays) {
var corpusMap = new Object();
var finalCount = 0;
if (arrays.categoryArray) {
finalCount++;
var arrayForCategories = scrutariMeta.getCorpusArrayForCategories(arrays.categoryArray);
for(var i = 0; i < arrayForCategories.length; i++) {
var key = "code_" + arrayForCategories[i];
if (corpusMap.hasOwnProperty(key)) {
corpusMap[key] = corpusMap[key] + 1;
} else {
corpusMap[key] = 1;
}
}
}
if (arrays.baseArray) {
finalCount++;
var arrayForBases = scrutariMeta.getCorpusArrayForBases(arrays.baseArray);
for(var i = 0; i < arrayForBases.length; i++) {
var key = "code_" + arrayForBases[i];
if (corpusMap.hasOwnProperty(key)) {
corpusMap[key] = corpusMap[key] + 1;
} else {
corpusMap[key] = 1;
}
}
}
if (arrays.corpusArrays) {
finalCount++;
for(var i = 0; i < arrays.corpusArrays.length; i++) {
var key = "code_" + arrays.corpusArrays[i];
if (corpusMap.hasOwnProperty(key)) {
corpusMap[key] = corpusMap[key] + 1;
} else {
corpusMap[key] = 1;
}
}
}
corpusMap.completeValue = finalCount;
return corpusMap;
};
Scrutari.Utils.checkKey = function (type, value) {
switch(type) {
case "base":
case "corpus":
return "code_" + value;
}
return value;
};
Scrutari.Loc = function (map) {
if (map) {
this.map = map;
} else {
this.map = new Object();
}
};
Scrutari.Loc.prototype.putAll = function (map) {
for(var key in map) {
this.map[key] = map[key];
}
};
Scrutari.Loc.prototype.putLoc = function (locKey, locText) {
this.map[locKey] = locText;
};
Scrutari.Loc.prototype.loc = function (locKey, ...values) {
if (!this.map.hasOwnProperty(locKey)) {
return locKey;
}
var text = this.map[locKey];
var length = values.length;
if ((length === 1) && (Array.isArray(values[0]))) {
values = values[0];
length = values.length;
}
if (length > 0) {
for(let i = 0; i < length; i++) {
let mark = "{" + i + "}";
text = text.replace(mark, values[i]);
}
}
return text;
};
Scrutari.Loc.prototype.escape = function (locKey, ...values) {
if ((values.length === 1) && (Array.isArray(values[0]))) {
values = values[0];
}
return Scrutari.escape(this.loc(locKey, values));
};
Scrutari.FilterState = function () {
this.empty = true;
this.langOnly = true;
this.all = {
category: true,
base: true,
corpus: true,
lang: true
};
this.maps = {
category: {},
base: {},
corpus: {},
lang: {}
};
this.titles = {
category: [],
base: [],
corpus: [],
lang: []
};
};
Scrutari.FilterState.prototype.contains = function (type, key) {
if (this.all[type]) {
return true;
}
key = Scrutari.Utils.checkKey(type, key);
return this.maps[type].hasOwnProperty(key);
};
Scrutari.FilterState.prototype.add = function (type, key, title) {
this.all[type] = false;
this.empty = false;
if (type !== "lang") {
this.langOnly = false;
}
key = Scrutari.Utils.checkKey(type, key);
if (!this.maps[type].hasOwnProperty(key)) {
if (!title) {
title = key;
}
this.maps[type][key] = title;
this.titles[type].push(title);
}
};
Scrutari.Stats = function (scrutariMeta) {
this.unitArray = new Array();
var maps = {
category: {},
base: {},
corpus: {},
lang: {}
};
this.maps = maps;
this.filterState = null;
for(let corpus of scrutariMeta.getCorpusArray()) {
let langArray = corpus.stats.langArray;
let category = scrutariMeta.getCategoryForCorpus(corpus.codecorpus);
let categoryName = "";
if (category) {
categoryName = category.name;
}
for(let lang of langArray) {
let unit = new Scrutari.Stats.Unit(categoryName, corpus.codebase, corpus.codecorpus, lang.lang, lang.fiche);
this.unitArray.push(unit);
_addInMap("category", unit, categoryName);
_addInMap("base", unit, "code_" + corpus.codebase);
_addInMap("corpus", unit, "code_" + corpus.codecorpus);
_addInMap("lang", unit, lang.lang);
}
}
function _addInMap(type, unit, key) {
var map = maps[type];
if (!map.hasOwnProperty(key)) {
map[key] = new Array();
}
map[key].push(unit);
}
};
Scrutari.Stats.prototype.update = function (filterState) {
this.filterState = filterState;
};
Scrutari.Stats.prototype.getFicheCount = function (type, key) {
key = Scrutari.Utils.checkKey(type, key);
var map = this.maps[type];
if (!map.hasOwnProperty(key)) {
return 0;
}
var count = 0;
for(let unit of map[key]) {
count += unit.check(this.filterState);
}
return count;
};
Scrutari.Stats.Unit = function (category, base, corpus, lang, value) {
this.category = category;
this.base = base;
this.corpus = corpus;
this.lang = lang;
this.value = value;
};
Scrutari.Stats.Unit.prototype.check = function (filterState) {
if (!filterState) {
return this.value;
}
if (!filterState.contains("category", this.category)) {
return 0;
}
if (!filterState.contains("base", this.base)) {
return 0;
}
if (!filterState.contains("corpus", this.corpus)) {
return 0;
}
if (!filterState.contains("lang", this.lang)) {
return 0;
}
return this.value;
};
Scrutari.Client = function (scrutariConfig, clientId) {
this.scrutariConfig = scrutariConfig;
this.clientId = clientId;
this.scrutariMeta = null;
this.stats = null;
this.isWaiting = false;
this.mainCurrentScrutariResult = null;
this.currentScrutariResult = null;
this.options = {
withCorpus: false,
baseSort: "fiche-count",
corpusSort: "fiche-count",
categorySort: "rank",
langSort: "code",
initialQuery: "",
initialQId: "",
initialFilters: null,
permalinkPattern: null,
ficheTarget: "_blank",
ignoreIcon: false,
ignoreThumbnail: false,
ficheBodyList: null,
mainTitle: null,
hooks: {}
};
this._locInstance = new Scrutari.Loc();
this._ignoreArray = new Array();
this._ficheBodyTemplateArray = [
"fiche_mtitre",
"fiche_msoustitre",
"fiche_year",
"fiche_primaryattributearray",
"fiche_mcomplementarray",
"fiche_secondaryattributearray",
"fiche_motclearray",
"fiche_bythesaurusarray"
];
this._structureMap = {};
this._templateMap = {};
this._scrutariResultMap = {};
this._historyNumber = 0;
this.functions = {};
if (typeof SCRUTARI_L10N !== 'undefined') {
this._locInstance.putAll(SCRUTARI_L10N);
}
if (typeof SCRUTARI_HTML !== 'undefined') {
this._htmlObject = SCRUTARI_HTML;
}
if (typeof SCRUTARI_FRAMEWORKINIT === 'function') {
SCRUTARI_FRAMEWORKINIT(this);
}
};
Scrutari.Client.prototype.loc = function (locKey) {
return this._locInstance.loc(locKey);
};
Scrutari.Client.prototype.toPermalink = function (qId) {
if (this.options.permalinkPattern) {
return this.scrutariConfig.getPermalinkUrl(qId, this.options.permalinkPattern);
}
return null;
};
Scrutari.Client.prototype.storeResult = function (historyName, scrutariResult) {
this._scrutariResultMap[historyName] = scrutariResult;
};
Scrutari.Client.prototype.unstoreResult = function (historyName) {
this._scrutariResultMap[historyName] = null;
};
Scrutari.Client.prototype.getResult = function (historyName) {
if (this._scrutariResultMap.hasOwnProperty(historyName)) {
return this._scrutariResultMap[historyName];
} else {
return null;
}
};
Scrutari.Client.prototype.newHistoryNumber = function () {
this._historyNumber++;
return this._historyNumber;
};
Scrutari.Client.prototype.ignoreElement = function (elementName) {
return $.inArray(elementName, this._ignoreArray) > -1;
};
Scrutari.Client.prototype.getTemplate = function (templateName) {
var template = this.hook("getTemplate", templateName);
if (template) {
if (typeof template === "function") {
return template;
} else {
Scrutari.log("getTemplate hook does not return function for template name: " + templateName);
}
}
if (templateName.indexOf(":") === -1) {
templateName = "scrutari:" + templateName;
}
template = $.templates[templateName];
if (!template) {
return function () {
return "Unknown template : " + templateName;
};
} else {
return template;
}
};
Scrutari.Client.prototype.render = function (templateName, context, helpers) {
var templateFunction = this.getTemplate(templateName);
return templateFunction(context, helpers);
};
Scrutari.Client.prototype.hook = function (name) {
if (!this.options.hooks.hasOwnProperty(name)) {
return;
}
var hook = this.options.hooks[name];
if (typeof hook === "function") {
var newArgs = new Array();
var argLength = arguments.length;
if (argLength > 1) {
for(let i = 1; i < argLength; i++) {
newArgs.push(arguments[i]);
}
}
hook.apply(this, newArgs);
}
};
Scrutari.Client.prototype.getFicheBodyTemplateArray = function (fiche, categoryName) {
var array = this.hook("getFicheBodyTemplateArray", fiche, categoryName);
if (array) {
return array;
} else {
return this._ficheBodyTemplateArray;
}
};
Scrutari.Client.prototype.$ = function (properties) {
return Scrutari.$("#" + this.clientId, properties);
};
Scrutari.Client.prototype.$area = function (name, action) {
var $area = this.$({scrutariArea: name});
if (action) {
switch(action) {
case 'show':
this.show ($area);
break;
case 'hide':
this.hide($area);
break;
}
}
return $area;
};
Scrutari.Client.prototype.$block = function (name, action) {
var $block = this.$({scrutariBlock: name});
if (action) {
switch(action) {
case 'show':
this.show ($block);
break;
case 'hide':
this.hide($block);
break;
}
}
return $block;
};
Scrutari.Client.prototype.$button = function (name, target) {
if (target) {
return this.$({scrutariButton: name, scrutariTarget: target});
} else {
return this.$({scrutariButton: name});
}
};
Scrutari.Client.prototype.$count = function (name, action, value) {
var $count = this.$({scrutariCount: name});
if (action) {
switch(action) {
case 'update':
if (!value) {
value = 0;
}
Scrutari.$($count, {scrutariRole: "value"}).html(this.formatNumber(value));
break;
}
}
return $count;
};
Scrutari.Client.prototype.$form = function (name) {
return this.$({scrutariForm: name});
};
Scrutari.Client.prototype.$group = function (name) {
return this.$({scrutariGroup: name});
};
Scrutari.Client.prototype.$hidden = function (name, action) {
var $hidden = this.$({scrutariHidden: name});
if (action) {
switch(action) {
case 'show':
this.show ($hidden);
break;
case 'hide':
this.hide($hidden);
break;
}
}
return $hidden;
};
Scrutari.Client.prototype.$input = function (name, value) {
if (value) {
return this.$({_element: "input", _name: name, _value: value});
} else {
return this.$({_element: "input", _name: name});
}
};
Scrutari.Client.prototype.$input_checked = function (name, value) {
if (value) {
return this.$({_element: "input", _name: name, _value: value, _checked: true});
} else {
return this.$({_element: "input", _name: name, _checked: true});
}
};
Scrutari.Client.prototype.$label = function (name) {
return this.$({scrutariLabel: name});
};
Scrutari.Client.prototype.$link = function (name) {
return this.$({scrutariLink: name});
};
Scrutari.Client.prototype.$modal = function (name, action) {
var $modal = this.$({scrutariModal: name});
if ((action) && (this.functions.hasOwnProperty("modalAction"))) {
this.functions.modalAction($modal, action);
}
return $modal;
};
Scrutari.Client.prototype.$panel = function (name, action) {
var $panel = this.$({scrutariPanel: name});
if (action) {
switch(action) {
case 'show':
this.show ($panel);
break;
case 'hide':
this.hide($panel);
break;
}
}
return $panel;
};
Scrutari.Client.prototype.$title = function (name, action) {
var $title = this.$({scrutariTitle: name});
if (action) {
switch(action) {
case 'show':
this.show ($title);
break;
case 'hide':
this.hide($title);
break;
}
}
return $title;
};
Scrutari.Client.prototype.show = function (jqArgument) {
var $elements = Scrutari.convert(jqArgument);
$elements.removeClass("scrutari-Hidden");
};
Scrutari.Client.prototype.hide = function (jqArgument) {
var $elements = Scrutari.convert(jqArgument);
$elements.addClass("scrutari-Hidden");
};
Scrutari.Client.prototype.scrollToResult = function () {
$(window).scrollTop(this.$area('result').offset().top);
};
Scrutari.Client.prototype.getStructureHtml = function (name) {
if (this._structureMap.hasOwnProperty(name)) {
return this._structureMap[name];
} else {
Scrutari.log("Unknown structure: " + name);
return "";
}
};
Scrutari.Client.prototype.getStructureNameArray = function () {
var result = new Array();
for(let prop in this._structureMap) {
result.push(prop);
}
return result;
};
Scrutari.Client.prototype.getTemplateHtml = function (name) {
if (this._templateMap.hasOwnProperty(name)) {
return this._templateMap[name];
} else {
Scrutari.log("Unknown template: " + name);
return "";
}
};
Scrutari.Client.prototype.formatNumber = function (number) {
if (Number.prototype.toLocaleString) {
return number.toLocaleString(this.scrutariConfig.lang);
} else {
return number;
}
};
Scrutari.Client.init = function (scrutariConfig, clientId, options, callback) {
if (!$.templates) {
throw new Error("JsRender is not installed");
}
$.views.helpers("scrutari_mark", function(markArray) {
return Scrutari.Utils.mark(markArray);
});
Scrutari.Meta.load(scrutariConfig, function (scrutariMeta) {
var client = new Scrutari.Client(scrutariConfig, clientId);
$.views.helpers({
scrutari_client: client,
scrutari_loc: function(key, ...values) {
return client.loc(key, values);
},
scrutari_format: function(number) {
return client.formatNumber(number);
}
});
client.scrutariMeta = scrutariMeta;
client.stats = new Scrutari.Stats(scrutariMeta);
_checkOptions(client, options, scrutariMeta);
_initMaps(client);
Scrutari.Client.Ui.init(client);
if (callback) {
callback(client);
}
});
function _checkOptions (client, options, scrutariMeta) {
var defaultOptions = scrutariMeta.getDefaultOptions();
for(let key in defaultOptions) {
client.options[key] = defaultOptions[key];
}
if (options) {
for(let key in options) {
client.options[key] = options[key];
}
if (options.locMap) {
client._locInstance.putAll(options.locMap);
}
if (options.ignoreList) {
let ignoreList = options.ignoreList;
let ignoreArray;
if (typeof ignoreList === "string") {
ignoreArray = ignoreList.split(",");
} else if (Array.isArray(ignoreList)) {
ignoreArray = ignoreList;
}
if (ignoreArray) {
for(let ignore of ignoreArray) {
client._ignoreArray.push(ignore.trim());
}
}
}
if (options.ficheBodyList) {
let ficheBodyList = options.ficheBodyList;
let array1;
if (typeof ficheBodyList === "string") {
array1 = ficheBodyList.split(",");
} else if (Array.isArray(ficheBodyList)) {
array1 = ficheBodyList;
}
if (array1) {
let array2 = new Array();
for(let token of array1) {
token = token.trim();
if (token.length > 0) {
array2.push(token);
}
}
if (array2.length > 0) {
client._ficheBodyTemplateArray = array2;
}
}
}
}
}
function _initHtmlObject (client, htmlObject) {
if (htmlObject) {
if (htmlObject.structure) {
for(var key in htmlObject.structure) {
client._structureMap[key] = htmlObject.structure[key];
}
}
if (htmlObject.templates) {
for(var key in htmlObject.templates) {
client._templateMap[key] = htmlObject.templates[key];
}
}
}
}
function _initMaps (client) {
_initHtmlObject(client, client._htmlObject);
_initHtmlObject(client, options.htmlObject);
$("script[type='text/x-scrutari-structure']").each(function (index, element) {
client._structureMap[element.dataset.name] = $(element).html();
});
$("script[type='text/x-scrutari-template']").each(function (index, element) {
client._templateMap[element.dataset.name] = $(element).html();
});
for(var name in client._templateMap) {
var templateText = client._templateMap[name];
templateText = templateText.replace(/tmpl=\"([-_0-9a-z]+)\"/g, 'tmpl="scrutari:$1"');
$.templates("scrutari:" + name, templateText);
}
}
};
Scrutari.Client.Result = {};
Scrutari.Client.Result.show = function (client, scrutariResult, searchOrigin) {
client.$hidden("start", 'show');
var ficheCount = scrutariResult.getFicheCount();
client.$count("stats-result", 'update', ficheCount);
var $ficheDisplayBlock = client.$block('ficheDisplay');
$ficheDisplayBlock.empty();
client.currentScrutariResult = scrutariResult;
if (searchOrigin === "mainsearch") {
Scrutari.Client.Result.setCurrentMain(client, scrutariResult);
Scrutari.Client.Result.addToHistory(client, scrutariResult);
} else if (searchOrigin === "subsearch") {
let subsearchText = "+ " + Scrutari.Utils.formatSearchSequence(client, scrutariResult) + " = " + scrutariResult.getFicheCount();
if (client.currentHistoryName) {
Scrutari.$(client.$block(client.currentHistoryName), {scrutariRole: "subsearch"}).text(subsearchText);
}
}
if (ficheCount === 0) {
client.$hidden("empty", 'hide');
let withFilter;
if (searchOrigin === "subsearch") {
withFilter = true;
} else {
withFilter = _hasFilter(scrutariResult.requestParameters);
}
$ficheDisplayBlock.html(client.render("emptyfichedisplay", {withFilter: withFilter, scrutariResult: scrutariResult}));
return;
}
client.$hidden("empty", 'show');
if (ficheCount >= client.scrutariConfig.options.subsearchThreshold) {
client.$hidden("threshold", 'show');
} else {
client.$hidden("threshold", 'hide');
}
var qId = scrutariResult.getQId();
var permalink = client.toPermalink(qId);
if (permalink) {
client.$link("permalink").attr("href", permalink).html(permalink);
}
_updateDownloadHref("ods");
_updateDownloadHref("csv");
_updateDownloadHref("atom");
if (scrutariResult.getFicheGroupType() === 'category') {
var contextObj = {
scrutariResult: scrutariResult,
array: new Array()
};
var categoryCount = scrutariResult.getCategoryCount();
for(let i = 0; i < categoryCount; i++) {
let category = scrutariResult.getCategory(i);
let metaCategory = client.scrutariMeta.getCategory(category.name);
if (metaCategory) {
category = metaCategory;
} else {
category.phraseMap = {};
category.attrMap = {};
}
contextObj.array.push({
category: category,
active: (i === 0),
fichestat: scrutariResult.getCategoryFicheCount(i)
});
}
$ficheDisplayBlock.html(client.render("categoryfichedisplay", contextObj));
for(let i = 0; i < categoryCount; i++) {
let category = scrutariResult.getCategory(i);
Scrutari.Client.Result.categoryPaginationChange(client, category.name, 1);
}
} else {
$ficheDisplayBlock.html(client.render("uniquefichedisplay", {scrutariResult: scrutariResult}));
Scrutari.Client.Result.uniquePaginationChange(client, 1);
}
client.hook("showResult", scrutariResult, searchOrigin);
function _updateDownloadHref(extension) {
client.$link(extension).attr("href", client.scrutariConfig.getDownloadUrl(qId, extension));
}
function _hasFilter(requestParameters) {
for(var prop in requestParameters) {
switch(prop) {
case "baselist":
case "corpuslist":
case "categorylist":
case "langlist":
var value = requestParameters[prop];
if (value) {
return true;
}
}
if (prop.indexOf("flt") === 0) {
return true;
}
}
return false;
}
};
Scrutari.Client.Result.displayError = function (client, error, searchOrigin) {
if (error.parameter !== "q") {
Scrutari.logError(error);
return;
}
var title = client.loc(error.key);
if (title !== error.key) {
var alertMessage = title;
if (error.hasOwnProperty("array")) {
alertMessage += client.loc('_ colon');
for(var i = 0; i < error.array.length; i++) {
alertMessage += "\n";
var obj = error.array[i];
alertMessage += "- ";
alertMessage += client.loc(obj.key);
if (obj.hasOwnProperty("value")) {
alertMessage += client.loc('_ colon');
alertMessage += " ";
alertMessage += obj.value;
}
}
}
alert(alertMessage);
} else {
Scrutari.logError(error);
}
};
Scrutari.Client.Result.uniquePaginationChange = function (client, paginationNumber) {
var paginationLength = client.scrutariConfig.options.paginationLength;
var scrutariResult = client.currentScrutariResult;
var html = "";
if (!scrutariResult.isUniquePaginationLoaded(paginationLength, paginationNumber)) {
if (client.isWaiting) {
return;
}
client.$block("fiches").html(client.render("ficheloading", {scrutariResult: scrutariResult}));
client.isWaiting = true;
scrutariResult.loadUniquePagination(client.scrutariConfig, paginationLength, paginationNumber, _paginationCallback);
return;
}
var paginationFicheArray = scrutariResult.selectUniqueFicheArray(paginationLength, paginationNumber);
var ficheTemplate = client.getTemplate("fiche");
for(let fiche of paginationFicheArray) {
html += ficheTemplate(Scrutari.Client.Result.completeFiche(client, scrutariResult, fiche));
}
client.$block("fiches").html(html);
var tabArray = Scrutari.Utils.getTabArray(scrutariResult.getFicheCount(), paginationLength, paginationNumber);
var template = client.getTemplate("tabs");
client.$block("topPagination").html(template({
tabArray: tabArray,
type: "unique",
position: "top"
}));
client.$block("bottomPagination").html(template({
tabArray: tabArray,
type: "unique",
position: "bottom"
}));
client.hook("paginationChange", paginationFicheArray, {paginationNumber:paginationNumber});
function _paginationCallback () {
client.isWaiting = false;
Scrutari.Client.Result.uniquePaginationChange(client, paginationNumber);
}
};
Scrutari.Client.Result.categoryPaginationChange = function (client, categoryName, paginationNumber) {
var paginationLength = client.scrutariConfig.options.paginationLength;
var scrutariResult = client.currentScrutariResult;
var html = "";
if (!scrutariResult.isCategoryPaginationLoaded(categoryName, paginationLength, paginationNumber)) {
client.$block("fiches_" + categoryName).html(client.render("ficheloading", {scrutariResult: scrutariResult}));
if (client.isWaiting) {
return;
}
client.isWaiting = true;
scrutariResult.loadCategoryPagination(client.scrutariConfig, categoryName, paginationLength, paginationNumber, _paginationCallback);
return;
}
var paginationFicheArray = scrutariResult.selectCategoryFicheArray(categoryName, paginationLength, paginationNumber);
var ficheTemplate = client.getTemplate("fiche");
for(let fiche of paginationFicheArray) {
html += ficheTemplate(Scrutari.Client.Result.completeFiche(client, scrutariResult, fiche, categoryName));
}
client.$block("fiches_" + categoryName).html(html);
var tabArray = Scrutari.Utils.getTabArray(scrutariResult.getCategoryFicheCountByName(categoryName), paginationLength, paginationNumber);
var template = client.getTemplate("tabs");
client.$block("topPagination_" + categoryName).html(template({
tabArray: tabArray,
type: "category",
category: categoryName,
position: "top"
}));
client.$block("bottomPagination_" + categoryName).html(template({
tabArray: tabArray,
type: "category",
category: categoryName,
position: "bottom"
}));
client.hook("paginationChange", paginationFicheArray, {categoryName: categoryName, paginationNumber:paginationNumber});
function _paginationCallback () {
client.isWaiting = false;
Scrutari.Client.Result.categoryPaginationChange(client, categoryName, paginationNumber);
}
};
Scrutari.Client.Result.addToHistory = function (client, scrutariResult) {
var $historyListBlock = client.$block("historyList");
if (!Scrutari.exists($historyListBlock)) {
return;
}
if (client.currentHistoryName) {
var $historyBlock = client.$block(client.currentHistoryName);
$historyBlock.removeClass("scrutari-history-Active");
Scrutari.$($historyBlock, {scrutariRole: "subsearch"}).empty();
client.show(Scrutari.$($historyBlock, {scrutariRole: "remove"}));
}
var historyName = "history_" + client.newHistoryNumber();
Scrutari.Client.Result.setCurrentHistory(client, historyName);
client.storeResult(historyName, scrutariResult);
var contextObj = {
scrutariResult: scrutariResult,
name: historyName,
fichestat: scrutariResult.getFicheCount(),
sequence: Scrutari.Utils.formatSearchSequence(client, scrutariResult)
};
$historyListBlock.prepend(client.render("history", contextObj));
};
Scrutari.Client.Result.loadHistory = function (client, historyName) {
var historyScrutariResult = client.getResult(historyName);
if (historyScrutariResult) {
var $historyBlock = client.$block(historyName);
client.currentScrutariResult = historyScrutariResult;
Scrutari.Client.Result.setCurrentMain(client, historyScrutariResult);
Scrutari.Client.Result.setCurrentHistory(client, historyName);
$historyBlock.addClass("scrutari-history-Active");
client.hide(Scrutari.$($historyBlock, {scrutariRole: "remove"}));
Scrutari.Client.Result.show(client, historyScrutariResult);
}
};
Scrutari.Client.Result.setCurrentHistory = function (client, historyName) {
if (client.currentHistoryName) {
var $historyBlock = client.$block(client.currentHistoryName);
$historyBlock.removeClass("scrutari-history-Active");
Scrutari.$($historyBlock, {scrutariRole: "subsearch"}).empty();
client.show (Scrutari.$($historyBlock, {scrutariRole: "remove"}));
}
client.currentHistoryName = historyName;
};
Scrutari.Client.Result.setCurrentMain = function (client, scrutariResult) {
client.mainCurrentScrutariResult = scrutariResult;
client.$block("currentSearchSequence").text(Scrutari.Utils.formatSearchSequence(client, scrutariResult) + " (" + scrutariResult.getFicheCount() + ")");
};
Scrutari.Client.Result.completeFiche = function(client, scrutariResult, fiche, categoryName) {
var scrutariMeta = client.scrutariMeta;
var options = client.options;
Scrutari.Complete.complementTitle(fiche, scrutariMeta);
Scrutari.Complete.motcleArray(fiche, _motcleProvider);
Scrutari.Complete.bythesaurusArray(fiche, scrutariMeta, _motcleProvider);
if (Scrutari.Complete.hasMarkedAttribute(fiche)) {
Scrutari.Complete.markedAttributeArray(fiche, scrutariMeta, "primary");
Scrutari.Complete.markedAttributeArray(fiche, scrutariMeta, "secondary");
}
if (!options.ignoreThumbnail) {
Scrutari.Complete.thumbnail(fiche);
}
if (!options.ignoreIcon) {
Scrutari.Complete.icon(fiche);
}
if (options.ficheTarget) {
Scrutari.Complete.target(fiche, options.ficheTarget);
}
fiche._bodyTemplateArray = client.getFicheBodyTemplateArray(fiche, categoryName);
client.hook("completeFiche", scrutariResult, fiche, categoryName);
return fiche;
function _motcleProvider(code) {
return scrutariResult.getMotcle(code);
}
};
Scrutari.Client.Ui = {};
Scrutari.Client.Ui.filterChange = function (client) {
var globalFicheCount = client.scrutariMeta.getGlobalFicheCount();
var filterState = Scrutari.Client.Ui.buildFilterState(client);
var filterFicheCount;
if (filterState.empty) {
filterFicheCount = client.scrutariMeta.getGlobalFicheCount();
} else {
filterFicheCount = -1;
}
client.stats.update(filterState);
if (!_checkFilterFicheCount("base")) {
if (!_checkFilterFicheCount("corpus")) {
if (!_checkFilterFicheCount("category")) {
_checkFilterFicheCount("lang");
}
}
}
_updateState("base");
_updateState("corpus");
_updateState("category");
_updateState("lang");
var filterTitlesArray = new Array();
_addFilterTitles("base", "_ label_base_one", "_ label_base_many");
_addFilterTitles("corpus", "_ label_corpus_one", "_ label_corpus_many");
_addFilterTitles("lang", "_ label_lang_one", "_ label_lang_many");
_addFilterTitles("category", "_ label_category_one", "_ label_category_many");
var $filterFicheCount = client.$count('stats-filter', 'update', filterFicheCount);
var $filterValue = Scrutari.$($filterFicheCount, {scrutariRole: "value"});
if (filterFicheCount === globalFicheCount) {
$filterValue.removeClass("scrutari-stats-Filter").removeClass("scrutari-stats-None");
client.$hidden('filter', 'hide');
} else if (filterFicheCount === 0) {
$filterValue.removeClass("scrutari-stats-Filter").addClass("scrutari-stats-None");
client.$hidden('filter', 'show');
} else {
$filterValue.addClass("scrutari-stats-Filter").removeClass("scrutari-stats-None");
client.$hidden('filter', 'show');
}
var $filterTitles = Scrutari.$($filterFicheCount, {scrutariRole: "titles"});
if (filterTitlesArray.length > 0) {
$filterTitles.html(filterTitlesArray.join(" | "));
} else {
$filterTitles.html("");
}
function _checkFilterFicheCount(type) {
var $stat = client.$({scrutariStatType: type});
if ($stat.length > 0) {
filterFicheCount = 0;
$stat.each(function (index, element) {
let key = element.dataset.scrutariStatKey;
filterFicheCount += client.stats.getFicheCount(type, key);
});
return true;
} else {
return false;
}
}
function _updateState(type) {
client.$({scrutariStatType: type}).each(function (index, element) {
var $el = $(element);
var key = element.dataset.scrutariStatKey;
var ficheCount = client.stats.getFicheCount(type, key);
var $statTitle = Scrutari.$parents($el, {scrutariRole: "stat-text"});
if (ficheCount != element.dataset.scrutariStatDefault) {
if (ficheCount === 0) {
$el.html("");
$statTitle.addClass("scrutari-panel-Excluded");
} else {
$statTitle.removeClass("scrutari-panel-Excluded");
$el.html(client.formatNumber(ficheCount) + " / ");
}
} else {
$el.html("");
$statTitle.removeClass("scrutari-panel-Excluded");
}
});
}
function _addFilterTitles(type, oneLocKey, manyLocKey) {
var array = filterState.titles[type];
if (array.length > 0) {
var locKey = (array.length === 1)?oneLocKey:manyLocKey;
filterTitlesArray.push(client.loc(locKey) + client.loc('_ colon') + " " + array.join(", "));
}
}
};
Scrutari.Client.Ui.buildRequestParameters = function (client) {
var requestParameters = new Object();
_checkFilter("baselist", "base");
_checkFilter("corpuslist", "corpus");
_checkFilter("categorylist", "category");
_checkFilter("langlist", "lang");
requestParameters["q-mode"] = client.$input_checked("q-mode").val();
var ponderation = client.$input_checked("ponderation").val();
if (ponderation === 'date') {
requestParameters.ponderation = '10,80,5,5';
}
var periode = $.trim(client.$input("periode").val());
if (periode) {
requestParameters["flt-date"] = periode;
}
if (Scrutari.exists(client.$input_checked("wildchar"))) {
requestParameters.wildchar = "end";
} else {
requestParameters.wildchar = "none";
}
return requestParameters;
function _checkFilter (paramName, target) {
if (client.$button("enablePanel", target).data("scrutariState") === "on") {
var $inputs = client.$input_checked(target);
var value = "";
for(var i = 0; i < $inputs.length; i++) {
if (i > 0) {
value += ",";
}
value += $inputs[i].value;
}
if (value.length > 0) {
requestParameters[paramName] = value;
}
}
}
};
Scrutari.Client.Ui.buildFilterState = function (client) {
var filterState = new Scrutari.FilterState();
_check("base");
_check("corpus");
_check("category");
_check("lang");
return filterState;
function _check (target) {
if (client.$button("enablePanel", target).data("scrutariState") !== "on") {
return;
}
client.$input_checked(target).each(function (index,element) {
filterState.add(target, element.value, element.dataset.scrutariTitle);
});
}
};
Scrutari.Client.Ui.init = function (client) {
var scrutariMeta = client.scrutariMeta;
Scrutari.Client.Ui.initHtml(client);
Scrutari.Client.Ui.initForms(client);
Scrutari.Client.Ui.initClicks(client);
Scrutari.Client.Ui.initMainTitle(client);
client.$count('stats-global', 'update', scrutariMeta.getGlobalFicheCount());
client.$hidden('init', 'show');
client.show(client.$button('parametersDisplay'));
var locales = client.scrutariConfig.lang;
var langArray = scrutariMeta.getLangArray();
if ((langArray.length > 1) && (Scrutari.exists(client.$panel('lang')))) {
for(var i = 0, len = langArray.length; i < len; i++) {
var title = "";
var code = langArray[i].lang;
var label = scrutariMeta.getLangLabel(code);
if (label !== code) {
title = label;
}
langArray[i].title = title;
}
var langSortFunction = Scrutari.Utils.getLangSortFunction(client.options.langSort, locales);
if (langSortFunction) {
langArray = langArray.sort(langSortFunction);
}
Scrutari.Utils.divideIntoColumns(langArray, client.$group("langColumns"), client.getTemplate("lang"));
client.$panel('lang', 'show');
}
if ((scrutariMeta.withCategory()) && (Scrutari.exists(client.$panel('category')))) {
var categoryArray = scrutariMeta.getCategoryArray(Scrutari.Utils.getCategorySortFunction(client.options.categorySort, locales));
Scrutari.Utils.divideIntoColumns(categoryArray, client.$group("categoryColumns"), client.getTemplate("category"));
client.$panel('category', 'show');
}
if (client.options.withCorpus) {
if (Scrutari.exists(client.$panel('corpus'))) {
var corpusArray = scrutariMeta.getCorpusArray(Scrutari.Utils.getCorpusSortFunction(client.options.corpusSort, locales));
if (corpusArray.length > 1) {
Scrutari.Utils.divideIntoColumns(corpusArray, client.$group("corpusColumns"), client.getTemplate("corpus"));
client.$panel('corpus', 'show');
}
}
} else {
if (Scrutari.exists(client.$panel('base'))) {
var baseArray = scrutariMeta.getBaseArray(Scrutari.Utils.getBaseSortFunction(client.options.baseSort, locales));
if (baseArray.length > 1) {
Scrutari.Utils.divideIntoColumns(baseArray, client.$group("baseColumns"), client.getTemplate("base"));
client.$panel('base', 'show');
}
}
}
var initialFilters = client.options.initialFilters;
if (initialFilters) {
_initFilter("baselist", "base");
_initFilter("corpuslist","corpus");
_initFilter("categorylist", "category");
_initFilter("langlist", "lang");
}
var initialQuery = client.options.initialQuery;
var initialQId = client.options.initialQId;
if (initialQuery) {
var $mainSearchForm = client.$form('mainsearch');
if (Scrutari.exists($mainSearchForm)) {
$mainSearchForm.find("input[name='q']").val(initialQuery);
$mainSearchForm.submit();
}
} else if (initialQId) {
var requestParameters = Scrutari.Client.Ui.buildRequestParameters(client);
requestParameters["qid"] = initialQId;
client.$modal("loading", 'show');
client.hook("newSearch", requestParameters, "qidsearch");
Scrutari.Result.newSearch(client.scrutariConfig, requestParameters, _mainsearchScrutariResultCallback, _mainScrutariErrorCallback);
}
function _initFilter (optionName, target) {
if (!initialFilters.hasOwnProperty(optionName)) {
return;
}
Scrutari.Client.Ui.initFilter(client, target, initialFilters[optionName].split(","));
}
function _initFilterByQuery (list, target) {
if (list) {
Scrutari.Client.Ui.initFilter(client, target, list.array);
}
}
function _mainsearchScrutariResultCallback (scrutariResult) {
var $mainSearchForm = client.$form('mainsearch');
$mainSearchForm.find("input[name='q']").val(scrutariResult.searchMeta.q);
$mainSearchForm.find("input[name='q-mode'][value='operation']").click();
var searchOptions = scrutariResult.searchMeta.options;
if (searchOptions) {
_initFilterByQuery(searchOptions.baselist, "base");
_initFilterByQuery(searchOptions.corpuslist, "corpus");
_initFilterByQuery(searchOptions.categorylist, "category");
_initFilterByQuery(searchOptions.langlist, "lang");
}
Scrutari.Client.Result.show(client, scrutariResult, "mainsearch");
client.$modal("loading", 'hide');
var $parametersDisplayButton = client.$button('parametersDisplay');
if ($parametersDisplayButton.data("scrutariState") === "on") {
$parametersDisplayButton.click();
}
}
function _mainScrutariErrorCallback (error) {
Scrutari.Client.Result.displayError(client, error, "mainsearch");
client.$modal("loading", 'hide');
}
};
Scrutari.Client.Ui.initHtml = function (client) {
var includedTexts = {};
var html = _getText("main");
html = html.replace(/_ [-_\.a-z0-9]+/g, function(match) {
return client.loc(match);
});
$("#" + client.clientId).html(html);
function _getText(name) {
if (name.endsWith('*')) {
return _getTextByPrefix(name.substring(0, name.length - 1));
}
if (includedTexts.hasOwnProperty(name)) {
Scrutari.log("Already included: " + name);
return "";
} else if (client.ignoreElement(name)) {
return "";
} else if ((name === "panel-base") && (client.options.withCorpus)) {
return "";
} else if ((name === "panel-corpus") && (!client.options.withCorpus)) {
return "";
} else if ((name === "result-share") && (!client.options.permalinkPattern)) {
return "";
}
includedTexts[name] = true;
var text = client.getStructureHtml(name);
text = text.replace(/{{([-a-zA-z0-9_]+\*?)}}/g, function (match, p1) {
return _getText(p1);
});
return text;
}
function _getTextByPrefix(namePrefix) {
var result = "";
for(let name of client.getStructureNameArray()) {
if (name.startsWith(namePrefix)) {
let text = _getText(name);
if (text.length > 0) {
if (result.length > 0) {
result = result + "\n";
}
result = result + text;
}
}
}
return result;
}
};
Scrutari.Client.Ui.initForms = function (client) {
client.$form('mainsearch').submit(function () {
var q = this["q"].value.trim();
if (q.length > 0) {
var requestParameters = Scrutari.Client.Ui.buildRequestParameters(client);
requestParameters["log"] = "all";
requestParameters["q"] = q;
client.$modal("loading", 'show');
client.hook("newSearch", requestParameters, "mainsearch");
Scrutari.Result.newSearch(client.scrutariConfig, requestParameters, _mainsearchScrutariResultCallback, _mainScrutariErrorCallback);
}
return false;
});
client.$form('subsearch').submit(function () {
var q = this["q"].value.trim();
if ((q.length > 0) && (client.mainCurrentScrutariResult)) {
var requestParameters = Scrutari.Client.Ui.buildRequestParameters(client);
requestParameters["q"] = q;
requestParameters["flt-qid"] = client.mainCurrentScrutariResult.getQId();
client.$modal("loading", 'show');
client.hook("newSearch", requestParameters, "subsearch");
Scrutari.Result.newSearch(client.scrutariConfig, requestParameters, _subsearchScrutariResultCallback, _subsearchScrutariErrorCallback);
}
return false;
});
function _mainsearchScrutariResultCallback (scrutariResult) {
Scrutari.Client.Result.show(client, scrutariResult, "mainsearch");
client.$modal("loading", 'hide');
var $parametersDisplayButton = client.$button('parametersDisplay');
if ($parametersDisplayButton.data("scrutariState") === "on") {
$parametersDisplayButton.click();
}
}
function _mainScrutariErrorCallback (error) {
Scrutari.Client.Result.displayError(client, error, "mainsearch");
client.$modal("loading", 'hide');
}
function _subsearchScrutariResultCallback (scrutariResult) {
Scrutari.Client.Result.show(client, scrutariResult, "subsearch");
client.$modal("loading", 'hide');
}
function _subsearchScrutariErrorCallback (error) {
Scrutari.Client.Result.displayError(client, error, "subsearch");
client.$modal("loading", 'hide');
}
};
Scrutari.Client.Ui.initClicks = function (client) {
$("#" + client.clientId).on("click", Scrutari.toCssQuery({scrutariButton: true}), function () {
var $this = $(this);
var action = this.dataset.scrutariButton;
var target = this.dataset.scrutariTarget;
switch(action) {
case 'enablePanel':
_enablePanel(this, target);
break;
case 'checkAll':
_checkAll(target);
break;
case 'uncheckAll':
_uncheckAll(target);
break;
case 'showModal':
client.$modal(target, 'show');
break;
case 'parametersDisplay':
let state = Scrutari.Utils.toggle($this, "scrutariState");
Scrutari.Utils.toggle.classes($this, state, "Scrutari-On", "");
if (state === 'on') {
client.$area('parameters', 'show');
} else {
client.$area('parameters', 'hide');
}
break;
case 'toggleBlock':
if (Scrutari.Utils.toggle($this, "scrutariState") === 'on') {
client.$block(target, 'show');
} else {
client.$block(target, 'hide');
}
break;
case 'removeHistory':
_removeHistory(target);
break;
case 'loadHistory':
_loadHistory(target);
break;
case 'categoryTab':
_categoryTab(this.dataset.scrutariCategory);
break;
case 'ficheTab':
_ficheTab(this);
break;
default:
Scrutari.log("Unknown action: " + action);
}
if ((this.tagName) && (this.tagName.toLowerCase() === 'a')) {
return false;
}
});
$("#" + client.clientId).on("click", "input", function () {
var name = this.name;
if (name) {
switch(name) {
case 'q-mode':
if (this.value === 'operation') {
Scrutari.Utils.disable("input[name='wildchar']");
} else {
Scrutari.Utils.enable("input[name='wildchar']");
}
break;
case 'lang':
case 'category':
case 'base':
case 'corpus':
_checkClick(name);
break;
}
}
});
function _checkClick (target) {
var $button = client.$button("enablePanel", target);
if ($button.data('scrutariState') === 'off') {
$button.click();
$(this).focus();
} else {
Scrutari.Client.Ui.filterChange(client);
}
}
function _checkAll (target) {
Scrutari.Utils.check("input[name='" + target + "']");
Scrutari.Client.Ui.filterChange(client);
}
function _uncheckAll (target) {
Scrutari.Utils.uncheck("input[name='" + target + "']");
Scrutari.Client.Ui.filterChange(client);
}
function _enablePanel (button, target) {
var $button = $(button);
var state = Scrutari.Utils.toggle($button, "scrutariState");
_enableChekButtons();
Scrutari.Utils.toggle.classes($button, state, "scrutari-On", "");
Scrutari.Utils.toggle.classes(client.$group(target + "Columns"), state, "", "scrutari-panel-ColumnDisabled");
Scrutari.Utils.toggle.text($button.children("span"), "scrutariAlternate");
var $filterLabel = client.$label(target + "Filter");
Scrutari.Utils.toggle.text($filterLabel, "scrutariAlternate");
Scrutari.Utils.toggle.classes($filterLabel, state, "scrutari-panel-Active", "scrutari-Disabled");
Scrutari.Client.Ui.filterChange(client);
function _enableChekButtons () {
let disabled = false;
if (state === 'off') {
disabled = true;
}
client.$button("checkAll", target).prop('disabled', disabled);
client.$button("uncheckAll", target).prop('disabled', disabled);
}
}
function _removeHistory (historyName) {
client.unstoreResult(historyName);
client.$block(historyName).remove();
}
function _loadHistory (historyName) {
Scrutari.Client.Result.loadHistory(client, historyName);
}
function _categoryTab (categoryName) {
client.$({scrutariRole: "category-content"}).each(function (index, element) {
if (element.dataset.scrutariCategory === categoryName) {
client.show(element);
} else {
client.hide(element);
}
});
client.$({scrutariRole: "category-tab"}).each(function (index, element) {
if (element.dataset.scrutariCategory === categoryName) {
element.classList.add("scrutari-On");
} else {
element.classList.remove("scrutari-On");
}
});
}
function _ficheTab (button) {
var newPaginationNumber = parseInt(button.dataset.scrutariNumber);
if (button.dataset.scrutariType === "unique") {
Scrutari.Client.Result.uniquePaginationChange(client, newPaginationNumber);
} else {
Scrutari.Client.Result.categoryPaginationChange(client, button.dataset.scrutariCategory, newPaginationNumber);
}
if (button.dataset.scrutariPosition === "bottom") {
client.scrollToResult();
}
}
};
Scrutari.Client.Ui.initMainTitle = function (client) {
var html = "";
var mainTitle = client.options.mainTitle;
if ((mainTitle) || (mainTitle === "")) {
if (typeof mainTitle === "function") {
html = mainTitle(client);
} else {
html = mainTitle;
}
} else {
html += client.loc('_ title_main');
html += " ";
var title = client.scrutariMeta.getTitle();
if (title) {
html += Scrutari.escape(title);
} else {
html += "[";
html += client.scrutariConfig.name;
html += "]";
}
}
client.$title('main').html(html);
};
Scrutari.Client.Ui.initFilter = function (client, target, checkedArray) {
var done = false;
for(var i = 0, len = checkedArray.length; i < len; i++) {
var $input = client.$input(target, checkedArray[i]);
if ($input.length > 0) {
$input.prop("checked", true);
done = true;
}
}
if (done) {
client.$button("enablePanel", target).click();
}
};