diff -r 729a6ee4ea1c -r f1b68efb360a integration/js/model.js --- a/integration/js/model.js Thu Dec 06 17:07:49 2012 +0100 +++ b/integration/js/model.js Thu Jan 17 17:20:23 2013 +0100 @@ -17,7 +17,21 @@ } var uidbase = rand16(8) + "-" + rand16(4) + "-", uidincrement = Math.floor(Math.random()*0x10000); - + + var charsub = [ + [ 'a', 'á', 'à', 'â', 'ä' ], + [ 'c', 'ç' ], + [ 'e', 'é', 'è', 'ê', 'ë' ], + [ 'i', 'í', 'ì', 'î', 'ï' ], + [ 'o', 'ó', 'ò', 'ô', 'ö' ] + ]; + + var removeChars = [ + String.fromCharCode(768), String.fromCharCode(769), String.fromCharCode(770), String.fromCharCode(771), String.fromCharCode(807), + "{", "}", "(", ")", "[", "]", "【", "】", "、", "・", "‥", "。", "「", "」", "『", "』", "〜", ":", "!", "?", " ", + ",", " ", ";", "(", ")", ".", "*", "+", "\\", "?", "|", "{", "}", "[", "]", "^", "#", "/" + ] + var Model = { _SOURCE_STATUS_EMPTY : 0, _SOURCE_STATUS_WAITING : 1, @@ -52,6 +66,30 @@ } return new RegExp( _source, _flags); }, + fullTextRegexps: function(_text) { + var remsrc = "[\\" + removeChars.join("\\") + "]", + remrx = new RegExp(remsrc,"gm"), + txt = _text.toLowerCase().replace(remrx,"") + res = [], + charsrc = ns._(charsub).map(function(c) { + return "(" + c.join("|") + ")"; + }), + charsrx = ns._(charsrc).map(function(c) { + return new RegExp(c); + }), + src = ""; + for (var j = 0; j < txt.length; j++) { + if (j) { + src += remsrc + "*"; + } + var l = txt[j]; + ns._(charsrc).each(function(v, k) { + l = l.replace(charsrx[k], v); + }); + src += l; + } + return "(" + src + ")"; + }, isoToDate : function(_str) { // http://delete.me.uk/2005/03/iso8601.html var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?"; @@ -100,6 +138,15 @@ console.trace(); throw "Error : new Model.List(directory): directory is undefined"; } + var _this = this; + this.on("clear-search", function() { + _this.searching = false; + _this.regexp = undefined; + _this.forEach(function(_element) { + _element.found = undefined; + }); + _this.trigger("search-cleared"); + }) } Model.List.prototype = new Array(); @@ -199,6 +246,28 @@ }); } +Model.List.prototype.search = function(_text) { + if (!_text) { + this.trigger("clear-search"); + return this; + } + this.searching = true; + this.trigger("search", _text); + var rxsource = Model.fullTextRegexps(_text) + rgxp = new RegExp(rxsource,"im"), + this.regexp = new RegExp(rxsource,"gim"); + var res = this.filter(function(_element, _k) { + var titlematch = rgxp.test(_element.title), + descmatch = rgxp.test(_element.description), + _isfound = !!(titlematch || descmatch); + _element.found = _isfound; + _element.trigger(_isfound ? "found" : "not-found"); + return _isfound; + }); + this.trigger(res.length ? "found" : "not-found",res); + return res; +} + Model.List.prototype.getTitles = function() { return this.map(function(_el) { return _el.title; @@ -358,7 +427,7 @@ } _res += pad(2, _hms.minutes) + ':' + pad(2, _hms.seconds); if (showCs) { - _res += "." + Math.round(_hms.milliseconds / 100) + _res += "." + Math.floor(_hms.milliseconds / 100) } return _res; } @@ -934,12 +1003,12 @@ Model.Source.prototype.getList = function(_listId, _global) { _global = (typeof _global !== "undefined" && _global); - if (_global || typeof this.contents[_listId] === "undefined") { + if (_global) { return this.directory.getGlobalList().filter(function(_e) { return (_e.elementType === _listId); }); } else { - return this.contents[_listId]; + return this.contents[_listId] || new IriSP.Model.List(this.directory); } }