yui-overrides.js

// add ability for callbacks with animations
if(YAHOO.util.Anim){
    YAHOO.util.Anim.prototype.animateX = function(callback, scope){
        var f = function(){
            this.onComplete.unsubscribe(f);
            if(typeof callback == 'function'){
                callback.call(scope || this, this);
            }
        };
        this.onComplete.subscribe(f, this, true);
        this.animate();
    };
}

/*
 * A simple enhancement to drag drop that allows you to constrain the movement of the
 * DD or DDProxy object to a particular element.<br /><br />
 *
 * Usage:
 <pre><code>
 var dd = new YAHOO.util.DDProxy("dragDiv1", "proxytest",
                { dragElId: "existingProxyDiv" });
 dd.startDrag = function(){
     this.constrainTo('parent-id');
 };
 </code></pre>
 * Or you can initalize it using the {@link Ext.Element} object:
 <pre><code>
 Ext.get('dragDiv1').initDDProxy('proxytest', {dragElId: "existingProxyDiv"}, {
     startDrag : function(){
         this.constrainTo('parent-id');
     }
 });
 </code></pre>
 */
if(YAHOO.util.DragDrop){
    /*
     * Provides default constraint padding to "constrainTo" elements (defaults to {left: 0, right:0, top:0, bottom:0}).
     * @type Object
     */
    YAHOO.util.DragDrop.prototype.defaultPadding = {left:0, right:0, top:0, bottom:0};

    /*
     * Initializes the drag drop object's constraints to restrict movement to a certain element.
     * @param {String/HTMLElement/Element} constrainTo The element to constrain to.
     * @param {Object/Number} pad (optional) Pad provides a way to specify "padding" of the constraints,
     * and can be either a number for symmetrical padding (4 would be equal to {left:4, right:4, top:4, bottom:4}) or
     * an object containing the sides to pad. For example: {right:10, bottom:10}
     * @param {Boolean} inContent (optional) Constrain the draggable in the content box of the element (inside padding and borders)
     */
    YAHOO.util.DragDrop.prototype.constrainTo = function(constrainTo, pad, inContent){
        if(typeof pad == 'number'){
            pad = {left: pad, right:pad, top:pad, bottom:pad};
        }
        pad = pad || this.defaultPadding;
        var b = Ext.get(this.getEl()).getBox();
        var ce = Ext.get(constrainTo);
        var c = ce.dom == document.body ? { x: 0, y: 0,
                width: YAHOO.util.Dom.getViewportWidth(),
                height: YAHOO.util.Dom.getViewportHeight()} : ce.getBox(inContent || false);
        var topSpace = b.y - c.y;
        var leftSpace = b.x - c.x;

        this.resetConstraints();
        this.setXConstraint(leftSpace - (pad.left||0), // left
                c.width - leftSpace - b.width - (pad.right||0) //right
        );
        this.setYConstraint(topSpace - (pad.top||0), //top
                c.height - topSpace - b.height - (pad.bottom||0) //bottom
        );
    };
}

// various Safari fixes, opera fix
if(Ext.isSafari || Ext.isOpera){// modified getXY which has the fix for Safari bug. Changes are preceded with **
    YAHOO.util.Dom.getXY = function(el) {
        var isIE = Ext.isIE,  isSafari = Ext.isSafari, Y = YAHOO.util;

        var f = function(el) {

        // has to be part of document to have pageXY
            if (el.parentNode === null || el.offsetParent === null ||
                    this.getStyle(el, 'display') == 'none') {
                return false;
            }



            var parentNode = null;
            var pos = [];
            var box;

            if (el.getBoundingClientRect) { // IE
                box = el.getBoundingClientRect();
                var doc = document;
                if ( !this.inDocument(el) && parent.document != document) {// might be in a frame, need to get its scroll
                    doc = parent.document;

                    if ( !this.isAncestor(doc.documentElement, el) ) {
                        return false;
                    }

                }

                var scrollTop = Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);
                var scrollLeft = Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);

                return [box.left + scrollLeft, box.top + scrollTop];
            } else { // safari, opera, & gecko
                pos = [el.offsetLeft, el.offsetTop];
                parentNode = el.offsetParent;
                var hasAbsolute = false; // ** flag if a parent is positioned

                if (parentNode != el) {
                    while (parentNode) {
                        pos[0] += parentNode.offsetLeft;
                        pos[1] += parentNode.offsetTop;
                        // ** only check if needed
                        if(isSafari && !hasAbsolute && this.getStyle(parentNode, 'position') == 'absolute' ){
                            hasAbsolute = true;
                        }
                        parentNode = parentNode.offsetParent;
                    }
                }
                // ** safari doubles in some cases, use flag from offsetParent's as well
                if (isSafari && (hasAbsolute || this.getStyle(el, 'position') == 'absolute')) {
                    pos[0] -= document.body.offsetLeft;
                    pos[1] -= document.body.offsetTop;
                }
            }

            if (el.parentNode) { parentNode = el.parentNode; }
            else { parentNode = null; }

            while (parentNode && parentNode.tagName.toUpperCase() != 'BODY' && parentNode.tagName.toUpperCase() != 'HTML')
            { // account for any scrolled ancestors
                // ** opera TR has bad scroll values, so filter them jvs
                if (Y.Dom.getStyle(parentNode, 'display') != 'inline' && parentNode.tagName.toUpperCase() != 'TR') { // work around opera inline scrollLeft/Top bug
                    pos[0] -= parentNode.scrollLeft;
                    pos[1] -= parentNode.scrollTop;
                }

                if (parentNode.parentNode) {
                    parentNode = parentNode.parentNode;
                } else { parentNode = null; }
            }


            return pos;
        };

        return Y.Dom.batch(el, f, Y.Dom, true);
    };


    // workaround for Safari anim duration speed problems
    if(YAHOO.util.AnimMgr){
        YAHOO.util.AnimMgr.fps = 1000;
    }

    // workaround for Safari 1.3 not supporting hasOwnProperty
    if(YAHOO.util.Connect){
        YAHOO.util.Connect.setHeader = function(o){
            for(var prop in this._http_header){
                // if(this._http_header.hasOwnProperty(prop)){
                if(typeof this._http_header[prop] != 'function'){
                    o.conn.setRequestHeader(prop, this._http_header[prop]);
                }
            }
            delete this._http_header;
            this._http_header = {};
            this._has_http_headers = false;
        };
    }
}

YAHOO.util.Region.prototype.adjust = function(t, l, b, r){
    this.top += t;
    this.left += l;
    this.right += r;
    this.bottom += b;
    return this;
};

yui-ext - Copyright © 2006 Jack Slocum. | Yahoo! UI - Copyright © 2006 Yahoo! Inc.
All rights reserved.