/*!
* MRM Accordion jQuery plugin
* dependencies: effects.core.js, jquery-1.3.2.js
*    <ul class="accordion">
*        <li>
*            <h3><a href="#a">Header</a></h3>
*            <div>
*                Content
*            </div>
*        </li>
*    </ul>
*/
$.fn.accordion = function(options, loadCallback) {
    //default settings
    var defaults = {
        jQueryUIeffectsCorePath: 'js/effects.core.js',
        ajaxLoader: 'images/ajax-loader.gif',
        linkClass: 'accordionLink',
        ajaxContentSelector: '#accordionContent',
        ajaxLoaderStyle: 'position:absolute;text-align:right;padding:5px 10px 0 0;top:0;right:0;font-size:3em;line-height:1.6',
        ajaxLoaderClass: 'ajaxLoader',
        ajaxLoaderId: 'ajaxLoaderAnim',
        //temporary spacer layers
        mainSpacerLayer: 'accordionSpacer',
        slideSpacerlayer: 'slideUpSpacer'
    };

    var opts = $.extend(defaults, options);

    var _accordion = $(this);
    var _accordionTrigger = (opts.accordionTriggerClass) ? $("" + opts.accordionTriggerClass) : null;

    //    $.getScript(opts.jQueryUIeffectsCorePath, function() { });

    return this.each(function() {
        //Check if the html element already converted to accordion
        if ($(this).data('accordiated')) { return false; }

        //Find all content layers and hide them
        $.each($(this).find('li>div'), function() {
            $(this).data("height", $(this).height());
            $(this).data('accordiated', true).hide().css({ height: 0 });
        });
        //Find links and bind onclick event
        $.each($(this).find('a'), function() {
            $(this).addClass(opts.linkClass).click(function() {
                //Open accordion
                activate(this);
                return false;
            });
        });

        var active = false;
        //Open accordion layer if li element where the class contains the 'current' element 

        if ($(this).find('li.open')) {
            active = $(this).find('li.open a')[0];
        }

        //Create, destroy spacing layers
        var spacerLayer = function(id) {
            var _id = id;
            this.create = function() {
                if ($("#" + id).length == 0) {
                    $("body").append("<div id='" + id + "'></div>");
                }
            }
            this.destroy = function() {
                if ($("#" + id).length != 0) {
                    $("#" + id).remove();
                }
            }
        }

        //create the spacer layer - fix for FF
        var _mainSpacer = new spacerLayer(opts.mainSpacerLayer)
        _mainSpacer.create();

        function activateEffect(el, menuPos) {
            var contentLayer = $(el).parent().siblings('div');

            //Hide all content layers, scroll to the container li element
            var _slideUpSpacer = new spacerLayer(opts.slideSpacerlayer);
            _slideUpSpacer.create();

            var visibleLayers = $(el).parents('li').siblings().children('div:visible');
            $("#" + opts.slideSpacerlayer).css({ height: visibleLayers.height() });

            visibleLayers.stop().animate({ height: 0 }, { duration: 300, complete: function() { $(this).hide(); $("#" + opts.slideSpacerlayer).animate({ height: 0 }, { duration: 200 }); } });
            $(el).parents("li").addClass("open").siblings().removeClass("open");

            //Hide content Layer if it's shown, show if it's hidden
            $("#" + opts.mainSpacerLayer).css({ height: contentLayer.data("height") });
            if (contentLayer.is(":hidden")) {
                contentLayer.show().stop().animate({ height: contentLayer.data("height") }, { duration: 800, complete: function() {
                    $("#" + opts.mainSpacerLayer).animate({ height: 0 }, { duration: 200, complete: function() {
                        $.scrollTo(contentLayer.parent(), 400);
                    }
                    });
                }
                });
            } else {
                contentLayer.stop().animate({ height: 0 }, { duration: 300, complete: function() {
                    $(this).hide();
                    $("#" + opts.mainSpacerLayer).animate({ height: 0 }, { duration: 200, complete: function() {
                        if (menuPos == "top") { $.scrollTo(contentLayer.parent(), 400); }
                    }
                    });
                }
                });
            }
        }

        var activate = function(el, menuPos) {

            var contentSelector = " " + opts.ajaxContentSelector;
            //Check if the link is a same page anchor, if it isn't concatenate the contentSelector to the href attribute
            var href = ($(el).attr("href").substr(0, 1) == "#") ? null : $(el).attr("href") + contentSelector;
            var contentLayer = $(el).parent().siblings('div');
            if (contentLayer.find(opts.ajaxContentSelector).length > 0) { contentLayer.data("loaded", true); }

            //Load external content if it's not loaded already
            if (typeof (contentLayer.data("loaded")) != "boolean" && href != null) {
                $(opts.ajaxContentSelector).removeAttr("id");

                //check if there is content in the content layer, if it's empty add loader animation
                $(el).parent().after('<div id="ajaxLoaderAnim" class="' + opts.ajaxLoaderClass + '">&nbsp;<img src="' + opts.ajaxLoader + '" alt="Loading..." /></div>');

                //Loads the content from an external file
                contentLayer.load(href, { ajax: 1 }, function(responseText, textStatus, XMLHttpRequest) {

                    //external function - changes the title and description metadata of the parent page
                    MRM.titleMetaChanger(responseText);
                    contentLayer.data("docTitle", document.title);

                    if (textStatus == "error") {
                        alert("Error while loading content. Please try again");
                        return false;
                    }
                    $("#" + opts.ajaxLoaderId).remove();
                    var _contentLayer = $(this).find(opts.ajaxContentSelector);
                    _contentLayer.parent().data("height", _contentLayer.parent().css({ height: 'auto' }).height());
                    _contentLayer.parent().css({ height: '0' });
                    _contentLayer.removeAttr("id");
                    contentLayer.data("loaded", true);
                    activateEffect(el, menuPos);
                    if (typeof (loadCallback) == "function") {
                        loadCallback();
                    }
                });
            } else if (contentLayer.data("loaded") != "boolean" && href == null && contentLayer.find(opts.ajaxContentSelector).length == 0) {
                //Assign loaded flag to the content Layer
                contentLayer.data("loaded", true);
                contentLayer.data("docTitle", document.title);
                activateEffect(el, menuPos);
            } //callback after page loaded and id defined 
            else if (contentLayer.find(opts.ajaxContentSelector).length > 0 && contentLayer.data("loaded") != "boolean") {
                activateEffect(el, menuPos);
                if (typeof (loadCallback) == "function") {
                    loadCallback();
                }
            }
            else {
                if (typeof (contentLayer.data("docTitle")) != "undefined") {
                    document.title = contentLayer.data("docTitle");
                }
                activateEffect(el, menuPos);
            }
        }
        //if secondary accordion trigger initialized: attach onclick events and open corresponding accordion layer
        if (_accordionTrigger) {
            _accordionTrigger.each(function() {
                $.each($(this).find('a'), function() {
                    $(this).click(function() {
                        var _mainAccordionLink = _accordion.find("a[href=" + $(this).attr("href") + "]");
                        activate(_mainAccordionLink, "top");
                        return false;
                    });
                });
            });
        }

        //Open accordion menu is 'active' variable has a value
        if (active) {
            activate(active);
            $(active).parents().show();
        }
    });
};