      1 /** The minplayer namespace. */
      2 var minplayer = minplayer || {};
      3
      4 /**
      5  * @constructor
      6  * @class This is a class used to keep track of flag states
      7  * which is used to control the busy cursor, big play button, among other
      8  * items in which multiple components can have an interest in hiding or
      9  * showing a single element on the screen.
     10  *
     11  * <p>
     12  * <strong>Usage:</strong>
     13  * <pre><code>
     14  *   // Declare a flags variable.
     15  *   var flags = new minplayer.flags();
     16  *
     17  *   // Set the flag based on two components interested in the flag.
     18  *   flags.setFlag("component1", true);
     19  *   flags.setFlag("component2", true);
     20  *
     21  *   // Print out the value of the flags. ( Prints 3 )
     22  *   console.log(flags.flags);
     23  *
     24  *   // Now unset a single components flag.
     25  *   flags.setFlag("component1", false);
     26  *
     27  *   // Print out the value of the flags.
     28  *   console.log(flags.flags);
     29  *
     30  *   // Unset the other components flag.
     31  *   flags.setFlag("component2", false);
     32  *
     33  *   // Print out the value of the flags.
     34  *   console.log(flags.flags);
     35  * </code></pre>
     36  * </p>
     37  */
     38 minplayer.flags = function() {
     39
     40   /** The flag. */
     41   this.flag = 0;
     42
     43   /** Id map to reference id with the flag index. */
     44   this.ids = {};
     45
     46   /** The number of flags. */
     47   this.numFlags = 0;
     48 };
     49
     50 /**
     51  * Sets a flag based on boolean logic operators.
     52  *
     53  * @param {string} id The id of the controller interested in this flag.
     54  * @param {boolean} value The value of this flag ( true or false ).
     55  */
     56 minplayer.flags.prototype.setFlag = function(id, value) {
     57
     58   // Define this id if it isn't present.
     59   if (!this.ids.hasOwnProperty(id)) {
     60     this.ids[id] = this.numFlags;
     61     this.numFlags++;
     62   }
     63
     64   // Use binary operations to keep track of the flag state
     65   if (value) {
     66     this.flag |= (1 << this.ids[id]);
     67   }
     68   else {
     69     this.flag &= ~(1 << this.ids[id]);
     70   }
     71 };
     72