11ef15e30SBram Moolenaar" Vim completion script
21ef15e30SBram Moolenaar" Language:	Java Script
31ef15e30SBram Moolenaar" Maintainer:	Mikolaj Machowski ( mikmach AT wp DOT pl )
48b6144bdSBram 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
15*1d2ba7faSBram Moolenaar	while start >= 0 && line[start - 1] =~ '\k'
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
268b6144bdSBram Moolenaar	" looking for objects and for what objects we are looking for
278b6144bdSBram Moolenaar	let context = b:compl_context
281ef15e30SBram Moolenaar	let shortcontext = substitute(context, a:base.'$', '', '')
291ef15e30SBram Moolenaar	unlet! b:compl_context
301ef15e30SBram Moolenaar
318b6144bdSBram Moolenaar	if exists("b:jsrange")
328b6144bdSBram Moolenaar		let file = getline(b:jsrange[0],b:jsrange[1])
338b6144bdSBram Moolenaar		unlet! b:jsrange
348b6144bdSBram Moolenaar
358b6144bdSBram Moolenaar		if len(b:js_extfiles) > 0
368b6144bdSBram Moolenaar			let file = b:js_extfiles + file
378b6144bdSBram Moolenaar		endif
388b6144bdSBram Moolenaar
398b6144bdSBram Moolenaar	else
408b6144bdSBram Moolenaar		let file = getline(1, '$')
418b6144bdSBram Moolenaar	endif
428b6144bdSBram Moolenaar
438b6144bdSBram Moolenaar
448b6144bdSBram 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']
1088b6144bdSBram 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
123*1d2ba7faSBram Moolenaar		let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"')
1241ef15e30SBram Moolenaar		let juser_props1 = join(user_props1, ' ')
1251ef15e30SBram Moolenaar		let user_props1 = split(juser_props1, '\zethis\.')
1261ef15e30SBram Moolenaar		unlet! juser_props1
127*1d2ba7faSBram Moolenaar		call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")')
1288b6144bdSBram Moolenaar
129*1d2ba7faSBram Moolenaar		let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"')
1308b6144bdSBram Moolenaar		let juser_props2 = join(user_props2, ' ')
1318b6144bdSBram Moolenaar		let user_props2 = split(juser_props2, '\zeprototype\.')
1328b6144bdSBram Moolenaar		unlet! juser_props2
133*1d2ba7faSBram Moolenaar		call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\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."("')
1648b6144bdSBram Moolenaar		let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
1658b6144bdSBram Moolenaar					\ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
1668b6144bdSBram Moolenaar					\ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling']
1678b6144bdSBram Moolenaar		let docuxmeth = ['createAttribute', 'createCDATASection',
1688b6144bdSBram Moolenaar					\ 'createComment', 'createDocument', 'createDocumentFragment',
1698b6144bdSBram Moolenaar					\ 'createElement', 'createEntityReference', 'createProcessingInstruction',
1708b6144bdSBram Moolenaar					\ 'createTextNode']
1718b6144bdSBram Moolenaar		call map(docuxmeth, 'v:val."("')
1728b6144bdSBram 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',
2018b6144bdSBram 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',
3438b6144bdSBram 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.
3488b6144bdSBram Moolenaar		let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history',
3498b6144bdSBram Moolenaar					\ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self',
3508b6144bdSBram 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',
3588b6144bdSBram 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
3648b6144bdSBram Moolenaar		" XML DOM
3658b6144bdSBram Moolenaar		" Attributes - element.attributes[x].
3668b6144bdSBram Moolenaar		let xdomattrprop = ['name', 'specified', 'value']
3678b6144bdSBram Moolenaar		" Element - anyelement.
3688b6144bdSBram Moolenaar		let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
3698b6144bdSBram Moolenaar					\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
3708b6144bdSBram Moolenaar					\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
3718b6144bdSBram Moolenaar		let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode',
3728b6144bdSBram Moolenaar					\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize',
3738b6144bdSBram Moolenaar					\ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild',
3748b6144bdSBram Moolenaar					\ 'setAttribute', 'setAttributeNode']
3758b6144bdSBram Moolenaar		call map(xdomelemmeth, 'v:val."("')
3768b6144bdSBram Moolenaar		let xdomelems = xdomelemprop + xdomelemmeth
3778b6144bdSBram Moolenaar		" Node - anynode.
3788b6144bdSBram Moolenaar		let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
3798b6144bdSBram Moolenaar					\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
3808b6144bdSBram Moolenaar					\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling']
3818b6144bdSBram Moolenaar		let xdomnodemeth = ['appendChild', 'cloneNode',
3828b6144bdSBram Moolenaar					\ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild']
3838b6144bdSBram Moolenaar		call map(xdomnodemeth, 'v:val."("')
3848b6144bdSBram Moolenaar		let xdomnodes = xdomnodeprop + xdomnodemeth
3858b6144bdSBram Moolenaar		" NodeList
3868b6144bdSBram Moolenaar		let xdomnliss = ['length', 'item(']
3878b6144bdSBram Moolenaar		" Error - parseError.
3888b6144bdSBram Moolenaar		let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos']
3898b6144bdSBram Moolenaar
3908b6144bdSBram Moolenaar		" Find object type declaration to reduce number of suggestions. {{{
3918b6144bdSBram Moolenaar		" 1. Get object name
3928b6144bdSBram Moolenaar		" 2. Find object declaration line
3938b6144bdSBram Moolenaar		" 3. General declaration follows "= new Type" syntax, additional else
3948b6144bdSBram Moolenaar		"    for regexp "= /re/"
3958b6144bdSBram Moolenaar		" 4. Make correction for Microsoft.XMLHTTP ActiveXObject
3968b6144bdSBram Moolenaar		" 5. Repeat for external files
397*1d2ba7faSBram Moolenaar		let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$')
3988b6144bdSBram Moolenaar		if len(object) > 0
3991ef15e30SBram Moolenaar			let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
4008b6144bdSBram Moolenaar			if decl_line > 0
401*1d2ba7faSBram Moolenaar				let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze')
4028b6144bdSBram Moolenaar				if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
4038b6144bdSBram Moolenaar						let object_type = 'XMLHttpRequest'
4048b6144bdSBram Moolenaar				endif
4058b6144bdSBram Moolenaar			else
4068b6144bdSBram Moolenaar				let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn')
4078b6144bdSBram Moolenaar				if decl_line > 0
4088b6144bdSBram Moolenaar					let object_type = 'RegExp'
4098b6144bdSBram Moolenaar				endif
4108b6144bdSBram Moolenaar			endif
4118b6144bdSBram Moolenaar			" We didn't find var declaration in current file but we may have
4128b6144bdSBram Moolenaar			" something in external files.
4138b6144bdSBram Moolenaar			if decl_line == 0 && exists("b:js_extfiles")
4148b6144bdSBram Moolenaar				let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
4158b6144bdSBram Moolenaar				if len(dext_line) > 0
416*1d2ba7faSBram Moolenaar					let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze')
4178b6144bdSBram Moolenaar					if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
4188b6144bdSBram Moolenaar							let object_type = 'XMLHttpRequest'
4198b6144bdSBram Moolenaar					endif
4208b6144bdSBram Moolenaar				else
4218b6144bdSBram Moolenaar					let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"')
4228b6144bdSBram Moolenaar					if len(dext_line) > 0
4238b6144bdSBram Moolenaar						let object_type = 'RegExp'
4248b6144bdSBram Moolenaar					endif
4258b6144bdSBram Moolenaar				endif
4268b6144bdSBram Moolenaar			endif
4278b6144bdSBram Moolenaar		endif
4288b6144bdSBram Moolenaar		" }}}
4298b6144bdSBram Moolenaar
4308b6144bdSBram Moolenaar		if !exists('object_type')
4318b6144bdSBram Moolenaar			let object_type = ''
4328b6144bdSBram 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
4478b6144bdSBram Moolenaar		elseif object_type == 'RegExp'
4488b6144bdSBram Moolenaar			let values = reges
4498b6144bdSBram Moolenaar		elseif object_type == 'Math'
4508b6144bdSBram 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
4578b6144bdSBram 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
4678b6144bdSBram 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
4758b6144bdSBram Moolenaar		elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$'
4761ef15e30SBram Moolenaar			let values = imags
4778b6144bdSBram 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
4998b6144bdSBram Moolenaar		elseif shortcontext =~ 'parseError\.$'
5008b6144bdSBram Moolenaar			let values = xdomerror
5018b6144bdSBram Moolenaar		elseif shortcontext =~ 'attributes\[\d\+\]\.$'
5028b6144bdSBram 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
5068b6144bdSBram Moolenaar			let values += ifras + imags + links + locas + metas + navis + objes + scres
5078b6144bdSBram Moolenaar			let values += tabls + trows + tares + winds
5088b6144bdSBram 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
5248b6144bdSBram 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 = []
5318b6144bdSBram Moolenaar	" This loop (and next one) is necessary to get variable names from
5328b6144bdSBram 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*')
535*1d2ba7faSBram Moolenaar		call map(comma_separated, 'matchstr(v:val, "\\k\\+")')
5361ef15e30SBram Moolenaar		let vars += comma_separated
5371ef15e30SBram Moolenaar	endfor
5381ef15e30SBram Moolenaar
5391ef15e30SBram Moolenaar	let variables = sort(vars)
5408b6144bdSBram Moolenaar	unlet! vars
5411ef15e30SBram Moolenaar
5428b6144bdSBram Moolenaar	" Add "no var" variables.
543*1d2ba7faSBram Moolenaar	let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="')
5448b6144bdSBram Moolenaar	let u_vars = []
5458b6144bdSBram Moolenaar	for i in range(len(undeclared_variables))
5468b6144bdSBram Moolenaar		let  split_equal = split(undeclared_variables[i], '\s*=')
547*1d2ba7faSBram Moolenaar		call map(split_equal, 'matchstr(v:val, "\\k\\+$")')
5488b6144bdSBram Moolenaar		let u_vars += split_equal
5498b6144bdSBram Moolenaar	endfor
5501ef15e30SBram Moolenaar
5518b6144bdSBram Moolenaar	let variables += sort(u_vars)
5528b6144bdSBram 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)
557*1d2ba7faSBram Moolenaar	call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")')
5581ef15e30SBram Moolenaar	call map(functions, 'v:val."("')
5598b6144bdSBram Moolenaar	let functions = sort(functions)
5601ef15e30SBram Moolenaar
561*1d2ba7faSBram Moolenaar	" Create table to keep arguments for additional 'menu' info
562*1d2ba7faSBram Moolenaar	let b:js_menuinfo = {}
563*1d2ba7faSBram Moolenaar	for i in arguments
564*1d2ba7faSBram Moolenaar		let g:ia = i
565*1d2ba7faSBram Moolenaar		let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))')
566*1d2ba7faSBram Moolenaar		if len(f_elements) == 3
567*1d2ba7faSBram Moolenaar			let b:js_menuinfo[f_elements[1].'('] = f_elements[2]
568*1d2ba7faSBram Moolenaar		endif
569*1d2ba7faSBram Moolenaar	endfor
570*1d2ba7faSBram Moolenaar
5711ef15e30SBram Moolenaar	" Get functions arguments
5721ef15e30SBram Moolenaar	call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
5731ef15e30SBram Moolenaar	let jargs = join(arguments, ',')
5741ef15e30SBram Moolenaar	let jargs = substitute(jargs, '\s', '', 'g')
5751ef15e30SBram Moolenaar	let arguments = split(jargs, ',')
5768b6144bdSBram Moolenaar	let arguments = sort(arguments)
5771ef15e30SBram Moolenaar
5781ef15e30SBram Moolenaar	" Built-in functions
5798b6144bdSBram Moolenaar	let builtin = ['alert(', 'confirm(']
5801ef15e30SBram Moolenaar
5811ef15e30SBram Moolenaar	" Top-level HTML DOM objects
5821ef15e30SBram 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']
5831ef15e30SBram Moolenaar	call map(htmldom, 'v:val."."')
5841ef15e30SBram Moolenaar
5851ef15e30SBram Moolenaar	" Top-level properties
5861ef15e30SBram Moolenaar	let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
5871ef15e30SBram Moolenaar				\ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
5881ef15e30SBram Moolenaar				\ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
5891ef15e30SBram Moolenaar
5901ef15e30SBram Moolenaar	" Keywords
5911ef15e30SBram 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"]
5921ef15e30SBram Moolenaar
5931ef15e30SBram Moolenaar	let values = variables + functions + htmldom + arguments + builtin + properties + keywords
5941ef15e30SBram Moolenaar
5951ef15e30SBram Moolenaar	for m in values
5961ef15e30SBram Moolenaar		if m =~? '^'.a:base
5971ef15e30SBram Moolenaar			call add(res, m)
5981ef15e30SBram Moolenaar		elseif m =~? a:base
5991ef15e30SBram Moolenaar			call add(res2, m)
6001ef15e30SBram Moolenaar		endif
6011ef15e30SBram Moolenaar	endfor
6021ef15e30SBram Moolenaar
603*1d2ba7faSBram Moolenaar	let menu = res + res2
604*1d2ba7faSBram Moolenaar	let final_menu = []
605*1d2ba7faSBram Moolenaar	for i in range(len(menu))
606*1d2ba7faSBram Moolenaar		let item = menu[i]
607*1d2ba7faSBram Moolenaar		if item =~ '($'
608*1d2ba7faSBram Moolenaar			let kind = 'f'
609*1d2ba7faSBram Moolenaar			if has_key(b:js_menuinfo, item)
610*1d2ba7faSBram Moolenaar				let m_info = b:js_menuinfo[item]
611*1d2ba7faSBram Moolenaar			else
612*1d2ba7faSBram Moolenaar				let m_info = ''
613*1d2ba7faSBram Moolenaar			endif
614*1d2ba7faSBram Moolenaar		else
615*1d2ba7faSBram Moolenaar			let kind = 'v'
616*1d2ba7faSBram Moolenaar			let m_info = ''
617*1d2ba7faSBram Moolenaar		endif
618*1d2ba7faSBram Moolenaar		let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}]
619*1d2ba7faSBram Moolenaar	endfor
620*1d2ba7faSBram Moolenaar	let g:fm = final_menu
621*1d2ba7faSBram Moolenaar	return final_menu
622*1d2ba7faSBram Moolenaar
6231ef15e30SBram Moolenaarendfunction
6248b6144bdSBram Moolenaar
6258b6144bdSBram Moolenaar" vim:set foldmethod=marker:
626