function FacetedNavObj(id, readXMLAsStringFlag) {
    this.parent(id, readXMLAsStringFlag);
    this.flyouts = [];
    this.openedCat = {};
    this.oInitFacet = {};
};

FacetedNavObj.prototype = new AjaxHelperListener();
FacetedNavObj.prototype.constructor = FacetedNavObj;
FacetedNavObj.prototype.parent = AjaxHelperListener.prototype.constructor;
FacetedNavObj.prototype.initValue = function() {
    return "{'loadInit':'true'}";
}
FacetedNavObj.prototype.notify = function(responseEle, callbackParam) {
    var oNewFacet = eval("("+responseEle+")");
    // arrive by browser back button to initial page load, load oInitFacet
    if (oNewFacet.loadInit) {
        this.buildFacetedNavContent(oInitFacets);
    } else {
        this.buildFacetedNavContent(oNewFacet);
    }
    this.flyouts = [];
};

FacetedNavObj.prototype.searchBreadcrumb = function (label, newPathAfterRemove, opt) {
    document.title = window.ga_initPageTitle + " - Filter By " + label;
    window.ga_setNewTitle = true;
    g_AJAXHelper.makeAJAXCall(debug, null, 'p=' + newPathAfterRemove, opt);
};

FacetedNavObj.prototype.toggleFacet = function(linkId, facets) {
    var link = document.getElementById(linkId);
    var argLen = arguments.length;
    var curMode = link.attributes.getNamedItem('togglemode').value;
    if (curMode == 'close') { //  its close now, so open it
        link.attributes.getNamedItem('togglemode').value = 'open';
        link.title = link.attributes.getNamedItem('openalt').value;
        link.innerHTML = link.attributes.getNamedItem('open').value;
        delete this.openedCat[link.attributes.getNamedItem('category').value];
        for (i = 1; i < argLen && document.getElementById(arguments[i]); i++) {
            document.getElementById(arguments[i]).style.display = "none";
        }
    } else { // vice versa
        link.attributes.getNamedItem('togglemode').value = 'close';
        link.title = link.attributes.getNamedItem('closeAlt').value;
        link.innerHTML = link.attributes.getNamedItem('close').value;
        this.openedCat[link.attributes.getNamedItem('category').value] = '1';
        for (i = 1; i < argLen && document.getElementById(arguments[i]); i++) {
            document.getElementById(arguments[i]).style.display = "block";
        }
    }
};

FacetedNavObj.prototype.toggleFlyout =function(id, parent) {
    var overlay = this.flyouts[id];
    if (!overlay) {
        overlay = new YAHOO.widget.Overlay(id, { visible:false, effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.25} });
        this.flyouts[id] = overlay;
    }
    if (overlay.cfg.getProperty("visible") == true) {
        overlay.hide();
    } else {
        flyoutElement = document.getElementById(id);
        parentElement = document.getElementById(parent);
        flyoutElement.style.display = "";
        if (parentElement) {
            flyoutElement.style.left = parentElement.offsetLeft + 10 + 'px';
            flyoutElement.style.top = parentElement.offsetTop + 10 + 'px';
            overlay.cfg.setProperty("context", [parentElement, "tl", "tl"]);
        }
        overlay.show();
    }
};

