define(function(require,exports,module){var CodeMirror=require("thirdparty/CodeMirror/lib/codemirror"),EventDispatcher=require("utils/EventDispatcher"),Async=require("utils/Async"),FileUtils=require("file/FileUtils"),Strings=require("strings"),_defaultLanguagesJSON=require("text!language/languages.json"),_=require("thirdparty/lodash"),PreferencesManager,_fallbackLanguage=null,_pendingLanguages={},_languages={},_baseFileExtensionToLanguageMap={},_fileExtensionToLanguageMap=Object.create(_baseFileExtensionToLanguageMap),_fileNameToLanguageMap={},_filePathToLanguageMap={},_modeToLanguageMap={},_ready,_EXTENSION_MAP_PREF="language.fileExtensions",_NAME_MAP_PREF="language.fileNames",_prefState={};function _validateNonEmptyString(value,description,deferred){var reportError=deferred?deferred.reject:console.error;return"[object String]"!==Object.prototype.toString.call(value)?(reportError(description+" must be a string"),!1):""!==value||(reportError(description+" must not be empty"),!1)}function _patchCodeMirror(){var _original_CodeMirror_defineMode=CodeMirror.defineMode;function _wrapped_CodeMirror_defineMode(name){CodeMirror.modes[name]?console.error('There already is a CodeMirror mode with the name "'+name+'"'):_original_CodeMirror_defineMode.apply(CodeMirror,arguments)}CodeMirror.defineMode=_wrapped_CodeMirror_defineMode}function _setLanguageForMode(mode,language){_modeToLanguageMap[mode]?console.warn('CodeMirror mode "'+mode+'" is already used by language '+_modeToLanguageMap[mode]._name+" - cannot fully register language "+language._name+" using the same mode. Some features will treat all content with this mode as language "+_modeToLanguageMap[mode]._name):_modeToLanguageMap[mode]=language}function getLanguage(id){return _languages[id]}function getLanguageForExtension(extension){return _fileExtensionToLanguageMap[extension.toLowerCase()]}function getLanguageForPath(path,ignoreOverride){var fileName,language=_filePathToLanguageMap[path],extension,parts;if(!ignoreOverride&&language)return language;if(fileName=FileUtils.getBaseName(path).toLowerCase(),!(language=_fileNameToLanguageMap[fileName]))for(""===(parts=fileName.split("."))[0]&&parts.shift(),parts.shift();!language&&parts.length;)extension=parts.join("."),language=_fileExtensionToLanguageMap[extension],parts.shift();return language||_fallbackLanguage}function getLanguages(){return $.extend({},_languages)}function _getLanguageForMode(mode){var language=_modeToLanguageMap[mode];return language||(console.log("Called LanguageManager._getLanguageForMode with a mode for which no language has been registered:",mode),_fallbackLanguage)}function _triggerLanguageAdded(language){_languages[language.getId()]=language,exports.trigger("languageAdded",language)}function _triggerLanguageModified(language){exports.trigger("languageModified",language)}function setLanguageOverrideForPath(fullPath,language){var oldLang=getLanguageForPath(fullPath);language?_filePathToLanguageMap[fullPath]=language:delete _filePathToLanguageMap[fullPath];var newLang=getLanguageForPath(fullPath);_triggerLanguageModified(oldLang),_triggerLanguageModified(newLang)}function _resetPathLanguageOverrides(){_filePathToLanguageMap={}}function getCompoundFileExtension(fullPath){var baseName=FileUtils.getBaseName(fullPath),parts=baseName.split(".");parts.shift(),"."===baseName[0]&&parts.shift();for(var extension=[parts.pop()],i=parts.length;i--&&getLanguageForExtension(parts[i]);)extension.unshift(parts[i]);return extension.join(".")}function Language(){this._fileExtensions=[],this._fileNames=[],this._modeToLanguageMap={},this._lineCommentSyntax=[]}function defineLanguage(id,definition){var result=new $.Deferred;if(_pendingLanguages[id])return result.reject('Language "'+id+'" is waiting to be resolved.'),result.promise();if(_languages[id])return result.reject('Language "'+id+'" is already defined'),result.promise();var language=new Language,name=definition.name,fileExtensions=definition.fileExtensions,fileNames=definition.fileNames,blockComment=definition.blockComment,lineComment=definition.lineComment,i,l;function _finishRegisteringLanguage(){if(fileExtensions)for(i=0,l=fileExtensions.length;i0},Language.prototype.getLineCommentPrefixes=function(){return this._lineCommentSyntax},Language.prototype.setLineCommentSyntax=function(prefix){var prefixes=Array.isArray(prefix)?prefix:[prefix],i;if(prefixes.length){for(this._lineCommentSyntax=[],i=0;i