/**
 * [c]Copyright: newmagic datensysteme gmbH[/c]
 * [a]    Autor: Matthias Eipeldauer[/a]
 * [cre]  Datum: 25.09.2008[/cre]
 * [desc]
 * mm8Data.js ist ein DataSource-Objekt, welches Callback (Control und Source) ermöglicht.
 * Komponenten, die auf dieser Datenquelle "sitzen" werden per Callback benachrichtigt.
 *
 * Die Datenquelle (dieses Objekt) gibt ihrerseits die Änderungen dann an den Dominoserver
 * zurück, wobei die Datenübertragung nur die veränderten Objekte ('meta':{'MODIFIED':true}) 
 * verschickt werden (sollen)
 * [/desc]
 **/

//----
include ("mm8Atom.js");
include ("coreAjax.js");
include ("mm8DXL.js");
include ("mm8JSON.js");

/*class*/function mm8Data(id)/*extends mm8Atom*/
{
  this.superclass=new mm8Atom(id);
  for (x in this.superclass) (x!="superclass")?this[x]=this.superclass[x]:"";
  this.superclass.childClass = this;
  this.type.push("mm8Data");

  /*private*/this.callbackHandler = new Array();
  /*private*/this.callbackURL     = "";
  
  
  /*public*/this.data = new Object();
  
  /* Diese Funktion liest die Daten aus der angegebenen Quelle.
   * Diese Quelle kann der Name einer lokalen Variablen sein ODER eine URL.
   */
  /*public*/this.ReadData = function(urlOrContent)
  {
    if (urlOrContent.toString().substring(0, 4) == "http")
    {
      xReply = mm8AxCore.SGetX(urlOrContent);
      xReader = new mm8DXL("xReader");
      mmoContent = xReader.Parse(xReply);
//      sTest = mmoContent.ToArray();
//      sTemp = mmoContent.ToString(1);
//      this.data = eval(sTemp);
      this.data = mmoContent.ToArray();
      this.callbackURL = urlOrContent;
    }
    else
    {
      sReply = urlOrContent;
      this.data = eval(sReply);
    }
  };
    
  /* Diese Funktion speichert einen beliebigen Callback-Pointer,
   * der im Falle von Änderungen aufgerufen wird.
   */
  /*public*/ this.RegisterCallback = function(callbackPtr, id)
  {
    this.callbackHandler[id] = callbackPtr;
  };
  
  /*public*/this.Get = function()
  {
    return this.data;
  };
  
  /* Diese Funktion empfängt die veränderten Daten aus einer beliebigen "Quelle" 
   * (nämlich dem Objekt, dem diese Datenquelle "gehört") und speichert diese ab.
   */
  /*public*/this.Set = function(newData, callerId)
  {
    log(this.ToString() + "->Set(data, caller)");
    this.data = newData;
    for(handler in this.callbackHandler)
    {
      if (handler != callerId)
      {
        log("->Notify Listener " + handler);
        EventArgs = new Object();
        EventArgs.datasize = this.data.length;
        EventArgs.data = this.data;
        EventArgs.callerID = callerId;
        this.callbackHandler[handler](handler, EventArgs);
      }      
    }
  };
}; //   mm8Data

mm8Callback("mm8Data.js");
