﻿
// Features *************************************************
/*
- Client Component Properties have the ability to maintain a value history. Giving developers the ability to Undo and Redo changes made to an object's property.
  This features allow ajax components to tell if the properties of an object has changed since the last ajax call.

*/
/* ASP.NET 2.0 Callback Fixed */
if(typeof (WebForm_CallbackComplete)=="function"){WebForm_CallbackComplete=function(){for(var i=0;i<__pendingCallbacks.length;i++){var cbo=__pendingCallbacks[i];if (cbo && cbo.xmlRequest && (cbo.xmlRequest.readyState == 4)){if (!__pendingCallbacks[i].async) __synchronousCallBackIndex=-1;__pendingCallbacks[i]=null;var cbfid="__CALLBACKFRAME" + i;var xmrf=document.getElementById(cbfid);if(xmrf)xmrf.parentNode.removeChild(xmrf);WebForm_ExecuteCallback(cbo);}}}}

//Use ajax.net if available.

if(typeof Type=='undefined'){
alert('Requires ajax.net')
//    var Type = {
//        registerNamespace: function(ns){alert('Type.registerNamespace Not implemented')}
//    }
//    
//    var $create = function(type, properties, events, references, element){
//        alert('$create Not implemented')
//    }
//    
//    Type.prototype.registerClass = function(typeName, baseType, interfaceTypes){
//        alert('registerClass')
//    }
}


Date.prototype.ticks = function(date){ 
   this.day = date.getDate(); 
   this.month = date.getMonth() + 1; 
   this.year = date.getFullYear(); 
   this.hour = date.getHours(); 
   this.minute = date.getMinutes(); 
   this.second = date.getSeconds(); 
   this.ms = date.getMilliseconds(); 
   
    this.dateToTicks = function(year, month, day){ 
          var a = parseInt((year - 1) * 365); 
          var b = parseInt((year - 1) / 4); 
          var c = parseInt((year - 1) / 100); 
          var d = parseInt((a + - c)); 
          var e = parseInt((year - 1) / 400); 
          var f = parseInt(d + e); 
          var monthDays = eTag.$v.monthToDays(year, month - 1); 
          var g = parseInt((f + monthDays) + day); 
          var h = parseInt(g - 1); 
          return h * 864000000000; 
    } 

    this.timeToTicks = function(hour, minute, second){ 
      return (((hour * 3600) + minute * 60) + second) * 10000000; 
    }   
   
return this.dateToTicks(this.year, this.month, this.day) + this.timeToTicks(this.hour, this.minute, this.second) + (this.ms * 10000); 
}



String.prototype.replaceAll=function(find,replacement){var returns=this;var match=returns.indexOf(find);while(match != -1){returns=returns.replace(find, replacement);match=returns.indexOf(find);};return(returns);}

Type.registerNamespace('eTag');
Type.registerNamespace('eTag.Resources');
Type.registerNamespace('eTag.Web.Client');


/*********************** eTag.Resources.ResourceType ***************************************************/
eTag.Resources.ResourceType=function(){};
eTag.Resources.ResourceType.prototype={Script:0,Css:1}
eTag.Resources.ResourceType.registerEnum("eTag.Resources.ResourceType");
/*********************** eTag.Resources.LoadStatus ***************************************************/
eTag.Resources.LoadStatus=function(){};
eTag.Resources.LoadStatus.prototype={Pending:0,Loading:1,Loaded:2}
eTag.Resources.LoadStatus.registerEnum("eTag.Resources.LoadStatus");
/*********************** eTag.ValueType ***************************************************/
eTag.ValueType=function(){throw Error.invalidOperation()};
eTag.ValueType.prototype={Literal:0,Session:1,ClientVariable:2,ClientFunction:3,ClientElement:4,ControlID:5}
eTag.ValueType.registerEnum("eTag.ValueType");



/* ResourceManager Object ***********************************************************************************************/
eTag.Resources._ResourceManager = function() {
    eTag.Resources._ResourceManager.initializeBase(this);
    this._version='1.0.0';
    this._resourceLoaderUrl='eTagSH.axd';
    this._head;
    this._scripts=null;
    this._resources=[];
    this._definitions=[];
    this._events=null;
    
    //Delegate
    this._resourceLoadDelegate = Function.createDelegate(this, this._resourceLoadHandler);
}


////                .Append("name:" & JSONSerializer.Serialize(Me.Name))
////                .Append(",type:" & JSONSerializer.Serialize(Me.Type))
////                .Append(",url:" & JSONSerializer.Serialize(Me.Url))
////                .Append(",order:" & Me.Order.ToString())
////                .Append(",loadStatus:0")
//                



