﻿/*
Known Issues:
----------------
* BUG: getMarginWidth - will always returns 0 for safari and Chrome browsers do to browser bugs.

*/

Type.registerNamespace('eTag.UI');


/*********************** eTag.DragType ***************************************************/
eTag.DragType = function(){throw Error.invalidOperation()};
eTag.DragType.prototype = {
    None: 0,
    FreeStyle: 1,
    Vertical: 2,
    Horizontal: 3
}
eTag.DragType.registerEnum("eTag.DragType");
    

/*********************** eTag.ResizeType ***************************************************/
eTag.ResizeType = function(){throw Error.invalidOperation()};
eTag.ResizeType.prototype = {
    None: 0,
    Both: 1,
    Vertical: 2,
    Horizontal: 3
}
eTag.ResizeType.registerEnum("eTag.ResizeType");



/*********************** eTag.UI.HorizontalAlign ***************************************************/
eTag.UI.HorizontalAlign = function(){throw Error.invalidOperation()};
eTag.UI.HorizontalAlign.prototype = {
    NoSet: 0,
    Left: 1,
    Center: 2,
    Right: 3,
    Justify:4
}
eTag.UI.HorizontalAlign.registerEnum("eTag.UI.HorizontalAlign");


/*********************** eTag.UI.VerticalAlign ***************************************************/
eTag.UI.VerticalAlign = function(){throw Error.invalidOperation()};
eTag.UI.VerticalAlign.prototype = {
    NoSet: 0,
    Top: 1,
    Middle: 2,
    Bottom: 3
}
eTag.UI.VerticalAlign.registerEnum("eTag.UI.VerticalAlign");



/*********************** eTag.ScrollBars ***************************************************/
eTag.ScrollBars = function(){throw Error.invalidOperation()};
eTag.ScrollBars.prototype = {
    Auto: 4,
    Both: 3,
    Horizontal: 1,
    None: 0,
    Vertical: 2
}
eTag.ScrollBars.registerEnum("eTag.ScrollBars");


/* eTag.Window Object ***********************************************************************************************/
eTag._Window = function() {
    eTag._Window.initializeBase(this);
    this._topDocument=null;
    this._topWindow=null;
    this._isInIFrame=null;
 
}



eTag._Window.prototype = {
    navigateToUrl: function(url,target,title,params){
        if(typeof(target)=='undefined') target='_self';
        if(typeof(params)=='undefined') params=null;
        if(target.toLowerCase()=='_blank'){
            var w;
            if(!params) w=window.open(url,title);
            else  w=window.open(url,title,params);
            w.focus();
            return;
        }
        var w=this.getWindow(target);
            w.location.replace(url);
    }
    ,isUrl: function(s){
	    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
	    return regexp.test(s);
    }
    ,getWindow:  function(target){
        if(typeof(target)=='undefined') target='_self';
        switch(target.toLowerCase()){
            case '_top':
                return this.getTopWindow();
            case '_self':
                return window;
            case '_parent':
                return this.getParentWindow();
        }
 


    },
    getScrollPosition: function(doc){
      var p={x:0,y:0};
      if (doc.all){
         if (!doc.documentElement.scrollLeft) p.x = doc.body.scrollLeft;
         else p.x = doc.documentElement.scrollLeft;
               
         if (!doc.documentElement.scrollTop) p.y = document.body.scrollTop;
         else p.y = doc.documentElement.scrollTop;
      }else{
         var win=this.getDocumentWindow(doc);
         p.x = win.pageXOffset;
         p.y = win.pageYOffset;
      }
      return p;
    },
    getViewPortSize: function(win, target){
        if(!win) win=this.getWindow(target);
        var doc=win.document;
        var s = {height:0,width:0};
        if (typeof win.innerWidth != 'undefined'){
          s.width = win.innerWidth;
          s.height = win.innerHeight;
        }else if ((typeof win.innerWidth != 'undefined') && (doc.clientWidth != 0) && (typeof doc.clientWidth != 'undefined')){// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
           s.width = doc.clientWidth;
           s.height = doc.clientHeight;
         }else{// older versions of IE
           s.width = doc.getElementsByTagName('body')[0].clientWidth;
           s.height = doc.getElementsByTagName('body')[0].clientHeight;
         }
         return s;     
    },
    getViewPortWidth: function(win, target){
        if(!win) win=this.getWindow(target);
        var doc=win.document;
        if (typeof win.innerWidth != 'undefined') return win.innerWidth;
        else if ((typeof win.innerWidth != 'undefined') && (doc.clientWidth != 0) && (typeof doc.clientWidth != 'undefined')) return doc.clientWidth;
        else return doc.getElementsByTagName('body')[0].clientWidth;  
    },
    getViewPortHeight: function(win, target){
        if(!win) win=this.getWindow(target);
        var doc=win.document;
        if (typeof win.innerHeight != 'undefined') return win.innerHeight;
        else if ((typeof win.innerHeight != 'undefined') && (doc.clientHeight != 0) && (typeof doc.clientHeight != 'undefined')) return doc.clientHeight;
        else return doc.getElementsByTagName('body')[0].clientHeight;  
    },
    getDocumentSize: function(doc, target){
        if(!doc) doc=this.getDocument(target);
        var win=this.getDocumentWindow(doc);
        var s = {height:0,width:0};
        if (doc.body.scrollWidth) s.width=doc.body.scrollWidth;
        else s.width=doc.documentElement.offsetWidth;
        if(win.scrollMaxX) s.width += win.scrollMaxX;
        
        if (doc.body.scrollHeight) s.height=doc.body.scrollHeight;
        else s.height=doc.documentElement.offsetHeight;
        
        return s;
    },
    getDocumentWindow: function(doc){
        if(!doc) doc=document;
        return doc.parentWindow?doc.parentWindow:doc.defaultView;
    },
    appendChild: function(el, target){
        this.getDocument(target).body.appendChild(el);
    },
    createElement: function(code, target){
        return this.getDocument(target).createElement(code);
    },
    getDocument: function(target){return this.getWindow(target).document}
    ,isInIFrame: function(){
        if(this._isInIFrame == null){
          this._isInIFrame=(window.parent.window.location != window.location);
        }
        return this._isInIFrame;
    },
    getParentWindow: function(){
       if(!this.isInIFrame()) return null;
       return window.parent.window;
    },
    getTopWindow: function(){
       if(this._topWindow) return this._topWindow;
       if(!this.isInIFrame()){this._topWindow=window;return this._topWindow}
       if(window.parent.window.eTag) return window.parent.window.eTag.$w.getTopWindow();
          var pw=window.parent.window;
          
          //window.window.parent.window
          var pc=window;
          while(pw.location != pc.location){
              pc=pw;
              pw=pw.parent;
          };
          this._topWindow=pw;
          return this._topWindow;
    },
    getParentDocument: function(){
       if(!this.isInIFrame()) return null;
       return this.getParentWindow().document;
    },
    getTopDocument: function(){
      if(this._topDocument) return this._topDocument;
      return this.getWindow('_top').document;
    },
    getWindowByIFrameId: function(iframeId){
        throw Error.notImplemented('getWindowByIFrameId must be implemented.');
    },
    getDocumentByIFrameId: function(iframeId){
        throw Error.notImplemented('getDocumentByIFrameId must be implemented.');
    },
    getIFrameDocument: function(iframe){
      if(iframe.contentDocument) return iframe.contentDocument; 
      else if (iframe.contentWindow) return iframe.contentWindow.document;
      else if (iframe.document) return iframe.document;
      return null;
    },
    findVariableReference: function(varname,rootWindow){
        if(!rootWindow) rootWindow=window;
        var ref=rootWindow[varname];
        
        var wp=rootWindow.parent;
        var count=0;
        
        while(wp && !ref){
            ref=wp[varname];
            wp=wp.parent;
            count++
            if(count>10){
                debugger;
                break;
            }
        }
        return ref;
    },
    dispose: function() {
        /// <summary>
        /// Dispose the behavior
        /// </summary>
        this._topWindow=null;
        this._topDocument = null;
        eTag._Window.callBaseMethod(this, 'dispose');
    }
}

