/*
 * Extensions to HTML DOM Elements 
 * 
 * Antti Lepp�
 * Foyt 
 * 
 * http://www.foyt.fi
 * 
 * Licensed under 
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 *    http://www.gnu.org/licenses/lgpl.html
 */

Element.addMethods({
    getMaxHeight: function (element) {
      var e = $(element);
      var pE = $(e.parentNode); 
      if (pE) {
        var childNodes = pE.childElements();
        var siblingsHeight = 0; 
        for (var i = 0; i < childNodes.length; i++) {
          if (childNodes[i] != element) {
            var rh = $(childNodes[i]).getReservedHeight();  
            siblingsHeight += rh;
          }
            
        }
        
        var pePaddings = pE.getHorizontalPaddings();
        var ePaddings = e.getHorizontalPaddings();
        var pEH = pE.getHeight();
        return (pEH - (pePaddings + ePaddings)) - siblingsHeight;
      }
    },
    getHorizontalPaddings: function(element){
      var e = $(element);
      return e.getStyleInPixels('padding-top') + e.getStyleInPixels('padding-bottom') + e.getStyleInPixels('border-top-width') + e.getStyleInPixels('border-bottom-width');
    },
    getHorizontalMargins: function(element){
      var e = $(element);
      
      return e.getStyleInPixels('margin-top') + e.getStyleInPixels('margin-bottom');
    },
    getReservedHeight: function (element) {
      var e = $(element);
      return e.getHeight() + e.getHorizontalMargins();
    },
    getStyleInPixels: function (element, property) {
      var e = $(element);
      var result = 0;
      var value = e.getStyle(property);
      
      if (value != undefined && value != null) {
        if (value.endsWith('px')) 
          result = new Number(value.substring(0, value.indexOf('px'))); 
        else {
          /* border width fix applied by Otavan Opisto 10.12.2008 */
          if (property.startsWith('border') && property.endsWith('width')) {
            var borderStyle = element.getStyle(property.substring(0, property.indexOf('width')) + 'style');
            if ((borderStyle == 'none')||(borderStyle == 'hidden')) 
              return 0;
            else {            
              switch (value) {
                case 'thin':
                  result = 2;
                break;
                case 'medium':
                  result = 4; 
                break;
                case 'thick':
                  result = 6;
                break;
              }
            } 
          } 
        }
      }
      
      return result;
    },
    /**
     * Repaints element. 
     * 
     * Method added by Otavan Opisto 10.12.2008
     */
    repaint: function (element) {
      var e = $(element);
       
      var parent = e.parentNode;
      var nextSibling = e.next();
      
      e.remove();
      
      if (nextSibling) {
        parent.insertBefore(e, nextSibling);
      }  else {
        parent.appendChild(e);
      }
    }
});