/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

/* global varienAccordion, varienLoader, Cookie */
/* eslint-disable strict */
define([
    'prototype'
], function () {
    window.varienAccordion = new Class.create(); //eslint-disable-line
    varienAccordion.prototype = {
        /**
         * @param {*} containerId
         * @param {*} activeOnlyOne
         */
        initialize: function (containerId, activeOnlyOne) {
            var links, i;

            this.containerId = containerId;
            this.activeOnlyOne = activeOnlyOne || false;
            this.container = $(this.containerId);
            this.items = $$('#' + this.containerId + ' dt');
            this.loader = new varienLoader(true); //jscs:ignore requireCapitalizedConstructors

            links = $$('#' + this.containerId + ' dt a');

            for (i in links) {
                if (links[i].href) {
                    Event.observe(links[i], 'click', this.clickItem.bind(this));
                    this.items[i].dd = this.items[i].next('dd');
                    this.items[i].link = links[i];
                }
            }

            this.initFromCookie();
        },

        /**
         * Init from cookie.
         */
        initFromCookie: function () {
            var activeItemId, visibility;

            if (this.activeOnlyOne &&
                (activeItemId = Cookie.read(this.cookiePrefix() + 'active-item')) !== null) {
                this.hideAllItems();
                this.showItem(this.getItemById(activeItemId));
            } else if (!this.activeOnlyOne) {
                this.items.each(function (item) {
                    if ((visibility = Cookie.read(this.cookiePrefix() + item.id)) !== null) {
                        if (visibility == 0) { //eslint-disable-line eqeqeq
                            this.hideItem(item);
                        } else {
                            this.showItem(item);
                        }
                    }
                }.bind(this));
            }
        },

        /**
         * @return {String}
         */
        cookiePrefix: function () {
            return 'accordion-' + this.containerId + '-';
        },

        /**
         * @param {*} itemId
         * @return {*}
         */
        getItemById: function (itemId) {
            var result = null;

            this.items.each(function (item) {
                if (item.id == itemId) { //eslint-disable-line
                    result = item;
                    throw $break;
                }
            });

            return result;
        },

        /**
         * @param {*} event
         */
        clickItem: function (event) {
            var item = Event.findElement(event, 'dt');

            if (this.activeOnlyOne) {
                this.hideAllItems();
                this.showItem(item);
                Cookie.write(this.cookiePrefix() + 'active-item', item.id, 30 * 24 * 60 * 60);
            } else {
                if (this.isItemVisible(item)) { //eslint-disable-line no-lonely-if
                    this.hideItem(item);
                    Cookie.write(this.cookiePrefix() + item.id, 0, 30 * 24 * 60 * 60);
                } else {
                    this.showItem(item);
                    Cookie.write(this.cookiePrefix() + item.id, 1, 30 * 24 * 60 * 60);
                }
            }
            Event.stop(event);
        },

        /**
         * @param {Object} item
         */
        showItem: function (item) {
            if (item && item.link) {
                if (item.link.href) {
                    this.loadContent(item);
                }

                Element.addClassName(item, 'open');
                Element.addClassName(item.dd, 'open');
            }
        },

        /**
         * @param {Object} item
         */
        hideItem: function (item) {
            Element.removeClassName(item, 'open');
            Element.removeClassName(item.dd, 'open');
        },

        /**
         * @param {*} item
         * @return {*}
         */
        isItemVisible: function (item) {
            return Element.hasClassName(item, 'open');
        },

        /**
         * @param {*} item
         */
        loadContent: function (item) {
            if (item.link.href.indexOf('#') == item.link.href.length - 1) { //eslint-disable-line eqeqeq
                return;
            }

            if (Element.hasClassName(item.link, 'ajax')) {
                this.loadingItem = item;
                this.loader.load(item.link.href, {
                    updaterId: this.loadingItem.dd.id
                }, this.setItemContent.bind(this));

                return;
            }
            location.href = item.link.href;
        },

        /**
         * @param {Object} content
         */
        setItemContent: function (content) {
            if (content.isJSON) {
                return;
            }
            this.loadingItem.dd.innerHTML = content;
        },

        /**
         * Hide all items
         */
        hideAllItems: function () {
            var i;

            for (i in this.items) {
                if (this.items[i].id) {
                    Element.removeClassName(this.items[i], 'open');
                    Element.removeClassName(this.items[i].dd, 'open');
                }
            }
        }
    };
});
