(function ($) {

    "use strict";

    if (!$.wpg) {
        $.wpg = {}; // New Object
    }

    $.wpg.OffCanvasNav = function (el, options) {

        // Based on some amazeball code by David Bushell http://dbushell.com

        // Avoid scope issues, use 'base' instead of 'this' to reference this class from internal events and functions.
        var base = this;

        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el;

        // Add a reverse reference to the DOM object
        base.$el.data("wpg.OffCanvasNav", base);

        base.init = function () {

            // Responsive nav not supported in older versions of IE
            if ($('.ie7').length || $('.ie8').length) {
                return;
            }

            // Merge set options with defaults
            base.options = $.extend({}, $.wpg.OffCanvasNav.defaultOptions, options);

            base.options.inner = document.getElementById('base.options.inner-wrap');
            base.options.nav_open = false;
            base.options.nav_class = 'wpg-ocn';


            base.options.transform_prop = window.Modernizr.prefixed('transform');
            base.options.transition_prop = window.Modernizr.prefixed('transition');

            base.options.transition_end = (function() {
                var props = {
                    'WebkitTransition' : 'webkitTransitionEnd',
                    'MozTransition'    : 'transitionend',
                    'OTransition'      : 'oTransitionEnd otransitionend',
                    'msTransition'     : 'MSTransitionEnd',
                    'transition'       : 'transitionend'
                };
                return props.hasOwnProperty(base.options.transition_prop) ? props[base.options.transition_prop] : false;
            })();

            $('.wpg-ocn-toggle').bind('click', function() {
                base.toggleNav();
            });

            document.addEventListener('click', function(e) {

                if ((base.options.nav_open
                    && $(e.target).parents('#wpg-nav').length == 0)
                    && !$(e.target).is("#wpg-nav")
                    && !$(e.target).is('.toggle-cip-collapsed-navbar')) {
                    e.preventDefault();
                    base.closeNav();
                }
            },
            true);

            $('html').addClass('wpg-js-ready');

        };

        base.closeNav = function() {
            if (base.options.nav_open) {
                base.closeNavEnd(null);
            }
            $('html').removeClass(base.options.nav_class);
        };

        base.closeNavEnd = function(e) {
            if (e && e.target === base.options.inner) {
                document.removeEventListener(base.options.transition_end, base.closeNavEnd, false);
            }
            base.options.nav_open = false;
            $("button").attr("aria-expanded", "false");
        };

        base.openNav = function() {
            if (base.options.nav_open) {
                return;
            }
            $('html').addClass(base.options.nav_class);
            base.options.nav_open = true;
            $("button").attr("aria-expanded", "true");
        };

        base.toggleNav = function(e) {
            if (base.options.nav_open && $('html').hasClass(base.options.nav_class)) {
                base.closeNav();
            } else {
                base.openNav();
            }
            if (e) {
                e.preventDefault();
            }
        };

        // Run initializer
        base.init();
    };

    // Define plugin defaults
    $.wpg.OffCanvasNav.defaultOptions = {};

    $.fn.wpg_OffCanvasNav = function (options) {
        return this.each(function () {
            var fW = new $.wpg.OffCanvasNav(this, options);
        });
    };

    // This function breaks the chain, but returns the wpg.OffCanvasNav if it has been attached to the object.
    $.fn.getwpg_OffCanvasNav = function () {
        this.data("wpg.OffCanvasNav");
    };

}(jQuery));
