/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Ubiquity.
 *
 * The Initial Developer of the Original Code is Mozilla.
 * Portions created by the Initial Developer are Copyright (C) 2007
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Atul Varma <atul@mozilla.com>
 *   Sander Dijkhuis <sander.dijkhuis@gmail.com>
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

/*
  Namespace: App
  
  This is the application that processes the code and lets the user
  navigate through and read the documentation.
*/

var App = {
};

App.scrollToTopic = function(topic) {
  var el = $('#' + topic.replace(/\./g, '\\.'));
  if (el[0])
    window.scrollTo(0, el.offset().top);
  else
    setTimeout(function(){ App.scrollToTopic(topic) }, 100);
}

/* 
  Array: App.processors

  An array of user-defined processor functions.  They should take one
  argument, the DOM node containing the documentation.  User-defined
  processor functions are called after standard processing is done.
*/

App.processors = [];

/*
  Function: App.processCode

  Splits `code` in documented blocks and puts them in `div`.
  The used structure for each block is:
  
      <div class="documentation"> (...) </div>
      <div class="code"> (...) </div>
      <div class="divider"/>
  
  Documentation is parsed using Markdown: <http://daringfireball.net/projects/markdown/>.
  
  Receives JSON from < docs.php#docs.php >
*/

App.processCode = function(blocks, div) {
    
  $('div.documentation').each(function(){
    var docs = $(this),
        code = docs.next(),
        docsSurplus = docs.height() - code.height() + 1;
        
    if (docsSurplus > 0)
        code.css({paddingBottom: docsSurplus + "px"});
  });

  // Run the user-defined processors.
  $.each(
    App.processors,
    function(i) {
      App.processors[i]($(div).find(".documentation"));
    });
};

App.CHARS_PER_ROW = 80;

App.initColumnSizes = function() {
  // Get the width of a single monospaced character of code.
  var oneCodeCharacter = $('<pre class="code">M</pre>');
  $("#content").append(oneCodeCharacter);
  App.charWidth = oneCodeCharacter.width();
  App.columnWidth = App.charWidth * App.CHARS_PER_ROW;
  $(oneCodeCharacter).remove();

  // Dynamically determine the column widths and padding based on
  // the font size.
  var padding = App.charWidth * 2;
  App.columnCss = {width: App.columnWidth,
                   paddingLeft: padding,
                   paddingRight: padding};
  $("#content").css({width: (App.columnWidth + padding*2) * 2 + 10});
  $(".documentation").css(App.columnCss);
  $(".code").css(App.columnCss);
};

$(window).ready(
  function() {
    App.initColumnSizes();
    App.processCode();
    $('a.goto').live('click', function(){
      var topic = $(this).attr('rel');
      if (topic && topic == App.currentTopic) {
        App.scrollToTopic(topic);
      }
    });
  }
);
