search.js 8.1 KB
Newer Older
1
/*
2
 * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
3 4 5 6 7
 * Version 1.0, and under the Eclipse Public License, Version 1.0
 * (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */

Thomas Mueller's avatar
Thomas Mueller committed
8 9
var pages = new Array();
var ref = new Array();
Thomas Mueller's avatar
Thomas Mueller committed
10
var ignored = '';
11 12 13 14 15 16
var firstLink = null;
var firstLinkWord = null;

String.prototype.endsWith = function(suffix) {
    var startPos = this.length - suffix.length;
    if (startPos < 0) {
Thomas Mueller's avatar
Thomas Mueller committed
17
        return false;
18
    }
19
    return this.lastIndexOf(suffix, startPos) == startPos;
20 21 22
};

function listWords(value, open) {
Thomas Mueller's avatar
Thomas Mueller committed
23 24 25 26 27 28 29 30 31 32 33 34 35
    value = replaceOtherChars(value);
    value = trim(value);
    if (pages.length == 0) {
        load();
    }
    var table = document.getElementById('result');
    while (table.rows.length > 0) {
        table.deleteRow(0);
    }
    firstLink = null;
    var clear = document.getElementById('clear');
    if (value.length == 0) {
        clear.style.display = 'none';
36
        return;
Thomas Mueller's avatar
Thomas Mueller committed
37 38 39 40
    }
    clear.style.display = '';
    var keywords = value.split(' ');
    if (keywords.length > 1) {
41 42
        listMultipleWords(keywords);
        return;
Thomas Mueller's avatar
Thomas Mueller committed
43 44 45 46 47 48 49 50 51
    }
    if (value.length < 3) {
        max = 100;
    } else {
        max = 1000;
    }
    value = value.toLowerCase();
    var r = ref[value.substring(0, 1)];
    if (r == undefined) {
52
        return;
53
    }
Thomas Mueller's avatar
Thomas Mueller committed
54 55 56
    var x = 0;
    var words = r.split(';');
    var count = 0;
57
    for (var i = 0; i < words.length; i++) {
Thomas Mueller's avatar
Thomas Mueller committed
58 59 60 61 62
        var wordRef = words[i];
        if (wordRef.toLowerCase().indexOf(value) == 0) {
            count++;
        }
    }
63
    for (var i = 0; i < words.length && (x <= max); i++) {
Thomas Mueller's avatar
Thomas Mueller committed
64 65 66 67 68 69 70 71
        var wordRef = words[i];
        if (wordRef.toLowerCase().indexOf(value) == 0) {
            word = wordRef.split("=")[0];
            var tr = table.insertRow(x++);
            var td = document.createElement('td');
            var tdClass = document.createAttribute('class');
            tdClass.nodeValue = 'searchKeyword';
            td.setAttributeNode(tdClass);
72

Thomas Mueller's avatar
Thomas Mueller committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
            var ah = document.createElement('a');
            var href = document.createAttribute('href');
            href.nodeValue = 'javascript:set("' + word + '");';
            var link = document.createTextNode(word);
            ah.setAttributeNode(href);
            ah.appendChild(link);
            td.appendChild(ah);
            tr.appendChild(td);
            piList = wordRef.split("=")[1].split(",");
            if (count < 20 || open == word) {
                x = addReferences(x, piList, word);
            }
        }
    }
    if (x == 0) {
Thomas Mueller's avatar
Thomas Mueller committed
88 89 90 91 92
        if (ignored.indexOf(';' + value + ';') >= 0) {
            noResults(table, 'Common word (not indexed)');
        } else {
            noResults(table, 'No results found!');
        }
93 94 95 96
    }
}

function set(v) {
Thomas Mueller's avatar
Thomas Mueller committed
97
    if (pages.length == 0) {
98 99 100 101 102 103 104 105 106 107
        load();
    }
    var search = document.getElementById('search').value;
    listWords(search, v);
    document.getElementById('search').focus();
    window.scrollBy(-20, 0);
}

function goFirst() {
    var table = document.getElementById('result');
Thomas Mueller's avatar
Thomas Mueller committed
108
    if (firstLink != null) {
109 110 111 112 113 114 115 116
        go(firstLink, firstLinkWord);
    }
    return false;
}

function go(pageId, word) {
    var page = pages[pageId];
    var load = '../' + page.file + '?highlight=' + encodeURIComponent(word);
Thomas Mueller's avatar
Thomas Mueller committed
117 118
    if (top.main) {
        if (!top.main.location.href.endsWith(page.file)) {
119 120 121
            top.main.location = load;
        }
    } else {
Thomas Mueller's avatar
Thomas Mueller committed
122
        if (!document.location.href.endsWith(page.file)) {
123 124 125 126 127 128
            var search = document.getElementById('search').value;
            document.location = load + '&search=' + encodeURIComponent(search);
        }
    }
}

