﻿/**
* ID-JavaScript-Framework
* zu beachten: immer im <head> einbinden
*
* @copyright 2009 <i-D> internet + Design GmbH & Co. KG, Weimar
* @author Niels Bobogk <n.bobogk@i-d.de>
* @version 1.0
* @package iD
*/

// --------------------------------------------------------------------------------

/**
* Hauptklasse des iD-Frameworks
*
* - Ueberprueft erforderliche Objekte
* - bindet zugehoerige Klassen und Css-Files ein
*
* @package iD
*/
iD = {	
	Debugmode: true,
	
	// ----- Begin Config -----		
	Config: ({		
		// ID-Framework-Module/Controls
		// gleichlautend der Dateiname + ".js"
		// readyStates: -1 == nicht geladen; 0 == wird geladen; 1 == geladen
		// wenn nicht im gleichen Verzeichnis, dann Pfad angeben!
		Modules: [ 
			{ 
				'name': 'iD.DropDown',
				'readyState': -1
			}, 
			{ 
				'name': 'iD.Slideshow',
				'readyState': -1
			},
			{ 
				'name': 'iD.Toolbox',
				'readyState': -1
			},
			{ 
				'name': 'iD.Scrollbar',
				'readyState': -1
			},
			{ 
				'name': 'iD.CollapsePanel',
				'readyState': -1
			},
			// externe mit Pfad
			{ 
				'name': 'Scriptaculous', 
				'path': '/js/scriptaculous-js-1.8.2/scriptaculous-shrinked.js',
				'readyState': -1
			},
			{ 
				'name': 'Prototype', 
				'path': '/js/prototype-1.6.0.3.js',
				'readyState': -1
			}
		]	
	}),	
	// ----- End Config -----
	
	/**
	* Versionsnummer
	*
	* @access public
	*/
	Version: 1.0,
	
	/**
	* Ausgabe von Fehlermeldungen
	*
	* @param string Fehlerbeschreibung
	* @access public
	*/
	raiseError: function(errDescription) {
		if (iD.Debugmode) throw (" <iD> Fehler: " + errDescription + ' </iD> ');
	},
	
	/**
	* Bindet ggf. Prototype ein und laed die Framework-Module
	*
	* @access public
	*/
	init: function() {
		// Prototype ist zwingend erforderlich
		if (typeof Prototype == 'undefined') {
			iD.raiseError("Prototype ist nicht vorhanden!");
			return false;
		}
		
		// Pfad zum Framework-Verzeichnis ermitteln
		var js = /iD\.js(\?.*)?$/;
		$$('script[src]').findAll(function(s) {
			return s.src.match(js);
		}).each(function(s) {
			iD.rootPath = path = s.src.replace(js, '')
		});
	},	
	
	/**
	* Laedt ein registriertes Modul, 
	* solange dieses nicht geladen ist
	*
	* @param string Modulname
	*/
	loadModule: function(modulName) {
		iD.updateReadyStates();
		iD.Config.Modules.each( function(mod) {
			if (mod.name == modulName && mod.readyState < 0) {
				mod.readyState = 0;
				iD.include(mod.path ? mod.path : iD.rootPath + mod.name + '.js', mod.name);
				// bei iD-Modulen Css laden
				if (mod.name.indexOf('iD.') == 0) {
					iD.loadCss(iD.rootPath + "css/" + mod.name + '.css', 'screen');
				}
			}
		});
	},
	
	/**
	* Css-Datei nachladen
	*
	* @param string Pfad zur Datei
	* @param string (optional) Medientyp (default: screen)
	*/
	loadCss: function(cssFilePath) {
		try {
			$$('head')[0].insert (
				new Element('link', {'type' : 'text/css', 'rel' : 'stylesheet', 'href' : cssFilePath, 'media' : (arguments[1] ? arguments[1] : 'screen') } )					  
			);
		} catch (err) {
			alert("Fehler beim Einbinden von '" + cssFilePath + "'!\n" + err.description);	
		}
	},
	
	/**
	* Einbinden weiterer, erforderlicher JS-Dateien
	*
	* @param string Dateipfad
	*/
	include: function(path) {
		try {
			new Ajax.Request(path, {
					method: 'get',
					asynchronous  : false,
					onSuccess: function(transport) {						
						window.execScript ? window.execScript(transport.responseText) : eval(transport.responseText);
						iD.updateReadyStates();
					}
				}
			);	 	
		} catch(err) {
			throw err;	
		}
	},
	
	/**
	* Aktualisiert den Ladestatus der registrierten Module/Klassen
	*/
	updateReadyStates: function() {
		iD.Config.Modules.each( function(mod) {
			if (eval('typeof ' + mod.name) != 'undefined') {
				mod.readyState = 1;
			}
		});
	}
}

// --------------------------------------------------------------------------------

iD.init();
 
