text: 'use strict';
  /*global __plugin, require, module, exports*/
  /************************************************************************
  ## Signs Module
  
  The Signs Module can be used by plugin authors to create interactive
  signs - that is - signs which display a list of choices which can be
  changed by interacting (right-clicking) with the sign.
  
  ### signs.menu() function
  
  This function is used to construct a new interactive menu on top of an
  existing sign in the game world.
  
  #### Parameters
  
   * Label : A string which will be displayed in the topmost line of the
     sign. This label is not interactive.  
   * options : An array of strings which can be selected on the sign by 
     right-clicking/interacting.
   * callback : A function which will be called whenever a player
     interacts (changes selection) on a sign. This callback in turn
     takes as its parameter, an object with the following properties...
  
     * player : The player who interacted with the sign.
     * sign : The [org.bukkit.block.Sign][buksign] which the player interacted with.
     * text : The text for the currently selected option on the sign.
     * number : The index of the currently selected option on the sign.
   
   * selectedIndex : optional: A number (starting at 0) indicating which
     of the options should be selected by default. 0 is the default.
  
  #### Returns
  This function does not itself do much. It does however return a
  function which when invoked with a given
  [org.bukkit.block.Sign][buksign] object, will convert that sign into
  an interactive sign.
  
  #### Example: Create a sign which changes the time of day.
  
  ##### plugins/signs/time-of-day.js
     
  ```javascript 
  var utils = require('utils'),
      signs = require('signs');
  
  var onTimeChoice = function(event){
      var selectedIndex = event.number;
      // convert to Minecraft time 0 = Dawn, 6000 = midday, 12000 = dusk, 18000 = midnight
      var time = selectedIndex * 6000; 
      event.player.location.world.setTime(time);
  };
  
  // signs.menu returns a function which can be called for one or more signs in the game.
  var convertToTimeMenu = signs.menu('Time of Day',
      ['Dawn', 'Midday', 'Dusk', 'Midnight'],
      onTimeChoice);
          
  exports.time_sign = function( player ){
      var sign = signs.getTargetedBy(player);
      if ( !sign ) {
          throw new Error('You must look at a sign');
      } 
      convertToTimeMenu(sign);
  };
  ```
  
  To use the above function at the in-game prompt, look at an existing
  sign and type...
  
      /js time_sign(self);
  
  ... and the sign you're looking at will become an interactive sign
  which changes the time each time you interact (right-click) with it.
  
  ### signs.getTargetedBy() function
  
  This function takes a [org.bukkit.entity.LivingEntity][bukle] as a
  parameter and returns a [org.bukkit.block.Sign][buksign] object which
  the entity has targeted. It is a utility function for use by plugin authors.
  
  #### Example
  
  ```javascript 
  var signs = require('signs'),
      utils = require('utils');
  var player = utils.player('tom1234');
  var sign = signs.getTargetedBy( player );
  if ( !sign ) { 
      echo( player, 'Not looking at a sign');
  }
  ```
  
  [buksign]: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/block/Sign.html
  [bukle]: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/entity/LivingEntity.html
  
  ***/
  function hasSign(block) {
    if (__plugin.canary) {
      if (block && block.tileEntity && block.tileEntity.setTextOnLine) {
        return block.tileEntity;
      }
    }
    if (__plugin.bukkit) {
      if (block && block.state && block.state.setLine) {
        return block.state;
      }
    }
    return false;
  }
  var utils = require('utils');
  var menu = require('./menu')(hasSign);
  // include all menu exports
  for (var i in menu) {
    exports[i] = menu[i];
  }
  
  function getTargetedBy(livingEntity) {
    var location = utils.getMousePos(livingEntity);
    if (!location) {
      return null;
    }
    return hasSign(utils.blockAt(location));
  }
  exports.getTargetedBy = getTargetedBy;
  exports.hasSign = hasSign;
  