| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | " Vim completion script | 
					
						
							|  |  |  | " Language:	Java Script | 
					
						
							| 
									
										
										
										
											2020-08-07 19:54:59 +02:00
										 |  |  | " Maintainer:	Jay Sitter (jay@jaysitter.com) | 
					
						
							|  |  |  | " URL: https://github.com/jsit/javascriptcomplete.vim/ | 
					
						
							|  |  |  | " Previous Maintainer:	Mikolaj Machowski ( mikmach AT wp DOT pl ) | 
					
						
							|  |  |  | " Last Change:	2020 Jul 30 | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | function! javascriptcomplete#CompleteJS(findstart, base) | 
					
						
							|  |  |  |   if a:findstart | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	" locate the start of the word | 
					
						
							|  |  |  | 	let line = getline('.') | 
					
						
							|  |  |  | 	let start = col('.') - 1 | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 	let curline = line('.') | 
					
						
							|  |  |  | 	let compl_begin = col('.') - 2 | 
					
						
							|  |  |  | 	" Bit risky but JS is rather limited language and local chars shouldn't | 
					
						
							|  |  |  | 	" fint way into names | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 	while start >= 0 && line[start - 1] =~ '\k' | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		let start -= 1 | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	endwhile | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 	let b:compl_context = getline('.')[0:compl_begin] | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	return start | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  |   else | 
					
						
							|  |  |  | 	" Initialize base return lists | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	let res = [] | 
					
						
							|  |  |  | 	let res2 = [] | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 	" a:base is very short - we need context | 
					
						
							|  |  |  | 	" Shortcontext is context without a:base, useful for checking if we are | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	" looking for objects and for what objects we are looking for | 
					
						
							|  |  |  | 	let context = b:compl_context | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 	let shortcontext = substitute(context, a:base.'$', '', '') | 
					
						
							|  |  |  | 	unlet! b:compl_context | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	if exists("b:jsrange") | 
					
						
							|  |  |  | 		let file = getline(b:jsrange[0],b:jsrange[1]) | 
					
						
							|  |  |  | 		unlet! b:jsrange | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if len(b:js_extfiles) > 0 | 
					
						
							|  |  |  | 			let file = b:js_extfiles + file | 
					
						
							|  |  |  | 		endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		let file = getline(1, '$') | 
					
						
							|  |  |  | 	endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	" Completion of properties, methods, etc. {{{ | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 	if shortcontext =~ '\.$' | 
					
						
							|  |  |  | 		" Complete methods and properties for objects | 
					
						
							|  |  |  | 		" DOM separate | 
					
						
							|  |  |  | 		let doms = ['style.'] | 
					
						
							|  |  |  | 		" Arrays | 
					
						
							|  |  |  | 		let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype'] | 
					
						
							| 
									
										
										
										
											2006-04-30 18:54:39 +00:00
										 |  |  | 		let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift', | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 					\ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf', | 
					
						
							|  |  |  | 					\ 'watch', 'unwatch'] | 
					
						
							|  |  |  | 		call map(arraymeth, 'v:val."("') | 
					
						
							|  |  |  | 		let arrays = arrayprop + arraymeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" Boolean - complete subset of array values | 
					
						
							|  |  |  | 		" properties - constructor, prototype | 
					
						
							|  |  |  | 		" methods    - toSource, toString, valueOf | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" Date | 
					
						
							|  |  |  | 		" properties - constructor, prototype | 
					
						
							|  |  |  | 		let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds', | 
					
						
							|  |  |  | 					\ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset', | 
					
						
							|  |  |  | 					\ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds', | 
					
						
							|  |  |  | 					\ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds', | 
					
						
							|  |  |  | 					\ 'getYear', 'parse', 'parse', | 
					
						
							|  |  |  | 					\ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds', | 
					
						
							|  |  |  | 					\ 'setMinutes', 'setMonth', 'setSeconds', | 
					
						
							|  |  |  | 					\ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds', | 
					
						
							|  |  |  | 					\ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime', | 
					
						
							|  |  |  | 					\ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString', | 
					
						
							|  |  |  | 					\ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch'] | 
					
						
							|  |  |  | 		call map(datemeth, 'v:val."("') | 
					
						
							|  |  |  | 		let dates = datemeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" Function | 
					
						
							|  |  |  | 		let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length', | 
					
						
							|  |  |  | 					\ 'arity', 'constructor', 'length', 'prototype'] | 
					
						
							|  |  |  | 		let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf'] | 
					
						
							|  |  |  | 		call map(funcmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let funcs = funcprop + funcmeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" Math | 
					
						
							|  |  |  | 		let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT'] | 
					
						
							|  |  |  | 		let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', | 
					
						
							|  |  |  | 					\ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan', | 
					
						
							|  |  |  | 					\ 'watch', 'unwatch'] | 
					
						
							|  |  |  | 		call map(mathmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let maths = mathprop + mathmeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" Number | 
					
						
							|  |  |  | 		let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY',  | 
					
						
							|  |  |  | 					\ 'constructor', 'prototype'] | 
					
						
							|  |  |  | 		let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf', | 
					
						
							|  |  |  | 					\ 'watch', 'unwatch'] | 
					
						
							|  |  |  | 		call map(numbmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let numbs = numbprop + numbmeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" Object | 
					
						
							|  |  |  | 		let objeprop = ['constructor', 'prototype'] | 
					
						
							|  |  |  | 		let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf'] | 
					
						
							|  |  |  | 		call map(objemeth, 'v:val."("') | 
					
						
							|  |  |  | 		let objes = objeprop + objemeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" RegExp | 
					
						
							|  |  |  | 		let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype'] | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch'] | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		call map(regemeth, 'v:val."("') | 
					
						
							|  |  |  | 		let reges = regeprop + regemeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" String | 
					
						
							|  |  |  | 		let striprop = ['constructor', 'length', 'prototype'] | 
					
						
							|  |  |  | 		let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat', | 
					
						
							|  |  |  | 					\ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics', | 
					
						
							|  |  |  | 					\ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small', | 
					
						
							|  |  |  | 					\ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase', | 
					
						
							|  |  |  | 					\ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch'] | 
					
						
							|  |  |  | 		call map(strimeth, 'v:val."("') | 
					
						
							|  |  |  | 		let stris = striprop + strimeth | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" User created properties | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 		let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"') | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		let juser_props1 = join(user_props1, ' ') | 
					
						
							|  |  |  | 		let user_props1 = split(juser_props1, '\zethis\.') | 
					
						
							|  |  |  | 		unlet! juser_props1 | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 		call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 		let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		let juser_props2 = join(user_props2, ' ') | 
					
						
							|  |  |  | 		let user_props2 = split(juser_props2, '\zeprototype\.') | 
					
						
							|  |  |  | 		unlet! juser_props2 | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 		call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\ze")') | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		let user_props = user_props1 + user_props2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" HTML DOM properties | 
					
						
							|  |  |  | 		" Anchors - anchor. | 
					
						
							|  |  |  | 		let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML', | 
					
						
							|  |  |  | 					\ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus'] | 
					
						
							|  |  |  | 		let anchmeth = ['blur', 'focus'] | 
					
						
							|  |  |  | 		call map(anchmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let anths = anchprop + anchmeth | 
					
						
							|  |  |  | 		" Area - area. | 
					
						
							|  |  |  | 		let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id', | 
					
						
							|  |  |  | 					\ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target'] | 
					
						
							|  |  |  | 		let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver'] | 
					
						
							|  |  |  | 		call map(areameth, 'v:val."("') | 
					
						
							|  |  |  | 		let areas = areaprop + areameth | 
					
						
							|  |  |  | 		" Base - base. | 
					
						
							|  |  |  | 		let baseprop = ['href', 'id', 'target'] | 
					
						
							|  |  |  | 		let bases = baseprop | 
					
						
							|  |  |  | 		" Body - body. | 
					
						
							|  |  |  | 		let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop', | 
					
						
							|  |  |  | 					\ 'text', 'vLink'] | 
					
						
							|  |  |  | 		let bodys = bodyprop | 
					
						
							|  |  |  | 		" Document - document. | 
					
						
							| 
									
										
										
										
											2020-08-07 19:54:59 +02:00
										 |  |  | 		let docuprop = ['anchors', 'body', 'characterSet', 'doctype', | 
					
						
							|  |  |  | 					\ 'documentElement', 'documentURI', 'embeds', 'fonts', 'forms', | 
					
						
							|  |  |  | 					\ 'head', 'hidden', 'images', 'implementation', 'lastStyleSheetSet', | 
					
						
							|  |  |  | 					\ 'links', 'plugins', 'preferredStyleSheetSet', 'scripts', | 
					
						
							|  |  |  | 					\ 'scrollingElement', 'selectedStyleSheetSet', 'styleSheetSets', | 
					
						
							|  |  |  | 					\ 'timeline', 'visibilityState', 'cookie', 'defaultView', | 
					
						
							|  |  |  | 					\ 'designMode', 'dir', 'domain', 'lastModified', 'location', | 
					
						
							|  |  |  | 					\ 'readyState', 'referrer', 'title', 'URL', 'activeElement', | 
					
						
							|  |  |  | 					\ 'fullscreenElement', 'styleSheets'] | 
					
						
							|  |  |  | 		let documeth = ['adoptNode', 'close', 'createAttribute', | 
					
						
							|  |  |  | 					\ 'createAttributeNS', 'createCDATASection', 'createComment', | 
					
						
							|  |  |  | 					\ 'createDocumentFragment', 'createElement', 'createElementNS', | 
					
						
							|  |  |  | 					\ 'createEvent', 'createExpression', 'createNSResolver', | 
					
						
							|  |  |  | 					\ 'createNodeIterator', 'createProcessingInstruction', 'createRange', | 
					
						
							|  |  |  | 					\ 'createTextNode', 'createTouchList', 'createTreeWalker', | 
					
						
							|  |  |  | 					\ 'enableStyleSheetsForSet', 'evaluate', 'focus', 'getElementById', | 
					
						
							|  |  |  | 					\ 'getElementById', 'getElementsByClassName', 'getElementsByName', | 
					
						
							|  |  |  | 					\ 'getElementsByTagName', 'getElementsByTagNameNS', | 
					
						
							|  |  |  | 					\ 'hasStorageAccess', 'importNode', 'onClick', 'onDblClick', | 
					
						
							|  |  |  | 					\ 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onMouseDown', | 
					
						
							|  |  |  | 					\ 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', | 
					
						
							|  |  |  | 					\ 'onResize', 'open', 'querySelector', 'querySelectorAll', | 
					
						
							|  |  |  | 					\ 'requestStorageAccess', 'write', 'writeln'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		call map(documeth, 'v:val."("') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild', | 
					
						
							|  |  |  | 					\ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', | 
					
						
							|  |  |  | 					\ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling'] | 
					
						
							|  |  |  | 		let docuxmeth = ['createAttribute', 'createCDATASection', | 
					
						
							|  |  |  | 					\ 'createComment', 'createDocument', 'createDocumentFragment', | 
					
						
							|  |  |  | 					\ 'createElement', 'createEntityReference', 'createProcessingInstruction', | 
					
						
							|  |  |  | 					\ 'createTextNode'] | 
					
						
							|  |  |  | 		call map(docuxmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let docus = docuprop + docuxprop + documeth + docuxmeth | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		" Form - form. | 
					
						
							|  |  |  | 		let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length', | 
					
						
							|  |  |  | 					\ 'method', 'name', 'tabIndex', 'target'] | 
					
						
							|  |  |  | 		let formmeth = ['reset', 'submit', 'onReset', 'onSubmit'] | 
					
						
							|  |  |  | 		call map(formmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let forms = formprop + formmeth | 
					
						
							|  |  |  | 		" Frame - frame. | 
					
						
							|  |  |  | 		let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth', | 
					
						
							|  |  |  | 					\ 'name', 'noResize', 'scrolling', 'src'] | 
					
						
							|  |  |  | 		let frammeth = ['blur', 'focus'] | 
					
						
							|  |  |  | 		call map(frammeth, 'v:val."("') | 
					
						
							|  |  |  | 		let frams = framprop + frammeth | 
					
						
							|  |  |  | 		" Frameset - frameset. | 
					
						
							|  |  |  | 		let fsetprop = ['cols', 'id', 'rows'] | 
					
						
							|  |  |  | 		let fsetmeth = ['blur', 'focus'] | 
					
						
							|  |  |  | 		call map(fsetmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let fsets = fsetprop + fsetmeth | 
					
						
							|  |  |  | 		" History - history. | 
					
						
							|  |  |  | 		let histprop = ['length'] | 
					
						
							|  |  |  | 		let histmeth = ['back', 'forward', 'go'] | 
					
						
							|  |  |  | 		call map(histmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let hists = histprop + histmeth | 
					
						
							|  |  |  | 		" Iframe - iframe. | 
					
						
							|  |  |  | 		let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth', | 
					
						
							|  |  |  | 					\ 'name', 'scrolling', 'src', 'width'] | 
					
						
							|  |  |  | 		let ifras = ifraprop | 
					
						
							|  |  |  | 		" Image - image. | 
					
						
							|  |  |  | 		let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc', | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 					\ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width'] | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		let imagmeth = ['onAbort', 'onError', 'onLoad'] | 
					
						
							|  |  |  | 		call map(imagmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let imags = histprop + imagmeth | 
					
						
							|  |  |  | 		" Button - accessible only by other properties | 
					
						
							|  |  |  | 		let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] | 
					
						
							|  |  |  | 		let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] | 
					
						
							|  |  |  | 		call map(buttmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let butts = buttprop + buttmeth | 
					
						
							|  |  |  | 		" Checkbox - accessible only by other properties | 
					
						
							|  |  |  | 		let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']  | 
					
						
							|  |  |  | 		let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] | 
					
						
							|  |  |  | 		call map(checmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let checs = checprop + checmeth | 
					
						
							|  |  |  | 		" File upload - accessible only by other properties | 
					
						
							|  |  |  | 		let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']  | 
					
						
							|  |  |  | 		let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp'] | 
					
						
							|  |  |  | 		call map(filemeth, 'v:val."("') | 
					
						
							|  |  |  | 		let files = fileprop + filemeth | 
					
						
							|  |  |  | 		" Hidden - accessible only by other properties | 
					
						
							|  |  |  | 		let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value']  | 
					
						
							|  |  |  | 		let hidds = hiddprop | 
					
						
							|  |  |  | 		" Password - accessible only by other properties | 
					
						
							|  |  |  | 		let passprop = ['accept', 'accessKey', 'defaultValue',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex',  | 
					
						
							|  |  |  | 					\ 'type', 'value']  | 
					
						
							|  |  |  | 		let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown',  | 
					
						
							|  |  |  | 					\ 'onKeyPress', 'onKeyUp'] | 
					
						
							|  |  |  | 		call map(passmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let passs = passprop + passmeth | 
					
						
							|  |  |  | 		" Radio - accessible only by other properties | 
					
						
							|  |  |  | 		let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']  | 
					
						
							|  |  |  | 		let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus'] | 
					
						
							|  |  |  | 		call map(radimeth, 'v:val."("') | 
					
						
							|  |  |  | 		let radis = radiprop + radimeth | 
					
						
							|  |  |  | 		" Reset - accessible only by other properties | 
					
						
							|  |  |  | 		let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']  | 
					
						
							|  |  |  | 		let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus'] | 
					
						
							|  |  |  | 		call map(resemeth, 'v:val."("') | 
					
						
							|  |  |  | 		let reses = reseprop + resemeth | 
					
						
							|  |  |  | 		" Submit - accessible only by other properties | 
					
						
							|  |  |  | 		let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']  | 
					
						
							|  |  |  | 		let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart'] | 
					
						
							|  |  |  | 		call map(submmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let subms = submprop + submmeth | 
					
						
							|  |  |  | 		" Text - accessible only by other properties | 
					
						
							|  |  |  | 		let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly',  | 
					
						
							|  |  |  | 					\ 'size', 'tabIndex', 'type', 'value']  | 
					
						
							|  |  |  | 		let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown', | 
					
						
							|  |  |  | 					\ 'onKeyPress', 'onKeyUp', 'onSelect'] | 
					
						
							|  |  |  | 		call map(textmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let texts = textprop + textmeth | 
					
						
							|  |  |  | 		" Link - link. | 
					
						
							|  |  |  | 		let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media', | 
					
						
							|  |  |  | 					\ 'rel', 'rev', 'target', 'type'] | 
					
						
							|  |  |  | 		let linkmeth = ['onLoad'] | 
					
						
							|  |  |  | 		call map(linkmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let links = linkprop + linkmeth | 
					
						
							|  |  |  | 		" Location - location. | 
					
						
							|  |  |  | 		let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol', | 
					
						
							|  |  |  | 					\ 'search'] | 
					
						
							|  |  |  | 		let locameth = ['assign', 'reload', 'replace'] | 
					
						
							|  |  |  | 		call map(locameth, 'v:val."("') | 
					
						
							|  |  |  | 		let locas = locaprop + locameth | 
					
						
							|  |  |  | 		" Meta - meta. | 
					
						
							|  |  |  | 		let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme'] | 
					
						
							|  |  |  | 		let metas = metaprop | 
					
						
							|  |  |  | 		" Navigator - navigator. | 
					
						
							|  |  |  | 		let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled', | 
					
						
							|  |  |  | 					\ 'platform', 'userAgent'] | 
					
						
							|  |  |  | 		let navimeth = ['javaEnabled', 'taintEnabled'] | 
					
						
							|  |  |  | 		call map(navimeth, 'v:val."("') | 
					
						
							|  |  |  | 		let navis = naviprop + navimeth | 
					
						
							|  |  |  | 		" Object - object. | 
					
						
							|  |  |  | 		let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data', | 
					
						
							|  |  |  | 					\ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex', | 
					
						
							|  |  |  | 					\ 'type', 'useMap', 'vspace', 'width'] | 
					
						
							|  |  |  | 		let objes = objeprop | 
					
						
							|  |  |  | 		" Option - accessible only by other properties | 
					
						
							|  |  |  | 		let optiprop = ['defaultSelected',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value'] | 
					
						
							|  |  |  | 		let optis = optiprop | 
					
						
							|  |  |  | 		" Screen - screen. | 
					
						
							|  |  |  | 		let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width'] | 
					
						
							|  |  |  | 		let scres = screprop | 
					
						
							|  |  |  | 		" Select - accessible only by other properties | 
					
						
							|  |  |  | 		let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name',  | 
					
						
							|  |  |  | 					\ 'selectedIndex', 'size', 'tabIndex', 'type', 'value']  | 
					
						
							|  |  |  | 		let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus'] | 
					
						
							|  |  |  | 		call map(selemeth, 'v:val."("') | 
					
						
							|  |  |  | 		let seles = seleprop + selemeth | 
					
						
							|  |  |  | 		" Style - style. | 
					
						
							|  |  |  | 		let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage', | 
					
						
							|  |  |  | 					\ 'backgroundPosition', 'backgroundRepeat', | 
					
						
							|  |  |  | 					\ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop', | 
					
						
							|  |  |  | 					\ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', | 
					
						
							|  |  |  | 					\ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle', | 
					
						
							|  |  |  | 					\ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 					\ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom', | 
					
						
							|  |  |  | 					\ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth', | 
					
						
							|  |  |  | 					\ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom', | 
					
						
							|  |  |  | 					\ 'paddingLeft', 'paddingRight', 'paddingTop', | 
					
						
							|  |  |  | 					\ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content', | 
					
						
							|  |  |  | 					\ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction', | 
					
						
							|  |  |  | 					\ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight', | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 					\ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility', | 
					
						
							|  |  |  | 					\ 'width', | 
					
						
							|  |  |  | 					\ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType', | 
					
						
							|  |  |  | 					\ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex', | 
					
						
							|  |  |  | 					\ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside', | 
					
						
							|  |  |  | 					\ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout', | 
					
						
							|  |  |  | 					\ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', | 
					
						
							|  |  |  | 					\ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes', | 
					
						
							|  |  |  | 					\ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition', | 
					
						
							|  |  |  | 					\ 'unicodeBidi', 'whiteSpace', 'wordSpacing'] | 
					
						
							|  |  |  | 		let styls = stylprop | 
					
						
							|  |  |  | 		" Table - table. | 
					
						
							|  |  |  | 		let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding', | 
					
						
							|  |  |  | 					\ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width'] | 
					
						
							|  |  |  | 		let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow', | 
					
						
							|  |  |  | 					\ 'deleteTFoot', 'deleteTHead', 'insertRow'] | 
					
						
							|  |  |  | 		call map(tablmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let tabls = tablprop + tablmeth | 
					
						
							|  |  |  | 		" Table data - TableData. | 
					
						
							|  |  |  | 		let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff', | 
					
						
							|  |  |  | 					\ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width'] | 
					
						
							|  |  |  | 		let tdats = tdatprop | 
					
						
							|  |  |  | 		" Table row - TableRow. | 
					
						
							|  |  |  | 		let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex', | 
					
						
							|  |  |  | 					\ 'vAlign'] | 
					
						
							|  |  |  | 		let trowmeth = ['deleteCell', 'insertCell'] | 
					
						
							|  |  |  | 		call map(trowmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let trows = trowprop + trowmeth | 
					
						
							|  |  |  | 		" Textarea - accessible only by other properties | 
					
						
							|  |  |  | 		let tareprop = ['accessKey', 'cols', 'defaultValue',  | 
					
						
							|  |  |  | 					\ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows',  | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 					\ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd']  | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus'] | 
					
						
							|  |  |  | 		call map(taremeth, 'v:val."("') | 
					
						
							|  |  |  | 		let tares = tareprop + taremeth | 
					
						
							|  |  |  | 		" Window - window. | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history', | 
					
						
							|  |  |  | 					\ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self', | 
					
						
							|  |  |  | 					\ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject'] | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus', | 
					
						
							|  |  |  | 					\ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval', | 
					
						
							|  |  |  | 					\ 'setTimeout'] | 
					
						
							|  |  |  | 		call map(windmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let winds = windprop + windmeth | 
					
						
							|  |  |  | 		" XMLHttpRequest - access by new xxx() | 
					
						
							|  |  |  | 		let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML', | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 					\ 'status', 'statusText', 'parseError'] | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open', | 
					
						
							|  |  |  | 					\ 'send', 'setRequestHeader'] | 
					
						
							|  |  |  | 		call map(xmlhmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let xmlhs = xmlhprop + xmlhmeth | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		" XML DOM | 
					
						
							|  |  |  | 		" Attributes - element.attributes[x]. | 
					
						
							|  |  |  | 		let xdomattrprop = ['name', 'specified', 'value'] | 
					
						
							|  |  |  | 		" Element - anyelement. | 
					
						
							|  |  |  | 		let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',  | 
					
						
							|  |  |  | 					\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', | 
					
						
							|  |  |  | 					\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName'] | 
					
						
							| 
									
										
										
										
											2020-08-07 19:54:59 +02:00
										 |  |  | 		let xdomelemmeth = ['appendChild', 'addEventListener', 'cloneNode', | 
					
						
							|  |  |  | 					\ 'dispatchEvent', 'getAttribute', 'getAttributeNode', | 
					
						
							|  |  |  | 					\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', | 
					
						
							|  |  |  | 					\ 'normalize', 'removeAttribute', 'removeAttributeNode', | 
					
						
							|  |  |  | 					\ 'removeChild', 'removeEventListener', 'replaceChild', | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 					\ 'setAttribute', 'setAttributeNode'] | 
					
						
							|  |  |  | 		call map(xdomelemmeth, 'v:val."("') | 
					
						
							|  |  |  | 		let xdomelems = xdomelemprop + xdomelemmeth | 
					
						
							|  |  |  | 		" Node - anynode. | 
					
						
							|  |  |  | 		let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',  | 
					
						
							|  |  |  | 					\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', | 
					
						
							|  |  |  | 					\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling'] | 
					
						
							|  |  |  | 		let xdomnodemeth = ['appendChild', 'cloneNode', | 
					
						
							|  |  |  | 					\ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild'] | 
					
						
							|  |  |  | 		call map(xdomnodemeth, 'v:val."("') | 
					
						
							|  |  |  | 		let xdomnodes = xdomnodeprop + xdomnodemeth | 
					
						
							|  |  |  | 		" NodeList  | 
					
						
							|  |  |  | 		let xdomnliss = ['length', 'item('] | 
					
						
							|  |  |  | 		" Error - parseError. | 
					
						
							|  |  |  | 		let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		" Find object type declaration to reduce number of suggestions. {{{ | 
					
						
							|  |  |  | 		" 1. Get object name | 
					
						
							|  |  |  | 		" 2. Find object declaration line | 
					
						
							|  |  |  | 		" 3. General declaration follows "= new Type" syntax, additional else | 
					
						
							|  |  |  | 		"    for regexp "= /re/" | 
					
						
							|  |  |  | 		" 4. Make correction for Microsoft.XMLHTTP ActiveXObject | 
					
						
							|  |  |  | 		" 5. Repeat for external files | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 		let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		if len(object) > 0 | 
					
						
							|  |  |  | 			let decl_line = search(object.'.\{-}=\s*new\s*', 'bn') | 
					
						
							|  |  |  | 			if decl_line > 0 | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 				let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 				if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != '' | 
					
						
							|  |  |  | 						let object_type = 'XMLHttpRequest' | 
					
						
							|  |  |  | 				endif | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn') | 
					
						
							|  |  |  | 				if decl_line > 0 | 
					
						
							|  |  |  | 					let object_type = 'RegExp' | 
					
						
							|  |  |  | 				endif | 
					
						
							|  |  |  | 			endif | 
					
						
							|  |  |  | 			" We didn't find var declaration in current file but we may have | 
					
						
							|  |  |  | 			" something in external files. | 
					
						
							|  |  |  | 			if decl_line == 0 && exists("b:js_extfiles") | 
					
						
							|  |  |  | 				let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"') | 
					
						
							|  |  |  | 				if len(dext_line) > 0 | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 					let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 					if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != '' | 
					
						
							|  |  |  | 							let object_type = 'XMLHttpRequest' | 
					
						
							|  |  |  | 					endif | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 					let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"') | 
					
						
							|  |  |  | 					if len(dext_line) > 0 | 
					
						
							|  |  |  | 						let object_type = 'RegExp' | 
					
						
							|  |  |  | 					endif | 
					
						
							|  |  |  | 				endif | 
					
						
							|  |  |  | 			endif | 
					
						
							|  |  |  | 		endif | 
					
						
							|  |  |  | 		" }}} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if !exists('object_type') | 
					
						
							|  |  |  | 			let object_type = '' | 
					
						
							|  |  |  | 		endif | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if object_type == 'Date' | 
					
						
							|  |  |  | 			let values = dates | 
					
						
							|  |  |  | 		elseif object_type == 'Image' | 
					
						
							|  |  |  | 			let values = imags | 
					
						
							|  |  |  | 		elseif object_type == 'Array' | 
					
						
							|  |  |  | 			let values = arrays | 
					
						
							|  |  |  | 		elseif object_type == 'Boolean' | 
					
						
							|  |  |  | 			" TODO: a bit more than real boolean | 
					
						
							|  |  |  | 			let values = arrays | 
					
						
							|  |  |  | 		elseif object_type == 'XMLHttpRequest' | 
					
						
							|  |  |  | 			let values = xmlhs | 
					
						
							|  |  |  | 		elseif object_type == 'String' | 
					
						
							|  |  |  | 			let values = stris | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		elseif object_type == 'RegExp' | 
					
						
							|  |  |  | 			let values = reges | 
					
						
							|  |  |  | 		elseif object_type == 'Math' | 
					
						
							|  |  |  | 			let values = maths | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if !exists('values') | 
					
						
							|  |  |  | 		" List of properties | 
					
						
							|  |  |  | 		if shortcontext =~ 'Math\.$' | 
					
						
							|  |  |  | 			let values = maths | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$' | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 			let values = anths | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'area\.$' | 
					
						
							|  |  |  | 			let values = areas | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'base\.$' | 
					
						
							|  |  |  | 			let values = bases | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'body\.$' | 
					
						
							|  |  |  | 			let values = bodys | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'document\.$' | 
					
						
							|  |  |  | 			let values = docus | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$' | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 			let values = forms | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'frameset\.$' | 
					
						
							|  |  |  | 			let values = fsets | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'history\.$' | 
					
						
							|  |  |  | 			let values = hists | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'iframe\.$' | 
					
						
							|  |  |  | 			let values = ifras | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$' | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 			let values = imags | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$' | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 			let values = links | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'location\.$' | 
					
						
							|  |  |  | 			let values = locas | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'meta\.$' | 
					
						
							|  |  |  | 			let values = metas | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'navigator\.$' | 
					
						
							|  |  |  | 			let values = navis | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'object\.$' | 
					
						
							|  |  |  | 			let values = objes | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'screen\.$' | 
					
						
							|  |  |  | 			let values = scres | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'style\.$' | 
					
						
							|  |  |  | 			let values = styls | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'table\.$' | 
					
						
							|  |  |  | 			let values = tabls | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'TableData\.$' | 
					
						
							|  |  |  | 			let values = tdats | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'TableRow\.$' | 
					
						
							|  |  |  | 			let values = trows | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'window\.$' | 
					
						
							|  |  |  | 			let values = winds | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		elseif shortcontext =~ 'parseError\.$' | 
					
						
							|  |  |  | 			let values = xdomerror | 
					
						
							|  |  |  | 		elseif shortcontext =~ 'attributes\[\d\+\]\.$' | 
					
						
							|  |  |  | 			let values = xdomattrprop | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		else | 
					
						
							|  |  |  | 			let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris | 
					
						
							|  |  |  | 			let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 			let values += ifras + imags + links + locas + metas + navis + objes + scres | 
					
						
							|  |  |  | 			let values += tabls + trows + tares + winds | 
					
						
							|  |  |  | 			let values += xdomnodes + xdomnliss + xdomelems | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		endif | 
					
						
							|  |  |  | 		endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for m in values | 
					
						
							|  |  |  | 			if m =~? '^'.a:base | 
					
						
							|  |  |  | 				call add(res, m) | 
					
						
							|  |  |  | 			elseif m =~? a:base | 
					
						
							|  |  |  | 				call add(res2, m) | 
					
						
							|  |  |  | 			endif | 
					
						
							|  |  |  | 		endfor | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		unlet! values | 
					
						
							|  |  |  | 		return res + res2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	endif | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	" }}} | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	" Get variables data. | 
					
						
							|  |  |  | 	let variables = filter(copy(file), 'v:val =~ "var\\s"') | 
					
						
							|  |  |  | 	call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")') | 
					
						
							|  |  |  | 	call map(variables, 'substitute(v:val, ";\\|$", ",", "g")') | 
					
						
							|  |  |  | 	let vars = [] | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	" This loop (and next one) is necessary to get variable names from | 
					
						
							|  |  |  | 	" constructs like: var var1, var2, var3 = "something"; | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 	for i in range(len(variables)) | 
					
						
							|  |  |  | 		let comma_separated = split(variables[i], ',\s*') | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 		call map(comma_separated, 'matchstr(v:val, "\\k\\+")') | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 		let vars += comma_separated | 
					
						
							|  |  |  | 	endfor | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	let variables = sort(vars) | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	unlet! vars | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	" Add "no var" variables. | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 	let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	let u_vars = [] | 
					
						
							|  |  |  | 	for i in range(len(undeclared_variables)) | 
					
						
							|  |  |  | 		let  split_equal = split(undeclared_variables[i], '\s*=') | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 		call map(split_equal, 'matchstr(v:val, "\\k\\+$")') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 		let u_vars += split_equal | 
					
						
							|  |  |  | 	endfor | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	let variables += sort(u_vars) | 
					
						
							|  |  |  | 	unlet! u_vars | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	" Get functions | 
					
						
							|  |  |  | 	let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"') | 
					
						
							|  |  |  | 	let arguments = copy(functions) | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 	call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")') | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 	call map(functions, 'v:val."("') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	let functions = sort(functions) | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 	" Create table to keep arguments for additional 'menu' info | 
					
						
							|  |  |  | 	let b:js_menuinfo = {} | 
					
						
							|  |  |  | 	for i in arguments | 
					
						
							|  |  |  | 		let g:ia = i | 
					
						
							|  |  |  | 		let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))') | 
					
						
							| 
									
										
										
										
											2017-03-05 17:04:09 +01:00
										 |  |  | 		if len(f_elements) >= 3 | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 			let b:js_menuinfo[f_elements[1].'('] = f_elements[2] | 
					
						
							|  |  |  | 		endif | 
					
						
							|  |  |  | 	endfor | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 	" Get functions arguments | 
					
						
							|  |  |  | 	call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")') | 
					
						
							|  |  |  | 	let jargs = join(arguments, ',') | 
					
						
							|  |  |  | 	let jargs = substitute(jargs, '\s', '', 'g') | 
					
						
							|  |  |  | 	let arguments = split(jargs, ',') | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	let arguments = sort(arguments) | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	" Built-in functions | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 	let builtin = ['alert(', 'confirm('] | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	" Top-level HTML DOM objects | 
					
						
							|  |  |  | 	let htmldom = ['document', 'anchor', 'area', 'base', 'body', 'document', 'event', 'form', 'frame', 'frameset', 'history', 'iframe', 'image', 'input', 'link', 'location', 'meta', 'navigator', 'object', 'option', 'screen', 'select', 'table', 'tableData', 'tableHeader', 'tableRow', 'textarea', 'window'] | 
					
						
							|  |  |  | 	call map(htmldom, 'v:val."."') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	" Top-level properties | 
					
						
							|  |  |  | 	let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', | 
					
						
							|  |  |  | 				\ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat', | 
					
						
							|  |  |  | 				\ 'parseInt', 'String', 'undefined', 'escape', 'unescape'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	" Keywords | 
					
						
							|  |  |  | 	let keywords = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String", "XMLHttpRequest", "ActiveXObject", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double ", "else", "enum", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in ", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super ", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	let values = variables + functions + htmldom + arguments + builtin + properties + keywords | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for m in values | 
					
						
							|  |  |  | 		if m =~? '^'.a:base | 
					
						
							|  |  |  | 			call add(res, m) | 
					
						
							|  |  |  | 		elseif m =~? a:base | 
					
						
							|  |  |  | 			call add(res2, m) | 
					
						
							|  |  |  | 		endif | 
					
						
							|  |  |  | 	endfor | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-14 22:29:30 +00:00
										 |  |  | 	let menu = res + res2 | 
					
						
							|  |  |  | 	let final_menu = [] | 
					
						
							|  |  |  | 	for i in range(len(menu)) | 
					
						
							|  |  |  | 		let item = menu[i] | 
					
						
							|  |  |  | 		if item =~ '($' | 
					
						
							|  |  |  | 			let kind = 'f' | 
					
						
							|  |  |  | 			if has_key(b:js_menuinfo, item) | 
					
						
							|  |  |  | 				let m_info = b:js_menuinfo[item] | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				let m_info = '' | 
					
						
							|  |  |  | 			endif | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			let kind = 'v' | 
					
						
							|  |  |  | 			let m_info = '' | 
					
						
							|  |  |  | 		endif | 
					
						
							|  |  |  | 		let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}] | 
					
						
							|  |  |  | 	endfor | 
					
						
							|  |  |  | 	let g:fm = final_menu | 
					
						
							|  |  |  | 	return final_menu | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-02-01 21:56:25 +00:00
										 |  |  | endfunction | 
					
						
							| 
									
										
										
										
											2006-02-08 09:20:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " vim:set foldmethod=marker: |