Improve output: distinguish between failed assertions (failures) and unexpected exceptions (errors), and print a filtered stack trace for any exception.
This commit is contained in:
commit
4f2e303079
1839 changed files with 235630 additions and 0 deletions
826
webapp/web/src/style.js
Normal file
826
webapp/web/src/style.js
Normal file
|
@ -0,0 +1,826 @@
|
|||
/*
|
||||
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.style");
|
||||
dojo.require("dojo.graphics.color");
|
||||
dojo.require("dojo.uri.Uri");
|
||||
dojo.require("dojo.lang.common");
|
||||
|
||||
(function(){
|
||||
var h = dojo.render.html;
|
||||
var ds = dojo.style;
|
||||
var db = document["body"]||document["documentElement"];
|
||||
|
||||
ds.boxSizing = {
|
||||
MARGIN_BOX: "margin-box",
|
||||
BORDER_BOX: "border-box",
|
||||
PADDING_BOX: "padding-box",
|
||||
CONTENT_BOX: "content-box"
|
||||
};
|
||||
var bs = ds.boxSizing;
|
||||
|
||||
ds.getBoxSizing = function(node){
|
||||
if((h.ie)||(h.opera)){
|
||||
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 = ds.getStyle(node, "-moz-box-sizing");
|
||||
if(!sizing){ sizing = ds.getStyle(node, "box-sizing"); }
|
||||
return (sizing ? sizing : bs.CONTENT_BOX);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
The following several function use the dimensions shown below
|
||||
|
||||
+-------------------------+
|
||||
| margin |
|
||||
| +---------------------+ |
|
||||
| | border | |
|
||||
| | +-----------------+ | |
|
||||
| | | padding | | |
|
||||
| | | +-------------+ | | |
|
||||
| | | | content | | | |
|
||||
| | | +-------------+ | | |
|
||||
| | +-|-------------|-+ | |
|
||||
| +-|-|-------------|-|-+ |
|
||||
+-|-|-|-------------|-|-|-+
|
||||
| | | | | | | |
|
||||
| | | |<- content ->| | | |
|
||||
| |<------ inner ------>| |
|
||||
|<-------- outer -------->|
|
||||
+-------------------------+
|
||||
|
||||
* content-box
|
||||
|
||||
|m|b|p| |p|b|m|
|
||||
| |<------ offset ----->| |
|
||||
| | |<---- client --->| | |
|
||||
| | | |<-- width -->| | | |
|
||||
|
||||
* border-box
|
||||
|
||||
|m|b|p| |p|b|m|
|
||||
| |<------ offset ----->| |
|
||||
| | |<---- client --->| | |
|
||||
| |<------ width ------>| |
|
||||
*/
|
||||
|
||||
/*
|
||||
Notes:
|
||||
|
||||
General:
|
||||
- Uncomputable values are returned as NaN.
|
||||
- setOuterWidth/Height return *false* if the outer size could not
|
||||
be computed, otherwise *true*.
|
||||
- (sjmiles) knows no way to find the calculated values for auto-margins.
|
||||
- All returned values are floating point in 'px' units. If a
|
||||
non-zero computed style value is not specified in 'px', NaN is
|
||||
returned.
|
||||
|
||||
FF:
|
||||
- styles specified as '0' (unitless 0) show computed as '0pt'.
|
||||
|
||||
IE:
|
||||
- clientWidth/Height are unreliable (0 unless the object has 'layout').
|
||||
- margins must be specified in px, or 0 (in any unit) for any
|
||||
sizing function to work. Otherwise margins detect as 'auto'.
|
||||
- padding can be empty or, if specified, must be in px, or 0 (in
|
||||
any unit) for any sizing function to work.
|
||||
|
||||
Safari:
|
||||
- Safari defaults padding values to 'auto'.
|
||||
|
||||
See the unit tests for examples of (un)computable values in a given browser.
|
||||
|
||||
*/
|
||||
|
||||
// FIXME: these work for some elements (e.g. DIV) but not others (e.g. TABLE, TEXTAREA)
|
||||
|
||||
ds.isBorderBox = function(node){
|
||||
return (ds.getBoxSizing(node) == bs.BORDER_BOX);
|
||||
}
|
||||
|
||||
ds.getUnitValue = function(node, cssSelector, autoIsZero){
|
||||
var s = ds.getComputedStyle(node, cssSelector);
|
||||
if((!s)||((s == 'auto')&&(autoIsZero))){ return { value: 0, units: 'px' }; }
|
||||
if(dojo.lang.isUndefined(s)){return ds.getUnitValue.bad;}
|
||||
// FIXME: is regex inefficient vs. parseInt or some manual test?
|
||||
var match = s.match(/(\-?[\d.]+)([a-z%]*)/i);
|
||||
if (!match){return ds.getUnitValue.bad;}
|
||||
return { value: Number(match[1]), units: match[2].toLowerCase() };
|
||||
}
|
||||
// FIXME: 'bad' value should be 0?
|
||||
ds.getUnitValue.bad = { value: NaN, units: '' };
|
||||
|
||||
ds.getPixelValue = function(node, cssSelector, autoIsZero){
|
||||
var result = ds.getUnitValue(node, cssSelector, autoIsZero);
|
||||
// FIXME: there is serious debate as to whether or not this is the right solution
|
||||
if(isNaN(result.value)){ return 0; }
|
||||
// FIXME: code exists for converting other units to px (see Dean Edward's IE7)
|
||||
// but there are cross-browser complexities
|
||||
if((result.value)&&(result.units != 'px')){ return NaN; }
|
||||
return result.value;
|
||||
}
|
||||
|
||||
// FIXME: deprecated
|
||||
ds.getNumericStyle = function() {
|
||||
dojo.deprecated('dojo.(style|html).getNumericStyle', 'in favor of dojo.(style|html).getPixelValue', '0.4');
|
||||
return ds.getPixelValue.apply(this, arguments);
|
||||
}
|
||||
|
||||
ds.setPositivePixelValue = function(node, selector, value){
|
||||
if(isNaN(value)){return false;}
|
||||
node.style[selector] = Math.max(0, value) + 'px';
|
||||
return true;
|
||||
}
|
||||
|
||||
ds._sumPixelValues = function(node, selectors, autoIsZero){
|
||||
var total = 0;
|
||||
for(var x=0; x<selectors.length; x++){
|
||||
total += ds.getPixelValue(node, selectors[x], autoIsZero);
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
ds.isPositionAbsolute = function(node){
|
||||
return (ds.getComputedStyle(node, 'position') == 'absolute');
|
||||
}
|
||||
|
||||
ds.getBorderExtent = function(node, side){
|
||||
return (ds.getStyle(node, 'border-' + side + '-style') == 'none' ? 0 : ds.getPixelValue(node, 'border-' + side + '-width'));
|
||||
}
|
||||
|
||||
ds.getMarginWidth = function(node){
|
||||
return ds._sumPixelValues(node, ["margin-left", "margin-right"], ds.isPositionAbsolute(node));
|
||||
}
|
||||
|
||||
ds.getBorderWidth = function(node){
|
||||
return ds.getBorderExtent(node, 'left') + ds.getBorderExtent(node, 'right');
|
||||
}
|
||||
|
||||
ds.getPaddingWidth = function(node){
|
||||
return ds._sumPixelValues(node, ["padding-left", "padding-right"], true);
|
||||
}
|
||||
|
||||
ds.getPadBorderWidth = function(node) {
|
||||
return ds.getPaddingWidth(node) + ds.getBorderWidth(node);
|
||||
}
|
||||
|
||||
ds.getContentBoxWidth = function(node){
|
||||
node = dojo.byId(node);
|
||||
return node.offsetWidth - ds.getPadBorderWidth(node);
|
||||
}
|
||||
|
||||
ds.getBorderBoxWidth = function(node){
|
||||
node = dojo.byId(node);
|
||||
return node.offsetWidth;
|
||||
}
|
||||
|
||||
ds.getMarginBoxWidth = function(node){
|
||||
return ds.getInnerWidth(node) + ds.getMarginWidth(node);
|
||||
}
|
||||
|
||||
ds.setContentBoxWidth = function(node, pxWidth){
|
||||
node = dojo.byId(node);
|
||||
if (ds.isBorderBox(node)){
|
||||
pxWidth += ds.getPadBorderWidth(node);
|
||||
}
|
||||
return ds.setPositivePixelValue(node, "width", pxWidth);
|
||||
}
|
||||
|
||||
ds.setMarginBoxWidth = function(node, pxWidth){
|
||||
node = dojo.byId(node);
|
||||
if (!ds.isBorderBox(node)){
|
||||
pxWidth -= ds.getPadBorderWidth(node);
|
||||
}
|
||||
pxWidth -= ds.getMarginWidth(node);
|
||||
return ds.setPositivePixelValue(node, "width", pxWidth);
|
||||
}
|
||||
|
||||
// FIXME: deprecate and remove
|
||||
ds.getContentWidth = ds.getContentBoxWidth;
|
||||
ds.getInnerWidth = ds.getBorderBoxWidth;
|
||||
ds.getOuterWidth = ds.getMarginBoxWidth;
|
||||
ds.setContentWidth = ds.setContentBoxWidth;
|
||||
ds.setOuterWidth = ds.setMarginBoxWidth;
|
||||
|
||||
ds.getMarginHeight = function(node){
|
||||
return ds._sumPixelValues(node, ["margin-top", "margin-bottom"], ds.isPositionAbsolute(node));
|
||||
}
|
||||
|
||||
ds.getBorderHeight = function(node){
|
||||
return ds.getBorderExtent(node, 'top') + ds.getBorderExtent(node, 'bottom');
|
||||
}
|
||||
|
||||
ds.getPaddingHeight = function(node){
|
||||
return ds._sumPixelValues(node, ["padding-top", "padding-bottom"], true);
|
||||
}
|
||||
|
||||
ds.getPadBorderHeight = function(node) {
|
||||
return ds.getPaddingHeight(node) + ds.getBorderHeight(node);
|
||||
}
|
||||
|
||||
ds.getContentBoxHeight = function(node){
|
||||
node = dojo.byId(node);
|
||||
return node.offsetHeight - ds.getPadBorderHeight(node);
|
||||
}
|
||||
|
||||
ds.getBorderBoxHeight = function(node){
|
||||
node = dojo.byId(node);
|
||||
return node.offsetHeight; // FIXME: does this work?
|
||||
}
|
||||
|
||||
ds.getMarginBoxHeight = function(node){
|
||||
return ds.getInnerHeight(node) + ds.getMarginHeight(node);
|
||||
}
|
||||
|
||||
ds.setContentBoxHeight = function(node, pxHeight){
|
||||
node = dojo.byId(node);
|
||||
if (ds.isBorderBox(node)){
|
||||
pxHeight += ds.getPadBorderHeight(node);
|
||||
}
|
||||
return ds.setPositivePixelValue(node, "height", pxHeight);
|
||||
}
|
||||
|
||||
ds.setMarginBoxHeight = function(node, pxHeight){
|
||||
node = dojo.byId(node);
|
||||
if (!ds.isBorderBox(node)){
|
||||
pxHeight -= ds.getPadBorderHeight(node);
|
||||
}
|
||||
pxHeight -= ds.getMarginHeight(node);
|
||||
return ds.setPositivePixelValue(node, "height", pxHeight);
|
||||
}
|
||||
|
||||
// FIXME: deprecate and remove
|
||||
ds.getContentHeight = ds.getContentBoxHeight;
|
||||
ds.getInnerHeight = ds.getBorderBoxHeight;
|
||||
ds.getOuterHeight = ds.getMarginBoxHeight;
|
||||
ds.setContentHeight = ds.setContentBoxHeight;
|
||||
ds.setOuterHeight = ds.setMarginBoxHeight;
|
||||
|
||||
/**
|
||||
* dojo.style.getAbsolutePosition(xyz, true) returns xyz's position relative to the document.
|
||||
* Itells you where you would position a node
|
||||
* inside document.body such that it was on top of xyz. Most people set the flag to true when calling
|
||||
* getAbsolutePosition().
|
||||
*
|
||||
* dojo.style.getAbsolutePosition(xyz, false) returns xyz's position relative to the viewport.
|
||||
* It returns the position that would be returned
|
||||
* by event.clientX/Y if the mouse were directly over the top/left of this node.
|
||||
*/
|
||||
ds.getAbsolutePosition = ds.abs = function(node, includeScroll){
|
||||
node = dojo.byId(node);
|
||||
var ret = [];
|
||||
ret.x = ret.y = 0;
|
||||
var st = dojo.html.getScrollTop();
|
||||
var sl = dojo.html.getScrollLeft();
|
||||
|
||||
if(h.ie){
|
||||
with(node.getBoundingClientRect()){
|
||||
ret.x = left-2;
|
||||
ret.y = top-2;
|
||||
}
|
||||
}else if(document.getBoxObjectFor){
|
||||
// mozilla
|
||||
var bo = document.getBoxObjectFor(node);
|
||||
ret.x = bo.x - ds.sumAncestorProperties(node, "scrollLeft");
|
||||
ret.y = bo.y - ds.sumAncestorProperties(node, "scrollTop");
|
||||
}else{
|
||||
if(node["offsetParent"]){
|
||||
var endNode;
|
||||
// in Safari, if the node is an absolutely positioned child of
|
||||
// the body and the body has a margin the offset of the child
|
||||
// and the body contain the body's margins, so we need to end
|
||||
// at the body
|
||||
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(window.opera){ nd = db; }
|
||||
ret.x -= ds.sumAncestorProperties(nd, "scrollLeft");
|
||||
ret.y -= ds.sumAncestorProperties(nd, "scrollTop");
|
||||
}
|
||||
do{
|
||||
var n = node["offsetLeft"];
|
||||
ret.x += isNaN(n) ? 0 : n;
|
||||
var m = node["offsetTop"];
|
||||
ret.y += isNaN(m) ? 0 : m;
|
||||
node = node.offsetParent;
|
||||
}while((node != endNode)&&(node != null));
|
||||
}else if(node["x"]&&node["y"]){
|
||||
ret.x += isNaN(node.x) ? 0 : node.x;
|
||||
ret.y += isNaN(node.y) ? 0 : node.y;
|
||||
}
|
||||
}
|
||||
|
||||
// account for document scrolling!
|
||||
if(includeScroll){
|
||||
ret.y += st;
|
||||
ret.x += sl;
|
||||
}
|
||||
|
||||
ret[0] = ret.x;
|
||||
ret[1] = ret.y;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ds.sumAncestorProperties = function(node, prop){
|
||||
node = dojo.byId(node);
|
||||
if(!node){ return 0; } // FIXME: throw an error?
|
||||
|
||||
var retVal = 0;
|
||||
while(node){
|
||||
var val = node[prop];
|
||||
if(val){
|
||||
retVal += val - 0;
|
||||
if(node==document.body){ break; }// opera and khtml #body & #html has the same values, we only need one value
|
||||
}
|
||||
node = node.parentNode;
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
ds.getTotalOffset = function(node, type, includeScroll){
|
||||
return ds.abs(node, includeScroll)[(type == "top") ? "y" : "x"];
|
||||
}
|
||||
|
||||
ds.getAbsoluteX = ds.totalOffsetLeft = function(node, includeScroll){
|
||||
return ds.getTotalOffset(node, "left", includeScroll);
|
||||
}
|
||||
|
||||
ds.getAbsoluteY = ds.totalOffsetTop = function(node, includeScroll){
|
||||
return ds.getTotalOffset(node, "top", includeScroll);
|
||||
}
|
||||
|
||||
ds.styleSheet = null;
|
||||
|
||||
// FIXME: this is a really basic stub for adding and removing cssRules, but
|
||||
// it assumes that you know the index of the cssRule that you want to add
|
||||
// or remove, making it less than useful. So we need something that can
|
||||
// search for the selector that you you want to remove.
|
||||
ds.insertCssRule = function(selector, declaration, index) {
|
||||
if (!ds.styleSheet) {
|
||||
if (document.createStyleSheet) { // IE
|
||||
ds.styleSheet = document.createStyleSheet();
|
||||
} else if (document.styleSheets[0]) { // rest
|
||||
// FIXME: should create a new style sheet here
|
||||
// fall back on an exsiting style sheet
|
||||
ds.styleSheet = document.styleSheets[0];
|
||||
} else { return null; } // fail
|
||||
}
|
||||
|
||||
if (arguments.length < 3) { // index may == 0
|
||||
if (ds.styleSheet.cssRules) { // W3
|
||||
index = ds.styleSheet.cssRules.length;
|
||||
} else if (ds.styleSheet.rules) { // IE
|
||||
index = ds.styleSheet.rules.length;
|
||||
} else { return null; } // fail
|
||||
}
|
||||
|
||||
if (ds.styleSheet.insertRule) { // W3
|
||||
var rule = selector + " { " + declaration + " }";
|
||||
return ds.styleSheet.insertRule(rule, index);
|
||||
} else if (ds.styleSheet.addRule) { // IE
|
||||
return ds.styleSheet.addRule(selector, declaration, index);
|
||||
} else { return null; } // fail
|
||||
}
|
||||
|
||||
ds.removeCssRule = function(index){
|
||||
if(!ds.styleSheet){
|
||||
dojo.debug("no stylesheet defined for removing rules");
|
||||
return false;
|
||||
}
|
||||
if(h.ie){
|
||||
if(!index){
|
||||
index = ds.styleSheet.rules.length;
|
||||
ds.styleSheet.removeRule(index);
|
||||
}
|
||||
}else if(document.styleSheets[0]){
|
||||
if(!index){
|
||||
index = ds.styleSheet.cssRules.length;
|
||||
}
|
||||
ds.styleSheet.deleteRule(index);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// calls css by XmlHTTP and inserts it into DOM as <style [widgetType="widgetType"]> *downloaded cssText*</style>
|
||||
ds.insertCssFile = function(URI, doc, checkDuplicates){
|
||||
if(!URI){ return; }
|
||||
if(!doc){ doc = document; }
|
||||
var cssStr = dojo.hostenv.getText(URI);
|
||||
cssStr = ds.fixPathsInCssText(cssStr, URI);
|
||||
|
||||
if(checkDuplicates){
|
||||
var styles = doc.getElementsByTagName("style");
|
||||
var cssText = "";
|
||||
for(var i = 0; i<styles.length; i++){
|
||||
cssText = (styles[i].styleSheet && styles[i].styleSheet.cssText) ? styles[i].styleSheet.cssText : styles[i].innerHTML;
|
||||
if(cssStr == cssText){ return; }
|
||||
}
|
||||
}
|
||||
|
||||
var style = ds.insertCssText(cssStr);
|
||||
// insert custom attribute ex dbgHref="../foo.css" usefull when debugging in DOM inspectors, no?
|
||||
if(style && djConfig.isDebug){
|
||||
style.setAttribute("dbgHref", URI);
|
||||
}
|
||||
return style
|
||||
}
|
||||
|
||||
// DomNode Style = insertCssText(String ".dojoMenu {color: green;}"[, DomDoc document, dojo.uri.Uri Url ])
|
||||
ds.insertCssText = function(cssStr, doc, URI){
|
||||
if(!cssStr){ return; }
|
||||
if(!doc){ doc = document; }
|
||||
if(URI){// fix paths in cssStr
|
||||
cssStr = ds.fixPathsInCssText(cssStr, URI);
|
||||
}
|
||||
var style = doc.createElement("style");
|
||||
style.setAttribute("type", "text/css");
|
||||
// IE is b0rken enough to require that we add the element to the doc
|
||||
// before changing it's properties
|
||||
var head = doc.getElementsByTagName("head")[0];
|
||||
if(!head){ // must have a head tag
|
||||
dojo.debug("No head tag in document, aborting styles");
|
||||
return;
|
||||
}else{
|
||||
head.appendChild(style);
|
||||
}
|
||||
if(style.styleSheet){// IE
|
||||
style.styleSheet.cssText = cssStr;
|
||||
}else{ // w3c
|
||||
var cssText = doc.createTextNode(cssStr);
|
||||
style.appendChild(cssText);
|
||||
}
|
||||
return style;
|
||||
}
|
||||
|
||||
// String cssText = fixPathsInCssText(String cssStr, dojo.uri.Uri URI)
|
||||
// usage: cssText comes from dojoroot/src/widget/templates/HtmlFoobar.css
|
||||
// it has .dojoFoo { background-image: url(images/bar.png);}
|
||||
// then uri should point to dojoroot/src/widget/templates/
|
||||
ds.fixPathsInCssText = function(cssStr, URI){
|
||||
if(!cssStr || !URI){ return; }
|
||||
var pos = 0; var str = ""; var url = "";
|
||||
while(pos!=-1){
|
||||
pos = 0;url = "";
|
||||
pos = cssStr.indexOf("url(", pos);
|
||||
if(pos<0){ break; }
|
||||
str += cssStr.slice(0,pos+4);
|
||||
cssStr = cssStr.substring(pos+4, cssStr.length);
|
||||
url += cssStr.match(/^[\t\s\w()\/.\\'"-:#=&?]*\)/)[0]; // url string
|
||||
cssStr = cssStr.substring(url.length-1, cssStr.length); // remove url from css string til next loop
|
||||
url = url.replace(/^[\s\t]*(['"]?)([\w()\/.\\'"-:#=&?]*)\1[\s\t]*?\)/,"$2"); // clean string
|
||||
if(url.search(/(file|https?|ftps?):\/\//)==-1){
|
||||
url = (new dojo.uri.Uri(URI,url).toString());
|
||||
}
|
||||
str += url;
|
||||
};
|
||||
return str+cssStr;
|
||||
}
|
||||
|
||||
ds.getBackgroundColor = function(node) {
|
||||
node = dojo.byId(node);
|
||||
var color;
|
||||
do{
|
||||
color = ds.getStyle(node, "background-color");
|
||||
// Safari doesn't say "transparent"
|
||||
if(color.toLowerCase() == "rgba(0, 0, 0, 0)") { color = "transparent"; }
|
||||
if(node == document.getElementsByTagName("body")[0]) { node = null; break; }
|
||||
node = node.parentNode;
|
||||
}while(node && dojo.lang.inArray(color, ["transparent", ""]));
|
||||
if(color == "transparent"){
|
||||
color = [255, 255, 255, 0];
|
||||
}else{
|
||||
color = dojo.graphics.color.extractRGB(color);
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
ds.getComputedStyle = function(node, cssSelector, inValue){
|
||||
node = dojo.byId(node);
|
||||
// cssSelector may actually be in camel case, so force selector version
|
||||
var cssSelector = ds.toSelectorCase(cssSelector);
|
||||
var property = ds.toCamelCase(cssSelector);
|
||||
if(!node || !node.style){
|
||||
return inValue;
|
||||
}else if(document.defaultView){ // W3, gecko, KHTML
|
||||
try{
|
||||
var cs = document.defaultView.getComputedStyle(node, "");
|
||||
if (cs){
|
||||
return cs.getPropertyValue(cssSelector);
|
||||
}
|
||||
}catch(e){ // reports are that Safari can throw an exception above
|
||||
if (node.style.getPropertyValue){ // W3
|
||||
return node.style.getPropertyValue(cssSelector);
|
||||
}else return inValue;
|
||||
}
|
||||
}else if(node.currentStyle){ // IE
|
||||
return node.currentStyle[property];
|
||||
}if(node.style.getPropertyValue){ // W3
|
||||
return node.style.getPropertyValue(cssSelector);
|
||||
}else{
|
||||
return inValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a property value from a node's style object.
|
||||
*/
|
||||
ds.getStyleProperty = function(node, cssSelector){
|
||||
node = dojo.byId(node);
|
||||
// FIXME: should we use node.style.getPropertyValue over style[property]?
|
||||
// style[property] works in all (modern) browsers, getPropertyValue is W3 but not supported in IE
|
||||
// FIXME: what about runtimeStyle?
|
||||
return (node && node.style ? node.style[ds.toCamelCase(cssSelector)] : undefined);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a property value from a node's style object.
|
||||
*/
|
||||
ds.getStyle = function(node, cssSelector){
|
||||
var value = ds.getStyleProperty(node, cssSelector);
|
||||
return (value ? value : ds.getComputedStyle(node, cssSelector));
|
||||
}
|
||||
|
||||
ds.setStyle = function(node, cssSelector, value){
|
||||
node = dojo.byId(node);
|
||||
if(node && node.style){
|
||||
var camelCased = ds.toCamelCase(cssSelector);
|
||||
node.style[camelCased] = value;
|
||||
}
|
||||
}
|
||||
|
||||
ds.toCamelCase = function(selector) {
|
||||
var arr = selector.split('-'), cc = arr[0];
|
||||
for(var i = 1; i < arr.length; i++) {
|
||||
cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
|
||||
}
|
||||
return cc;
|
||||
}
|
||||
|
||||
ds.toSelectorCase = function(selector) {
|
||||
return selector.replace(/([A-Z])/g, "-$1" ).toLowerCase() ;
|
||||
}
|
||||
|
||||
/* float between 0.0 (transparent) and 1.0 (opaque) */
|
||||
ds.setOpacity = function setOpacity(node, opacity, dontFixOpacity) {
|
||||
node = dojo.byId(node);
|
||||
if(!dontFixOpacity){
|
||||
if( opacity >= 1.0){
|
||||
if(h.ie){
|
||||
ds.clearOpacity(node);
|
||||
return;
|
||||
}else{
|
||||
opacity = 0.999999;
|
||||
}
|
||||
}else if( opacity < 0.0){ opacity = 0; }
|
||||
}
|
||||
if(h.ie){
|
||||
if(node.nodeName.toLowerCase() == "tr"){
|
||||
// FIXME: is this too naive? will we get more than we want?
|
||||
var tds = node.getElementsByTagName("td");
|
||||
for(var x=0; x<tds.length; x++){
|
||||
tds[x].style.filter = "Alpha(Opacity="+opacity*100+")";
|
||||
}
|
||||
}
|
||||
node.style.filter = "Alpha(Opacity="+opacity*100+")";
|
||||
}else if(h.moz){
|
||||
node.style.opacity = opacity; // ffox 1.0 directly supports "opacity"
|
||||
node.style.MozOpacity = opacity;
|
||||
}else if(h.safari){
|
||||
node.style.opacity = opacity; // 1.3 directly supports "opacity"
|
||||
node.style.KhtmlOpacity = opacity;
|
||||
}else{
|
||||
node.style.opacity = opacity;
|
||||
}
|
||||
}
|
||||
|
||||
ds.getOpacity = function getOpacity (node){
|
||||
node = dojo.byId(node);
|
||||
if(h.ie){
|
||||
var opac = (node.filters && node.filters.alpha &&
|
||||
typeof node.filters.alpha.opacity == "number"
|
||||
? node.filters.alpha.opacity : 100) / 100;
|
||||
}else{
|
||||
var opac = node.style.opacity || node.style.MozOpacity ||
|
||||
node.style.KhtmlOpacity || 1;
|
||||
}
|
||||
return opac >= 0.999999 ? 1.0 : Number(opac);
|
||||
}
|
||||
|
||||
ds.clearOpacity = function clearOpacity(node){
|
||||
node = dojo.byId(node);
|
||||
var ns = node.style;
|
||||
if(h.ie){
|
||||
try {
|
||||
if( node.filters && node.filters.alpha ){
|
||||
ns.filter = ""; // FIXME: may get rid of other filter effects
|
||||
}
|
||||
} catch(e) {
|
||||
/*
|
||||
* IE7 gives error if node.filters not set;
|
||||
* don't know why or how to workaround (other than this)
|
||||
*/
|
||||
}
|
||||
}else if(h.moz){
|
||||
ns.opacity = 1;
|
||||
ns.MozOpacity = 1;
|
||||
}else if(h.safari){
|
||||
ns.opacity = 1;
|
||||
ns.KhtmlOpacity = 1;
|
||||
}else{
|
||||
ns.opacity = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the given style attributes for the node.
|
||||
* Patch submitted by Wolfram Kriesing, 22/03/2006.
|
||||
*
|
||||
* Ie. dojo.style.setStyleAttributes(myNode, "position:absolute; left:10px; top:10px;")
|
||||
* This just makes it easier to set a style directly without the need to
|
||||
* override it completely (as node.setAttribute() would).
|
||||
* If there is a dojo-method for an attribute, like for "opacity" there
|
||||
* is setOpacity, the dojo method is called instead.
|
||||
* For example: dojo.style.setStyleAttributes(myNode, "opacity: .4");
|
||||
*
|
||||
* Additionally all the dojo.style.set* methods can also be used.
|
||||
* Ie. when attributes contains "outer-height: 10;" it will call dojo.style.setOuterHeight("10");
|
||||
*
|
||||
* @param object The node to set the style attributes for.
|
||||
* @param string Ie. "position:absolute; left:10px; top:10px;"
|
||||
*/
|
||||
ds.setStyleAttributes = function(node, attributes) {
|
||||
var methodMap={
|
||||
"opacity":dojo.style.setOpacity,
|
||||
"content-height":dojo.style.setContentHeight,
|
||||
"content-width":dojo.style.setContentWidth,
|
||||
"outer-height":dojo.style.setOuterHeight,
|
||||
"outer-width":dojo.style.setOuterWidth
|
||||
}
|
||||
|
||||
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*/, "");
|
||||
if(dojo.lang.has(methodMap,name)) {
|
||||
methodMap[name](node,value);
|
||||
} else {
|
||||
node.style[dojo.style.toCamelCase(name)]=value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ds._toggle = function(node, tester, setter){
|
||||
node = dojo.byId(node);
|
||||
setter(node, !tester(node));
|
||||
return tester(node);
|
||||
}
|
||||
|
||||
// show/hide are library constructs
|
||||
|
||||
// show()
|
||||
// if the node.style.display == 'none' then
|
||||
// set style.display to '' or the value cached by hide()
|
||||
ds.show = function(node){
|
||||
node = dojo.byId(node);
|
||||
if(ds.getStyleProperty(node, 'display')=='none'){
|
||||
ds.setStyle(node, 'display', (node.dojoDisplayCache||''));
|
||||
node.dojoDisplayCache = undefined; // cannot use delete on a node in IE6
|
||||
}
|
||||
}
|
||||
|
||||
// if the node.style.display == 'none' then
|
||||
// set style.display to '' or the value cached by hide()
|
||||
ds.hide = function(node){
|
||||
node = dojo.byId(node);
|
||||
if(typeof node["dojoDisplayCache"] == "undefined"){ // it could == '', so we cannot say !node.dojoDisplayCount
|
||||
var d = ds.getStyleProperty(node, 'display')
|
||||
if(d!='none'){
|
||||
node.dojoDisplayCache = d;
|
||||
}
|
||||
}
|
||||
ds.setStyle(node, 'display', 'none');
|
||||
}
|
||||
|
||||
// setShowing() calls show() if showing is true, hide() otherwise
|
||||
ds.setShowing = function(node, showing){
|
||||
ds[(showing ? 'show' : 'hide')](node);
|
||||
}
|
||||
|
||||
// isShowing() is true if the node.style.display is not 'none'
|
||||
// FIXME: returns true if node is bad, isHidden would be easier to make correct
|
||||
ds.isShowing = function(node){
|
||||
return (ds.getStyleProperty(node, 'display') != 'none');
|
||||
}
|
||||
|
||||
// Call setShowing() on node with the complement of isShowing(), then return the new value of isShowing()
|
||||
ds.toggleShowing = function(node){
|
||||
return ds._toggle(node, ds.isShowing, ds.setShowing);
|
||||
}
|
||||
|
||||
// display is a CSS concept
|
||||
|
||||
// Simple mapping of tag names to display values
|
||||
// FIXME: simplistic
|
||||
ds.displayMap = { tr: '', td: '', th: '', img: 'inline', span: 'inline', input: 'inline', button: 'inline' };
|
||||
|
||||
// Suggest a value for the display property that will show 'node' based on it's tag
|
||||
ds.suggestDisplayByTagName = function(node)
|
||||
{
|
||||
node = dojo.byId(node);
|
||||
if(node && node.tagName){
|
||||
var tag = node.tagName.toLowerCase();
|
||||
return (tag in ds.displayMap ? ds.displayMap[tag] : 'block');
|
||||
}
|
||||
}
|
||||
|
||||
// setDisplay() sets the value of style.display to value of 'display' parameter if it is a string.
|
||||
// Otherwise, if 'display' is false, set style.display to 'none'.
|
||||
// Finally, set 'display' to a suggested display value based on the node's tag
|
||||
ds.setDisplay = function(node, display){
|
||||
ds.setStyle(node, 'display', (dojo.lang.isString(display) ? display : (display ? ds.suggestDisplayByTagName(node) : 'none')));
|
||||
}
|
||||
|
||||
// isDisplayed() is true if the the computed display style for node is not 'none'
|
||||
// FIXME: returns true if node is bad, isNotDisplayed would be easier to make correct
|
||||
ds.isDisplayed = function(node){
|
||||
return (ds.getComputedStyle(node, 'display') != 'none');
|
||||
}
|
||||
|
||||
// Call setDisplay() on node with the complement of isDisplayed(), then
|
||||
// return the new value of isDisplayed()
|
||||
ds.toggleDisplay = function(node){
|
||||
return ds._toggle(node, ds.isDisplayed, ds.setDisplay);
|
||||
}
|
||||
|
||||
// visibility is a CSS concept
|
||||
|
||||
// setVisibility() sets the value of style.visibility to value of
|
||||
// 'visibility' parameter if it is a string.
|
||||
// Otherwise, if 'visibility' is false, set style.visibility to 'hidden'.
|
||||
// Finally, set style.visibility to 'visible'.
|
||||
ds.setVisibility = function(node, visibility){
|
||||
ds.setStyle(node, 'visibility', (dojo.lang.isString(visibility) ? visibility : (visibility ? 'visible' : 'hidden')));
|
||||
}
|
||||
|
||||
// isVisible() is true if the the computed visibility style for node is not 'hidden'
|
||||
// FIXME: returns true if node is bad, isInvisible would be easier to make correct
|
||||
ds.isVisible = function(node){
|
||||
return (ds.getComputedStyle(node, 'visibility') != 'hidden');
|
||||
}
|
||||
|
||||
// Call setVisibility() on node with the complement of isVisible(), then
|
||||
// return the new value of isVisible()
|
||||
ds.toggleVisibility = function(node){
|
||||
return ds._toggle(node, ds.isVisible, ds.setVisibility);
|
||||
}
|
||||
|
||||
// in: coordinate array [x,y,w,h] or dom node
|
||||
// return: coordinate array
|
||||
ds.toCoordinateArray = function(coords, includeScroll) {
|
||||
if(dojo.lang.isArray(coords)){
|
||||
// coords is already an array (of format [x,y,w,h]), just return it
|
||||
while ( coords.length < 4 ) { coords.push(0); }
|
||||
while ( coords.length > 4 ) { coords.pop(); }
|
||||
var ret = coords;
|
||||
} else {
|
||||
// coords is an dom object (or dom object id); return it's coordinates
|
||||
var node = dojo.byId(coords);
|
||||
var pos = ds.getAbsolutePosition(node, includeScroll);
|
||||
var ret = [
|
||||
pos.x,
|
||||
pos.y,
|
||||
ds.getBorderBoxWidth(node),
|
||||
ds.getBorderBoxHeight(node)
|
||||
];
|
||||
}
|
||||
ret.x = ret[0];
|
||||
ret.y = ret[1];
|
||||
ret.w = ret[2];
|
||||
ret.h = ret[3];
|
||||
return ret;
|
||||
};
|
||||
})();
|
Loading…
Add table
Add a link
Reference in a new issue