@qooxdoo/framework
Version:
The JS Framework for Coders
176 lines (150 loc) • 5.94 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2008 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Fabian Jakobs (fjakobs)
* Sebastian Werner (wpbasti)
************************************************************************ */
/**
* The background class contains methods to compute and set the background image
* of a DOM element.
*
* It fixes a background position issue in Firefox 2.
*/
qx.Class.define("qx.bom.element.Background",
{
statics :
{
/** @type {Array} Internal helper to improve compile performance */
__tmpl :
[
"background-image:url(", null, ");",
"background-position:", null, ";",
"background-repeat:", null, ";"
],
/** @type {Map} Empty styles when no image is given */
__emptyStyles :
{
backgroundImage : null,
backgroundPosition : null,
backgroundRepeat : null
},
/**
* Computes the background position CSS value
*
* @param left {Integer|String} either an integer pixel value or a CSS
* string value
* @param top {Integer|String} either an integer pixel value or a CSS
* string value
* @return {String} The background position CSS value
*/
__computePosition : function(left, top)
{
// Correcting buggy Firefox background-position implementation
// Have problems with identical values
var engine = qx.core.Environment.get("engine.name");
var version = qx.core.Environment.get("engine.version");
if (engine == "gecko" && version < 1.9 && left == top && typeof left == "number") {
top += 0.01;
}
if (left) {
var leftCss = (typeof left == "number") ? left + "px" : left;
} else {
leftCss = "0";
}
if (top) {
var topCss = (typeof top == "number") ? top + "px" : top;
} else {
topCss = "0";
}
return leftCss + " " + topCss;
},
/**
* Compiles the background into a CSS compatible string.
*
* @param source {String?null} The URL of the background image
* @param repeat {String?null} The background repeat property. valid values
* are <code>repeat</code>, <code>repeat-x</code>,
* <code>repeat-y</code>, <code>no-repeat</code>
* @param left {Integer|String?null} The horizontal offset of the image
* inside of the image element. If the value is an integer it is
* interpreted as pixel value otherwise the value is taken as CSS value.
* CSS the values are "center", "left" and "right"
* @param top {Integer|String?null} The vertical offset of the image
* inside of the image element. If the value is an integer it is
* interpreted as pixel value otherwise the value is taken as CSS value.
* CSS the values are "top", "bottom" and "center"
* @return {String} CSS string
*/
compile : function(source, repeat, left, top)
{
var position = this.__computePosition(left, top);
var backgroundImageUrl = qx.util.ResourceManager.getInstance().toUri(source);
// Updating template
var tmpl = this.__tmpl;
tmpl[1] = "'" + backgroundImageUrl + "'"; // Put in quotes so spaces work
tmpl[4] = position;
tmpl[7] = repeat;
return tmpl.join("");
},
/**
* Get standard css background styles
*
* @param source {String} The URL of the background image
* @param repeat {String?null} The background repeat property. valid values
* are <code>repeat</code>, <code>repeat-x</code>,
* <code>repeat-y</code>, <code>no-repeat</code>
* @param left {Integer|String?null} The horizontal offset of the image
* inside of the image element. If the value is an integer it is
* interpreted as pixel value otherwise the value is taken as CSS value.
* CSS the values are "center", "left" and "right"
* @param top {Integer|String?null} The vertical offset of the image
* inside of the image element. If the value is an integer it is
* interpreted as pixel value otherwise the value is taken as CSS value.
* CSS the values are "top", "bottom" and "center"
* @return {Map} A map of CSS styles
*/
getStyles : function(source, repeat, left, top)
{
if (!source) {
return this.__emptyStyles;
}
var position = this.__computePosition(left, top);
var backgroundImageUrl = qx.util.ResourceManager.getInstance().toUri(source);
var backgroundImageCssString = "url('" + backgroundImageUrl + "')"; // Put in quotes so spaces work
var map = {
backgroundPosition : position,
backgroundImage : backgroundImageCssString
};
if (repeat != null) {
map.backgroundRepeat = repeat;
}
return map;
},
/**
* Set the background on the given DOM element
*
* @param element {Element} The element to modify
* @param source {String?null} The URL of the background image
* @param repeat {String?null} The background repeat property. valid values
* are <code>repeat</code>, <code>repeat-x</code>,
* <code>repeat-y</code>, <code>no-repeat</code>
* @param left {Integer?null} The horizontal offset of the image inside of
* the image element.
* @param top {Integer?null} The vertical offset of the image inside of
* the image element.
*/
set : function(element, source, repeat, left, top)
{
var styles = this.getStyles(source, repeat, left, top);
for (var prop in styles) {
element.style[prop] = styles[prop];
}
}
}
});