Newer
Older
istex-api-demo / js / main.js
/*global jquery: true, angular: true, $: true, require: true */
/*jslint node: true, browser: true, unparam: true */
/*jslint indent: 2 */
"use strict";
var globalSearchPage = {},
  globalSearchPageController = {},
  istexTemplate = {};
require.config({
  baseUrl: 'js/',
  paths: {
    'text': '../bower_components/requirejs-text/text',
    'qTip': ['//cdn.jsdelivr.net/qtip2/2.2.1/jquery.qtip']
  }
});

// Vérification que l'utilisateur n'utilise pas IE
$.reject({
  reject: {
    msie: true,
    trident: true
  },
  display: ['firefox', 'chrome'],
  imagePath: './img/browsers/',
  close: false,
  header: 'Le navigateur Internet Explorer n\'est pas supporté pour ce site',
  paragraph1: 'Nous vous invitons à installer et à utiliser un des navigateurs suivants :',
  paragraph2: ''
});

var istexApp = angular.module("istexApp", []);

// Contient l'historique de l'affinage
var searchPageHistory = [];

var search = function(searchPage, searchPageController) {

  var searchPageToInsert = $.extend(true, {}, searchPage);

  searchPageToInsert.currentPage = 1;
  searchPageToInsert.searchField = $("#searchField").val();
  searchPageToInsert.title = $("#titleField").val();
  searchPageToInsert.author = $("#authorField").val();
  searchPageToInsert.keywords = $("#themeField").val();
  searchPageToInsert.editor = [];
  searchPageToInsert.editor.push($("#editorField").val());
  searchPageToInsert.pubdate = undefined;
  searchPageToInsert.copyrightdate = undefined;
  searchPageToInsert.PDFWordCount = undefined;
  searchPageToInsert.PDFCharCount = undefined;
  searchPageToInsert.sortBy = undefined;
  searchPageToInsert.PDFVersion = [];
  searchPageToInsert.refBibsNative = [];
  searchPageToInsert.WOS = [];
  searchPageToInsert.language = [];

  searchPageHistory = [];
  $("#allResultsRefine").siblings().remove();
  searchPageController.search(searchPageToInsert, searchPageHistory);
};

istexApp.controller("istexAppCtrl", function($scope, $sce) {

  $scope.helper = {
    request: {},
    corpus: {},
    copyrightDate: {},
    pubDate: {},
    searchKeys: {},
    title: {},
    subject: {},
    author: {},
    score: {},
    PDFWordCount: {},
    PDFCharCount: {},
    PDFVersion: {},
    refBibsNative: {},
    WOS: {},
    lang: {},
    quality: {},
    sortBy: {},
    size: {},
    articleType: {}
  };

  $scope.app = {
    apiUrl: ""
  };

  /**
   * Permet d'exécuter <b>de facon sûre</b> une expression dans Angular
   * depuis l'exterieur du Framework.
   * @param Function fn
   * @returns null
   */
  $scope.safeApply = function(fn) {
    var phase = this.$root.$$phase;
    if (phase === "$apply" || phase === "$digest") {
      if (fn && (typeof fn === "function")) {
        fn();
      }
    } else {
      this.$apply(fn);
    }
  };
  globalSearchPageController.a = 3;
  $scope.search = function() {
    search(globalSearchPage, globalSearchPageController);
  };
});

