2 Copyright (c) 2010, Yahoo! Inc. All rights reserved.
3 Code licensed under the BSD License:
4 http://developer.yahoo.com/yui/license.html
8 YUI.add('node-screen', function(Y) {
11 * Extended Node interface for managing regions and screen positioning.
12 * Adds support for positioning elements and normalizes window size and scroll detection.
14 * @submodule node-screen
17 // these are all "safe" returns, no wrapping required
20 * Returns the inner width of the viewport (exludes scrollbar).
28 * Returns the inner height of the viewport (exludes scrollbar).
49 * Amount page has been scroll vertically
56 * Amount page has been scroll horizontally
63 Y.Node.ATTRS[name] = {
65 var args = Array.prototype.slice.call(arguments);
66 args.unshift(Y.Node.getDOMNode(this));
68 return Y.DOM[name].apply(this, args);
74 Y.Node.ATTRS.scrollLeft = {
76 var node = Y.Node.getDOMNode(this);
77 return ('scrollLeft' in node) ? node.scrollLeft : Y.DOM.docScrollX(node);
80 setter: function(val) {
81 var node = Y.Node.getDOMNode(this);
83 if ('scrollLeft' in node) {
84 node.scrollLeft = val;
85 } else if (node.document || node.nodeType === 9) {
86 Y.DOM._getWin(node).scrollTo(val, Y.DOM.docScrollY(node)); // scroll window if win or doc
93 Y.Node.ATTRS.scrollTop = {
95 var node = Y.Node.getDOMNode(this);
96 return ('scrollTop' in node) ? node.scrollTop : Y.DOM.docScrollY(node);
99 setter: function(val) {
100 var node = Y.Node.getDOMNode(this);
102 if ('scrollTop' in node) {
103 node.scrollTop = val;
104 } else if (node.document || node.nodeType === 9) {
105 Y.DOM._getWin(node).scrollTo(Y.DOM.docScrollX(node), val); // scroll window if win or doc
112 Y.Node.importMethod(Y.DOM, [
114 * Gets the current position of the node in page coordinates.
117 * @return {Array} The XY position of the node
122 * Set the position of the node in page coordinates, regardless of how the node is positioned.
124 * @param {Array} xy Contains X & Y values for new position (coordinates are page-based)
130 * Gets the current position of the node in page coordinates.
132 * @return {Int} The X position of the node
137 * Set the position of the node in page coordinates, regardless of how the node is positioned.
139 * @param {Int} x X value for new position (coordinates are page-based)
145 * Gets the current position of the node in page coordinates.
147 * @return {Int} The Y position of the node
152 * Set the position of the node in page coordinates, regardless of how the node is positioned.
154 * @param {Int} y Y value for new position (coordinates are page-based)
160 * Swaps the XY position of this node with another node.
162 * @param {Y.Node || HTMLElement} otherNode The node to swap with.
169 * Returns a region object for the node
174 Y.Node.ATTRS.region = {
176 var node = Y.Node.getDOMNode(this),
179 if (node && !node.tagName) {
180 if (node.nodeType === 9) { // document
181 node = node.documentElement;
185 region = Y.DOM.viewportRegion(node);
187 region = Y.DOM.region(node);
194 * Returns a region object for the node's viewport
195 * @config viewportRegion
198 Y.Node.ATTRS.viewportRegion = {
200 return Y.DOM.viewportRegion(Y.Node.getDOMNode(this));
204 Y.Node.importMethod(Y.DOM, 'inViewportRegion');
206 // these need special treatment to extract 2nd node arg
208 * Compares the intersection of the node with another node or region
211 * @param {Node|Object} node2 The node or region to compare with.
212 * @param {Object} altRegion An alternate region to use (rather than this node's).
213 * @return {Object} An object representing the intersection of the regions.
215 Y.Node.prototype.intersect = function(node2, altRegion) {
216 var node1 = Y.Node.getDOMNode(this);
217 if (Y.instanceOf(node2, Y.Node)) { // might be a region object
218 node2 = Y.Node.getDOMNode(node2);
220 return Y.DOM.intersect(node1, node2, altRegion);
224 * Determines whether or not the node is within the giving region.
226 * @param {Node|Object} node2 The node or region to compare with.
227 * @param {Boolean} all Whether or not all of the node must be in the region.
228 * @param {Object} altRegion An alternate region to use (rather than this node's).
229 * @return {Object} An object representing the intersection of the regions.
231 Y.Node.prototype.inRegion = function(node2, all, altRegion) {
232 var node1 = Y.Node.getDOMNode(this);
233 if (Y.instanceOf(node2, Y.Node)) { // might be a region object
234 node2 = Y.Node.getDOMNode(node2);
236 return Y.DOM.inRegion(node1, node2, all, altRegion);
240 }, '3.3.0' ,{requires:['dom-screen']});