/**
 * @classDescription Manages adding elements to the breadcrumb trail.
 *
 * @author Adam J. McIntyre
 */

BreadcrumbManager = function() {
    var _bcEl = 'breadcrumbs_content';
    return{
        // Add a breadcrumb to the end of the trail.
        // Will remove last crumb unless bool.
        addCrumb : function(cr, keepLastCrumb) {
            if(! keepLastCrumb) {
                this.popCrumb();
            }

            YAHOO.util.Event.onAvailable(_bcEl, function() {
                var el = document.getElementById(_bcEl);
                el.innerHTML += " &gt; " + cr;
            });
        },
        replaceCurPageCrumb : function(cr) {
            YAHOO.util.Event.onAvailable(_bcEl, function() {
                var el = document.getElementById('breadcrumb_currentPage');
                el.innerHTML = cr;
            });
        },
        popCrumb : function() {
            YAHOO.util.Event.onAvailable(_bcEl, function() {
                var el = document.getElementById(_bcEl);
                el.innerHTML = el.innerHTML.substr(0, el.innerHTML.lastIndexOf('&gt;'));
            });
        },
        _maybeEllipsify : function() {
            if(YAHOO.util.Dom.getStyle(_bcEl, 'float') != 'left' && YAHOO.util.Dom.getStyle('breadcrumbs_print',
                    'float') != 'right'
                    && YAHOO.util.Dom.getStyle('addThis_breadcrumb', 'float') != 'right') {
                if(!this.counter) {
                    this.counter = 0;
                }
                this.counter++;
                if(this.counter > 5) {
                    return;
                }

                var o = this;
                setTimeout(function() { o._maybeEllipsify() }, 200);
            }
            else {
                var crumbRegion = YAHOO.util.Dom.getRegion(_bcEl);
                var crumbOffset = crumbRegion ? (crumbRegion.right + 20) : 0;

                // Set the maximum "right" amount at the end of the top nav
                var maxRight = YAHOO.util.Dom.getViewportWidth();
                var topReg = YAHOO.util.Dom.getRegion('topNav');
                if(topReg && topReg.right > 0) {
                    maxRight = topReg.right;
                }

                var printElRegion = YAHOO.util.Dom.getRegion('breadcrumbs_print'); // We'll need to add this ID to the component
                var printElOffset = maxRight;
                if(printElRegion && printElRegion.left > 0) {
                    printElOffset = printElRegion.left;
                }

                var addThisRegion = YAHOO.util.Dom.getRegion('addThis_breadcrumb');
                var addThisOffset = maxRight;
                if(addThisRegion && addThisRegion.left > 0) {
                    addThisOffset = addThisRegion.left;
                }

                var glossaryRegion = YAHOO.util.Dom.getRegion('glossary_widget');
                var glossaryOffset = maxRight;
                if(glossaryRegion && glossaryRegion.left > 0) {
                    glossaryOffset = glossaryRegion.left;
                }

                var farthestLeft = Math.min(glossaryOffset, Math.min(printElOffset, addThisOffset));

                if(crumbOffset > farthestLeft) {
                    var titleEl = document.getElementById('breadcrumb_currentPage');
                    titleEl.title = titleEl.innerHTML;
                }

                var o = this;

                if(crumbOffset > farthestLeft) {
                    (function() {
                        o.truncate();
                        crumbOffset = YAHOO.util.Dom.getRegion(_bcEl).right;
                        if(crumbOffset > farthestLeft && farthestLeft > 100) {
                            setTimeout(arguments.callee, 100);
                        }
                        else {
                            return;
                        }
                    })();
                }
            }
        },
        ellipsify : function() {
            var o = this;

            if(YAHOO.env.ua.webkit > 0) {    // Safari has a tendency to block if Elements are not styled, thus the delay
                YAHOO.util.Event.addListener(window, 'load', function() {
                    setTimeout(function() {o._maybeEllipsify()}, 100);
                });
            }
            else {
                YAHOO.util.Event.onDOMReady(function() {
                    o._maybeEllipsify();
                });
            }
        },
        truncate: function() {
            var ELLIPSIS = '...';
            var bcEl = document.getElementById(_bcEl);

            // Update the breadcrumb component to wrap all links in a span with a class of "full"
            var replaceEls = YAHOO.util.Dom.getElementsByClassName('full', 'span', bcEl);

            // We have elements left to make ellipses
            if(replaceEls.length > 0) {
                var pEl = replaceEls[0];
                var rEl = pEl.getElementsByTagName('a')[0];
                rEl.title = rEl.innerHTML;
                rEl.innerHTML = ELLIPSIS;
                YAHOO.util.Dom.replaceClass(pEl, 'full', 'truncated');
            }
            else { // We need to truncate the text of the last item...uh oh!
                var titleEl = document.getElementById('breadcrumb_currentPage');
                if(titleEl.innerHTML.lastIndexOf(' ') > 0) {
                    titleEl.innerHTML = titleEl.innerHTML.substr(0, titleEl.innerHTML.lastIndexOf(' ')) + ELLIPSIS;
                }
                else {
                    titleEl.innerHTML = ELLIPSIS;
                }
            }
        }
    }
}();

