home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / autoload / javascriptcomplete.vim < prev    next >
Encoding:
Text File  |  2010-08-15  |  26.4 KB  |  626 lines

  1. " Vim completion script
  2. " Language:    Java Script
  3. " Maintainer:    Mikolaj Machowski ( mikmach AT wp DOT pl )
  4. " Last Change:    2006 Apr 30
  5.  
  6. function! javascriptcomplete#CompleteJS(findstart, base)
  7.   if a:findstart
  8.     " locate the start of the word
  9.     let line = getline('.')
  10.     let start = col('.') - 1
  11.     let curline = line('.')
  12.     let compl_begin = col('.') - 2
  13.     " Bit risky but JS is rather limited language and local chars shouldn't
  14.     " fint way into names
  15.     while start >= 0 && line[start - 1] =~ '\k'
  16.         let start -= 1
  17.     endwhile
  18.     let b:compl_context = getline('.')[0:compl_begin]
  19.     return start
  20.   else
  21.     " Initialize base return lists
  22.     let res = []
  23.     let res2 = []
  24.     " a:base is very short - we need context
  25.     " Shortcontext is context without a:base, useful for checking if we are
  26.     " looking for objects and for what objects we are looking for
  27.     let context = b:compl_context
  28.     let shortcontext = substitute(context, a:base.'$', '', '')
  29.     unlet! b:compl_context
  30.  
  31.     if exists("b:jsrange")
  32.         let file = getline(b:jsrange[0],b:jsrange[1])
  33.         unlet! b:jsrange
  34.  
  35.         if len(b:js_extfiles) > 0
  36.             let file = b:js_extfiles + file
  37.         endif
  38.  
  39.     else
  40.         let file = getline(1, '$')
  41.     endif
  42.  
  43.  
  44.     " Completion of properties, methods, etc. {{{
  45.     if shortcontext =~ '\.$'
  46.         " Complete methods and properties for objects
  47.         " DOM separate
  48.         let doms = ['style.']
  49.         " Arrays
  50.         let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype']
  51.         let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift',
  52.                     \ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf',
  53.                     \ 'watch', 'unwatch']
  54.         call map(arraymeth, 'v:val."("')
  55.         let arrays = arrayprop + arraymeth
  56.  
  57.         " Boolean - complete subset of array values
  58.         " properties - constructor, prototype
  59.         " methods    - toSource, toString, valueOf
  60.  
  61.         " Date
  62.         " properties - constructor, prototype
  63.         let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds',
  64.                     \ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset',
  65.                     \ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds',
  66.                     \ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
  67.                     \ 'getYear', 'parse', 'parse',
  68.                     \ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds',
  69.                     \ 'setMinutes', 'setMonth', 'setSeconds',
  70.                     \ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds',
  71.                     \ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime',
  72.                     \ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString',
  73.                     \ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch']
  74.         call map(datemeth, 'v:val."("')
  75.         let dates = datemeth
  76.  
  77.         " Function
  78.         let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length',
  79.                     \ 'arity', 'constructor', 'length', 'prototype']
  80.         let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf']
  81.         call map(funcmeth, 'v:val."("')
  82.         let funcs = funcprop + funcmeth
  83.  
  84.         " Math
  85.         let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT']
  86.         let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor',
  87.                     \ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan',
  88.                     \ 'watch', 'unwatch']
  89.         call map(mathmeth, 'v:val."("')
  90.         let maths = mathprop + mathmeth
  91.  
  92.         " Number
  93.         let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY', 
  94.                     \ 'constructor', 'prototype']
  95.         let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf',
  96.                     \ 'watch', 'unwatch']
  97.         call map(numbmeth, 'v:val."("')
  98.         let numbs = numbprop + numbmeth
  99.  
  100.         " Object
  101.         let objeprop = ['constructor', 'prototype']
  102.         let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf']
  103.         call map(objemeth, 'v:val."("')
  104.         let objes = objeprop + objemeth
  105.  
  106.         " RegExp
  107.         let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
  108.         let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch']
  109.         call map(regemeth, 'v:val."("')
  110.         let reges = regeprop + regemeth
  111.  
  112.         " String
  113.         let striprop = ['constructor', 'length', 'prototype']
  114.         let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat',
  115.                     \ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics',
  116.                     \ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small',
  117.                     \ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase',
  118.                     \ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch']
  119.         call map(strimeth, 'v:val."("')
  120.         let stris = striprop + strimeth
  121.  
  122.         " User created properties
  123.         let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"')
  124.         let juser_props1 = join(user_props1, ' ')
  125.         let user_props1 = split(juser_props1, '\zethis\.')
  126.         unlet! juser_props1
  127.         call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")')
  128.  
  129.         let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"')
  130.         let juser_props2 = join(user_props2, ' ')
  131.         let user_props2 = split(juser_props2, '\zeprototype\.')
  132.         unlet! juser_props2
  133.         call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\ze")')
  134.         let user_props = user_props1 + user_props2
  135.  
  136.         " HTML DOM properties
  137.         " Anchors - anchor.
  138.         let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML',
  139.                     \ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus']
  140.         let anchmeth = ['blur', 'focus']
  141.         call map(anchmeth, 'v:val."("')
  142.         let anths = anchprop + anchmeth
  143.         " Area - area.
  144.         let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id',
  145.                     \ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target']
  146.         let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver']
  147.         call map(areameth, 'v:val."("')
  148.         let areas = areaprop + areameth
  149.         " Base - base.
  150.         let baseprop = ['href', 'id', 'target']
  151.         let bases = baseprop
  152.         " Body - body.
  153.         let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop',
  154.                     \ 'text', 'vLink']
  155.         let bodys = bodyprop
  156.         " Document - document.
  157.         let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
  158.                     \ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
  159.         let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
  160.                     \ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
  161.                     \ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
  162.                     \ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
  163.         call map(documeth, 'v:val."("')
  164.         let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
  165.                     \ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
  166.                     \ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling']
  167.         let docuxmeth = ['createAttribute', 'createCDATASection',
  168.                     \ 'createComment', 'createDocument', 'createDocumentFragment',
  169.                     \ 'createElement', 'createEntityReference', 'createProcessingInstruction',
  170.                     \ 'createTextNode']
  171.         call map(docuxmeth, 'v:val."("')
  172.         let docus = docuprop + docuxprop + documeth + docuxmeth
  173.         " Form - form.
  174.         let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
  175.                     \ 'method', 'name', 'tabIndex', 'target']
  176.         let formmeth = ['reset', 'submit', 'onReset', 'onSubmit']
  177.         call map(formmeth, 'v:val."("')
  178.         let forms = formprop + formmeth
  179.         " Frame - frame.
  180.         let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth',
  181.                     \ 'name', 'noResize', 'scrolling', 'src']
  182.         let frammeth = ['blur', 'focus']
  183.         call map(frammeth, 'v:val."("')
  184.         let frams = framprop + frammeth
  185.         " Frameset - frameset.
  186.         let fsetprop = ['cols', 'id', 'rows']
  187.         let fsetmeth = ['blur', 'focus']
  188.         call map(fsetmeth, 'v:val."("')
  189.         let fsets = fsetprop + fsetmeth
  190.         " History - history.
  191.         let histprop = ['length']
  192.         let histmeth = ['back', 'forward', 'go']
  193.         call map(histmeth, 'v:val."("')
  194.         let hists = histprop + histmeth
  195.         " Iframe - iframe.
  196.         let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth',
  197.                     \ 'name', 'scrolling', 'src', 'width']
  198.         let ifras = ifraprop
  199.         " Image - image.
  200.         let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
  201.                     \ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width']
  202.         let imagmeth = ['onAbort', 'onError', 'onLoad']
  203.         call map(imagmeth, 'v:val."("')
  204.         let imags = histprop + imagmeth
  205.         " Button - accessible only by other properties
  206.         let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
  207.         let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
  208.         call map(buttmeth, 'v:val."("')
  209.         let butts = buttprop + buttmeth
  210.         " Checkbox - accessible only by other properties
  211.         let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 
  212.                     \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
  213.         let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
  214.         call map(checmeth, 'v:val."("')
  215.         let checs = checprop + checmeth
  216.         " File upload - accessible only by other properties
  217.         let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
  218.                     \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
  219.         let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
  220.         call map(filemeth, 'v:val."("')
  221.         let files = fileprop + filemeth
  222.         " Hidden - accessible only by other properties
  223.         let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value'] 
  224.         let hidds = hiddprop
  225.         " Password - accessible only by other properties
  226.         let passprop = ['accept', 'accessKey', 'defaultValue', 
  227.                     \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex', 
  228.                     \ 'type', 'value'] 
  229.         let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown', 
  230.                     \ 'onKeyPress', 'onKeyUp']
  231.         call map(passmeth, 'v:val."("')
  232.         let passs = passprop + passmeth
  233.         " Radio - accessible only by other properties
  234.         let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked', 
  235.                     \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value'] 
  236.         let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
  237.         call map(radimeth, 'v:val."("')
  238.         let radis = radiprop + radimeth
  239.         " Reset - accessible only by other properties
  240.         let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
  241.                     \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 
  242.         let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
  243.         call map(resemeth, 'v:val."("')
  244.         let reses = reseprop + resemeth
  245.         " Submit - accessible only by other properties
  246.         let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
  247.                     \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value'] 
  248.         let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart']
  249.         call map(submmeth, 'v:val."("')
  250.         let subms = submprop + submmeth
  251.         " Text - accessible only by other properties
  252.         let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue', 
  253.                     \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 
  254.                     \ 'size', 'tabIndex', 'type', 'value'] 
  255.         let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown',
  256.                     \ 'onKeyPress', 'onKeyUp', 'onSelect']
  257.         call map(textmeth, 'v:val."("')
  258.         let texts = textprop + textmeth
  259.         " Link - link.
  260.         let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media',
  261.                     \ 'rel', 'rev', 'target', 'type']
  262.         let linkmeth = ['onLoad']
  263.         call map(linkmeth, 'v:val."("')
  264.         let links = linkprop + linkmeth
  265.         " Location - location.
  266.         let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol',
  267.                     \ 'search']
  268.         let locameth = ['assign', 'reload', 'replace']
  269.         call map(locameth, 'v:val."("')
  270.         let locas = locaprop + locameth
  271.         " Meta - meta.
  272.         let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme']
  273.         let metas = metaprop
  274.         " Navigator - navigator.
  275.         let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled',
  276.                     \ 'platform', 'userAgent']
  277.         let navimeth = ['javaEnabled', 'taintEnabled']
  278.         call map(navimeth, 'v:val."("')
  279.         let navis = naviprop + navimeth
  280.         " Object - object.
  281.         let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data',
  282.                     \ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex',
  283.                     \ 'type', 'useMap', 'vspace', 'width']
  284.         let objes = objeprop
  285.         " Option - accessible only by other properties
  286.         let optiprop = ['defaultSelected', 
  287.                     \ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value']
  288.         let optis = optiprop
  289.         " Screen - screen.
  290.         let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width']
  291.         let scres = screprop
  292.         " Select - accessible only by other properties
  293.         let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name', 
  294.                     \ 'selectedIndex', 'size', 'tabIndex', 'type', 'value'] 
  295.         let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus']
  296.         call map(selemeth, 'v:val."("')
  297.         let seles = seleprop + selemeth
  298.         " Style - style.
  299.         let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage',
  300.                     \ 'backgroundPosition', 'backgroundRepeat',
  301.                     \ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop',
  302.                     \ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor',
  303.                     \ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle',
  304.                     \ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth',
  305.                     \ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom',
  306.                     \ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth',
  307.                     \ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom',
  308.                     \ 'paddingLeft', 'paddingRight', 'paddingTop',
  309.                     \ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content',
  310.                     \ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction',
  311.                     \ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight',
  312.                     \ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility',
  313.                     \ 'width',
  314.                     \ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType',
  315.                     \ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex',
  316.                     \ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside',
  317.                     \ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout',
  318.                     \ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
  319.                     \ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes',
  320.                     \ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition',
  321.                     \ 'unicodeBidi', 'whiteSpace', 'wordSpacing']
  322.         let styls = stylprop
  323.         " Table - table.
  324.         let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding',
  325.                     \ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width']
  326.         let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow',
  327.                     \ 'deleteTFoot', 'deleteTHead', 'insertRow']
  328.         call map(tablmeth, 'v:val."("')
  329.         let tabls = tablprop + tablmeth
  330.         " Table data - TableData.
  331.         let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff',
  332.                     \ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width']
  333.         let tdats = tdatprop
  334.         " Table row - TableRow.
  335.         let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex',
  336.                     \ 'vAlign']
  337.         let trowmeth = ['deleteCell', 'insertCell']
  338.         call map(trowmeth, 'v:val."("')
  339.         let trows = trowprop + trowmeth
  340.         " Textarea - accessible only by other properties
  341.         let tareprop = ['accessKey', 'cols', 'defaultValue', 
  342.                     \ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows', 
  343.                     \ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd'] 
  344.         let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus']
  345.         call map(taremeth, 'v:val."("')
  346.         let tares = tareprop + taremeth
  347.         " Window - window.
  348.         let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history',
  349.                     \ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self',
  350.                     \ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject']
  351.         let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
  352.                     \ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
  353.                     \ 'setTimeout']
  354.         call map(windmeth, 'v:val."("')
  355.         let winds = windprop + windmeth
  356.         " XMLHttpRequest - access by new xxx()
  357.         let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
  358.                     \ 'status', 'statusText', 'parseError']
  359.         let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
  360.                     \ 'send', 'setRequestHeader']
  361.         call map(xmlhmeth, 'v:val."("')
  362.         let xmlhs = xmlhprop + xmlhmeth
  363.  
  364.         " XML DOM
  365.         " Attributes - element.attributes[x].
  366.         let xdomattrprop = ['name', 'specified', 'value']
  367.         " Element - anyelement.
  368.         let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', 
  369.                     \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
  370.                     \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
  371.         let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode',
  372.                     \ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize',
  373.                     \ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild',
  374.                     \ 'setAttribute', 'setAttributeNode']
  375.         call map(xdomelemmeth, 'v:val."("')
  376.         let xdomelems = xdomelemprop + xdomelemmeth
  377.         " Node - anynode.
  378.         let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', 
  379.                     \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
  380.                     \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling']
  381.         let xdomnodemeth = ['appendChild', 'cloneNode',
  382.                     \ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild']
  383.         call map(xdomnodemeth, 'v:val."("')
  384.         let xdomnodes = xdomnodeprop + xdomnodemeth
  385.         " NodeList 
  386.         let xdomnliss = ['length', 'item(']
  387.         " Error - parseError.
  388.         let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos']
  389.  
  390.         " Find object type declaration to reduce number of suggestions. {{{
  391.         " 1. Get object name
  392.         " 2. Find object declaration line
  393.         " 3. General declaration follows "= new Type" syntax, additional else
  394.         "    for regexp "= /re/"
  395.         " 4. Make correction for Microsoft.XMLHTTP ActiveXObject
  396.         " 5. Repeat for external files
  397.         let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$')
  398.         if len(object) > 0
  399.             let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
  400.             if decl_line > 0
  401.                 let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze')
  402.                 if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
  403.                         let object_type = 'XMLHttpRequest'
  404.                 endif
  405.             else
  406.                 let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn')
  407.                 if decl_line > 0
  408.                     let object_type = 'RegExp'
  409.                 endif
  410.             endif
  411.             " We didn't find var declaration in current file but we may have
  412.             " something in external files.
  413.             if decl_line == 0 && exists("b:js_extfiles")
  414.                 let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
  415.                 if len(dext_line) > 0
  416.                     let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze')
  417.                     if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
  418.                             let object_type = 'XMLHttpRequest'
  419.                     endif
  420.                 else
  421.                     let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"')
  422.                     if len(dext_line) > 0
  423.                         let object_type = 'RegExp'
  424.                     endif
  425.                 endif
  426.             endif
  427.         endif
  428.         " }}}
  429.  
  430.         if !exists('object_type')
  431.             let object_type = ''
  432.         endif
  433.  
  434.         if object_type == 'Date'
  435.             let values = dates
  436.         elseif object_type == 'Image'
  437.             let values = imags
  438.         elseif object_type == 'Array'
  439.             let values = arrays
  440.         elseif object_type == 'Boolean'
  441.             " TODO: a bit more than real boolean
  442.             let values = arrays
  443.         elseif object_type == 'XMLHttpRequest'
  444.             let values = xmlhs
  445.         elseif object_type == 'String'
  446.             let values = stris
  447.         elseif object_type == 'RegExp'
  448.             let values = reges
  449.         elseif object_type == 'Math'
  450.             let values = maths
  451.         endif
  452.  
  453.         if !exists('values')
  454.         " List of properties
  455.         if shortcontext =~ 'Math\.$'
  456.             let values = maths
  457.         elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$'
  458.             let values = anths
  459.         elseif shortcontext =~ 'area\.$'
  460.             let values = areas
  461.         elseif shortcontext =~ 'base\.$'
  462.             let values = bases
  463.         elseif shortcontext =~ 'body\.$'
  464.             let values = bodys
  465.         elseif shortcontext =~ 'document\.$'
  466.             let values = docus
  467.         elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$'
  468.             let values = forms
  469.         elseif shortcontext =~ 'frameset\.$'
  470.             let values = fsets
  471.         elseif shortcontext =~ 'history\.$'
  472.             let values = hists
  473.         elseif shortcontext =~ 'iframe\.$'
  474.             let values = ifras
  475.         elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$'
  476.             let values = imags
  477.         elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$'
  478.             let values = links
  479.         elseif shortcontext =~ 'location\.$'
  480.             let values = locas
  481.         elseif shortcontext =~ 'meta\.$'
  482.             let values = metas
  483.         elseif shortcontext =~ 'navigator\.$'
  484.             let values = navis
  485.         elseif shortcontext =~ 'object\.$'
  486.             let values = objes
  487.         elseif shortcontext =~ 'screen\.$'
  488.             let values = scres
  489.         elseif shortcontext =~ 'style\.$'
  490.             let values = styls
  491.         elseif shortcontext =~ 'table\.$'
  492.             let values = tabls
  493.         elseif shortcontext =~ 'TableData\.$'
  494.             let values = tdats
  495.         elseif shortcontext =~ 'TableRow\.$'
  496.             let values = trows
  497.         elseif shortcontext =~ 'window\.$'
  498.             let values = winds
  499.         elseif shortcontext =~ 'parseError\.$'
  500.             let values = xdomerror
  501.         elseif shortcontext =~ 'attributes\[\d\+\]\.$'
  502.             let values = xdomattrprop
  503.         else
  504.             let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris
  505.             let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists
  506.             let values += ifras + imags + links + locas + metas + navis + objes + scres
  507.             let values += tabls + trows + tares + winds
  508.             let values += xdomnodes + xdomnliss + xdomelems
  509.         endif
  510.         endif
  511.  
  512.         for m in values
  513.             if m =~? '^'.a:base
  514.                 call add(res, m)
  515.             elseif m =~? a:base
  516.                 call add(res2, m)
  517.             endif
  518.         endfor
  519.  
  520.         unlet! values
  521.         return res + res2
  522.  
  523.     endif
  524.     " }}}
  525.  
  526.     " Get variables data.
  527.     let variables = filter(copy(file), 'v:val =~ "var\\s"')
  528.     call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")')
  529.     call map(variables, 'substitute(v:val, ";\\|$", ",", "g")')
  530.     let vars = []
  531.     " This loop (and next one) is necessary to get variable names from
  532.     " constructs like: var var1, var2, var3 = "something";
  533.     for i in range(len(variables))
  534.         let comma_separated = split(variables[i], ',\s*')
  535.         call map(comma_separated, 'matchstr(v:val, "\\k\\+")')
  536.         let vars += comma_separated
  537.     endfor
  538.  
  539.     let variables = sort(vars)
  540.     unlet! vars
  541.  
  542.     " Add "no var" variables.
  543.     let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="')
  544.     let u_vars = []
  545.     for i in range(len(undeclared_variables))
  546.         let  split_equal = split(undeclared_variables[i], '\s*=')
  547.         call map(split_equal, 'matchstr(v:val, "\\k\\+$")')
  548.         let u_vars += split_equal
  549.     endfor
  550.  
  551.     let variables += sort(u_vars)
  552.     unlet! u_vars
  553.  
  554.     " Get functions
  555.     let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
  556.     let arguments = copy(functions)
  557.     call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")')
  558.     call map(functions, 'v:val."("')
  559.     let functions = sort(functions)
  560.  
  561.     " Create table to keep arguments for additional 'menu' info
  562.     let b:js_menuinfo = {}
  563.     for i in arguments
  564.         let g:ia = i
  565.         let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))')
  566.         if len(f_elements) == 3
  567.             let b:js_menuinfo[f_elements[1].'('] = f_elements[2]
  568.         endif
  569.     endfor
  570.  
  571.     " Get functions arguments
  572.     call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
  573.     let jargs = join(arguments, ',')
  574.     let jargs = substitute(jargs, '\s', '', 'g')
  575.     let arguments = split(jargs, ',')
  576.     let arguments = sort(arguments)
  577.  
  578.     " Built-in functions
  579.     let builtin = ['alert(', 'confirm(']
  580.  
  581.     " Top-level HTML DOM objects
  582.     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']
  583.     call map(htmldom, 'v:val."."')
  584.  
  585.     " Top-level properties
  586.     let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
  587.                 \ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
  588.                 \ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
  589.  
  590.     " Keywords
  591.     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"]
  592.  
  593.     let values = variables + functions + htmldom + arguments + builtin + properties + keywords
  594.  
  595.     for m in values
  596.         if m =~? '^'.a:base
  597.             call add(res, m)
  598.         elseif m =~? a:base
  599.             call add(res2, m)
  600.         endif
  601.     endfor
  602.  
  603.     let menu = res + res2
  604.     let final_menu = []
  605.     for i in range(len(menu))
  606.         let item = menu[i]
  607.         if item =~ '($'
  608.             let kind = 'f'
  609.             if has_key(b:js_menuinfo, item)
  610.                 let m_info = b:js_menuinfo[item]
  611.             else
  612.                 let m_info = ''
  613.             endif
  614.         else
  615.             let kind = 'v'
  616.             let m_info = ''
  617.         endif
  618.         let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}]
  619.     endfor
  620.     let g:fm = final_menu
  621.     return final_menu
  622.  
  623. endfunction
  624.  
  625. " vim:set foldmethod=marker:
  626.