

// global exports
var Frank;

(function ($) {

  Frank = function(bibmash) {
    this.mash = bibmash;
    this.allLibraries = [];
    this.name = 'frank';
    this.selectlist = {};
    this.optionslist = {};
  };

  Frank.prototype.constructor = Frank;

  Frank.prototype.initializeUserOptions = function () {
    var frank = this;
    this.mash.getJSON(Drupal.settings.basePath + 'bibmash/frank_targets.php', {}, function (data, textStatus) {
      frank.allLibraries = data;
    });
    this.addLibrarySelector();
  };


  Frank.prototype.addLibrarySelector = function () {
    var mash = this;
    var box  = $('<div id="library-selector"></div>');
    var shader = $('<div id="lightbox-shader"></div>');

    var submitButton = $('<a class="submit" href="#library-availability"></a>')
      .text(Drupal.t('Save'))
      .attr('href', '#')
      .click(function () {
        var a = [];
        $('#library-selector .selections a')
          .each(function (i, element) {
            a.push($(element).text());
          });
        mash.submitUserLibraries(a);
        box.hide();
        shader.remove();
        window.location.reload();
      });

    var cancelButton = $('<a class="cancel"></a>')
      .text(Drupal.t('Cancel'))
      .attr('href', '#')
      .click(function () {
        box.hide();
        shader.remove();});

    // todo: move this ugly piece of html to drupal template?
    var form = $(Drupal.settings.bibmash.theme.bibmash_library_selector).submit(function () { return false; }).show();

    box.prepend(form);

    var input = $('<input id="library" type="text" size="8"></input>')
      .attr('autocomplete', 'off')
      .keyup(autocomplete_delayed(50, (function (self) {return function (args) { self.autocomplete(args); };})(this)));

    form.find('.options').before(input);

    $('body').prepend(box);
    box.hide();

    form.find('.buttons').append(cancelButton);
    form.find('.buttons').append(submitButton);


    this.displayUserLibraries(form);

    var frank = this;
    $('#library-selection')
      .html('<a href="#" class="user-selection">[' + Drupal.t('Choose your library') + ']</a>')
      .click(function () {
        frank.displayUserLibraries(form);
        box.show();
        $('body').append(shader);
      });
//    this.updateUserLibraryCount();
  };

  Frank.prototype.displayUserLibraries = function (form) {
    var selections = form.find('.selections');
    selections.find('.library-option').remove();
    var libraries = this.getUserLibraries();
    for (var i in libraries ) {
      this.librarySelector(selections, decodeURIComponent(libraries[i]), true);
    }
  };

  Frank.prototype.updateUserLibraryCount = function() {
    var libraries = this.getUserLibraries() || [];
    var count = libraries.length;
    var message = '';
    var alt = libraries.join(" \n");

    switch (count) {
    case 0:
      message = 'Valitse oma kirjastosi';
      alt = 'Klikkaa niin voit valita kirjastosi.';
//      $('.bibmash-area .recordfield.frank').hide();
      break;
    case 1:
      message = this.getUserLibraries()[0];
      break;
    default:
      message = count + ' kirjastoa valittuna';
      var string;
      break;
    }
    $('#library-selection .user-selection')
      .text(message).attr('title', alt);
  };


  Frank.prototype.submitUserLibraries = function (list) {
    for (var i in list) {
      list[i] = encodeURIComponent(list[i]);
    }
    this.mash.session.save({'frankLibraries' : list });
//    this.updateUserLibraryCount();
  };

  Frank.prototype.hasHelmet = function () {
    var libs = this.getUserLibraries();
    if (!libs || libs.length == 0) {
      return false;
    }
    var match = false;
    for (var i in libs) {
      if (libs[i].search(/helmet/i) != -1) {
        match = true;
        break;
      }
    }
    return match;
  };

  Frank.prototype.getUserLibraries = function () {
    var list = this.mash.session.load().frankLibraries;
    // for (var i in list) {
    //   list[i] = unescape(list[i]);
    // }
    return list;
  };

  Frank.prototype.find = function (library) {
    this.optionslist = {};
    var results = {'fi': [], 'sv' : []};

    for (var i in this.allLibraries) {
      var currentTarget = this.allLibraries[i];

      for (var j in this.allLibraries[i].terms) {
        var currentTerm = currentTarget.terms[j];

        if (currentTerm.substr(0, library.length) == library) {
          var result = {
            target : currentTarget.target,
            term: currentTerm
          };
          results[currentTarget.language].push(result);
          break;
        }
      }
    }
    return results;
  };


  Frank.prototype.autocomplete = function() {
    var val = $('#library').val();
    //  if (val.length > 2) {
    var results = this.find(val);
    var selections = $('#selector-element .options');

    $('.options a').parent().remove();
    for (var lang in results) {
      for (var k in results[lang]) {
        var target = results[lang][k].target;
        this.librarySelector(selections, target, false);
      }
    }
    //  }
  };


  Frank.prototype.selectHandler = function (selected, target) {
    var frank = this;

    if (selected) {
      return function () {
        if (frank.selectlist[$(this).text()] == true) {
          return false;
        }
        $(this).unbind();
        delete frank.optionslist[$(this).text()];
        $(this).click(frank.selectHandler(false)).parent().appendTo('#selector-element .selections');
        frank.selectlist[$(this).text()] = true;
        return false;
      }
    }
    else {
      return function () {
        $(this).unbind();
        delete frank.selectlist[$(this).text()];

        if (frank.optionslist[$(this).text()] == true) {
          $(this).click(frank.selectHandler(true)).parent().remove();
        }
        else {
          $(this).click(frank.selectHandler(true)).parent().prependTo('#selector-element .options');
        }
        return false;
      }
    }
  };

  Frank.prototype.librarySelector = function (selections, target, checked) {
    var input = $('<a href="#">' + target + '</a>').click(this.selectHandler(!checked));
    var container = $('<div class="library-option"></div>').prepend(input);
    if (checked) {
      this.selectlist[target] = true;
    }
    else {
      this.optionslist[target] = true;
    }
    selections.append(container);
  };

  function autocomplete_delayed(timeout, callback) {
    return function () {
      if (autocomplete_delayed.currentTimeout) {
        clearTimeout(autocomplete_delayed.currentTimeout);
      }
      autocomplete_delayed.currentTimeout =
        setTimeout(callback, timeout);
    };
  }
    
})(jQuery);
;

