/**
 * Projekt         : Optimale-Praesentation
 * Dateiname       : javascript/classes/DynamicLoader.class.js
 * Erzeugungsdatum : 14.12.2010
 * Autor           : Robert Eyck Platz
 * Letzte Akt.     : 14.12.2010
 *
 * Beschreibung:     Ermöglicht das dynamische Nachladen von Javascript und CSS
 *                   Dateien, sowie von Inline Javascript.
 *                   
 *                   Warum nach dem eval() auch noch die Einbindung in den Head?
 *                   -> manch ein Browser hat mit Funktionen im eval() offensichtlich
 *                   Probleme, wenn er diese später nicht mehr finden kann. Daher muss der
 *                   Code quasi präsent bleiben. Manche Browser führen den Code dann
 *                   allerdings zweimal aus, dies muss man ggf. berücksichtigen.
 *                   
 *                   Eingebundene CSS Dateien werden normalerweise sofort angewendet.
 *                   Dies ist daher auch eine gute Möglichkeit CSS in eine fremde Seite 
 *                   nachzuladen, und dabei validen HTML Code zu produzieren (kein
 *                   @import im Body...). Natürlich geht das nur, wenn Javascript
 *                   aktiviert ist. Dies sollte man vorher abwiegen.
 *
 * Versionshistorie:
 *
 * TO-DO:
 *
 */

var secra;
if(!secra){ secra = {}; }

secra.DynamicLoader = {};

secra.DynamicLoader.loadExternalJS = function(url){
  // Lädt eine externe JS Datei nach
  var head = document.getElementsByTagName('head')[0];
  var script = document.createElement('script');
  script.setAttribute('type', 'text/javascript');
  script.src = url;
  head.appendChild(script);
};

secra.DynamicLoader.loadExternalCSS = function(url){
  // Lädt eine externe CSS Datei nach
  var head = document.getElementsByTagName('head')[0];
  var style = document.createElement('link');
  style.rel = 'stylesheet';
  style.type = 'text/css';
  style.href = url;
  head.appendChild(style); 
};

secra.DynamicLoader.loadInlineJS = function(script){
  // bindet den angegebenen Code in den Head ein UND(!) führt ihn aus
  var inlineJS = new Array();
  inlineJS.push(script);
  secra.DynamicLoader.evalArray(inlineJS);
};

secra.DynamicLoader.parseHTMLforJS = function(source){
  // durchsucht einen HTML Schnipsel nach Script Tags und bindet den Code
  // ein - nützlich z.B. im IE.
  var out = secra.DynamicLoader.splitScripts(source);
  secra.DynamicLoader.evalArray(out['scripts']);
};

secra.DynamicLoader.splitScripts = function(source){
  // trennt den übergebenen Quellcode Schnipsel ind Script und HTML auf
  // @return: out.cleanedHtml -> alles außer den Skripten
  //          out.scripts     -> Array mit den einzelnen Inhalten der Skriptblöcke
  
  var scripts = new Array();

  while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
    var script_start     = source.indexOf("<script");
    var script_start_end = source.indexOf(">", script_start);
    var script_end       = source.indexOf("</script", script_start);
    var script_end_end   = source.indexOf(">", script_end);

    scripts.push(source.substring(script_start_end+1, script_end));
    source = source.substring(0, script_start) + source.substring(script_end_end + 1);
  }

  var out = new Object();
  out['cleanedHtml'] = source;
  out['scripts'] = scripts;
  
  return out;
};

secra.DynamicLoader.evalArray = function(scripts){
  // bindet alle Einträge des Arrays in den Head ein
  // und führt sie aus.
  
  var head = document.getElementsByTagName('head');
  var script;
  var agent           = navigator.userAgent.toLowerCase();
  var isIE            = (agent.indexOf("msie") !== -1) ? true : false;    
  if(scripts){
    for(var i=0; i < scripts.length; i++) {
      script = document.createElement('script');
      script.setAttribute('type', 'text/javascript');
      if(!isIE){
        script.appendChild(document.createTextNode(scripts[i]));
      } else {
        script.text = scripts[i] ;
      }
      head[0].appendChild(script);
      eval(scripts[i]);
    }  
  }
};
