if exists("g:loaded_syntastic_modemap")
    finish
endif
let g:loaded_syntastic_modemap = 1

let g:SyntasticModeMap = {}

function! g:SyntasticModeMap.Instance()
    if !exists('s:SyntasticModeMapInstance')
        let s:SyntasticModeMapInstance = copy(self)
        call s:SyntasticModeMapInstance._initModeMapFromGlobalOpts()
    endif

    return s:SyntasticModeMapInstance
endfunction

function! g:SyntasticModeMap.allowsAutoChecking(filetype)
    let fts = split(a:filetype, '\.')

    if self.isPassive()
        return self._isOneFiletypeActive(fts)
    else
        return self._noFiletypesArePassive(fts)
    endif
endfunction

function! g:SyntasticModeMap.isPassive()
    return self._mode == "passive"
endfunction

function! g:SyntasticModeMap.toggleMode()
    if self._mode == "active"
        let self._mode = "passive"
    else
        let self._mode = "active"
    endif
endfunction

function! g:SyntasticModeMap.echoMode()
    echo "Syntastic: " . self._mode . " mode enabled"
endfunction

function! g:SyntasticModeMap._initModeMapFromGlobalOpts()
    let self._mode = "active"
    let self._activeFiletypes = []
    let self._passiveFiletypes = []

    if exists("g:syntastic_mode_map")
        let self._mode = get(g:syntastic_mode_map, 'mode', self._mode)
        let self._activeFiletypes = get(g:syntastic_mode_map, 'active_filetypes', self._activeFiletypes)
        let self._passiveFiletypes = get(g:syntastic_mode_map, 'passive_filetypes', self._passiveFiletypes)
    endif
endfunction

function! g:SyntasticModeMap._isOneFiletypeActive(filetypes)
    return !empty(filter(a:filetypes, 'index(self._activeFiletypes, v:val) != -1'))
endfunction

function! g:SyntasticModeMap._noFiletypesArePassive(filetypes)
    return empty(filter(a:filetypes, 'index(self._passiveFiletypes, v:val) != -1'))
endfunction

