function MiniSearchControl(id)
{
  var _id = id;
  var _onSearch = null;
  var _element = $(document.createElement("div"));
  var _searchTextWrapper = $(document.createElement("div"));
  var _searchButtonWrapper = $(document.createElement("div"));
  var _search = $(document.createElement("input"));
  var _searchButton = $(document.createElement("input"));

  _element.attr("id", "miniSearch");
  _searchTextWrapper.addClass("wrapText");
  _searchButtonWrapper.addClass("wrapButton");

  _searchButton.bind('click', function(e) { if (_onSearch != null) { _onSearch(_search.attr("value"), 0, 10); } } );
  _search.bind('keydown', function(e) { if (e.keyCode == 13 && _onSearch != null) { _onSearch(_search.attr("value"), 0, 10); return false; } } );
  _search.attr('type', 'text');
  _search.attr('title', 'Enter a search term and press enter');
  _search.attr('value', 'Search');
  _search.bind('focus', function(e) { if(this.value=='Search'){this.value='';} });
  _search.bind('blur', function(e) { if(this.value==''){this.value='Search';} });
  _searchButton.attr('type', 'submit');
  _searchButton.attr('title', 'Click here after entering a search term');
  _searchButton.attr('value', '');
  _searchTextWrapper.append(_search);
  _searchButtonWrapper.append(_searchButton);
  _element.append(_searchButtonWrapper, _searchTextWrapper);

  this.searchText = function(value) { if (_search.attr("value") != value) { _search.attr("value", value); } };
  this.getNode = function() { return _element[0]; }
  this.onSearch = function(callback) { _onSearch = callback; }
}

function BookmarkControl(id, count)
{
  var _id = id;

  var _onBookmarkRequest = null;
  var _onBookmarkCreated = null;
  var _onBookmarkNavigate = null;
  var _onBookmarkDeleted = null;

  var _element = $(document.createElement("ol"));
  _element.attr("id", _id);

  for (var i=1;i<=count;i++)
  {
    var bookmark = $(document.createElement("li"));
    var bookmarkText = $(document.createElement("span"));
    var delBookmark = $(document.createElement("a"));
    bookmark.addClass("bookmark");
    bookmark.attr("id", _id + "Mark" + i);
    bookmark.attr("title", "Click to create a bookmark to the current location");
    bookmark.addClass("mark" + i);
    bookmark.data("Index", i);
    bookmark.add(bookmarkText).bind("selectstart", function (e) {return false;});
    bookmark.bind("click",
        function (e) {
          if (_onBookmarkRequest && $(this).data("Bookmark") == null)
          {
            var mark = _onBookmarkRequest();
            $(this).data("Bookmark") == mark;

            if (_onBookmarkCreated && mark)
            {
              _onBookmarkCreated($(this).data("Index"), mark);
            }
          }
          else if (_onBookmarkNavigate && $(this).data("Bookmark") != null)
          {
            _onBookmarkNavigate($(this).data("Bookmark"));
          }
          e.result = false;
          return false;
        }
      );
    delBookmark.data("target", _id + "Mark" + i);
    delBookmark.addClass("delete");
    delBookmark.attr("title", "Click to delete this bookmark");
    delBookmark.bind("click",
        function (e) {
          var id = $(this).data("target");
          if (id != null)
          {
            var target = $("#" + id);
            if (target && _onBookmarkDeleted)
            {
              _onBookmarkDeleted(target.data("Index"));
            }
          }
          return false;
        }
      );
    bookmark.append(bookmarkText);
    bookmark.append(delBookmark);
    _element.append(bookmark);
  }

  this.getNode = function() { return _element; }
  this.showBookmark = function(index, bookmark)
  {
    var bookmarks = _element.children("li");
    if (index - 1 < bookmarks.length)
    {
      if (bookmark)
      {
        var target = $(bookmarks[index - 1]);
        target.data("Bookmark", bookmark);
        target.addClass("set");
        target.children("span").text(bookmark.text());
        target.attr("title", "Click to go to " + bookmark.text());
      }
      else
      {
        alert("Error: Unable to ascertain current location to add a bookmark.");
        alert(bookmark.bookId());
      }
    }
    else
    {
      alert("Error: index out of range, cannot add bookmark.");
    }
    return _element[0];
  }

  this.hideBookmark = function(index)
  {
    var target = $("#" + _id + "Mark" + index);
    target.attr("title", "Click to create a bookmark to the current location");
    target.removeClass("set");
    target.removeData("Bookmark");
    target.children("span").text("");
  }

  this.onBookmarkRequest  = function(callback) { _onBookmarkRequest = callback; }
  this.onBookmarkCreated  = function(callback) { _onBookmarkCreated = callback; }
  this.onBookmarkNavigate = function(callback) { _onBookmarkNavigate = callback; }
  this.onBookmarkDeleted  = function(callback) { _onBookmarkDeleted = callback; }
}

function NotepadControl(id, pages)
{
  var _id = id;
  var _onPageChanged = null;
  var _onNoteSave = null;
  var _element = document.createElement("div");
  var _contentWrapper = document.createElement("div");
  var _content = document.createElement("textarea");
  var _pages = document.createElement("ol");
  var TEXT_INITIAL = "Use this pad to take study notes";

  $(_element).attr("id", _id);
  $(_contentWrapper).addClass("wrapPad");
  $(_content).addClass("notepad");
  $(_content).data("defaultValue", TEXT_INITIAL);
  $(_content).data("SelectedPage", 0);
  $(_content).bind("focus", function(e) { if(this.value==$(this).data("defaultValue")){this.value="";} });
  $(_content).bind("blur", function(e) { if(this.value==''){this.value=$(this).data("defaultValue");} if (_onNoteSave && $(_content).data("SelectedPage") > 0) { _onNoteSave($(_content).data("SelectedPage"), this.value); }});
  $(_pages).addClass("pages");

  for (var i=1; i<=pages; i++)
  {
    var page = document.createElement("li");
    $(page).attr("id", _id + "_page" + i);
    $(page).addClass("page");
    $(page).attr("title", "Open page " + i);
    $(page).data("PageNumber", i);
    $(page).data("HasContent", false);
    $(page).text(i);
    $(page).bind("click", function(e) {
          var oldPage = $(_content).data("SelectedPage");
          var newPage = $(this).data("PageNumber");

          if (oldPage != newPage)
          {
            if (_onNoteSave && oldPage > 0) { _onNoteSave(oldPage, _content.value); }
            $(_content).data("SelectedPage", newPage);
            $(_pages).children(".active").removeClass("active");
            $(this).addClass("active");
            if (_onPageChanged)
            {
              _onPageChanged(newPage);
            }
          }
        }
      );

    _pages.appendChild(page);
  }

  _contentWrapper.appendChild(_content);
  _contentWrapper.appendChild(_pages);
  _element.appendChild(_contentWrapper);

  this.getNode = function() { return _element; }
  this.height = function(val) { $(_element).height(val); }
  this.text = function(note)
  {
    if (!note) { return _content.value; }
    else { _content.value = note; }
  }

  this.selectedPage = function(index)
  {
    if (index == null) { return $(_content).data("SelectedPage"); }
    $(_pages).children().eq(index - 1).trigger("click");
  }
  this.onPageChanged = function(callback) { _onPageChanged = callback; }
  this.onNoteSave = function(callback) { _onNoteSave = callback; }
}