eTag.Resources._ResourceManager.prototype = {
    // Events
    get_events: function(){if(!this._events) this._events = new Sys.EventHandlerList();return this._events;},
    // Events - resourceLoaded
    add_resourceLoaded: function(handler){this.get_events().addHandler('resourceLoaded',handler);},
    remove_resourceLoaded: function(handler){this.get_events().removeHandler('resourceLoaded', handler);},
    _raise_resourceLoaded: function(sender, args){var h = this.get_events().getHandler('resourceLoaded');if (h) h(sender, args);},
    _resourceLoadHandler: function(sender, args){
        this._raise_resourceLoaded(sender, args);
    },
    
    
    _get_head: function(){
       if(!this._head) this._head=document.getElementsByTagName('head')[0];
       return this._head;
    },
    isScriptRegistered:function(scriptUrl){
        return this.findScript(scriptUrl) != null;
    },
    findScript:function(scriptUrl){
        if(!this._scripts) this._scripts=document.getElementsByTagName("script");
        for(i=0; i < this._scripts.length; i++){
            if(this._scripts[i].src == scriptUrl) return this._scripts[i];
        }
        return null;
    },
    removeScript: function(scriptUrl){
        var s = this.findScript(scriptUrl);
        if(!s) return false;
        s.parentNode.removeChild(s);
        return Array.remove(this._scripts, s);
    },
    isResourceRegistered: function(id){
        return this.findResource(id) != null;
    },
    findResource: function(id){
        for(i=0; i < this._resources.length; i++){
            if(this._resources[i].get_id() == id) return this._resources[i];
        }
        return null;
    },
    loadClientMethodScript: function(type,loadComplete){
         var url = this._resourceLoaderUrl + '?a=ms';
             url += '&t=' + escape(type);
         this.loadResource(type+'_ms',url,loadComplete);
             //eTag.Resources.ResourceType.Script
    },
    
//    registerResource: function(id,type,url){
//        var res = this.findResource(id);
//        if(res) return;
//         var res = new eTag.Resources.ResourceFile(id,eTag.Resources.ResourceType.Script,url);
//         Array.add(this._resources,res);
//         res.locate();
//    },
    loadResource: function(id,url,loadComplete){
       var res = this.findResource(id);
       if(!res){
         var res = new eTag.Resources.ResourceFile(id,eTag.Resources.ResourceType.Script,url);
         res.add_loadStatusChanged(this._resourceLoadDelegate);
         Array.add(this._resources,res);
         res.load();
       }
        if(loadComplete){
            if(res.get_loadStatus() == eTag.Resources.LoadStatus.Loaded) loadComplete(res,Sys.EventArgs.Empty);
            else{
                var fn = function(sender, args){
                    if(sender.get_loadStatus() == eTag.Resources.LoadStatus.Loaded) loadComplete(sender,args);
                }
                res.add_loadStatusChanged(fn);
            }  
        }
        return res;
    }//,
//    _dependencyLoaded: function(classItem,dependency){
//        dependency.loadStatus=eTag.Resources.LoadStatus.Loaded;
//        alert(dependency.name + ' loaded!');
//        //info = {typeName:'string',file:''}
//    },
//    loadDependency: function(classItem,dependency){
//        var self=this;
//        switch(dependency.type){
//            case eTag.Resources.ResourceType.Script:
//                // Ensure script is not already loaded.
//                if(this.findScript(dependency.url) != null){
//                    alert(dependency.url + ' already loaded!');
//                    dependency.loadStatus=eTag.Resources.LoadStatus.Loaded;
//                    return;
//                }
//                var js = document.createElement('script');
//                    js.setAttribute('type', 'text/javascript');
//                    js.setAttribute('src', dependency.url);
//                    js.onload = function(){self._dependencyLoaded(classItem,dependency)}; //firefox only
//                    js.onreadystatechange = function(){if(js.readyState=='loaded') self._dependencyLoaded(classItem,dependency)}; //IE only
//                    this._get_head().appendChild(js);
//                break;
//            case eTag.Resources.ResourceType.Css:
//            
//                break;
//        }
//        


//    },
//    loadDependencies: function(classItem){
//        if(classItem.dependencies.length==0){
//            //All dependencies loaded.
//            //Do directImport
//            return;
//        }
//        var loading = false;
//        for(var i=0; i < classItem.dependencies.length; i++){
//            var dependency = classItem.dependencies[i];
//            if(dependency.loadStatus==eTag.Resources.LoadStatus.Pending){
//                if(dependency.order!=99){
//                    //dependency must be is order dependent.
//                    this.loadDependency(classItem,dependency);
//                    return;
//                }
//                //load all the others which arent dependent.
//                this.loadDependency(classItem,dependency);
//                loading=true;
//            }
//        }
//        
//        //determine if dependencies are still loading
//        if(loading) return;
//        
//        
//        // No more dpendencies


//        
////        
////        alert(str);
////        return;
////        var h = document.getElementsByTagName('head')[0];
////        js = document.createElement('script');
////        js.setAttribute('type', 'text/javascript');
////        js.setAttribute('src', file);
////        h.appendChild(js);
////js.onload = testfunc; //firefox only
////js.onreadystatechange = function() { if(script.readyState=='loaded') testfunc(); }; //IE only
//    },
//    directImport: function(typeName, completeMethod, resourcePath, checkDependencies){
//    
//    },
//    importClass: function(typeName, completeMethod, resourcePath, checkDependencies){
//    
//        if(checkDependencies==null) checkDependencies=true;
//        //determine if already imported.
//        var classItem;
//        for (var i=0; i < this.classes.length; i++){
//           if(this.classes[i].typeName == typeName){
//                classItem = this.classes[i];
//                if(classItem.loaded) completeMethod(classItem);
//                else Array.add(this.classes[i].completeMethods,classItem);
//                return;
//           }
//        }

//        try{if(typeof eval(typeName) != 'undefined') return true;}
//        catch(err){}
//        
//        
//        var url = this._resourceLoaderUrl + '?t=' + escape(typeName);
//        if(checkDependencies) url += ('&cd=' + (checkDependencies?1:0));
//        if(resourcePath) url += '&rp=' + escape(resourcePath);
//        
//        var classItem = {typeName:typeName, resourcePath: resourcePath, dependencies: [], completeMethods: [completeMethod], loaded: false, src: url};
//        Array.add(this.classes,classItem);

//        var h = document.getElementsByTagName('head')[0];
//            js = document.createElement('script');
//            js.setAttribute('type', 'text/javascript');
//            js.setAttribute('src', url);
//            h.appendChild(js);
//    },
//    _reportDependencies: function(result){
//        var curClass;
//        for (var i=0; i < this.classes.length; i++){
//           if(this.classes[i].typeName == result.typeName){
//                curClass=this.classes[i];
//                Array.addRange(curClass.dependencies,result.dependencies);
//                break;
//           }
//        }
//        if(!curClass) alert('_reportDependencies error.');
//        //remove original resource script.
//        this.removeScript(curClass.src);
//        this.loadDependencies(curClass);
//    },
//    create: function(typeName, properties, events, references, element){
//        //type must be a string instead of a an actualy type.

//        
//    },
//    dispose: function(){
//    
//    },
//    initialize: function(){
//       eTag.Resources._ResourceManager.callBaseMethod(this, 'initialize');
//    }
}

eTag.Resources._ResourceManager.registerClass('eTag.Resources._ResourceManager',Sys.Component);
if(!eTag.Resources.ResourceManager) eTag.Resources.ResourceManager = $create(eTag.Resources._ResourceManager);







/* ResourceFile Object ***********************************************************************************************/
eTag.Resources.ResourceFile = function(id,resourceType,url){
    this._id=id;
    this._resourceType=resourceType;
    this._url=url;
    this._domElement=null;
    this._loadStatus=0;
    this._rm=eTag.Resources.ResourceManager;
    //Load -----------------------------------------------
    this._loadedDelegate = Function.createDelegate(this, this._loadedHandler);
    this._events=null;
    this._refererences=0;
}

eTag.Resources.ResourceFile.prototype = {
    get_id: function(){if(!this._id) return this._url;return this._id;},
    set_id: function(value){this._id=value;},
    get_events: function(){if(!this._events) this._events = new Sys.EventHandlerList();return this._events;},
    get_url: function(){return this._url;},
    set_url: function(value){this._url=value;},
    set_loadStatus: function(value){if(value != this._loadStatus){this._loadStatus=value;this._raise_loadStatusChanged();}},
    get_loadStatus: function(){return this._loadStatus;},
    get_resourceType: function(){return this._resourceType;},
    set_resourceType: function(value){this._resourceType=value;},
    add_refererence: function(){this._refererences++;},
    remove_refererence: function(){this._refererences--;},
    //Load Complete -----------------------------------------------
    add_loadStatusChanged: function(handler){this.get_events().addHandler('loadComplete',handler);},
    remove_loadStatusChanged: function(handler){this.get_events().removeHandler('loadComplete', handler);},
    _raise_loadStatusChanged: function(){var h = this.get_events().getHandler('loadComplete');if (h) h(this, Sys.EventArgs.Empty);},
    locate: function(){
        switch(this.get_resourceType()){
            case eTag.Resources.ResourceType.Script:
                //search head
                var head=document.getElementsByTagName('head')[0];
                var scripts=head.getElementsByTagName('script');
                   for(var i=0;i<scripts.length; i++){
                      if(scripts[i].src==this.get_url()){
                        this._domElement=scripts[i];
                        this._domElement.setAttribute('id', this.get_id() + '_s');
                        return true;
                      }
                   }
                //search document
                scripts=document.getElementsByTagName('script');
                   for(var i=0;i<scripts.length; i++){
                      if(scripts[i].src==this.get_url()){
                        this._domElement=scripts[i];
                        this._domElement.setAttribute('id', this.get_id() + '_s');
                        return true;
                      }
                   }
                break;
            case eTag.Resources.ResourceType.Css:
                alert('eTag.Resources.ResourceFile.locate not implemented!');
                break;
        }
        alert('Unable to locate resource file (' + this.get_id() + ')');
    },
    load: function(){
    if(this.get_loadStatus() != eTag.Resources.LoadStatus.Pending) return;
        switch(this.get_resourceType()){
            case eTag.Resources.ResourceType.Script:
                    if(document.getElementById(this.get_id() + '_s')) return;
                    this._domElement = document.createElement('script');
                    this._domElement.setAttribute('id', this.get_id() + '_s');
                    this._domElement.setAttribute('type', 'text/javascript');
                    this._domElement.setAttribute('src', this.get_url());
                    this._domElement.onload=this._loadedDelegate; //(firefox)
                    this._domElement.onreadystatechange=this._loadedDelegate; //(IE)
                    this._rm._get_head().appendChild(this._domElement);
                break;
            case eTag.Resources.ResourceType.Css:
                alert('eTag.Resources.ResourceFile.load not implemented!');
                break;
        }
    },
    _loadedHandler: function(){
        if(typeof this._domElement.readyState != 'undefined'){
            if(this._domElement.readyState!='loaded') return;
        }
        this.set_loadStatus(eTag.Resources.LoadStatus.Loaded);
    },
    dispose: function(){
        this._rm=null;
        if(this._events != null) Array.clear(this._events);
    }
}
eTag.Resources.ResourceFile.registerClass('eTag.Resources.ResourceFile',null, Sys.IDisposable);


