PHP Classes

File: assets/js/musclesoft-jquery-connections/jquery.connections.js

Recommend this page to a friend!
  Classes of Roman Shneer   PHP Web Application Firewall   assets/js/musclesoft-jquery-connections/jquery.connections.js   Download  
File: assets/js/musclesoft-jquery-connections/jquery.connections.js
Role: Auxiliary data
Content type: text/plain
Description: Auxiliary data
Class: PHP Web Application Firewall
Block malicious requests using a white list
Author: By
Last change:
Date: 7 years ago
Size: 6,283 bytes
 

Contents

Class file image Download
(function($) { $.fn.connections = function(options) { if (options === 'update') { return processConnections(update, this); } else if (options === 'remove') { return processConnections(destroy, this); } else { options = $.extend(true, { borderClasses: {}, 'class': 'connection', css: {}, from: this, tag: 'connection', to: this, within: ':root' }, options); connect(options); return this; } }; $.event.special.connections = { teardown: function(namespaces) { processConnections(destroy, $(this)); } } var connect = function(options) { var borderClasses = options.borderClasses; var tag = options.tag; var end1 = $(options.from); var end2 = $(options.to); var within = $(options.within); delete options.borderClasses; delete options.tag; delete options.from; delete options.to; delete options.within; within.each(function() { var container = this; var done = new Array(); end1.each(function() { var node = this; done.push(this); end2.not(done).each(function() { createConnection(container, [node, this], tag, borderClasses, options); }); }); }); }; var createConnection = function(container, nodes, tag, borderClasses, options) { var css = $.extend({ position: 'absolute' }, options.css); var connection = $('<' + tag + '/>', options).css(css); connection.appendTo(container); var border_w = (connection.outerWidth() - connection.innerWidth()) / 2; var border_h = (connection.outerHeight() - connection.innerHeight()) / 2; if (border_w <= 0 && border_h <= 0) { border_w = border_h = 1; } var data = { borderClasses: borderClasses, border_h: border_h, border_w: border_w, node_from: $(nodes[0]), node_to: $(nodes[1]), nodes_dom: nodes, css: css } if ('none' === connection.css('border-top-style')) { data.css.borderStyle = 'solid'; } $.data(connection.get(0), 'connection', data); $.data(connection.get(0), 'connections', [connection.get(0)]); for (var i = 0; i < 2; i++) { var connections = connection.add($.data(nodes[i], 'connections')).get(); $.data(nodes[i], 'connections', connections); if (connections.length == 1) { $(nodes[i]).on('connections.connections', false); } } update(connection.get(0)); }; var destroy = function(connection) { var nodes = $.data(connection, 'connection').nodes_dom; for (var i = 0; i < 2; i++) { var connections = $($.data(nodes[i], 'connections')).not(connection).get(); $.data(nodes[i], 'connections', connections); } $(connection).remove(); }; var getState = function(data) { data.rect_from = data.nodes_dom[0].getBoundingClientRect(); data.rect_to = data.nodes_dom[1].getBoundingClientRect(); var cached = data.cache; data.cache = [ data.rect_from.top, data.rect_from.right, data.rect_from.bottom, data.rect_from.left, data.rect_to.top, data.rect_to.right, data.rect_to.bottom, data.rect_to.left ]; data.hidden = (0 === (data.cache[0] | data.cache[1] | data.cache[2] | data.cache[3])) || (0 === (data.cache[4] | data.cache[5] | data.cache[6] | data.cache[7])); data.unmodified = true; if (cached === undefined) { return data.unmodified = false; } for (var i = 0; i < 8; i++) { if (cached[i] !== data.cache[i]) { return data.unmodified = false; } } } var update = function(connection) { var data = $.data(connection, 'connection'); getState(data); if (data.unmodified) { return; } var border_h = data.border_h; var border_w = data.border_w; var from_node = data.node_from; var to_node = data.node_to; var from = data.rect_from; var to = data.rect_to; var b = (from.bottom + from.top) / 2; var r = (to.left + to.right) / 2; var t = (to.bottom + to.top) / 2; var l = (from.left + from.right) / 2; var h = ['right', 'left']; if (l > r) { h = h.reverse(); var x = Math.max(r - border_w / 2, Math.min(from.right, to.right)); r = l + border_w / 2; l = x; } else { l -= border_w / 2; r = Math.min(r + border_w / 2, Math.max(from.left, to.left)); } var v = ['bottom', 'top']; if (t > b) { v = v.reverse(); var x = Math.max(b - border_h / 2, Math.min(from.bottom, to.bottom)); b = t + border_h / 2; t = x; } else { b = Math.min(b, Math.max(from.top, to.top)); t -= border_h / 2; } var width = r - l; var height = b - t; if (width < border_w) { t = Math.max(t, Math.min(from.bottom, to.bottom)); b = Math.min(b, Math.max(from.top, to.top)); l = Math.max(from.left, to.left); r = Math.min(from.right, to.right); r = l = (l + r - border_w) / 2; } if (height < border_h) { l = Math.max(l, Math.min(from.right, to.right)); r = Math.min(r, Math.max(from.left, to.left)); t = Math.max(from.top, to.top); b = Math.min(from.bottom, to.bottom); b = t = (t + b - border_h) / 2; } width = r - l; height = b - t; width <= 0 && (border_h = 0); height <= 0 && (border_w = 0); var style = 'border-' + v[0] + '-' + h[0] + '-radius: 0;' + 'border-' + v[0] + '-' + h[1] + '-radius: 0;' + 'border-' + v[1] + '-' + h[0] + '-radius: 0;'; (border_h <= 0 || border_w <= 0) && (style += 'border-' + v[1] + '-' + h[1] + '-radius: 0;'); if (data.hidden) { style += 'display: none;'; } else { data.css['border-' + v[0] + '-width'] = 0; data.css['border-' + h[0] + '-width'] = 0; data.css['border-' + v[1] + '-width'] = border_h; data.css['border-' + h[1] + '-width'] = border_w; var current_rect = connection.getBoundingClientRect(); data.css.left = connection.offsetLeft + l - current_rect.left; data.css.top = connection.offsetTop + t - current_rect.top; data.css.width = width - border_w; data.css.height = height - border_h; } var bc = data.borderClasses; $(connection). removeClass(bc[v[0]]).removeClass(bc[h[0]]). addClass(bc[v[1]]).addClass(bc[h[1]]). attr('style', style). css(data.css); } var processConnections = function(method, elements) { return elements.each(function() { var connections = $.data(this, 'connections'); if (connections instanceof Array) { for (var i = 0, len = connections.length; i < len; i++) { method(connections[i]); } } }); }; })(jQuery);