Initial OpenECOMP policy/engine commit
[policy/engine.git] / ecomp-sdk-app / src / main / webapp / static / fusion / js / jquery.resize.js
1 /*!
2  * jquery.resize.js 0.0.1 - https://github.com/yckart/jquery.resize.js
3  * Resize-event for DOM-Nodes
4  *
5  * @see http://workingdraft.de/113/
6  * @see http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/
7  *
8  * Copyright (c) 2013 Yannick Albert (http://yckart.com)
9  * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php).
10  * 2013/04/01
11  */
12
13 (function(factory) {
14     if(typeof define === 'function' && define.amd) {
15         // AMD. Register as an anonymous module.
16         define(['jquery'], factory);
17     } else if(typeof exports === 'object') {
18         // Node/CommonJS style for Browserify
19         module.exports = factory;
20     } else {
21         // Browser globals
22         factory(jQuery);
23     }
24 }(function($) {
25
26     function addFlowListener(element, type, fn) {
27         var flow = type == 'over';
28         element.addEventListener('OverflowEvent' in window ? 'overflowchanged' : type + 'flow', function(e) {
29             if(e.type == (type + 'flow') || ((e.orient == 0 && e.horizontalOverflow == flow) || (e.orient == 1 && e.verticalOverflow == flow) || (e.orient == 2 && e.horizontalOverflow == flow && e.verticalOverflow == flow))) {
30                 e.flow = type;
31                 return fn.call(this, e);
32             }
33         }, false);
34     };
35
36     function fireEvent(element, type, data, options) {
37         var options = options || {},
38             event = document.createEvent('Event');
39         event.initEvent(type, 'bubbles' in options ? options.bubbles : true, 'cancelable' in options ? options.cancelable : true);
40         for(var z in data) event[z] = data[z];
41         element.dispatchEvent(event);
42     };
43
44     $.event.special.resize = {
45         setup: function() {
46             var element = this;
47             var resize = 'onresize' in element;
48             if(!resize && !element._resizeSensor) {
49                 var sensor = element._resizeSensor = document.createElement('div');
50                 sensor.className = 'resize-sensor';
51                 sensor.innerHTML = '<div class="resize-overflow"><div></div></div><div class="resize-underflow"><div></div></div>';
52
53                 var x = 0,
54                     y = 0,
55                     first = sensor.firstElementChild.firstChild,
56                     last = sensor.lastElementChild.firstChild,
57                     matchFlow = function(event) {
58                         var change = false,
59                             width = element.offsetWidth;
60                         if(x != width) {
61                             first.style.width = width - 1 + 'px';
62                             last.style.width = width + 1 + 'px';
63                             change = true;
64                             x = width;
65                         }
66                         var height = element.offsetHeight;
67                         if(y != height) {
68                             first.style.height = height - 1 + 'px';
69                             last.style.height = height + 1 + 'px';
70                             change = true;
71                             y = height;
72                         }
73                         if(change && event.currentTarget != element) fireEvent(element, 'resize');
74                     };
75
76                 if(getComputedStyle(element).position == 'static') {
77                     element.style.position = 'relative';
78                     element._resizeSensor._resetPosition = true;
79                 }
80                 addFlowListener(sensor, 'over', matchFlow);
81                 addFlowListener(sensor, 'under', matchFlow);
82                 addFlowListener(sensor.firstElementChild, 'over', matchFlow);
83                 addFlowListener(sensor.lastElementChild, 'under', matchFlow);
84                 element.appendChild(sensor);
85                 matchFlow({});
86             }
87             var events = element._flowEvents || (element._flowEvents = []);
88             if(events.indexOf(handler) == -1) events.push(handler);
89             if(!resize) element.addEventListener('resize', handler, false);
90             element.onresize = function(e) {
91                 events.forEach(function(fn) {
92                     fn.call(element, e);
93                 });
94             };
95         },
96
97         teardown: function() {
98             var element = this;
99             var index = element._flowEvents.indexOf(handler);
100             if(index > -1) element._flowEvents.splice(index, 1);
101             if(!element._flowEvents.length) {
102                 var sensor = element._resizeSensor;
103                 if(sensor) {
104                     element.removeChild(sensor);
105                     if(sensor._resetPosition) element.style.position = 'static';
106                     delete element._resizeSensor;
107                 }
108                 if('onresize' in element) element.onresize = null;
109                 delete element._flowEvents;
110             }
111             element.removeEventListener('resize', handler);
112         }
113     };
114
115     $.fn.extend({
116         resize: function(fn) {
117             return fn ? this.bind("resize", fn) : this.trigger("resize");
118         },
119
120         unresize: function(fn) {
121             return this.unbind("resize", fn);
122         }
123     });
124
125
126     function handler(event) {
127         var orgEvent = event || window.event,
128             args = [].slice.call(arguments, 1);
129
130         event = $.event.fix(orgEvent);
131         event.type = "resize";
132
133         // Add event to the front of the arguments
134         args.unshift(event);
135
136         return($.event.dispatch || $.event.handle).apply(this, args);
137     }
138
139 }));