blob: 1bfb125cc65483239a8c1bb348b79b70103b4920 [file] [log] [blame]
/*
* xbStyle.js
* $Revision$ $Date$
*/
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Netscape code.
*
* The Initial Developer of the Original Code is
* Netscape Corporation.
* Portions created by the Initial Developer are Copyright (C) 2001
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Bob Clary <bclary@netscape.com>
*
* ***** END LICENSE BLOCK ***** */
function xbStyleNotSupported() {}
function xbStyleNotSupportStringValue(propname) { xbDEBUG.dump(propname + ' is not supported in this browser'); return '';};
/////////////////////////////////////////////////////////////
// xbClipRect
function xbClipRect(a1, a2, a3, a4)
{
this.top = 0;
this.right = 0;
this.bottom = 0;
this.left = 0;
if (typeof(a1) == 'string')
{
var val;
var ca;
var i;
if (a1.indexOf('rect(') == 0)
{
// I would have preferred [0-9]+[a-zA-Z]+ for a regexp
// but NN4 returns null for that.
ca = a1.substring(5, a1.length-1).match(/-?[0-9a-zA-Z]+/g);
for (i = 0; i < 4; ++i)
{
val = xbToInt(ca[i]);
if (val != 0 && ca[i].indexOf('px') == -1)
{
xbDEBUG.dump('xbClipRect: A clipping region ' + a1 + ' was detected that did not use pixels as units. Click Ok to continue, Cancel to Abort');
return;
}
ca[i] = val;
}
this.top = ca[0];
this.right = ca[1];
this.bottom = ca[2];
this.left = ca[3];
}
}
else if (typeof(a1) == 'number' && typeof(a2) == 'number' && typeof(a3) == 'number' && typeof(a4) == 'number')
{
this.top = a1;
this.right = a2;
this.bottom = a3;
this.left = a4;
}
}
xbClipRect.prototype.top = 0;
xbClipRect.prototype.right = 0;
xbClipRect.prototype.bottom = 0;
xbClipRect.prototype.left = 0;
function xbClipRectGetWidth()
{
return this.right - this.left;
}
xbClipRect.prototype.getWidth = xbClipRectGetWidth;
function xbClipRectSetWidth(width)
{
this.right = this.left + width;
}
xbClipRect.prototype.setWidth = xbClipRectSetWidth;
function xbClipRectGetHeight()
{
return this.bottom - this.top;
}
xbClipRect.prototype.getHeight = xbClipRectGetHeight;
function xbClipRectSetHeight(height)
{
this.bottom = this.top + height;
}
xbClipRect.prototype.setHeight = xbClipRectSetHeight;
function xbClipRectToString()
{
return 'rect(' + this.top + 'px ' + this.right + 'px ' + this.bottom + 'px ' + this.left + 'px )' ;
}
xbClipRect.prototype.toString = xbClipRectToString;
/////////////////////////////////////////////////////////////
// xbStyle
//
// Note Opera violates the standard by cascading the effective values
// into the HTMLElement.style object. We can use IE's HTMLElement.currentStyle
// to get the effective values. In Gecko we will use the W3 DOM Style Standard getComputedStyle
function xbStyle(obj, win, position)
{
if (typeof(obj) == 'object' && typeof(obj.style) != 'undefined')
this.styleObj = obj.style;
else if (document.layers) // NN4
{
if (typeof(position) == 'undefined')
position = '';
this.styleObj = obj;
this.styleObj.position = position;
}
this.object = obj;
this.window = win ? win : window;
}
xbStyle.prototype.styleObj = null;
xbStyle.prototype.object = null;
/////////////////////////////////////////////////////////////
// xbStyle.getEffectiveValue()
// note that xbStyle's constructor uses the currentStyle object
// for IE5+ and that Opera's style object contains computed values
// already. Netscape Navigator's layer object also contains the
// computed values as well. Note that IE4 will not return the
// computed values.
function xbStyleGetEffectiveValue(propname)
{
var value = null;
if (this.window.document.defaultView && this.window.document.defaultView.getComputedStyle)
{
// W3
// Note that propname is the name of the property in the CSS Style
// Object. However the W3 method getPropertyValue takes the actual
// property name from the CSS Style rule, i.e., propname is
// 'backgroundColor' but getPropertyValue expects 'background-color'.
var capIndex;
var cappropname = propname;
while ( (capIndex = cappropname.search(/[A-Z]/)) != -1)
{
if (capIndex != -1)
{
cappropname = cappropname.substring(0, capIndex) + '-' + cappropname.substring(capIndex, capIndex+1).toLowerCase() + cappropname.substr(capIndex+1);
}
}
value = this.window.document.defaultView.getComputedStyle(this.object, '').getPropertyValue(cappropname);
// xxxHack for Gecko:
if (!value && this.styleObj[propname])
{
value = this.styleObj[propname];
}
}
else if (typeof(this.styleObj[propname]) == 'undefined')
{
value = xbStyleNotSupportStringValue(propname);
}
else if (typeof(this.object.currentStyle) != 'undefined')
{
// IE5+
value = this.object.currentStyle[propname];
if (!value)
{
value = this.styleObj[propname];
}
if (propname == 'clip' && !value)
{
// clip is not stored in IE5/6 handle separately
value = 'rect(' + this.object.currentStyle.clipTop + ', ' + this.object.currentStyle.clipRight + ', ' + this.object.currentStyle.clipBottom + ', ' + this.object.currentStyle.clipLeft + ')';
}
}
else
{
// IE4+, Opera, NN4
value = this.styleObj[propname];
}
return value;
}
/////////////////////////////////////////////////////////////////////////////
// xbStyle.moveAbove()
function xbStyleMoveAbove(cont)
{
this.setzIndex(cont.getzIndex()+1);
}
/////////////////////////////////////////////////////////////////////////////
// xbStyle.moveBelow()
function xbStyleMoveBelow(cont)
{
var zindex = cont.getzIndex() - 1;
this.setzIndex(zindex);
}
/////////////////////////////////////////////////////////////////////////////
// xbStyle.moveBy()
function xbStyleMoveBy(deltaX, deltaY)
{
this.moveTo(this.getLeft() + deltaX, this.getTop() + deltaY);
}
/////////////////////////////////////////////////////////////////////////////
// xbStyle.moveTo()
function xbStyleMoveTo(x, y)
{
this.setLeft(x);
this.setTop(y);
}
/////////////////////////////////////////////////////////////////////////////
// xbStyle.moveToAbsolute()
function xbStyleMoveToAbsolute(x, y)
{
this.setPageX(x);
this.setPageY(y);
}
/////////////////////////////////////////////////////////////////////////////
// xbStyle.resizeBy()
function xbStyleResizeBy(deltaX, deltaY)
{
this.setWidth( this.getWidth() + deltaX );
this.setHeight( this.getHeight() + deltaY );
}
/////////////////////////////////////////////////////////////////////////////
// xbStyle.resizeTo()
function xbStyleResizeTo(x, y)
{
this.setWidth(x);
this.setHeight(y);
}
////////////////////////////////////////////////////////////////////////
xbStyle.prototype.getEffectiveValue = xbStyleGetEffectiveValue;
xbStyle.prototype.moveAbove = xbStyleMoveAbove;
xbStyle.prototype.moveBelow = xbStyleMoveBelow;
xbStyle.prototype.moveBy = xbStyleMoveBy;
xbStyle.prototype.moveTo = xbStyleMoveTo;
xbStyle.prototype.moveToAbsolute = xbStyleMoveToAbsolute;
xbStyle.prototype.resizeBy = xbStyleResizeBy;
xbStyle.prototype.resizeTo = xbStyleResizeTo;
if (document.all || document.getElementsByName)
{
xblibrary.loadScript('xbStyle-css.js');
}
else if (document.layers)
{
xblibrary.loadScript('xbStyle-nn4.js');
}
else
{
xblibrary.loadScript('xbStyle-not-supported.js');
}