docs: function(book, hashPrefix) {
      var that = this,
          i, child, id, pages = {}, current, count = 0;
  
      Object.defineProperty( this, 'eventChange', { value: new Listeners() } );
      if (typeof book === 'string') {
          book = document.getElementById(book);
          Widget.call(this, {element: book});
          book.$ctrl = this;
          for (i = 0 ; i < book.childNodes.length ; i++) {
              child = book.childNodes[i];
              if (child.nodeType != 1) continue;
              child = new Widget({element: child});
              id = child.attr("data-page");
              if (id && id.length > 0) {
                  child.addClass("page");
                  if (!child.attr("data-index")) {
                      child.attr("data-index", count);
                  } else {
                      count = parseInt(child.attr("data-index")) || 0;
                  }
                  pages[id] = child;
                  if (!current) {
                      current = child;
                      this._pageID = id;
                      activate.call( this, child );
                  } else {
                      child.addClass("hide");
                  }
              } else {
                  child.addClass("overlay");
              }
              count++;
          }
      } else {
          Widget.call( this );
          for( id in book ) {
              child = book[id];
              this.append( child );
              child.addClass("page");
              child.attr("data-index", count);
              pages[id] = child;
              if (!current) {
                  current = child;
                  activate.call( this, child );
              } else {
                  child.addClass("hide");
              }
          }
      }
      this.addClass("tfw-wdg-book", "fullscreen");
  
      this._pages = pages;
      this._current = current;
      if (!current) {
          console.error("[tfw.wdg.book] Book without pages!");
          console.error("[tfw.wdg.book] Pages must have the \"data-page\" attribute!");
      }
  
      // If hashPrefix has been set, we watch at the hash to change pages.
      // For instance, if the prefix is "MyBook", the hash "/MyBook/MyPage"
      // will switch to the page "MyPage" if it exists.
      if (typeof hashPrefix !== 'undefined') {
          Hash(function () {
              var hashes = Hash.hash().split(';');
              hashes.forEach(function (hash) {
                  hash = hash.trim();
                  var page;
                  if (hash.substr(0, hashPrefix.length + 2) == '/' + hashPrefix + '/') {
                      page = hash.substr(hashPrefix.length + 2).trim().split( '/' )[0];
                      that.show(page);
                  }
              });
          });
      }
  }