///* ResourceDependencyDefinition Object ***********************************************************************************************/
//eTag.Resources.ResourceDependencyDefinition = function(typeName) {
//    this._typeName=typeName;
//    this._files=[]; //Array of {name:[name]
//    this._loadStatus=0;
//    this._dependencies=[]; // Array of eTag.Resources.DependencyDefinition
//    
//    // Delegates
//    this._fileLoadedDelegate = Function.createDelegate(this, this._fileLoadedHandler);
//    this._dependencyLoadedDelegate = Function.createDelegate(this, this._dependencyLoadedHandler);
//    this._events=null;
//}

//eTag.Resources.DependencyDefinition.prototype = {
//    get_events: function(){if(!this._events) this._events = new Sys.EventHandlerList();return this._events;},
//    get_typeName: function(){return this._typeName;},
//    set_typeName: function(value){this._typeName=value;},
//    
//    add_file: function(file){ // recomended params, item, index, array
//        if(eTag.$v.isArray(file)){
//            Array.forEach(this._files, this.add_file);
//        }else{
//            value.add_loadStatusChanged(this._fileLoadedDelegate);
//            Array.add(this._files,file);
//        }
//    },
//    add_dependency: function(dependency){
//        if(eTag.$v.isArray(dependency)){
//            Array.forEach(this._dependencies, this.add_dependency);
//        }else{
//            value.add_loadStatusChanged(this._dependencyLoadedDelegate);
//            Array.add(this._dependencies,dependency);
//        }
//    },
//    
//    //Resource File ---------------
//    _fileLoadedHandler: function(caller,args){
//    
//    },
//    //Dependencies
//    _dependencyLoadedHandler: function(caller,args){
//    
//    },
//    //Load Complete -----------------------------------------------
//    add_loadStatusChanged: function(handler){this.get_events().addHandler('loadComplete',handler);},
//    remove_loadStatusChanged: function(handler){this.get_events().removeHandler('loadComplete', handler);},
//    _raise_loadStatusChanged: function(){var h = this.get_events().getHandler('loadComplete');if (h) h(this, Sys.EventArgs.Empty);},
//}

//eTag.Resources.DependencyDefinition.registerClass('eTag.Resources.DependencyDefinition',null, Sys.IDisposable);




/* Browser Object ***********************************************************************************************/
eTag._Browser = function() {
    eTag._Browser.initializeBase(this);
    this._ua=navigator.userAgent.toLowerCase();
    this.major=parseInt(navigator.appVersion);
    this.minor=parseFloat(navigator.appVersion);
    
    this.ie=this._ua.indexOf("msie") != -1 && this._ua.indexOf("opera") == -1;
    this.ie3=this.ie && this.major < 4;
    this.ie4=this.ie && this.major == 4 && this._ua.indexOf("msie 4")!=-1;
    this.ie5=this.ie && this.major == 4 && this._ua.indexOf("msie 5.0")!=-1;
    this.ie55=this.ie && this.major == 4 && this._ua.indexOf("msie 5.5") !=-1;
    this.ie6=this.ie && this.major == 4 && this._ua.indexOf("msie 6")!=-1;
    this.ie6up=this.ie && !this.ie3 && !this.ie4 && !this.ie5 && !this.ie55 && !this.ie6;
    this.ie7=this.ie && this.major == 4 && this._ua.indexOf("msie 7")!=-1;
    this.ie7up=this.ie && !this.ie3 && !this.ie4 && !this.ie5 && !this.ie55 && !this.ie6 && !this.ie7;
    this.nav=this._ua.indexOf('mozilla')!=-1 && this._ua.indexOf('spoofer')==-1 && this._ua.indexOf('compatible') == -1 && this._ua.indexOf('opera')==-1 && this._ua.indexOf('webtv')==-1 && this._ua.indexOf('hotjava')==-1;
    this.nav2=this.nav && this.major == 2;
    this.nav3=this.nav && this.major == 3;
    this.nav4=this.nav && this.major == 4;
    this.navup=this.nav && this.major >= 4;
    this.nav6=this.nav && this.major == 5;
    this.nav6up=this.nav && this.major >= 5;
    this.navOnly=this.nav && this._ua.indexOf(";nav") != -1 || this._ua.indexOf("; nav") != -1;     
    this.fireFox=this.nav && this._ua.indexOf("firefox") != -1;
    this.mac=this._ua.indexOf('mac') !=-1;
    this.safari=this._ua.indexOf('safari') !=-1;
    this.chrome=this._ua.indexOf('chrome') !=-1;
    this.opera=this._ua.indexOf('opera') !=-1;
}
eTag._Browser.prototype={

}
eTag._Browser.registerClass('eTag._Browser', Sys.Component);
if(!eTag.$b) eTag.$b = $create(eTag._Browser);








/*********************** eTag.UnitType ***************************************************/
eTag.UnitType = function(){throw Error.invalidOperation()};
eTag.UnitType.prototype = {
    Pixel: 1,
    Point: 2,
    Pica: 3,
    Inch: 4,
    Mm: 5,
    Cm: 6,
    Percentage: 7,
    Em: 8,
    Ex: 9
}
eTag.UnitType.registerEnum("eTag.UnitType");

/* eTag.$v ***********************************************************************************************/
eTag._Variable=function() {
    eTag._Variable.initializeBase(this);
}