FacetedNavObj.prototype.buildFacetedNavContent = function (responseData) {
    facetsTargetParams = responseData.facetsTargetParams;
    var oFacetArray = responseData.facets;
    var contentTag = document.getElementById("facetContent");
    contentTag.innerHTML = "";
    var typeOf = typeof oFacetArray;
    if (typeOf == "string") {
        var text = (oFacetArray == "single")? singleResult : (oFacetArray == "empty")? emptyResult : "";
        contentTag.appendChild(this.createElement("dl").appendChild(this.createElement("dt", false, {}, text)));
    } else {
        var categoryLen = oFacetArray.length;
        for (var i = 0; i < categoryLen; i++) { //start of category loop
            var category = oFacetArray[i];

            var DLTag = this.createElement("dl", false, {"class":"facet termBreakText"});
            // <dl class=facet termBreakText>
            var DTTag = this.createElement("dt", false, {"class":"title"}, category.label.replace("&amp;", "&"));            
            //  <dt class=title>foobar
            DLTag.appendChild(DTTag);
            //  </dt>

            var facetLen = category.items.length;
            var facetToHide = [];
            for (var j = 0; j < facetLen; j++) { // start of facet loop
                var facet = category.items[j];

                /* 1. check if this facet group should be hidden */
                var ddStyle = {};
                // hideable if hideCnt is turned on, not first category, and not first facet in category
                if ((hideCount != 0 && i > 0) && j >= hideCount) {
                    facetToHide.push(facet.id);
                    // really hide it if its not already opened in the last screen
                    if (!this.openedCat[category.label]) ddStyle = {"style":"display:none"};
                }

                var DDTag = this.createElement("dd", facet.id, ddStyle);
                //  <dd id=foo>
                if(facet.hidename != "true") {
                    var PTag = this.createElement("p", false, {}, facet.label);

                    //    <p>bar</p>
                    DDTag.appendChild(PTag);
                }
                var OLTag = this.createElement("ol");
                //     <ol>
                /* 2. create the flyout links if flyout window is specified, otherwise create filter links */
                if (facet.flyout) {
                    oFlyout = facet;
                    var LITag = this.createElement("li");
                    var oCStr = "facetedNav.toggleFlyout('" + facet.id + "Facet','" + facet.id + "'); return false;";
                    var ATag = this.createElement("a", false, {"href":"#","onclick":oCStr}, facet.flyoutLabel);
                    LITag.appendChild(ATag);
                    OLTag.appendChild(LITag);
                } else {
                    var filterLen = facet.filters.length;
                    for (var k = 0; k < filterLen; k++) {
                        var filter = facet.filters[k];
                        var oCStr = "s_objectID='" + filter.tid + "'; setTID('" + filter.tid + "'); "
                                + "facetedNav.searchBreadcrumb('"+ facet.label + ":" + filter.label + "', '" + filter.path + "', '" + sortArg + "');"
                                + scrollToTop + " return false;";
                        var LITag = this.createElement("li");
                        //      <li>
                        var ATag = this.createElement("a", false, {"href":"#", "onClick":oCStr},
                                filter.label + ((filter.count)? " (" + filter.count + ")" : ""));
                        //        <a></a>
                        LITag.appendChild(ATag);
                        OLTag.appendChild(LITag);
                        //      </li>
                    }
                }
                DDTag.appendChild(OLTag);
                //    </ol>
                DLTag.appendChild(DDTag);
                //  </dd>
            }
            // end of facet loop

            /* 3 create the open/close link */
            if ((hideCount != 0 && i > 0) && facetLen > hideCount) {
                var valueSet = (this.openedCat[category.label])?
                               [category.closeAltLabel, "close", category.closeLabel]:
                               [category.openAltLabel, "open", category.openLabel];
                var hideDDTag = this.createElement("dd", false, {"class":"more"});
                var hideId = "moreLink" + i;
                var oCStr = "facetedNav.toggleFacet('" + hideId + "','" + facetToHide.join("','") + "'); return false;";
                var hideATag = this.createElement("a", hideId, {"title":valueSet[0], "close":category.closeLabel, "closealt":category.closeAltLabel,
                    "open":category.openLabel, "openalt":category.openAltLabel, "togglemode":valueSet[1], "category":category.label,
                    "onclick":oCStr, "href":"#"}, valueSet[2]);
                hideDDTag.appendChild(hideATag);
                DLTag.appendChild(hideDDTag);
            }
            contentTag.appendChild(DLTag);
            //</dl>
        }
        // end of category loop

        /* 4 create flyout div */
        if (oFlyout) {
            this.makeFlyout(oFlyout, contentTag);
        }
    }
};

FacetedNavObj.prototype.makeFlyout = function (oFlyout, contentTag) {
    var facetName = oFlyout.id + "Facet";
    var DLTag = this.createElement("dl", facetName, {"class":"termBreakText flyout flyMM", "style":"display: none; z-index: 1000; position: absolute;"});
    var DTTag = this.createElement("dt", false, {"class":"more", "onclick":"facetedNav.toggleFlyout('" + facetName + "');  return false;"}, "x");
    DLTag.appendChild(DTTag);
    DLTag.appendChild(this.createElement("dt", false, {}, oFlyout.label));
    var midIdx = (oFlyout.filters.length % 2 != 0)? (oFlyout.filters.length + 1) / 2 : oFlyout.filters.length / 2;
    var DDTag = this.createElement("dd");
    var innerDLTag;
    for (var i = 0; i < oFlyout.filters.length; i++) {
        var filter = oFlyout.filters[i];
        if (i == 0) {
            innerDLTag = this.createElement("dl", "halfLeft", {"class":"half glossary"});
        } else if (i == midIdx) {
            DDTag.appendChild(innerDLTag);
            innerDLTag = this.createElement("dl", "halfRight", {"class":"half glossary"});
        }
        var innerDTTag = this.createElement("dt", false, {"style":"float:none"});
        var oCStr = "s_objectID='" + filter.tid + "'; setTID('" + filter.tid + "'); facetedNav.toggleFlyout('" + facetName + "'); "
                     + "facetedNav.searchBreadcrumb('"+ oFlyout.label + ":" + filter.label + "', '" + filter.path + "', '" + sortArg + "');"
                     + scrollToTop +" return false;";
        var ATag = this.createElement("a", false, {"href":"#","onclick":oCStr}, filter.label);
        innerDTTag.appendChild(ATag);
        innerDLTag.appendChild(innerDTTag);
        innerDLTag.appendChild(this.createElement("dd"));
    }
    DDTag.appendChild(innerDLTag);
    DDTag.appendChild(this.createElement("br", false, {"clear":"all"}));
    DLTag.appendChild(DDTag);
    contentTag.appendChild(DLTag);
};
