/* All scripting associated with ABC NAV */

var handlerFunc = function(t) {
    var letters = t.responseXML.getElementsByTagName("letter");
    if (letters && letters.length) {
        for (var i = 0; i < letters.length; i++) {
            var letter = letters[i].getAttribute("name");
            if (letter) {
                abcNav.letterItems[letter] = new Array();
                var items = letters[i].getElementsByTagName("category");
                if (items && items.length) {
                    var k = 0;
                    for (var j = 0; j < items.length; j++) {
                        var s = items[j].getAttribute("name");
                        var e = items[j].getAttribute("emphasis");
                        var u = items[j].getAttribute("url");
                        if (s && e && u) {
                            abcNav.letterItems[letter][k++] = {name:s, emphasis:e, url:u};
                        }
                    }
                }
            }
        }
    }
}

var errFunc = function(t) {
    alert('Error ' + t.status + ' -- ' + t.statusText);
}

var timer="";


var abcNav = {

    /* properties */
    container: null,                          // div containing letter list elements
    abcList: null,                            // list element containing letter list items
    abcListItems: null,                       // collection of list letters
    letterContainer: null,                    // div containing item list elements
    letterPointer: null,
    letterList: null,
    activeLetter: null,
    seeAllDiv: null,
    seeAllLink: null,
    seeAllText: "seeAll",
    mouseoutTimer: null,
    letterItems: new Array(),
    letterHTML: new Array(),
    letterListMaxHeight: new Object(),
    letterListMaxItems: new Object(),
    maxHeight: 268,
    maxItems: 50,
    screenWidth: document.documentElement.clientWidth,
    listBreakCount: 18,
    letterColCount: 5,
    fencePostLetter: "V",
    chunksBreakCount: 6,

    /* methods */
    initialize : function() { 
        /* abc container div */
        this.container = document.getElementById("abc");
        if (!this.container) return false;

        /* abc list */
        this.abcList = this.container.getElementsByTagName("ul")[0]
        if (!this.abcList) return false;

        /* abc letters */
        this.abcListItems = this.abcList.getElementsByTagName("li");
        if (!this.abcListItems || this.abcListItems.length==0) return false;

        /* individual letters container */
        this.letterContainer = document.getElementById("letterContainer");
        if (!this.letterContainer) return false;

        /* individual letters pointer element */
        this.letterPointer = document.getElementById("letterPointer");
        if (!this.letterPointer) return false;

        /* individual letters container */
        this.letterList = document.getElementById("letterList");
        if (!this.letterList) return false;

        /* "See All" div */
        this.seeAllDiv = document.getElementById(this.seeAllText);
        if (!this.seeAllDiv) return false;

        /* "See All" link */
        try {
            this.seeAllLink = this.seeAllDiv.getElementsByTagName("a")[0];
        } catch (e) {
            return false;
        }


        /* Limits and constraints */
        this.letterListMaxHeight._800  = 268;
        this.letterListMaxHeight._1024 = 410;
        this.letterListMaxItems._800   =  50;
        this.letterListMaxItems._1024  =  90;
        if (this.screenWidth <= 800) {
            this.maxHeight = this.letterListMaxHeight._800;
            this.maxItems  = this.letterListMaxItems._800;
        } else {
            this.maxHeight = this.letterListMaxHeight._1024;
            this.maxItems  = this.letterListMaxItems._1024;
        }

        /* set event handlers */
        this.setListEventHandlers();
        this.setFlyOutRollovers();

        /* All required elements are in place */
        return true;
    },

    /* To set the number of elements per column on flyout */
    setNoOfElementsPerColumn : function(size) {
        var chunckSize = 0;
        var noOfElementsPerChunk = 6;

        var i = 2;

        var eqation = size / this.letterColCount;
        if(this.listBreakCount <= eqation) {
            for (; chunckSize <= eqation; i++) {
                chunckSize = noOfElementsPerChunk * i;
            }
            if (eqation >= chunckSize) {
                chunckSize = noOfElementsPerChunk * (i + 1);
            }
        } else {
             chunckSize = noOfElementsPerChunk;
        }

        this.listBreakCount = chunckSize;
        
    },
    

    setListEventHandlers : function() {
        /* set event observers for ABC list members */
        for (var i = 0; i < this.abcListItems.length; i++) {
            var li = this.abcListItems[i];
            var a = li.getElementsByTagName("a")[0]

            /* small variation based on position in alphabet: V+ leaves 'caret pointer' in V location */
            if (i < 27) {
                Event.observe(a, 'mouseover', function(e) { abcNav.showRollOver(e, null); } );
                Event.observe(a, 'focus'    , function(e) { abcNav.showRollOver(e, null); } );
            } else {
                Event.observe(a, 'mouseover', function(e) { abcNav.showRollOver(e, abcNav.abcListItems[27]); } );
                Event.observe(a, 'focus'    , function(e) { abcNav.showRollOver(e, abcNav.abcListItems[27]); } );
            }

            Event.observe(a, 'mouseout', function(e) { abcNav.hideRollOver(a);});
            Event.observe(a, 'blur'    , function(e) { abcNav.hideRollOver(a);});
            Event.observe(a, 'keydown' , function(e) { abcNav.handleListKeyDown(e); } );
        }
    },

    showRollOver : function(event, element) {
        var anchorElement = Event.element(event);
        timer = window.setTimeout(function() {checkMouseOut(anchorElement);}, 300);

        function checkMouseOut(anchorElement) {
            if (anchorElement.id) {
				var url = letterLandingFlyoutJsp + "?navId=" + anchorElement.id + "&letter=" + anchorElement.innerHTML;
                new Ajax.Request(url, {asynchronous:true, onSuccess:handleAZNavRequest, onFailure:errFunc, method:'get'});
            }
        }

		function handleAZNavRequest(response) {
			handlerFunc(response);
			displayFlyout(anchorElement, element);
		}
    },

    hideRollOver : function(a) {
        window.clearTimeout(timer);
        abcNav.mouseoutTimer = window.setTimeout(function() {
        
        /* IE hide drop menu */
            if(document.getElementById("sortby"))
        {
            var temp= document.getElementById("sortby");
            temp.style.visibility= "";
        }
        
            Element.removeClassName(a, "active");
            Element.hide(abcNav.letterContainer);},
            250
        );

    },

    handleListKeyDown : function(e) {
        var code = (e.keyCode) ? e.keyCode : e.which;
        switch (code) {
            case Event.KEY_DOWN:
                try {
                    abcNav.letterList.getElementsByTagName("a")[0].focus();
                } catch(e) {
                    // nop
                }
                Event.stop(e);
                break;

            case Event.KEY_RIGHT:
                try {
                    Event.element(e).parentNode.nextSibling.getElementsByTagName("a")[0].focus();
                } catch(e) {
                    // nop
                }
                break;

            case Event.KEY_LEFT:
                try {
                    Event.element(e).parentNode.previousSibling.getElementsByTagName("a")[0].focus();
                } catch(e) {
                    // nop
                }
                break;

            default:
                // nop

        }
    },

    handleItemListKeyDown : function(e) {
        switch (e.keyCode) {
            case Event.KEY_DOWN:
                try {
                    abcNav.letterList.getElementsByTagName("a")[0].focus();
                } catch(e) {
                    // nop
                }
                Event.stop(e);
                break;

            case Event.KEY_RIGHT:
                try {
                    Event.element(e).parentNode.nextSibling.getElementsByTagName("a")[0].focus();
                } catch(e) {
                    // nop
                }
                break;

            case Event.KEY_LEFT:
                try {
                    Event.element(e).parentNode.previousSibling.getElementsByTagName("a")[0].focus();
                } catch(e) {
                    // nop
                }
                break;

            default:
                // nop

        }
    },

    setFlyOutRollovers : function() {

        Event.observe(document.body, 'click', function(e) {
            if (abcNav.activeLetter) {
                abcNav.hideRollOver(abcNav.activeLetter);
            }
        }
        );

        Event.observe(this.letterContainer, 'mouseover', function(e) {
            if (abcNav.activeLetter && abcNav.mouseoutTimer) {
                window.clearTimeout(abcNav.mouseoutTimer);
                abcNav.mouseoutTimer = null;
            }
        }
        );
        Event.observe(this.letterContainer, 'mouseout', function(e) {
            if (abcNav.activeLetter) {
                abcNav.hideRollOver(abcNav.activeLetter);
            }
        }
        );
    },

    buildLetterHTML : function(letter) {
        var maxCharLength = 350;
        this.letterList.innerHTML = "";
        if (this.letterItems[letter] != undefined) {
            if (this.letterItems[letter].length) {
                var letterItemsLength = 0;
                for(var l = 0; l < this.letterItems[letter].length; l++){
                    var letterLength = this.letterItems[letter][l].name.length;
                    if(letterLength > maxCharLength){
                        letterItemsLength += 2;
                    } else {
                        letterItemsLength++;
                    }
                }

                var count = Math.min(letterItemsLength, this.maxItems);
                
                var itemsPerColumn = count / this.letterColCount;
                
                if(itemsPerColumn > this.chunksBreakCount * 2) {
                    this.listBreakCount = this.chunksBreakCount * 3;
                } else if (itemsPerColumn > this.chunksBreakCount) {
                    this.listBreakCount = this.chunksBreakCount * 2;
                } else {
                    this.listBreakCount = this.chunksBreakCount;
                }

                var s = "";
                var div = document.createElement("div");
                var ul = document.createElement("ul");
                var j = 0; var k = 0; var colLineCount = 0;
                var groups = Math.ceil(count/this.letterColCount);
                var limit = Math.max(Math.ceil(count/this.letterColCount), this.listBreakCount);
                if (groups<this.letterColCount) limit = this.listBreakCount;
                else if (groups <= 2 * this.letterColCount) limit = 2 * this.listBreakCount;
                else  limit = 3 * this.listBreakCount;
                var totalLineCount = 0;
                for (var i = 0; i < this.letterItems[letter].length; i++) {
                        if (colLineCount > 0 && colLineCount >= this.chunksBreakCount) {
                            div.appendChild(ul);                            
                            ul = document.createElement("ul");
                            if(j >= this.listBreakCount) {
                                this.letterList.appendChild(div);
                                div = document.createElement("div");
                                j = 0;
                            }
                            colLineCount = 0;
                        }

                    var a = document.createElement("a");
                    a.href = "#";
                    a.innerHTML = this.letterItems[letter][i].name;
                    a.href = this.letterItems[letter][i].url;
                    if (this.letterItems[letter][i].emphasis == "true") Element.addClassName(a, "emphasis");
                    var li = document.createElement("li");
                    if (j > 0 && j >= this.listBreakCount) li.className = "break";
                    li.appendChild(a);
                    ul.appendChild(li);
                    var letterLength = this.letterItems[letter][i].name.length;
                    if(letterLength > maxCharLength){
                        totalLineCount += 2;
                        j += 2;
                        colLineCount += 2
                    } else {
                        totalLineCount++;
                        j++;
                        colLineCount++;
                    }

                    if(totalLineCount >= this.maxItems) break;

            }
            ul.className = div.className = "last";
            div.appendChild(ul);
            this.letterList.appendChild(div);
            k++;
            this.letterList.childNodes[0].setAttribute("cols",k);
            if (count < this.letterItems[letter].length) this.letterList.childNodes[0].setAttribute(this.seeAllText,"true");
            abcNav.letterHTML[letter] = abcNav.letterList.innerHTML;
        } else {
                abcNav.letterHTML[letter] = "";
            }
        } else {
            abcNav.letterHTML[letter] = "";
        }
    }

};

