/*  A to Z Scroll
 *  (c) 2010 Vinh Do <vdo@esolutionsgroup.ca>
 *
 *  09/22/2010
 *
 *  _height: height of container
 *  _width: width of container
 *  _speed: the scrolling speed
 *  _margin: not really margin, just use for calculating edge and stuff
 *  _padding: padding for trigger anchor tags
 *  _trigger: enable and disable trigger
 *  _location: location of trigger (top or bottom)
 *  _id: the id for creating classes (probably will never change)
 *  _url: the url to use for the all tag in trigger (all only show up when there's a url)
 *  _reverse: reverse the direction of the scroll (some say the scrolling is wrong, LOL)
 *  _source: JSON data source (primary source of data, will override _data)
 *  _data: array data source (secondary source of data)
 *  _itemPerColumn: number of items per unorder list
 */
(function($) {
    $.fn.get_atoz = function(p) {

        var p = p || {};

        var _source = p && (p.source != null) ? p.source : "",
			_headerTag = p && (p.headerTag != null) ? p.headerTag : "h3",
			_anchorId = p && (p.anchorId != null) ? p.anchorId : "anchor",
			_scrollClass = p && (p.scrollClass != null) ? p.scrollClass : "scroll",
			_pageTitle = p && (p.pageTitle != null) ? p.pageTitle : "A to Z Index",
			_animateScroll = p && (p.animateScroll != null) ? p.animateScroll : false,
			_scrollSpeed = p && (p.scrollSpeed != null) ? p.scrollSpeed : 500,
			_enableBackToTop = p && (p.enableBackToTop != null) ? p.enableBackToTop : false,
			_backToTopText = p && (p.backToTopText != null) ? p.backToTopText : "[back to top]";
            _containsMultiple = p && (p.containsMultiple != null) ? p.containsMultiple : false;

        var container = $(this);

        $.ajax({
            url: _source,
            async: false,
            dataType: 'json',
            success: function(data) {
                LoadContent(data);
                if (_animateScroll) {
                    AnimateScroll();
                }
            }

        });

        function LoadContent(data) {
            var item = $(document.createElement("a")),
                list = $(document.createElement("ul")),
                listClone = list.clone(),
                otherClone = list.clone(),
                header = "";
                
            container.empty();
            //container.append($(document.createElement("h1")).append(_pageTitle).addClass("azListHeader"));

            var pagination = document.createElement("div");
            pagination.id = 'pagination';
            var showOther = false;
            var trigger = $(document.createElement("ul"));
            var alphaArray = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#"];
                   
            // Creating "A to Z links"
            $.each(alphaArray, function() {
                var tempThis = this;
                if (this == "#") tempThis = "Other";              
                trigger.append($(document.createElement("li")).append(item.clone().attr("href", "#" + _anchorId + tempThis).attr("linkIdentifier", _anchorId + tempThis).addClass(_scrollClass).append(this.toString())));
            });
    
            trigger.children("a:first").addClass("first");
            trigger.children("a:last").addClass("last");

            // Add Alpha headings to container
            $(pagination).append(trigger);         
            container.append(pagination);
            
            //object structure:
            //Array of Service objects
            //  Service             -service name
            //  Urls                -array of urls
            //      Municipality    -municipality name
            //      Url             -url 

            var counter = 0;
            var commonbox = document.createElement("div");
            $(commonbox).addClass('commonbox');
                
            $.each(data, function(index) {
                //Creation of the link
                if (_containsMultiple) {
                    
                    var itemClone = $("<div />");
                    itemClone.append($("<span />"));
                    itemClone.append($("<ul class=\"azItemInnerUl\" />"));
                    itemClone.find("span").attr("class", "multiMunicipalService").append(this.Service);

                    var ulthingy = itemClone.find("ul");
                    $.each(this.Urls, function() {
                        var municipalityItem = item.clone();

                        municipalityItem.attr("href", this.Url != "" ? this.Url : "#").attr("title", this.Municipality).append(this.Municipality);
                        if (this.NewWindow) {
                            municipalityItem.attr("target", "_blank");
                        }
                        ulthingy.append($("<li />").append(municipalityItem));
                    });
                } else {
                    var itemClone = item.clone();

                    itemClone.attr("href", this.Urls[0].Url != "" ? this.Urls[0].Url : "#").attr("title", this.Service).append(this.Service);
                    if (this.Urls[0].NewWindow) {
                        itemClone.attr("target", "_blank");
                    }
                }
                       
                // A, B, C ...# headings
                if (header != (this.Service.substring(0, 1)).toUpperCase()) {
                          
                    if (header != "") {
                          
                        if (!listClone.is(":empty")) {
                            
                            counter ++;
                            
                            if (_enableBackToTop) {
                                itemHeader.append(item.clone().attr("href", "#" + container.attr("id")).addClass(_scrollClass).css("padding-left", "25px").append(_backToTopText));
                            }
                        
                            var commonbox_inner = document.createElement("div");
                            $(commonbox_inner).addClass('commonbox_inner');
                                                  
                            $(commonbox_inner).append($(document.createElement("span")).addClass("big").append(item.clone().addClass(_scrollClass).attr("id", _anchorId + header).attr("name", _anchorId + header).append(header)));
                            $(commonbox_inner).append(listClone);
                        
                            if((counter % 2) == 0)
                            {
                                $(commonbox).append(commonbox_inner);
                                $(container).append(commonbox); 
                                
                                commonbox = document.createElement("div");
                                $(commonbox).addClass("commonbox");
                                
                            }
                            else
                            {
                                // add innter div to parent div
                                $(commonbox).append(commonbox_inner);
                            }
                           
                        }
                        listClone = list.clone();
                       
                    }
                    header = this.Service.substring(0, 1).toUpperCase();
                   
                }
                
                
                // Letter or Numbers
                if ($.inArray(this.Service.substring(0, 1).toUpperCase(), alphaArray) >= 0) {
                    listClone.append($(document.createElement("li")).append(itemClone));
                }
                else {
                    showOther = true;
                    otherClone.append($(document.createElement("li")).append(itemClone));                  
                }
            });
            
            var itemHeader = $(document.createElement(_headerTag)).append($(document.createElement("a")).attr("id", _anchorId + header).attr("title", _anchorId + header).attr("href", "#" + _anchorId + header).addClass(_scrollClass).append(header));
            if (_enableBackToTop) {
                itemHeader.append(item.clone().attr("href", "#" + container.attr("id")).addClass(_scrollClass).css("padding-left", "25px").append(_backToTopText));
            }
           
            // add the last group of items
            var commonbox_inner = document.createElement("div");
            $(commonbox_inner).addClass('commonbox_inner');
            $(commonbox_inner).append($(document.createElement("span")).addClass("big").append(item.clone().addClass(_scrollClass).attr("id", _anchorId + header).attr("name", _anchorId + header).append(header)));
            $(commonbox_inner).append(listClone);
            
            $(commonbox).append(commonbox_inner);
            $(container).append(commonbox);

            itemHeader = $(document.createElement(_headerTag)).append($(document.createElement("a")).attr("id", _anchorId + "Other").attr("title", _anchorId + "Other").attr("href", "#" + _anchorId + "Other").addClass(_scrollClass).append("#").hide());
            if (_enableBackToTop) {
                itemHeader.append(item.clone().attr("href", "#" + container.attr("id")).addClass(_scrollClass).css("padding-left", "25px").append(_backToTopText));
            }
            
            if (showOther){
                var commonbox_inner = document.createElement("div");
                $(commonbox_inner).addClass('commonbox_inner');
                $(commonbox_inner).append($(document.createElement("span")).addClass("big").append(item.clone().attr("id", _anchorId + "Other").attr("name", _anchorId + "Other").append("#")));
                $(commonbox_inner).append(otherClone);        
                
                var lastdiv = $(".commonbox").last();
                if(lastdiv.children("div").length == 1){
                    $(lastdiv).append(commonbox_inner);
                }
                else{
                    commonbox = document.createElement("div");
                    $(commonbox).addClass("commonbox");
                    $(commonbox).append(commonbox_inner);
                    $(container).append(commonbox); 
                }
            }
        }

        function AnimateScroll() {
            $("." + _scrollClass).click(function(event) {
                // exit if anchor Id doesn't exist
                var exists = $('#' + $(this).attr("linkIdentifier"));
                if (exists.length == 0)
                    return false;

                //prevent the default action for the click event
                event.preventDefault();

                //get the full url - like mysitecom/index.htm#home
                var full_url = this.href;

                //split the url by # and get the anchor target name - home in mysitecom/index.htm#home
                var parts = full_url.split("#");
                var trgt = parts[1];

                //get the top offset of the target anchor
                var target_offset = jQuery("#" + trgt).offset();
                var target_top = target_offset.top;

                //goto that anchor by setting the body scroll top to anchor top
                $('html, body').animate({ scrollTop: target_top }, _scrollSpeed);
            });
        }
    };

    
})(jQuery);