eTag._Variable.prototype = {
generateRandomId: function(){return(((1+Math.random())*0x10000)|0).toString(16).substring(1)},
cStr:function(v){return (v + "")},
cNum:function(v){v=this.cStr(v);if(v.indexOf(".") > 0) return parseFloat(v);else return parseInt(v)},
cInt:function(v){v=this.cStr(v);return parseInt(v,10)},
cFloat:function(v){v=this.cStr(v);return parseFloat(v)}, //Deprecated (use cFloat)
cCur:function(v){return this.cCur(v)},
cDate:function(v){
    if(typeof v.indexOf!='undefined') if(v.indexOf('/Date(') != -1) return new Date(Date(eval(v)));
    if(v instanceof Date) return v;
    if(this.isNumeric(v)) return Date(v);
    v=this.cStr(v);
    return new Date(v)
},
cBool:function(v){v=this.cStr(v);v=v.toLowerCase();if(v=="false" || v=="no" || v=="0" || v=="") return false;return true},
convert:function(dt,v){
switch(dt){
case 'boolean':if(v==null) return false;return this.cBool(v);
case 'float':if(v==null) return 0;return this.cFloat(v);
case 'int':if(v==null) return 0;return this.cInt(v);
case 'string':if(v==null) return null;return this.cStr(v);
case 'date':
if(v==null) return null;
if(v instanceof Date) return v;
return this.cDate(v);
}
return v;
},
getTypeName:function(o){if(this.isArray(o)) return "array";if(o instanceof Date) return "date";if(this.isString(o)) return "string";if(this.isBoolean(o)) return "boolean";if(this.isIntrinsicType(o)) return typeof(o);return this.getClassName(o)},
getFunctionName:function(fn){if(!fn) return '?';var tmp=fn.toString();var re=/(\s*function\s+)(\w+)(\s*\()/m;re.exec(tmp);return RegExp.$2},
getClassName:function(o){if(!o) return '?';if(o._typeOf) return o._typeOf;return this.getFunctionName(o.constructor)},


getMembers:function(o){var arr= new Array();for(property in o) arr[arr.length]=property;return arr},
isFunction:function(v){return typeof v=='function'},
isObject:function(v){return (v && typeof v=='object') || this.isFunction(v)},
isAlien:function(v){return this.isObject(v) && typeof v.constructor !='function'},
isArray:function(v){return (v instanceof Array)},
isBoolean:function(v){return (v instanceof Boolean)},
isUndefined:function(v){return typeof v=='undefined'},
isEmpty:function(value){
    if(!value) return true;
    if(typeof value.IsEmpty!='undefined') return value.IsEmpty;
    return false
},

isNull:function(v){return typeof v == 'object' && !v},
isNumeric:function(v,validChars){
if(v==null) return false;
if(v==0) return true;
if(v=='') return false;
if(!isNaN(v)) return true;
if(!v.length) return false;
if(!validChars) validChars='';validChars += "0123456789.,";for(i = 0; i < v.length; i++){if(validChars.indexOf(v.charAt(i))==-1) return false;};return true},
isMoney:function(v){return this.isNumeric(v,"$")},
isString:function(v){return (typeof v === "string") || (v instanceof String);},
isIntrinsicType:function(v){var vt;if(this.isArray(v)) vt="array";if(v instanceof Date) vt="date";if(this.isString(v)) vt="string";if(this.isBoolean(v)) vt="boolean";if(!vt) vt=typeof(v);return this.isIntrinsicTypeByName(vt)},
isIntrinsicTypeByName : function(value){
    if(!this.isString(value)) return false;
    value=value.toLowerCase();
    switch(value){
        case "int":
        case "string":
        case "number":
        case "boolean":
        case "bool":
        case "dateTime":
        case "date":
        case "float":
        return true;
    };
return false
},
isNothing:function(v){return (this.isUndefined(v) || v==null)},
isInteger:function(s){if(!isNaN(s))return true;var i;for(i = 0; i < s.length; i++){var c = s.charAt(i);if (((c < "0") || (c > "9"))) return false};return true}, 
_isDate_dtCh:"/",
_isDate_minYear:1900,
_isDate_maxYear:2100,
_isDate_SCIB:function(s, bag){var i;var returnString = "";for (i = 0; i < s.length; i++){var c = s.charAt(i);if(bag.indexOf(c) == -1) returnString += c;};return returnString},
_isDate_daysInFeb:function(year){return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 )},
_isDate_DaysArr:function(n){var arr = new Array(n);for(var i = 1; i <= n; i++){arr[i] = 31;if (i==4 || i==6 || i==9 || i==11) {arr[i] = 30};if (i==2) {arr[i] = 29};};return arr},
isDate:function(dtStr){var daysInMonth = this._isDate_DaysArr(12);var pos1=dtStr.indexOf(this._isDate_dtCh);var pos2=dtStr.indexOf(this._isDate_dtCh,pos1+1);var strMonth=dtStr.substring(0,pos1);var strDay=dtStr.substring(pos1+1,pos2);var strYear=dtStr.substring(pos2+1);strYr=strYear;if(strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1);if(strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1);for(var i = 1; i <= 3; i++){if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1);};month=parseInt(strMonth);day=parseInt(strDay);year=parseInt(strYr);if(pos1==-1 || pos2==-1){return false;};if(strMonth.length<1 || month<1 || month>12){return false;};if(strDay.length<1 || day<1 || day>31 || (month==2 && day>this._isDate_daysInFeb(year)) || day > daysInMonth[month]){return false;};if(strYear.length != 4 || year==0 || year<this._isDate_minYear || year>this._isDate_maxYear){return false;};if(dtStr.indexOf(this._isDate_dtCh,pos2+1)!=-1 || this.isInteger(this._isDate_SCIB(dtStr, this._isDate_dtCh))==false) return false;return true},
dateDiff:function(d1s,d2s){d1= Date.parse(d1s);d2= Date.parse(d2s);return ((d2-d1)/(24*60*60*1000))},
monthToDays: function(year, month){ 
  var add = 0; 
  var result = 0; 
    if((year % 4 == 0) && ((year % 100  != 0) || ((year % 100 == 0) && (year % 400 == 0)))) add++; 
     
  switch(month) 
  { 
     case 0: return 0; 
     case 1: result = 31; break; 
     case 2: result = 59; break; 
     case 3: result = 90; break; 
     case 4: result = 120; break; 
     case 5: result = 151; break; 
     case 6: result = 181; break; 
     case 7: result = 212; break; 
     case 8: result = 243; break; 
     case 9: result = 273; break; 
     case 10: result = 304; break; 
     case 11: result = 334; break; 
     case 12: result = 365; break; 
  } 
  if(month > 1) result += add; 
  return result;      
},
clone:function(value,excludePrivate){
    var t=this.getTypeName(value);
    if(this.isIntrinsicTypeByName(t)) return value;
    switch(t){
        case "array": return Array.clone(value);
        case "object":
        default:
            if(value.clone !== undefined) return value.clone();
            try{
                ro=eval("new "+ t + "()");
            }catch(e){
                ro={};
            };
            break;
      };
      
      for(var name in value){
        var _t=this.getTypeName(value[name]);
        if(name!='Base' && name!='inherits' && name!='_typeOf' && _t!='Function' && name!='_ESL'){
            ro[name]=this.clone(value[name]);
        };
      };
      return ro;
},
copyPropertyValues: function(src,des,deep){
    if(!deep) deep=false;
    for(p in src){
        if(deep) des[p]=this.clone(src[p]);
        else des[p] = src[p];
    }
},
cUnit: function (value,el){
    if(value.Value !== undefined) return value;
    var isEmpty=false;
    var type=eTag.UnitType.Pixel;
    if(this.isNumeric(value)){
        value=value;
        isEmpty=false;
        type=eTag.UnitType.Pixel;
    }else{
        value=value.trim().toLowerCase();
        if(value=='auto'){
            return value;
        }else if(value.indexOf('px') != -1){
            type=eTag.UnitType.Pixel;
            value=parseInt(value);
            isEmpty=(value==false);
        }else if(value.indexOf('pt') != -1){
            type=eTag.UnitType.Point;
            alert('cUnit Not Implemented for pt');
            return 0;
        }else if(value.indexOf('pc') != -1){
            type=eTag.UnitType.Pica;
            alert('cUnit Not Implemented for pc');
            return 0;
        }else if(value.indexOf('in') != -1){
            type=eTag.UnitType.Inch;
            alert('cUnit Not Implemented for in');
            return 0;
        }else if(value.indexOf('mm') != -1){
            type=eTag.UnitType.Mm;
            alert('cUnit Not Implemented for mm');
            return 0;
        }else if(value.indexOf('%') != -1){
            type=eTag.UnitType.Percentage;
            alert('cUnit Not Implemented for %');
            return 0;
        }else if(value.indexOf('em') != -1){
            type=eTag.UnitType.Em;
            alert('cUnit Not Implemented for em');
            return 0;
        }else if(value.indexOf('ex') != -1){
            type=eTag.UnitType.Ex;
            alert('cUnit Not Implemented for ex');
            return 0;
        }
    }

    return {"IsEmpty":isEmpty,"Type":type,"Value":value};

},
cPixel:function(value,el){
    if(this.isNumeric(value)) return value;

    if(value.Value !== undefined){ // Handle Unit
        //TODO: Make it work for different 
        return value.Value;
    }
    
    value=value.trim().toLowerCase();
    if(value.indexOf('px') != -1){
        return parseInt(value);
    }else if(value.indexOf('pt') != -1){
        alert('cPixel Not Implemented for pt');
        return 0;
    }else if(value.indexOf('pc') != -1){
        alert('cPixel Not Implemented for pc');
        return 0;
    }else if(value.indexOf('in') != -1){
        alert('cPixel Not Implemented for in');
        return 0;
    }else if(value.indexOf('mm') != -1){
        alert('cPixel Not Implemented for mm');
        return 0;
    }else if(value.indexOf('%') != -1){
        alert('cPixel Not Implemented for %');
        return 0;
    }else if(value.indexOf('em') != -1){
        alert('cPixel Not Implemented for em');
        return 0;
    }else if(value.indexOf('ex') != -1){
        alert('cPixel Not Implemented for ex');
        return 0;
    }
},
unitTypeToString: function(value){
        switch(value){
            case eTag.UnitType.Pixel:
                return 'px';
            case eTag.UnitType.Point:
                return 'pt';
            case eTag.UnitType.Pica:
                return 'pc';
            case eTag.UnitType.Inch:
                return 'in';
            case eTag.UnitType.Mm:
                return 'mm';
            case eTag.UnitType.Cm:
                return 'cm';
            case eTag.UnitType.Percentage:
                return '%';
            case eTag.UnitType.Em:
                return 'em';
            case eTag.UnitType.Ex:
                return 'ex';
            default: 
                return 'px'
            }
}
}
eTag._Variable.registerClass('eTag._Variable', Sys.Component);
if(!eTag.$v) eTag.$v = $create(eTag._Variable);