129
function listMultipleWords(keywords) {
Thomas Mueller's avatar
Thomas Mueller committed
130 131
    var count = new Array();
    var weight = new Array();
132
    for (var i = 0; i < pages.length; i++) {
Thomas Mueller's avatar
Thomas Mueller committed
133
        count[i] = 0;
134
        weight[i] = 0.0;
135
    }
136
    for (var i = 0; i < keywords.length; i++) {
Thomas Mueller's avatar
Thomas Mueller committed
137
        var value = keywords[i].toLowerCase();
138 139 140
        if (value.length <= 1) {
            continue;
        }
Thomas Mueller's avatar
Thomas Mueller committed
141 142
        var r = ref[value.substring(0, 1)];
        if (r == undefined) {
143
            continue;
Thomas Mueller's avatar
Thomas Mueller committed
144 145
        }
        var words = r.split(';');
146
        for (var j = 0; j < words.length; j++) {
Thomas Mueller's avatar
Thomas Mueller committed
147 148
            var wordRef = words[j];
            if (wordRef.toLowerCase().indexOf(value) == 0) {
149
                var word = wordRef.split("=")[0].toLowerCase();
Thomas Mueller's avatar
Thomas Mueller committed
150 151
                piList = wordRef.split("=")[1].split(",");
                var w = 1;
152
                for (var k = 0; k < piList.length; k++) {
Thomas Mueller's avatar
Thomas Mueller committed
153 154 155 156 157 158 159 160 161 162 163
                    var pi = piList[k];
                    if (pi.charAt(0) == 't') {
                        pi = pi.substring(1);
                        w = 10000;
                    } else if (pi.charAt(0) == 'h') {
                        pi = pi.substring(1);
                        w = 100;
                    } else if (pi.charAt(0) == 'r') {
                        pi = pi.substring(1);
                        w = 1;
                    }
164 165 166 167 168
                    if (w > 0) {
                        if (word != value) {
                            // if it's only the start of the word,
                            // reduce the weight
                            w /= 10.0;
Thomas Mueller's avatar
Thomas Mueller committed
169
                        }
170 171 172
                        // higher weight for longer words
                        w += w * word.length / 10.0;
                        count[pi]++;
Thomas Mueller's avatar
Thomas Mueller committed
173 174 175
                        weight[pi] += w;
                    }
                }
176 177 178
            }
        }
    }
Thomas Mueller's avatar
Thomas Mueller committed
179 180 181 182
    var x = 0;
    var table = document.getElementById('result');
    var piList = new Array();
    var piWeight = new Array();
183 184 185
    for (var i = 0; i < pages.length; i++) {
        var w = weight[i];
        if (w > 0) {
Thomas Mueller's avatar
Thomas Mueller committed
186
            piList[x] = '' + i;
187
            piWeight[x] = w * count[i];
Thomas Mueller's avatar
Thomas Mueller committed
188 189 190 191
            x++;
        }
    }
    // sort
192
    for (var i = 1, j; i < x; i++) {
Thomas Mueller's avatar
Thomas Mueller committed
193 194 195 196 197 198 199 200
        var tw = piWeight[i];
        var ti = piList[i];
        for (j = i - 1; j >= 0 && (piWeight[j] < tw); j--) {
            piWeight[j + 1] = piWeight[j];
            piList[j + 1] = piList[j];
        }
        piWeight[j + 1] = tw;
        piList[j + 1] = ti;
201
    }
Thomas Mueller's avatar
Thomas Mueller committed
202 203
    addReferences(0, piList, keywords);
    if (piList.length == 0) {
Thomas Mueller's avatar
Thomas Mueller committed
204
        noResults(table, 'No results found');
205 206 207 208
    }
}

function addReferences(x, piList, word) {
Thomas Mueller's avatar
Thomas Mueller committed
209
    var table = document.getElementById('result');
210
    for (var j = 0; j < piList.length; j++) {
Thomas Mueller's avatar
Thomas Mueller committed
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
        var pi = piList[j];
        if (pi.charAt(0) == 't') {
            pi = pi.substring(1);
        } else if (pi.charAt(0) == 'h') {
            pi = pi.substring(1);
        } else if (pi.charAt(0) == 'r') {
            pi = pi.substring(1);
        }
        var tr = table.insertRow(x++);
        var td = document.createElement('td');
        var tdClass = document.createAttribute('class');
        tdClass.nodeValue = 'searchLink';
        td.setAttributeNode(tdClass);
        var ah = document.createElement('a');
        var href = document.createAttribute('href');
        var thisLink = 'javascript:go(' + pi + ', "' + word + '")';
        if (firstLink == null) {
            firstLink = pi;
            firstLinkWord = word;
        }
        href.nodeValue = thisLink;
        ah.setAttributeNode(href);
        var page = pages[pi];
        var link = document.createTextNode(page.title);
        ah.appendChild(link);
        td.appendChild(ah);
        tr.appendChild(td);
238
    }
Thomas Mueller's avatar
Thomas Mueller committed
239
    return x;
240 241 242
}

function trim(s) {
Thomas Mueller's avatar
Thomas Mueller committed
243 244
    while (s.charAt(0) == ' ' && s.length > 0) {
        s = s.substring(1);
245
    }
Thomas Mueller's avatar
Thomas Mueller committed
246 247
    while (s.charAt(s.length - 1) == ' ' && s.length > 0) {
        s = s.substring(0, s.length - 1);
248 249 250 251 252 253
    }
    return s;
}

function replaceOtherChars(s) {
    var x = "";
254
    for (var i = 0; i < s.length; i++) {
255
        var c = s.charAt(i);
Thomas Mueller's avatar
Thomas Mueller committed
256
        if ("\t\r\n\"'.,:;!&/\\?%@`[]{}()+-=<>|*^~#$".indexOf(c) >= 0) {
257 258 259 260 261 262 263
            c = " ";
        }
        x += c;
    }
    return x;
}

Thomas Mueller's avatar
Thomas Mueller committed
264
function noResults(table, message) {
Thomas Mueller's avatar
Thomas Mueller committed
265 266 267 268 269
    var tr = table.insertRow(0);
    var td = document.createElement('td');
    var tdClass = document.createAttribute('class');
    tdClass.nodeValue = 'searchKeyword';
    td.setAttributeNode(tdClass);
Thomas Mueller's avatar
Thomas Mueller committed
270
    var text = document.createTextNode(message);
Thomas Mueller's avatar
Thomas Mueller committed
271 272
    td.appendChild(text);
    tr.appendChild(td);
273 274
}