
/**
 * File contains JS Library for HTML Elements Management
 *
 * JavaScript  version 1
 * @category   JavaScript Libraries
 * @author     NULL <null.is.not.0@gmail.com>
 * @copyright  (c) 2007-2008 by NULL
 * @version    SVN: $Id: 206$
 * @link       NULL <null.is.not.0@gmail.com>
 * @since      File available since Release 2.3.0
 */

/**
 * HTMLElement is the namespace for HTML Dom Element JavaScript functions.
 *
 * @author   NULL <null.is.not.0@gmail.com>
 * @version  $Id: HTMLElement.js, v 2.3.0 2006/09/14 $
 * @access   public
 * @package  php2
 */
if (typeof(HTMLElement) == 'undefined') var HTMLElement = new Object();

    /**
     * Returns X Position for htmlObject
     *
     * @param   DOMElement htmlObject
     * @return  integer
     */
    HTMLElement.findPosX = function(htmlObject)
    {
        var result = 0;
        
    	if (htmlObject.offsetParent)
    	{
    		while (htmlObject.offsetParent)
    		{
    			result      += htmlObject.offsetLeft
    			htmlObject  =  htmlObject.offsetParent;
    		}
    	}
    	else if (htmlObject.x)
    	{
    	    result += htmlObject.x;
    	}
    		
    	return result;
    }
    
    /**
     * Returns Y Position for htmlObject
     *
     * @param   DOMElement htmlObject
     * @return  integer
     */
    HTMLElement.findPosY = function(htmlObject)
    {
    	var result = 0;
    	
    	if (htmlObject.offsetParent)
    	{
    		while (htmlObject.offsetParent)
    		{
    			result      += htmlObject.offsetTop
    			htmlObject  =  htmlObject.offsetParent;
    		}
    	}
    	else if (htmlObject.y)
    	{
    	    result += htmlObject.y;
    	}
    		
    	return result;
    }
    
    /**
     * Returns X Position for htmlObject specified by its ID
     *
     * @param   string htmlElementId
     * @return  integer
     */
    HTMLElement.findPosXById = function(htmlElementId)
    {
        if (htmlObject = document.getElementById(htmlElementId))
        {
            return HTMLElement.findPosX(htmlObject);
        }
        
    	return null;
    }
    
    /**
     * Returns Y Position for htmlObject specified by its ID
     *
     * @param   string htmlElementId
     * @return  integer
     */
    HTMLElement.findPosYById = function(htmlElementId)
    {
        if (htmlObject = document.getElementById(htmlElementId))
        {
            return HTMLElement.findPosY(htmlObject);
        }
        
    	return null;
    }
    
    /**
     * Returns Width of the HTML Element specified by its ID
     *
     * @param   string htmlElementId
     * @return  integer
     */
    HTMLElement.getWidth = function(htmlElementId)
    {
        if (htmlObject = document.getElementById(htmlElementId))
        {
            return htmlObject.offsetWidth;
        }
        
    	return null;
    }
    
    /**
     * Returns Height of the HTML Element specified by its ID
     *
     * @param   string htmlElementId
     * @return  integer
     */
    HTMLElement.getHeight = function(htmlElementId)
    {
        if (htmlObject = document.getElementById(htmlElementId))
        {
            return htmlObject.offsetHeight;
        }
        
    	return null;
    }
    
    /**
     * Returns Browser Width
     *
     * @return  integer
     */
	HTMLElement.getBrowserWidth = function()
	{
        if (window.innerWidth)
        {
            return window.innerWidth;
        }
        else if (document.documentElement && document.documentElement.clientWidth != 0)
        {
            return document.documentElement.clientWidth;
        }
        else if (document.body)
        {
            return document.body.clientWidth;
        }
        
        return 0;
    }
    
    /**
     * Returns Browser Height
     *
     * @return  integer
     */
	HTMLElement.getBrowserHeight = function()
	{
        if (window.innerHeight)
        {
            return window.innerHeight;
        }
        else if (document.documentElement && document.documentElement.clientHeight != 0)
        {
            return document.documentElement.clientHeight;
        }
        else if (document.body )
        {
            return document.body.clientHeight;
        }
        
        return 0;
    }
    
    HTMLElement.isSelectsOnThePage = -1;
    
    
    /**
     * Protects Div Object From IE Select Objects. Returns protect Frame ID
     *
     * @param   string objectId HTML Object Unique ID
     * @return  string
     */
    HTMLElement.protectIEDiv = function(objectId)
    {
        var appVer = navigator.appVersion.toLowerCase();
        var iePos  = appVer.indexOf('msie');
        if (iePos != -1) 
        {
            // --- Checking Is Selects exists on the Page --- //
            
            /*if (HTMLElement.isSelectsOnThePage == -1)
            {
                HTMLElement.isSelectsOnThePage = (((document.getElementsByTagName('select')).length >= 1) ? true : false);
            }
            if (!HTMLElement.isSelectsOnThePage) return null;*/
            
            // --- Checking is Current Browser is IE --- //
            protectedObject = document.getElementById(objectId);
            protectedObject.style.zIndex = 5;
            
            // --- Creting Protect Frame for Div Element --- //
            var protectFrameId = objectId + '_ProtectFrame';
            if (!document.all.item(protectFrameId))
            {
                document.body.insertAdjacentHTML("afterBegin", '<iframe id="' + protectFrameId + '"  style="display: none; left: 0px; position: absolute; top: 0px;" src="javascript:false;" frameBorder="0" scrolling="no"></iframe>');
                // document.all.item(protectFrameId).style.filter   = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';
            }
            
            if (protectedObject.style.display == "none")
            {
                var frmHover                    = document.all.item(protectFrameId);
                frmHover.style.display          = "none";
                protectedObject.style.display   = "none";
            }
            else
            {
                var frmHover            = document.all.item(protectFrameId);
                frmHover.style.left     = HTMLElement.findPosX(protectedObject) + "px";
                frmHover.style.top      = HTMLElement.findPosY(protectedObject) + "px";
                frmHover.style.width    = protectedObject.offsetWidth;
                frmHover.style.height   = protectedObject.offsetHeight;
                frmHover.style.zIndex   = protectedObject.style.zIndex - 1;
                frmHover.style.display  = '';
            }
            
            return protectFrameId;
        }
        
        return false;
    }
    
    // --- Some HTMLElement Hooks for Mozilla --- //
    if (typeof(HTMLElement.prototype) != 'undefined')
    {
        HTMLElement.prototype.insertAdjacentHTML = function(sWhere, sHTML)
        {
           var documentFragment;   // --- DocumentFragment --- //
           var documentRange = this.ownerDocument.createRange();
           
           switch (String(sWhere).toLowerCase())
           {  
              // --- Convert to string and unify case --- //
              case "beforebegin":
                 documentRange.setStartBefore(this);
                 documentFragment = documentRange.createContextualFragment(sHTML);
                 this.parentNode.insertBefore(documentFragment, this);
              break;
                 
              case "afterbegin":
                 documentRange.selectNodeContents(this);
                 documentRange.collapse(true);
                 documentFragment = documentRange.createContextualFragment(sHTML);
                 this.insertBefore(documentFragment, this.firstChild);
              break;
                 
              case "beforeend":
                 documentRange.selectNodeContents(this);
                 documentRange.collapse(false);
                 documentFragment = documentRange.createContextualFragment(sHTML);
                 this.appendChild(documentFragment);
              break;
                 
              case "afterend":
                 documentRange.setStartAfter(this);
                 documentFragment = documentRange.createContextualFragment(sHTML);
                 this.parentNode.insertBefore(documentFragment, this.nextSibling);
              break;
           }   
        };
    }
    