/* eTag.BaseObject Object ***********************************************************************************************/
eTag.BaseObject = function(){
    this._guid=null;
    this._id=null;
    this._clientEvents=null;
    this._parent=null;
    this._listRef=[];
    this._parentRef=[];
    this._tag=null;
}

eTag.BaseObject.prototype={
    get_guid: function(){
        if(!this._guid) this._guid = eTag.$d.getUniqueId(Object.getType(this).getName(),this.$doc()).toString().replace(/[\.]/g,'');    
        return this._guid;
    },
  _addParentRef: function(value){
    if(value==null) return;
     if(Array.contains(this._parentRef,value)==false){
        Array.add(this._parentRef,value);
     }
  },
  _removeParentRef: function(value){
     if(Array.contains(this._parentRef,value)==false){
        Array.remove(this._parentRef,value);
     }
  },
  _addListRef: function(value){
     if(value==null) return;
     if(Array.contains(this._listRef,value)==false){
        Array.add(this._listRef,value);
     }
  },
  _removeListRef: function(value){
     if(Array.contains(this._listRef,value)==false){
        Array.remove(this._listRef,value);
     }
  },
  // Property: ID
  get_id: function(){return this._id;},
  set_id: function(value,registerReference){
  if(typeof(registerReference) === 'undefined') registerReference=true;
  if(!eval('window.' + value) && registerReference==true) eval('window.' + value + '=this;');
  this._id=value;
  }
  ,get_tag: function(){return this._tag}
  ,set_tag: function(value){this._tag=value}
   ,get_parent: function(){return this._parent;},
   set_parent: function(value){this._parent=value;},
  /* Events */
  get_clientEvents: function(){return this._clientEvents},
  set_clientEvents: function(value){
        if(this._clientEvents !== value){
            // Unregister Existing Client Events
            if(this._clientEvents){
                for(var i=0; i < this._clientEvents.length; i++){
                    var e=this._clientEvents[i];
                    this.remove_Event(e.EventName,eval(e.EventHandler));
                };
            };
            this._clientEvents=value;
            for(var i=0; i < this._clientEvents.length; i++){
                var e=this._clientEvents[i];
                this.add_Event(e.EventName,eval(e.EventHandler));
             };
        };
    },
  add_Event: function(id,handler){
    //this.get_events().addHandler(e,handler);
    Array.add(this.get_events()._getEvent(id, true), handler);
  },
  remove_Event: function(e,handler){this.get_events().removeHandler(e,handler);},
  raiseEvent: function(e,args,caller){
        if(!caller) caller=this;
        var h=this.get_events().getHandler(e);
        if(!args) args=Sys.EventArgs.Empty;   
        if(h)h(caller, args);
        
        //Get * (ALL)
        var ah=this.get_events().getHandler('*');
        if(ah)ah(caller, {"eventName":e,"args":args});
  },
  get_serilizedValues: function(){throw Error.notImplemented('get_serilizedValues must be implemented.');},
  set_serilizedValues: function(value){throw Error.notImplemented('set_serilizedValues must be implemented.');},
  add_disposing: function(handler){
     this.add_Event('disposing',handler);
  },
  dispose: function(){
        eTag.BaseObject.callBaseMethod(this, 'dispose');
        if(this._clientEvents){
            for(var i=0; i < this._clientEvents.length; i++){
                var e=this._clientEvents[i];
                this.remove_Event(e.EventName,eval(e.EventHandler));
            };
        };
  }
}

eTag.BaseObject.registerClass('eTag.BaseObject', Sys.Component);



/*********************** eTag.ButtonList ***************************************************/

eTag.BaseList = function() {
    eTag.BaseList.initializeBase(this);
    this._parent=null;
    this._items=null;
}

eTag.BaseList.prototype = {
     set_parent: function(value){this._parent=value}
    ,get_parent: function(){return this._parent}
    ,item: function(value){
        if(eTag.$v.isNumeric(value)) return this.get_items()[value];
        else{
            for(var i = 0; i < this.get_items().length; i++){
                if(this.get_items()[i].get_id() == value) return this.get_items()[i];
            }
        }
        return null;
    }
    ,getItemByID: function(id){
        if(!this._items) return null;
        var items=this._items;
        for(var i = 0; i < items.length; i++){
            if(items[i].get_id() == id) return items[i];
        }
        return null;
    }
    ,getItemIndex: function(item){
        for(var i = 0; i < this.get_items().length; i++){
            if(this.get_items()[i].get_id() == item.get_id()) return i;
        }
        return -1;
    }
    ,get_items: function(){if(!this._items) return this._items=[];return this._items;}
    ,set_items: function(value){
        if(eTag.$v.isArray(value)) Array.forEach(value, this.add);
        else this.add(value);
    }
    ,add: function(item){;
        if(item.set_parent !== undefined) item.set_parent(this);
        if(!item.get_id()) item.set_id('item' + eTag.$v.generateRandomId());
        Array.add(this.get_items(),item);
        this.raiseEvent('ItemAdded',{list:this,item:item}); 
    }
    ,count: function(){
        if(!this._items) return null;
        return this._items.length;
    }
    ,remove: function(item){
        return Array.remove(this.get_items(),item);
    }
    ,clear: function(){
        if(!this._items) return;
        Array.clear(this._items);
    }
    ,dispose: function(){
        if(this._items != null){
            for(var i = 0; i < this.get_items().length; i++) this.get_items()[i].dispose();
            Array.clear(this._items);
            this._items=null;
        }
        eTag.BaseList.callBaseMethod(this, 'dispose');
    }
}
eTag.BaseList.registerClass('eTag.BaseList', eTag.BaseObject);


/*********************** eTag.RectSide ***************************************************/
eTag.RectSide = function(){throw Error.invalidOperation()};
eTag.RectSide.prototype = {
    Top : 0,
    Right : 1,
    Bottom : 2,
    Left : 3
}
eTag.RectSide.registerEnum("eTag.RectSide", false);


/*********************** eTag.Web.ServerRequestMode ***************************************************/
eTag.Web.ServerRequestMode = function(){throw Error.invalidOperation()};
eTag.Web.ServerRequestMode.prototype = {
    Inherit: 0,
    Callback: 1,
    Isolated: 2,
    LightWeight: 3
}
eTag.Web.ServerRequestMode.registerEnum("eTag.Web.ServerRequestMode");


