Rev 1422 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified BSD license. For more information on Dojo licensing, see:http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.html.style");dojo.require("dojo.html.common");dojo.require("dojo.uri.Uri");dojo.html.getClass = function (node) {node = dojo.byId(node);if (!node) {return "";}var cs = "";if (node.className) {cs = node.className;} else {if (dojo.html.hasAttribute(node, "class")) {cs = dojo.html.getAttribute(node, "class");}}return cs.replace(/^\s+|\s+$/g, "");};dojo.html.getClasses = function (node) {var c = dojo.html.getClass(node);return (c == "") ? [] : c.split(/\s+/g);};dojo.html.hasClass = function (node, classname) {return (new RegExp("(^|\\s+)" + classname + "(\\s+|$)")).test(dojo.html.getClass(node));};dojo.html.prependClass = function (node, classStr) {classStr += " " + dojo.html.getClass(node);return dojo.html.setClass(node, classStr);};dojo.html.addClass = function (node, classStr) {if (dojo.html.hasClass(node, classStr)) {return false;}classStr = (dojo.html.getClass(node) + " " + classStr).replace(/^\s+|\s+$/g, "");return dojo.html.setClass(node, classStr);};dojo.html.setClass = function (node, classStr) {node = dojo.byId(node);var cs = new String(classStr);try {if (typeof node.className == "string") {node.className = cs;} else {if (node.setAttribute) {node.setAttribute("class", classStr);node.className = cs;} else {return false;}}}catch (e) {dojo.debug("dojo.html.setClass() failed", e);}return true;};dojo.html.removeClass = function (node, classStr, allowPartialMatches) {try {if (!allowPartialMatches) {var newcs = dojo.html.getClass(node).replace(new RegExp("(^|\\s+)" + classStr + "(\\s+|$)"), "$1$2");} else {var newcs = dojo.html.getClass(node).replace(classStr, "");}dojo.html.setClass(node, newcs);}catch (e) {dojo.debug("dojo.html.removeClass() failed", e);}return true;};dojo.html.replaceClass = function (node, newClass, oldClass) {dojo.html.removeClass(node, oldClass);dojo.html.addClass(node, newClass);};dojo.html.classMatchType = {ContainsAll:0, ContainsAny:1, IsOnly:2};dojo.html.getElementsByClass = function (classStr, parent, nodeType, classMatchType, useNonXpath) {useNonXpath = false;var _document = dojo.doc();parent = dojo.byId(parent) || _document;var classes = classStr.split(/\s+/g);var nodes = [];if (classMatchType != 1 && classMatchType != 2) {classMatchType = 0;}var reClass = new RegExp("(\\s|^)((" + classes.join(")|(") + "))(\\s|$)");var srtLength = classes.join(" ").length;var candidateNodes = [];if (!useNonXpath && _document.evaluate) {var xpath = ".//" + (nodeType || "*") + "[contains(";if (classMatchType != dojo.html.classMatchType.ContainsAny) {xpath += "concat(' ',@class,' '), ' " + classes.join(" ') and contains(concat(' ',@class,' '), ' ") + " ')";if (classMatchType == 2) {xpath += " and string-length(@class)=" + srtLength + "]";} else {xpath += "]";}} else {xpath += "concat(' ',@class,' '), ' " + classes.join(" ') or contains(concat(' ',@class,' '), ' ") + " ')]";}var xpathResult = _document.evaluate(xpath, parent, null, XPathResult.ANY_TYPE, null);var result = xpathResult.iterateNext();while (result) {try {candidateNodes.push(result);result = xpathResult.iterateNext();}catch (e) {break;}}return candidateNodes;} else {if (!nodeType) {nodeType = "*";}candidateNodes = parent.getElementsByTagName(nodeType);var node, i = 0;outer:while (node = candidateNodes[i++]) {var nodeClasses = dojo.html.getClasses(node);if (nodeClasses.length == 0) {continue outer;}var matches = 0;for (var j = 0; j < nodeClasses.length; j++) {if (reClass.test(nodeClasses[j])) {if (classMatchType == dojo.html.classMatchType.ContainsAny) {nodes.push(node);continue outer;} else {matches++;}} else {if (classMatchType == dojo.html.classMatchType.IsOnly) {continue outer;}}}if (matches == classes.length) {if ((classMatchType == dojo.html.classMatchType.IsOnly) && (matches == nodeClasses.length)) {nodes.push(node);} else {if (classMatchType == dojo.html.classMatchType.ContainsAll) {nodes.push(node);}}}}return nodes;}};dojo.html.getElementsByClassName = dojo.html.getElementsByClass;dojo.html.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;};dojo.html.toSelectorCase = function (selector) {return selector.replace(/([A-Z])/g, "-$1").toLowerCase();};if (dojo.render.html.ie) {dojo.html.getComputedStyle = function (node, property, value) {node = dojo.byId(node);if (!node || !node.currentStyle) {return value;}return node.currentStyle[dojo.html.toCamelCase(property)];};dojo.html.getComputedStyles = function (node) {return node.currentStyle;};} else {dojo.html.getComputedStyle = function (node, property, value) {node = dojo.byId(node);if (!node || !node.style) {return value;}var s = document.defaultView.getComputedStyle(node, null);return (s && s[dojo.html.toCamelCase(property)]) || "";};dojo.html.getComputedStyles = function (node) {return document.defaultView.getComputedStyle(node, null);};}dojo.html.getStyleProperty = function (node, cssSelector) {node = dojo.byId(node);return (node && node.style ? node.style[dojo.html.toCamelCase(cssSelector)] : undefined);};dojo.html.getStyle = function (node, cssSelector) {var value = dojo.html.getStyleProperty(node, cssSelector);return (value ? value : dojo.html.getComputedStyle(node, cssSelector));};dojo.html.setStyle = function (node, cssSelector, value) {node = dojo.byId(node);if (node && node.style) {var camelCased = dojo.html.toCamelCase(cssSelector);node.style[camelCased] = value;}};dojo.html.setStyleText = function (target, text) {try {target.style.cssText = text;}catch (e) {target.setAttribute("style", text);}};dojo.html.copyStyle = function (target, source) {if (!source.style.cssText) {target.setAttribute("style", source.getAttribute("style"));} else {target.style.cssText = source.style.cssText;}dojo.html.addClass(target, dojo.html.getClass(source));};dojo.html.getUnitValue = function (node, cssSelector, autoIsZero) {var s = dojo.html.getComputedStyle(node, cssSelector);if ((!s) || ((s == "auto") && (autoIsZero))) {return {value:0, units:"px"};}var match = s.match(/(\-?[\d.]+)([a-z%]*)/i);if (!match) {return dojo.html.getUnitValue.bad;}return {value:Number(match[1]), units:match[2].toLowerCase()};};dojo.html.getUnitValue.bad = {value:NaN, units:""};if (dojo.render.html.ie) {dojo.html.toPixelValue = function (element, styleValue) {if (!styleValue) {return 0;}if (styleValue.slice(-2) == "px") {return parseFloat(styleValue);}var pixelValue = 0;with (element) {var sLeft = style.left;var rsLeft = runtimeStyle.left;runtimeStyle.left = currentStyle.left;try {style.left = styleValue || 0;pixelValue = style.pixelLeft;style.left = sLeft;runtimeStyle.left = rsLeft;}catch (e) {}}return pixelValue;};} else {dojo.html.toPixelValue = function (element, styleValue) {return (styleValue && (styleValue.slice(-2) == "px") ? parseFloat(styleValue) : 0);};}dojo.html.getPixelValue = function (node, styleProperty, autoIsZero) {return dojo.html.toPixelValue(node, dojo.html.getComputedStyle(node, styleProperty));};dojo.html.setPositivePixelValue = function (node, selector, value) {if (isNaN(value)) {return false;}node.style[selector] = Math.max(0, value) + "px";return true;};dojo.html.styleSheet = null;dojo.html.insertCssRule = function (selector, declaration, index) {if (!dojo.html.styleSheet) {if (document.createStyleSheet) {dojo.html.styleSheet = document.createStyleSheet();} else {if (document.styleSheets[0]) {dojo.html.styleSheet = document.styleSheets[0];} else {return null;}}}if (arguments.length < 3) {if (dojo.html.styleSheet.cssRules) {index = dojo.html.styleSheet.cssRules.length;} else {if (dojo.html.styleSheet.rules) {index = dojo.html.styleSheet.rules.length;} else {return null;}}}if (dojo.html.styleSheet.insertRule) {var rule = selector + " { " + declaration + " }";return dojo.html.styleSheet.insertRule(rule, index);} else {if (dojo.html.styleSheet.addRule) {return dojo.html.styleSheet.addRule(selector, declaration, index);} else {return null;}}};dojo.html.removeCssRule = function (index) {if (!dojo.html.styleSheet) {dojo.debug("no stylesheet defined for removing rules");return false;}if (dojo.render.html.ie) {if (!index) {index = dojo.html.styleSheet.rules.length;dojo.html.styleSheet.removeRule(index);}} else {if (document.styleSheets[0]) {if (!index) {index = dojo.html.styleSheet.cssRules.length;}dojo.html.styleSheet.deleteRule(index);}}return true;};dojo.html._insertedCssFiles = [];dojo.html.insertCssFile = function (URI, doc, checkDuplicates, fail_ok) {if (!URI) {return;}if (!doc) {doc = document;}var cssStr = dojo.hostenv.getText(URI, false, fail_ok);if (cssStr === null) {return;}cssStr = dojo.html.fixPathsInCssText(cssStr, URI);if (checkDuplicates) {var idx = -1, node, ent = dojo.html._insertedCssFiles;for (var i = 0; i < ent.length; i++) {if ((ent[i].doc == doc) && (ent[i].cssText == cssStr)) {idx = i;node = ent[i].nodeRef;break;}}if (node) {var styles = doc.getElementsByTagName("style");for (var i = 0; i < styles.length; i++) {if (styles[i] == node) {return;}}dojo.html._insertedCssFiles.shift(idx, 1);}}var style = dojo.html.insertCssText(cssStr, doc);dojo.html._insertedCssFiles.push({"doc":doc, "cssText":cssStr, "nodeRef":style});if (style && djConfig.isDebug) {style.setAttribute("dbgHref", URI);}return style;};dojo.html.insertCssText = function (cssStr, doc, URI) {if (!cssStr) {return;}if (!doc) {doc = document;}if (URI) {cssStr = dojo.html.fixPathsInCssText(cssStr, URI);}var style = doc.createElement("style");style.setAttribute("type", "text/css");var head = doc.getElementsByTagName("head")[0];if (!head) {dojo.debug("No head tag in document, aborting styles");return;} else {head.appendChild(style);}if (style.styleSheet) {var setFunc = function () {try {style.styleSheet.cssText = cssStr;}catch (e) {dojo.debug(e);}};if (style.styleSheet.disabled) {setTimeout(setFunc, 10);} else {setFunc();}} else {var cssText = doc.createTextNode(cssStr);style.appendChild(cssText);}return style;};dojo.html.fixPathsInCssText = function (cssStr, URI) {if (!cssStr || !URI) {return;}var match, str = "", url = "", urlChrs = "[\\t\\s\\w\\(\\)\\/\\.\\\\'\"-:#=&?~]+";var regex = new RegExp("url\\(\\s*(" + urlChrs + ")\\s*\\)");var regexProtocol = /(file|https?|ftps?):\/\//;regexTrim = new RegExp("^[\\s]*(['\"]?)(" + urlChrs + ")\\1[\\s]*?$");if (dojo.render.html.ie55 || dojo.render.html.ie60) {var regexIe = new RegExp("AlphaImageLoader\\((.*)src=['\"](" + urlChrs + ")['\"]");while (match = regexIe.exec(cssStr)) {url = match[2].replace(regexTrim, "$2");if (!regexProtocol.exec(url)) {url = (new dojo.uri.Uri(URI, url).toString());}str += cssStr.substring(0, match.index) + "AlphaImageLoader(" + match[1] + "src='" + url + "'";cssStr = cssStr.substr(match.index + match[0].length);}cssStr = str + cssStr;str = "";}while (match = regex.exec(cssStr)) {url = match[1].replace(regexTrim, "$2");if (!regexProtocol.exec(url)) {url = (new dojo.uri.Uri(URI, url).toString());}str += cssStr.substring(0, match.index) + "url(" + url + ")";cssStr = cssStr.substr(match.index + match[0].length);}return str + cssStr;};dojo.html.setActiveStyleSheet = function (title) {var i = 0, a, els = dojo.doc().getElementsByTagName("link");while (a = els[i++]) {if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {a.disabled = true;if (a.getAttribute("title") == title) {a.disabled = false;}}}};dojo.html.getActiveStyleSheet = function () {var i = 0, a, els = dojo.doc().getElementsByTagName("link");while (a = els[i++]) {if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) {return a.getAttribute("title");}}return null;};dojo.html.getPreferredStyleSheet = function () {var i = 0, a, els = dojo.doc().getElementsByTagName("link");while (a = els[i++]) {if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("rel").indexOf("alt") == -1 && a.getAttribute("title")) {return a.getAttribute("title");}}return null;};dojo.html.applyBrowserClass = function (node) {var drh = dojo.render.html;var classes = {dj_ie:drh.ie, dj_ie55:drh.ie55, dj_ie6:drh.ie60, dj_ie7:drh.ie70, dj_iequirks:drh.ie && drh.quirks, dj_opera:drh.opera, dj_opera8:drh.opera && (Math.floor(dojo.render.version) == 8), dj_opera9:drh.opera && (Math.floor(dojo.render.version) == 9), dj_khtml:drh.khtml, dj_safari:drh.safari, dj_gecko:drh.mozilla};for (var p in classes) {if (classes[p]) {dojo.html.addClass(node, p);}}};