Type.registerNamespace('Services');

Services.AbstractServiceLoaded = function(callerobjectid, params){
    this._callerobjectid = callerobjectid;
    this._params = params;
    this.handler = Function.createDelegate(this, this.onLoaded)
}

Services.AbstractServiceLoaded.prototype = {
     initialize : function() {            
          
        },
         dispose : function() {            
          
        },        
        get_callerObjectId : function(){
            return this._callerobjectid;
        },        
        get_Params : function(){
            return this._params;
        },
        onLoaded : function(){                
            //this method will be overriden by subclass
        }
}

Services.AbstractServiceLoaded.registerClass('Services.AbstractServiceLoaded', null, Sys.IDisposable);

Services.UserContext = function (callerVal, contextVal){
   this.callerid = callerVal;
   this.divElement = contextVal;
}

Services.LoadServiceHolderBehavior = function(element){
    Services.LoadServiceHolderBehavior.initializeBase(this, [element]);     
    this._serviceName = null;
    this._containerElementId = null;    
    this._entityid = null;
    this._entries = null;
}

Services.LoadServiceHolderBehavior.prototype = {
    initialize : function() {            
            Services.LoadServiceHolderBehavior.callBaseMethod(this, 'initialize');
            this.callService();           
        },
          
        dispose : function() {            
            Services.LoadServiceHolderBehavior.callBaseMethod(this, 'dispose');
        },
        
        get_ContainerElementID : function(){
            return this._containerElementId;
        },                
        
        set_ContainerElementID : function(value){
            if (this._containerElementId !== value){
                this._containerElementId = value;
                this.raisePropertyChanged('ContainerElementID');
            }
        }, 
        
        get_ServiceName : function(){
            return this.serviceName;
        },                
        
        set_ServiceName: function(value){
            if (this.serviceName !== value){
                this.serviceName = value;
                this.raisePropertyChanged('ServiceName');
            }
        },
        
        get_EntityID: function(){
            return this._entityid;
        },                
        
        set_EntityID: function(value){
            if (this._entityid !== value){
                this._entityid = value;
                this.raisePropertyChanged('EntityID');
            }
        },
        
        get_Entries: function(){
            return  this._entries;
        },                
        
        set_Entries: function(value){
            if (this._entries !== value){
                this._entries = value;
                this.raisePropertyChanged('Entries');
            }
        },       
        
        callService : function(){                                  
            eval(this.get_ServiceName())(this.get_EntityID(), this.get_Entries(), this.OnServiceCompleted, this.OnServiceError, new Services.UserContext(this.get_id(), this.get_ContainerElementID()));
        },
        
         OnServiceCompleted : function(result, userContext){
            $get(userContext.divElement).innerHTML = result.Html;
         
            if (result.UseCallbackObject && result.CallbackObjectName != ''){
                var expr = "new " + result.CallbackObjectName + "(userContext.callerid , result.Entries )";
                var obj = eval(expr);
                obj.handler();
            }               
        },
                         
       OnServiceError : function(){
        
        }
        
                
}

Services.LoadServiceHolderBehavior.registerClass('Services.LoadServiceHolderBehavior', Sys.UI.Control);
Services.UserContext.registerClass('Services.UserContext', Sys.UI.Behavior);

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();