require(["config"], function(config) {
  $(document).ready(function() {

    $("#pager-prototype").contents().appendTo(".pager-placeholder");

    /**
     * Istex tooltip
     * Pour déclencher le tooltip: data-toggle='istex-tooltip'
     * Par défaut le tooltip doit étre le premier element frère  'div.istex-tooltip'
     * sauf si l'attribut 'data-content-text' est précisé avec un selecteur.
     */
    $("[data-toggle='istex-tooltip']").each(function() {
      var $this = $(this),
        dataTooltipTarget = $this.data("tooltip-target"),
        $targetElement = dataTooltipTarget ? $this.find(dataTooltipTarget) : $this,
        dataContentText = $this.data("content-text"),
        $qtipContent = dataContentText ? $this.children(dataContentText) : $this.next("div.istex-tooltip"),
        position = {
          my: $qtipContent.data("my-position") || "left top",
          at: $qtipContent.data("at-position") || "right top"
        };

      $targetElement.qtip({
        content: {
          text: $qtipContent
        },
        show: {
          solo: true,
          delay: 382
        },
        hide: {
          //        event: false,
          fixed: true,
          delay: 146
        },
        position: {
          my: position.my,
          at: position.at
        },
        style: {
          def: false
        }
      });
    });

    $(document).on("resultsLoaded", function(e) {

      // Tooltip pour les icons des fichiers
      $(".download-links").find('a').each(function() {
        var $this = $(this),
          $thisImg = $this.children("img"),
          mimetype = $thisImg.attr("title");

        $thisImg
          .removeAttr("title")
          .qtip({
            content: {
              text: $("<h5><span class='label label-primary'>" + mimetype + " <span class='glyphicon glyphicon-file'></span></span></h5>" + "<p><b>" + $this.attr("href") + "</b></p>")
            },
            show: {
              solo: true,
              delay: 382
            },
            hide: {
              //            event: false,
              fixed: true,
              delay: 146
            },
            position: {
              my: "top left",
              at: "bottom center"
            },
            style: {
              def: false
            }
          });
      });

      /**
       * ellipse sur les abstracts et titles
       */
      var $tableResult = $("#tableResult"),
        dotdotdotConfig = {
          ellipsis: '…',
          watch: "window"
        };
      $tableResult.find("h4").dotdotdot(dotdotdotConfig);

      $tableResult
        .find(".abstract")
        .addClass("ellipsed")
        .dotdotdot(
          dotdotdotConfig
        )
        .click(function() {
          var $this = $(this);
          var content = $this.triggerHandler("originalContent");
          $this
            .toggleClass("ellipsed")
            .append(content)
            .trigger("update.dot");
        });

      // Retour au top
      if (!!$(document).scrollTop()) {
        $("html, body").animate({
          scrollTop: 0
        }, 600);
      }
    });
  });

  require(
    ["models/searchPage", "controllers/searchPageController"],
    function(searchPage, searchPageController) {

      globalSearchPage = searchPage;
      globalSearchPageController = searchPageController;

      var searchPageToInsert;

      $("#searchform").submit(function(event) {
        event.preventDefault();
        search(searchPage, searchPageController);
      });

      $("#advancedSearchForm").submit(function(event) {
        event.preventDefault();
        $("#searchform").submit();
      });

      $("#advancedSearchForm").on("input", ":input", function(event) {
        $("#searchform").submit();
      });

      // Pagination
      var $pager = $(".istex-pager");
      $pager.find(".prev").click(function(e) {
        e.preventDefault();
        searchPageToInsert = searchPageHistory[searchPageHistory.length - 1];
        searchPageToInsert.currentPage = searchPageToInsert.currentPage - 1;
        searchPageController.request(searchPageToInsert, $(".prev").attr("href"));
      });

      $pager.find(".first").click(function(e) {
        e.preventDefault();
        searchPageToInsert = searchPageHistory[searchPageHistory.length - 1];
        searchPageToInsert.currentPage = 1;
        searchPageController.request(searchPageToInsert, $(".first").attr("href"));
      });

      $pager.find(".next").click(function(e) {
        e.preventDefault();
        searchPageToInsert = searchPageHistory[searchPageHistory.length - 1];
        searchPageToInsert.currentPage = searchPageToInsert.currentPage + 1;
        searchPageController.request(searchPageToInsert, $(".next").attr("href"));
      });

      $pager.find(".last").click(function(e) {
        e.preventDefault();
        searchPageToInsert = searchPageHistory[searchPageHistory.length - 1];
        searchPageToInsert.currentPage = searchPageToInsert.numberOfPages;
        searchPageController.request(searchPageToInsert, $(".last").attr("href"));
      });

      // Tris
      $("#sortMenuChosen li a").click(function() {
        $("#sortMenu:first-child").html('Tri par : ' + $(this).text() + ' <span class="caret"></span>');
        searchPageToInsert = searchPageHistory[searchPageHistory.length - 1];
        searchPageHistory.pop();
        switch ($(this).text()) {
          case 'Qualité':
            searchPageToInsert.sortBy = undefined;
            break;
          case 'Date de publication (ancien-récent)':
            searchPageToInsert.sortBy = 'publicationDate[asc]';
            break;
          case 'Date de publication (récent-ancien)':
            searchPageToInsert.sortBy = 'publicationDate[desc]';
            break;
          case 'Titre (A-Z)':
            searchPageToInsert.sortBy = 'title[asc]';
            break;
          case 'Titre (Z-A)':
            searchPageToInsert.sortBy = 'title[desc]';
            break;
        }
        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      // Facettes

      var refineRoadClick = function() {
        var index = $(this).index();
        var searchPage = searchPageHistory[index];
        $(this).nextAll().remove();
        searchPageHistory = searchPageHistory.slice(0, index);
        searchPageController.search(searchPage, searchPageHistory);
      }

      $("#facetCorpus").on("click", "input", function() {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        if (this.checked) {
          if (searchPageToInsert.editor[0] === '-1') searchPageToInsert.editor = [];
          searchPageToInsert.editor.push(this.value);
        } else {
          var index = searchPageToInsert.editor.indexOf(this.value);
          searchPageToInsert.editor.splice(index, 1);
          if (searchPageToInsert.editor.length === 0) searchPageToInsert.editor.push('-1');
        }

        $("#refineRoad").append('<li><a href="#">corpusName:"' + this.value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#facetArticleType").on("click", "input", function() {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        if (this.checked) {
          searchPageToInsert.genre.push(this.value);
        } else {
          var index = searchPageToInsert.genre.indexOf(this.value);
          searchPageToInsert.genre.splice(index, 1);
        }
        $("#refineRoad").append('<li><a href="#">genre:"' + this.value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#slider-range-copyright").on("slide", function(event, ui) {
        $("#amountCopyrightDate").val(ui.values[0] + " à " + ui.values[1]);
      });

      $("#slider-range-copyright").on("slidestop", function(event, ui) {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        searchPageToInsert.copyrightdate = [];
        var value = "[" + ui.values[0] + " TO " + ui.values[1] + "]";
        searchPageToInsert.copyrightdate.push(value);

        $("#refineRoad").append('<li><a href="#">copyrightDate:"' + value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#slider-range-pubdate").on("slide", function(event, ui) {
        $("#amountPubDate").val(ui.values[0] + " à " + ui.values[1]);
      });

      $("#slider-range-pubdate").on("slidestop", function(event, ui) {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        searchPageToInsert.pubdate = [];
        var value = "[" + ui.values[0] + " TO " + ui.values[1] + "]";
        searchPageToInsert.pubdate.push(value);

        $("#refineRoad").append('<li><a href="#">publicationDate:"' + value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#slider-range-PDFWordCount").on("slide", function(event, ui) {
        $("#amountPDFWordCount").val(ui.values[0] + " à " + ui.values[1]);
      });

      $("#slider-range-PDFWordCount").on("slidestop", function(event, ui) {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        searchPageToInsert.PDFWordCount = [];
        var value = "[" + ui.values[0] + " TO " + ui.values[1] + "]";
        searchPageToInsert.PDFWordCount.push(value);

        $("#refineRoad").append('<li><a href="#">qualityIndicators.pdfWordCount:"' + value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#slider-range-PDFCharCount").on("slide", function(event, ui) {
        $("#amountPDFCharCount").val(ui.values[0] + " à " + ui.values[1]);
      });

      $("#slider-range-PDFCharCount").on("slidestop", function(event, ui) {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        searchPageToInsert.PDFCharCount = [];
        var value = "[" + ui.values[0] + " TO " + ui.values[1] + "]";
        searchPageToInsert.PDFCharCount.push(value);

        $("#refineRoad").append('<li><a href="#">qualityIndicators.pdfCharCount:"' + value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#slider-range-score").slider({
        step: 0.3
      });

      $("#slider-range-score").on("slide", function(event, ui) {
        $("#amountScore").val(ui.values[0] + " à " + ui.values[1]);
      });

      $("#slider-range-score").on("slidestop", function(event, ui) {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        searchPageToInsert.score = [];
        var value = "[" + ui.values[0] + " TO " + ui.values[1] + "]";
        searchPageToInsert.score.push(value);

        $("#refineRoad").append('<li><a href="#">qualityIndicators.score:"' + value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#facetPDFVersion").on("click", "input", function() {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        if (this.checked) {
          searchPageToInsert.PDFVersion.push(this.value);
        } else {
          var index = searchPageToInsert.PDFVersion.indexOf(this.value);
          searchPageToInsert.PDFVersion.splice(index, 1);
        }

        $("#refineRoad").append('<li><a href="#">qualityIndicators.pdfVersion:"' + this.value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#facetRefBibsNative").on("click", "input", function() {

        searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

        var bool = (this.value === 'T');
        if (this.checked) {
          searchPageToInsert.refBibsNative.push(bool);
        } else {
          var index = searchPageToInsert.refBibsNative.indexOf(bool);
          searchPageToInsert.refBibsNative.splice(index, 1);
        }

        $("#refineRoad").append('<li><a href="#">qualityIndicators.refBibsNative:"' + this.value + '"</a></li>');
        $("#refineRoad").children().last().click(refineRoadClick);

        searchPageController.search(searchPageToInsert, searchPageHistory);
      });

      $("#languages").autocomplete({
        minLength: 0,
        focus: function(event, ui) {
          $('#languages').val(ui.item.label);
        },
        select: function(event, ui) {
          $('#languages').val(ui.item.label);

          searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

          searchPageToInsert.language = [];
          searchPageToInsert.language.push(ui.item.value);
          $("#refineRoad").append('<li><a href="#">language:"' + ui.item.value + '"</a></li>');
          $("#refineRoad").children().last().click(refineRoadClick);

          searchPageController.search(searchPageToInsert, searchPageHistory);

          return false;
        }
      });

      $("#languages").on("click", function() {
        if ($('#languages').val() === "") $('#languages').autocomplete("search", "");
      });

      $("#wosCategories").autocomplete({
        minLength: 0,
        focus: function(event, ui) {
          $("#wosCategories").val(ui.item.label);
        },
        select: function(event, ui) {
          $("#wosCategories").val(ui.item.label);

          searchPageToInsert = $.extend(true, {}, searchPageHistory[searchPageHistory.length - 1]);

          searchPageToInsert.WOS = [];
          searchPageToInsert.WOS.push(ui.item.value);
          $("#refineRoad").append('<li><a href="#">categories.wos:"' + ui.item.value + '"</a></li>');
          $("#refineRoad").children().last().click(refineRoadClick);

          searchPageController.search(searchPageToInsert, searchPageHistory);

          return false;
        }
      });

      $("#wosCategories").on("click", function() {
        if ($('#wosCategories').val() === "") $('#wosCategories').autocomplete("search", "");
      });

      $("#resetLanguages").on("click", function() {
        searchPage.language = [];
        $('#languages').val("");
        searchPageController.search(searchPage, searchPageHistory);
      });

      $("#resetWos").on("click", function() {
        searchPage.WOS = [];
        $('#wosCategories').val("");
        searchPageController.search(searchPage, searchPageHistory);
      });

      $("button.js-resetFacet").on("click", function(event, ui) {
        $("#refineRoad").contents().slice(2).remove();
        searchPageToInsert = searchPageHistory[0];
        searchPageHistory = [];
        searchPageController.search(searchPageToInsert, searchPageHistory);
      });
    });

});