(cherry picked from commit 971e7eef9c
)
master
@ -1,2 +0,0 @@ | |||
build/compiler.jar | |||
@ -1,19 +0,0 @@ | |||
Copyright (c) 2010 Dave Perrett, http://recursive-design.com/ | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. |
@ -1,152 +0,0 @@ | |||
About | |||
----- | |||
_jQuery-i18n_ is a jQuery plugin for doing client-side translations in javascript. It is based heavily on [javascript i18n that almost doesn't suck](http://markos.gaivo.net/blog/?p=100) by Marko Samastur, and is licensed under the [MIT license](http://www.opensource.org/licenses/mit-license.php). | |||
Installation | |||
------------ | |||
You'll need to download the [jQuery library](http://docs.jquery.com/Downloading_jQuery#Current_Release), and include it before _jquery.i18n.js_ in your HTML source. See the _examples_ folder for examples. | |||
Usage | |||
----- | |||
Before you can do any translation you have to initialise the plugin with a 'dictionary' (basically a property list mapping keys to their translations). | |||
```javascript | |||
var my_dictionary = { | |||
'some text': 'a translation', | |||
'some more text': 'another translation' | |||
} | |||
$.i18n.setDictionary(my_dictionary); | |||
``` | |||
Once you've initialised it with a dictionary, you can translate strings using the $.i18n._() function, for example: | |||
```javascript | |||
$('div#example').text($.i18n._('some text')); | |||
``` | |||
or using $('selector')._t() function | |||
```javascript | |||
$('div#example')._t('some text'); | |||
``` | |||
Wildcards | |||
--------- | |||
It's straightforward to pass dynamic data into your translations. First, add _%s_ in the translation for each variable you want to swap in : | |||
```javascript | |||
var my_dictionary = { | |||
"wildcard example" : "We have been passed two values : %s and %s." | |||
} | |||
$.i18n.setDictionary(my_dictionary); | |||
``` | |||
Next, pass an array of values in as the second argument when you perform the translation : | |||
```javascript | |||
$('div#example').text($.i18n._('wildcard example', [100, 200])); | |||
``` | |||
or | |||
```javascript | |||
$('div#example')._t('wildcard example', [100, 200]); | |||
``` | |||
This will output _We have been passed two values : 100 and 200._ | |||
Because some languages will need to order arguments differently to english, you can also specify the order in which the variables appear : | |||
```javascript | |||
var my_dictionary = { | |||
"wildcard example" : "We have been passed two values : %2$s and %1$s." | |||
} | |||
$.i18n.setDictionary(my_dictionary); | |||
$('div#example').text($.i18n._('wildcard example', [100, 200])); | |||
``` | |||
This will output: _We have been passed two values: 200 and 100._ | |||
Building From Scratch | |||
--------------------- | |||
You can build the regular, un-minified version simply by running _ant_: | |||
```bash | |||
$ ant | |||
Buildfile: build.xml | |||
jquery.i18n: | |||
[echo] Building ./jquery.i18n.js | |||
[echo] ./jquery.i18n.js built. | |||
BUILD SUCCESSFUL | |||
Total time: 0 seconds | |||
``` | |||
Before you can build the minified version yourself, you'll need to download the [Google Closure Compiler](http://closure-compiler.googlecode.com/files/compiler-latest.zip) and put it in a folder called _build_: | |||
```bash | |||
$ mkdir build | |||
$ cd build | |||
$ wget http://closure-compiler.googlecode.com/files/compiler-latest.zip | |||
$ unzip compiler-latest.zip | |||
``` | |||
Once you have the compiler, you can build the minified version by running _ant min_: | |||
```bash | |||
$ ant min | |||
Buildfile: build.xml | |||
jquery.i18n: | |||
[echo] Building ./jquery.i18n.js | |||
[echo] ./jquery.i18n.js built. | |||
min: | |||
[echo] Building ./jquery.i18n.min.js | |||
[apply] Applied java to 1 file and 0 directories. | |||
[delete] Deleting: /Users/dave/Documents/Code/jquery/jquery-i18n/tmpmin | |||
[echo] ./jquery.i18n.min.js built. | |||
BUILD SUCCESSFUL | |||
Total time: 1 second | |||
``` | |||
Bug Reports | |||
----------- | |||
If you come across any problems, please [create a ticket](https://github.com/recurser/jquery-i18n/issues) and we'll try to get it fixed as soon as possible. | |||
Contributing | |||
------------ | |||
Once you've made your commits: | |||
1. [Fork](http://help.github.com/fork-a-repo/) jquery-i18n | |||
2. Create a topic branch - `git checkout -b my_branch` | |||
3. Push to your branch - `git push origin my_branch` | |||
4. Create a [Pull Request](http://help.github.com/pull-requests/) from your branch | |||
5. That's it! | |||
Author | |||
------ | |||
Dave Perrett :: mail@recursive-design.com :: [@recurser](http://twitter.com/recurser) | |||
Copyright | |||
--------- | |||
Copyright (c) 2010 Dave Perrett. See [License](https://github.com/recurser/jquery-i18n/blob/master/LICENSE) for details. | |||
@ -1 +0,0 @@ | |||
0.9.2 |
@ -1,55 +0,0 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project name="jquery.i18n" default="jquery.i18n" basedir="."> | |||
<tstamp /> | |||
<loadfile property="version" srcfile="VERSION"/> | |||
<property description="Folder for jquery.i18n and min target" name="dist" value="."/> | |||
<property name="JQI" value="${dist}/jquery.i18n.js"/> | |||
<property name="JQI_MIN" value="${dist}/jquery.i18n.min.js"/> | |||
<target name="jquery.i18n" description="Main jquery.i18n build, concatenates source files and replaces @VERSION"> | |||
<echo message="Building ${JQI}"/> | |||
<mkdir dir="${dist}"/> | |||
<concat destfile="${JQI}"> | |||
<fileset file="src/jquery.i18n.js"/> | |||
</concat> | |||
<replaceregexp match="@VERSION" replace="${version}" flags="g" byline="true" file="${JQI}"/> | |||
<replaceregexp match="@DATE" replace="${DSTAMP}${TSTAMP}" file="${JQI}"/> | |||
<echo message="${JQI} built."/> | |||
</target> | |||
<target name="min" depends="jquery.i18n" description="Remove all comments and whitespace, no compression, great in combination with GZip"> | |||
<echo message="Building ${JQI_MIN}"/> | |||
<apply executable="java" parallel="false" verbose="true" dest="${dist}"> | |||
<fileset dir="${dist}"> | |||
<include name="jquery.i18n.js"/> | |||
</fileset> | |||
<arg line="-jar"/> | |||
<arg path="build/compiler.jar"/> | |||
<arg value="--warning_level"/> | |||
<arg value="QUIET"/> | |||
<arg value="--js_output_file"/> | |||
<targetfile/> | |||
<arg value="--js"/> | |||
<mapper type="glob" from="jquery.i18n.js" to="tmpmin"/> | |||
</apply> | |||
<concat destfile="${JQI_MIN}"> | |||
<filelist files="${JQI}, tmpmin"/> | |||
<filterchain> | |||
<headfilter lines="11"/> | |||
</filterchain> | |||
</concat> | |||
<concat destfile="${JQI_MIN}" append="yes"> | |||
<filelist files="tmpmin"/> | |||
</concat> | |||
<delete file="tmpmin"/> | |||
<echo message="${JQI_MIN} built."/> | |||
</target> | |||
<target name="clean"> | |||
<delete dir="tmpmin"/> | |||
</target> | |||
</project> |
@ -1,78 +0,0 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||
<html xmlns="http://www.w3.org/1999/xhtml"> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf8" /> | |||
<title>jQuery i18n Plugin</title> | |||
<script type="text/javascript" src="jquery-1.4.2.js"></script> | |||
<script type="text/javascript" src="../jquery.i18n.min.js"></script> | |||
<script type="text/javascript"> | |||
$(document).ready(function(){ | |||
i18n_dict = { | |||
"Example 1" : "teiän veen", | |||
"Example 2" : "tei'än ve'en", | |||
"Example 3" : "teiä vede", | |||
"Example 4" : "teirän veren", | |||
"Example 5" : "teilän velen", | |||
"Example 6" : "teijjän vejen", | |||
"Example 7" : "teidän veden", | |||
"Example 8" : "teitän veten", | |||
"Example 9" : "teiðän veðen", | |||
"Example 10" : "teidhän vethen", | |||
"Dynamic Content" : "Your browser window is %s x %s", | |||
"Ordered Dynamic Content": "%2$s is the height of your browser window, and %1$s is the width." | |||
}; | |||
$.i18n.setDictionary(i18n_dict); | |||
$('input#translate_button').click( function(event) { | |||
$('div#example1').text($.i18n._('Example 1')); | |||
$('div#example2').text($.i18n._('Example 2')); | |||
$('div#example3').text($.i18n._('Example 3')); | |||
$('div#example4').text($.i18n._('Example 4')); | |||
$('div#example5').text($.i18n._('Example 5')); | |||
$('div#example6').text($.i18n._('Example 6')); | |||
$('div#example7').text($.i18n._('Example 7')); | |||
$('div#example8').text($.i18n._('Example 8')); | |||
$('div#example9').text($.i18n._('Example 9')); | |||
$('div#example10').text($.i18n._('Example 10')); | |||
$('div#dynamic').text($.i18n._('Dynamic Content', [$(document).width(), $(document).height()])); | |||
$('div#orderedDynamic').text($.i18n._('Ordered Dynamic Content', [$(document).width(), $(document).height()])); | |||
}); | |||
}); | |||
</script> | |||
<style type="text/css"> | |||
body { | |||
font-size: 30px; | |||
text-align: center; | |||
} | |||
input { | |||
font-size: 30px; | |||
} | |||
p { | |||
font-size: 17px; | |||
} | |||
</style> | |||
<body> | |||
<p> | |||
Click the button to translate the following text into some random Finnish from the | |||
<a href='http://en.wikipedia.org/wiki/Finnish_phonology'>Wikipedia Finnish Phonology Article</a> | |||
</p> | |||
<div id='example1'>Example 1</div> | |||
<div id='example2'>Example 2</div> | |||
<div id='example3'>Example 3</div> | |||
<div id='example4'>Example 4</div> | |||
<div id='example5'>Example 5</div> | |||
<div id='example6'>Example 6</div> | |||
<div id='example7'>Example 7</div> | |||
<div id='example8'>Example 8</div> | |||
<div id='example9'>Example 9</div> | |||
<div id='example10'>Example 10</div> | |||
<div id='dynamic'>Dynamic Content</div> | |||
<div id='orderedDynamic'>Ordered Dynamic Content</div> | |||
<input type='button' id='translate_button' value='Internationalize!' /> | |||
</body> | |||
</html> |
@ -1,154 +0,0 @@ | |||
/* | |||
* jQuery i18n plugin | |||
* @requires jQuery v1.1 or later | |||
* | |||
* See http://recursive-design.com/projects/jquery-i18n/ | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/mit-license.php | |||
* | |||
* Version: 0.9.2 (201204070102) | |||
*/ | |||
(function($) { | |||
/** | |||
* i18n provides a mechanism for translating strings using a jscript dictionary. | |||
* | |||
*/ | |||
/* | |||
* i18n property list | |||
*/ | |||
$.i18n = { | |||
dict: null, | |||
/** | |||
* setDictionary() | |||
* Initialise the dictionary and translate nodes | |||
* | |||
* @param property_list i18n_dict : The dictionary to use for translation | |||
*/ | |||
setDictionary: function(i18n_dict) { | |||
this.dict = i18n_dict; | |||
}, | |||
/** | |||
* _() | |||
* The actual translation function. Looks the given string up in the | |||
* dictionary and returns the translation if one exists. If a translation | |||
* is not found, returns the original word | |||
* | |||
* @param string str : The string to translate | |||
* @param property_list params : params for using printf() on the string | |||
* @return string : Translated word | |||
* | |||
*/ | |||
_: function (str, params) { | |||
var transl = str; | |||
if (this.dict && this.dict[str]) { | |||
transl = this.dict[str]; | |||
} | |||
return this.printf(transl, params); | |||
}, | |||
/** | |||
* toEntity() | |||
* Change non-ASCII characters to entity representation | |||
* | |||
* @param string str : The string to transform | |||
* @return string result : Original string with non-ASCII content converted to entities | |||
* | |||
*/ | |||
toEntity: function (str) { | |||
var result = ''; | |||
for (var i=0;i<str.length; i++) { | |||
if (str.charCodeAt(i) > 128) | |||
result += "&#"+str.charCodeAt(i)+";"; | |||
else | |||
result += str.charAt(i); | |||
} | |||
return result; | |||
}, | |||
/** | |||
* stripStr() | |||
* | |||
* @param string str : The string to strip | |||
* @return string result : Stripped string | |||
* | |||
*/ | |||
stripStr: function(str) { | |||
return str.replace(/^\s*/, "").replace(/\s*$/, ""); | |||
}, | |||
/** | |||
* stripStrML() | |||
* | |||
* @param string str : The multi-line string to strip | |||
* @return string result : Stripped string | |||
* | |||
*/ | |||
stripStrML: function(str) { | |||
// Split because m flag doesn't exist before JS1.5 and we need to | |||
// strip newlines anyway | |||
var parts = str.split('\n'); | |||
for (var i=0; i<parts.length; i++) | |||
parts[i] = stripStr(parts[i]); | |||
// Don't join with empty strings, because it "concats" words | |||
// And strip again | |||
return stripStr(parts.join(" ")); | |||
}, | |||
/* | |||
* printf() | |||
* C-printf like function, which substitutes %s with parameters | |||
* given in list. %%s is used to escape %s. | |||
* | |||
* Doesn't work in IE5.0 (splice) | |||
* | |||
* @param string S : string to perform printf on. | |||
* @param string L : Array of arguments for printf() | |||
*/ | |||
printf: function(S, L) { | |||
if (!L) return S; | |||
var nS = ""; | |||
var search = /%(\d+)\$s/g; | |||
// replace %n1$ where n is a number | |||
while (result = search.exec(S)) { | |||
var index = parseInt(result[1], 10) - 1; | |||
S = S.replace('%' + result[1] + '\$s', (L[index])); | |||
L.splice(index, 1); | |||
} | |||
var tS = S.split("%s"); | |||
if (tS.length > 1) { | |||
for(var i=0; i<L.length; i++) { | |||
if (tS[i].lastIndexOf('%') == tS[i].length-1 && i != L.length-1) | |||
tS[i] += "s"+tS.splice(i+1,1)[0]; | |||
nS += tS[i] + L[i]; | |||
} | |||
} | |||
return nS + tS[tS.length-1]; | |||
} | |||
}; | |||
/* | |||
* _t | |||
* Allows you to translate a jQuery selector | |||
* | |||
* eg $('h1')._t('some text') | |||
* | |||
* @param string str : The string to translate | |||
* @param property_list params : params for using printf() on the string | |||
* @return element : chained and translated element(s) | |||
*/ | |||
$.fn._t = function(str, params) { | |||
return $(this).text($.i18n._(str, params)); | |||
}; | |||
})(jQuery); |
@ -1,13 +0,0 @@ | |||
/* | |||
* jQuery i18n plugin | |||
* @requires jQuery v1.1 or later | |||
* | |||
* See http://recursive-design.com/projects/jquery-i18n/ | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/mit-license.php | |||
* | |||
* Version: 0.9.2 (201204070102) | |||
*/ | |||
(function(f){f.i18n={dict:null,setDictionary:function(a){this.dict=a},_:function(a,b){var d=a;if(this.dict&&this.dict[a])d=this.dict[a];return this.printf(d,b)},toEntity:function(a){for(var b="",d=0;d<a.length;d++)b+=a.charCodeAt(d)>128?"&#"+a.charCodeAt(d)+";":a.charAt(d);return b},stripStr:function(a){return a.replace(/^\s*/,"").replace(/\s*$/,"")},stripStrML:function(a){a=a.split("\n");for(var b=0;b<a.length;b++)a[b]=stripStr(a[b]);return stripStr(a.join(" "))},printf:function(a,b){if(!b)return a; | |||
for(var d="",e=/%(\d+)\$s/g;result=e.exec(a);){var c=parseInt(result[1],10)-1;a=a.replace("%"+result[1]+"$s",b[c]);b.splice(c,1)}e=a.split("%s");if(e.length>1)for(c=0;c<b.length;c++){if(e[c].lastIndexOf("%")==e[c].length-1&&c!=b.length-1)e[c]+="s"+e.splice(c+1,1)[0];d+=e[c]+b[c]}return d+e[e.length-1]}};f.fn._t=function(a,b){return f(this).text(f.i18n._(a,b))}})(jQuery); |
@ -1,154 +0,0 @@ | |||
/* | |||
* jQuery i18n plugin | |||
* @requires jQuery v1.1 or later | |||
* | |||
* See http://recursive-design.com/projects/jquery-i18n/ | |||
* | |||
* Licensed under the MIT license: | |||
* http://www.opensource.org/licenses/mit-license.php | |||
* | |||
* Version: @VERSION (@DATE) | |||
*/ | |||
(function($) { | |||
/** | |||
* i18n provides a mechanism for translating strings using a jscript dictionary. | |||
* | |||
*/ | |||
/* | |||
* i18n property list | |||
*/ | |||
$.i18n = { | |||
dict: null, | |||
/** | |||
* setDictionary() | |||
* Initialise the dictionary and translate nodes | |||
* | |||
* @param property_list i18n_dict : The dictionary to use for translation | |||
*/ | |||
setDictionary: function(i18n_dict) { | |||
this.dict = i18n_dict; | |||
}, | |||
/** | |||
* _() | |||
* The actual translation function. Looks the given string up in the | |||
* dictionary and returns the translation if one exists. If a translation | |||
* is not found, returns the original word | |||
* | |||
* @param string str : The string to translate | |||
* @param property_list params : params for using printf() on the string | |||
* @return string : Translated word | |||
* | |||
*/ | |||
_: function (str, params) { | |||
var transl = str; | |||
if (this.dict && this.dict[str]) { | |||
transl = this.dict[str]; | |||
} | |||
return this.printf(transl, params); | |||
}, | |||
/** | |||
* toEntity() | |||
* Change non-ASCII characters to entity representation | |||
* | |||
* @param string str : The string to transform | |||
* @return string result : Original string with non-ASCII content converted to entities | |||
* | |||
*/ | |||
toEntity: function (str) { | |||
var result = ''; | |||
for (var i=0;i<str.length; i++) { | |||
if (str.charCodeAt(i) > 128) | |||
result += "&#"+str.charCodeAt(i)+";"; | |||
else | |||
result += str.charAt(i); | |||
} | |||
return result; | |||
}, | |||
/** | |||
* stripStr() | |||
* | |||
* @param string str : The string to strip | |||
* @return string result : Stripped string | |||
* | |||
*/ | |||
stripStr: function(str) { | |||
return str.replace(/^\s*/, "").replace(/\s*$/, ""); | |||
}, | |||
/** | |||
* stripStrML() | |||
* | |||
* @param string str : The multi-line string to strip | |||
* @return string result : Stripped string | |||
* | |||
*/ | |||
stripStrML: function(str) { | |||
// Split because m flag doesn't exist before JS1.5 and we need to | |||
// strip newlines anyway | |||
var parts = str.split('\n'); | |||
for (var i=0; i<parts.length; i++) | |||
parts[i] = stripStr(parts[i]); | |||
// Don't join with empty strings, because it "concats" words | |||
// And strip again | |||
return stripStr(parts.join(" ")); | |||
}, | |||
/* | |||
* printf() | |||
* C-printf like function, which substitutes %s with parameters | |||
* given in list. %%s is used to escape %s. | |||
* | |||
* Doesn't work in IE5.0 (splice) | |||
* | |||
* @param string S : string to perform printf on. | |||
* @param string L : Array of arguments for printf() | |||
*/ | |||
printf: function(S, L) { | |||
if (!L) return S; | |||
var nS = ""; | |||
var search = /%(\d+)\$s/g; | |||
// replace %n1$ where n is a number | |||
while (result = search.exec(S)) { | |||
var index = parseInt(result[1], 10) - 1; | |||
S = S.replace('%' + result[1] + '\$s', (L[index])); | |||
L.splice(index, 1); | |||
} | |||
var tS = S.split("%s"); | |||
if (tS.length > 1) { | |||
for(var i=0; i<L.length; i++) { | |||
if (tS[i].lastIndexOf('%') == tS[i].length-1 && i != L.length-1) | |||
tS[i] += "s"+tS.splice(i+1,1)[0]; | |||
nS += tS[i] + L[i]; | |||
} | |||
} | |||
return nS + tS[tS.length-1]; | |||
} | |||
}; | |||
/* | |||
* _t | |||
* Allows you to translate a jQuery selector | |||
* | |||
* eg $('h1')._t('some text') | |||
* | |||
* @param string str : The string to translate | |||
* @param property_list params : params for using printf() on the string | |||
* @return element : chained and translated element(s) | |||
*/ | |||
$.fn._t = function(str, params) { | |||
return $(this).text($.i18n._(str, params)); | |||
}; | |||
})(jQuery); |
@ -1,4 +0,0 @@ | |||
This is jquery.autocomplete from | |||
http://www.devbridge.com/projects/autocomplete/jquery/ | |||
@ -1,400 +0,0 @@ | |||
/** | |||
* Ajax Autocomplete for jQuery, version 1.1.3 | |||
* (c) 2010 Tomas Kirda | |||
* | |||
* Ajax Autocomplete for jQuery is freely distributable under the terms of an MIT-style license. | |||
* For details, see the web site: http://www.devbridge.com/projects/autocomplete/jquery/ | |||
* | |||
* Last Review: 04/19/2010 | |||
* Heavily modified for contact completion in Friendica (add photos, hover tips. etc.) 11-May-2012 mike@macgirvin.com | |||
*/ | |||
/*jslint onevar: true, evil: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true, newcap: true, immed: true */ | |||
/*global window: true, document: true, clearInterval: true, setInterval: true, jQuery: true */ | |||
(function($) { | |||
var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'); | |||
function fnFormatResult(value, data, currentValue) { | |||
var pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')'; | |||
return value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>'); | |||
} | |||
function Autocomplete(el, options) { | |||
this.el = $(el); | |||
this.el.attr('autocomplete', 'off'); | |||
this.suggestions = []; | |||
this.data = []; | |||
this.badQueries = []; | |||
this.selectedIndex = -1; | |||
this.currentValue = this.el.val(); | |||
this.intervalId = 0; | |||
this.cachedResponse = []; | |||
this.onChangeInterval = null; | |||
this.ignoreValueChange = false; | |||
this.serviceUrl = options.serviceUrl; | |||
this.isLocal = false; | |||
this.id = options.id; | |||
this.options = { | |||
autoSubmit: false, | |||
minChars: 1, | |||
maxHeight: 300, | |||
deferRequestBy: 0, | |||
width: 0, | |||
highlight: true, | |||
params: {}, | |||
fnFormatResult: fnFormatResult, | |||
delimiter: null, | |||
zIndex: 999 | |||
}; | |||
this.initialize(); | |||
this.setOptions(options); | |||
} | |||
$.fn.autocomplete = function(options) { | |||
return new Autocomplete(this.get(0)||$('<input />'), options); | |||
}; | |||
Autocomplete.prototype = { | |||
killerFn: null, | |||
initialize: function() { | |||
var me, uid, autocompleteElId; | |||
me = this; | |||
uid = Math.floor(Math.random()*0x100000).toString(16); | |||
autocompleteElId = 'Autocomplete_' + uid; | |||
this.killerFn = function(e) { | |||
if ($(e.target).parents('.autocomplete').size() === 0) { | |||
me.killSuggestions(); | |||
me.disableKillerFn(); | |||
} | |||
}; | |||
if (!this.options.width) { this.options.width = this.el.width(); } | |||
this.mainContainerId = 'AutocompleteContainter_' + uid; | |||
$('<div id="' + this.mainContainerId + '" style="position:absolute;z-index:999;"><div class="autocomplete-w1" id="'+this.id+'"><div class="autocomplete" id="' + autocompleteElId + '" style="display:none; width:300px;"></div></div></div>').appendTo('body'); | |||
this.container = $('#' + autocompleteElId); | |||
this.fixPosition(); | |||
if (window.opera) { | |||
this.el.keypress(function(e) { me.onKeyPress(e); }); | |||
} else { | |||
this.el.keydown(function(e) { me.onKeyPress(e); }); | |||
} | |||
this.el.keyup(function(e) { me.onKeyUp(e); }); | |||
this.el.blur(function() { me.enableKillerFn(); }); | |||
this.el.focus(function() { me.fixPosition(); }); | |||
}, | |||
setOptions: function(options){ | |||
var o = this.options; | |||
$.extend(o, options); | |||
if(o.lookup){ | |||
this.isLocal = true; | |||
if($.isArray(o.lookup)){ o.lookup = { suggestions:o.lookup, data:[] }; } | |||
} | |||
$('#'+this.mainContainerId).css({ zIndex:o.zIndex }); | |||
this.container.css({ maxHeight: o.maxHeight + 'px', width:o.width }); | |||
}, | |||
clearCache: function(){ | |||
this.cachedResponse = []; | |||
this.badQueries = []; | |||
}, | |||
disable: function(){ | |||
this.disabled = true; | |||
}, | |||
enable: function(){ | |||
this.disabled = false; | |||
}, | |||
fixPosition: function() { | |||
var offset = this.el.offset(); | |||
$('#' + this.mainContainerId).css({ top: (offset.top + this.el.innerHeight()) + 'px', left: offset.left + 'px' }); | |||
}, | |||
enableKillerFn: function() { | |||
var me = this; | |||
$(document).bind('click', me.killerFn); | |||
}, | |||
disableKillerFn: function() { | |||
var me = this; | |||
$(document).unbind('click', me.killerFn); | |||
}, | |||
killSuggestions: function() { | |||
var me = this; | |||
this.stopKillSuggestions(); | |||
this.intervalId = window.setInterval(function() { me.hide(); me.stopKillSuggestions(); }, 300); | |||
}, | |||
stopKillSuggestions: function() { | |||
window.clearInterval(this.intervalId); | |||
}, | |||
onKeyPress: function(e) { | |||
if (this.disabled || !this.enabled) { return; } | |||
// return will exit the function | |||
// and event will not be prevented | |||
switch (e.keyCode) { | |||
case 27: //KEY_ESC: | |||
this.el.val(this.currentValue); | |||
this.hide(); | |||
break; | |||
case 9: //KEY_TAB: | |||
case 13: //KEY_RETURN: | |||
if (this.selectedIndex === -1) { | |||
this.hide(); | |||
return; | |||
} | |||
this.select(this.selectedIndex); | |||
if(e.keyCode === 9){ return; } | |||
break; | |||
case 38: //KEY_UP: | |||
this.moveUp(); | |||
break; | |||
case 40: //KEY_DOWN: | |||
this.moveDown(); | |||
break; | |||
default: | |||
return; | |||
} | |||
// if(e.keyCode != 13) { | |||
e.stopImmediatePropagation(); | |||
e.preventDefault(); | |||
//} | |||
}, | |||
onKeyUp: function(e) { | |||
if(this.disabled){ return; } | |||
switch (e.keyCode) { | |||
case 38: //KEY_UP: | |||
case 40: //KEY_DOWN: | |||
return; | |||
} | |||
clearInterval(this.onChangeInterval); | |||
if (this.currentValue !== this.el.val()) { | |||
if (this.options.deferRequestBy > 0) { | |||
// Defer lookup in case when value changes very quickly: | |||
var me = this; | |||
this.onChangeInterval = setInterval(function() { me.onValueChange(); }, this.options.deferRequestBy); | |||
} else { | |||
this.onValueChange(); | |||
} | |||
} | |||
}, | |||
onValueChange: function() { | |||
clearInterval(this.onChangeInterval); | |||
this.currentValue = this.el.val(); | |||
var q = this.getQuery(this.currentValue); | |||
this.selectedIndex = -1; | |||
if (this.ignoreValueChange) { | |||
this.ignoreValueChange = false; | |||
return; | |||
} | |||
if (q === '' || q.length < this.options.minChars) { | |||
this.hide(); | |||
} else { | |||
this.getSuggestions(q); | |||
} | |||
}, | |||
getQuery: function(val) { | |||
var d, arr; | |||
d = this.options.delimiter; | |||
if (!d) { return $.trim(val); } | |||
arr = val.split(d); | |||
return $.trim(arr[arr.length - 1]); | |||
}, | |||
getSuggestionsLocal: function(q) { | |||
var ret, arr, len, val, i; | |||
arr = this.options.lookup; | |||
len = arr.suggestions.length; | |||
ret = { suggestions:[], data:[] }; | |||
q = q.toLowerCase(); | |||
for(i=0; i< len; i++){ | |||
val = arr.suggestions[i]; | |||
if(val.toLowerCase().indexOf(q) === 0){ | |||
ret.suggestions.push(val); | |||
ret.data.push(arr.data[i]); | |||
} | |||
} | |||
return ret; | |||
}, | |||
getSuggestions: function(q) { | |||
var cr, me; | |||
cr = this.isLocal ? this.getSuggestionsLocal(q) : this.cachedResponse[q]; | |||
if (cr && $.isArray(cr.suggestions)) { | |||
this.suggestions = cr.suggestions; | |||
this.data = cr.data; | |||
this.suggest(); | |||
} else if (!this.isBadQuery(q)) { | |||
me = this; | |||
me.options.params.query = q; | |||
$('#nav-search-spinner').show(); | |||
$.get(this.serviceUrl, me.options.params, function(txt) { me.processResponse(txt); }, 'text'); | |||
} | |||
}, | |||
isBadQuery: function(q) { | |||
var i = this.badQueries.length; | |||
while (i--) { | |||
if (q.indexOf(this.badQueries[i]) === 0) { return true; } | |||
} | |||
return false; | |||
}, | |||
hide: function() { | |||
this.enabled = false; | |||
this.selectedIndex = -1; | |||
this.container.hide(); | |||
}, | |||
suggest: function() { | |||
if (this.suggestions.length === 0) { | |||
this.hide(); | |||
return; | |||
} | |||
var me, len, div, f, v, i, s, mOver, mClick, l, img; | |||
me = this; | |||
len = this.suggestions.length; | |||
f = this.options.fnFormatResult; | |||
v = this.getQuery(this.currentValue); | |||
mOver = function(xi) { return function() { me.activate(xi); }; }; | |||
mClick = function(xi) { return function() { me.select(xi); }; }; | |||
this.container.hide().empty(); | |||
for (i = 0; i < len; i++) { | |||
s = this.suggestions[i]; | |||
l = this.links[i]; | |||
img = '<img height="24" width="24" src="' + this.photos[i] + '" alt="' + s + '" /> '; | |||
div = $((me.selectedIndex === i ? '<div class="selected"' : '<div') + ' title="' + l + '">' + img + f(s, this.data[i], v) + '</div>'); | |||
div.mouseover(mOver(i)); | |||
div.click(mClick(i)); | |||
this.container.append(div); | |||
} | |||
this.enabled = true; | |||
this.container.show(); | |||
}, | |||
processResponse: function(text) { | |||
var response; | |||
try { | |||
response = eval('(' + text + ')'); | |||
} catch (err) { return; } | |||
if (!$.isArray(response.data)) { response.data = []; } | |||
if(!this.options.noCache){ | |||
this.cachedResponse[response.query] = response; | |||
if (response.suggestions.length === 0) { this.badQueries.push(response.query); } | |||
} | |||
if (response.query === this.getQuery(this.currentValue)) { | |||
this.photos = response.photos; | |||
this.links = response.links; | |||
this.suggestions = response.suggestions; | |||
this.data = response.data; | |||
this.suggest(); | |||
} | |||
$('#nav-search-spinner').hide(); | |||
}, | |||
activate: function(index) { | |||
var divs, activeItem; | |||
divs = this.container.children(); | |||
// Clear previous selection: | |||
if (this.selectedIndex !== -1 && divs.length > this.selectedIndex) { | |||
$(divs.get(this.selectedIndex)).removeClass(); | |||
} | |||
this.selectedIndex = index; | |||
if (this.selectedIndex !== -1 && divs.length > this.selectedIndex) { | |||
activeItem = divs.get(this.selectedIndex); | |||
$(activeItem).addClass('selected'); | |||
} | |||
return activeItem; | |||
}, | |||
deactivate: function(div, index) { | |||
div.className = ''; | |||
if (this.selectedIndex === index) { this.selectedIndex = -1; } | |||
}, | |||
select: function(i) { | |||
var selectedValue, f; | |||
selectedValue = this.suggestions[i]; | |||
if (selectedValue) { | |||
this.el.val(selectedValue); | |||
if (this.options.autoSubmit) { | |||
f = this.el.parents('form'); | |||
if (f.length > 0) { f.get(0).submit(); } | |||
} | |||
this.ignoreValueChange = true; | |||
this.hide(); | |||
this.onSelect(i); | |||
} | |||
}, | |||
moveUp: function() { | |||
if (this.selectedIndex === -1) { return; } | |||
if (this.selectedIndex === 0) { | |||
this.container.children().get(0).className = ''; | |||
this.selectedIndex = -1; | |||
this.el.val(this.currentValue); | |||
return; | |||
} | |||
this.adjustScroll(this.selectedIndex - 1); | |||
}, | |||
moveDown: function() { | |||
if (this.selectedIndex === (this.suggestions.length - 1)) { return; } | |||
this.adjustScroll(this.selectedIndex + 1); | |||
}, | |||
adjustScroll: function(i) { | |||
var activeItem, offsetTop, upperBound, lowerBound; | |||
activeItem = this.activate(i); | |||
offsetTop = activeItem.offsetTop; | |||
upperBound = this.container.scrollTop(); | |||
lowerBound = upperBound + this.options.maxHeight - 25; | |||
if (offsetTop < upperBound) { | |||
this.container.scrollTop(offsetTop); | |||
} else if (offsetTop > lowerBound) { | |||
this.container.scrollTop(offsetTop - this.options.maxHeight + 25); | |||
} | |||
this.el.val(this.getValue(this.suggestions[i])); | |||
}, | |||
onSelect: function(i) { | |||
var me, fn, s, d; | |||
me = this; | |||
fn = me.options.onSelect; | |||
s = me.suggestions[i]; | |||
d = me.data[i]; | |||
me.el.val(me.getValue(s)); | |||
if ($.isFunction(fn)) { fn(s, d, me.el); } | |||
}, | |||
getValue: function(value){ | |||
var del, currVal, arr, me; | |||
me = this; | |||
del = me.options.delimiter; | |||
if (!del) { return value; } | |||
currVal = me.currentValue; | |||
arr = currVal.split(del); | |||
if (arr.length === 1) { return value; } | |||
return currVal.substr(0, currVal.length - arr[arr.length - 1].length) + value; | |||
} | |||
}; | |||
}(jQuery)); |
@ -1,390 +0,0 @@ | |||
/** | |||
* Ajax Autocomplete for jQuery, version 1.1.3 | |||
* (c) 2010 Tomas Kirda | |||
* | |||
* Ajax Autocomplete for jQuery is freely distributable under the terms of an MIT-style license. | |||
* For details, see the web site: http://www.devbridge.com/projects/autocomplete/jquery/ | |||
* | |||
* Last Review: 04/19/2010 | |||
*/ | |||
/*jslint onevar: true, evil: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true, newcap: true, immed: true */ | |||
/*global window: true, document: true, clearInterval: true, setInterval: true, jQuery: true */ | |||
(function($) { | |||
var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'); | |||
function fnFormatResult(value, data, currentValue) { | |||
var pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')'; | |||
return value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>'); | |||
} | |||
function Autocomplete(el, options) { | |||
this.el = $(el); | |||
this.el.attr('autocomplete', 'off'); | |||
this.suggestions = []; | |||
this.data = []; | |||
this.badQueries = []; | |||
this.selectedIndex = -1; | |||
this.currentValue = this.el.val(); | |||
this.intervalId = 0; | |||
this.cachedResponse = []; | |||
this.onChangeInterval = null; | |||
this.ignoreValueChange = false; | |||
this.serviceUrl = options.serviceUrl; | |||
this.isLocal = false; | |||
this.options = { | |||
autoSubmit: false, | |||
minChars: 1, | |||
maxHeight: 300, | |||
deferRequestBy: 0, | |||
width: 0, | |||
highlight: true, | |||
params: {}, | |||
fnFormatResult: fnFormatResult, | |||
delimiter: null, | |||
zIndex: 9999 | |||
}; | |||
this.initialize(); | |||
this.setOptions(options); | |||
} | |||
$.fn.autocomplete = function(options) { | |||
return new Autocomplete(this.get(0)||$('<input />'), options); | |||
}; | |||
Autocomplete.prototype = { | |||
killerFn: null, | |||
initialize: function() { | |||
var me, uid, autocompleteElId; | |||
me = this; | |||
uid = Math.floor(Math.random()*0x100000).toString(16); | |||
autocompleteElId = 'Autocomplete_' + uid; | |||
this.killerFn = function(e) { | |||
if ($(e.target).parents('.autocomplete').size() === 0) { | |||
me.killSuggestions(); | |||
me.disableKillerFn(); | |||
} | |||
}; | |||
if (!this.options.width) { this.options.width = this.el.width(); } | |||
this.mainContainerId = 'AutocompleteContainter_' + uid; | |||
$('<div id="' + this.mainContainerId + '" style="position:absolute;z-index:9999;"><div class="autocomplete-w1"><div class="autocomplete" id="' + autocompleteElId + '" style="display:none; width:300px;"></div></div></div>').appendTo('body'); | |||
this.container = $('#' + autocompleteElId); | |||
this.fixPosition(); | |||
if (window.opera) { | |||
this.el.keypress(function(e) { me.onKeyPress(e); }); | |||
} else { | |||
this.el.keydown(function(e) { me.onKeyPress(e); }); | |||
} | |||
this.el.keyup(function(e) { me.onKeyUp(e); }); | |||
this.el.blur(function() { me.enableKillerFn(); }); | |||
this.el.focus(function() { me.fixPosition(); }); | |||
}, | |||
setOptions: function(options){ | |||
var o = this.options; | |||
$.extend(o, options); | |||
if(o.lookup){ | |||
this.isLocal = true; | |||
if($.isArray(o.lookup)){ o.lookup = { suggestions:o.lookup, data:[] }; } | |||
} | |||
$('#'+this.mainContainerId).css({ zIndex:o.zIndex }); | |||
this.container.css({ maxHeight: o.maxHeight + 'px', width:o.width }); | |||
}, | |||
clearCache: function(){ | |||
this.cachedResponse = []; | |||
this.badQueries = []; | |||
}, | |||
disable: function(){ | |||
this.disabled = true; | |||
}, | |||
enable: function(){ | |||
this.disabled = false; | |||
}, | |||
fixPosition: function() { | |||
var offset = this.el.offset(); | |||
$('#' + this.mainContainerId).css({ top: (offset.top + this.el.innerHeight()) + 'px', left: offset.left + 'px' }); | |||
}, | |||
enableKillerFn: function() { | |||
var me = this; | |||
$(document).bind('click', me.killerFn); | |||
}, | |||
disableKillerFn: function() { | |||
var me = this; | |||
$(document).unbind('click', me.killerFn); | |||
}, | |||
killSuggestions: function() { | |||
var me = this; | |||
this.stopKillSuggestions(); | |||
this.intervalId = window.setInterval(function() { me.hide(); me.stopKillSuggestions(); }, 300); | |||
}, | |||
stopKillSuggestions: function() { | |||
window.clearInterval(this.intervalId); | |||
}, | |||
onKeyPress: function(e) { | |||
if (this.disabled || !this.enabled) { return; } | |||
// return will exit the function | |||
// and event will not be prevented | |||
switch (e.keyCode) { | |||
case 27: //KEY_ESC: | |||
this.el.val(this.currentValue); | |||
this.hide(); | |||
break; | |||
case 9: //KEY_TAB: | |||
case 13: //KEY_RETURN: | |||
if (this.selectedIndex === -1) { | |||
this.hide(); | |||
return; | |||
} | |||
this.select(this.selectedIndex); | |||
if(e.keyCode === 9){ return; } | |||
break; | |||
case 38: //KEY_UP: | |||
this.moveUp(); | |||
break; | |||
case 40: //KEY_DOWN: | |||
this.moveDown(); | |||
break; | |||
default: | |||
return; | |||
} | |||
e.stopImmediatePropagation(); | |||
e.preventDefault(); | |||
}, | |||
onKeyUp: function(e) { | |||
if(this.disabled){ return; } | |||
switch (e.keyCode) { | |||
case 38: //KEY_UP: | |||
case 40: //KEY_DOWN: | |||
return; | |||
} | |||
clearInterval(this.onChangeInterval); | |||
if (this.currentValue !== this.el.val()) { | |||
if (this.options.deferRequestBy > 0) { | |||
// Defer lookup in case when value changes very quickly: | |||
var me = this; | |||
this.onChangeInterval = setInterval(function() { me.onValueChange(); }, this.options.deferRequestBy); | |||
} else { | |||
this.onValueChange(); | |||
} | |||
} | |||
}, | |||
onValueChange: function() { | |||
clearInterval(this.onChangeInterval); | |||
this.currentValue = this.el.val(); | |||
var q = this.getQuery(this.currentValue); | |||
this.selectedIndex = -1; | |||
if (this.ignoreValueChange) { | |||
this.ignoreValueChange = false; | |||
return; | |||
} | |||
if (q === '' || q.length < this.options.minChars) { | |||
this.hide(); | |||
} else { | |||
this.getSuggestions(q); | |||
} | |||
}, | |||
getQuery: function(val) { | |||
var d, arr; | |||
d = this.options.delimiter; | |||
if (!d) { return $.trim(val); } | |||
arr = val.split(d); | |||
return $.trim(arr[arr.length - 1]); | |||
}, | |||
getSuggestionsLocal: function(q) { | |||
var ret, arr, len, val, i; | |||
arr = this.options.lookup; | |||
len = arr.suggestions.length; | |||
ret = { suggestions:[], data:[] }; | |||
q = q.toLowerCase(); | |||
for(i=0; i< len; i++){ | |||
val = arr.suggestions[i]; | |||
if(val.toLowerCase().indexOf(q) === 0){ | |||
ret.suggestions.push(val); | |||
ret.data.push(arr.data[i]); | |||
} | |||
} | |||
return ret; | |||
}, | |||
getSuggestions: function(q) { | |||
var cr, me; | |||
cr = this.isLocal ? this.getSuggestionsLocal(q) : this.cachedResponse[q]; | |||
if (cr && $.isArray(cr.suggestions)) { | |||
this.suggestions = cr.suggestions; | |||
this.data = cr.data; | |||
this.suggest(); | |||
} else if (!this.isBadQuery(q)) { | |||
me = this; | |||
me.options.params.query = q; | |||
$.get(this.serviceUrl, me.options.params, function(txt) { me.processResponse(txt); }, 'text'); | |||
} | |||
}, | |||
isBadQuery: function(q) { | |||
var i = this.badQueries.length; | |||
while (i--) { | |||
if (q.indexOf(this.badQueries[i]) === 0) { return true; } | |||
} | |||
return false; | |||
}, | |||
hide: function() { | |||
this.enabled = false; | |||
this.selectedIndex = -1; | |||
this.container.hide(); | |||
}, | |||
suggest: function() { | |||
if (this.suggestions.length === 0) { | |||
this.hide(); | |||
return; | |||
} | |||
var me, len, div, f, v, i, s, mOver, mClick; | |||
me = this; | |||
len = this.suggestions.length; | |||
f = this.options.fnFormatResult; | |||
v = this.getQuery(this.currentValue); | |||
mOver = function(xi) { return function() { me.activate(xi); }; }; | |||
mClick = function(xi) { return function() { me.select(xi); }; }; | |||
this.container.hide().empty(); | |||
for (i = 0; i < len; i++) { | |||
s = this.suggestions[i]; | |||
div = $((me.selectedIndex === i ? '<div class="selected"' : '<div') + ' title="' + s + '">' + f(s, this.data[i], v) + '</div>'); | |||
div.mouseover(mOver(i)); | |||
div.click(mClick(i)); | |||
this.container.append(div); | |||
} | |||
this.enabled = true; | |||
this.container.show(); | |||
}, | |||
processResponse: function(text) { | |||
var response; | |||
try { | |||
response = eval('(' + text + ')'); | |||
} catch (err) { return; } | |||
if (!$.isArray(response.data)) { response.data = []; } | |||
if(!this.options.noCache){ | |||
this.cachedResponse[response.query] = response; | |||
if (response.suggestions.length === 0) { this.badQueries.push(response.query); } | |||
} | |||
if (response.query === this.getQuery(this.currentValue)) { | |||
this.suggestions = response.suggestions; | |||
this.data = response.data; | |||
this.suggest(); | |||
} | |||
}, | |||
activate: function(index) { | |||
var divs, activeItem; | |||
divs = this.container.children(); | |||
// Clear previous selection: | |||
if (this.selectedIndex !== -1 && divs.length > this.selectedIndex) { | |||
$(divs.get(this.selectedIndex)).removeClass(); | |||
} | |||
this.selectedIndex = index; | |||
if (this.selectedIndex !== -1 && divs.length > this.selectedIndex) { | |||
activeItem = divs.get(this.selectedIndex); | |||
$(activeItem).addClass('selected'); | |||
} | |||
return activeItem; | |||
}, | |||
deactivate: function(div, index) { | |||
div.className = ''; | |||
if (this.selectedIndex === index) { this.selectedIndex = -1; } | |||
}, | |||
select: function(i) { | |||
var selectedValue, f; | |||
selectedValue = this.suggestions[i]; | |||
if (selectedValue) { | |||
this.el.val(selectedValue); | |||
if (this.options.autoSubmit) { | |||
f = this.el.parents('form'); | |||
if (f.length > 0) { f.get(0).submit(); } | |||
} | |||
this.ignoreValueChange = true; | |||
this.hide(); | |||
this.onSelect(i); | |||
} | |||
}, | |||
moveUp: function() { | |||
if (this.selectedIndex === -1) { return; } | |||
if (this.selectedIndex === 0) { | |||
this.container.children().get(0).className = ''; | |||
this.selectedIndex = -1; | |||
this.el.val(this.currentValue); | |||
return; | |||
} | |||
this.adjustScroll(this.selectedIndex - 1); | |||
}, | |||
moveDown: function() { | |||
if (this.selectedIndex === (this.suggestions.length - 1)) { return; } | |||
this.adjustScroll(this.selectedIndex + 1); | |||
}, | |||
adjustScroll: function(i) { | |||
var activeItem, offsetTop, upperBound, lowerBound; | |||
activeItem = this.activate(i); | |||
offsetTop = activeItem.offsetTop; | |||
upperBound = this.container.scrollTop(); | |||
lowerBound = upperBound + this.options.maxHeight - 25; | |||
if (offsetTop < upperBound) { | |||
this.container.scrollTop(offsetTop); | |||
} else if (offsetTop > lowerBound) { | |||
this.container.scrollTop(offsetTop - this.options.maxHeight + 25); | |||
} | |||
this.el.val(this.getValue(this.suggestions[i])); | |||
}, | |||
onSelect: function(i) { | |||
var me, fn, s, d; | |||
me = this; | |||
fn = me.options.onSelect; | |||
s = me.suggestions[i]; | |||
d = me.data[i]; | |||
me.el.val(me.getValue(s)); | |||
if ($.isFunction(fn)) { fn(s, d, me.el); } | |||
}, | |||
getValue: function(value){ | |||
var del, currVal, arr, me; | |||
me = this; | |||
del = me.options.delimiter; | |||
if (!del) { return value; } | |||
currVal = me.currentValue; | |||
arr = currVal.split(del); | |||
if (arr.length === 1) { return value; } | |||
return currVal.substr(0, currVal.length - arr[arr.length - 1].length) + value; | |||
} | |||
}; | |||
}(jQuery)); |
@ -1,6 +0,0 @@ | |||
| |||
.autocomplete-w1 { background:url(img/shadow.png) no-repeat bottom right; position:absolute; top:0px; left:0px; margin:8px 0 0 6px; /* IE6 fix: */ _background:none; _margin:0; } | |||
.autocomplete { border:1px solid #999; background:#FFF; cursor:default; text-align:left; max-height:350px; overflow:auto; margin:-6px 6px 6px -6px; /* IE6 specific: */ _height:350px; _margin:0; _overflow-x:hidden; } | |||
.autocomplete .selected { background:#F0F0F0; } | |||
.autocomplete div { padding:2px 5px; white-space:nowrap; } | |||
.autocomplete strong { font-weight:normal; color:#3399FF; } |
@ -1,535 +0,0 @@ | |||
Changelog | |||
========= | |||
### 2.13.0 [See full changelog](https://gist.github.com/ichernev/0132fcf5b61f7fc140b0bb0090480d49) | |||
## Enhancements: | |||
* [#2982](https://github.com/moment/moment/pull/2982) Add 'date' as alias to 'day' for startOf() and endOf(). | |||
* [#2955](https://github.com/moment/moment/pull/2955) Add parsing negative components in durations when ISO 8601 | |||
* [#2991](https://github.com/moment/moment/pull/2991) isBetween support for both open and closed intervals | |||
* [#3105](https://github.com/moment/moment/pull/3105) Add localeSorted argument to weekday listers | |||
* [#3102](https://github.com/moment/moment/pull/3102) Add k and kk formatting tokens | |||
## Bugfixes | |||
* [#3109](https://github.com/moment/moment/pull/3109) Fix [#1756](https://github.com/moment/moment/issues/1756) Resolved thread-safe issue on server side. | |||
* [#3078](https://github.com/moment/moment/pull/3078) Fix parsing for months/weekdays with weird characters | |||
* [#3098](https://github.com/moment/moment/pull/3098) Use Z suffix when in UTC mode ([#3020](https://github.com/moment/moment/issues/3020)) | |||
* [#2995](https://github.com/moment/moment/pull/2995) Fix floating point rounding errors in durations | |||
* [#3059](https://github.com/moment/moment/pull/3059) fix bug where diff returns -0 in month-related diffs | |||
* [#3045](https://github.com/moment/moment/pull/3045) Fix mistaking any input for 'a' token | |||
* [#2877](https://github.com/moment/moment/pull/2877) Use explicit .valueOf() calls instead of coercion | |||
* [#3036](https://github.com/moment/moment/pull/3036) Year setter should keep time when DST changes | |||
Plus 3 new locales and locale fixes. | |||
### 2.12.0 [See full changelog](https://gist.github.com/ichernev/6e5bfdf8d6522fc4ac73) | |||
## Enhancements: | |||
* [#2932](https://github.com/moment/moment/pull/2932) List loaded locales | |||
* [#2818](https://github.com/moment/moment/pull/2818) Parse ISO-8061 duration containing both day and week values | |||
* [#2774](https://github.com/moment/moment/pull/2774) Implement locale inheritance and locale updating | |||
## Bugfixes: | |||
* [#2970](https://github.com/moment/moment/pull/2970) change add subtract to handle decimal values by rounding | |||
* [#2887](https://github.com/moment/moment/pull/2887) Fix toJSON casting of invalid moment | |||
* [#2897](https://github.com/moment/moment/pull/2897) parse string arguments for month() correctly, closes #2884 | |||
* [#2946](https://github.com/moment/moment/pull/2946) Fix usage suggestions for min and max | |||
## New locales: | |||
* [#2917](https://github.com/moment/moment/pull/2917) Locale Punjabi(Gurmukhi) India format conversion | |||
And more | |||
### 2.11.2 (Fix ReDoS attack vector) | |||
* [#2939](https://github.com/moment/moment/pull/2939) use full-string match to speed up aspnet regex match | |||
### 2.11.1 [See full changelog](https://gist.github.com/ichernev/8ec3ee25b749b4cff3c2) | |||
## Bugfixes: | |||
* [#2881](https://github.com/moment/moment/pull/2881) Revert "Merge pull request #2746 from mbad0la:develop" Sep->Sept | |||
* [#2868](https://github.com/moment/moment/pull/2868) Add format and parse token Y, so it actually works | |||
* [#2865](https://github.com/moment/moment/pull/2865) Use typeof checks for undefined for global variables | |||
* [#2858](https://github.com/moment/moment/pull/2858) Fix Date mocking regression introduced in 2.11.0 | |||
* [#2864](https://github.com/moment/moment/pull/2864) Include changelog in npm release | |||
* [#2830](https://github.com/moment/moment/pull/2830) dep: add grunt-cli | |||
* [#2869](https://github.com/moment/moment/pull/2869) Fix months parsing for some locales | |||
### 2.11.0 [See full changelog](https://gist.github.com/ichernev/6594bc29719dde6b2f66) | |||
* [#2624](https://github.com/moment/moment/pull/2624) Proper handling of invalid moments | |||
* [#2634](https://github.com/moment/moment/pull/2634) Fix strict month parsing issue in cs,ru,sk | |||
* [#2735](https://github.com/moment/moment/pull/2735) Reset the locale back to 'en' after defining all locales in min/locales.js | |||
* [#2702](https://github.com/moment/moment/pull/2702) Week rework | |||
* [#2746](https://github.com/moment/moment/pull/2746) Changed September Abbreviation to "Sept" in locale-specific english | |||
files and default locale file | |||
* [#2646](https://github.com/moment/moment/pull/2646) Fix [#2645](https://github.com/moment/moment/pull/2645) - invalid dates pre-1970 | |||
* [#2641](https://github.com/moment/moment/pull/2641) Implement basic format and comma as ms separator in ISO 8601 | |||
* [#2665](https://github.com/moment/moment/pull/2665) Implement stricter weekday parsing | |||
* [#2700](https://github.com/moment/moment/pull/2700) Add [Hh]mm and [Hh]mmss formatting tokens, so you can parse 123 with | |||
hmm for example | |||
* [#2565](https://github.com/moment/moment/pull/2565) [#2835](https://github.com/moment/moment/pull/2835) Expose arguments used for moment creation with creationData | |||
(fix [#2443](https://github.com/moment/moment/pull/2443)) | |||
* [#2648](https://github.com/moment/moment/pull/2648) fix issue [#2640](https://github.com/moment/moment/pull/2640): support instanceof operator | |||
* [#2709](https://github.com/moment/moment/pull/2709) Add isSameOrAfter and isSameOrBefore comparison methods | |||
* [#2721](https://github.com/moment/moment/pull/2721) Fix moment creation from object with strings values | |||
* [#2740](https://github.com/moment/moment/pull/2740) Enable 'd hh:mm:ss.sss' format for durations | |||
* [#2766](https://github.com/moment/moment/pull/2766) [#2833](https://github.com/moment/moment/pull/2833) Alternate Clock Source Support | |||
### 2.10.6 | |||
[#2515](https://github.com/moment/moment/pull/2515) Fix regression introduced | |||
in `2.10.5` related to `moment.ISO_8601` parsing. | |||
### 2.10.5 [See full changelog](https://gist.github.com/ichernev/6ec13ac7efc396da44b2) | |||
Important changes: | |||
* [#2357](https://github.com/moment/moment/pull/2357) Improve unit bubbling for ISO dates | |||
this fixes day to year conversions to work around end-of-year (~365 days). As | |||
a side effect 365 days is 11 months and 30 days, and 366 days is one year. | |||
* [#2438](https://github.com/moment/moment/pull/2438) Fix inconsistent moment.min and moment.max results | |||
Return invalid result if any of the inputs is invalid | |||
* [#2494](https://github.com/moment/moment/pull/2494) Fix two digit year parsing with YYYY format | |||
This brings the benefits of YY to YYYY | |||
* [#2368](https://github.com/moment/moment/pull/2368) perf: use faster form of copying dates, across the board improvement | |||
### 2.10.3 [See full changelog](https://gist.github.com/ichernev/f264b9bed5b00f8b1b7f) | |||
* add `moment.fn.to` and `moment.fn.toNow` (similar to `from` and `fromNow`) | |||
* new locales (Sinhalese (si), Montenegrin (me), Javanese (ja)) | |||
* performance improvements | |||
### 2.10.2 | |||
* fixed moment-with-locales in browser env caused by esperanto change | |||
### 2.10.1 | |||