eTag._Window.registerClass('eTag._Window', Sys.Component);
if(!eTag.$w) eTag.$w = $create(eTag._Window);




/*
USING W3C standard....
*

SET WIDTH: (NON-IE) Value.
           (IE) Value + Border + Padding.
           
           

SET WIDTH
IE - Border Test
---------------------
offsetWidth = style.width
offsetHeight = style.Height


clientWidth = style.width - Borders
clientHeight = style.width - Borders

offsetLeft = style.left + Margin.left
offsetTop = style.top + Margin.top




Opera, Mozilla, firefox, Opera - Border Test
---------------------
offsetWidth = style.width + Border.horizontal + Padding.horizontal
offsetHeight = style.Height + Border.vertical + Padding.vertical


clientWidth = style.width + Padding.vertical
clientHeight = style.width + Padding.vertical

offsetLeft = style.left
offsetTop = style.top


*/

eTag._DomElement = function() {
    eTag._DomElement.initializeBase(this);
    this._scrollerWidth=null;
    this._zIndexMax=99999;
    this._browserSizeInfo=null;
}



eTag._DomElement.prototype = {
    _rectBorderStyles:['borderTopStyle','borderRightStyle','borderBottomStyle','borderLeftStyle'],
    _rectBorderWidths:['borderTopWidth','borderRightWidth', 'borderBottomWidth','borderLeftWidth'],
    _rectPaddingWidths:['paddingTop','paddingRight','paddingBottom','paddingLeft'],
    _rectMarginWidths:['marginTop','marginRight','marginBottom','marginLeft'],
    
    
    $get:function(v,throwError){if(!v) return null;if (typeof v!='string') return v;var el;if(document.getElementById) el=document.getElementById(v);else if(document.all) el=document.all[v];else if(document.layers) el=(!document.layers[v]?this.$getLow('document',v):document.layers[v]);
    if (!el && throwError) throw Error.argumentNull('element');
    return el},
    $getLow:function(obj,name){if(!v) return null;if (typeof v!='string') return v;var el;if(document.getElementById) el=document.getElementById(v);else if(document.all) el=document.all[v];else if(document.layers) el=(!document.layers[v]?this.$getLow('document',v):document.layers[v]);return el},
    
    /* C */
    copyAbsoluteBounds: function(el,srcEl){this.copyAbsoluteWidth(el,srcEl);this.copyAbsoluteHeight(el,srcEl);},
    copyAbsoluteWidth: function(el,srcEl){el=this.$get(el,true);srcEl=this.$get(srcEl,true);this.setAbsoluteWidth(el,this.getAbsoluteWidth(srcEl));},
    copyAbsoluteHeight: function(el,srcEl){el=this.$get(el,true);srcEl=this.$get(srcEl,true);this.setAbsoluteHeight(el,this.getAbsoluteHeight(srcEl));},
    
    /* F */
    fitContentHorizontally: function(el,margin){
        if(typeof(margin) === 'undefined') margin=0;
        el=this.$get(el,true);
        var v=0 || margin;
        for(var i=0; i < el.childNodes.length; i++){
           if(this.getVisible(el.childNodes[i])){
            var iw = this.getAbsoluteWidth(el.childNodes[i]);
            v += iw;
           }
        }
        this.setInnerWidth(el,v);
    },
    fitParentBounds: function(el,debug){this.fitParentHeight(el,null,debug);this.fitParentWidth(el,null,debug);},
    fitParentHeight: function(el,minusValue,debug){
        minusValue=(minusValue || 0);
        el=this.$get(el,true);
        var val = this.getInnerHeight(el.parentNode);
        this.setAbsoluteHeight(el,val);
    },
    fitParentWidth: function(el,minusValue){
        minusValue=(minusValue || 0);
        el=this.$get(el,true);
        var val = this.getInnerWidth(el.parentNode);
            val -= parseInt(minusValue);
        this.setAbsoluteWidth(el,val);
    },
    
    /* G */
    //todo... getAbsoluteLeft, getAbsoluteTop
    getAbsoluteHeight: function(el){
        el=this.$get(el,true);
        var v=0;
        if(this.getVisible(el)){
            v=el.offsetHeight;
            v+=this.getMarginWidth(el, eTag.RectSide.Top) + this.getMarginWidth(el, eTag.RectSide.Bottom);
        }else{
            v=eTag.$v.cPixel(el.style.height,el);
            var bsi = this.get_browserSizeInfo(el);
            if(!bsi.IncBorders) v+=this.getBorderWidth(el, eTag.RectSide.Top) + this.getBorderWidth(el, eTag.RectSide.Bottom);
            if(!bsi.IncPaddings) v+=this.getPaddingWidth(el, eTag.RectSide.Top) + this.getPaddingWidth(el, eTag.RectSide.Bottom);
            v+=this.getMarginWidth(el, eTag.RectSide.Top) + this.getMarginWidth(el, eTag.RectSide.Bottom);
        }
        return v;
    },
    getAbsoluteWidth: function(el){
        el=this.$get(el,true);
        var v=0;
        if(this.getVisible(el)){
            v=el.offsetWidth;
            v+=this.getMarginWidth(el, eTag.RectSide.Left) + this.getMarginWidth(el, eTag.RectSide.Right);
        }else{
            v=eTag.$v.cPixel(el.style.width,el);
            var bsi = this.get_browserSizeInfo(el);
            if(!bsi.IncBorders) v+=this.getBorderWidth(el, eTag.RectSide.Left) + this.getBorderWidth(el, eTag.RectSide.Right);
            if(!bsi.IncPaddings) v+=this.getPaddingWidth(el, eTag.RectSide.Left) + this.getPaddingWidth(el, eTag.RectSide.Right);
            v+=this.getMarginWidth(el, eTag.RectSide.Left) + this.getMarginWidth(el, eTag.RectSide.Right);
        }
        return v;
    },
    getDocument: function(el){return el.ownerDocument || el.document;},
    getWindow: function(el){
    el=this.$get(el);
    if(typeof el.nodeName !== 'undefined'){
        if(el.nodeName.indexOf('document')!=-1) return el.parentWindow?el.parentWindow:el.defaultView;
        else return this.getWindow(this.getDocument(el));
        }else if(typeof el.setTimeout !== 'undefined') return el;
    },
    getHeight: function(el){el=this.$get(el,true);return el.offsetHeight || eTag.$v.cPixel(el.style.height,el) || 0;},
    getInnerBounds:function(el){return{width:this.getInnerWidth(el),height:this.getInnerHeight(el)};},
    getInnerHeight: function(el){
        el=this.$get(el,true);
        var v=el.offsetHeight || eTag.$v.cPixel(el.style.height,el) || 0;
            v -= this.getBorderWidth(el, eTag.RectSide.Top) + this.getBorderWidth(el, eTag.RectSide.Bottom);
            v -= this.getPaddingWidth(el, eTag.RectSide.Top) + this.getPaddingWidth(el, eTag.RectSide.Bottom);
        return v;
    },
    getInnerWidth: function(el,debug){
        if(typeof debug === 'undefined') debug=false;
        el=this.$get(el,true);
        var v = el.offsetWidth || eTag.$v.cPixel(el.style.width,el) || 0;
            v-=this.getBorderWidth(el, eTag.RectSide.Left) + this.getBorderWidth(el, eTag.RectSide.Right);
            v-=this.getPaddingWidth(el, eTag.RectSide.Left) + this.getPaddingWidth(el, eTag.RectSide.Right);
        return v;
    },
    getMarginWidth:function(el,side) {
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        var value=this.getStyleValue(el,this._rectMarginWidths[side]);
        try {return this.parsePadding(value);}catch(ex){
        alert('getMarginWidth error.');
        return 0;
        }
    },
    getStyleValue: function(el,styleName,defaultValue){
        el=this.$get(el);
        var returns=null;
        if(el.currentStyle) returns=el.currentStyle[styleName];
        else if(document.defaultView && document.defaultView.getComputedStyle){
            var style=document.defaultView.getComputedStyle(el,null);
            if(style) returns=style[styleName];
        };
        
        if(!returns && el.style.getPropertyValue) returns=el.style.getPropertyValue(styleName);
        else if(!returns && el.style.getAttribute) returns=el.style.getAttribute(styleName);     
        
        if(!returns) returns=el.style[styleName];
        
        if((!returns || returns=="" || typeof(returns) === 'undefined')){
            if(typeof(defaultValue)!='undefined') returns=defaultValue;
            else returns=null;
        };
        return returns;
    },
    getUniqueId: function(prefix,doc){if(!doc) doc=document;if(!prefix) prefix='';prefix+=eTag.$v.generateRandomId();var cnt=0;while(doc.getElementById(prefix+(++cnt))!=null);return prefix+cnt;},
    getVisible:function(el){
        el=this.$get(el);
        if(eTag.$b.nav4) return (el.style.visibility=="show") ? true:false;
        else return((el.style.visibility == "hidden") || (el.style.display=="none")) ? false:true;
    },
    getWidth: function(el){el=this.$get(el,true);return el.offsetWidth || eTag.$v.cPixel(el.style.width,el) || 0;},
    
    
    /* S */
    setAbsoluteBottom: function(el,value){
        el=this.$get(el,true);
        value=eTag.$v.cPixel(value,el);
        value-=this.getAbsoluteHeight(el);
        this.setTop(el,value);
    },
    setAbsoluteHeight: function(el,value){
        el=this.$get(el,true);
        value=eTag.$v.cPixel(value,el);
        var bsi = this.get_browserSizeInfo(el);
        if(!bsi.IncBorders) value-=this.getBorderWidth(el, eTag.RectSide.Top) + this.getBorderWidth(el, eTag.RectSide.Bottom);
        if(!bsi.IncPaddings) value-=this.getPaddingWidth(el, eTag.RectSide.Top) + this.getPaddingWidth(el, eTag.RectSide.Bottom);
        value-=this.getMarginWidth(el, eTag.RectSide.Top) + this.getMarginWidth(el, eTag.RectSide.Bottom);
        this.setHeight(el,value);
    },
    
    setAbsoluteLeft: function(el,value){
        el=this.$get(el,true);
        value=eTag.$v.cPixel(value,el);
        var bsi = this.get_browserSizeInfo(el);
        if(!bsi.IncBorders) value+=this.getBorderWidth(el, eTag.RectSide.Left);
        if(!bsi.IncPaddings) value+=this.getPaddingWidth(el, eTag.RectSide.Left);
        value+=this.getMarginWidth(el, eTag.RectSide.Left);
        this.setLeft(el,value);
    },
    setAbsolutePosition: function(el,left,top){
        this.setAbsoluteLeft(el,left);
        this.setAbsoluteTop(el,top);
    },
    setAbsoluteSize: function(el,width,height){this.setAbsoluteWidth(el,width);this.setAbsoluteHeight(el,height);},
    setAbsoluteTop: function(el,value){
        el=this.$get(el,true);
        value=eTag.$v.cPixel(value,el);
        var bsi = this.get_browserSizeInfo(el);
        if(!bsi.IncBorders) value+=this.getBorderWidth(el, eTag.RectSide.Top);
        if(!bsi.IncPaddings) value+=this.getPaddingWidth(el, eTag.RectSide.Top);
        value+=this.getMarginWidth(el, eTag.RectSide.Top);
        this.setTop(el,value);
    },
    setAbsoluteWidth: function(el,value){
        el=this.$get(el,true);
        value=eTag.$v.cPixel(value,el);
        var bsi = this.get_browserSizeInfo(el);
        if(!bsi.IncBorders) value-=this.getBorderWidth(el, eTag.RectSide.Left) + this.getBorderWidth(el, eTag.RectSide.Right);
        if(!bsi.IncPaddings) value-=this.getPaddingWidth(el, eTag.RectSide.Left) + this.getPaddingWidth(el, eTag.RectSide.Right);
        value-=this.getMarginWidth(el, eTag.RectSide.Left) + this.getMarginWidth(el, eTag.RectSide.Right);
        this.setWidth(el,value);
    },
    setHeight: function(el,value){
        el=this.$get(el,true);
        value = eTag.$v.cPixel(value,el);
        if(value < 0) value=0;
        el.style.height=value + 'px';
    },
    setInnerHeight: function(el,value){
        el=this.$get(el,true);
        value=eTag.$v.cPixel(value,el);
        var bsi = this.get_browserSizeInfo(el);
        if(bsi.IncBorders) value+=this.getBorderWidth(el, eTag.RectSide.Top) + this.getBorderWidth(el, eTag.RectSide.Bottom);
        if(bsi.IncPaddings) value+=this.getPaddingWidth(el, eTag.RectSide.Top) + this.getPaddingWidth(el, eTag.RectSide.Bottom);
        this.setHeight(el,value);
    },
    setInnerWidth: function(el,value){
        el=this.$get(el,true);
        value=eTag.$v.cPixel(value,el);
        var bsi = this.get_browserSizeInfo(el);
        if(bsi.IncBorders) value+=this.getBorderWidth(el, eTag.RectSide.Left) + this.getBorderWidth(el, eTag.RectSide.Right);
        if(bsi.IncPaddings) value+=this.getPaddingWidth(el, eTag.RectSide.Left) + this.getPaddingWidth(el, eTag.RectSide.Right);
        this.setWidth(el,value);
    },
    setVisible:function(el,value){
        el=this.$get(el);
        if(eTag.$b.nav4) el.style.visibility = show ? "show" : "hide";
        else this.setProperties(el.style,{visibility:(value?'visible':'hidden'),display:(value?'':'none')});
    }
    ,hide: function(el){this.setVisible(el,false);}
    ,show: function(el){this.setVisible(el,true);}
    ,setWidth: function(el,value){el=this.$get(el,true);value=eTag.$v.cPixel(value,el);if(value<0) value=0;el.style.width=value + 'px'; },

    /* S */
    toggleVisible:function(el){this.setVisible(el,!this.getVisible(el));},
    
   /* Code below needs to be properly tested */
   



    
    // Includes borders + paddings...



    fitContentVertically: function(el){
        el=this.$get(el,true);
        var v=0;
        var av=0;
        if(eTag.$b.ie){
            v += this.getBorderWidth(el, eTag.RectSide.Top) + this.getBorderWidth(el, eTag.RectSide.Bottom);
            v += this.getPaddingWidth(el, eTag.RectSide.Top) + this.getPaddingWidth(el, eTag.RectSide.Bottom);
        }

        for(var i=0; i < el.childNodes.length; i++){
           var cn = el.childNodes[i];
           if(this.getVisible(cn)){
              var s = this.getAbsoluteHeight(el.childNodes[i]);
              switch(cn.style.position.toLower()){
                case 'absolute':
                    var p = this.getPosition(cn);
                    var b = (s+p.y);
                    if(b > av) av=b;
                    if(av > v) v=av;
                    debugger;
                    break;
                default:
                    break;
                    
              }
           }
        }
        
        this.setHeight(el,v);
        
    },
    fitContent2: function(el){
        el=this.$get(el,true);
        var h=0;
        var right=0;
        var rowRight=0;
        for(var i=0; i < el.childNodes.length; i++){
           if(this.getVisible(el.childNodes[i])){
           
            
            if(el.childNodes[i].tagName=='DIV'){
                if(rowRight > right) right=rowRight;
                rowRight=0;
            }else{
                var nw = this.getAbsoluteWidth(el.childNodes[i]);
                rowRight += nw;
            }
            //alert(i + ') rw: ' + el.childNodes[i].style.width + ', ow: ' + el.childNodes[i].offsetWidth + ', w: ' + nw + ', total: ' + v);
           }
        }
        
        if(rowRight){
           if(rowRight > right) right=rowRight;
        }
        
        this.setInnerWidth(el,right);
        //this.setHeight(el,(h+b));
    },
    fitContent: function(el){
        el=this.$get(el,true);
        var h=0;
        var right=0;
        var rowRight=0;
        for(var i=0; i < el.childNodes.length; i++){
           if(this.getVisible(el.childNodes[i])){
            if(el.childNodes[i].tagName=='DIV'){
                if(rowRight > right) right=rowRight;
                rowRight=0;
            }else{
                var nw = this.getAbsoluteWidth(el.childNodes[i]);
                rowRight += nw;
            }
            //alert(i + ') rw: ' + el.childNodes[i].style.width + ', ow: ' + el.childNodes[i].offsetWidth + ', w: ' + nw + ', total: ' + v);
           }
        }
        
        if(rowRight){
           if(rowRight > right) right=rowRight;
        }
        
        this.setInnerWidth(el,right);
        //this.setHeight(el,(h+b));
    },

    
    /// elWidth = use specified width instead of element width.
    fitParentWidthCheck: function(el,elWidth){
        el=this.$get(el,true);
        var pval = this.getInnerWidth(el.parentNode);
        var val = this.getMarginWidth(el, eTag.RectSide.Left);
            if(!elWidth) val += this.getWidth(el);
            else val += elWidth;
        return pval > val;
    },

    getBounds: function(el,includeScrollbars,doc){
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        
        var b = new Sys.UI.Bounds(0,0,0,0);
            b.height=this.getAbsoluteHeight(el);
            b.width=this.getAbsoluteWidth(el);
            
        var pos = this.getPosition(el,includeScrollbars,doc);
            b.x=pos.x;
            b.y=pos.y;
            b.right=(b.width + b.x);
            b.bottom=(b.height + b.y);
        return b;

        // ************* Following code will be needed if calculating element from outside of iframe.
        //  if(typeof(window.pageYOffset)=='number'){
        //    //Netscape compliant
        //    y=window.pageYOffset;
        //    x=window.pageXOffset;
        //  }else if(document.body && (document.body.scrollLeft || document.body.scrollTop)){
        //    //DOM compliant
        //    y=document.body.scrollTop;
        //    x=document.body.scrollLeft;
        //  }else if(document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop)){
        //    //IE6 standards compliant mode
        //    y=document.documentElement.scrollTop;
        //    y=document.documentElement.scrollLeft;
        //  }


    },
    setProperties : function(target, properties){
        for(var p in properties) target[p]=properties[p];
    },


    getBorderRect: function(el) {
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        var rect = {
            top: this.getBorderWidth(el,eTag.RectSide.Top),
            right: this.getBorderWidth(el,eTag.RectSide.Right),
            bottom: this.getBorderWidth(el,eTag.RectSide.Bottom),
            left: this.getBorderWidth(el,eTag.RectSide.Left)
        };
        rect.horizontal = rect.left + rect.right;
        rect.vertical = rect.top + rect.bottom;
        return rect;
    },
    getBorderWidth:function(el,side){
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        if(side < eTag.RectSide.Top || side > eTag.RectSide.Left) throw Error.argumentOutOfRange(String.format(Sys.Res.enumInvalidValue, side, 'eTag.RectSide'));
        if(!this.hasBorder(el, side)) return 0;
        var val = this.getStyleValue(el, this._rectBorderWidths[side]);
        return this.parseBorderWidth(val);
    },
    parseBorderWidth:function(value){
        if(!value) return 0;
        if (!this._btw){
            this._btw={};
            var div0 = document.createElement('div');
            div0.style.visibility='hidden';
            div0.style.position='absolute';
            div0.style.fontSize='1px';
            document.body.appendChild(div0)
            var div1=document.createElement('div');
            div1.style.height='0px';
            div1.style.overflow='hidden';
            div0.appendChild(div1);
            var base = div0.offsetHeight;
            div1.style.borderTop='solid black';
            div1.style.borderTopWidth='thin';
            this._btw['thin']=div0.offsetHeight - base;
            div1.style.borderTopWidth='medium';
            this._btw['medium']=div0.offsetHeight - base;
            div1.style.borderTopWidth='thick';
            this._btw['thick']=div0.offsetHeight - base;
            div0.removeChild(div1);
            document.body.removeChild(div0);
        }
            switch(value) {
                case 'thin':
                case 'medium':
                case 'thick':
                    return this._btw[value];
                case 'inherit':
                    return 0;
            }
            var unit=this.parseUnit(value);
            return unit.Value;
    },
    hasBorder:function(el,side){
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        if(side < eTag.RectSide.Top || side > eTag.RectSide.Left) throw Error.argumentOutOfRange(String.format(Sys.Res.enumInvalidValue, side, 'eTag.RectSide'));
        var styleValue = this.getStyleValue(el, this._rectBorderStyles[side]);
        return styleValue != "none";
    },
    getPaddingRect: function(el) {
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        var rect = {
            top: this.getPaddingWidth(el, eTag.RectSide.Top),
            right: this.getPaddingWidth(el, eTag.RectSide.Right),
            bottom: this.getPaddingWidth(el, eTag.RectSide.Bottom),
            left: this.getPaddingWidth(el, eTag.RectSide.Left)
        };
        rect.horizontal = rect.left + rect.right;
        rect.vertical = rect.top + rect.bottom;
        return rect;
    },
    getPaddingWidth: function(el,side) {
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        var value=this.getStyleValue(el,this._rectPaddingWidths[side]);
        return this.parsePadding(value);
    },
    parsePadding:function(value) {
        if(!value || value=='inherit') return 0;
        var u=this.parseUnit(value);
        return u.Value;
    },
    parseUnit: function(value){
        if (value==null) return {IsEmpty:true,Type:eTag.UnitType.Pixel,Value:0};
        if(typeof(value['IsEmpty']) != 'undefined') return value;
        if(value==0) return {IsEmpty:true,Type:eTag.UnitType.Pixel,Value:0};
        if(value=='auto') return {IsEmpty:true,Type:eTag.UnitType.Pixel,Value:0};
        
        var i=parseInt(value);
        if(!isNaN(i))return {IsEmpty:false,Type:eTag.UnitType.Pixel,Value:i};

        value=value.trim().toLowerCase();
        var l=value.length;
        var s=-1;
        for(var i=0;i<l;i++) {
            var ch = value.substr(i, 1);
            if((ch < '0' || ch > '9') && ch != '-' && ch != '.' && ch != ',') break;
            s=i;
        }
        if(s == -1) throw Error.invalidOperation('Unit has no digits.');
           
        var type;
        var value;
        if(s < (l - 1)) type = value.substring(s + 1).trim();
        else type = eTag.UnitType.Pixel;
        
        value = parseFloat(value.substr(0, s + 1));
        if(type == eTag.UnitType.Pixel) value = Math.floor(size);
        
        return {IsEmpty:false, Type:type, Value:value};
    },
    getMarginRect: function(el){
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        var rect={
            top: this.getMarginWidth(el, eTag.RectSide.Top),
            right: this.getMarginWidth(el, eTag.RectSide.Right),
            bottom: this.getMarginWidth(el, eTag.RectSide.Bottom),
            left: this.getMarginWidth(el, eTag.RectSide.Left)
        };
        rect.horizontal = rect.left + rect.right;
        rect.vertical = rect.top + rect.bottom;
        return rect;
    },

    getScrollerWidth: function(){
        if(this._scrollerWidth) return this._scrollerWidth;
        //For NON IE browsers
        var d1=document.createElement('DIV');
        d1.style.position='absolute';
        d1.style.height='100';
        d1.style.overflow='scroll';
        d1.style.top='-600';
        var d2=document.createElement('DIV');
        d2.style.height='500';
        d2.innerHTML='&nbsp;';
        d1.appendChild(d2);
        document.body.appendChild(d1);
        var r=(d1.offsetHeight-d1.clientHeight);
        if(r==0) r=16;
        document.body.removeChild(d1);
        this._scrollerWidth=r+1;
        return this._scrollerWidth;
    }
    ,getStyleBounds: function(el){
        var p=eTag.$d.getStylePosition(el);
        return {left:p.left,top:p.top,width:this.getWidth(el),height:this.getHeight(el)};
    }
    ,getStylePosition: function(el,doc){
        var p=this.getPosition(el,null,doc);
        return {left:p.x,top:p.y};
    }
    ,getStyleSize: function(el){
        return {width:this.getWidth(el),height:this.getHeight(el)};
    },
    getPosition: function(el,includeScrollbars,doc){
        if(!doc) doc=document;
       //includeScrollbars = true when scrollbars should be take included. Example, calendar icon where a popup is display on it.
        var p = {x:0,y:0};
        el=this.$get(el);
        if(!el) throw Error.argumentNull('element:' + el);
        if(doc.layers){
            p.y=(el.pageY || 0);
            p.x=(el.pageX || 0);
        }else{
            while(el.offsetParent&&el.offsetParent!=doc.documentElement){
                p.x += (el.offsetLeft || 0);
                p.y += (el.offsetTop || 0);
                if(includeScrollbars){
                    if(el.tagName !== 'BODY'){
                       p.x-=(el.scrollLeft || 0);
                       p.y-=(el.scrollTop || 0);
                    }
                }
                el=el.offsetParent;
            }
        }
        return p;
    },
    setPosition: function(el,position,includeScrollbars){
        this.setProperties(el.style,{left:eTag.$v.cPixel(position.x),top:eTag.$v.cPixel(position.y)});
    },
    setLeft: function(el,value){
        el=this.$get(el);
        el.style.left=eTag.$v.cPixel(value,el);
    },
    setTop: function(el,value){
        el=this.$get(el);
        el.style.top=eTag.$v.cPixel(value,el);
    },
    setOpacity: function(el,value){
        el=this.$get(el);
        if(typeof el.style.opacity != 'undefined') el.style.opacity=value/100;
        else if(typeof el.style.MozOpacity != 'undefined') el.style.MozOpacity=value/100;
        else if(typeof el.style.filter != 'undefined') el.style.filter='alpha(opacity=' + value + ')'; 
    },
    setZorder:function(el,order){
        el=this.$get(el);
        if(eTag.$b.nav4) el.zIndex=order;
        else el.style.zIndex=order;
    },
    setZorderTop:function(el){
        var w=this.getWindow(el);
        if((w.location != window.location) && w.eTag.$d){
            w.eTag.$d.setZorderTop(el);
            return;
        }
        this.setZorder(el,this._zIndexMax);
        this._zIndexMax+=1;
    },
    isChildOf: function(child,parent){
        child=this.$get(child);
        parent=this.$get(parent);
        if(!child || !parent) return false;
        var el=child;
        while(el.parentNode){
            if(el.parentNode==parent) return true;
            el=el.parentNode;
        };
        return false;
    },
    addHandler2: function(el, eventName, handler,w){
        el=this.$get(el);
        if(!w) w=this.getWindow(el);
        w.Sys.UI.DomEvent.addHandler(el, eventName, handler);
    },
    
    createDelegate: function(instance, method){
        /// <param name="instance" mayBeNull="true"></param>
        /// <param name="method" type="Function"></param>
        /// <returns type="Function"></returns>
        var e = Function._validateParams(arguments, [
            {name: "instance", mayBeNull: true},
            {name: "method", type: Function}
        ]);
        if (e) throw e; 
        return function(){
            //return method.call(instance, arguments);
            return method.apply(instance, arguments);
        }
    },

    
    addHandler: function(element, eventName, handler){
           element=this.$get(element);
            var win = this.getWindow(element);
            if(win != window){
                if(win.eTag !== undefined){
                    win.eTag.$d.addHandler(element, eventName, handler);
                    //debugger;
                    return;                
                }//else debugger;
            }
            //debugger;
           if (!element._events) element._events = {};
           var eventCache = element._events[eventName];
           if(!eventCache) element._events[eventName] = eventCache = [];
           
           var browserHandler;
           if (element.addEventListener){
               browserHandler = function(e){
                  return handler.call(element, new Sys.UI.DomEvent(e)); //NOTE: PROBLEM CAN BE HERE.
               }
               element.addEventListener(eventName, browserHandler, false);
           }else if (element.attachEvent) {
               //IE
               browserHandler = function() {
                    var t = win.event.target ? win.event.target : win.event.srcElement;
                    var tp=win.event;
                    if (((t == null) || (typeof(t.nodeType) == 'undefined')) && win.event.type !='scroll'){
                        return;
                    }
                    
                    try{
                        return handler.call(element, new Sys.UI.DomEvent(win.event));
                    } catch(e){
                        if (e.number == -2146823277){
                            win.eTag.$d.removeHandler(element,eventName, handler);
                        }else throw e;
                   }
               }
               element.attachEvent('on' + eventName, browserHandler);
           }
           eventCache[eventCache.length] = {handler: handler, browserHandler: browserHandler};
    }
    ,removeHandler: function(el, eventName, handler,w){
        el=this.$get(el);
        var cache = el._events[eventName];
        if(!cache) return;
        if(!w) w=this.getWindow(el);
        if(typeof(w.$removeHandler) !== 'undefined') w.$removeHandler(el, eventName, handler);
        else this.$removeHandler(w,eventName,handler);
    }
    ,$removeHandler: function(el,eventName,handler,useCapture){
      if(!useCapture) useCapture=false;
        try{
            if(el.removeEventListener){
               el.removeEventListener(eventName, handler, useCapture);
               return true;
            }else if(el.detachEvent){
               var r = el.detachEvent("on" + eventName, handler);
               return r;
            };
        }
        catch(err){};
    }
    ,clearHandlers: function(el,w){
        el=this.$get(el);
        if(!w) w=this.getWindow(el);
        w.$clearHandlers(el);
    },
    
    
    parseResourcePath: function(value){
        if(value.indexOf('WebResource.axd') != -1 && value.indexOf('/') != -1){
            var parts = value.split('/');
            value=parts[parts.length-1];
        }
        return value;
    },
    setHorizontalPosition: function(el,position,margin){
        var v=0;
        var p=el.parentNode;
        if(!margin) margin=0;
        var va=eTag.UI.HorizontalAlign;
        el=this.$get(el,true);
        switch(position){
            case va.Center:
                var pval = this.getInnerWidth(p);
                var ew=eTag.$v.cPixel(this.getAbsoluteWidth(el));
                    v=((pval / 2)-(ew / 2));
                    this.setLeft(el,v);
                    break;
            case va.Right:
               el.style.right='0';
               break;
            default:
                el.style.left='0';
                break;
        }
    },
    setVerticalPosition: function(el,position,margin){
        var v=0;
        var p=el.parentNode;
        if(!margin) margin=0;
        var va=eTag.UI.VerticalAlign;
        el=this.$get(el,true);
        switch(position){
            case va.Middle:
                var pv = this.getInnerHeight(p);
                var ev=eTag.$v.cPixel(this.getAbsoluteHeight(el));
                    v=((pv / 2)-(ev / 2));
                    if(margin) v += margin;
                    this.setTop(el,v);
                    break;
            case va.Bottom:
                var pv = this.getInnerHeight(p);
                var ev=eTag.$v.cPixel(this.getAbsoluteHeight(el));
                    v=(pv-ev);
                    if(margin) v += margin;
                    //debugger;
                    this.setTop(el,v);
               break;
            default:
                    v=1;
                    if(margin) v += margin;
                    this.setAbsoluteTop(el,v);
                break;
        }
    },
    replaceNodeId: function(node,oldId,newID){
        if(node.id!=null) node.id=node.id.replace(oldId, newID);
        for(var i = 0; i < node.childNodes.length; i++){
            this.replaceNodeId(node.childNodes[i],oldId,newID);
        }
    },
    setScrollBars: function(el,value){
        var sb=eTag.ScrollBars;
        switch(value){
            case sb.Auto:
                el.style.overflow='auto';
                el.style.overflowX='auto';
                el.style.overflowY='auto';
                break;
            case sb.Both:
                el.style.overflow='scroll';
                el.style.overflowX='scroll';
                el.style.overflowY='scroll';
                break;
            case sb.Horizontal:
                el.style.overflow='auto';
                el.style.overflowX='scroll';
                el.style.overflowY='hidden';
                break;
            case sb.Vertical:
                el.style.overflow='auto';
                el.style.overflowX='hidden';
                el.style.overflowY='scroll';
                break;
            case sb.None:
                el.style.overflow='hidden';
                el.style.overflowX='hidden';
                el.style.overflowY='hidden';
                break;
        }
    },
    createElementHidden: function(id,value,name,doc){
        var el=doc.createElement("input");
        if(!name) name=id;
            el.setAttribute("type", "hidden");
            el.setAttribute("name", name);
            el.setAttribute("id", id);
            el.setAttribute("value", value);
        return el;
    },
    get_browserSizeInfo: function(){
        if(!this._browserSizeInfo){
            var incBorder=true;
            var incPadding=true;
            var incMargin=true;
            
            var w=0;
            var el = document.createElement('div');
            this.setProperties(el.style,{visibility:'hidden', position:'absolute', width:'10px'});
            
            document.body.appendChild(el);
            //Borders
            el.style.border='solid 1px';
            w = eTag.$d.getWidth(el);
            incBorder=(w==10);
            el.style.border='0';
            //Paddings
            el.style.padding='1px 1px 1px 1px';
            w = eTag.$d.getWidth(el);
            incPadding=(w==10);
            el.style.padding='0';
            //Margin
            el.style.margin='1px 1px 1px 1px';
            w = eTag.$d.getWidth(el);
            incMargin=(w==10);
            el.style.margin='0';
            document.body.removeChild(el);
            this._browserSizeInfo = {'IncBorders':incBorder, 'IncPaddings':incPadding, 'IncludesMargins':incMargin};
        }
        
        return this._browserSizeInfo;
    }
    ,disableSelection: function(el){
        if (typeof el.onselectstart!="undefined") el.onselectstart=function(){return false};
        else if (typeof el.style.MozUserSelect!="undefined") el.style.MozUserSelect="none";
        else el.onmousedown=function(){return false};
        el.style.cursor = "default"
    }
    ,remove: function(el){
        el.parentNode.removeChild(el);
    }
    ,getValue: function(el,args){
        el=this.$get(el,true);
        switch(el.tagName.toLocaleLowerCase()){
        case 'undefined': return null;
        case 'span':
        case 'div':
            return el.innerHTML;
        case 'radio':
            for(var i=0; i < el.length; i++) if(el[i].checked == true) return el[i].value;
        case 'select-multiple':
            var a=[];
            for(var i=0; i < el.length; i++) if(el[i].selected == true) a[a.length]=el[i].value;
            return a;
        case 'checkbox': 
            return el.checked;
        case "select-one":
        case "select":
            if(!args)args=false;
            /* args = (true|false) - true returns text */
            return ((el.selectedIndex >= 0)?(args?el.options[el.selectedIndex].text:el.options[el.selectedIndex].value):-1);
        case "hidden":
        case "text":
            return el.value;
        default:
            return el.value;
        }
   }
}

