New file |
0,0 → 1,386 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
|
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
|
http://dojotoolkit.org/community/licensing.shtml |
*/ |
|
dojo.provide("dojo.html.layout"); |
dojo.require("dojo.html.common"); |
dojo.require("dojo.html.style"); |
dojo.require("dojo.html.display"); |
dojo.html.sumAncestorProperties = function (node, prop) { |
node = dojo.byId(node); |
if (!node) { |
return 0; |
} |
var retVal = 0; |
while (node) { |
if (dojo.html.getComputedStyle(node, "position") == "fixed") { |
return 0; |
} |
var val = node[prop]; |
if (val) { |
retVal += val - 0; |
if (node == dojo.body()) { |
break; |
} |
} |
node = node.parentNode; |
} |
return retVal; |
}; |
dojo.html.setStyleAttributes = function (node, attributes) { |
node = dojo.byId(node); |
var splittedAttribs = attributes.replace(/(;)?\s*$/, "").split(";"); |
for (var i = 0; i < splittedAttribs.length; i++) { |
var nameValue = splittedAttribs[i].split(":"); |
var name = nameValue[0].replace(/\s*$/, "").replace(/^\s*/, "").toLowerCase(); |
var value = nameValue[1].replace(/\s*$/, "").replace(/^\s*/, ""); |
switch (name) { |
case "opacity": |
dojo.html.setOpacity(node, value); |
break; |
case "content-height": |
dojo.html.setContentBox(node, {height:value}); |
break; |
case "content-width": |
dojo.html.setContentBox(node, {width:value}); |
break; |
case "outer-height": |
dojo.html.setMarginBox(node, {height:value}); |
break; |
case "outer-width": |
dojo.html.setMarginBox(node, {width:value}); |
break; |
default: |
node.style[dojo.html.toCamelCase(name)] = value; |
} |
} |
}; |
dojo.html.boxSizing = {MARGIN_BOX:"margin-box", BORDER_BOX:"border-box", PADDING_BOX:"padding-box", CONTENT_BOX:"content-box"}; |
dojo.html.getAbsolutePosition = dojo.html.abs = function (node, includeScroll, boxType) { |
node = dojo.byId(node, node.ownerDocument); |
var ret = {x:0, y:0}; |
var bs = dojo.html.boxSizing; |
if (!boxType) { |
boxType = bs.CONTENT_BOX; |
} |
var nativeBoxType = 2; |
var targetBoxType; |
switch (boxType) { |
case bs.MARGIN_BOX: |
targetBoxType = 3; |
break; |
case bs.BORDER_BOX: |
targetBoxType = 2; |
break; |
case bs.PADDING_BOX: |
default: |
targetBoxType = 1; |
break; |
case bs.CONTENT_BOX: |
targetBoxType = 0; |
break; |
} |
var h = dojo.render.html; |
var db = document["body"] || document["documentElement"]; |
if (h.ie) { |
with (node.getBoundingClientRect()) { |
ret.x = left - 2; |
ret.y = top - 2; |
} |
} else { |
if (document.getBoxObjectFor) { |
nativeBoxType = 1; |
try { |
var bo = document.getBoxObjectFor(node); |
ret.x = bo.x - dojo.html.sumAncestorProperties(node, "scrollLeft"); |
ret.y = bo.y - dojo.html.sumAncestorProperties(node, "scrollTop"); |
} |
catch (e) { |
} |
} else { |
if (node["offsetParent"]) { |
var endNode; |
if ((h.safari) && (node.style.getPropertyValue("position") == "absolute") && (node.parentNode == db)) { |
endNode = db; |
} else { |
endNode = db.parentNode; |
} |
if (node.parentNode != db) { |
var nd = node; |
if (dojo.render.html.opera) { |
nd = db; |
} |
ret.x -= dojo.html.sumAncestorProperties(nd, "scrollLeft"); |
ret.y -= dojo.html.sumAncestorProperties(nd, "scrollTop"); |
} |
var curnode = node; |
do { |
var n = curnode["offsetLeft"]; |
if (!h.opera || n > 0) { |
ret.x += isNaN(n) ? 0 : n; |
} |
var m = curnode["offsetTop"]; |
ret.y += isNaN(m) ? 0 : m; |
curnode = curnode.offsetParent; |
} while ((curnode != endNode) && (curnode != null)); |
} else { |
if (node["x"] && node["y"]) { |
ret.x += isNaN(node.x) ? 0 : node.x; |
ret.y += isNaN(node.y) ? 0 : node.y; |
} |
} |
} |
} |
if (includeScroll) { |
var scroll = dojo.html.getScroll(); |
ret.y += scroll.top; |
ret.x += scroll.left; |
} |
var extentFuncArray = [dojo.html.getPaddingExtent, dojo.html.getBorderExtent, dojo.html.getMarginExtent]; |
if (nativeBoxType > targetBoxType) { |
for (var i = targetBoxType; i < nativeBoxType; ++i) { |
ret.y += extentFuncArray[i](node, "top"); |
ret.x += extentFuncArray[i](node, "left"); |
} |
} else { |
if (nativeBoxType < targetBoxType) { |
for (var i = targetBoxType; i > nativeBoxType; --i) { |
ret.y -= extentFuncArray[i - 1](node, "top"); |
ret.x -= extentFuncArray[i - 1](node, "left"); |
} |
} |
} |
ret.top = ret.y; |
ret.left = ret.x; |
return ret; |
}; |
dojo.html.isPositionAbsolute = function (node) { |
return (dojo.html.getComputedStyle(node, "position") == "absolute"); |
}; |
dojo.html._sumPixelValues = function (node, selectors, autoIsZero) { |
var total = 0; |
for (var x = 0; x < selectors.length; x++) { |
total += dojo.html.getPixelValue(node, selectors[x], autoIsZero); |
} |
return total; |
}; |
dojo.html.getMargin = function (node) { |
return {width:dojo.html._sumPixelValues(node, ["margin-left", "margin-right"], (dojo.html.getComputedStyle(node, "position") == "absolute")), height:dojo.html._sumPixelValues(node, ["margin-top", "margin-bottom"], (dojo.html.getComputedStyle(node, "position") == "absolute"))}; |
}; |
dojo.html.getBorder = function (node) { |
return {width:dojo.html.getBorderExtent(node, "left") + dojo.html.getBorderExtent(node, "right"), height:dojo.html.getBorderExtent(node, "top") + dojo.html.getBorderExtent(node, "bottom")}; |
}; |
dojo.html.getBorderExtent = function (node, side) { |
return (dojo.html.getStyle(node, "border-" + side + "-style") == "none" ? 0 : dojo.html.getPixelValue(node, "border-" + side + "-width")); |
}; |
dojo.html.getMarginExtent = function (node, side) { |
return dojo.html._sumPixelValues(node, ["margin-" + side], dojo.html.isPositionAbsolute(node)); |
}; |
dojo.html.getPaddingExtent = function (node, side) { |
return dojo.html._sumPixelValues(node, ["padding-" + side], true); |
}; |
dojo.html.getPadding = function (node) { |
return {width:dojo.html._sumPixelValues(node, ["padding-left", "padding-right"], true), height:dojo.html._sumPixelValues(node, ["padding-top", "padding-bottom"], true)}; |
}; |
dojo.html.getPadBorder = function (node) { |
var pad = dojo.html.getPadding(node); |
var border = dojo.html.getBorder(node); |
return {width:pad.width + border.width, height:pad.height + border.height}; |
}; |
dojo.html.getBoxSizing = function (node) { |
var h = dojo.render.html; |
var bs = dojo.html.boxSizing; |
if (((h.ie) || (h.opera)) && node.nodeName.toLowerCase() != "img") { |
var cm = document["compatMode"]; |
if ((cm == "BackCompat") || (cm == "QuirksMode")) { |
return bs.BORDER_BOX; |
} else { |
return bs.CONTENT_BOX; |
} |
} else { |
if (arguments.length == 0) { |
node = document.documentElement; |
} |
var sizing; |
if (!h.ie) { |
sizing = dojo.html.getStyle(node, "-moz-box-sizing"); |
if (!sizing) { |
sizing = dojo.html.getStyle(node, "box-sizing"); |
} |
} |
return (sizing ? sizing : bs.CONTENT_BOX); |
} |
}; |
dojo.html.isBorderBox = function (node) { |
return (dojo.html.getBoxSizing(node) == dojo.html.boxSizing.BORDER_BOX); |
}; |
dojo.html.getBorderBox = function (node) { |
node = dojo.byId(node); |
return {width:node.offsetWidth, height:node.offsetHeight}; |
}; |
dojo.html.getPaddingBox = function (node) { |
var box = dojo.html.getBorderBox(node); |
var border = dojo.html.getBorder(node); |
return {width:box.width - border.width, height:box.height - border.height}; |
}; |
dojo.html.getContentBox = function (node) { |
node = dojo.byId(node); |
var padborder = dojo.html.getPadBorder(node); |
return {width:node.offsetWidth - padborder.width, height:node.offsetHeight - padborder.height}; |
}; |
dojo.html.setContentBox = function (node, args) { |
node = dojo.byId(node); |
var width = 0; |
var height = 0; |
var isbb = dojo.html.isBorderBox(node); |
var padborder = (isbb ? dojo.html.getPadBorder(node) : {width:0, height:0}); |
var ret = {}; |
if (typeof args.width != "undefined") { |
width = args.width + padborder.width; |
ret.width = dojo.html.setPositivePixelValue(node, "width", width); |
} |
if (typeof args.height != "undefined") { |
height = args.height + padborder.height; |
ret.height = dojo.html.setPositivePixelValue(node, "height", height); |
} |
return ret; |
}; |
dojo.html.getMarginBox = function (node) { |
var borderbox = dojo.html.getBorderBox(node); |
var margin = dojo.html.getMargin(node); |
return {width:borderbox.width + margin.width, height:borderbox.height + margin.height}; |
}; |
dojo.html.setMarginBox = function (node, args) { |
node = dojo.byId(node); |
var width = 0; |
var height = 0; |
var isbb = dojo.html.isBorderBox(node); |
var padborder = (!isbb ? dojo.html.getPadBorder(node) : {width:0, height:0}); |
var margin = dojo.html.getMargin(node); |
var ret = {}; |
if (typeof args.width != "undefined") { |
width = args.width - padborder.width; |
width -= margin.width; |
ret.width = dojo.html.setPositivePixelValue(node, "width", width); |
} |
if (typeof args.height != "undefined") { |
height = args.height - padborder.height; |
height -= margin.height; |
ret.height = dojo.html.setPositivePixelValue(node, "height", height); |
} |
return ret; |
}; |
dojo.html.getElementBox = function (node, type) { |
var bs = dojo.html.boxSizing; |
switch (type) { |
case bs.MARGIN_BOX: |
return dojo.html.getMarginBox(node); |
case bs.BORDER_BOX: |
return dojo.html.getBorderBox(node); |
case bs.PADDING_BOX: |
return dojo.html.getPaddingBox(node); |
case bs.CONTENT_BOX: |
default: |
return dojo.html.getContentBox(node); |
} |
}; |
dojo.html.toCoordinateObject = dojo.html.toCoordinateArray = function (coords, includeScroll, boxtype) { |
if (coords instanceof Array || typeof coords == "array") { |
dojo.deprecated("dojo.html.toCoordinateArray", "use dojo.html.toCoordinateObject({left: , top: , width: , height: }) instead", "0.5"); |
while (coords.length < 4) { |
coords.push(0); |
} |
while (coords.length > 4) { |
coords.pop(); |
} |
var ret = {left:coords[0], top:coords[1], width:coords[2], height:coords[3]}; |
} else { |
if (!coords.nodeType && !(coords instanceof String || typeof coords == "string") && ("width" in coords || "height" in coords || "left" in coords || "x" in coords || "top" in coords || "y" in coords)) { |
var ret = {left:coords.left || coords.x || 0, top:coords.top || coords.y || 0, width:coords.width || 0, height:coords.height || 0}; |
} else { |
var node = dojo.byId(coords); |
var pos = dojo.html.abs(node, includeScroll, boxtype); |
var marginbox = dojo.html.getMarginBox(node); |
var ret = {left:pos.left, top:pos.top, width:marginbox.width, height:marginbox.height}; |
} |
} |
ret.x = ret.left; |
ret.y = ret.top; |
return ret; |
}; |
dojo.html.setMarginBoxWidth = dojo.html.setOuterWidth = function (node, width) { |
return dojo.html._callDeprecated("setMarginBoxWidth", "setMarginBox", arguments, "width"); |
}; |
dojo.html.setMarginBoxHeight = dojo.html.setOuterHeight = function () { |
return dojo.html._callDeprecated("setMarginBoxHeight", "setMarginBox", arguments, "height"); |
}; |
dojo.html.getMarginBoxWidth = dojo.html.getOuterWidth = function () { |
return dojo.html._callDeprecated("getMarginBoxWidth", "getMarginBox", arguments, null, "width"); |
}; |
dojo.html.getMarginBoxHeight = dojo.html.getOuterHeight = function () { |
return dojo.html._callDeprecated("getMarginBoxHeight", "getMarginBox", arguments, null, "height"); |
}; |
dojo.html.getTotalOffset = function (node, type, includeScroll) { |
return dojo.html._callDeprecated("getTotalOffset", "getAbsolutePosition", arguments, null, type); |
}; |
dojo.html.getAbsoluteX = function (node, includeScroll) { |
return dojo.html._callDeprecated("getAbsoluteX", "getAbsolutePosition", arguments, null, "x"); |
}; |
dojo.html.getAbsoluteY = function (node, includeScroll) { |
return dojo.html._callDeprecated("getAbsoluteY", "getAbsolutePosition", arguments, null, "y"); |
}; |
dojo.html.totalOffsetLeft = function (node, includeScroll) { |
return dojo.html._callDeprecated("totalOffsetLeft", "getAbsolutePosition", arguments, null, "left"); |
}; |
dojo.html.totalOffsetTop = function (node, includeScroll) { |
return dojo.html._callDeprecated("totalOffsetTop", "getAbsolutePosition", arguments, null, "top"); |
}; |
dojo.html.getMarginWidth = function (node) { |
return dojo.html._callDeprecated("getMarginWidth", "getMargin", arguments, null, "width"); |
}; |
dojo.html.getMarginHeight = function (node) { |
return dojo.html._callDeprecated("getMarginHeight", "getMargin", arguments, null, "height"); |
}; |
dojo.html.getBorderWidth = function (node) { |
return dojo.html._callDeprecated("getBorderWidth", "getBorder", arguments, null, "width"); |
}; |
dojo.html.getBorderHeight = function (node) { |
return dojo.html._callDeprecated("getBorderHeight", "getBorder", arguments, null, "height"); |
}; |
dojo.html.getPaddingWidth = function (node) { |
return dojo.html._callDeprecated("getPaddingWidth", "getPadding", arguments, null, "width"); |
}; |
dojo.html.getPaddingHeight = function (node) { |
return dojo.html._callDeprecated("getPaddingHeight", "getPadding", arguments, null, "height"); |
}; |
dojo.html.getPadBorderWidth = function (node) { |
return dojo.html._callDeprecated("getPadBorderWidth", "getPadBorder", arguments, null, "width"); |
}; |
dojo.html.getPadBorderHeight = function (node) { |
return dojo.html._callDeprecated("getPadBorderHeight", "getPadBorder", arguments, null, "height"); |
}; |
dojo.html.getBorderBoxWidth = dojo.html.getInnerWidth = function () { |
return dojo.html._callDeprecated("getBorderBoxWidth", "getBorderBox", arguments, null, "width"); |
}; |
dojo.html.getBorderBoxHeight = dojo.html.getInnerHeight = function () { |
return dojo.html._callDeprecated("getBorderBoxHeight", "getBorderBox", arguments, null, "height"); |
}; |
dojo.html.getContentBoxWidth = dojo.html.getContentWidth = function () { |
return dojo.html._callDeprecated("getContentBoxWidth", "getContentBox", arguments, null, "width"); |
}; |
dojo.html.getContentBoxHeight = dojo.html.getContentHeight = function () { |
return dojo.html._callDeprecated("getContentBoxHeight", "getContentBox", arguments, null, "height"); |
}; |
dojo.html.setContentBoxWidth = dojo.html.setContentWidth = function (node, width) { |
return dojo.html._callDeprecated("setContentBoxWidth", "setContentBox", arguments, "width"); |
}; |
dojo.html.setContentBoxHeight = dojo.html.setContentHeight = function (node, height) { |
return dojo.html._callDeprecated("setContentBoxHeight", "setContentBox", arguments, "height"); |
}; |
|