/* *
Ponte JavaScript namespace service

Namespace-ek hasznalata
-----------------------

#1.  Uj namespace letrehozasa
 
Amikor letre akarunk hozni egy namespace, osztalyt, vagy namespacen belul levo fugvenyt eloszor ezen a Namepsace service-en keresztul kell beregisztralni.

!!!   AZ OSSZES REGISZTRACIOT EGY KOZOS FAJLBAN KELL MEGTENNI A using.js-BEN!!!

pl.: 
    - ha peldaul beszeretnenk regisztralni egy HelloWorld class-t, amely a TestNamespace/Classes namespaceken belul van:
    
Namespace.Register("TestNamespace.Classes.HelloWorld");

,ekkor regisztalva lesz a TestNamespace és a Classes namespace is !



#2.  Regisztralt objektumok kifejtese

    a,  Statikus fuggveny definialasa
    
    -   pl. szeretnenk letrehozni egy HelloWorld fuggvenyt a TestNamespace-en belul
    
        1.   using.js -be (erdemes odairni kommentbe, hogy melyik fajlban is van ez)
        
            //  HelloWorld fuggveny - hello_world.js
            Namespace.Register("TestNamespace.HelloWorld"); 
        
        2.  hello_world.js tartalma
        
            TestNamespace.HelloWorld = 
            {
                var msg = "Hello World !";
                alert(msg);
            }
    
    b,  PreConstructed class    -   olyan osztaly amibol csak 1 db letezik, peldaul a service-ek tipikusan ilyenek
    
    -   pl. szeretnenk letrehozni egy HelloWorld Service-t a TestNamespace-en belul
    
        1.   using.js 
        
            //  HelloWorld fuggveny - hello_world_Service.js
            Namespace.Register("TestNamespace.Services.HelloWorldService"); 
        
        2.  hello_world_Service.js tartalma
        
            TestNamespace.Services.HelloWorldService = 
            {
                // namspace-en beluli statikus valtozok
                msg1 : "Hello World 1 !",
                msg2 : "Hello World 2 !",
                
                //  fuggvenyek
                Hello : function(msg_id)
                {
                    if(msg_id==1)  alert(this.msg1);
                    if(msg_id==2)  alert(this.msg2);
                }
            }
            
            //  tovabbi uj valtozok letrehozasa
            TestNamespace.Services.HelloWorldService.msg3= "Hello World 3 !";
            TestNamespace.Services.HelloWorldService.msg4= "Hello World 4 !";
            
            MEGJEGYZES: fontos a helyes szintaktia minden valtozot, vagy fuggvenyt ','-el kell elvalasztani,
                        Tovabbi valtozok, vagy fuggvenyek definilasanal nem kell regiszralni(!), 
                        viszont, ha pl ezt szeretnenk TestNamespace.Services.HelloWorldService.messages.msg1 letrehozni
                        
                        // helytelen
                        TestNamespace.Services.HelloWorldService.messages.msg1 = "First message"; // nem fog mukodni
                        
                        // helyes
                        TestNamespace.Services.HelloWorldService.messages = {};
                        vagy
                        Namespace.Register("TestNamespace.Services.HelloWorldService.messages"); 
                        
                        TestNamespace.Services.HelloWorldService.messages.msg1 = "First message"; // nem fog mukodni
        
                        
    c,  Osztaly definialasa
    
        -   pl. szeretnenk letrehozni egy HelloWorld class-t a TestNamespace-en belul
    
        1.   using.js 
        
            //  HelloWorld fuggveny - hello_world.js
            Namespace.Register("TestNamespace.Classes.HelloWorld"); 
        
        2.  hello_world.js tartalma
        
            TestNamespace.Classes.HelloWorld = function ()
            {
                //  privat valtozok, fuggvenyek
                messages : new Array(),
                
                //  public valtozok, fuggvenyek
                return{
                    // namspace-en beluli statikus valtozok
                    msg1 : "Hello World 1 !",
                    msg2 : "Hello World 2 !",
                    
                    //  fuggvenyek
                    Hello : function(msg_id)
                    {
                        if(msg_id==1)  alert(this.msg1);
                        if(msg_id==2)  alert(this.msg2);
                    },
                    
                    AddMessage : function(msg)
                    {
                        this.messages.push(msg);
                    },
                    
                    GetMessage : function(id)
                    {
                        return this.messages[id];   
                    }
                    
                }
            }
            
            az elozo esetben nem lehet konstruktort definialni, ha megis szukseges letrehozhatunk igy is osztlyt
            
            TestNamespace.Classes.HelloWorld = function ()
            {
                //  constructor fuggveny
                this.init = function()
                {
                
                }
                //  privat valtozok, fuggvenyek
                this.messages : new Array();
                
                //  public valtozok, fuggvenyek
                // namspace-en beluli statikus valtozok
                this.msg1 : "Hello World 1 !";
                this.msg2 : "Hello World 2 !";
                
                //  fuggvenyek
                this.Hello = function(msg_id)
                {
                    if(msg_id==1)  alert(this.msg1);
                    if(msg_id==2)  alert(this.msg2);
                };
                
                this.AddMessage = function(msg)
                {
                    this.messages.push(msg);
                };
                
                this.GetMessage = function(id)
                {
                    return this.messages[id];   
                };
                
                this.init();    //  constructor meghivasa                
                return this;
            }

 */

var Namespace =
{
	_head : document.getElementsByTagName('head')[0],
	//	a namespace neve, ha van megadva file nev, akkor dinamikusan huzza be
   Register : function(_Name, _FileName)
   {
      chk = false;
      cob = "";
      spc = _Name.split(".");
      for(i = 0; i < spc.length; i ++ )
      {
         if(cob != "")
         {
            cob += ".";
         }
         cob += spc[i];
         chk = this.Exists(cob);
         if( ! chk)
         {
            this.Create(cob);
            //	fajl include
            if(_FileName!=undefined)
            {
            	var script = document.createElement("SCRIPT");
            	script.type= 'text/javascript';
   				script.src= _FileName;
   				this._head.appendChild(script);
            }
         }
      }
      if(chk)
      {
         throw "Namespace: " + _Name + " is already defined.";

      }
   }
   ,

   Create : function(_Src)
   {
      eval("window." + _Src + " = new Object();");
   }
   ,

   Exists : function(_Src)
   {
      try
      {
         return eval("(" + _Src + ")?true:false;");
      }
      catch(err)
      {
         return false;
      }
   }
}

