1 // misc utility functions
3 function idInArray(id, arr) {
4 // because sometimes ids are strings and sometimes they're integers
6 if (id.toString() == arr[index].toString()) {
13 function assert(outcome, description) {
15 console.log(description);
19 function templateFromId(id) {
20 return _.template($(id).html());
23 function firstCharUpper(s) {
24 return s.charAt(0).toUpperCase() + s.slice(1);
27 function toTitleCase(str)
29 return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
\r
32 function fieldNameToHumanReadable(str)
34 str = str.replace("_", " ");
35 return toTitleCase(str);
38 // http://stackoverflow.com/questions/2117320/set-maximum-displayed-rows-count-for-html-table
39 function limitTableRows(tableSelector, maxRows) {
40 var table = $(tableSelector)[0] //document.getElementById(tableId);
41 var wrapper = table.parentNode;
42 var rowsInTable = table.rows.length;
44 var border = getComputedStyle(table.rows[0].cells[0], '').getPropertyValue('border-top-width');
45 border = border.replace('px', '') * 1;
47 var border = table.rows[0].cells[0].currentStyle.borderWidth;
48 border = (border.replace('px', '') * 1) / 2;
51 if (rowsInTable > maxRows) {
52 for (var i = 0; i < maxRows; i++) {
53 height += table.rows[i].clientHeight + border;
54 //console.log("XXX " + height + " " + table.rows[i].clientHeight + " " + border);
56 wrapper.style.height = height + "px";
60 function validateField(validatorName, value, obj) {
61 if (validatorName=="notBlank") {
62 if ((value==undefined) || (value=="")) {
63 return "can not be blank";
67 // if notBlank wasn't set, and the field is blank, then we can return
68 if ((value==undefined) || (value=="")) {
72 switch (validatorName) {
74 if (! /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value)) {
75 return "must be a valid url";
83 function array_diff(a1, a2)
86 for(var i=0;i<a1.length;i++)
\r
88 for(var i=0;i<a2.length;i++)
\r
89 if(a[a2[i]]) delete a[a2[i]];
\r
96 function array_subtract(a1, a2)
101 if (!$.inArray(value, a2) >= 0) {
108 function array_same_elements(arr1, arr2)
110 // return true if arrays have same elements, even if order is different
111 return ($(arr1).not(arr2).length == 0 && $(arr2).not(arr1).length == 0);
114 function array_pair_lookup(x, names, values)
116 for (index in values) {
117 if (values[index] == x) {
121 return "object #" + x;
124 function all_options(selector) {
127 _.each(el.find("option"), function(option) {
128 result.push($(option).val());
133 function make_same_width(containerSelector, itemSelector) {
135 $(containerSelector).find(itemSelector).each( function(index) { maxWidth = Math.max(maxWidth, $(this).width()); });
\r
136 console.log(maxWidth);
\r
137 $(containerSelector).find(itemSelector).each( function(index) { $(this).width(maxWidth); });
140 function parse_portlist(ports) {
141 /* Support a list of ports in the format "protocol:port, protocol:port, ..."
145 tcp 123, tcp 124, tcp 125, udp 201, udp 202
147 User can put either a "/" or a " " between protocol and ports
148 Port ranges can be specified with "-" or ":"
150 This is a straightforward port of the code in core/models/network.py
155 parts = ports.split(",")
156 $.each(parts, function(index, part) {
158 if (part.indexOf("/")>=0) {
159 parts2 = part.split("/",2);
162 } else if (part.indexOf(" ")>=0) {
163 parts2 = part.split(" +",2);
167 throw 'malformed port specifier ' + part + ', format example: "tcp 123, tcp 201:206, udp 333"';
170 protocol = $.trim(protocol);
171 ports = $.trim(ports);
175 if (protocol!="tcp" && protocol!="udp") {
176 throw 'unknown protocol ' + protocol;
179 if (ports.indexOf("-")>=0) {
180 parts2 = ports.split("-");
181 first = parseInt($.trim(parts2[0]));
182 last = parseInt($.trim(parts2[1]));
183 portStr = first + ":" + last;
184 } else if (ports.indexOf(":")>=0) {
185 parts2 = ports.split(":");
186 first = parseInt($.trim(parts2[0]));
187 last = parseInt($.trim(parts2[1]));
188 portStr = first + ":" + last;
190 portStr = parseInt(ports).toString();
193 nats.push( {l4_protocol: protocol, l4_port: portStr} );
194 }); /* end $.each(ports) */