//compare for Safari
function  removeCompare(){

var b3 = document.getElementById("clrCompare");
if (b3.addEventListener)
b3.addEventListener("click",eH,false );
else if (b3.attachEvent) 
        {
        b3.attachEvent("onclick", eH);
        }       
}

function eH(){
document.getElementById("compareContainer").className= "colHide";

}


//retrieve password container
function changeClass(a,b ){
document.getElementById(a).className= b;
}




function displayFlyout(a, el){

    var letter = a.innerHTML; 
        var item = a.parentNode; 
        Element.addClassName(a, "active");
        if (abcNav.activeLetter && abcNav.activeLetter != a) {
            Element.removeClassName(abcNav.activeLetter, "active");
            if (abcNav.mouseoutTimer) {window.clearTimeout(abcNav.mouseoutTimer); abcNav.mouseoutTimer = null;}
        }
        abcNav.activeLetter = a;
        if (abcNav.letterHTML[letter] == undefined) {
            try { 
                abcNav.buildLetterHTML(letter);
            } catch (e) {
                // TO-DO: Handle exceptions here
            }
        }
        if (abcNav.letterHTML[letter] != "") { 
            abcNav.letterList.innerHTML = abcNav.letterHTML[letter];
            abcNav.letterContainer.style.display = "block";
            abcNav.letterList.style.height = "auto";
            abcNav.seeAllDiv.style.display = "none";
            if (abcNav.letterList.innerHTML.toLowerCase().indexOf(abcNav.seeAllText.toLowerCase()) != -1) {
                abcNav.seeAllDiv.style.display = "block";
                abcNav.letterList.style.height = abcNav.maxHeight + "px";
                //abcNav.seeAllDiv.style.top = Element.getDimensions(abcNav.letterList).height - Element.getDimensions(abcNav.seeAllDiv).height + "px";
                                        
                abcNav.seeAllLink.href=a.href;

            }
            if (abcNav.letterList.innerHTML.toLowerCase().indexOf("cols") != -1) {
                abcNav.letterList.className = "col"+abcNav.letterList.childNodes[0].getAttribute("cols");
            }

            /* position 'caret' indicator - stay at V for all following letters */
            if (!el) el = item;  
            abcNav.letterPointer.style.left = Math.round(el.offsetLeft + el.offsetWidth - 55) + "px";
            //alert(el.offsetLeft + " " + el.offsetWidth);
        } else {
            abcNav.letterContainer.style.display = "none"; 
        }
        /* IE hide drop menu */
            if(document.getElementById("sortby"))
        {
            var temp= document.getElementById("sortby");
            temp.style.visibility= "hidden";
        }
}


