Add another Handlebars helper, "compare".
[mkws-moved-to-github.git] / src / mkws-filter.js
index 353fce5..0b2ea63 100644 (file)
 // Factory function for sets of filters.
 function filterSet(team) {
-    var m_team = team;
-    var m_list = [];
-
-    var that = {};
-
-    that.toJSON = function() {
-       return $.toJSON(m_list);
-    };
-
-    that.add = function(filter) {
-       m_list.push(filter);
-    };
-
-    that.visitTargets = function(callback) {
-       for (var i in m_list) {
-           var filter = m_list[i];
-           if (filter.id) {
-               callback(filter.id, filter.name);
-           }
-       }
-    };
-
-    that.visitFields = function(callback) {
-       for (var i in m_list) {
-           var filter = m_list[i];
-           if (!filter.id) {
-               callback(filter.field, filter.value);
-           }
-       }
-    };
-
-    that.removeMatching = function(matchFn) {
-       var newList = [];
-       for (var i in m_list) {
-           var filter = m_list[i];
-           if (matchFn(filter)) {
-               m_team.log("removeMatching() removing filter " + $.toJSON(filter));
-           } else {
-               m_team.log("removeMatching() keeping filter " + $.toJSON(filter));
-               newList.push(filter);
-           }
-       }
-       m_list = newList;
-    };
-
-    that.targetFiltered = function(id) {
-       for (var i = 0; i < m_list.length; i++) {
-           if (m_list[i].id === id ||
-               m_list[i].id === 'pz:id=' + id) {
-               return true;
-           }
-       }
-       return false;
-    };
-
-    that.pp2filter = function() {
-       var OLD = that.OLD_pp2filter();
-       var NEW = that.NEW_pp2filter();
-       if (OLD !== NEW) {
-           alert("pp2filter(): OLD[" + OLD + "] !== NEW[" + NEW + "]");
-       }
-       return OLD;
-    };
-
-    that.OLD_pp2filter = function() {
-       var res = "";
-
-       for (var i in m_list) {
-           var filter = m_list[i];
-           if (filter.id) {
-               if (res) res += ",";
-               if (filter.id.match(/^[a-z:]+[=~]/)) {
-                   m_team.log("filter '" + filter.id + "' already begins with SETTING OP");
-               } else {
-                   filter.id = 'pz:id=' + filter.id;
-               }
-               res += filter.id;
-           }
-       }
-
-       return res;
-    };
-
-    that.NEW_pp2filter = function() {
-       return that.OLD_pp2filter();
-    };
-
-    that.pp2limit = function(initial) {
-       var res = initial || "";
-
-       for (var i in m_list) {
-           var filter = m_list[i];
-           if (!filter.id) {
-               if (res) res += ",";
-               res += filter.field + "=" + filter.value.replace(/[\\|,]/g, '\\$&');
-           }
-       }
-
-       return res;
-    };
-
-
-    return that;
-}
+  var m_team = team;
+  var m_list = [];
+
+  var that = {};
 
+  that.toJSON = function() {
+    return mkws.$.toJSON(m_list);
+  };
 
-// Factory function for filters. These can be of several types.
-function filter(id, name, field, value) {
-    var res;
+  that.add = function(filter) {
+    m_list.push(filter);
+  };
 
-    if (id) {
-       res = { id: id, name: name };
-    } else {
-       res = { field: field, value: value };
+  that.visitTargets = function(callback) {
+    for (var i in m_list) {
+      var filter = m_list[i];
+      if (filter.type === 'target') {
+        callback(filter.id, filter.name);
+      }
+    }
+  };
+
+  that.visitFields = function(callback) {
+    for (var i in m_list) {
+      var filter = m_list[i];
+      if (filter.type === 'field') {
+        callback(filter.field, filter.value);
+      }
+    }
+  };
+
+  that.visitCategories = function(callback) {
+    for (var i in m_list) {
+      var filter = m_list[i];
+      if (filter.type === 'category') {
+        callback(filter.id);
+      }
+    }
+  };
+
+  that.removeMatching = function(matchFn) {
+    var newList = [];
+    for (var i in m_list) {
+      var filter = m_list[i];
+      if (matchFn(filter)) {
+        m_team.info("removeMatching: removing filter " + mkws.$.toJSON(filter));
+      } else {
+        m_team.info("removeMatching: keeping filter " + mkws.$.toJSON(filter));
+        newList.push(filter);
+      }
     }
+    m_list = newList;
+  };
+
+  that.targetFiltered = function(id) {
+    for (var i = 0; i < m_list.length; i++) {
+      if (m_list[i].type === 'target' ||
+          m_list[i].id === 'pz:id=' + id) {
+        return true;
+      }
+    }
+    return false;
+  };
+
+  that.pp2filter = function() {
+    var res = "";
+
+    that.visitTargets(function(id, name) {
+      if (res) res += ",";
+      if (id.match(/^[a-z:]+[=~]/)) {
+        m_team.info("filter '" + id + "' already begins with SETTING OP");
+      } else {
+        id = 'pz:id=' + id;
+      }
+      res += id;
+    });
+
+    return res;
+  };
+
+  that.pp2limit = function(initial) {
+    var res = initial || "";
+
+    that.visitFields(function(field, value) {
+      if (res) res += ",";
+      res += field + "=" + value.replace(/[\\|,]/g, '\\$&');
+    });
+    return res;
+  }
+
+  that.pp2catLimit = function() {
+    var res = "";
 
+    that.visitCategories(function(id) {
+      if (res) res += ",";
+      res += "category~" + id.replace(/[\\,]/g, '\\$&');
+    });
     return res;
+  }
+
+  return that;
+}
+
+
+// Factory functions for filters. These can be of several types.
+function targetFilter(id, name) {
+  return {
+    type: 'target',
+    id: id,
+    name: name
+  };
+}
+
+function fieldFilter(field, value) {
+  return {
+    type: 'field',
+    field: field,
+    value: value
+  };
+}
+
+function categoryFilter(id) {
+  return {
+    type: 'category',
+    id: id
+  };
 }