Mercurial > bins
view templates.swigs/search.js @ 6:3021deef1599
Encoding related fixes
* chomp encoding string
* reformat else (seems someone hacked it in)
* debug print encoding
* do not use :utf8 binmode ("re-encode") on written file if the input is _already_ UTF-8
author | Peter Gervai <grin@grin.hu> |
---|---|
date | Thu, 16 Oct 2008 00:02:14 +0200 |
parents | a84c32f131df |
children |
line wrap: on
line source
/* 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; } }