
/*
 * weinre is available under *either* the terms of the modified BSD license *or* the
 * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
 * 
 * Copyright (c) 2011 IBM Corporation
 */

requireClass ../common/Binding
requireClass ../common/Weinre

//-----------------------------------------------------------------------------
class ElementHighlighter
    this.boxMargin  = document.createElement("div")
    this.boxBorder  = document.createElement("div")
    this.boxPadding = document.createElement("div")
    this.boxContent = document.createElement("div")
    
    this.boxMargin.appendChild(this.boxBorder)
    this.boxBorder.appendChild(this.boxPadding)
    this.boxPadding.appendChild(this.boxContent)
    
    this.boxMargin.style.backgroundColor  = "#FCC"
    this.boxBorder.style.backgroundColor  = "#000"
    this.boxPadding.style.backgroundColor = "#CFC"
    this.boxContent.style.backgroundColor = "#CCF"
    
    this.boxMargin.style.opacity =
    this.boxBorder.style.opacity =
    this.boxPadding.style.opacity =
    this.boxContent.style.opacity = 0.6
    
    this.boxMargin.style.position =
    this.boxBorder.style.position =
    this.boxPadding.style.position =
    this.boxContent.style.position = "absolute"
    
    this.boxMargin.style.borderWidth =
    this.boxBorder.style.borderWidth =
    this.boxPadding.style.borderWidth =
    this.boxContent.style.borderWidth = "thin"
        
    this.boxMargin.style.borderStyle =
    this.boxBorder.style.borderStyle =
    this.boxPadding.style.borderStyle =
    this.boxContent.style.borderStyle = "solid"
                
    this.boxMargin.__weinreHighlighter =
    this.boxBorder.__weinreHighlighter =
    this.boxPadding.__weinreHighlighter =
    this.boxContent.__weinreHighlighter = true
                        
    this.boxMargin.style.display = "none"
        
    document.body.appendChild(this.boxMargin)
    
//-----------------------------------------------------------------------------
method on(element)
    if (null == element) return
    if (element.nodeType != Node.ELEMENT_NODE) return
    
    this.calculateMetrics(element)
    this.boxMargin.style.display = "block"

//-----------------------------------------------------------------------------
method off
    this.boxMargin.style.display = "none"

//-----------------------------------------------------------------------------
getter element
    return this.boxMargin

//-----------------------------------------------------------------------------
method calculateMetrics(element)

    var metrics = getMetrics(element)
    
    this.boxMargin.style.top     = metrics.y      + "px"
    this.boxMargin.style.left    = metrics.x      + "px"
    this.boxMargin.style.height  = metrics.height + "px"
    this.boxMargin.style.width   = metrics.width  + "px"

    this.boxBorder.style.top     = metrics.marginTop    + "px"
    this.boxBorder.style.left    = metrics.marginLeft   + "px"
    this.boxBorder.style.bottom  = metrics.marginBottom + "px"
    this.boxBorder.style.right   = metrics.marginRight  + "px"

    this.boxPadding.style.top    = metrics.borderTop    + "px"
    this.boxPadding.style.left   = metrics.borderLeft   + "px"
    this.boxPadding.style.bottom = metrics.borderBottom + "px"
    this.boxPadding.style.right  = metrics.borderRight  + "px"
    
    this.boxContent.style.top    = metrics.paddingTop    + "px"
    this.boxContent.style.left   = metrics.paddingLeft   + "px"
    this.boxContent.style.bottom = metrics.paddingBottom + "px"
    this.boxContent.style.right  = metrics.paddingRight  + "px"
    
//-----------------------------------------------------------------------------
function getMetrics(element)
    var result = {}
    
    // get the x,y position
    var left = 0
    var top  = 0
        
    var el = element
    do {
        left += el.offsetLeft
        top  += el.offsetTop
    } while (el = el.offsetParent)
    
    result.x = left
    result.y = top

    // get the computed style
    var cStyle = document.defaultView.getComputedStyle(element)
    
    result.width  = fromPx(cStyle["width"])
    result.height = fromPx(cStyle["height"])
    
    result.marginLeft    = fromPx(cStyle["margin-left"])
    result.marginRight   = fromPx(cStyle["margin-right"])
    result.marginTop     = fromPx(cStyle["margin-top"])
    result.marginBottom  = fromPx(cStyle["margin-bottom"])
    
    result.borderLeft    = fromPx(cStyle["border-left-width"])
    result.borderRight   = fromPx(cStyle["border-right-width"])
    result.borderTop     = fromPx(cStyle["border-top-width"])
    result.borderBottom  = fromPx(cStyle["border-bottom-width"])
    
    result.paddingLeft   = fromPx(cStyle["padding-left"])
    result.paddingRight  = fromPx(cStyle["padding-right"])
    result.paddingTop    = fromPx(cStyle["padding-top"])
    result.paddingBottom = fromPx(cStyle["padding-bottom"])

    result.width += 
        result.marginLeft  + result.marginRight +
        result.borderRight  +
        result.paddingLeft + result.paddingRight
        
    result.height += 
        result.marginTop  + result.marginBottom +
        result.borderBottom  +
        result.paddingTop + result.paddingBottom
        
    result.x -= 
        result.marginLeft
        
    result.y -= 
        result.marginTop

    return result
    
//-----------------------------------------------------------------------------
function fromPx(string) 
    return parseInt(string.replace(/px$/,""))
