 -----
 Javascript template loading
 -----
 Olivier Lamy
 -----
 2012-09-14
 -----

~~ Licensed to the Apache Software Foundation (ASF) under one                      
~~ or more contributor license agreements.  See the NOTICE file                    
~~ distributed with this work for additional information                           
~~ regarding copyright ownership.  The ASF licenses this file                      
~~ to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0                                    
~~                                                                                 
~~ Unless required by applicable law or agreed to in writing,                      
~~ software distributed under the License is distributed on an                     
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY                          
~~ KIND, either express or implied.  See the License for the                       
~~ specific language governing permissions and limitations                         
~~ under the License.                                                              

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/guides/mini/guide-apt-format.html

Html/Javascript templates loading

  Templates are loaded on application loaded and added in the hidden div <<#html-fragments>>.

  They are loaded using requirejs and the text plugin.

  archiva templates are loaded as it <<<NOTE: the no cache is activated only on dev mode>>>

+-------------------------
require(['jquery',"jquery.tmpl",'i18n',"utils","text!templates/archiva/menu.html",
          "text!templates/archiva/generics.html",
          "text!templates/archiva/modal.html",
          "text!templates/archiva/repositories.html",
          "text!templates/archiva/search.html",
          "text!templates/archiva/general-admin.html"],
  function(jquery,jqueryTmpl,i18n,utils,menu,generics,modal,repositories,
           search,general_admin) {
    loadArchivaTemplate=function(){
      var htmlFragment=$("#html-fragments");
      // template loading
      htmlFragment.append(menu);
      htmlFragment.append(generics);
      $.tmpl( modal ).appendTo(htmlFragment);
      htmlFragment.append(repositories);
      htmlFragment.append(search);
      htmlFragment.append(general_admin);
      $.log("main-tmpl.js loaded");
    }
  }
);
+-------------------------

* i18n in templates

** static templates

  Some templates which are only simple html which only need i18n are executed immediatly.

  Simply use:

+-------------------------
  $.tmpl( menu, $.i18n.map ).appendTo("#html-fragments");
  to get i18n values in your template you can use
  ${register} or ${$.i18n.prop('register')}

  Note if you use the simple form ${register} and the property is not available, the template system will try to use if exists the function register

+-------------------------


** dynamic templates

   The others are only inserted in #html-fragments.