YAHOO.util.Dom = function() {
    var ua = navigator.userAgent.toLowerCase();
    var isOpera = (ua.indexOf('opera') != -1);
    var isIE = (ua.indexOf('msie') != -1 && !isOpera);
    var id_counter = 0;
    return { get: function(el) {
        if (typeof el != 'string' && !(el instanceof Array))
        { return el; }
        if (typeof el == 'string')
        { return document.getElementById(el); }
        else {
            var collection = [];
            for (var i = 0, len = el.length; i < len; ++i) {
                collection[collection.length] = this.get(el[i]);
            }
            return collection;
        } return null;
    }
            , getStyle: function(el, property) {
                var f = function(el) {
                    var value = null;
                    var dv = document.defaultView;
                    if (property == 'opacity' && el.filters) {
                        value = 1;
                        try {
                            value = el.filters.item('DXImageTransform.Microsoft.Alpha').opacity / 100;
                        }
                        catch (e) {
                            try {
                                value = el.filters.item('alpha').opacity / 100;
                            }
                            catch (e) {
                            }
                        }
                    }
                    else
                        if (el.style[property]) {
                        value = el.style[property];
                    }
                    else
                        if (el.currentStyle && el.currentStyle[property]) {
                        value = el.currentStyle[property];
                    }
                    else if (dv && dv.getComputedStyle) {
                        var converted = '';
                        for (var i = 0, len = property.length; i < len; ++i) {
                            if (property.charAt(i) == property.charAt(i).toUpperCase()) {
                                converted = converted + '-' + property.charAt(i).toLowerCase();
                            }
                            else {
                                converted = converted + property.charAt(i);
                            }
                        }
                        if (dv.getComputedStyle(el, '') && dv.getComputedStyle(el, '').getPropertyValue(converted)) {
                            value = dv.getComputedStyle(el, '').getPropertyValue(converted);
                        }
                    }
                    return value;
                };
                return this.batch(el, f, this, true);
            }
            , setStyle: function(el, property, val) {
                var f = function(el) {
                    switch (property) {
                        case 'opacity':
                            if (isIE && typeof el.style.filter == 'string') {
                                el.style.filter = 'alpha(opacity=' + val * 100 + ')';
                                if (!el.currentStyle || !el.currentStyle.hasLayout) {
                                    el.style.zoom = 1;
                                }
                            }
                            else {
                                el.style.opacity = val; el.style['-moz-opacity'] = val; el.style['-khtml-opacity'] = val;
                            }
                            break;
                        default:
                            el.style[property] = val;
                    }
                }
            ;
                this.batch(el, f, this, true);
            }
            , getXY: function(el) {
                var f = function(el) {
                    if (el.parentNode === null || this.getStyle(el, 'display') == 'none') { return false; } var parent = null; var pos = []; var box; if (el.getBoundingClientRect) { box = el.getBoundingClientRect(); var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft); return [box.left + scrollLeft, box.top + scrollTop]; } else if (document.getBoxObjectFor) { box = document.getBoxObjectFor(el); var borderLeft = parseInt(this.getStyle(el, 'borderLeftWidth')); var borderTop = parseInt(this.getStyle(el, 'borderTopWidth')); pos = [box.x - borderLeft, box.y - borderTop]; } else { pos = [el.offsetLeft, el.offsetTop]; parent = el.offsetParent; if (parent != el) { while (parent) { pos[0] += parent.offsetLeft; pos[1] += parent.offsetTop; parent = parent.offsetParent; } } if (ua.indexOf('opera') != -1 || (ua.indexOf('safari') != -1 && this.getStyle(el, 'position') == 'absolute')) { pos[0] -= document.body.offsetLeft; pos[1] -= document.body.offsetTop; } } if (el.parentNode) { parent = el.parentNode; } else { parent = null; } while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML') { pos[0] -= parent.scrollLeft; pos[1] -= parent.scrollTop; if (parent.parentNode) { parent = parent.parentNode; } else { parent = null; } } return pos;
                }; return this.batch(el, f, this, true);
            }, getX: function(el) { return this.getXY(el)[0]; }, getY: function(el) { return this.getXY(el)[1]; }, setXY: function(el, pos, noRetry) { var f = function(el) { var style_pos = this.getStyle(el, 'position'); if (style_pos == 'static') { this.setStyle(el, 'position', 'relative'); style_pos = 'relative'; } var pageXY = YAHOO.util.Dom.getXY(el); if (pageXY === false) { return false; } var delta = [parseInt(YAHOO.util.Dom.getStyle(el, 'left'), 10), parseInt(YAHOO.util.Dom.getStyle(el, 'top'), 10)]; if (isNaN(delta[0])) { delta[0] = (style_pos == 'relative') ? 0 : el.offsetLeft; } if (isNaN(delta[1])) { delta[1] = (style_pos == 'relative') ? 0 : el.offsetTop; } if (pos[0] !== null) { el.style.left = pos[0] - pageXY[0] + delta[0] + 'px'; } if (pos[1] !== null) { el.style.top = pos[1] - pageXY[1] + delta[1] + 'px'; } var newXY = this.getXY(el); if (!noRetry && (newXY[0] != pos[0] || newXY[1] != pos[1])) { var retry = function() { YAHOO.util.Dom.setXY(el, pos, true); }; setTimeout(retry, 0); } }; this.batch(el, f, this, true); }, setX: function(el, x) { this.setXY(el, [x, null]); }, setY: function(el, y) { this.setXY(el, [null, y]); }, getRegion: function(el) { var f = function(el) { return new YAHOO.util.Region.getRegion(el); }; return this.batch(el, f, this, true); }, getClientWidth: function() { return this.getViewportWidth(); }, getClientHeight: function() { return this.getViewportHeight(); }, getElementsByClassName: function(className, tag, root) { var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)'); var method = function(el) { return re.test(el['className']); }; return this.getElementsBy(method, tag, root); }, hasClass: function(el, className) { var f = function(el) { var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)'); return re.test(el['className']); }; return this.batch(el, f, this, true); }, addClass: function(el, className) { var f = function(el) { if (this.hasClass(el, className)) { return; } el['className'] = [el['className'], className].join(' '); }; this.batch(el, f, this, true); }, removeClass: function(el, className) { var f = function(el) { if (!this.hasClass(el, className)) { return; } var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', 'g'); var c = el['className']; el['className'] = c.replace(re, ' '); }; this.batch(el, f, this, true); }, replaceClass: function(el, oldClassName, newClassName) { var f = function(el) { this.removeClass(el, oldClassName); this.addClass(el, newClassName); }; this.batch(el, f, this, true); }, generateId: function(el, prefix) { prefix = prefix || 'yui-gen'; var f = function(el) { el = el || {}; if (!el.id) { el.id = prefix + id_counter++; } return el.id; }; return this.batch(el, f, this, true); }, isAncestor: function(haystack, needle) { haystack = this.get(haystack); if (!haystack || !needle) { return false; } var f = function(needle) { if (haystack.contains && ua.indexOf('safari') < 0) { return haystack.contains(needle); } else if (haystack.compareDocumentPosition) { return !!(haystack.compareDocumentPosition(needle) & 16); } else { var parent = needle.parentNode; while (parent) { if (parent == haystack) { return true; } else if (parent.tagName == 'HTML') { return false; } parent = parent.parentNode; } return false; } }; return this.batch(needle, f, this, true); }, inDocument: function(el) { var f = function(el) { return this.isAncestor(document.documentElement, el); }; return this.batch(el, f, this, true); }, getElementsBy: function(method, tag, root) { tag = tag || '*'; root = this.get(root) || document; var nodes = []; var elements = root.getElementsByTagName(tag); if (!elements.length && (tag == '*' && root.all)) { elements = root.all; } for (var i = 0, len = elements.length; i < len; ++i) { if (method(elements[i])) { nodes[nodes.length] = elements[i]; } } return nodes; }, batch: function(el, method, o, override) { el = this.get(el); var scope = (override) ? o : window; if (!el || el.tagName || !el.length) { return method.call(scope, el, o); } var collection = []; for (var i = 0, len = el.length; i < len; ++i) { collection[collection.length] = method.call(scope, el[i], o); } return collection; }, getDocumentHeight: function() { var scrollHeight = -1, windowHeight = -1, bodyHeight = -1; var marginTop = parseInt(this.getStyle(document.body, 'marginTop'), 10); var marginBottom = parseInt(this.getStyle(document.body, 'marginBottom'), 10); var mode = document.compatMode; if ((mode || isIE) && !isOpera) { switch (mode) { case 'CSS1Compat': scrollHeight = ((window.innerHeight && window.scrollMaxY) ? window.innerHeight + window.scrollMaxY : -1); windowHeight = [document.documentElement.clientHeight, self.innerHeight || -1].sort(function(a, b) { return (a - b); })[1]; bodyHeight = document.body.offsetHeight + marginTop + marginBottom; break; default: scrollHeight = document.body.scrollHeight; bodyHeight = document.body.clientHeight; } } else { scrollHeight = document.documentElement.scrollHeight; windowHeight = self.innerHeight; bodyHeight = document.documentElement.clientHeight; } var h = [scrollHeight, windowHeight, bodyHeight].sort(function(a, b) { return (a - b); }); return h[2]; }, getDocumentWidth: function() { var docWidth = -1, bodyWidth = -1, winWidth = -1; var marginRight = parseInt(this.getStyle(document.body, 'marginRight'), 10); var marginLeft = parseInt(this.getStyle(document.body, 'marginLeft'), 10); var mode = document.compatMode; if (mode || isIE) { switch (mode) { case 'CSS1Compat': docWidth = document.documentElement.clientWidth; bodyWidth = document.body.offsetWidth + marginLeft + marginRight; winWidth = self.innerWidth || -1; break; default: bodyWidth = document.body.clientWidth; winWidth = document.body.scrollWidth; break; } } else { docWidth = document.documentElement.clientWidth; bodyWidth = document.body.offsetWidth + marginLeft + marginRight; winWidth = self.innerWidth; } var w = [docWidth, bodyWidth, winWidth].sort(function(a, b) { return (a - b); }); return w[2]; }, getViewportHeight: function() { var height = -1; var mode = document.compatMode; if ((mode || isIE) && !isOpera) { switch (mode) { case 'CSS1Compat': height = document.documentElement.clientHeight; break; default: height = document.body.clientHeight; } } else { height = self.innerHeight; } return height; }, getViewportWidth: function() { var width = -1; var mode = document.compatMode; if (mode || isIE) { switch (mode) { case 'CSS1Compat': width = document.documentElement.clientWidth; break; default: width = document.body.clientWidth; } } else { width = self.innerWidth; } return width; } 
    };
} (); YAHOO.util.Region = function(t, r, b, l) { this.top = t; this[1] = t; this.right = r; this.bottom = b; this.left = l; this[0] = l; }; YAHOO.util.Region.prototype.contains = function(region) { return (region.left >= this.left && region.right <= this.right && region.top >= this.top && region.bottom <= this.bottom); }; YAHOO.util.Region.prototype.getArea = function() { return ((this.bottom - this.top) * (this.right - this.left)); }; YAHOO.util.Region.prototype.intersect = function(region) { var t = Math.max(this.top, region.top); var r = Math.min(this.right, region.right); var b = Math.min(this.bottom, region.bottom); var l = Math.max(this.left, region.left); if (b >= t && r >= l) { return new YAHOO.util.Region(t, r, b, l); } else { return null; } }; YAHOO.util.Region.prototype.union = function(region) { var t = Math.min(this.top, region.top); var r = Math.max(this.right, region.right); var b = Math.max(this.bottom, region.bottom); var l = Math.min(this.left, region.left); return new YAHOO.util.Region(t, r, b, l); }; YAHOO.util.Region.prototype.toString = function() { return ("Region {" + "t: " + this.top + ", r: " + this.right + ", b: " + this.bottom + ", l: " + this.left + "}"); }; YAHOO.util.Region.getRegion = function(el) { var p = YAHOO.util.Dom.getXY(el); var t = p[1]; var r = p[0] + el.offsetWidth; var b = p[1] + el.offsetHeight; var l = p[0]; return new YAHOO.util.Region(t, r, b, l); }; YAHOO.util.Point = function(x, y) { this.x = x; this.y = y; this.top = y; this[1] = y; this.right = x; this.bottom = y; this.left = x; this[0] = x; }; YAHOO.util.Point.prototype = new YAHOO.util.Region();
