Mercurial > bins
diff templates.swigs/search.js @ 0:a84c32f131df 1.1.29
Import vendor version
author | Peter Gervai <grin@grin.hu> |
---|---|
date | Wed, 15 Oct 2008 23:28:56 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/templates.swigs/search.js Wed Oct 15 23:28:56 2008 +0200 @@ -0,0 +1,224 @@ + +/* contains all the data about the pictures (set after the page is + loaded) */ +var search_data; + +function get_query_variable(variable) { + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i=0;i<vars.length;i++) { + var pair = vars[i].split("="); + if (pair[0] == variable) { + return pair[1]; + } + } + return ''; +} + +/* Remove the loading message and get the search data + */ +function page_loaded() { + search_data = sd; + + if (document.getElementById){ + document.getElementById('loading').style.visibility='hidden'; + } else { + if (document.layers){ //NS4 + document.loading.visibility = 'hidden'; + } else { //IE4 + document.all.loading.style.visibility = 'hidden'; + } + } + search_string = decodeURIComponent(get_query_variable('q')); + set_search_string(search_string); + var word_search = get_query_variable('w'); + if (word_search=='1') { + word_search = true; + } else { + word_search = false; + } + document.getElementById('search_word').checked = word_search; + perform_search(search_string, word_search); + + if (document.layers) { + document.captureEvents(Event.KEYPRESS); + } +} + +/* Return a copy of str, translating all occurrences of each character + in from to the corresponding character in to +*/ +String.prototype.strtr = function(from, to) +{ + var s, p, c1, c2, c3; + if(! this.length || from.length != to.length) return; + + s = this; + for(var i=0; i < this.length; i++) { + c1 = this.substr(i,1); + for(var j=0; j<from.length; j++) { + c2 = from.substr(j,1); + c3 = to.substr(j,1); + if(c1 == c2) { + p = new RegExp(c2,'gi'); + s = s.replace(p,c3); + } + } + } + return s; +}; + +/* Return a copy of str, removing all accents in it + */ +function remove_accents(string) { + return string.strtr( +"ÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ", +"AAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy"); +} + + +/* set the string in the query input + */ +function set_search_string(search_string) { + var input = document.getElementById('search_string'); + input.value = search_string; +} + +/* return the string entered by the user, normalized + */ +function get_search_string() { + var input = document.getElementById('search_string'); + var search_string = remove_accents(input.value.toLowerCase()); + + return search_string; +} + +/* return a list of keywords from the string entered by user + */ +function get_keywords(search_string, word_search) { + if (! search_string ) { + return new Array; + } + keywords = search_string.split(/[^a-z0-9]+/i); + + var result = new Array; + for (var i=0; i<keywords.length; i++) { + if (keywords[i]) { + if (word_search) { + result[result.length] = " " + keywords[i] + " "; + } else { + result[result.length] = keywords[i]; + } + } + } + return result; +} + +/* replace a %parameter% in the template by its value + */ +function set_value(template, parameter, value) { + re = new RegExp("%"+parameter+"%", "g"); + return template.replace(re, value) +} + +/* display one found result in the page + */ +function display_result(results, image) { + result = result_html; + result = set_value(result, 'url', image.url); + result = set_value(result, 'thumb_url', image.thumb_url); + result = set_value(result, 'album_url', image.album_url); + result = set_value(result, 'album_title', image.album_title); + result = set_value(result, 'title', image.title); + result = set_value(result, 'thumb_width', image.width); + result = set_value(result, 'thumb_height', image.height); + + results.innerHTML += result; +} + +/* update the status string on the page + */ +function update_status(status, found) { + status.firstChild.nodeValue = "Search in progress: " + found.toString() +" found"; +} + +/* return true if all keywords (array of string) match the string s + */ +function match(keywords, s){ + for (var i=0 ; i<keywords.length ; i++) { + if (keywords[i] && s.indexOf(keywords[i]) == -1) { + return false; + } + } + return true; +} +/* perform the search when the page is loaded + */ +function perform_search(search_string, word_search) { + + if (! (document.getElementById || document.createElement)){ + alert("<TMPL_VAR NAME=STRING_NODOM>"); + return; + } + + var limit = <TMPL_VAR NAME=SEARCH_LIMIT>; + var found = 0; + var keywords = get_keywords(search_string, word_search); + if (keywords.length == 0) { + return; + } + var results = document.getElementById('results'); + results.innerHTML = ""; + var status = document.getElementById('status'); + + update_status(status, found); + + for (var i=0 ; i<search_data.length; i++) { + image = search_data[i]; + if (match(keywords, image.search_string)) { + if (found >= limit) { + var status_string = "<TMPL_VAR NAME=STRING_TOOMANYRESULTS>"; + // WTF ? Not sprintf in javascript ? OK, so I code dirty + status_string = status_string.replace(/%d/, found.toString()); + status.firstChild.nodeValue = status_string; + return; + } + + update_status(status, found++); + display_result(results, image) + } + } + var status_string = "<TMPL_VAR NAME=STRING_SEARCHCOMPLETED>"; + // For dirty hacking remark, see above comment + status_string = status_string.replace(/%d/, found.toString()); + status.firstChild.nodeValue = status_string; + return; +} + +/* if user has pressed return in the input field, validate the search + */ +function process_key(e) { + if (window.event) { + if (window.event.type == "keypress" & window.event.keyCode == 13) + reload_page(); + } + if (e) { + if (e.type == "keypress" & e.keyCode == 13) { + reload_page(); + } + } +} + +/* Reload the page when the user click the search button + */ +function reload_page() { + var search_string = get_search_string(); + var word_search = document.getElementById('search_word').checked; + if (search_string) { + search_string = encodeURIComponent(search_string) + if (word_search) { + search_string += "&w=1"; + } + location.href = location.pathname + "?q=" + search_string; + } +}