]> git.decadent.org.uk Git - memories.git/blobdiff - templates/static/upload.js
Rather more lightweight (and functional) tag completion code.
[memories.git] / templates / static / upload.js
index 0b033c6951c8d7575a397efd49ff4f8bf20070d5..c62663d10e844bcc3d40a6de746df9f3fb28a8d2 100644 (file)
@@ -1,82 +1,59 @@
 String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g,'') }
 String.prototype.escRegExp = function(){ return this.replace(/[\\$*+?()=!|,{}\[\]\.^]/g,'\\$&') }
 String.prototype.unescHtml = function(){ var i,t=this; for(i in e) t=t.replace(new RegExp(i,'g'),e[i]); return t }
-function Suggestions() { this.length=0; this.picked=0 }
-var suggestions = new Suggestions();
-var tagSearch='', lastEdit='';
-var h={}, sections=[{},{},{},{},{},{}], selected={}, currentTag={},
-e={'&lt;':'<','&gt;':'>','&amp;':'&','&quot;':'"'};
-
-function init () {
-    document.onkeydown = document.onkeypress = document.onkeyup = handler
-    h.suggest = document.getElementById("suggestionlist");
-    h.tags = document.getElementById("tags");
-}
-
-function handler(event) { var e=(event||window.event) //w3||ie
-    if (e.type == 'keyup') {
+var availhash = {};
+var tags = tagList.split(/\s+/); 
+for (t in tags) { availhash[tags[t]] = 1 }
+
+function addHandler( elt ) {
+    var params = {
+        elt: elt,
+        oldvalue: elt.value
+    };
+    document.onkeyup = function (event) {
+       var e=(event||window.event) //w3||ie
         switch(e.keyCode) {
-            //case 8:  //backspace
-            //case 46: //delete
             case 35: //end
             case 36: //home
             case 39: // right
             case 37: // left
             case 32: // space
-                hideSuggestions(); break
-            case 38: case 40: break;
-            case 9: break;
-            case 13: break;
+                params.elt.style.background = "#fff";
+                $("suggestionlist").style.visibility='hidden';
+                break
+            case 38: case 40: case 9: case 13: break;
             default: 
-            updateSuggestions()
-}}
-    else if (e.type == "keypress") { lastEdit = h.tags.value }
-}
-
-function makeTag(parent, tag, js) {
-    parent.appendChild(document.createTextNode(" "+ tag))
-}
-
-function updateSuggestions() {
-    while (h.suggest.hasChildNodes()) h.suggest.removeChild(h.suggest.firstChild)
-    if(!getCurrentTag() || !currentTag.text) { 
-        hideSuggestions(); return false 
-    }
-    var tagArray = h.tags.value.toLowerCase().split(' '),
-    txt=currentTag.text.trim().escRegExp(), tagHash={}, t
-    for(t in tagArray) tagHash[tagArray[t]] = true;
-
-    var search = tagList.match(new RegExp(("(?:^| )("+txt+"[^ ]+)"), "gi"))
-    if(search){
-        var i;
-        for (i=0; i<search.length; i++) {
-            var tl = search[i].trim()
-            if(tagHash[tl])  continue // do not suggest already typed tag
-            suggestions[suggestions.length] = makeTag(h.suggest, tl, 'complete')
-            suggestions.length++
-    }} 
-    if (suggestions.length > 0) { showSuggestions() } 
-    else { hideSuggestions(); }
-}
-
-function getCurrentTag() {
-    if(h.tags.value == lastEdit) return true // no edit
-    if(h.tags == '') return false
-    currentTag = {}
-    var tagArray=h.tags.value.toLowerCase().split(' '), oldArray=lastEdit.toLowerCase().split(' '), currentTags = [], matched=false, t,o
-    for (t in tagArray) {
-        for (o in oldArray) {
-            if(typeof oldArray[o] == 'undefined') { oldArray.splice(o,1); break }
-            if(tagArray[t] == oldArray[o]) { matched = true; oldArray.splice(o,1); break; }
+            var tagArray = params.elt.value.toLowerCase().split(' '),
+            txt=tagArray[tagArray.length-1].trim().escRegExp(), tagHash={}, t
+            for(t in tagArray) tagHash[tagArray[t]] = true;
+            var sl = $("suggestionlist");
+            if (!txt) { sl.style.visibility = 'hidden'; return; }
+
+            var search = tagList.match(new RegExp(("(?:^| )("+txt+"[^ ]+)"), "gi"))
+            if(search){ 
+                params.elt.style.background = availhash[txt] ? "#dfd" : "#fff";
+                while(sl.childNodes.length > 0) { sl.removeChild(sl.firstChild) }
+                sl.style.visibility='visible';
+                var i;
+                for (i in search) {
+                    if (!tagHash[search[i]]) {
+                        var tn = document.createTextNode(search[i]);
+                        var a = document.createElement("a");
+                        var elt = params.elt;
+                        var closureTxt = txt;
+                        a.onclick = function () {
+                            elt.value = elt.value.replace(new RegExp(closureTxt+"$"),this.firstChild.nodeValue+" ");
+                            elt.focus(); 
+                            sl.style.visibility='hidden';
+                        };
+                        a.appendChild(tn);
+                        sl.appendChild(a);
+                    }
+                }
+            } else { 
+                params.elt.style.background = availhash[txt] ? "#dfd" : "#fdd";
+                sl.style.visibility='hidden';
+           }
         }
-        if(!matched) currentTags[currentTags.length] = t
-        matched=false
     }
-    // more than one word changed... abort
-    currentTag = { text:tagArray[currentTags[0]], index:currentTags[0] }
-    return true
 }
-
-
-function hideSuggestions() { h.suggest.style.visibility='hidden' }
-function showSuggestions() { h.suggest.style.visibility='visible' }