updated for version 7.0191
diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim
index 64e0079..8fde2d3 100644
--- a/runtime/autoload/ccomplete.vim
+++ b/runtime/autoload/ccomplete.vim
@@ -1,7 +1,7 @@
 " Vim completion script
 " Language:	C
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2006 Jan 29
+" Last Change:	2006 Jan 30
 
 
 " This function is used for the 'omnifunc' option.
diff --git a/runtime/autoload/javascriptcomplete.vim b/runtime/autoload/javascriptcomplete.vim
new file mode 100644
index 0000000..2853fba
--- /dev/null
+++ b/runtime/autoload/javascriptcomplete.vim
@@ -0,0 +1,495 @@
+" Vim completion script
+" Language:	Java Script
+" Maintainer:	Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Last Change:	2006 Jan 30
+
+function! javascriptcomplete#CompleteJS(findstart, base)
+  if a:findstart
+    " locate the start of the word
+    let line = getline('.')
+    let start = col('.') - 1
+	let curline = line('.')
+	let compl_begin = col('.') - 2
+	" Bit risky but JS is rather limited language and local chars shouldn't
+	" fint way into names
+    while start >= 0 && line[start - 1] =~ '\w'
+		let start -= 1
+    endwhile
+	let b:compl_context = getline('.')[0:compl_begin]
+    return start
+  else
+	" Initialize base return lists
+    let res = []
+    let res2 = []
+	" a:base is very short - we need context
+	let context = b:compl_context
+	" Shortcontext is context without a:base, useful for checking if we are
+	" looking for objects
+	let shortcontext = substitute(context, a:base.'$', '', '')
+	unlet! b:compl_context
+
+	if shortcontext =~ '\.$'
+		" Complete methods and properties for objects
+		" DOM separate
+		let doms = ['style.']
+		" Arrays
+		let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype']
+		let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift', 
+					\ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf',
+					\ 'watch', 'unwatch']
+		call map(arraymeth, 'v:val."("')
+		let arrays = arrayprop + arraymeth
+
+		" Boolean - complete subset of array values
+		" properties - constructor, prototype
+		" methods    - toSource, toString, valueOf
+
+		" Date
+		" properties - constructor, prototype
+		let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds',
+					\ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset',
+					\ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds',
+					\ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
+					\ 'getYear', 'parse', 'parse',
+					\ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds',
+					\ 'setMinutes', 'setMonth', 'setSeconds',
+					\ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds',
+					\ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime',
+					\ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString',
+					\ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch']
+		call map(datemeth, 'v:val."("')
+		let dates = datemeth
+
+		" Function
+		let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length',
+					\ 'arity', 'constructor', 'length', 'prototype']
+		let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf']
+		call map(funcmeth, 'v:val."("')
+		let funcs = funcprop + funcmeth
+
+		" Math
+		let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT']
+		let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor',
+					\ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan',
+					\ 'watch', 'unwatch']
+		call map(mathmeth, 'v:val."("')
+		let maths = mathprop + mathmeth
+
+		" Number
+		let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY', 
+					\ 'constructor', 'prototype']
+		let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf',
+					\ 'watch', 'unwatch']
+		call map(numbmeth, 'v:val."("')
+		let numbs = numbprop + numbmeth
+
+		" Object
+		let objeprop = ['constructor', 'prototype']
+		let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf']
+		call map(objemeth, 'v:val."("')
+		let objes = objeprop + objemeth
+
+		" RegExp
+		let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
+		let regemeth = ['exec', 'toSource', 'toString', 'test', 'watch', 'unwatch']
+		call map(regemeth, 'v:val."("')
+		let reges = regeprop + regemeth
+
+		" String
+		let striprop = ['constructor', 'length', 'prototype']
+		let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat',
+					\ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics',
+					\ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small',
+					\ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase',
+					\ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch']
+		call map(strimeth, 'v:val."("')
+		let stris = striprop + strimeth
+
+		" User created properties
+		if exists("b:jsrange")
+			let file = getline(b:jsrange[0],b:jsrange[1])
+			unlet! b:jsrange
+		else
+			let file = getline(1, '$')
+		endif
+		let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\w"')
+		let juser_props1 = join(user_props1, ' ')
+		let user_props1 = split(juser_props1, '\zethis\.')
+		unlet! juser_props1
+		call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\w\\+\\ze")')
+		let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\w"')
+		call map(user_props2, 'matchstr(v:val, "\\.prototype\\.\\zs\\w\\+\\ze")')
+		let user_props = user_props1 + user_props2
+
+		" HTML DOM properties
+		" Anchors - anchor.
+		let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML',
+					\ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus']
+		let anchmeth = ['blur', 'focus']
+		call map(anchmeth, 'v:val."("')
+		let anths = anchprop + anchmeth
+		" Area - area.
+		let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id',
+					\ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target']
+		let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver']
+		call map(areameth, 'v:val."("')
+		let areas = areaprop + areameth
+		" Base - base.
+		let baseprop = ['href', 'id', 'target']
+		let bases = baseprop
+		" Body - body.
+		let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop',
+					\ 'text', 'vLink']
+		let bodys = bodyprop
+		" Document - document.
+		let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
+					\ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
+		let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
+					\ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
+					\ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
+					\ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
+		call map(documeth, 'v:val."("')
+		let docus = docuprop + documeth
+		" Form - form.
+		let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
+					\ 'method', 'name', 'tabIndex', 'target']
+		let formmeth = ['reset', 'submit', 'onReset', 'onSubmit']
+		call map(formmeth, 'v:val."("')
+		let forms = formprop + formmeth
+		" Frame - frame.
+		let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth',
+					\ 'name', 'noResize', 'scrolling', 'src']
+		let frammeth = ['blur', 'focus']
+		call map(frammeth, 'v:val."("')
+		let frams = framprop + frammeth
+		" Frameset - frameset.
+		let fsetprop = ['cols', 'id', 'rows']
+		let fsetmeth = ['blur', 'focus']
+		call map(fsetmeth, 'v:val."("')
+		let fsets = fsetprop + fsetmeth
+		" History - history.
+		let histprop = ['length']
+		let histmeth = ['back', 'forward', 'go']
+		call map(histmeth, 'v:val."("')
+		let hists = histprop + histmeth
+		" Iframe - iframe.
+		let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth',
+					\ 'name', 'scrolling', 'src', 'width']
+		let ifras = ifraprop
+		" Image - image.
+		let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
+					\ 'lowsrc', 'name', 'src', 'useMap', 'vspace', 'width']
+		let imagmeth = ['onAbort', 'onError', 'onLoad']
+		call map(imagmeth, 'v:val."("')
+		let imags = histprop + imagmeth
+		" Button - accessible only by other properties
+		let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
+		let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+		call map(buttmeth, 'v:val."("')
+		let butts = buttprop + buttmeth
+		" Checkbox - accessible only by other properties
+		let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 
+					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
+		let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+		call map(checmeth, 'v:val."("')
+		let checs = checprop + checmeth
+		" File upload - accessible only by other properties
+		let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
+		let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+		call map(filemeth, 'v:val."("')
+		let files = fileprop + filemeth
+		" Hidden - accessible only by other properties
+		let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value'] 
+		let hidds = hiddprop
+		" Password - accessible only by other properties
+		let passprop = ['accept', 'accessKey', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex', 
+					\ 'type', 'value'] 
+		let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown', 
+					\ 'onKeyPress', 'onKeyUp']
+		call map(passmeth, 'v:val."("')
+		let passs = passprop + passmeth
+		" Radio - accessible only by other properties
+		let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 
+					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
+		let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
+		call map(radimeth, 'v:val."("')
+		let radis = radiprop + radimeth
+		" Reset - accessible only by other properties
+		let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 
+		let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
+		call map(resemeth, 'v:val."("')
+		let reses = reseprop + resemeth
+		" Submit - accessible only by other properties
+		let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 
+		let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart']
+		call map(submmeth, 'v:val."("')
+		let subms = submprop + submmeth
+		" Text - accessible only by other properties
+		let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 
+					\ 'size', 'tabIndex', 'type', 'value'] 
+		let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown',
+					\ 'onKeyPress', 'onKeyUp', 'onSelect']
+		call map(textmeth, 'v:val."("')
+		let texts = textprop + textmeth
+		" Link - link.
+		let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media',
+					\ 'rel', 'rev', 'target', 'type']
+		let linkmeth = ['onLoad']
+		call map(linkmeth, 'v:val."("')
+		let links = linkprop + linkmeth
+		" Location - location.
+		let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol',
+					\ 'search']
+		let locameth = ['assign', 'reload', 'replace']
+		call map(locameth, 'v:val."("')
+		let locas = locaprop + locameth
+		" Meta - meta.
+		let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme']
+		let metas = metaprop
+		" Navigator - navigator.
+		let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled',
+					\ 'platform', 'userAgent']
+		let navimeth = ['javaEnabled', 'taintEnabled']
+		call map(navimeth, 'v:val."("')
+		let navis = naviprop + navimeth
+		" Object - object.
+		let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data',
+					\ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex',
+					\ 'type', 'useMap', 'vspace', 'width']
+		let objes = objeprop
+		" Option - accessible only by other properties
+		let optiprop = ['defaultSelected', 
+					\ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value']
+		let optis = optiprop
+		" Screen - screen.
+		let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width']
+		let scres = screprop
+		" Select - accessible only by other properties
+		let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name', 
+					\ 'selectedIndex', 'size', 'tabIndex', 'type', 'value'] 
+		let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus']
+		call map(selemeth, 'v:val."("')
+		let seles = seleprop + selemeth
+		" Style - style.
+		let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage',
+					\ 'backgroundPosition', 'backgroundRepeat',
+					\ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop',
+					\ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor',
+					\ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle',
+					\ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth',
+                    \ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom',
+                    \ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth',
+                    \ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom',
+                    \ 'paddingLeft', 'paddingRight', 'paddingTop',
+                    \ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content',
+                    \ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction',
+                    \ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight',
+					\ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility',
+					\ 'width',
+					\ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType',
+					\ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex',
+					\ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside',
+					\ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout',
+					\ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
+					\ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes',
+					\ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition',
+					\ 'unicodeBidi', 'whiteSpace', 'wordSpacing']
+		let styls = stylprop
+		" Table - table.
+		let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding',
+					\ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width']
+		let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow',
+					\ 'deleteTFoot', 'deleteTHead', 'insertRow']
+		call map(tablmeth, 'v:val."("')
+		let tabls = tablprop + tablmeth
+		" Table data - TableData.
+		let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff',
+					\ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width']
+		let tdats = tdatprop
+		" Table row - TableRow.
+		let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex',
+					\ 'vAlign']
+		let trowmeth = ['deleteCell', 'insertCell']
+		call map(trowmeth, 'v:val."("')
+		let trows = trowprop + trowmeth
+		" Textarea - accessible only by other properties
+		let tareprop = ['accessKey', 'cols', 'defaultValue', 
+					\ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows', 
+					\ 'tabIndex', 'type', 'value'] 
+		let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus']
+		call map(taremeth, 'v:val."("')
+		let tares = tareprop + taremeth
+		" Window - window.
+		let windprop = ['frames', 'closed', 'defaultStatus', 'length', 'name', 'opener', 'parent',
+					\ 'self', 'status', 'top']
+		let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
+					\ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
+					\ 'setTimeout']
+		call map(windmeth, 'v:val."("')
+		let winds = windprop + windmeth
+		" XMLHttpRequest - access by new xxx()
+		let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
+					\ 'status', 'statusText']
+		let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
+					\ 'send', 'setRequestHeader']
+		call map(xmlhmeth, 'v:val."("')
+		let xmlhs = xmlhprop + xmlhmeth
+
+		let object = matchstr(shortcontext, '\zs\w\+\ze\(\[.\{-}\]\)\?\.$')
+		let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
+		let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\w\+\ze')
+
+		if object_type == 'Date'
+			let values = dates
+		elseif object_type == 'Image'
+			let values = imags
+		elseif object_type == 'Array'
+			let values = arrays
+		elseif object_type == 'Boolean'
+			" TODO: a bit more than real boolean
+			let values = arrays
+		elseif object_type == 'XMLHttpRequest'
+			let values = xmlhs
+		elseif object_type == 'String'
+			let values = stris
+		endif
+
+		if !exists('values')
+		" List of properties
+		if shortcontext =~ 'Math\.$'
+			let values = maths
+		elseif shortcontext =~ 'anchor\.$'
+			let values = anths
+		elseif shortcontext =~ 'area\.$'
+			let values = areas
+		elseif shortcontext =~ 'base\.$'
+			let values = bases
+		elseif shortcontext =~ 'body\.$'
+			let values = bodys
+		elseif shortcontext =~ 'document\.$'
+			let values = docus
+		elseif shortcontext =~ 'form\.$'
+			let values = forms
+		elseif shortcontext =~ 'frameset\.$'
+			let values = fsets
+		elseif shortcontext =~ 'history\.$'
+			let values = hists
+		elseif shortcontext =~ 'iframe\.$'
+			let values = ifras
+		elseif shortcontext =~ 'image\.$'
+			let values = imags
+		elseif shortcontext =~ 'link\.$'
+			let values = links
+		elseif shortcontext =~ 'location\.$'
+			let values = locas
+		elseif shortcontext =~ 'meta\.$'
+			let values = metas
+		elseif shortcontext =~ 'navigator\.$'
+			let values = navis
+		elseif shortcontext =~ 'object\.$'
+			let values = objes
+		elseif shortcontext =~ 'screen\.$'
+			let values = scres
+		elseif shortcontext =~ 'style\.$'
+			let values = styls
+		elseif shortcontext =~ 'table\.$'
+			let values = tabls
+		elseif shortcontext =~ 'TableData\.$'
+			let values = tdats
+		elseif shortcontext =~ 'TableRow\.$'
+			let values = trows
+		elseif shortcontext =~ 'window\.$'
+			let values = winds
+		else
+			let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris
+			let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists
+			let values += ifras + imags + links + locas + metas + navis + objes + scres + styls
+			let values += tabls + trows + winds
+		endif
+		endif
+
+		for m in values
+			if m =~? '^'.a:base
+				call add(res, m)
+			elseif m =~? a:base
+				call add(res2, m)
+			endif
+		endfor
+
+		unlet! values
+		return res + res2
+
+	endif
+
+	if exists("b:jsrange")
+		let file = getline(b:jsrange[0],b:jsrange[1])
+		unlet! b:jsrange
+	else
+		let file = getline(1, '$')
+	endif
+
+	" Get variables data.
+	let variables = filter(copy(file), 'v:val =~ "var\\s"')
+	call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")')
+	call map(variables, 'substitute(v:val, ";\\|$", ",", "g")')
+	let vars = []
+	" This loop is necessary to get variable names from constructs like:
+	" var var1, var2, var3 = "something";
+	for i in range(len(variables))
+		let comma_separated = split(variables[i], ',\s*')
+		call map(comma_separated, 'matchstr(v:val, "\\w\\+")')
+		let vars += comma_separated
+	endfor
+
+	let variables = sort(vars)
+
+	" Add undeclared variables.
+	let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\w\\+\\s*="')
+	call map(undeclared_variables, 'matchstr(v:val, "^\\s*\\zs\\w\\+\\ze")')
+
+	let variables += sort(undeclared_variables)
+
+	" Get functions
+	let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
+	let arguments = copy(functions)
+	call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\w\\+")')
+	call map(functions, 'v:val."("')
+
+	" Get functions arguments
+	call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
+	let jargs = join(arguments, ',')
+	let jargs = substitute(jargs, '\s', '', 'g')
+	let arguments = split(jargs, ',')
+
+	" Built-in functions
+	let builtin = []
+
+	" Top-level HTML DOM objects
+	let htmldom = ['document', 'anchor', 'area', 'base', 'body', 'document', 'event', 'form', 'frame', 'frameset', 'history', 'iframe', 'image', 'input', 'link', 'location', 'meta', 'navigator', 'object', 'option', 'screen', 'select', 'table', 'tableData', 'tableHeader', 'tableRow', 'textarea', 'window']
+	call map(htmldom, 'v:val."."')
+
+	" Top-level properties
+	let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
+				\ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
+				\ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
+
+	" Keywords
+	let keywords = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String", "XMLHttpRequest", "ActiveXObject", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double ", "else", "enum", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in ", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super ", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with"]
+
+	let values = variables + functions + htmldom + arguments + builtin + properties + keywords
+
+	for m in values
+		if m =~? '^'.a:base
+			call add(res, m)
+		elseif m =~? a:base
+			call add(res2, m)
+		endif
+	endfor
+
+	return res + res2
+endfunction
diff --git a/runtime/autoload/spellfile.vim b/runtime/autoload/spellfile.vim
new file mode 100644
index 0000000..387f189
--- /dev/null
+++ b/runtime/autoload/spellfile.vim
@@ -0,0 +1,111 @@
+" Vim script to download a missing spell file
+" Maintainer:	Bram Moolenaar <Bram@vim.org>
+" Last Change:	2006 Feb 01
+
+if !exists('g:spellfile_URL')
+  let g:spellfile_URL = 'ftp://ftp.vim.org/pub/vim/unstable/runtime/spell'
+endif
+let s:spellfile_URL = ''    " Start with nothing so that s:donedict is reset.
+
+" This function is used for the spellfile plugin.
+function! spellfile#LoadFile(lang)
+  " If the netrw plugin isn't loaded we silently skip everything.
+  if !exists(":Nread")
+    if &verbose
+      echomsg 'spellfile#LoadFile(): Nread command is not available.'
+    endif
+    return
+  endif
+
+  " If the URL changes we try all files again.
+  if s:spellfile_URL != g:spellfile_URL
+    let s:donedict = {}
+    let s:spellfile_URL = g:spellfile_URL
+  endif
+
+  " I will say this only once!
+  if has_key(s:donedict, a:lang . &enc)
+    if &verbose
+      echomsg 'spellfile#LoadFile(): Tried this language/encoding before.'
+    endif
+    return
+  endif
+  let s:donedict[a:lang . &enc] = 1
+
+  " Find spell directories we can write in.
+  let dirlist = []
+  let dirchoices = '&Cancel'
+  for dir in split(globpath(&rtp, 'spell'), "\n")
+    if filewritable(dir) == 2
+      call add(dirlist, dir)
+      let dirchoices .= "\n&" . len(dirlist)
+    endif
+  endfor
+  if len(dirlist) == 0
+    if &verbose
+      echomsg 'spellfile#LoadFile(): There is no writable spell directory.'
+    endif
+    return
+  endif
+
+  let msg = 'Cannot find spell file for "' . a:lang . '" in ' . &enc
+  let msg .= "\nDo you want me to try downloading it?"
+  if confirm(msg, "&Yes\n&No", 2) == 1
+    let enc = &encoding
+    if enc == 'iso-8859-15'
+      let enc = 'latin1'
+    endif
+    let fname = a:lang . '.' . enc . '.spl'
+
+    " Split the window, read the file into a new buffer.
+    new
+    setlocal bin
+    echo 'Downloading ' . fname . '...'
+    exe 'Nread ' g:spellfile_URL . '/' . fname
+    if getline(2) !~ 'VIMspell'
+      " Didn't work, perhaps there is an ASCII one.
+      g/^/d
+      let fname = a:lang . '.ascii.spl'
+      echo 'Could not find it, trying ' . fname . '...'
+      exe 'Nread ' g:spellfile_URL . '/' . fname
+      if getline(2) !~ 'VIMspell'
+	echo 'Sorry, downloading failed'
+	bwipe!
+	return
+      endif
+    endif
+
+    " Delete the empty first line and mark the file unmodified.
+    1d
+    set nomod
+
+    let msg = "In which directory do you want to write the file:"
+    for i in range(len(dirlist))
+      let msg .= "\n" . (i + 1) . '. ' . dirlist[i]
+    endfor
+    let dirchoice = confirm(msg, dirchoices) - 2
+    if dirchoice >= 0
+      exe "write " . escape(dirlist[dirchoice], ' ') . '/' . fname
+
+      " Also download the .sug file, if the user wants to.
+      let msg = "Do you want me to try getting the .sug file?\n"
+      let msg .= "This will improve making suggestions for spelling mistakes,\n"
+      let msg .= "but it uses quite a bit of memory."
+      if confirm(msg, "&No\n&Yes") == 2
+	g/^/d
+	let fname = substitute(fname, '\.spl$', '.sug', '')
+	echo 'Downloading ' . fname . '...'
+	exe 'Nread ' g:spellfile_URL . '/' . fname
+	if getline(2) !~ 'VIMsug'
+	  echo 'Sorry, downloading failed'
+	else
+	  1d
+	  exe "write " . escape(dirlist[dirchoice], ' ') . '/' . fname
+	endif
+	set nomod
+      endif
+    endif
+
+    bwipe
+  endif
+endfunc