11ef15e30SBram Moolenaar" Vim completion script
21ef15e30SBram Moolenaar" Language:	Java Script
3*e7b1ea02SBram Moolenaar" Maintainer:	Jay Sitter ([email protected])
4*e7b1ea02SBram Moolenaar" URL: https://github.com/jsit/javascriptcomplete.vim/
5*e7b1ea02SBram Moolenaar" Previous Maintainer:	Mikolaj Machowski ( mikmach AT wp DOT pl )
6*e7b1ea02SBram Moolenaar" Last Change:	2020 Jul 30
71ef15e30SBram Moolenaar
81ef15e30SBram Moolenaarfunction! javascriptcomplete#CompleteJS(findstart, base)
91ef15e30SBram Moolenaar  if a:findstart
101ef15e30SBram Moolenaar	" locate the start of the word
111ef15e30SBram Moolenaar	let line = getline('.')
121ef15e30SBram Moolenaar	let start = col('.') - 1
131ef15e30SBram Moolenaar	let curline = line('.')
141ef15e30SBram Moolenaar	let compl_begin = col('.') - 2
151ef15e30SBram Moolenaar	" Bit risky but JS is rather limited language and local chars shouldn't
161ef15e30SBram Moolenaar	" fint way into names
171d2ba7faSBram Moolenaar	while start >= 0 && line[start - 1] =~ '\k'
181ef15e30SBram Moolenaar		let start -= 1
191ef15e30SBram Moolenaar	endwhile
201ef15e30SBram Moolenaar	let b:compl_context = getline('.')[0:compl_begin]
211ef15e30SBram Moolenaar	return start
221ef15e30SBram Moolenaar  else
231ef15e30SBram Moolenaar	" Initialize base return lists
241ef15e30SBram Moolenaar	let res = []
251ef15e30SBram Moolenaar	let res2 = []
261ef15e30SBram Moolenaar	" a:base is very short - we need context
271ef15e30SBram Moolenaar	" Shortcontext is context without a:base, useful for checking if we are
288b6144bdSBram Moolenaar	" looking for objects and for what objects we are looking for
298b6144bdSBram Moolenaar	let context = b:compl_context
301ef15e30SBram Moolenaar	let shortcontext = substitute(context, a:base.'$', '', '')
311ef15e30SBram Moolenaar	unlet! b:compl_context
321ef15e30SBram Moolenaar
338b6144bdSBram Moolenaar	if exists("b:jsrange")
348b6144bdSBram Moolenaar		let file = getline(b:jsrange[0],b:jsrange[1])
358b6144bdSBram Moolenaar		unlet! b:jsrange
368b6144bdSBram Moolenaar
378b6144bdSBram Moolenaar		if len(b:js_extfiles) > 0
388b6144bdSBram Moolenaar			let file = b:js_extfiles + file
398b6144bdSBram Moolenaar		endif
408b6144bdSBram Moolenaar
418b6144bdSBram Moolenaar	else
428b6144bdSBram Moolenaar		let file = getline(1, '$')
438b6144bdSBram Moolenaar	endif
448b6144bdSBram Moolenaar
458b6144bdSBram Moolenaar
468b6144bdSBram Moolenaar	" Completion of properties, methods, etc. {{{
471ef15e30SBram Moolenaar	if shortcontext =~ '\.$'
481ef15e30SBram Moolenaar		" Complete methods and properties for objects
491ef15e30SBram Moolenaar		" DOM separate
501ef15e30SBram Moolenaar		let doms = ['style.']
511ef15e30SBram Moolenaar		" Arrays
521ef15e30SBram Moolenaar		let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype']
531ef15e30SBram Moolenaar		let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift',
541ef15e30SBram Moolenaar					\ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf',
551ef15e30SBram Moolenaar					\ 'watch', 'unwatch']
561ef15e30SBram Moolenaar		call map(arraymeth, 'v:val."("')
571ef15e30SBram Moolenaar		let arrays = arrayprop + arraymeth
581ef15e30SBram Moolenaar
591ef15e30SBram Moolenaar		" Boolean - complete subset of array values
601ef15e30SBram Moolenaar		" properties - constructor, prototype
611ef15e30SBram Moolenaar		" methods    - toSource, toString, valueOf
621ef15e30SBram Moolenaar
631ef15e30SBram Moolenaar		" Date
641ef15e30SBram Moolenaar		" properties - constructor, prototype
651ef15e30SBram Moolenaar		let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds',
661ef15e30SBram Moolenaar					\ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset',
671ef15e30SBram Moolenaar					\ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds',
681ef15e30SBram Moolenaar					\ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
691ef15e30SBram Moolenaar					\ 'getYear', 'parse', 'parse',
701ef15e30SBram Moolenaar					\ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds',
711ef15e30SBram Moolenaar					\ 'setMinutes', 'setMonth', 'setSeconds',
721ef15e30SBram Moolenaar					\ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds',
731ef15e30SBram Moolenaar					\ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime',
741ef15e30SBram Moolenaar					\ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString',
751ef15e30SBram Moolenaar					\ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch']
761ef15e30SBram Moolenaar		call map(datemeth, 'v:val."("')
771ef15e30SBram Moolenaar		let dates = datemeth
781ef15e30SBram Moolenaar
791ef15e30SBram Moolenaar		" Function
801ef15e30SBram Moolenaar		let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length',
811ef15e30SBram Moolenaar					\ 'arity', 'constructor', 'length', 'prototype']
821ef15e30SBram Moolenaar		let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf']
831ef15e30SBram Moolenaar		call map(funcmeth, 'v:val."("')
841ef15e30SBram Moolenaar		let funcs = funcprop + funcmeth
851ef15e30SBram Moolenaar
861ef15e30SBram Moolenaar		" Math
871ef15e30SBram Moolenaar		let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT']
881ef15e30SBram Moolenaar		let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor',
891ef15e30SBram Moolenaar					\ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan',
901ef15e30SBram Moolenaar					\ 'watch', 'unwatch']
911ef15e30SBram Moolenaar		call map(mathmeth, 'v:val."("')
921ef15e30SBram Moolenaar		let maths = mathprop + mathmeth
931ef15e30SBram Moolenaar
941ef15e30SBram Moolenaar		" Number
951ef15e30SBram Moolenaar		let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY',
961ef15e30SBram Moolenaar					\ 'constructor', 'prototype']
971ef15e30SBram Moolenaar		let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf',
981ef15e30SBram Moolenaar					\ 'watch', 'unwatch']
991ef15e30SBram Moolenaar		call map(numbmeth, 'v:val."("')
1001ef15e30SBram Moolenaar		let numbs = numbprop + numbmeth
1011ef15e30SBram Moolenaar
1021ef15e30SBram Moolenaar		" Object
1031ef15e30SBram Moolenaar		let objeprop = ['constructor', 'prototype']
1041ef15e30SBram Moolenaar		let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf']
1051ef15e30SBram Moolenaar		call map(objemeth, 'v:val."("')
1061ef15e30SBram Moolenaar		let objes = objeprop + objemeth
1071ef15e30SBram Moolenaar
1081ef15e30SBram Moolenaar		" RegExp
1091ef15e30SBram Moolenaar		let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
1108b6144bdSBram Moolenaar		let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch']
1111ef15e30SBram Moolenaar		call map(regemeth, 'v:val."("')
1121ef15e30SBram Moolenaar		let reges = regeprop + regemeth
1131ef15e30SBram Moolenaar
1141ef15e30SBram Moolenaar		" String
1151ef15e30SBram Moolenaar		let striprop = ['constructor', 'length', 'prototype']
1161ef15e30SBram Moolenaar		let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat',
1171ef15e30SBram Moolenaar					\ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics',
1181ef15e30SBram Moolenaar					\ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small',
1191ef15e30SBram Moolenaar					\ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase',
1201ef15e30SBram Moolenaar					\ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch']
1211ef15e30SBram Moolenaar		call map(strimeth, 'v:val."("')
1221ef15e30SBram Moolenaar		let stris = striprop + strimeth
1231ef15e30SBram Moolenaar
1241ef15e30SBram Moolenaar		" User created properties
1251d2ba7faSBram Moolenaar		let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"')
1261ef15e30SBram Moolenaar		let juser_props1 = join(user_props1, ' ')
1271ef15e30SBram Moolenaar		let user_props1 = split(juser_props1, '\zethis\.')
1281ef15e30SBram Moolenaar		unlet! juser_props1
1291d2ba7faSBram Moolenaar		call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")')
1308b6144bdSBram Moolenaar
1311d2ba7faSBram Moolenaar		let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"')
1328b6144bdSBram Moolenaar		let juser_props2 = join(user_props2, ' ')
1338b6144bdSBram Moolenaar		let user_props2 = split(juser_props2, '\zeprototype\.')
1348b6144bdSBram Moolenaar		unlet! juser_props2
1351d2ba7faSBram Moolenaar		call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\ze")')
1361ef15e30SBram Moolenaar		let user_props = user_props1 + user_props2
1371ef15e30SBram Moolenaar
1381ef15e30SBram Moolenaar		" HTML DOM properties
1391ef15e30SBram Moolenaar		" Anchors - anchor.
1401ef15e30SBram Moolenaar		let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML',
1411ef15e30SBram Moolenaar					\ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus']
1421ef15e30SBram Moolenaar		let anchmeth = ['blur', 'focus']
1431ef15e30SBram Moolenaar		call map(anchmeth, 'v:val."("')
1441ef15e30SBram Moolenaar		let anths = anchprop + anchmeth
1451ef15e30SBram Moolenaar		" Area - area.
1461ef15e30SBram Moolenaar		let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id',
1471ef15e30SBram Moolenaar					\ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target']
1481ef15e30SBram Moolenaar		let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver']
1491ef15e30SBram Moolenaar		call map(areameth, 'v:val."("')
1501ef15e30SBram Moolenaar		let areas = areaprop + areameth
1511ef15e30SBram Moolenaar		" Base - base.
1521ef15e30SBram Moolenaar		let baseprop = ['href', 'id', 'target']
1531ef15e30SBram Moolenaar		let bases = baseprop
1541ef15e30SBram Moolenaar		" Body - body.
1551ef15e30SBram Moolenaar		let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop',
1561ef15e30SBram Moolenaar					\ 'text', 'vLink']
1571ef15e30SBram Moolenaar		let bodys = bodyprop
1581ef15e30SBram Moolenaar		" Document - document.
159*e7b1ea02SBram Moolenaar		let docuprop = ['anchors', 'body', 'characterSet', 'doctype',
160*e7b1ea02SBram Moolenaar					\ 'documentElement', 'documentURI', 'embeds', 'fonts', 'forms',
161*e7b1ea02SBram Moolenaar					\ 'head', 'hidden', 'images', 'implementation', 'lastStyleSheetSet',
162*e7b1ea02SBram Moolenaar					\ 'links', 'plugins', 'preferredStyleSheetSet', 'scripts',
163*e7b1ea02SBram Moolenaar					\ 'scrollingElement', 'selectedStyleSheetSet', 'styleSheetSets',
164*e7b1ea02SBram Moolenaar					\ 'timeline', 'visibilityState', 'cookie', 'defaultView',
165*e7b1ea02SBram Moolenaar					\ 'designMode', 'dir', 'domain', 'lastModified', 'location',
166*e7b1ea02SBram Moolenaar					\ 'readyState', 'referrer', 'title', 'URL', 'activeElement',
167*e7b1ea02SBram Moolenaar					\ 'fullscreenElement', 'styleSheets']
168*e7b1ea02SBram Moolenaar		let documeth = ['adoptNode', 'close', 'createAttribute',
169*e7b1ea02SBram Moolenaar					\ 'createAttributeNS', 'createCDATASection', 'createComment',
170*e7b1ea02SBram Moolenaar					\ 'createDocumentFragment', 'createElement', 'createElementNS',
171*e7b1ea02SBram Moolenaar					\ 'createEvent', 'createExpression', 'createNSResolver',
172*e7b1ea02SBram Moolenaar					\ 'createNodeIterator', 'createProcessingInstruction', 'createRange',
173*e7b1ea02SBram Moolenaar					\ 'createTextNode', 'createTouchList', 'createTreeWalker',
174*e7b1ea02SBram Moolenaar					\ 'enableStyleSheetsForSet', 'evaluate', 'focus', 'getElementById',
175*e7b1ea02SBram Moolenaar					\ 'getElementById', 'getElementsByClassName', 'getElementsByName',
176*e7b1ea02SBram Moolenaar					\ 'getElementsByTagName', 'getElementsByTagNameNS',
177*e7b1ea02SBram Moolenaar					\ 'hasStorageAccess', 'importNode', 'onClick', 'onDblClick',
178*e7b1ea02SBram Moolenaar					\ 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onMouseDown',
179*e7b1ea02SBram Moolenaar					\ 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp',
180*e7b1ea02SBram Moolenaar					\ 'onResize', 'open', 'querySelector', 'querySelectorAll',
181*e7b1ea02SBram Moolenaar					\ 'requestStorageAccess', 'write', 'writeln']
182*e7b1ea02SBram Moolenaar
1831ef15e30SBram Moolenaar		call map(documeth, 'v:val."("')
1848b6144bdSBram Moolenaar		let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
1858b6144bdSBram Moolenaar					\ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
1868b6144bdSBram Moolenaar					\ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling']
1878b6144bdSBram Moolenaar		let docuxmeth = ['createAttribute', 'createCDATASection',
1888b6144bdSBram Moolenaar					\ 'createComment', 'createDocument', 'createDocumentFragment',
1898b6144bdSBram Moolenaar					\ 'createElement', 'createEntityReference', 'createProcessingInstruction',
1908b6144bdSBram Moolenaar					\ 'createTextNode']
1918b6144bdSBram Moolenaar		call map(docuxmeth, 'v:val."("')
1928b6144bdSBram Moolenaar		let docus = docuprop + docuxprop + documeth + docuxmeth
1931ef15e30SBram Moolenaar		" Form - form.
1941ef15e30SBram Moolenaar		let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
1951ef15e30SBram Moolenaar					\ 'method', 'name', 'tabIndex', 'target']
1961ef15e30SBram Moolenaar		let formmeth = ['reset', 'submit', 'onReset', 'onSubmit']
1971ef15e30SBram Moolenaar		call map(formmeth, 'v:val."("')
1981ef15e30SBram Moolenaar		let forms = formprop + formmeth
1991ef15e30SBram Moolenaar		" Frame - frame.
2001ef15e30SBram Moolenaar		let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth',
2011ef15e30SBram Moolenaar					\ 'name', 'noResize', 'scrolling', 'src']
2021ef15e30SBram Moolenaar		let frammeth = ['blur', 'focus']
2031ef15e30SBram Moolenaar		call map(frammeth, 'v:val."("')
2041ef15e30SBram Moolenaar		let frams = framprop + frammeth
2051ef15e30SBram Moolenaar		" Frameset - frameset.
2061ef15e30SBram Moolenaar		let fsetprop = ['cols', 'id', 'rows']
2071ef15e30SBram Moolenaar		let fsetmeth = ['blur', 'focus']
2081ef15e30SBram Moolenaar		call map(fsetmeth, 'v:val."("')
2091ef15e30SBram Moolenaar		let fsets = fsetprop + fsetmeth
2101ef15e30SBram Moolenaar		" History - history.
2111ef15e30SBram Moolenaar		let histprop = ['length']
2121ef15e30SBram Moolenaar		let histmeth = ['back', 'forward', 'go']
2131ef15e30SBram Moolenaar		call map(histmeth, 'v:val."("')
2141ef15e30SBram Moolenaar		let hists = histprop + histmeth
2151ef15e30SBram Moolenaar		" Iframe - iframe.
2161ef15e30SBram Moolenaar		let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth',
2171ef15e30SBram Moolenaar					\ 'name', 'scrolling', 'src', 'width']
2181ef15e30SBram Moolenaar		let ifras = ifraprop
2191ef15e30SBram Moolenaar		" Image - image.
2201ef15e30SBram Moolenaar		let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
2218b6144bdSBram Moolenaar					\ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width']
2221ef15e30SBram Moolenaar		let imagmeth = ['onAbort', 'onError', 'onLoad']
2231ef15e30SBram Moolenaar		call map(imagmeth, 'v:val."("')
2241ef15e30SBram Moolenaar		let imags = histprop + imagmeth
2251ef15e30SBram Moolenaar		" Button - accessible only by other properties
2261ef15e30SBram Moolenaar		let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
2271ef15e30SBram Moolenaar		let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
2281ef15e30SBram Moolenaar		call map(buttmeth, 'v:val."("')
2291ef15e30SBram Moolenaar		let butts = buttprop + buttmeth
2301ef15e30SBram Moolenaar		" Checkbox - accessible only by other properties
2311ef15e30SBram Moolenaar		let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
2321ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
2331ef15e30SBram Moolenaar		let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
2341ef15e30SBram Moolenaar		call map(checmeth, 'v:val."("')
2351ef15e30SBram Moolenaar		let checs = checprop + checmeth
2361ef15e30SBram Moolenaar		" File upload - accessible only by other properties
2371ef15e30SBram Moolenaar		let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
2381ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
2391ef15e30SBram Moolenaar		let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
2401ef15e30SBram Moolenaar		call map(filemeth, 'v:val."("')
2411ef15e30SBram Moolenaar		let files = fileprop + filemeth
2421ef15e30SBram Moolenaar		" Hidden - accessible only by other properties
2431ef15e30SBram Moolenaar		let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value']
2441ef15e30SBram Moolenaar		let hidds = hiddprop
2451ef15e30SBram Moolenaar		" Password - accessible only by other properties
2461ef15e30SBram Moolenaar		let passprop = ['accept', 'accessKey', 'defaultValue',
2471ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex',
2481ef15e30SBram Moolenaar					\ 'type', 'value']
2491ef15e30SBram Moolenaar		let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown',
2501ef15e30SBram Moolenaar					\ 'onKeyPress', 'onKeyUp']
2511ef15e30SBram Moolenaar		call map(passmeth, 'v:val."("')
2521ef15e30SBram Moolenaar		let passs = passprop + passmeth
2531ef15e30SBram Moolenaar		" Radio - accessible only by other properties
2541ef15e30SBram Moolenaar		let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
2551ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
2561ef15e30SBram Moolenaar		let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
2571ef15e30SBram Moolenaar		call map(radimeth, 'v:val."("')
2581ef15e30SBram Moolenaar		let radis = radiprop + radimeth
2591ef15e30SBram Moolenaar		" Reset - accessible only by other properties
2601ef15e30SBram Moolenaar		let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
2611ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
2621ef15e30SBram Moolenaar		let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
2631ef15e30SBram Moolenaar		call map(resemeth, 'v:val."("')
2641ef15e30SBram Moolenaar		let reses = reseprop + resemeth
2651ef15e30SBram Moolenaar		" Submit - accessible only by other properties
2661ef15e30SBram Moolenaar		let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
2671ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
2681ef15e30SBram Moolenaar		let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart']
2691ef15e30SBram Moolenaar		call map(submmeth, 'v:val."("')
2701ef15e30SBram Moolenaar		let subms = submprop + submmeth
2711ef15e30SBram Moolenaar		" Text - accessible only by other properties
2721ef15e30SBram Moolenaar		let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
2731ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly',
2741ef15e30SBram Moolenaar					\ 'size', 'tabIndex', 'type', 'value']
2751ef15e30SBram Moolenaar		let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown',
2761ef15e30SBram Moolenaar					\ 'onKeyPress', 'onKeyUp', 'onSelect']
2771ef15e30SBram Moolenaar		call map(textmeth, 'v:val."("')
2781ef15e30SBram Moolenaar		let texts = textprop + textmeth
2791ef15e30SBram Moolenaar		" Link - link.
2801ef15e30SBram Moolenaar		let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media',
2811ef15e30SBram Moolenaar					\ 'rel', 'rev', 'target', 'type']
2821ef15e30SBram Moolenaar		let linkmeth = ['onLoad']
2831ef15e30SBram Moolenaar		call map(linkmeth, 'v:val."("')
2841ef15e30SBram Moolenaar		let links = linkprop + linkmeth
2851ef15e30SBram Moolenaar		" Location - location.
2861ef15e30SBram Moolenaar		let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol',
2871ef15e30SBram Moolenaar					\ 'search']
2881ef15e30SBram Moolenaar		let locameth = ['assign', 'reload', 'replace']
2891ef15e30SBram Moolenaar		call map(locameth, 'v:val."("')
2901ef15e30SBram Moolenaar		let locas = locaprop + locameth
2911ef15e30SBram Moolenaar		" Meta - meta.
2921ef15e30SBram Moolenaar		let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme']
2931ef15e30SBram Moolenaar		let metas = metaprop
2941ef15e30SBram Moolenaar		" Navigator - navigator.
2951ef15e30SBram Moolenaar		let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled',
2961ef15e30SBram Moolenaar					\ 'platform', 'userAgent']
2971ef15e30SBram Moolenaar		let navimeth = ['javaEnabled', 'taintEnabled']
2981ef15e30SBram Moolenaar		call map(navimeth, 'v:val."("')
2991ef15e30SBram Moolenaar		let navis = naviprop + navimeth
3001ef15e30SBram Moolenaar		" Object - object.
3011ef15e30SBram Moolenaar		let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data',
3021ef15e30SBram Moolenaar					\ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex',
3031ef15e30SBram Moolenaar					\ 'type', 'useMap', 'vspace', 'width']
3041ef15e30SBram Moolenaar		let objes = objeprop
3051ef15e30SBram Moolenaar		" Option - accessible only by other properties
3061ef15e30SBram Moolenaar		let optiprop = ['defaultSelected',
3071ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value']
3081ef15e30SBram Moolenaar		let optis = optiprop
3091ef15e30SBram Moolenaar		" Screen - screen.
3101ef15e30SBram Moolenaar		let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width']
3111ef15e30SBram Moolenaar		let scres = screprop
3121ef15e30SBram Moolenaar		" Select - accessible only by other properties
3131ef15e30SBram Moolenaar		let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name',
3141ef15e30SBram Moolenaar					\ 'selectedIndex', 'size', 'tabIndex', 'type', 'value']
3151ef15e30SBram Moolenaar		let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus']
3161ef15e30SBram Moolenaar		call map(selemeth, 'v:val."("')
3171ef15e30SBram Moolenaar		let seles = seleprop + selemeth
3181ef15e30SBram Moolenaar		" Style - style.
3191ef15e30SBram Moolenaar		let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage',
3201ef15e30SBram Moolenaar					\ 'backgroundPosition', 'backgroundRepeat',
3211ef15e30SBram Moolenaar					\ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop',
3221ef15e30SBram Moolenaar					\ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor',
3231ef15e30SBram Moolenaar					\ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle',
3241ef15e30SBram Moolenaar					\ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth',
3251ef15e30SBram Moolenaar					\ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom',
3261ef15e30SBram Moolenaar					\ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth',
3271ef15e30SBram Moolenaar					\ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom',
3281ef15e30SBram Moolenaar					\ 'paddingLeft', 'paddingRight', 'paddingTop',
3291ef15e30SBram Moolenaar					\ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content',
3301ef15e30SBram Moolenaar					\ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction',
3311ef15e30SBram Moolenaar					\ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight',
3321ef15e30SBram Moolenaar					\ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility',
3331ef15e30SBram Moolenaar					\ 'width',
3341ef15e30SBram Moolenaar					\ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType',
3351ef15e30SBram Moolenaar					\ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex',
3361ef15e30SBram Moolenaar					\ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside',
3371ef15e30SBram Moolenaar					\ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout',
3381ef15e30SBram Moolenaar					\ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
3391ef15e30SBram Moolenaar					\ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes',
3401ef15e30SBram Moolenaar					\ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition',
3411ef15e30SBram Moolenaar					\ 'unicodeBidi', 'whiteSpace', 'wordSpacing']
3421ef15e30SBram Moolenaar		let styls = stylprop
3431ef15e30SBram Moolenaar		" Table - table.
3441ef15e30SBram Moolenaar		let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding',
3451ef15e30SBram Moolenaar					\ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width']
3461ef15e30SBram Moolenaar		let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow',
3471ef15e30SBram Moolenaar					\ 'deleteTFoot', 'deleteTHead', 'insertRow']
3481ef15e30SBram Moolenaar		call map(tablmeth, 'v:val."("')
3491ef15e30SBram Moolenaar		let tabls = tablprop + tablmeth
3501ef15e30SBram Moolenaar		" Table data - TableData.
3511ef15e30SBram Moolenaar		let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff',
3521ef15e30SBram Moolenaar					\ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width']
3531ef15e30SBram Moolenaar		let tdats = tdatprop
3541ef15e30SBram Moolenaar		" Table row - TableRow.
3551ef15e30SBram Moolenaar		let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex',
3561ef15e30SBram Moolenaar					\ 'vAlign']
3571ef15e30SBram Moolenaar		let trowmeth = ['deleteCell', 'insertCell']
3581ef15e30SBram Moolenaar		call map(trowmeth, 'v:val."("')
3591ef15e30SBram Moolenaar		let trows = trowprop + trowmeth
3601ef15e30SBram Moolenaar		" Textarea - accessible only by other properties
3611ef15e30SBram Moolenaar		let tareprop = ['accessKey', 'cols', 'defaultValue',
3621ef15e30SBram Moolenaar					\ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows',
3638b6144bdSBram Moolenaar					\ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd']
3641ef15e30SBram Moolenaar		let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus']
3651ef15e30SBram Moolenaar		call map(taremeth, 'v:val."("')
3661ef15e30SBram Moolenaar		let tares = tareprop + taremeth
3671ef15e30SBram Moolenaar		" Window - window.
3688b6144bdSBram Moolenaar		let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history',
3698b6144bdSBram Moolenaar					\ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self',
3708b6144bdSBram Moolenaar					\ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject']
3711ef15e30SBram Moolenaar		let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
3721ef15e30SBram Moolenaar					\ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
3731ef15e30SBram Moolenaar					\ 'setTimeout']
3741ef15e30SBram Moolenaar		call map(windmeth, 'v:val."("')
3751ef15e30SBram Moolenaar		let winds = windprop + windmeth
3761ef15e30SBram Moolenaar		" XMLHttpRequest - access by new xxx()
3771ef15e30SBram Moolenaar		let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
3788b6144bdSBram Moolenaar					\ 'status', 'statusText', 'parseError']
3791ef15e30SBram Moolenaar		let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
3801ef15e30SBram Moolenaar					\ 'send', 'setRequestHeader']
3811ef15e30SBram Moolenaar		call map(xmlhmeth, 'v:val."("')
3821ef15e30SBram Moolenaar		let xmlhs = xmlhprop + xmlhmeth
3831ef15e30SBram Moolenaar
3848b6144bdSBram Moolenaar		" XML DOM
3858b6144bdSBram Moolenaar		" Attributes - element.attributes[x].
3868b6144bdSBram Moolenaar		let xdomattrprop = ['name', 'specified', 'value']
3878b6144bdSBram Moolenaar		" Element - anyelement.
3888b6144bdSBram Moolenaar		let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
3898b6144bdSBram Moolenaar					\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
3908b6144bdSBram Moolenaar					\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
391*e7b1ea02SBram Moolenaar		let xdomelemmeth = ['appendChild', 'addEventListener', 'cloneNode',
392*e7b1ea02SBram Moolenaar					\ 'dispatchEvent', 'getAttribute', 'getAttributeNode',
393*e7b1ea02SBram Moolenaar					\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore',
394*e7b1ea02SBram Moolenaar					\ 'normalize', 'removeAttribute', 'removeAttributeNode',
395*e7b1ea02SBram Moolenaar					\ 'removeChild', 'removeEventListener', 'replaceChild',
3968b6144bdSBram Moolenaar					\ 'setAttribute', 'setAttributeNode']
3978b6144bdSBram Moolenaar		call map(xdomelemmeth, 'v:val."("')
3988b6144bdSBram Moolenaar		let xdomelems = xdomelemprop + xdomelemmeth
3998b6144bdSBram Moolenaar		" Node - anynode.
4008b6144bdSBram Moolenaar		let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
4018b6144bdSBram Moolenaar					\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
4028b6144bdSBram Moolenaar					\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling']
4038b6144bdSBram Moolenaar		let xdomnodemeth = ['appendChild', 'cloneNode',
4048b6144bdSBram Moolenaar					\ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild']
4058b6144bdSBram Moolenaar		call map(xdomnodemeth, 'v:val."("')
4068b6144bdSBram Moolenaar		let xdomnodes = xdomnodeprop + xdomnodemeth
4078b6144bdSBram Moolenaar		" NodeList
4088b6144bdSBram Moolenaar		let xdomnliss = ['length', 'item(']
4098b6144bdSBram Moolenaar		" Error - parseError.
4108b6144bdSBram Moolenaar		let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos']
4118b6144bdSBram Moolenaar
4128b6144bdSBram Moolenaar		" Find object type declaration to reduce number of suggestions. {{{
4138b6144bdSBram Moolenaar		" 1. Get object name
4148b6144bdSBram Moolenaar		" 2. Find object declaration line
4158b6144bdSBram Moolenaar		" 3. General declaration follows "= new Type" syntax, additional else
4168b6144bdSBram Moolenaar		"    for regexp "= /re/"
4178b6144bdSBram Moolenaar		" 4. Make correction for Microsoft.XMLHTTP ActiveXObject
4188b6144bdSBram Moolenaar		" 5. Repeat for external files
4191d2ba7faSBram Moolenaar		let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$')
4208b6144bdSBram Moolenaar		if len(object) > 0
4211ef15e30SBram Moolenaar			let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
4228b6144bdSBram Moolenaar			if decl_line > 0
4231d2ba7faSBram Moolenaar				let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze')
4248b6144bdSBram Moolenaar				if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
4258b6144bdSBram Moolenaar						let object_type = 'XMLHttpRequest'
4268b6144bdSBram Moolenaar				endif
4278b6144bdSBram Moolenaar			else
4288b6144bdSBram Moolenaar				let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn')
4298b6144bdSBram Moolenaar				if decl_line > 0
4308b6144bdSBram Moolenaar					let object_type = 'RegExp'
4318b6144bdSBram Moolenaar				endif
4328b6144bdSBram Moolenaar			endif
4338b6144bdSBram Moolenaar			" We didn't find var declaration in current file but we may have
4348b6144bdSBram Moolenaar			" something in external files.
4358b6144bdSBram Moolenaar			if decl_line == 0 && exists("b:js_extfiles")
4368b6144bdSBram Moolenaar				let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
4378b6144bdSBram Moolenaar				if len(dext_line) > 0
4381d2ba7faSBram Moolenaar					let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze')
4398b6144bdSBram Moolenaar					if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
4408b6144bdSBram Moolenaar							let object_type = 'XMLHttpRequest'
4418b6144bdSBram Moolenaar					endif
4428b6144bdSBram Moolenaar				else
4438b6144bdSBram Moolenaar					let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"')
4448b6144bdSBram Moolenaar					if len(dext_line) > 0
4458b6144bdSBram Moolenaar						let object_type = 'RegExp'
4468b6144bdSBram Moolenaar					endif
4478b6144bdSBram Moolenaar				endif
4488b6144bdSBram Moolenaar			endif
4498b6144bdSBram Moolenaar		endif
4508b6144bdSBram Moolenaar		" }}}
4518b6144bdSBram Moolenaar
4528b6144bdSBram Moolenaar		if !exists('object_type')
4538b6144bdSBram Moolenaar			let object_type = ''
4548b6144bdSBram Moolenaar		endif
4551ef15e30SBram Moolenaar
4561ef15e30SBram Moolenaar		if object_type == 'Date'
4571ef15e30SBram Moolenaar			let values = dates
4581ef15e30SBram Moolenaar		elseif object_type == 'Image'
4591ef15e30SBram Moolenaar			let values = imags
4601ef15e30SBram Moolenaar		elseif object_type == 'Array'
4611ef15e30SBram Moolenaar			let values = arrays
4621ef15e30SBram Moolenaar		elseif object_type == 'Boolean'
4631ef15e30SBram Moolenaar			" TODO: a bit more than real boolean
4641ef15e30SBram Moolenaar			let values = arrays
4651ef15e30SBram Moolenaar		elseif object_type == 'XMLHttpRequest'
4661ef15e30SBram Moolenaar			let values = xmlhs
4671ef15e30SBram Moolenaar		elseif object_type == 'String'
4681ef15e30SBram Moolenaar			let values = stris
4698b6144bdSBram Moolenaar		elseif object_type == 'RegExp'
4708b6144bdSBram Moolenaar			let values = reges
4718b6144bdSBram Moolenaar		elseif object_type == 'Math'
4728b6144bdSBram Moolenaar			let values = maths
4731ef15e30SBram Moolenaar		endif
4741ef15e30SBram Moolenaar
4751ef15e30SBram Moolenaar		if !exists('values')
4761ef15e30SBram Moolenaar		" List of properties
4771ef15e30SBram Moolenaar		if shortcontext =~ 'Math\.$'
4781ef15e30SBram Moolenaar			let values = maths
4798b6144bdSBram Moolenaar		elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$'
4801ef15e30SBram Moolenaar			let values = anths
4811ef15e30SBram Moolenaar		elseif shortcontext =~ 'area\.$'
4821ef15e30SBram Moolenaar			let values = areas
4831ef15e30SBram Moolenaar		elseif shortcontext =~ 'base\.$'
4841ef15e30SBram Moolenaar			let values = bases
4851ef15e30SBram Moolenaar		elseif shortcontext =~ 'body\.$'
4861ef15e30SBram Moolenaar			let values = bodys
4871ef15e30SBram Moolenaar		elseif shortcontext =~ 'document\.$'
4881ef15e30SBram Moolenaar			let values = docus
4898b6144bdSBram Moolenaar		elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$'
4901ef15e30SBram Moolenaar			let values = forms
4911ef15e30SBram Moolenaar		elseif shortcontext =~ 'frameset\.$'
4921ef15e30SBram Moolenaar			let values = fsets
4931ef15e30SBram Moolenaar		elseif shortcontext =~ 'history\.$'
4941ef15e30SBram Moolenaar			let values = hists
4951ef15e30SBram Moolenaar		elseif shortcontext =~ 'iframe\.$'
4961ef15e30SBram Moolenaar			let values = ifras
4978b6144bdSBram Moolenaar		elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$'
4981ef15e30SBram Moolenaar			let values = imags
4998b6144bdSBram Moolenaar		elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$'
5001ef15e30SBram Moolenaar			let values = links
5011ef15e30SBram Moolenaar		elseif shortcontext =~ 'location\.$'
5021ef15e30SBram Moolenaar			let values = locas
5031ef15e30SBram Moolenaar		elseif shortcontext =~ 'meta\.$'
5041ef15e30SBram Moolenaar			let values = metas
5051ef15e30SBram Moolenaar		elseif shortcontext =~ 'navigator\.$'
5061ef15e30SBram Moolenaar			let values = navis
5071ef15e30SBram Moolenaar		elseif shortcontext =~ 'object\.$'
5081ef15e30SBram Moolenaar			let values = objes
5091ef15e30SBram Moolenaar		elseif shortcontext =~ 'screen\.$'
5101ef15e30SBram Moolenaar			let values = scres
5111ef15e30SBram Moolenaar		elseif shortcontext =~ 'style\.$'
5121ef15e30SBram Moolenaar			let values = styls
5131ef15e30SBram Moolenaar		elseif shortcontext =~ 'table\.$'
5141ef15e30SBram Moolenaar			let values = tabls
5151ef15e30SBram Moolenaar		elseif shortcontext =~ 'TableData\.$'
5161ef15e30SBram Moolenaar			let values = tdats
5171ef15e30SBram Moolenaar		elseif shortcontext =~ 'TableRow\.$'
5181ef15e30SBram Moolenaar			let values = trows
5191ef15e30SBram Moolenaar		elseif shortcontext =~ 'window\.$'
5201ef15e30SBram Moolenaar			let values = winds
5218b6144bdSBram Moolenaar		elseif shortcontext =~ 'parseError\.$'
5228b6144bdSBram Moolenaar			let values = xdomerror
5238b6144bdSBram Moolenaar		elseif shortcontext =~ 'attributes\[\d\+\]\.$'
5248b6144bdSBram Moolenaar			let values = xdomattrprop
5251ef15e30SBram Moolenaar		else
5261ef15e30SBram Moolenaar			let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris
5271ef15e30SBram Moolenaar			let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists
5288b6144bdSBram Moolenaar			let values += ifras + imags + links + locas + metas + navis + objes + scres
5298b6144bdSBram Moolenaar			let values += tabls + trows + tares + winds
5308b6144bdSBram Moolenaar			let values += xdomnodes + xdomnliss + xdomelems
5311ef15e30SBram Moolenaar		endif
5321ef15e30SBram Moolenaar		endif
5331ef15e30SBram Moolenaar
5341ef15e30SBram Moolenaar		for m in values
5351ef15e30SBram Moolenaar			if m =~? '^'.a:base
5361ef15e30SBram Moolenaar				call add(res, m)
5371ef15e30SBram Moolenaar			elseif m =~? a:base
5381ef15e30SBram Moolenaar				call add(res2, m)
5391ef15e30SBram Moolenaar			endif
5401ef15e30SBram Moolenaar		endfor
5411ef15e30SBram Moolenaar
5421ef15e30SBram Moolenaar		unlet! values
5431ef15e30SBram Moolenaar		return res + res2
5441ef15e30SBram Moolenaar
5451ef15e30SBram Moolenaar	endif
5468b6144bdSBram Moolenaar	" }}}
5471ef15e30SBram Moolenaar
5481ef15e30SBram Moolenaar	" Get variables data.
5491ef15e30SBram Moolenaar	let variables = filter(copy(file), 'v:val =~ "var\\s"')
5501ef15e30SBram Moolenaar	call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")')
5511ef15e30SBram Moolenaar	call map(variables, 'substitute(v:val, ";\\|$", ",", "g")')
5521ef15e30SBram Moolenaar	let vars = []
5538b6144bdSBram Moolenaar	" This loop (and next one) is necessary to get variable names from
5548b6144bdSBram Moolenaar	" constructs like: var var1, var2, var3 = "something";
5551ef15e30SBram Moolenaar	for i in range(len(variables))
5561ef15e30SBram Moolenaar		let comma_separated = split(variables[i], ',\s*')
5571d2ba7faSBram Moolenaar		call map(comma_separated, 'matchstr(v:val, "\\k\\+")')
5581ef15e30SBram Moolenaar		let vars += comma_separated
5591ef15e30SBram Moolenaar	endfor
5601ef15e30SBram Moolenaar
5611ef15e30SBram Moolenaar	let variables = sort(vars)
5628b6144bdSBram Moolenaar	unlet! vars
5631ef15e30SBram Moolenaar
5648b6144bdSBram Moolenaar	" Add "no var" variables.
5651d2ba7faSBram Moolenaar	let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="')
5668b6144bdSBram Moolenaar	let u_vars = []
5678b6144bdSBram Moolenaar	for i in range(len(undeclared_variables))
5688b6144bdSBram Moolenaar		let  split_equal = split(undeclared_variables[i], '\s*=')
5691d2ba7faSBram Moolenaar		call map(split_equal, 'matchstr(v:val, "\\k\\+$")')
5708b6144bdSBram Moolenaar		let u_vars += split_equal
5718b6144bdSBram Moolenaar	endfor
5721ef15e30SBram Moolenaar
5738b6144bdSBram Moolenaar	let variables += sort(u_vars)
5748b6144bdSBram Moolenaar	unlet! u_vars
5751ef15e30SBram Moolenaar
5761ef15e30SBram Moolenaar	" Get functions
5771ef15e30SBram Moolenaar	let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
5781ef15e30SBram Moolenaar	let arguments = copy(functions)
5791d2ba7faSBram Moolenaar	call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")')
5801ef15e30SBram Moolenaar	call map(functions, 'v:val."("')
5818b6144bdSBram Moolenaar	let functions = sort(functions)
5821ef15e30SBram Moolenaar
5831d2ba7faSBram Moolenaar	" Create table to keep arguments for additional 'menu' info
5841d2ba7faSBram Moolenaar	let b:js_menuinfo = {}
5851d2ba7faSBram Moolenaar	for i in arguments
5861d2ba7faSBram Moolenaar		let g:ia = i
5871d2ba7faSBram Moolenaar		let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))')
588214641f7SBram Moolenaar		if len(f_elements) >= 3
5891d2ba7faSBram Moolenaar			let b:js_menuinfo[f_elements[1].'('] = f_elements[2]
5901d2ba7faSBram Moolenaar		endif
5911d2ba7faSBram Moolenaar	endfor
5921d2ba7faSBram Moolenaar
5931ef15e30SBram Moolenaar	" Get functions arguments
5941ef15e30SBram Moolenaar	call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
5951ef15e30SBram Moolenaar	let jargs = join(arguments, ',')
5961ef15e30SBram Moolenaar	let jargs = substitute(jargs, '\s', '', 'g')
5971ef15e30SBram Moolenaar	let arguments = split(jargs, ',')
5988b6144bdSBram Moolenaar	let arguments = sort(arguments)
5991ef15e30SBram Moolenaar
6001ef15e30SBram Moolenaar	" Built-in functions
6018b6144bdSBram Moolenaar	let builtin = ['alert(', 'confirm(']
6021ef15e30SBram Moolenaar
6031ef15e30SBram Moolenaar	" Top-level HTML DOM objects
6041ef15e30SBram 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']
6051ef15e30SBram Moolenaar	call map(htmldom, 'v:val."."')
6061ef15e30SBram Moolenaar
6071ef15e30SBram Moolenaar	" Top-level properties
6081ef15e30SBram Moolenaar	let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
6091ef15e30SBram Moolenaar				\ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
6101ef15e30SBram Moolenaar				\ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
6111ef15e30SBram Moolenaar
6121ef15e30SBram Moolenaar	" Keywords
6131ef15e30SBram 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"]
6141ef15e30SBram Moolenaar
6151ef15e30SBram Moolenaar	let values = variables + functions + htmldom + arguments + builtin + properties + keywords
6161ef15e30SBram Moolenaar
6171ef15e30SBram Moolenaar	for m in values
6181ef15e30SBram Moolenaar		if m =~? '^'.a:base
6191ef15e30SBram Moolenaar			call add(res, m)
6201ef15e30SBram Moolenaar		elseif m =~? a:base
6211ef15e30SBram Moolenaar			call add(res2, m)
6221ef15e30SBram Moolenaar		endif
6231ef15e30SBram Moolenaar	endfor
6241ef15e30SBram Moolenaar
6251d2ba7faSBram Moolenaar	let menu = res + res2
6261d2ba7faSBram Moolenaar	let final_menu = []
6271d2ba7faSBram Moolenaar	for i in range(len(menu))
6281d2ba7faSBram Moolenaar		let item = menu[i]
6291d2ba7faSBram Moolenaar		if item =~ '($'
6301d2ba7faSBram Moolenaar			let kind = 'f'
6311d2ba7faSBram Moolenaar			if has_key(b:js_menuinfo, item)
6321d2ba7faSBram Moolenaar				let m_info = b:js_menuinfo[item]
6331d2ba7faSBram Moolenaar			else
6341d2ba7faSBram Moolenaar				let m_info = ''
6351d2ba7faSBram Moolenaar			endif
6361d2ba7faSBram Moolenaar		else
6371d2ba7faSBram Moolenaar			let kind = 'v'
6381d2ba7faSBram Moolenaar			let m_info = ''
6391d2ba7faSBram Moolenaar		endif
6401d2ba7faSBram Moolenaar		let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}]
6411d2ba7faSBram Moolenaar	endfor
6421d2ba7faSBram Moolenaar	let g:fm = final_menu
6431d2ba7faSBram Moolenaar	return final_menu
6441d2ba7faSBram Moolenaar
6451ef15e30SBram Moolenaarendfunction
6468b6144bdSBram Moolenaar
6478b6144bdSBram Moolenaar" vim:set foldmethod=marker:
648