var Utils = {

   getElementsComputedStyle: function ( htmlElement, cssProperty, mozillaEquivalentCSS) {
      if ( arguments.length == 2 )
         mozillaEquivalentCSS = cssProperty;

      var el = $(htmlElement);
     /* if ( el.currentStyle )
         return el.currentStyle[cssProperty];
      else
         return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS);*/
   },

   createXmlDocument : function() {
      if (document.implementation && document.implementation.createDocument) {
         var doc = document.implementation.createDocument("", "", null);

         if (doc.readyState == null) {
            doc.readyState = 1;
            doc.addEventListener("load", function () {
               doc.readyState = 4;
               if (typeof doc.onreadystatechange == "function")
                  doc.onreadystatechange();
            }, false);
         }

         return doc;
      }

      if (window.ActiveXObject)
          return Try.these(
            function() { return new ActiveXObject('MSXML2.DomDocument')   },
            function() { return new ActiveXObject('Microsoft.DomDocument')},
            function() { return new ActiveXObject('MSXML.DomDocument')    },
            function() { return new ActiveXObject('MSXML3.DomDocument')   }
          ) || false;

      return null;
   },

   getContentAsString: function( parentNode ) {
      return parentNode.xml != undefined ?
         this._getContentAsStringIE(parentNode) :
         this._getContentAsStringMozilla(parentNode);
   },

  _getContentAsStringIE: function(parentNode) {
     var contentStr = "";
     for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) {
         var n = parentNode.childNodes[i];
         if (n.nodeType == 4) {
             contentStr += n.nodeValue;
         }
         else {
           contentStr += n.xml;
       }
     }
     return contentStr;
  },

  _getContentAsStringMozilla: function(parentNode) {
     var xmlSerializer = new XMLSerializer();
     var contentStr = "";
     for ( var i = 0 ; i < parentNode.childNodes.length ; i++ ) {
          var n = parentNode.childNodes[i];
          if (n.nodeType == 4) { // CDATA node
              contentStr += n.nodeValue;
          }
          else {
            contentStr += xmlSerializer.serializeToString(n);
        }
     }
     return contentStr;
  },

   toViewportPosition: function(element) {
   	return this._toAbsolute(element,((Prototype.Browser.Opera || Prototype.Browser.WebKit)?true:false));
   },

   toDocumentPosition: function(element) {
   	return this._toAbsolute(element,((Prototype.Browser.Opera || Prototype.Browser.WebKit)?true:false));
   },

   _toAbsolute: function(element,accountForDocScroll) {
	  var x = this.getLeftPos(element);
      var y = this.getTopPos(element);

      if ( accountForDocScroll ) {
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   docScrollLeft: function() {
      if ( window.pageXOffset )
         return window.pageXOffset;
      else if ( document.documentElement && document.documentElement.scrollLeft )
         return document.documentElement.scrollLeft;
      else if ( document.body )
         return document.body.scrollLeft;
      else
         return 0;
   },

   docScrollTop: function() {
      if ( window.pageYOffset )
         return window.pageYOffset;
      else if ( document.documentElement && document.documentElement.scrollTop )
         return document.documentElement.scrollTop;
      else if ( document.body )
         return document.body.scrollTop;
      else
         return 0;
   },

   getClientHeight: function()
   {
   	var max = window.innerHeight ?
      window.height - window.innerHeight :
      document.body.scrollHeight -
        (document.documentElement.clientHeight ?
          document.documentElement.clientHeight : document.body.clientHeight);
    return max;
   },

	getViewportWidth: function()
	{
		var width 	= self.innerWidth;  // Safari
		var mode 	= document.compatMode;

		if ( mode || Prototype.Browser.IE )
		{ // IE, Gecko, Opera
			width = (mode == 'CSS1Compat') ?
				document.documentElement.clientWidth : // Standards
				document.body.clientWidth; // Quirks
		}
		return width;
	},

	getViewportHeight: function()
	{
		var height = self.innerHeight; // Safari, Opera
		var mode = document.compatMode;

		if ( (mode || Prototype.Browser.IE) && !Prototype.Browser.Opera ) { // IE, Gecko
		    height = (mode == 'CSS1Compat') ?
		            document.documentElement.clientHeight : // Standards
		            document.body.clientHeight; // Quirks
		}

		return height;
	},
	
	getLeftPos: function(element)
	{
		var valueL = 0;
		try
		{
			do
			{
				valueL += element.offsetLeft || 0;
				element = element.offsetParent;
			} while (element);
		}
		catch( ex ) {
	}
	return valueL;
	},
	
	getTopPos: function(element)
	{
		var valueT = 0;
		try
		{
			do
			{
				valueT += element.offsetTop || 0;
				element = element.offsetParent;
			} while (element);
		}
		catch( ex ) {
	}
	return valueT;
	},

	cumulativeOffset: function(element)
	{
		var valueT = 0, valueL = 0;
		try
		{
			do
			{
				valueT += element.offsetTop  || 0;
				valueL += element.offsetLeft || 0;
				element = element.offsetParent;
			} while (element);
		}
		catch( ex ) {
	   }
	   return [valueL, valueT];
	},
	
	getContainerLeftOffset: function()
    {
        var cont = document.getElementsByTagName('body')[0].getElementsBySelector('div[class="Container"]');
        if (cont && cont[0])
        {
            return this.getLeftPos(cont[0]);
        }
        return 0; 
    },
	
	callInProgress: function (xmlhttp) 
    {
        switch (xmlhttp.readyState) {
            case 1: case 2: case 3:
             return true;
            break;
            // Case 4 and 0
            default:
             return false;
            break;
        }
    },
	
	/*getCookie: function (name) {
        var     cookies=document.cookie.split("; ");
        for (var i=0; i<cookies.length; i++) {
                var     cookie=cookies[i].split("=");
                if (cookie[0]==name) {
                        return safeUnescape(cookie[1]);
                }
        }
        return null;
	},*/
	
	getCookie: function ( name ) 
    {
        var prefix = name + "="
        var cookieStartIndex = document.cookie.indexOf(prefix)
        if (cookieStartIndex == -1)
                return null
        var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length)
        if (cookieEndIndex == -1)
                cookieEndIndex = document.cookie.length
        return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex))
    },
	
	setCookie: function (name, value, expires, path, domain, secure) 
	{
		var cookie=name+"="+escape(value);
        if (expires) {
            cookie+="; expires="+expires.toGMTString();
        }
        if (path) {
            cookie+="; path="+path;
        }
		else
		{
			cookie+="; path=/";
		}
        if (domain) {
            cookie+="; domain="+domain;
        }
		
        if (secure) {
                cookie+="; secure";
        }
        document.cookie=cookie;
	},
	
	deleteCookie: function (name) {
        this.setCookie(name,'null',new Date(0),null,null,false);
	},
	
	evalGlobally: function ( script )
    {
        var ret;
		
        script = script.replace(/(^\s+)|(<!--)/gim, "");
        script = script.replace(/(\/\/-->)|(\s+$)/gim, "");
		if ( 0 < script.length )
        {
            try
            {
                ret = (window.execScript ? window.execScript(script) : (Prototype.WebKit ? setTimeout(script, 0) : eval.apply(window, [script])));

            }
            catch(e)
            {
                alert(e);
            }
        }
        return ret;
    },
	
	setLoadingEffect: function(container, loadingEffectID, loadingEffectCSS)
    {
        if ( container )
        {
			var width = false;
			var height = false;
			var left = false;
			if ( arguments.length > 3 )
			{
				var obj = arguments[3];
				if (obj.width != 'undefined')
				{
					width = obj.width;
				}
				if (obj.height != 'undefined')
                {
                    height = obj.height;
                }
				if (obj.left != 'undefined')
                {
                    left = obj.left;
                }
			}
			var body = document.getElementsByTagName('body')[0];
            var LoadingEffect = document.createElement('div');
            LoadingEffect.id = loadingEffectID;
            if ( LoadingEffect )
            {
                $(LoadingEffect).addClassName(loadingEffectCSS);
                $(LoadingEffect).setStyle(
                    {
                        'width':(width?width:container.getWidth())+'px',
                        'height':(height?height:container.getHeight())+'px',
                        'left':(left?left:Utils.getLeftPos(container))+'px',
                        'top':Utils.getTopPos(container)+'px'
                    }
                );
                body.appendChild(LoadingEffect);
            }
        }
    },

    removeLoadingEffect: function(loadingEffectID)
    {
        var tabLoadingEffect = $(loadingEffectID);

        if ( tabLoadingEffect )
        {
            tabLoadingEffect.remove();
        }
    }
};
