/*!
* jquery.resize.js 0.0.1 - https://github.com/yckart/jquery.resize.js
* Resize-event for DOM-Nodes
*
* @see http://workingdraft.de/113/
* @see http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/
*
* Copyright (c) 2013 Yannick Albert (http://yckart.com)
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php).
* 2013/04/01
*/
(function(factory) {
if(typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if(typeof exports === 'object') {
// Node/CommonJS style for Browserify
module.exports = factory;
} else {
// Browser globals
factory(jQuery);
}
}(function($) {
function addFlowListener(element, type, fn) {
var flow = type == 'over';
element.addEventListener('OverflowEvent' in window ? 'overflowchanged' : type + 'flow', function(e) {
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))) {
e.flow = type;
return fn.call(this, e);
}
}, false);
};
function fireEvent(element, type, data, options) {
var options = options || {},
event = document.createEvent('Event');
event.initEvent(type, 'bubbles' in options ? options.bubbles : true, 'cancelable' in options ? options.cancelable : true);
for(var z in data) event[z] = data[z];
element.dispatchEvent(event);
};
$.event.special.resize = {
setup: function() {
var element = this;
var resize = 'onresize' in element;
if(!resize && !element._resizeSensor) {
var sensor = element._resizeSensor = document.createElement('div');
sensor.className = 'resize-sensor';
sensor.innerHTML = '
';
var x = 0,
y = 0,
first = sensor.firstElementChild.firstChild,
last = sensor.lastElementChild.firstChild,
matchFlow = function(event) {
var change = false,
width = element.offsetWidth;
if(x != width) {
first.style.width = width - 1 + 'px';
last.style.width = width + 1 + 'px';
change = true;
x = width;
}
var height = element.offsetHeight;
if(y != height) {
first.style.height = height - 1 + 'px';
last.style.height = height + 1 + 'px';
change = true;
y = height;
}
if(change && event.currentTarget != element) fireEvent(element, 'resize');
};
if(getComputedStyle(element).position == 'static') {
element.style.position = 'relative';
element._resizeSensor._resetPosition = true;
}
addFlowListener(sensor, 'over', matchFlow);
addFlowListener(sensor, 'under', matchFlow);
addFlowListener(sensor.firstElementChild, 'over', matchFlow);
addFlowListener(sensor.lastElementChild, 'under', matchFlow);
element.appendChild(sensor);
matchFlow({});
}
var events = element._flowEvents || (element._flowEvents = []);
if(events.indexOf(handler) == -1) events.push(handler);
if(!resize) element.addEventListener('resize', handler, false);
element.onresize = function(e) {
events.forEach(function(fn) {
fn.call(element, e);
});
};
},
teardown: function() {
var element = this;
var index = element._flowEvents.indexOf(handler);
if(index > -1) element._flowEvents.splice(index, 1);
if(!element._flowEvents.length) {
var sensor = element._resizeSensor;
if(sensor) {
element.removeChild(sensor);
if(sensor._resetPosition) element.style.position = 'static';
delete element._resizeSensor;
}
if('onresize' in element) element.onresize = null;
delete element._flowEvents;
}
element.removeEventListener('resize', handler);
}
};
$.fn.extend({
resize: function(fn) {
return fn ? this.bind("resize", fn) : this.trigger("resize");
},
unresize: function(fn) {
return this.unbind("resize", fn);
}
});
function handler(event) {
var orgEvent = event || window.event,
args = [].slice.call(arguments, 1);
event = $.event.fix(orgEvent);
event.type = "resize";
// Add event to the front of the arguments
args.unshift(event);
return($.event.dispatch || $.event.handle).apply(this, args);
}
}));