s1JS.Dom = function() 
{
   return {
      isOpera:(navigator.userAgent.indexOf('opera') > -1),
      isSafari:(/Safari|Konqueror|KHTML/gi).test(navigator.userAgent),
      isGecko:(!this.isOpera && !this.isSafari && navigator.userAgent.indexOf('gecko') > -1),
      isIE:(!this.isSafari && !navigator.userAgent.match(/opera/gi) && navigator.userAgent.match(/msie/gi)),

      get:function(el)
      {
         if(typeof el == 'string')
         {
            el = document.getElementById(el);
         }
         return el; 
      },

      hasClass:function(el, cName)
      {
         var reg = new RegExp( "(^| )"+cName+"( |$)" );
         return (el && el.className && el.className.match(reg)) ? true : false;
      },

      addClass:function(el, cName)
      {
         if(!this.hasClass(el, cName))
         {
            var newClass = (el.className && el.className != '') ? ' ' + cName : cName; 
            el.className += newClass;
         }             
      },

      removeClass:function(el, cName)
      {
         if(this.hasClass(el, cName))
         {
            var list = el.className.split(' ');
            var nl = new Array;
            for(var x in list)
            { 
               if(list[x] != cName) { nl[nl.length] = list[x]; }
            }
            el.className = nl.join(' ');
         }
      },

      getByClass:function(cName, tagName, root) 
      {
         tagName = tagName || '*';

         if(typeof root == 'string') 
         {
             root = document.getElementById(root); 
         }
         root = root || document;

         var matches = [];
         var list = root.getElementsByTagName(tagName);

         if ( !list.length && (tagName == '*' && root.all) ) 
         {
            list = root.all; // legacy
         }

         for(var i = 0; i < list.length; i++)
         {
             if(this.hasClass(list[i], cName))
             {
                 matches[matches.length] = list[i];
             }
         }

         if(matches.length == 0) { return false; }

         return matches;
      },

      getStyle:function(el, property)
      {
         el = this.get(el);

         var value = null;
         var dv = document.defaultView;

         if(property == 'opacity' && el.filters)
         {
            try 
            { 
               value = el.filters.item('DXImageTransform.Microsoft.Alpha').opacity / 100; 
            }
            catch(e) 
            {
               try 
               {
                  value = el.filters.item('alpha').opacity / 100;
               }
               catch(e) { value = 1; }
            }          
         }
         else if(el.style[property]) 
         {
            value = el.style[property];
         }
         else if(el.currentStyle && el.currentStyle[property])
         {
            value = el.currentStyle[property];
         }
         else if(dv && dv.getComputedStyle)
         {
            var converted='';
            for(i=0,len=property.length; i<len; i++)
            {
               if(property.charAt(i) == property.charAt(i).toUpperCase())
               {
                  converted = converted+'-'+property.charAt(i).toLowerCase();
               }
               else
               {
                  converted = converted+property.charAt(i);
               }
            }
            if(dv.getComputedStyle(el,'').getPropertyValue(converted))
            {
               value = dv.getComputedStyle(el,'').getPropertyValue(converted);
            }
         }
         return value;
      },

      setStyle:function(el, property, value)
      {
         el = this.get(el);

         if(property == 'opacity')
         {
            if(el.filters)
            {
               el.style.filter='alpha(opacity=' + value*100 + ')';
               if(!el.currentStyle.hasLayout)
               {
                  el.style.zoom=1;
               }
            }
            else
            {
               el.style.opacity = value;
               el.style['-moz-opacity'] = value;
               el.style['-khtml-opacity'] = value;
            }
         }
         else
         {
            el.style[property] = value;
         }
      },

      getXY:function(el)
      {
         el = this.get(el);

         if (el.parentNode === null || el.offsetParent === null || this.getStyle(el, 'display') == 'none') 
         {
            return false;
         }         

         var point = { x:el.offsetLeft, y:el.offsetTop };
         var parentNode = el.offsetParent;

         if (parentNode != el) 
         {
            while (parentNode) 
            {
               point.x += parentNode.offsetLeft;
               point.y += parentNode.offsetTop;
               parentNode = parentNode.offsetParent;
            }
         }

         if (this.isSafari && this.getStyle(el, 'position') == 'absolute' ) 
         { 
            point.x -= document.body.offsetLeft;
            point.y -= document.body.offsetTop;
         }

         while (parentNode && parentNode.tagName.toUpperCase() != 'BODY' && parentNode.tagName.toUpperCase() != 'HTML')
         { 
            if (this.getStyle(parentNode, 'display') != 'inline') 
            {
                point.x -= parentNode.scrollLeft;
                point.y -= parentNode.scrollTop;
            }

            if (parentNode.parentNode) 
            {
                parentNode = parentNode.parentNode;
            } 
            else
            {
                parentNode = null;
            }
         }         

         return point;        
      },
 
      setXY:function(el, newPoint)
      {
         el = this.get(el);

         var pos = this.getStyle(el, 'position');
         if(pos == 'static') 
         { 
            this.setStyle(el, 'position', 'relative');
            pos = 'relative';
         }

         var oldPoint = this.getXY(el);
         if(oldPoint === false) 
         { 
            return false;
         }

         var delta = [ parseInt(this.getStyle(el, 'left')), parseInt( this.getStyle(el, 'top')) ];

         // check for 'auto'
         if(isNaN(delta[0])) 
         {
            delta[0] = (pos == 'relative') ? 0 : el.offsetLeft;
         }
         if(isNaN(delta[1]))
         { 
            delta[1] = (pos == 'relative') ? 0 : el.offsetTop;
         }

         if (newPoint.x !== null) { el.style.left = newPoint.x - oldPoint.x + delta[0] + 'px'; }
         if (newPoint.y !== null) { el.style.top = newPoint.y - oldPoint.y + delta[1] + 'px'; }  
      },

      getCurrentViewHeight: function() 
      {
         var height = self.innerHeight; 
         var mode = document.compatMode;

         if ( (mode || this.isIE) && !this.isOpera ) 
         {
            height = (mode == 'CSS1Compat') ? document.documentElement.clientHeight :  document.body.clientHeight; 
         }
         return height;
      },

      getCurrentViewWidth: function() 
      {
         var width = self.innerWidth;  
         var mode = document.compatMode;

         if (mode || this.isIE)
         { 
            width = (mode == 'CSS1Compat') ? document.documentElement.clientWidth : document.body.clientWidth;
         }
         return width;
      },

      getScrollXY: function()
      {
         var scrOfX = 0, scrOfY = 0;
         if( typeof( window.pageYOffset ) == 'number' ) 
         {
            scrOfY = window.pageYOffset;
            scrOfX = window.pageXOffset;
         }
         else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) 
         {
            scrOfY = document.body.scrollTop;
            scrOfX = document.body.scrollLeft;
         }
         else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) 
         {
            scrOfY = document.documentElement.scrollTop;
            scrOfX = document.documentElement.scrollLeft;
         }
         return { x:scrOfX, y:scrOfY };
      }

   };
}();
