/*--------------------------------------------------------------------------
--
--   @(#) Datei   : [item]
--   @(#) Version : [version]
--   @(#) Status  : [state]
--   @(#) Datum   : [modtime]
--   @(#) Pfad    : [viewpath]
--   @(#) Package : [package]
--
----------------------------------------------------------------------------
--
--   Aenderungen:
--
--   LNR  Datum       Name/Firma        SCR/Beschreibung
--
--   000  01.08.2007  Koetter/cdb       Erstellung
--   001  26.11.2007  Koetter/cdb       Performance Optimierung
--   002  15.02.2008  Koetter/cdb       Anpassungen an Meta-Datenplugin V2
--   002  31.03.2008  Koetter/cdb       Als Metadaten koennen nun auch Arrays uebergeben werden
--   003  31.07.2008  Helmke/IDMS       Fuer SZ8 metadata.setType entfernt
--
--------------------------------------------------------------------------*/

/**
* @name CCFRegistry
* @constructor
* @desc
* Das CCFRegistry-Objekt. Dieses Objetkt enthaelt alle angemeldeten Plugins in dem, Array 'plugin'
* Ein Plugin wird besteht aus 1. Name, 2. Meta-Datum, 3. Parameter
*/
function CCFRegistry() {
    plugins = [];
    this.timesDomChanged = 0;
    this.addEntry = addEntry;
    this.populateMetaData = populateMetaData;
    this.getParameterFromMetadata = getParameterFromMetadata;
    this.getPluginByPluginName = getPluginByPluginName;
    this.getPluginByMetaName = getPluginByMetaName;
    this.evalPlugin = evalPlugin;
    this.domChanged = domChanged;
    this.removeEntry = removeEntry;
    this.getTimesDomChanged = getTimesDomChanged;
}

/**
* Methode zum hinzufuegen von Plugins zur CCFRegistry
* @memberOf CCFRegistry
* @param {String} pluginName, Name des Plugins
* @param {String} metaName, Meta-Datum, dass fuer das Plugin verwendet werdn soll
* @param {String} parameterNameArray, Array der Parameter des Plugins
* @return nichts
*/
function addEntry(pluginName,metaName,parameterNameArray) {
    var pluginToAdd = [pluginName,metaName,parameterNameArray];
    plugins.push(pluginToAdd)
    populateMetaData(pluginName,metaName,parameterNameArray);
}

/**
* getter fuer Plugin
* @memberOf CCFRegistry
* @param {String} name, Name des Plugins
* @return {Array} Plugin mit dem uebergebenen Namen, wird kein Plugin gefunden ist der Rueckgabewert null
*/
function getPluginByPluginName(name) {
    for(var i=0; i<plugins.length;i++) {
        if(name==plugins[i][0]) {
            return plugins[i];
        }
    }
    return null
}

/**
* getter fuer Plugin
* @memberOf CCFRegistry
* @param {String} name, Meta-Name des Plugins
* @return {Array} Plugin mit dem uebergebenen Namen, wird kein Plugin gefunden ist der Rueckgabewert null
*/
function getPluginByMetaName(name) {
    for(var i=0; i<plugins.length;i++) {
        if(name==plugins[i][1]) {
            return plugins[i];
        }
    }
    return null
}

/**
* erneutes ausfuehren von populateMetaData fuer alle registrierten Plugins
* muss immer aufgerufen werden, wenn sich das Model (DOM) aendert
* @memberOf CCFRegistry
* @param keine
* @return nichts
*/
function domChanged() {
    // DomChanged hochzaehlen -> Seite wird nicht initial aufgerufen
    this.timesDomChanged++;
    // Plugins aufrufen
    for(var i=0; i < plugins.length; i++) {
        populateMetaData(plugins[i][0],plugins[i][1],plugins[i][2]);
    }
}


/**
* gibt an wie oft domChanged aufgerufen wurde.
* 0 wenn die Seite nur initial geladen wurde und bsiher keine
* AJAX-Requests abgesetzt wurden
* @memberOf CCFRegistry
* @param keine
* @return {int } Anzahl der bisherigen DomChanged-Aufrufe
*/
function getTimesDomChanged() {
  return this.timesDomChanged;
}

/**
* Bindet die DOM-Elemente, die ueber Meta-Daten auf Plugins verweisen
* an die Plugin-Funktionen
* @memberOf CCFRegistry
* @param {String} pluginName, Name des Plugins
* @param {String} metaName, Meta-Datum, dass fuer das Plugin verwendet werden soll,
*                            in der Regel identisch mit Plugin-Name
* @param {String} parameterNameArray, Array der Namen der Parameter des Plugins
* @return nichts
*/
function populateMetaData(pluginName,metaName,parameterNameArray) {
  var metaNodes = $("*[@class*={]",document);
  var parameter = '';
  metaNodes.each(function(i) {
  var this_metadata = $(this).metadata()[metaName];
    if (this_metadata) {
        parameter = getParameterFromMetadata(metaName,parameterNameArray);
        if (this_metadata instanceof Array) {
            for (var i = 0; i < this_metadata.length; i++) {
                eval('$(this).' + pluginName + '(' + parameter + '[' + i + ']' + ')');
            }
        }
        else {
            eval('$(this).' + pluginName + '(' + parameter + ')');
        }
    }
  });
}

function getParameterFromMetadata(metaName,parameterNameArray){
    var parameter = '';
    if (parameterNameArray) {
        for (i = 0; i < parameterNameArray.length; i++) {
            parameter +='$(this).metadata()'+'.'+[metaName]      + '.' + parameterNameArray[i];
            i < parameterNameArray.length - 1 ? parameter += ',' : true;
        }
    }
    else {
        parameter += '$(this).metadata()' + '.' + [metaName];
    }
    return parameter;
}


function evalPlugin(selector,plugin,parameter) {
    return eval('$("' + selector + '").' + plugin + '(' + parameter + ')');
}

/**
* Bisher noch keine Implementierung
* @memberOf CCFRegistry
*/
function removeEntry(name) {
}


/**
* Deklaration der pageVariable, wird im pagevariable-Plugin verwendet
*/
pageVariable = {};

$(document).ready(function() {
    defaultRegistry = new CCFRegistry();
});