eTag._DomElement.registerClass('eTag._DomElement', Sys.Component);
if(!eTag.$d) eTag.$d = new eTag._DomElement();



/* eTag.Mouse Object ***********************************************************************************************/
eTag._Mouse = function(){}

eTag._Mouse.prototype = {
    getX: function(e,doc){
        if(!e) e=window.event;
        if(e.pageX) return e.pageX;
        else if(e.clientX){
            if(!doc) doc=document;
            return e.clientX + doc.body.scrollLeft;
        }
        return 0;
    },
    getY: function(e,doc){
        if(!e) e=window.event;
        if(e.pageY) return e.pageY;
        else if(e.clientY){
            if(!doc) doc=document;
            return e.clientY + doc.body.scrollTop;
        }
        return 0;
    },
    getCoordinates: function(e,doc){
        if(!e) e=window.event;
        if(e.pageY) return {x:e.pageX,y:e.pageY};
        else if(e.clientY){
            if(!doc) doc=document;
            return {x:(e.clientX + doc.body.scrollLeft),y:(e.clientY + doc.body.scrollTop)};
        }
        return {x:0,y:0};
    }
}

eTag._Mouse.registerClass('eTag._Mouse');
if(!eTag.Mouse) eTag.Mouse = new eTag._Mouse();   
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();