11ef15e30SBram Moolenaar" Vim completion script
21ef15e30SBram Moolenaar" Language:	Java Script
31ef15e30SBram Moolenaar" Maintainer:	Mikolaj Machowski ( mikmach AT wp DOT pl )
4*8b6144bdSBram Moolenaar" Last Change:	2006 Feb 6
51ef15e30SBram Moolenaar
61ef15e30SBram Moolenaarfunction! javascriptcomplete#CompleteJS(findstart, base)
71ef15e30SBram Moolenaar  if a:findstart
81ef15e30SBram Moolenaar	" locate the start of the word
91ef15e30SBram Moolenaar	let line = getline('.')
101ef15e30SBram Moolenaar	let start = col('.') - 1
111ef15e30SBram Moolenaar	let curline = line('.')
121ef15e30SBram Moolenaar	let compl_begin = col('.') - 2
131ef15e30SBram Moolenaar	" Bit risky but JS is rather limited language and local chars shouldn't
141ef15e30SBram Moolenaar	" fint way into names
151ef15e30SBram Moolenaar	while start >= 0 && line[start - 1] =~ '\w'
161ef15e30SBram Moolenaar		let start -= 1
171ef15e30SBram Moolenaar	endwhile
181ef15e30SBram Moolenaar	let b:compl_context = getline('.')[0:compl_begin]
191ef15e30SBram Moolenaar	return start
201ef15e30SBram Moolenaar  else
211ef15e30SBram Moolenaar	" Initialize base return lists
221ef15e30SBram Moolenaar	let res = []
231ef15e30SBram Moolenaar	let res2 = []
241ef15e30SBram Moolenaar	" a:base is very short - we need context
251ef15e30SBram Moolenaar	" Shortcontext is context without a:base, useful for checking if we are
26*8b6144bdSBram Moolenaar	" looking for objects and for what objects we are looking for
27*8b6144bdSBram Moolenaar	let context = b:compl_context
281ef15e30SBram Moolenaar	let shortcontext = substitute(context, a:base.'$', '', '')
291ef15e30SBram Moolenaar	unlet! b:compl_context
301ef15e30SBram Moolenaar
31*8b6144bdSBram Moolenaar	if exists("b:jsrange")
32*8b6144bdSBram Moolenaar		let file = getline(b:jsrange[0],b:jsrange[1])
33*8b6144bdSBram Moolenaar		unlet! b:jsrange
34*8b6144bdSBram Moolenaar
35*8b6144bdSBram Moolenaar		if len(b:js_extfiles) > 0
36*8b6144bdSBram Moolenaar			let file = b:js_extfiles + file
37*8b6144bdSBram Moolenaar		endif
38*8b6144bdSBram Moolenaar
39*8b6144bdSBram Moolenaar	else
40*8b6144bdSBram Moolenaar		let file = getline(1, '$')
41*8b6144bdSBram Moolenaar	endif
42*8b6144bdSBram Moolenaar
43*8b6144bdSBram Moolenaar
44*8b6144bdSBram Moolenaar	" Completion of properties, methods, etc. {{{
451ef15e30SBram Moolenaar	if shortcontext =~ '\.$'
461ef15e30SBram Moolenaar		" Complete methods and properties for objects
471ef15e30SBram Moolenaar		" DOM separate
481ef15e30SBram Moolenaar		let doms = ['style.']
491ef15e30SBram Moolenaar		" Arrays
501ef15e30SBram Moolenaar		let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype']
511ef15e30SBram Moolenaar		let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift',
521ef15e30SBram Moolenaar					\ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf',
531ef15e30SBram Moolenaar					\ 'watch', 'unwatch']
541ef15e30SBram Moolenaar		call map(arraymeth, 'v:val."("')
551ef15e30SBram Moolenaar		let arrays = arrayprop + arraymeth
561ef15e30SBram Moolenaar
571ef15e30SBram Moolenaar		" Boolean - complete subset of array values
581ef15e30SBram Moolenaar		" properties - constructor, prototype
591ef15e30SBram Moolenaar		" methods    - toSource, toString, valueOf
601ef15e30SBram Moolenaar
611ef15e30SBram Moolenaar		" Date
621ef15e30SBram Moolenaar		" properties - constructor, prototype
631ef15e30SBram Moolenaar		let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds',
641ef15e30SBram Moolenaar					\ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset',
651ef15e30SBram Moolenaar					\ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds',
661ef15e30SBram Moolenaar					\ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
671ef15e30SBram Moolenaar					\ 'getYear', 'parse', 'parse',
681ef15e30SBram Moolenaar					\ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds',
691ef15e30SBram Moolenaar					\ 'setMinutes', 'setMonth', 'setSeconds',
701ef15e30SBram Moolenaar					\ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds',
711ef15e30SBram Moolenaar					\ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime',
721ef15e30SBram Moolenaar					\ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString',
731ef15e30SBram Moolenaar					\ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch']
741ef15e30SBram Moolenaar		call map(datemeth, 'v:val."("')
751ef15e30SBram Moolenaar		let dates = datemeth
761ef15e30SBram Moolenaar
771ef15e30SBram Moolenaar		" Function
781ef15e30SBram Moolenaar		let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length',
791ef15e30SBram Moolenaar					\ 'arity', 'constructor', 'length', 'prototype']
801ef15e30SBram Moolenaar		let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf']
811ef15e30SBram Moolenaar		call map(funcmeth, 'v:val."("')
821ef15e30SBram Moolenaar		let funcs = funcprop + funcmeth
831ef15e30SBram Moolenaar
841ef15e30SBram Moolenaar		" Math
851ef15e30SBram Moolenaar		let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT']
861ef15e30SBram Moolenaar		let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor',
871ef15e30SBram Moolenaar					\ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan',
881ef15e30SBram Moolenaar					\ 'watch', 'unwatch']
891ef15e30SBram Moolenaar		call map(mathmeth, 'v:val."("')
901ef15e30SBram Moolenaar		let maths = mathprop + mathmeth
911ef15e30SBram Moolenaar
921ef15e30SBram Moolenaar		" Number
931ef15e30SBram Moolenaar		let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY',
941ef15e30SBram Moolenaar					\ 'constructor', 'prototype']
951ef15e30SBram Moolenaar		let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf',
961ef15e30SBram Moolenaar					\ 'watch', 'unwatch']
971ef15e30SBram Moolenaar		call map(numbmeth, 'v:val."("')
981ef15e30SBram Moolenaar		let numbs = numbprop + numbmeth
991ef15e30SBram Moolenaar
1001ef15e30SBram Moolenaar		" Object
1011ef15e30SBram Moolenaar		let objeprop = ['constructor', 'prototype']
1021ef15e30SBram Moolenaar		let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf']
1031ef15e30SBram Moolenaar		call map(objemeth, 'v:val."("')
1041ef15e30SBram Moolenaar		let objes = objeprop + objemeth
1051ef15e30SBram Moolenaar
1061ef15e30SBram Moolenaar		" RegExp
1071ef15e30SBram Moolenaar		let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
108*8b6144bdSBram Moolenaar		let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch']
1091ef15e30SBram Moolenaar		call map(regemeth, 'v:val."("')
1101ef15e30SBram Moolenaar		let reges = regeprop + regemeth
1111ef15e30SBram Moolenaar
1121ef15e30SBram Moolenaar		" String
1131ef15e30SBram Moolenaar		let striprop = ['constructor', 'length', 'prototype']
1141ef15e30SBram Moolenaar		let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat',
1151ef15e30SBram Moolenaar					\ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics',
1161ef15e30SBram Moolenaar					\ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small',
1171ef15e30SBram Moolenaar					\ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase',
1181ef15e30SBram Moolenaar					\ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch']
1191ef15e30SBram Moolenaar		call map(strimeth, 'v:val."("')
1201ef15e30SBram Moolenaar		let stris = striprop + strimeth
1211ef15e30SBram Moolenaar
1221ef15e30SBram Moolenaar		" User created properties
1231ef15e30SBram Moolenaar		let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\w"')
1241ef15e30SBram Moolenaar		let juser_props1 = join(user_props1, ' ')
1251ef15e30SBram Moolenaar		let user_props1 = split(juser_props1, '\zethis\.')
1261ef15e30SBram Moolenaar		unlet! juser_props1
1271ef15e30SBram Moolenaar		call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\w\\+\\ze")')
128*8b6144bdSBram Moolenaar
1291ef15e30SBram Moolenaar		let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\w"')
130*8b6144bdSBram Moolenaar		let juser_props2 = join(user_props2, ' ')
131*8b6144bdSBram Moolenaar		let user_props2 = split(juser_props2, '\zeprototype\.')
132*8b6144bdSBram Moolenaar		unlet! juser_props2
133*8b6144bdSBram Moolenaar		call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\w\\+\\ze")')
1341ef15e30SBram Moolenaar		let user_props = user_props1 + user_props2
1351ef15e30SBram Moolenaar
1361ef15e30SBram Moolenaar		" HTML DOM properties
1371ef15e30SBram Moolenaar		" Anchors - anchor.
1381ef15e30SBram Moolenaar		let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML',
1391ef15e30SBram Moolenaar					\ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus']
1401ef15e30SBram Moolenaar		let anchmeth = ['blur', 'focus']
1411ef15e30SBram Moolenaar		call map(anchmeth, 'v:val."("')
1421ef15e30SBram Moolenaar		let anths = anchprop + anchmeth
1431ef15e30SBram Moolenaar		" Area - area.
1441ef15e30SBram Moolenaar		let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id',
1451ef15e30SBram Moolenaar					\ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target']
1461ef15e30SBram Moolenaar		let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver']
1471ef15e30SBram Moolenaar		call map(areameth, 'v:val."("')
1481ef15e30SBram Moolenaar		let areas = areaprop + areameth
1491ef15e30SBram Moolenaar		" Base - base.
1501ef15e30SBram Moolenaar		let baseprop = ['href', 'id', 'target']
1511ef15e30SBram Moolenaar		let bases = baseprop
1521ef15e30SBram Moolenaar		" Body - body.
1531ef15e30SBram Moolenaar		let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop',
1541ef15e30SBram Moolenaar					\ 'text', 'vLink']
1551ef15e30SBram Moolenaar		let bodys = bodyprop
1561ef15e30SBram Moolenaar		" Document - document.
1571ef15e30SBram Moolenaar		let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
1581ef15e30SBram Moolenaar					\ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
1591ef15e30SBram Moolenaar		let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
1601ef15e30SBram Moolenaar					\ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
1611ef15e30SBram Moolenaar					\ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
1621ef15e30SBram Moolenaar					\ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
1631ef15e30SBram Moolenaar		call map(documeth, 'v:val."("')
164*8b6144bdSBram Moolenaar		let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
165*8b6144bdSBram Moolenaar					\ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
166*8b6144bdSBram Moolenaar					\ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling']
167*8b6144bdSBram Moolenaar		let docuxmeth = ['createAttribute', 'createCDATASection',
168*8b6144bdSBram Moolenaar					\ 'createComment', 'createDocument', 'createDocumentFragment',
169*8b6144bdSBram Moolenaar					\ 'createElement', 'createEntityReference', 'createProcessingInstruction',
170*8b6144bdSBram Moolenaar					\ 'createTextNode']
171*8b6144bdSBram Moolenaar		call map(docuxmeth, 'v:val."("')
172*8b6144bdSBram Moolenaar		let docus = docuprop + docuxprop + documeth + docuxmeth
1731ef15e30SBram Moolenaar		" Form - form.
1741ef15e30SBram Moolenaar		let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
1751ef15e30SBram Moolenaar					\ 'method', 'name', 'tabIndex', 'target']
1761ef15e30SBram Moolenaar		let formmeth = ['reset', 'submit', 'onReset', 'onSubmit']
1771ef15e30SBram Moolenaar		call map(formmeth, 'v:val."("')
1781ef15e30SBram Moolenaar		let forms = formprop + formmeth
1791ef15e30SBram Moolenaar		" Frame - frame.
1801ef15e30SBram Moolenaar		let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth',
1811ef15e30SBram Moolenaar					\ 'name', 'noResize', 'scrolling', 'src']
1821ef15e30SBram Moolenaar		let frammeth = ['blur', 'focus']
1831ef15e30SBram Moolenaar		call map(frammeth, 'v:val."("')
1841ef15e30SBram Moolenaar		let frams = framprop + frammeth
1851ef15e30SBram Moolenaar		" Frameset - frameset.
1861ef15e30SBram Moolenaar		let fsetprop = ['cols', 'id', 'rows']
1871ef15e30SBram Moolenaar		let fsetmeth = ['blur', 'focus']
1881ef15e30SBram Moolenaar		call map(fsetmeth, 'v:val."("')
1891ef15e30SBram Moolenaar		let fsets = fsetprop + fsetmeth
1901ef15e30SBram Moolenaar		" History - history.
1911ef15e30SBram Moolenaar		let histprop = ['length']
1921ef15e30SBram Moolenaar		let histmeth = ['back', 'forward', 'go']
1931ef15e30SBram Moolenaar		call map(histmeth, 'v:val."("')
1941ef15e30SBram Moolenaar		let hists = histprop + histmeth
1951ef15e30SBram Moolenaar		" Iframe - iframe.
1961ef15e30SBram Moolenaar		let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth',
1971ef15e30SBram Moolenaar					\ 'name', 'scrolling', 'src', 'width']
1981ef15e30SBram Moolenaar		let ifras = ifraprop
1991ef15e30SBram Moolenaar		" Image - image.
2001ef15e30SBram Moolenaar		let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
201*8b6144bdSBram Moolenaar					\ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width']
2021ef15e30SBram Moolenaar		let imagmeth = ['onAbort', 'onError', 'onLoad']
2031ef15e30SBram Moolenaar		call map(imagmeth, 'v:val."("')
2041ef15e30SBram Moolenaar		let imags = histprop + imagmeth
2051ef15e30SBram Moolenaar		" Button - accessible only by other properties
2061ef15e30SBram Moolenaar		let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
2071ef15e30SBram Moolenaar		let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
2081ef15e30SBram Moolenaar		call map(buttmeth, 'v:val."("')
2091ef15e30SBram Moolenaar		let butts = buttprop + buttmeth
2101ef15e30SBram Moolenaar		" Checkbox - accessible only by other properties
2111ef15e30SBram Moolenaar		let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
2121ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
2131ef15e30SBram Moolenaar		let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
2141ef15e30SBram Moolenaar		call map(checmeth, 'v:val."("')
2151ef15e30SBram Moolenaar		let checs = checprop + checmeth
2161ef15e30SBram Moolenaar		" File upload - accessible only by other properties
2171ef15e30SBram Moolenaar		let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
2181ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
2191ef15e30SBram Moolenaar		let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
2201ef15e30SBram Moolenaar		call map(filemeth, 'v:val."("')
2211ef15e30SBram Moolenaar		let files = fileprop + filemeth
2221ef15e30SBram Moolenaar		" Hidden - accessible only by other properties
2231ef15e30SBram Moolenaar		let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value']
2241ef15e30SBram Moolenaar		let hidds = hiddprop
2251ef15e30SBram Moolenaar		" Password - accessible only by other properties
2261ef15e30SBram Moolenaar		let passprop = ['accept', 'accessKey', 'defaultValue',
2271ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex',
2281ef15e30SBram Moolenaar					\ 'type', 'value']
2291ef15e30SBram Moolenaar		let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown',
2301ef15e30SBram Moolenaar					\ 'onKeyPress', 'onKeyUp']
2311ef15e30SBram Moolenaar		call map(passmeth, 'v:val."("')
2321ef15e30SBram Moolenaar		let passs = passprop + passmeth
2331ef15e30SBram Moolenaar		" Radio - accessible only by other properties
2341ef15e30SBram Moolenaar		let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
2351ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
2361ef15e30SBram Moolenaar		let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
2371ef15e30SBram Moolenaar		call map(radimeth, 'v:val."("')
2381ef15e30SBram Moolenaar		let radis = radiprop + radimeth
2391ef15e30SBram Moolenaar		" Reset - accessible only by other properties
2401ef15e30SBram Moolenaar		let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
2411ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
2421ef15e30SBram Moolenaar		let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
2431ef15e30SBram Moolenaar		call map(resemeth, 'v:val."("')
2441ef15e30SBram Moolenaar		let reses = reseprop + resemeth
2451ef15e30SBram Moolenaar		" Submit - accessible only by other properties
2461ef15e30SBram Moolenaar		let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
2471ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
2481ef15e30SBram Moolenaar		let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart']
2491ef15e30SBram Moolenaar		call map(submmeth, 'v:val."("')
2501ef15e30SBram Moolenaar		let subms = submprop + submmeth
2511ef15e30SBram Moolenaar		" Text - accessible only by other properties
2521ef15e30SBram Moolenaar		let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
2531ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly',
2541ef15e30SBram Moolenaar					\ 'size', 'tabIndex', 'type', 'value']
2551ef15e30SBram Moolenaar		let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown',
2561ef15e30SBram Moolenaar					\ 'onKeyPress', 'onKeyUp', 'onSelect']
2571ef15e30SBram Moolenaar		call map(textmeth, 'v:val."("')
2581ef15e30SBram Moolenaar		let texts = textprop + textmeth
2591ef15e30SBram Moolenaar		" Link - link.
2601ef15e30SBram Moolenaar		let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media',
2611ef15e30SBram Moolenaar					\ 'rel', 'rev', 'target', 'type']
2621ef15e30SBram Moolenaar		let linkmeth = ['onLoad']
2631ef15e30SBram Moolenaar		call map(linkmeth, 'v:val."("')
2641ef15e30SBram Moolenaar		let links = linkprop + linkmeth
2651ef15e30SBram Moolenaar		" Location - location.
2661ef15e30SBram Moolenaar		let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol',
2671ef15e30SBram Moolenaar					\ 'search']
2681ef15e30SBram Moolenaar		let locameth = ['assign', 'reload', 'replace']
2691ef15e30SBram Moolenaar		call map(locameth, 'v:val."("')
2701ef15e30SBram Moolenaar		let locas = locaprop + locameth
2711ef15e30SBram Moolenaar		" Meta - meta.
2721ef15e30SBram Moolenaar		let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme']
2731ef15e30SBram Moolenaar		let metas = metaprop
2741ef15e30SBram Moolenaar		" Navigator - navigator.
2751ef15e30SBram Moolenaar		let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled',
2761ef15e30SBram Moolenaar					\ 'platform', 'userAgent']
2771ef15e30SBram Moolenaar		let navimeth = ['javaEnabled', 'taintEnabled']
2781ef15e30SBram Moolenaar		call map(navimeth, 'v:val."("')
2791ef15e30SBram Moolenaar		let navis = naviprop + navimeth
2801ef15e30SBram Moolenaar		" Object - object.
2811ef15e30SBram Moolenaar		let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data',
2821ef15e30SBram Moolenaar					\ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex',
2831ef15e30SBram Moolenaar					\ 'type', 'useMap', 'vspace', 'width']
2841ef15e30SBram Moolenaar		let objes = objeprop
2851ef15e30SBram Moolenaar		" Option - accessible only by other properties
2861ef15e30SBram Moolenaar		let optiprop = ['defaultSelected',
2871ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value']
2881ef15e30SBram Moolenaar		let optis = optiprop
2891ef15e30SBram Moolenaar		" Screen - screen.
2901ef15e30SBram Moolenaar		let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width']
2911ef15e30SBram Moolenaar		let scres = screprop
2921ef15e30SBram Moolenaar		" Select - accessible only by other properties
2931ef15e30SBram Moolenaar		let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name',
2941ef15e30SBram Moolenaar					\ 'selectedIndex', 'size', 'tabIndex', 'type', 'value']
2951ef15e30SBram Moolenaar		let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus']
2961ef15e30SBram Moolenaar		call map(selemeth, 'v:val."("')
2971ef15e30SBram Moolenaar		let seles = seleprop + selemeth
2981ef15e30SBram Moolenaar		" Style - style.
2991ef15e30SBram Moolenaar		let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage',
3001ef15e30SBram Moolenaar					\ 'backgroundPosition', 'backgroundRepeat',
3011ef15e30SBram Moolenaar					\ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop',
3021ef15e30SBram Moolenaar					\ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor',
3031ef15e30SBram Moolenaar					\ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle',
3041ef15e30SBram Moolenaar					\ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth',
3051ef15e30SBram Moolenaar					\ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom',
3061ef15e30SBram Moolenaar					\ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth',
3071ef15e30SBram Moolenaar					\ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom',
3081ef15e30SBram Moolenaar					\ 'paddingLeft', 'paddingRight', 'paddingTop',
3091ef15e30SBram Moolenaar					\ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content',
3101ef15e30SBram Moolenaar					\ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction',
3111ef15e30SBram Moolenaar					\ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight',
3121ef15e30SBram Moolenaar					\ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility',
3131ef15e30SBram Moolenaar					\ 'width',
3141ef15e30SBram Moolenaar					\ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType',
3151ef15e30SBram Moolenaar					\ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex',
3161ef15e30SBram Moolenaar					\ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside',
3171ef15e30SBram Moolenaar					\ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout',
3181ef15e30SBram Moolenaar					\ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
3191ef15e30SBram Moolenaar					\ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes',
3201ef15e30SBram Moolenaar					\ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition',
3211ef15e30SBram Moolenaar					\ 'unicodeBidi', 'whiteSpace', 'wordSpacing']
3221ef15e30SBram Moolenaar		let styls = stylprop
3231ef15e30SBram Moolenaar		" Table - table.
3241ef15e30SBram Moolenaar		let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding',
3251ef15e30SBram Moolenaar					\ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width']
3261ef15e30SBram Moolenaar		let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow',
3271ef15e30SBram Moolenaar					\ 'deleteTFoot', 'deleteTHead', 'insertRow']
3281ef15e30SBram Moolenaar		call map(tablmeth, 'v:val."("')
3291ef15e30SBram Moolenaar		let tabls = tablprop + tablmeth
3301ef15e30SBram Moolenaar		" Table data - TableData.
3311ef15e30SBram Moolenaar		let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff',
3321ef15e30SBram Moolenaar					\ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width']
3331ef15e30SBram Moolenaar		let tdats = tdatprop
3341ef15e30SBram Moolenaar		" Table row - TableRow.
3351ef15e30SBram Moolenaar		let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex',
3361ef15e30SBram Moolenaar					\ 'vAlign']
3371ef15e30SBram Moolenaar		let trowmeth = ['deleteCell', 'insertCell']
3381ef15e30SBram Moolenaar		call map(trowmeth, 'v:val."("')
3391ef15e30SBram Moolenaar		let trows = trowprop + trowmeth
3401ef15e30SBram Moolenaar		" Textarea - accessible only by other properties
3411ef15e30SBram Moolenaar		let tareprop = ['accessKey', 'cols', 'defaultValue',
3421ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows',
343*8b6144bdSBram Moolenaar					\ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd']
3441ef15e30SBram Moolenaar		let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus']
3451ef15e30SBram Moolenaar		call map(taremeth, 'v:val."("')
3461ef15e30SBram Moolenaar		let tares = tareprop + taremeth
3471ef15e30SBram Moolenaar		" Window - window.
348*8b6144bdSBram Moolenaar		let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history',
349*8b6144bdSBram Moolenaar					\ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self',
350*8b6144bdSBram Moolenaar					\ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject']
3511ef15e30SBram Moolenaar		let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
3521ef15e30SBram Moolenaar					\ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
3531ef15e30SBram Moolenaar					\ 'setTimeout']
3541ef15e30SBram Moolenaar		call map(windmeth, 'v:val."("')
3551ef15e30SBram Moolenaar		let winds = windprop + windmeth
3561ef15e30SBram Moolenaar		" XMLHttpRequest - access by new xxx()
3571ef15e30SBram Moolenaar		let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
358*8b6144bdSBram Moolenaar					\ 'status', 'statusText', 'parseError']
3591ef15e30SBram Moolenaar		let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
3601ef15e30SBram Moolenaar					\ 'send', 'setRequestHeader']
3611ef15e30SBram Moolenaar		call map(xmlhmeth, 'v:val."("')
3621ef15e30SBram Moolenaar		let xmlhs = xmlhprop + xmlhmeth
3631ef15e30SBram Moolenaar
364*8b6144bdSBram Moolenaar		" XML DOM
365*8b6144bdSBram Moolenaar		" Attributes - element.attributes[x].
366*8b6144bdSBram Moolenaar		let xdomattrprop = ['name', 'specified', 'value']
367*8b6144bdSBram Moolenaar		" Element - anyelement.
368*8b6144bdSBram Moolenaar		let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
369*8b6144bdSBram Moolenaar					\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
370*8b6144bdSBram Moolenaar					\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
371*8b6144bdSBram Moolenaar		let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode',
372*8b6144bdSBram Moolenaar					\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize',
373*8b6144bdSBram Moolenaar					\ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild',
374*8b6144bdSBram Moolenaar					\ 'setAttribute', 'setAttributeNode']
375*8b6144bdSBram Moolenaar		call map(xdomelemmeth, 'v:val."("')
376*8b6144bdSBram Moolenaar		let xdomelems = xdomelemprop + xdomelemmeth
377*8b6144bdSBram Moolenaar		" Node - anynode.
378*8b6144bdSBram Moolenaar		let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
379*8b6144bdSBram Moolenaar					\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
380*8b6144bdSBram Moolenaar					\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling']
381*8b6144bdSBram Moolenaar		let xdomnodemeth = ['appendChild', 'cloneNode',
382*8b6144bdSBram Moolenaar					\ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild']
383*8b6144bdSBram Moolenaar		call map(xdomnodemeth, 'v:val."("')
384*8b6144bdSBram Moolenaar		let xdomnodes = xdomnodeprop + xdomnodemeth
385*8b6144bdSBram Moolenaar		" NodeList
386*8b6144bdSBram Moolenaar		let xdomnliss = ['length', 'item(']
387*8b6144bdSBram Moolenaar		" Error - parseError.
388*8b6144bdSBram Moolenaar		let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos']
389*8b6144bdSBram Moolenaar
390*8b6144bdSBram Moolenaar		" Find object type declaration to reduce number of suggestions. {{{
391*8b6144bdSBram Moolenaar		" 1. Get object name
392*8b6144bdSBram Moolenaar		" 2. Find object declaration line
393*8b6144bdSBram Moolenaar		" 3. General declaration follows "= new Type" syntax, additional else
394*8b6144bdSBram Moolenaar		"    for regexp "= /re/"
395*8b6144bdSBram Moolenaar		" 4. Make correction for Microsoft.XMLHTTP ActiveXObject
396*8b6144bdSBram Moolenaar		" 5. Repeat for external files
3971ef15e30SBram Moolenaar		let object = matchstr(shortcontext, '\zs\w\+\ze\(\[.\{-}\]\)\?\.$')
398*8b6144bdSBram Moolenaar		if len(object) > 0
3991ef15e30SBram Moolenaar			let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
400*8b6144bdSBram Moolenaar			if decl_line > 0
4011ef15e30SBram Moolenaar				let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\w\+\ze')
402*8b6144bdSBram Moolenaar				if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
403*8b6144bdSBram Moolenaar						let object_type = 'XMLHttpRequest'
404*8b6144bdSBram Moolenaar				endif
405*8b6144bdSBram Moolenaar			else
406*8b6144bdSBram Moolenaar				let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn')
407*8b6144bdSBram Moolenaar				if decl_line > 0
408*8b6144bdSBram Moolenaar					let object_type = 'RegExp'
409*8b6144bdSBram Moolenaar				endif
410*8b6144bdSBram Moolenaar			endif
411*8b6144bdSBram Moolenaar			" We didn't find var declaration in current file but we may have
412*8b6144bdSBram Moolenaar			" something in external files.
413*8b6144bdSBram Moolenaar			if decl_line == 0 && exists("b:js_extfiles")
414*8b6144bdSBram Moolenaar				let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
415*8b6144bdSBram Moolenaar				if len(dext_line) > 0
416*8b6144bdSBram Moolenaar					let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\w\+\ze')
417*8b6144bdSBram Moolenaar					if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
418*8b6144bdSBram Moolenaar							let object_type = 'XMLHttpRequest'
419*8b6144bdSBram Moolenaar					endif
420*8b6144bdSBram Moolenaar				else
421*8b6144bdSBram Moolenaar					let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"')
422*8b6144bdSBram Moolenaar					if len(dext_line) > 0
423*8b6144bdSBram Moolenaar						let object_type = 'RegExp'
424*8b6144bdSBram Moolenaar					endif
425*8b6144bdSBram Moolenaar				endif
426*8b6144bdSBram Moolenaar			endif
427*8b6144bdSBram Moolenaar		endif
428*8b6144bdSBram Moolenaar		" }}}
429*8b6144bdSBram Moolenaar
430*8b6144bdSBram Moolenaar		if !exists('object_type')
431*8b6144bdSBram Moolenaar			let object_type = ''
432*8b6144bdSBram Moolenaar		endif
4331ef15e30SBram Moolenaar
4341ef15e30SBram Moolenaar		if object_type == 'Date'
4351ef15e30SBram Moolenaar			let values = dates
4361ef15e30SBram Moolenaar		elseif object_type == 'Image'
4371ef15e30SBram Moolenaar			let values = imags
4381ef15e30SBram Moolenaar		elseif object_type == 'Array'
4391ef15e30SBram Moolenaar			let values = arrays
4401ef15e30SBram Moolenaar		elseif object_type == 'Boolean'
4411ef15e30SBram Moolenaar			" TODO: a bit more than real boolean
4421ef15e30SBram Moolenaar			let values = arrays
4431ef15e30SBram Moolenaar		elseif object_type == 'XMLHttpRequest'
4441ef15e30SBram Moolenaar			let values = xmlhs
4451ef15e30SBram Moolenaar		elseif object_type == 'String'
4461ef15e30SBram Moolenaar			let values = stris
447*8b6144bdSBram Moolenaar		elseif object_type == 'RegExp'
448*8b6144bdSBram Moolenaar			let values = reges
449*8b6144bdSBram Moolenaar		elseif object_type == 'Math'
450*8b6144bdSBram Moolenaar			let values = maths
4511ef15e30SBram Moolenaar		endif
4521ef15e30SBram Moolenaar
4531ef15e30SBram Moolenaar		if !exists('values')
4541ef15e30SBram Moolenaar		" List of properties
4551ef15e30SBram Moolenaar		if shortcontext =~ 'Math\.$'
4561ef15e30SBram Moolenaar			let values = maths
457*8b6144bdSBram Moolenaar		elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$'
4581ef15e30SBram Moolenaar			let values = anths
4591ef15e30SBram Moolenaar		elseif shortcontext =~ 'area\.$'
4601ef15e30SBram Moolenaar			let values = areas
4611ef15e30SBram Moolenaar		elseif shortcontext =~ 'base\.$'
4621ef15e30SBram Moolenaar			let values = bases
4631ef15e30SBram Moolenaar		elseif shortcontext =~ 'body\.$'
4641ef15e30SBram Moolenaar			let values = bodys
4651ef15e30SBram Moolenaar		elseif shortcontext =~ 'document\.$'
4661ef15e30SBram Moolenaar			let values = docus
467*8b6144bdSBram Moolenaar		elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$'
4681ef15e30SBram Moolenaar			let values = forms
4691ef15e30SBram Moolenaar		elseif shortcontext =~ 'frameset\.$'
4701ef15e30SBram Moolenaar			let values = fsets
4711ef15e30SBram Moolenaar		elseif shortcontext =~ 'history\.$'
4721ef15e30SBram Moolenaar			let values = hists
4731ef15e30SBram Moolenaar		elseif shortcontext =~ 'iframe\.$'
4741ef15e30SBram Moolenaar			let values = ifras
475*8b6144bdSBram Moolenaar		elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$'
4761ef15e30SBram Moolenaar			let values = imags
477*8b6144bdSBram Moolenaar		elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$'
4781ef15e30SBram Moolenaar			let values = links
4791ef15e30SBram Moolenaar		elseif shortcontext =~ 'location\.$'
4801ef15e30SBram Moolenaar			let values = locas
4811ef15e30SBram Moolenaar		elseif shortcontext =~ 'meta\.$'
4821ef15e30SBram Moolenaar			let values = metas
4831ef15e30SBram Moolenaar		elseif shortcontext =~ 'navigator\.$'
4841ef15e30SBram Moolenaar			let values = navis
4851ef15e30SBram Moolenaar		elseif shortcontext =~ 'object\.$'
4861ef15e30SBram Moolenaar			let values = objes
4871ef15e30SBram Moolenaar		elseif shortcontext =~ 'screen\.$'
4881ef15e30SBram Moolenaar			let values = scres
4891ef15e30SBram Moolenaar		elseif shortcontext =~ 'style\.$'
4901ef15e30SBram Moolenaar			let values = styls
4911ef15e30SBram Moolenaar		elseif shortcontext =~ 'table\.$'
4921ef15e30SBram Moolenaar			let values = tabls
4931ef15e30SBram Moolenaar		elseif shortcontext =~ 'TableData\.$'
4941ef15e30SBram Moolenaar			let values = tdats
4951ef15e30SBram Moolenaar		elseif shortcontext =~ 'TableRow\.$'
4961ef15e30SBram Moolenaar			let values = trows
4971ef15e30SBram Moolenaar		elseif shortcontext =~ 'window\.$'
4981ef15e30SBram Moolenaar			let values = winds
499*8b6144bdSBram Moolenaar		elseif shortcontext =~ 'parseError\.$'
500*8b6144bdSBram Moolenaar			let values = xdomerror
501*8b6144bdSBram Moolenaar		elseif shortcontext =~ 'attributes\[\d\+\]\.$'
502*8b6144bdSBram Moolenaar			let values = xdomattrprop
5031ef15e30SBram Moolenaar		else
5041ef15e30SBram Moolenaar			let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris
5051ef15e30SBram Moolenaar			let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists
506*8b6144bdSBram Moolenaar			let values += ifras + imags + links + locas + metas + navis + objes + scres
507*8b6144bdSBram Moolenaar			let values += tabls + trows + tares + winds
508*8b6144bdSBram Moolenaar			let values += xdomnodes + xdomnliss + xdomelems
5091ef15e30SBram Moolenaar		endif
5101ef15e30SBram Moolenaar		endif
5111ef15e30SBram Moolenaar
5121ef15e30SBram Moolenaar		for m in values
5131ef15e30SBram Moolenaar			if m =~? '^'.a:base
5141ef15e30SBram Moolenaar				call add(res, m)
5151ef15e30SBram Moolenaar			elseif m =~? a:base
5161ef15e30SBram Moolenaar				call add(res2, m)
5171ef15e30SBram Moolenaar			endif
5181ef15e30SBram Moolenaar		endfor
5191ef15e30SBram Moolenaar
5201ef15e30SBram Moolenaar		unlet! values
5211ef15e30SBram Moolenaar		return res + res2
5221ef15e30SBram Moolenaar
5231ef15e30SBram Moolenaar	endif
524*8b6144bdSBram Moolenaar	" }}}
5251ef15e30SBram Moolenaar
5261ef15e30SBram Moolenaar	" Get variables data.
5271ef15e30SBram Moolenaar	let variables = filter(copy(file), 'v:val =~ "var\\s"')
5281ef15e30SBram Moolenaar	call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")')
5291ef15e30SBram Moolenaar	call map(variables, 'substitute(v:val, ";\\|$", ",", "g")')
5301ef15e30SBram Moolenaar	let vars = []
531*8b6144bdSBram Moolenaar	" This loop (and next one) is necessary to get variable names from
532*8b6144bdSBram Moolenaar	" constructs like: var var1, var2, var3 = "something";
5331ef15e30SBram Moolenaar	for i in range(len(variables))
5341ef15e30SBram Moolenaar		let comma_separated = split(variables[i], ',\s*')
5351ef15e30SBram Moolenaar		call map(comma_separated, 'matchstr(v:val, "\\w\\+")')
5361ef15e30SBram Moolenaar		let vars += comma_separated
5371ef15e30SBram Moolenaar	endfor
5381ef15e30SBram Moolenaar
5391ef15e30SBram Moolenaar	let variables = sort(vars)
540*8b6144bdSBram Moolenaar	unlet! vars
5411ef15e30SBram Moolenaar
542*8b6144bdSBram Moolenaar	" Add "no var" variables.
5431ef15e30SBram Moolenaar	let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\w\\+\\s*="')
544*8b6144bdSBram Moolenaar	let u_vars = []
545*8b6144bdSBram Moolenaar	for i in range(len(undeclared_variables))
546*8b6144bdSBram Moolenaar		let  split_equal = split(undeclared_variables[i], '\s*=')
547*8b6144bdSBram Moolenaar		call map(split_equal, 'matchstr(v:val, "\\w\\+$")')
548*8b6144bdSBram Moolenaar		let u_vars += split_equal
549*8b6144bdSBram Moolenaar	endfor
5501ef15e30SBram Moolenaar
551*8b6144bdSBram Moolenaar	let variables += sort(u_vars)
552*8b6144bdSBram Moolenaar	unlet! u_vars
5531ef15e30SBram Moolenaar
5541ef15e30SBram Moolenaar	" Get functions
5551ef15e30SBram Moolenaar	let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
5561ef15e30SBram Moolenaar	let arguments = copy(functions)
5571ef15e30SBram Moolenaar	call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\w\\+")')
5581ef15e30SBram Moolenaar	call map(functions, 'v:val."("')
559*8b6144bdSBram Moolenaar	let functions = sort(functions)
5601ef15e30SBram Moolenaar
5611ef15e30SBram Moolenaar	" Get functions arguments
5621ef15e30SBram Moolenaar	call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
5631ef15e30SBram Moolenaar	let jargs = join(arguments, ',')
5641ef15e30SBram Moolenaar	let jargs = substitute(jargs, '\s', '', 'g')
5651ef15e30SBram Moolenaar	let arguments = split(jargs, ',')
566*8b6144bdSBram Moolenaar	let arguments = sort(arguments)
5671ef15e30SBram Moolenaar
5681ef15e30SBram Moolenaar	" Built-in functions
569*8b6144bdSBram Moolenaar	let builtin = ['alert(', 'confirm(']
5701ef15e30SBram Moolenaar
5711ef15e30SBram Moolenaar	" Top-level HTML DOM objects
5721ef15e30SBram Moolenaar	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']
5731ef15e30SBram Moolenaar	call map(htmldom, 'v:val."."')
5741ef15e30SBram Moolenaar
5751ef15e30SBram Moolenaar	" Top-level properties
5761ef15e30SBram Moolenaar	let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
5771ef15e30SBram Moolenaar				\ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
5781ef15e30SBram Moolenaar				\ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
5791ef15e30SBram Moolenaar
5801ef15e30SBram Moolenaar	" Keywords
5811ef15e30SBram Moolenaar	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"]
5821ef15e30SBram Moolenaar
5831ef15e30SBram Moolenaar	let values = variables + functions + htmldom + arguments + builtin + properties + keywords
5841ef15e30SBram Moolenaar
5851ef15e30SBram Moolenaar	for m in values
5861ef15e30SBram Moolenaar		if m =~? '^'.a:base
5871ef15e30SBram Moolenaar			call add(res, m)
5881ef15e30SBram Moolenaar		elseif m =~? a:base
5891ef15e30SBram Moolenaar			call add(res2, m)
5901ef15e30SBram Moolenaar		endif
5911ef15e30SBram Moolenaar	endfor
5921ef15e30SBram Moolenaar
5931ef15e30SBram Moolenaar	return res + res2
5941ef15e30SBram Moolenaarendfunction
595*8b6144bdSBram Moolenaar
596*8b6144bdSBram Moolenaar" vim:set foldmethod=marker:
597