/*
Language: ActionScript 3
Author: Yuri Zhloba <yzh44yzh@gmail.com>
*/

hljs.LANGUAGES.actionscript  = {
  defaultMode: {
    lexems: [hljs.UNDERSCORE_IDENT_RE],
    contains: ['class', 'number', 'string', 'comment', 'bindable', 'javadoc'],
    keywords: {
    	'keyword': {'break': 1, 'case': 1, 'continue': 1, 'default': 1, 'do': 1,
			'else': 1, 'for': 1, 'each':1, 'in':1,  'if': 1, 'label': 1, 'return': 1, 'super': 1,
			'switch': 1, 'throw': 1, 'try': 1, 'catch': 1, 'finally': 1, 'while': 1,
			'with': 1, 'dynamic': 1, 'final': 1, 'internal': 1, 'native': 1,
			'override': 1, 'private': 1, 'protected': 1, 'public': 1, 'static': 1,
			'class': 1, 'const': 1, 'extends': 1, 'function': 1, 'get': 1,
			'implements': 1, 'interface': 1, 'namespace': 1, 'package': 1, 'set': 1,
			'var': 1, 'new': 1, 'import': 1, 'include': 1},
		'keyword2': {'false': 1, 'true': 1, 'null': 1, 'this': 1, 'NaN': 1, 'undefined': 1,
		 	'void': 1, 'Boolean': 10, 'Infinity': 1, '-Infinity': 1, 'Array': 1,
			'Boolean': 1, 'decodeURI': 1, 'encodeURI': 1, 'escape': 1, 'int': 1, 'isFinite': 1,
			'isNaN': 1, 'isXMLName': 1, 'Number': 1, 'Object': 1, 'parseFloat': 1, 'parseInt': 1,
			'String': 1, 'trace': 1, 'uint': 1, 'unescape': 1, 'int': 1,
			'getClassByAlias': 1, 'navigateToURL': 1, 'registerClassAlias': 1, 'fscommand': 1,
			'clearInterval': 1, 'clearTimeout': 1, 'describeType': 1, 'getDefinitionByName': 1,
			'getQualifiedClassName': 1, 'getTimer': 1, 'setInterval': 1, 'setTimeout': 1},
    	'fp_classes': { 'Date': 1, 'Error': 1, 'Math': 1, 'Object': 1, 'RegExp': 1, 'Vector': 1,
			'XML': 1, 'XMLList': 1, 'Bitmap': 1, 'BitmapData': 1, 'DisplayObject': 1,
			'DisplayObjectContainer': 1, 'Graphics': 1, 'InteractiveObject': 1, 'Loader': 1,
			'LoaderInfo': 1, 'MovieClip': 1, 'Shape': 1, 'Sprite': 1, 'Stage': 1, 'StageAlign': 1,
			'StageScaleMode': 1, 'AsyncErrorEvent': 1, 'DataEvent': 1, 'ErrorEvent': 1, 'Event': 1,
			'EventDispatcher': 1, 'IOErrorEvent': 1, 'KeyboardEvent': 1, 'MouseEvent': 1,
			'SecurityErrorEvent': 1, 'StatusEvent': 1, 'SyncEvent': 1, 'TimerEvent': 1,
			'ExternalInterface': 1, 'ColorTransform': 1, 'Point': 1, 'Rectangle': 1, 'Camera': 1,
			'Microphone': 1, 'Sound': 1, 'SoundChannel': 1, 'SoundTransform': 1, 'Video': 1,
			'LocalConnection': 1, 'NetConnection': 1, 'NetStream': 1, 'SharedObject': 1, 'Socket': 1,
			'URLLoader': 1, 'URLRequest': 1, 'URLStream': 1, 'XMLSocket': 1, 'ApplicationDomain': 1,
			'LoaderContext': 1, 'Security': 1, 'System': 1},
    	'flex_classes': { 'BindingUtils': 1, 'ChangeWatcher': 1, 'ArrayCollection': 1, 'ListCollectionView': 1,
			'Sort': 1, 'SortField': 1, 'XMLListCollection': 1, 'Accordion': 1, 'Box': 1, 'Canvas': 1,
			'ControlBar': 1, 'DividedBox': 1, 'Form': 1, 'FormItem': 1, 'Grid': 1, 'GridItem': 1,
			'GridRow': 1, 'HBox': 1, 'HDividedBox': 1, 'Panel': 1, 'TabNavigator': 1, 'Tile': 1, 'TitleWindow': 1,
			'VBox': 1, 'VDividedBox': 1, 'ViewStack': 1, 'AdvancedDataGrid': 1, 'Alert': 1, 'Button': 1,
			'ButtonBar': 1, 'CheckBox': 1, 'ColorPicker': 1, 'ComboBox': 1, 'DataGrid': 1, 'DateChooser': 1,
			'DateField': 1, 'HRule': 1, 'HScrollBar': 1, 'HSlider': 1, 'Image': 1, 'Label': 1,
			'LinkBar': 1, 'LinkButton': 1, 'List': 1, 'Menu': 1, 'MenuBar': 1, 'NumericStepper': 1,
			'PopUpButton': 1, 'PopUpManager': 1, 'PopUpMenuButton': 1, 'ProgressBar': 1, 'RadioButton': 1,
			'RadioButtonGroup': 1, 'RichTextEditor': 1, 'Spacer': 1, 'SWFLoader': 1, 'TabBar': 1, 'Text': 1,
			'TextArea': 1, 'TextInput': 1, 'TileList': 1, 'ToggleButtonBar': 1, 'ToolTip': 1, 'Tree': 1,
			'VideoDisplay': 1, 'VRule': 1, 'VScrollBar': 1, 'VSlider': 1, 'ClassFactory': 1, 'Container': 1,
			'Repeater': 1, 'UIComponent': 1, 'Window': 1, 'WindowedApplication': 1}
	}
  },
  modes: [
    {
      className: 'class',
      lexems: [hljs.UNDERSCORE_IDENT_RE],
      begin: '(class |interface )', end: '{',
      illegal: ':',
      keywords: {'class': 1, 'interface': 1},
      contains: ['inheritance', 'title']
    },
    {
      className: 'inheritance',
      begin: '(implements|extends)', end: '^', noMarkup: true,
      lexems: [hljs.IDENT_RE],
      keywords: {'extends': 1, 'implements': 1}
    },
    {
      className: 'title',
      begin: hljs.UNDERSCORE_IDENT_RE, end: '^'
    },
    {
      className: 'params',
      begin: '\\(', end: '\\)',
      contains: ['string', 'annotation']
    },
    {
      className: 'bindable',
      begin: '\\[Bindable\\]', end: '^' /* TODO: metatags like [Bindable] */
    },
    hljs.C_NUMBER_MODE,
    hljs.APOS_STRING_MODE,
    hljs.QUOTE_STRING_MODE,
    hljs.BACKSLASH_ESCAPE,
    hljs.C_LINE_COMMENT_MODE,
    {
      className: 'javadoc',
      begin: '/\\*\\*', end: '\\*/',
      contains: ['javadoctag'],
      relevance: 10
    },
    {
      className: 'javadoctag',
      begin: '@[A-Za-z]+', end: '^'
    },
  ]
};

