+
+function array_diff(a1, a2)
+{\r
+ var a=[], diff=[];\r
+ for(var i=0;i<a1.length;i++)\r
+ a[a1[i]]=true;\r
+ for(var i=0;i<a2.length;i++)\r
+ if(a[a2[i]]) delete a[a2[i]];\r
+ else a[a2[i]]=true;\r
+ for(var k in a)\r
+ diff.push(k);\r
+ return diff;\r
+}
+
+function array_subtract(a1, a2)
+{
+ result=[]
+ for (index in a1) {
+ value = a1[index];
+ if (!$.inArray(value, a2) >= 0) {
+ result.push(value);
+ }
+ }
+ return result;
+}
+
+function array_same_elements(arr1, arr2)
+{
+ // return true if arrays have same elements, even if order is different
+ return ($(arr1).not(arr2).length == 0 && $(arr2).not(arr1).length == 0);
+}
+
+function array_pair_lookup(x, names, values)
+{
+ for (index in values) {
+ if (values[index] == x) {
+ return names[index];
+ }
+ }
+ return "object #" + x;
+}
+
+function all_options(selector) {
+ el = $(selector);
+ result = [];
+ _.each(el.find("option"), function(option) {
+ result.push($(option).val());
+ });
+ return result;
+}
+
+function make_same_width(containerSelector, itemSelector) {
+ var maxWidth = 0;
+ $(containerSelector).find(itemSelector).each( function(index) { maxWidth = Math.max(maxWidth, $(this).width()); });\r
+ console.log(maxWidth);\r
+ $(containerSelector).find(itemSelector).each( function(index) { $(this).width(maxWidth); });
+}