/*********************** eTag.Web.Client.PropertyPersistenceMode ***************************************************/
eTag.Web.Client.PropertyPersistenceMode = function(){throw Error.invalidOperation()};
eTag.Web.Client.PropertyPersistenceMode.prototype = {
    None : 0,
    ToClientOnly : 1,
    ToServerOnly : 2,
    Bidirectional : 3
}
eTag.Web.Client.PropertyPersistenceMode.registerEnum("eTag.Web.Client.PropertyPersistenceMode", false);


/*********************** eTag.Web.Client.MethodPersistenceMode ***************************************************/
eTag.Web.Client.MethodPersistenceMode = function(){throw Error.invalidOperation()};
eTag.Web.Client.MethodPersistenceMode.prototype = {
    Explicit : 0,
    ToClientOnly : 1,
    ToServerOnly : 2,
    Bidirectional : 3
}
eTag.Web.Client.MethodPersistenceMode.registerEnum("eTag.Web.Client.MethodPersistenceMode", false);


/*********************** eTag.Web.Client.PropertyDirtyFlagCondition ***************************************************/
eTag.Web.Client.PropertyDirtyFlagCondition = function(){throw Error.invalidOperation()};
eTag.Web.Client.PropertyDirtyFlagCondition.prototype = {
    Never : 0,
    ServerSideChange: 1,
    ClientSideChange: 2,
    ClientOrServerSideChange: 3
}
eTag.Web.Client.PropertyDirtyFlagCondition.registerEnum("eTag.Web.Client.PropertyDirtyFlagCondition", false);


/*********************** eTag.Side ***************************************************/
eTag.Context = function(){throw Error.invalidOperation()};
eTag.Context.prototype = {
    Constructor : 0,
    User: 1,
    ServerResponse: 2
}
eTag.Context.registerEnum("eTag.Context", false);



/*********************** eTag.PropertyInfo ***************************************************/
eTag.PropertyInfo = function(props,owner){
    this._value=null;
    this._previousValue=null
    this._serverName=props[0];
    this._name=props[1];
    this._type=props[2];
    this._persistenceMode=props[3];
    this._defaultValue=props[4];
    this._dirtyFlagCondition=props[5];
    this._isConstant=props[6];
    this._isPrimaryKey=props[7];
    this._isForeignKey=props[8];
    this._foreignKeySupportedTypes=props[9];
    this._owner=owner;
    this._isDirty=false;
    this._arrayOfTypeInfo=null;
    if(!this._persistenceMode) this._persistenceMode=0;
}
//TODO: improve _isDirty... instead of using a flag keep the previous value.. orginalValue
eTag.PropertyInfo.prototype = {
    get_typeName: function(){return this._type.t;},
    get_arrayOf: function(){return this._type.o;},
    get_foreignKeySupportedTypes: function(){return this._foreignKeySupportedTypes;},
    get_isForeignKey: function(){return this._isForeignKey;},
    get_isPrimaryKey: function(){return this._isPrimaryKey;},
    clearDirtyFlag: function(){this._isDirty=false;},
    get_dirtyFlagCondition: function(){return this._dirtyFlagCondition;},
    set_isDirty: function(value,context){
        if(this._isDirty == value) return;
        if(context==null) context=eTag.Context.User;
        var dfc=this._dirtyFlagCondition;
        if(dfc==0) return;
        if(context==eTag.Context.Constructor) return;
        if(context==eTag.Context.User && (dfc != 2 && dfc != 3)) return;
        if(context==eTag.Context.ServerResponse && (dfc != 1 && dfc != 3)) return;
        this._isDirty=value;
        if(this.get_owner().get_isInitialized()) this.get_owner().raiseEvent('DirtyFlagChanged',{"property":this, "isDirty":this._isDirty, "context": context});
    },
    get_isDirty: function(){
        
        return this._isDirty;
    },
    get_defaultValue:function(){return this._defaultValue;},
    set_defaultValue:function(value){this._defaultValue=value},
    get_owner: function(){return this._owner;},
    get_serverName: function(){return this._serverName;},
    get_name: function(){return this._name;},
    get_type: function(){return this._type;},
    get_persistenceMode: function(){return this._persistenceMode},
    get_value: function(){
        if(this._value==null) return this._defaultValue;
        return this._value;
    },
    getStateData: function(){
        if(this.get_value()==null) return null;
        if(eTag.$v.isIntrinsicTypeByName(this.get_typeName())==true) return this.get_value();
        else if(this.get_value().getStateData !== undefined){
            if(this.get_typeName() == 'array'){
                if(this.get_value().get_items().length==0) return null;
            }
            return this.get_value().getStateData();
        }else return this.get_value();
    },
    set_value: function(value, context){
        if(context==null) context=eTag.Context.User;
        if(eTag.$v.isIntrinsicTypeByName(this.get_typeName())==true){
            value=eTag.$v.convert(this.get_typeName(),value);
            if((value instanceof Date) && (this._value instanceof Date)){
                if(value.toLocaleString() == this._value.toLocaleString()) return;
            }else if (value == this._value) return;
            
            this._previousValue=this._value;
            this._value=value;
        }else if(this.get_typeName() == 'array'){
            if(this._value==null){
              this._value = new eTag.List();
              this._value._listOf=this.get_arrayOf();
              this._value._owner=this._owner;
              this._value.set_constructorArgs(value);
            }else this._value.loadStateData(value);
            return;
        }else{
            if(eTag.$v.isString(this.get_typeName())){
                if(eval(this.get_typeName()) !== undefined){
                    if(this._value==null){
                        this._value=eval('new ' + this.get_typeName() + '()');
                        this._value.set_constructorArgs(value);
                    }else this._value.loadStateData(value);
                }else this._value=value;
            }else this._value=value;
        }
        
        
        if(this.get_owner().get_isInitialized()){
            this.get_owner().raiseEvent('PropertyChanged',{"property":this,"context": context,"previousValue":this._previousValue, "value":this._value});
        }
        this.set_isDirty(true,context);
    }
}

eTag.PropertyInfo.registerClass('eTag.PropertyInfo',Sys.Component);



//TODO: Set Ajax Mode at the Method Level| Inherit, NetCallBack, AjaxNet, Light



/*********************** eTag.MethodInfo ***************************************************/
eTag.MethodInfo = function(props,owner){
    this._serverName=props[0];
    this._name=props[1];
    this._persistenceMode=props[2];
    this._clearsDirtyFlag=props[3];
    this._serverRequestMode=props[4];
    this._persistedProperties=props[5];
    this._owner=owner;
    if(!this._persistenceMode) this._persistenceMode=0;
    this._serverRequestCompleteDelegate=Function.createDelegate(this, this._serverRequestComplete);
    this._serverRequestErrorDelegate=Function.createDelegate(this, this._serverRequestError);
    this._webRequestCompletedDelegate=Function.createDelegate(this, this._webRequestCompleted);
    this._webRequest=null;
}

