{	
	var DOMAIN_CLASS_ID = 715000000;
	var PROGRAM_CLASS_ID = 751000000;
	var ORG_UNIT_CLASS_ID = 752000000;
	var SEARCH_RING_CLASS_ID = 702000000;
	var SITE_CLASS_ID = 701000000;	
	var PROJECT_CLASS_ID = 703000000;
	var LEASE_CLASS_ID = 716000000;
	var ASSET_CLASS_ID = 711000000;
	var LIBRARY_CLASS_ID = 712000000;
	var VENDOR_CLASS_ID = 727000000;
	var CONTACT_CLASS_ID = 25000000;	
	
	var m_iBreadCrumbSize = 40;
		
	// general memebers
	var m_arBreadCrumbs;
	
	if (top.m_arBreadCrumbs == null)
	    top.m_arBreadCrumbs = new Array();
	
	//function to over-ride the breadcrumb size when displaying custom messages
    function setBreadCrumbSize(size)	
    {
        m_iBreadCrumbSize = size;
    }
	
	try
	{
	    //top.document.getElementById('NavCrumbs').innerHTML = '&nbsp;';
	} catch (e) {}
	
		
		
	// bread crumb constructor
	function breadCrumb(ClassID, ClassInstance, Name, Number, DisplayName, PageID, url, iconURL)
	{
	    // members
        this.ClassID        = ClassID;
        this.ClassInstance  = ClassInstance;
        this.Name           = Name;
        this.Number         = Number;        
        this.DisplayName    = DisplayName;
        this.PageID         = PageID;
        this.url            = url;
        this.iconURL        = iconURL;
        
       // methods headers
        this.click = function ()
        {
            closeAllMenus();
            
            if (this.url != null)
                top.navigateTo(this.url);
            else if (this.PageID != null)
                openSMSWindow(this.PageID, this.ClassInstance, this.ClassID);
            else
                switch (this.ClassID)
                {             
                    case PROGRAM_CLASS_ID: // program
                    case DOMAIN_CLASS_ID: // domain
                    {
                        top.showApplication("Browse", 752030100, top.m_iDefaultProgramID, 752000000, null, 752030700, -1, 715000000,null);
                        break;
                    }       
                    case VENDOR_CLASS_ID:
                    {
                    
                        if (this.ClassInstance == 0 || this.ClassInstance == null)
                            top.showApplication("Vendors", 727030100, 0, 727000000);
                        else // default page                            
                            openSMSWindow(null, this.ClassInstance, this.ClassID);
                        
                        break;
                    }                        
                    default:
                    {
                        // navigate to default page
                        openSMSWindow(null, this.ClassInstance, this.ClassID);
                        break;
                    }
                };
        } 
            
        this.isClickable = function ()
        {
            return (this.url != null || this.PageID != null || this.ClassID != null)            
        }

        this.hover = function()
        {

            // EJF -- not ready for prime time
            return;


            if (this.ClassID == null || this.ClassInstance == null)
                return;

            var oMenu = new dynamicMenu();
            
            var arParams = new Array();
            arParams[arParams.length] = new brokerParam("CLASS_ID", this.ClassID);
            arParams[arParams.length] = new brokerParam("CLASS_INSTANCE", this.ClassInstance);

            // retrieve crumbs from server
            var cResponse = sendThroughBroker(707000000, 9, arParams, false, null, null, false); // none transactional																				

            var cArguments = cResponse.getArguments();
            var iLength = cArguments.Count();

            if (iLength == 0)
                return;

            var arBreadCrumbs = new Array();

            for (var iIndex = 0; iIndex < iLength; iIndex++)
            {
                var sName = cArguments.Item(iIndex).getName();

                var arNameValue = cArguments.Item(iIndex).getValue().split(";");
                var iCrumbClassID = parseInt(arNameValue[0]);
                var iCrumbClassInstance = parseInt(arNameValue[1]);
                var sName = arNameValue[2];
                var sNumber = arNameValue[3];
                var sDisplayName = arNameValue[4];


                oMenu.addEntry(sDisplayName, 'closeAllMenus();openSMSWindow(null, ' + iCrumbClassInstance + ', ' + iCrumbClassID + ')');
            }


            oMenu.showByObject(top.event.srcElement, -4, 'bottom', 'CrumbMenu');

            m_uiGenerator.attachEvent(top.event.srcElement, 'onmouseout', 'closeMenuFromTrigger()');

        } // end hover
        
        
        
        this.getIcon = function()
        {
            if (this.iconURL != null)
                return this.iconURL;
            
            return m_uiUtil.getClassIcon(this.ClassID);            
        }
        
	}
		
	
	var haveAddedCrumbs = false;
	
	function addBreadCrumb(Text, PageID, ClassID, ClassInstance, iconURL)
	{
	    if (!haveAddedCrumbs)
	        top.m_arBreadCrumbs = new Array();
	    haveAddedCrumbs = true;


	    top.m_arBreadCrumbs.push(new breadCrumb(ClassID, ClassInstance, Text, null, Text, PageID, null, iconURL));

	}
	function addBreadCrumbURL(Text, url)
	{
	    if (!haveAddedCrumbs)
	        top.m_arBreadCrumbs = new Array();
	    haveAddedCrumbs = true;
	    top.m_arBreadCrumbs.push(new breadCrumb(null, null, Text, null, Text, null, url));
	}

	function addBreadCrumbs(arText)
	{
	    top.m_arBreadCrumbs = new Array();
	    
	    for(var i = 0; i < arText.length; i++)
	        addBreadCrumb(arText[i]);
	    renderBreadCrumbs();
	}
	
	
	function getBreadCrumb(classID)
	{
	    if (null == top.m_arBreadCrumbs) return(null);
	    
		for (var iIndex=top.m_arBreadCrumbs.length-1; iIndex >= 0; iIndex--)
			if (classID == top.m_arBreadCrumbs[iIndex].ClassID) 
			    return (top.m_arBreadCrumbs[iIndex]);
		
		return (null);
	}

	function getPathAfterBreadCrumb(classID)
	{
	    if (null == top.m_arBreadCrumbs) return (null);
	    var index = 0;
	    var pathAfter = "";
	    var siteFound = false;
	    var iIndex = top.m_arBreadCrumbs.length - 1;
	    while (siteFound == false && iIndex >= 0)
	    {
	        if (classID == top.m_arBreadCrumbs[iIndex].ClassID)
	        {
	            index = (top.m_arBreadCrumbs[iIndex]);
	            pathAfter = top.m_arBreadCrumbs[iIndex].DisplayName + ' ' + pathAfter;
	            siteFound = true;
	        }
	        else
	        {
	            pathAfter = top.m_arBreadCrumbs[iIndex].DisplayName + ' ' + pathAfter;	            
	            iIndex--;
	        }
	    }

	    if (siteFound == true)
	     {
	        return pathAfter;
	     }
	    else    
	    return (null);
}	
		
	function refreshBreadCrumbs()
	{		
	    // all document page exception
	    var bLib = (713000000 == m_ClassID);
	    var iClassID = (bLib) ? m_ParentClassID : m_ClassID;
	    var iClassInstance = (bLib) ? m_ParentObjectID : m_ObjectID;
	    
	    // context request
		var arParams = new Array();				
		arParams[arParams.length] = new brokerParam("CLASS_ID", iClassID);
		arParams[arParams.length] = new brokerParam("CLASS_INSTANCE", iClassInstance);			
										
		// retrieve crumbs from server
		var cResponse = sendThroughBroker(707000000, 6, arParams, false, null, null, false); // none transactional																				
										
		var cArguments = cResponse.getArguments();
		var iLength    = cArguments.Count();
		
		var arBreadCrumbs = new Array();
		
		for(var iIndex=0; iIndex < iLength; iIndex++)
		{
		    var sName  = cArguments.Item(iIndex).getName();
		    var sValue = cArguments.Item(iIndex).getValue();
		    
		    arBreadCrumbs.push(new NameValuePair(sName, sValue));
		}
		
		setBreadCrumbs(arBreadCrumbs);
	}

	function setBreadCrumbs(arBreadCrumbs)
	{	
	    if (null == arBreadCrumbs) return;
	    
	    var iLength = arBreadCrumbs.length;	
	    if (0 == iLength) return;
	    
		top.m_arBreadCrumbs = new Array();
		
		var bLib = (713000000 == m_ClassID);
	    var iClassID = (bLib) ? m_ParentClassID : m_ClassID;
	    

	    	    
	    var bBrowse = false;
	    var bVendorDirectory = false;
		for (var iIndex = 0; iIndex < iLength; iIndex++)
		{ 
		    var arNameValue = arBreadCrumbs[iIndex].Value.split(";");
		    var iCrumbClassID = parseInt(arNameValue[0]);
		    if (iCrumbClassID == ORG_UNIT_CLASS_ID || iCrumbClassID == DOMAIN_CLASS_ID )
		    {
		        bBrowse = true;
		        break;
		    }
		    if (iCrumbClassID == VENDOR_CLASS_ID)
		    {
		        bVendorDirectory = true;
		        break;
		    }
		}	
		
	
	        
	    if (bBrowse)
	    {	    	 
	        addBreadCrumb(top.getBrowseModeTitle());    
	        addBreadCrumb("Browse", null, DOMAIN_CLASS_ID);
        }
        else if (bVendorDirectory)
        {
            addBreadCrumb("Directory");
            addBreadCrumb("Vendors", null, VENDOR_CLASS_ID);
        }

	    /*
		if (iClassID == 701000000 || iClassID == 703000000)
		    addBreadCrumb("Sites");
	    */
	    	    
		// build bread crumbs array										
		for (var iIndex = iLength-1; iIndex >= 0; iIndex--)
		{ 	
			var arNameValue     = arBreadCrumbs[iIndex].Value.split(";");
			
			var iCrumbClassID        = parseInt(arNameValue[0]);	    
			var iCrumbClassInstance  = parseInt(arNameValue[1]);	   		    
			var sName           = arNameValue[2];	   		    
			var sNumber         = arNameValue[3];
			var sDisplayName    = arNameValue[4];
			
			if ((DOMAIN_CLASS_ID == iCrumbClassID) || (PROGRAM_CLASS_ID == iCrumbClassID)) 
			    continue;
			    
			top.m_arBreadCrumbs.push(new breadCrumb(iCrumbClassID, iCrumbClassInstance, sName, sNumber, sDisplayName, null, null));  
			haveAddedCrumbs = true;			
		}
        renderBreadCrumbs();
    }
    
    function renderBreadCrumbs()
    {    
        
        if (top.m_arBreadCrumbs.length == 0 || !haveAddedCrumbs)
            return;
    
        var sTextTemplate = getPortfolioSettings()['BREADCRUMBS_TEXT_FORMAT'];
	    var sTitleTemplate = getPortfolioSettings()['BREADCRUMBS_TITLE_FORMAT'];

	    // create bread crumbs HTML
	    var sHtml = '';
	    
	    // prarent nodes
		for (var iIndex=0; iIndex < top.m_arBreadCrumbs.length; iIndex++)
		{ 						    
		    var oBreadCrumb = top.m_arBreadCrumbs[iIndex];
		    var sText, sTitle;
		    var sIcon = '';
		    
		    if (oBreadCrumb.Number != null)
		    {
			    sText = sTextTemplate.replace('#DISPLAY_NAME;', oBreadCrumb.DisplayName).replace('#NAME;', oBreadCrumb.Name).replace('#NUMBER;', oBreadCrumb.Number);			
			    sTitle = sTitleTemplate.replace('#DISPLAY_NAME;', oBreadCrumb.DisplayName).replace('#NAME;', oBreadCrumb.Name).replace('#NUMBER;', oBreadCrumb.Number);
            }
            else
            {
                sText = oBreadCrumb.Name;
                sTitle = oBreadCrumb.Name;
            }
            
            sText = sText.replace('  ',' ');            
			if (sText.length > m_iBreadCrumbSize) 
			    sText = sText.substr(0, m_iBreadCrumbSize - 3) + "...";
			
			if (oBreadCrumb.getIcon() != null)
			    sIcon = '<img src="skins/common/images/' + oBreadCrumb.getIcon() + '" style="margin-right:4px;" border="0" width="16" height="16" />';
			
			if(oBreadCrumb.isClickable())
			    sHtml +=  ('<a title="' + sTitle + '" href="#" onclick="top.m_arBreadCrumbs[' + iIndex + '].click();return false;" onmouseover="try { top.m_arBreadCrumbs[' + iIndex + '].hover();} catch (e) {}">' + sIcon + sText + '</a>');
			else
			    sHtml += '<b title="' + sTitle + '" onmouseover="try { top.m_arBreadCrumbs[' + iIndex + '].hover();} catch (e) {}">' + sIcon + sText + '</b>';
			
			/*
			
			if (((iIndex < top.m_arBreadCrumbs.length - 1) &&  713000000 != m_ClassID) && oBreadCrumb.isClickable())
			    sHtml +=  ('<a title="' + sTitle + '" href="#" onclick="top.m_arBreadCrumbs[' + iIndex + '].click();return false;" onmouseover="top.m_arBreadCrumbs[' + iIndex + '].hover();">' + sText + '</a>');
			else if (((iIndex < top.m_arBreadCrumbs.length) &&  713000000 == m_ClassID) && oBreadCrumb.isClickable())
			    sHtml +=  ('<a title="' + sTitle + '" href="#" onclick="top.m_arBreadCrumbs[' + iIndex + '].click();return false;" onmouseover="top.m_arBreadCrumbs[' + iIndex + '].hover();">' + sText + '</a>');
			else
			    sHtml += '<b title="' + sTitle + '" onmouseover="top.m_arBreadCrumbs[' + iIndex + '].hover();">' + sText + '</b>';
			*/
			
			if (iIndex < top.m_arBreadCrumbs.length - 1)
			    sHtml += "&nbsp;&nbsp;<label>&raquo;</label>&nbsp;&nbsp;";
			
		}
		
	    var oDiv = top.document.getElementById('NavCrumbs');
	    if (null == oDiv) return;

	    oDiv.innerHTML = sHtml + '&nbsp;';
	    // If you are on any page underneath the site, app will now
	    // show not only current page in the title but whole breadcrumb text
	    // after the site name (including site name and number). 
	    // It will keep Application name at the first position.
        
	    var newTitle = getPathAfterBreadCrumb(SITE_CLASS_ID);
	    var oldTitle = top.document.title;
	    if (newTitle == null)
	    {
	        top.document.title = top.m_BasePageTitle;
	        if (top.m_arBreadCrumbs.length > 0)
	            top.document.title += ' - ' + sText.replace(/\&amp;/g, '&');
	     }
	     else
	     {
	         var sClientAppName;
	         var pos = oldTitle.indexOf('-');
	         if (pos > -1)
	             sClientAppName = oldTitle.slice(0, pos);
	         else
	             sClientAppName = oldTitle; 
	               
	         top.document.title = sClientAppName + ' - ' + newTitle.replace(/\&amp;/g, '&'); ;

	     }

	}	
	
	
	function getPortfolioSettings()
	{
	    if (top == self)
	        return m_arPortfolioSettings;
	    
	    if (window.opener != null)
	        return window.opener.getPortfolioSettings();
	    
        return top.getPortfolioSettings();
        
	}

    
    
    
    
    
    //add init handler
	if(window.addEventListener)
	    window.addEventListener('load', renderBreadCrumbs, false);
	else
	    window.attachEvent('onload', renderBreadCrumbs);
    
}