/*! Icinga Web 2 | (c) 2014 Icinga Development Team | GPLv2+ */

/* IE11 Polyfills */

if (window.NodeList && !NodeList.prototype.forEach) {
    NodeList.prototype.forEach = Array.prototype.forEach;
}

/* jQuery Plugins */
(function ($) {

    'use strict';

    /* Get data value or default */
    $.fn.getData = function (name, fallback) {
        var value = this.data(name);
        if (typeof value !== 'undefined') {
            return value;
        }

        return fallback;
    };

    /* Whether a HTML tag has a specific attribute */
    $.fn.hasAttr = function(name) {
        // We have inconsistent behaviour across browsers (false VS undef)
        var val = this.attr(name);
        return typeof val !== 'undefined' && val !== false;
    };

    /* Get class list */
    $.fn.classes = function (callback) {

        var classes = [];

        $.each(this, function (i, el) {
            var c = $(el).attr('class');
            if (typeof c === 'string') {
                $.each(c.split(/\s+/), function(i, p) {
                    if (classes.indexOf(p) === -1) {
                        classes.push(p);
                    }
                });
            }
        });

        if (typeof callback === 'function') {
            for (var i in classes) {
                if (classes.hasOwnProperty(i)) {
                    callback(classes[i]);
                }
            }
        }

        return classes;
    };

    /* Serialize form elements to an object */
    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };

    $.fn.offsetTopRelativeTo = function($ancestor) {
        if (typeof $ancestor === 'undefined') {
            return false;
        }

        var el = this[0];
        var offset = el.offsetTop;
        var $parent = $(el.offsetParent);

        if ($parent.is('body') || $parent.is($ancestor)) {
            return offset;
        }

        if (el.tagName === 'TR') {
            // TODO: Didn't found a better way, this will probably break sooner or later
            return $parent.offsetTopRelativeTo($ancestor);
        }

        return offset + $parent.offsetTopRelativeTo($ancestor);
    };

})(jQuery);