eTag.MethodInfo.prototype = {
    get_owner: function(){return this._owner;},
    get_serverName: function(){return this._serverName;},
    get_name: function(){return this._name;},
    get_persistenceMode: function(){return this._persistenceMode},
    get_persistedProperties: function(){return this._persistedProperties},
    get_clearsDirtyFlag: function(){return this._clearsDirtyFlag},
    get_serverRequestMode: function(){return this._serverRequestMode;},
    set_serverRequestMode: function(value){this._serverRequestMode=value;},
    invoke: function(args,succeededRequest,failedRequest,userContext){
        var bc_args={request:{method:this, args:args, userContext:userContext}, cancel:false};
        this._owner.raiseEvent('BeforeServerRequest',bc_args);
        
        if(bc_args.cancel) return; // Canceled.
        var context = {method:this,args:args,succeededRequest:succeededRequest,failedRequest:failedRequest,userContext:userContext, sender: this};
        
        var state=null;
        var xstate=null;
        //Get State
        if(this._persistenceMode == 2 || this._persistenceMode == 3) state=this._owner.getStateData();
        
        // this._get_properties()[n];
        
        if(this._persistedProperties != null){
            for(var i=0; i < this._persistedProperties.length; i++){
                if(!xstate) xstate=[];
                var pmode=this._persistedProperties[i][1];
                if(pmode==eTag.Web.Client.PropertyPersistenceMode.ToServerOnly || pmode==eTag.Web.Client.PropertyPersistenceMode.Bidirectional){
                    var p=this._owner._get_properties()[this._persistedProperties[i][0]];
                    Array.add(xstate,p.getStateData());
                }
            }
        }
        // Prep data
        var data = Sys.Serialization.JavaScriptSerializer.serialize({__ET_SRMN:this._serverName,args:args,__ET_S:state, __ET_XS:xstate});
        context.serverRequestMode=this._owner.get_serverRequestMode();
        
        var srm = this.get_serverRequestMode();
        if(srm == eTag.Web.ServerRequestMode.Inherit) srm=this._owner.get_serverRequestMode();
        switch(srm){
            case eTag.Web.ServerRequestMode.Callback:
                if(this._owner.get_wformCB()== null){
                    throw Error.invalidOperation('Page not registered for Callbacks.');
                }
                this._owner.get_wformCB()(data,this._serverRequestCompleteDelegate,context,this._serverRequestErrorDelegate);
                break;
            case eTag.Web.ServerRequestMode.LightWeight:
                     var url = location.href;
                         url += (url.indexOf('?') == -1)? '?': '&';
                         url += '__ET_CTRID=' + this._owner.get_id();
                         url += '&__ET_SRM=' + srm;
                        
                     var req = new Sys.Net.WebRequest();
                        req.add_completed(this._webRequestCompletedDelegate);
                        req.set_url(url); 
                        req.set_httpVerb("POST");
                        req.get_headers()["Content-Length"] = data.length;
                        req.set_body(data);
                        req.set_userContext(context);
                        req.invoke();
                break;
            case eTag.Web.ServerRequestMode.Isolated:
                     var url = 'eTagSH.axd?a=mc';
                         url += '&tn=' + this._owner.get_typeName();
                         url += '&an=' + this._owner.get_assemblyName();
                         url += '&__ET_SRM=' + srm;
                     var req = new Sys.Net.WebRequest();
                        req.add_completed(this._webRequestCompletedDelegate);
                        req.set_url(url); 
                        req.set_httpVerb("POST");
                        req.get_headers()["Content-Length"] = data.length;
                        req.set_body(data);
                        req.set_userContext(context);
                        req.invoke();
            
        } 
    },
    _serverRequestError: function(message, context){
        if(context.failedRequest) context.failedRequest(message,context.userContext);
        var err = Error.create(message);
        var bc_args={method:context.method, userContext:context.userContext, error:err};
        this._owner.raiseEvent('ServerRequestError',bc_args);
    },
    _serverRequestComplete: function(result,context){
        //Update Properties
        var jresult;
         eval('jresult=' + result + ';');
         if(!jresult.mr) jresult.mr=null;
         if(!jresult.s) jresult.s=null;
         else jresult.s = eval(jresult.s);
         
         var bc_args={method:context.method, result:(!jresult.mr?null:jresult.mr), userContext:(!context.userContext?null:context.userContext)};
         
         if(jresult.cancel==true){
            this._owner.raiseEvent('ServerRequestCanceled',bc_args);
            return;
         }
        this._owner.loadStateData(jresult.s[0]);
        if(jresult.s[1]!=null){
            var partIndex=0;
            for(var i=0; i < this._persistedProperties.length; i++){
                var pmode=this._persistedProperties[i][1];
                if(pmode==eTag.Web.Client.PropertyPersistenceMode.ToClientOnly || pmode==eTag.Web.Client.PropertyPersistenceMode.Bidirectional){
                    var p=this._owner._get_properties()[this._persistedProperties[i][0]];
                    p.set_value(jresult.s[1][partIndex],eTag.Context.ServerResponse);
                    partIndex++;
                }
            }
        }
        if(this._clearsDirtyFlag == true) this._owner.clearDirtyFlag();
        this._owner.raiseEvent('ServerRequestComplete',bc_args);
        if(context.succeededRequest) context.succeededRequest(this._owner,bc_args);
    },
    _webRequestCompleted: function(executor, eventArgs){
        if(executor.get_responseAvailable()){   
            var req = executor.get_webRequest()
                req.remove_completed(this._webRequestCompletedDelegate);
            var data = executor.get_responseData();
            this._serverRequestComplete(data,req.get_userContext());
        }else{
            if (executor.get_timedOut()) alert("Timed Out");
            else if (executor.get_aborted()) alert("Aborted");
        }
    }

}

eTag.MethodInfo.registerClass('eTag.MethodInfo',Sys.Component);




/* eTag.Component Object ***********************************************************************************************/
eTag.Component = function() {
    eTag.Component.initializeBase(this);
    this._properties=null;
    this._serverRequestMode=eTag.Web.ServerRequestMode.Callback;
    this._dataSource=null;
    this._wformCB=null;
    this._typeName=null;
    this._assemblyName=null;
    this._constructorArgs=null;
    this._primaryKeyMember=null;
    this._GUID=null;
    this._typeInfo=null;
    this._lstFlagRemoveReq=false;
}

eTag.Component.prototype={
    get_primaryKeyMember: function(){
       if(!this._primaryKeyMember){
           for(var n in this._get_properties()){
                var m = this._get_properties()[n];
                if(eTag.PropertyInfo.isInstanceOfType(m)==true){
                    if(m.get_isPrimaryKey()==true){
                        this._primaryKeyMember=m;
                        break;
                    }
                }
            }  
        }
        return this._primaryKeyMember;
    },
    set_constructorArgs: function(value){
        this._constructorArgs=value[0];
    },
    get_typeInfo: function(){
        if(!this._typeInfo) this._typeInfo = {"an": this.get_assemblyName(), "tn":this.get_typeName()};
        return this._typeInfo;
    },
    loadStateData: function(value){
        if(!value) return;
        var partIndex=0;
        
        if(value != null){
            for(var i=0; i < this._pdef.length; i++){
                var p=this._get_properties()[this._pdef[i][0]];
                var per=p._persistenceMode;
                    if(per==eTag.Web.Client.PropertyPersistenceMode.ToClientOnly || per==eTag.Web.Client.PropertyPersistenceMode.Bidirectional){
                        p.set_value(value[partIndex],eTag.Context.ServerResponse);
                        partIndex++;
                    }
            }
        }
    },
    getStateData: function(){
        var r=[];
        for(var i=0; i < this._pdef.length; i++){
            var p=this._get_properties()[this._pdef[i][0]];
            var per=p._persistenceMode;
                if(per==eTag.Web.Client.PropertyPersistenceMode.ToServerOnly || per==eTag.Web.Client.PropertyPersistenceMode.Bidirectional){
                    Array.add(r,p.getStateData());
                }
        }
        return r;
    },
    setPropertyValues: function(values){
        for(var item in values){
            if(!this['set_' + item]) throw Error.invalidOperation(String.format(Sys.Res.propertyUndefined, item));
            this['set_' + item](values[item]);
        }
    },
    isDirty: function(){
        for(var n in this._get_properties()){
            var p = this._get_properties()[n];
            if (typeof(p.isDirty) !== 'undefined'){
               if(p.isDirty()==true) return true;
            }
        }
        return false;
    },
    clearDirtyFlag: function(){
        for(var n in this._get_properties()){
            var p = this._get_properties()[n];
            if (typeof(p.clearDirtyFlag) !== 'undefined') p.clearDirtyFlag();
        }
        this.raiseEvent('DirtyFlagsCleared',null);
    },
    _get_methods: function(){
        if(!this._methods && this._mdef.length > 0){
            this._methods=[];
            for(var i=0; i < this._mdef.length; i++) this._methods[this._mdef[i][0]]=new eTag.MethodInfo(this._mdef[i],this);
        }
        return this._methods;
    },
    _get_method: function(name){return this._get_methods()[name];},
    _get_properties: function(){
        if(!this._properties && this._pdef.length > 0){
            this._properties=[];
            for(var i=0; i < this._pdef.length; i++) this._properties[this._pdef[i][0]]=new eTag.PropertyInfo(this._pdef[i],this);
        }
        if(this._properties!=null && this._constructorArgs!=null){
            for(var i=0; i < this._pdef.length; i++){
                this._properties[this._pdef[i][0]].set_value(this._constructorArgs[i],eTag.Context.Constructor);
            }
            this._constructorArgs=null;
        }
        return this._properties;
    },
    _get_property: function(name){
        return this._get_properties()[name];
     },
  /* General */
  // Property: ServerRequestMode
  get_serverRequestMode: function(){return this._serverRequestMode;},
  set_serverRequestMode: function(value){this._serverRequestMode=value;},
  /* Data */
  // Property: dataSourceID
  get_dataSourceID: function(){return this._dataSourceID;},
  set_dataSourceID: function(value){this._dataSourceIDvalue;},
  
  // Property: dataSourceID
  get_dataSource: function(){
    var ds = this._dataSource;
    if(!ds && this.get_dataSourceID()){ds=$find(this.get_dataSourceID());this.set_dataSource(ds)}
    if(!ds) this.raiseEvent('NeedDataSource',null);
    if(!ds && this.get_dataSourceID()){ds=$find(this.get_dataSourceID());this.set_dataSource(ds)}
    if(!ds) alert('dataSource not set.');
    return ds;
  },
  set_dataSource: function(value){this._dataSource=value;},
  
  dataBind: function(){
    if(this.get_dataSource()) this.get_dataSource()._dataBind();
  },
  
  // Property: wformCB
  get_wformCB: function(){return this._wformCB;},
  set_wformCB: function(value){this._wformCB=value},
  dispose: function(){
        eTag.Component.callBaseMethod(this, 'dispose');
        this.set_dataSource(null);
  }
}

eTag.Component.registerClass('eTag.Component', eTag.BaseObject);


/* eTag.Web.ScriptManager  Object ***********************************************************************************************/
eTag.Web.ScriptManager = function(){
    eTag.Web.ScriptManager.initializeBase(this);
}

eTag.Web.ScriptManager.prototype = {
}
eTag.Web.ScriptManager.registerClass('eTag.Web.ScriptManager',eTag.Component);

/* eTag.List Object ***********************************************************************************************/
eTag.List = function() {
    eTag.List.initializeBase(this);
    this._items=null;
    this._listOf=null;
    this._constructorArgs=null;
    this._owner=null;
    this._keys=[];
    this._types=[];
}

eTag.List.prototype={
    set_constructorArgs: function(value){this._constructorArgs=value;},
    _loadItem: function(data,tryFind){
       if(tryFind === undefined) tryFind=true;
       var isNew=false;
       var obj=null;
       if(data.k !== undefined && tryFind == true) obj=this.itemByKey(data.k);
       if (!obj){
            if(data.t !== undefined && data.t != null){
                if(eTag.$v.isString(data.t)){
                    if(eval(data.t) !== undefined) obj=eval('new ' + data.t + '()');
                    else obj=data.d;
                }else{
                    obj=data.d;
                    obj._type=data.t;
                }
            }else{
                if(eTag.$v.isString(this._listOf)){
                    if(eTag.$v.isIntrinsicTypeByName(this._listOf)==true) obj=eTag.$v.convert(this._listOf,data.d);
                    else{
                        if(eval('typeof(' + this._listOf + ')') !== "undefined") obj=eval('new ' + this._listOf + '()');
                        else obj=data.d;
                    }
                }else obj=data.d;
            }
            isNew=true;
         }
        if(obj.set_constructorArgs !== undefined) obj.set_constructorArgs(data.d);
        if(obj._lstFlagRemoveReq !== undefined) obj._lstFlagRemoveReq=false;
        if(isNew) this.add(obj);
    },
    loadStateData: function(data){
      this._constructorArgs=null;
      if(!data){this.clear();return;}
      var temp;
      if(this._items != null){
          temp=[];
          for(var i=0; i < this._items.length; i++){
            var item=this._items[i];
            if(item._lstFlagRemoveReq !== undefined){
                item._lstFlagRemoveReq=true;
                Array.add(temp, item);
            }
          }
          this._items=temp;
      }
      for(var i=0; i < data.length; i++) this._loadItem(data[i],true);
      if(this._items != null){
          temp=[];
          for(var i=0; i < this._items.length; i++){
            var item=this._items[i];
            if(item._lstFlagRemoveReq !== undefined){
                if(item._lstFlagRemoveReq==false) Array.add(temp, item);
            }else Array.add(temp, item);
          }
          this._items=temp;
      }
    },
    getStateData: function(){
        if(this.get_items().length==0) return null;
        var d=[];
    
        var t;
        if(this._listOf==null) t=null;
        else if(eTag.$v.isString(this._listOf)){
            if(this.get_items()[0].get_typeInfo !== undefined) t=this.get_items()[0].get_typeInfo();
        }else t=this._listOf;
        
        for(var i=0; i < this.get_items().length; i++){
            var li=this.get_items()[i];
            var item={};
            if(li.get_typeInfo !== undefined){
                if(li.get_typeInfo() !== t) item.t=li.get_typeInfo();
            }
            if(li.getStateData !== undefined) item.d = li.getStateData();
            else item.d = li;
            Array.add(d, item);
        }
        return {"t":t,"d":d};
    },
    get_listOf: function(){return this._listOf;},
    get_items: function(){
        if(this._constructorArgs != null){
            this.clear();
            for(var i=0; i < this._constructorArgs.length; i++) this._loadItem(this._constructorArgs[i],false);
            this._constructorArgs=null;
        }
        return this._items;
    },
    add: function(item){
        if (item === undefined) throw Error.argumentNull('arg1', 'A parameter was undefined.');
        if(!this._items) this._items=[];
        Array.add(this._items, item);
        if(item._addListRef !== undefined) item._addListRef(this);
        if(item._addParentRef !== undefined) item._addParentRef(this._owner);
        return true;
    },
    remove: function(item){
        if(item._removeListRef !== undefined) item._removeListRef(this);
        if(item._removeParentRef !== undefined) item._removeParentRef(this._owner);
        return Array.remove(this.get_items(),item);
    },
    clear: function(){
        if(!this._items) return;
        for(var i=0; i < this._items.length; i++){
            if(this._items[i]._removeListRef !== undefined) this._items[i]._removeListRef(this);
            if(this._items[i]._removeParentRef !== undefined) this._items[i]._removeParentRef(this._owner); 
        }
        Array.clear(this._items);
    },
    itemByKey: function(key){
        if(eTag.$v.isIntrinsicTypeByName(this._listOf)==true) return null;
        if(!this.get_items()) return;
        for(var i=0; i < this.get_items().length; i++){
            var item=this.get_items()[i];
            if(item.get_primaryKeyMember !== undefined){
                if(item.get_primaryKeyMember() != null){
                    if(item.get_primaryKeyMember().get_value() == key) return item;
                }
            }
        }
        return null;
    },
    dispose: function(){
        this.clear();
        this._constructorArgs=null;
    }
}
eTag.List.registerClass('eTag.List', null, Sys.IDisposable);



if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();