(function() {
var attachedPrefix, charCodeUnderscore, colors, profileColorPalette, profileColors;
angular.module('omega').constant('builtinProfiles', OmegaPac.Profiles.builtinProfiles);
profileColors = ['#9ce', '#9d9', '#fa8', '#fe9', '#d497ee', '#47b', '#5b5', '#d63', '#ca0'];
colors = [].concat(profileColors);
profileColorPalette = ((function() {
var _results;
_results = [];
while (colors.length) {
_results.push(colors.splice(0, 3));
}
return _results;
})());
angular.module('omega').constant('profileColors', profileColors);
angular.module('omega').constant('profileColorPalette', profileColorPalette);
attachedPrefix = '__ruleListOf_';
angular.module('omega').constant('getAttachedName', function(name) {
return attachedPrefix + name;
});
angular.module('omega').constant('getParentName', function(name) {
if (name.indexOf(attachedPrefix) === 0) {
return name.substr(attachedPrefix.length);
} else {
return void 0;
}
});
charCodeUnderscore = '_'.charCodeAt(0);
angular.module('omega').constant('charCodeUnderscore', charCodeUnderscore);
angular.module('omega').constant('isProfileNameHidden', function(name) {
return name.charCodeAt(0) === charCodeUnderscore;
});
angular.module('omega').constant('isProfileNameReserved', function(name) {
return name.charCodeAt(0) === charCodeUnderscore && name.charCodeAt(1) === charCodeUnderscore;
});
angular.module('omega').config(function($stateProvider, $urlRouterProvider, $httpProvider, $animateProvider, $compileProvider) {
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension|moz-extension):/);
$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension|moz-extension):/);
$animateProvider.classNameFilter(/angular-animate/);
$urlRouterProvider.otherwise('/about');
$urlRouterProvider.otherwise(function($injector, $location) {
if ($location.path() === '') {
return $injector.get('omegaTarget').lastUrl() || '/about';
} else {
return '/about';
}
});
return $stateProvider.state('ui', {
url: '/ui',
templateUrl: 'partials/ui.html'
}).state('general', {
url: '/general',
templateUrl: 'partials/general.html'
}).state('io', {
url: '/io',
templateUrl: 'partials/io.html',
controller: 'IoCtrl'
}).state('profile', {
url: '/profile/*name',
templateUrl: 'partials/profile.html',
controller: 'ProfileCtrl'
}).state('about', {
url: '/about',
templateUrl: 'partials/about.html',
controller: 'AboutCtrl'
});
});
angular.module('omega').factory('$exceptionHandler', function($log) {
return function(exception, cause) {
if (exception.message === 'transition aborted') {
return;
}
if (exception.message === 'transition superseded') {
return;
}
if (exception.message === 'transition prevented') {
return;
}
if (exception.message === 'transition failed') {
return;
}
return $log.error(exception, cause);
};
});
angular.module('omega').factory('omegaDebug', function($window, $rootScope, $injector) {
var omegaDebug, _ref;
omegaDebug = (_ref = $window.OmegaDebug) != null ? _ref : {};
if (omegaDebug.downloadLog == null) {
omegaDebug.downloadLog = function() {
var blob, downloadFile, _ref1;
downloadFile = (_ref1 = $injector.get('downloadFile')) != null ? _ref1 : saveAs;
blob = new Blob([localStorage['log']], {
type: "text/plain;charset=utf-8"
});
return downloadFile(blob, "OmegaLog_" + (Date.now()) + ".txt");
};
}
if (omegaDebug.reportIssue == null) {
omegaDebug.reportIssue = function() {
$window.open('https://github.com/FelisCatus/SwitchyOmega/issues/new?title=&body=');
};
}
if (omegaDebug.resetOptions == null) {
omegaDebug.resetOptions = function() {
return $rootScope.resetOptions();
};
}
return omegaDebug;
});
angular.module('omega').factory('downloadFile', function() {
var _ref;
if ((typeof browser !== "undefined" && browser !== null ? (_ref = browser.downloads) != null ? _ref.download : void 0 : void 0) != null) {
return function(blob, filename) {
var url;
url = URL.createObjectURL(blob);
if (filename) {
return browser.downloads.download({
url: url,
filename: filename
});
} else {
return browser.downloads.download({
url: url
});
}
};
} else {
return function(blob, filename) {
var noAutoBom;
noAutoBom = true;
return saveAs(blob, filename, noAutoBom);
};
}
});
}).call(this);
(function() {
angular.module('omega').controller('AboutCtrl', function($scope, $rootScope, $modal, omegaDebug) {
var _;
$scope.downloadLog = omegaDebug.downloadLog;
$scope.reportIssue = omegaDebug.reportIssue;
$scope.showResetOptionsModal = function() {
return $modal.open({
templateUrl: 'partials/reset_options_confirm.html'
}).result.then(function() {
return omegaDebug.resetOptions();
});
};
try {
return $scope.version = omegaDebug.getProjectVersion();
} catch (_error) {
_ = _error;
return $scope.version = '?.?.?';
}
});
}).call(this);
(function() {
angular.module('omega').controller('FixedProfileCtrl', function($scope, $modal, trFilter) {
var defaultLabel, defaultPort, onBypassListChange, onProxyChange, proxyProperties, scheme, socks5AuthSupported, _fn, _i, _j, _len, _len1, _ref, _ref1, _ref2;
$scope.urlSchemes = ['', 'http', 'https', 'ftp'];
$scope.urlSchemeDefault = 'fallbackProxy';
proxyProperties = {
'': 'fallbackProxy',
'http': 'proxyForHttp',
'https': 'proxyForHttps',
'ftp': 'proxyForFtp'
};
$scope.schemeDisp = {
'': null,
'http': 'http://',
'https': 'https://',
'ftp': 'ftp://'
};
defaultPort = {
'http': 80,
'https': 443,
'socks4': 1080,
'socks5': 1080
};
$scope.showAdvanced = false;
$scope.optionsForScheme = {};
_ref = $scope.urlSchemes;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
scheme = _ref[_i];
defaultLabel = scheme ? trFilter('options_protocol_useDefault') : trFilter('options_protocol_direct');
$scope.optionsForScheme[scheme] = [
{
label: defaultLabel,
value: void 0
}, {
label: 'HTTP',
value: 'http'
}, {
label: 'HTTPS',
value: 'https'
}, {
label: 'SOCKS4',
value: 'socks4'
}, {
label: 'SOCKS5',
value: 'socks5'
}
];
}
$scope.proxyEditors = {};
socks5AuthSupported = ((typeof browser !== "undefined" && browser !== null ? (_ref1 = browser.proxy) != null ? _ref1.register : void 0 : void 0) != null);
$scope.authSupported = {
"http": true,
"https": true,
"socks5": socks5AuthSupported
};
$scope.isProxyAuthActive = function(scheme) {
var _ref2;
return ((_ref2 = $scope.profile.auth) != null ? _ref2[proxyProperties[scheme]] : void 0) != null;
};
$scope.editProxyAuth = function(scheme) {
var auth, prop, proxy, scope, _ref2;
prop = proxyProperties[scheme];
proxy = $scope.profile[prop];
scope = $scope.$new('isolate');
scope.proxy = proxy;
auth = (_ref2 = $scope.profile.auth) != null ? _ref2[prop] : void 0;
scope.auth = auth && angular.copy(auth);
scope.authSupported = $scope.authSupported[proxy.scheme];
scope.protocolDisp = proxy.scheme;
return $modal.open({
templateUrl: 'partials/fixed_auth_edit.html',
scope: scope,
size: scope.authSupported ? 'sm' : 'lg'
}).result.then(function(auth) {
var _base;
if (!(auth != null ? auth.username : void 0)) {
if ($scope.profile.auth) {
return $scope.profile.auth[prop] = void 0;
}
} else {
if ((_base = $scope.profile).auth == null) {
_base.auth = {};
}
return $scope.profile.auth[prop] = auth;
}
});
};
onProxyChange = function(proxyEditors, oldProxyEditors) {
var proxy, _base, _j, _len1, _name, _ref2, _ref3, _results;
if (!proxyEditors) {
return;
}
_ref2 = $scope.urlSchemes;
_results = [];
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
scheme = _ref2[_j];
proxy = proxyEditors[scheme];
if ($scope.profile.auth && !$scope.authSupported[proxy.scheme]) {
delete $scope.profile.auth[proxyProperties[scheme]];
}
if (!proxy.scheme) {
if (!scheme) {
proxyEditors[scheme] = {};
}
delete $scope.profile[proxyProperties[scheme]];
continue;
} else if (!oldProxyEditors[scheme].scheme) {
if (proxy.scheme === proxyEditors[''].scheme) {
if (proxy.port == null) {
proxy.port = proxyEditors[''].port;
}
}
if (proxy.port == null) {
proxy.port = defaultPort[proxy.scheme];
}
if (proxy.host == null) {
proxy.host = (_ref3 = proxyEditors[''].host) != null ? _ref3 : 'example.com';
}
}
_results.push((_base = $scope.profile)[_name = proxyProperties[scheme]] != null ? _base[_name] : _base[_name] = proxy);
}
return _results;
};
_ref2 = $scope.urlSchemes;
_fn = function(scheme) {
return $scope.$watch((function() {
return $scope.profile[proxyProperties[scheme]];
}), function(proxy) {
if (scheme && proxy) {
$scope.showAdvanced = true;
}
return $scope.proxyEditors[scheme] = proxy != null ? proxy : {};
});
};
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
scheme = _ref2[_j];
_fn(scheme);
}
$scope.$watch('proxyEditors', onProxyChange, true);
onBypassListChange = function(list) {
var item;
return $scope.bypassList = ((function() {
var _k, _len2, _results;
_results = [];
for (_k = 0, _len2 = list.length; _k < _len2; _k++) {
item = list[_k];
_results.push(item.pattern);
}
return _results;
})()).join('\n');
};
$scope.$watch('profile.bypassList', onBypassListChange, true);
return $scope.$watch('bypassList', function(bypassList, oldList) {
var entry;
if ((bypassList == null) || bypassList === oldList) {
return;
}
return $scope.profile.bypassList = (function() {
var _k, _len2, _ref3, _results;
_ref3 = bypassList.split(/\r?\n/);
_results = [];
for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
entry = _ref3[_k];
if (entry) {
_results.push({
conditionType: "BypassCondition",
pattern: entry
});
}
}
return _results;
})();
});
});
}).call(this);
(function() {
angular.module('omega').controller('IoCtrl', function($scope, $rootScope, $window, $http, omegaTarget, downloadFile) {
omegaTarget.state('web.restoreOnlineUrl').then(function(url) {
if (url) {
return $scope.restoreOnlineUrl = url;
}
});
$scope.exportOptions = function() {
return $rootScope.applyOptionsConfirm().then(function() {
var blob, content, plainOptions;
plainOptions = angular.fromJson(angular.toJson($rootScope.options));
content = JSON.stringify(plainOptions);
blob = new Blob([content], {
type: "text/plain;charset=utf-8"
});
return downloadFile(blob, "OmegaOptions.bak");
});
};
$scope.importSuccess = function() {
return $rootScope.showAlert({
type: 'success',
i18n: 'options_importSuccess',
message: 'Options imported.'
});
};
$scope.restoreLocal = function(content) {
$scope.restoringLocal = true;
return $rootScope.resetOptions(content).then((function() {
return $scope.importSuccess();
}), function() {
return $scope.restoreLocalError();
})["finally"](function() {
return $scope.restoringLocal = false;
});
};
$scope.restoreLocalError = function() {
return $rootScope.showAlert({
type: 'error',
i18n: 'options_importFormatError',
message: 'Invalid backup file!'
});
};
$scope.downloadError = function() {
return $rootScope.showAlert({
type: 'error',
i18n: 'options_importDownloadError',
message: 'Error downloading backup file!'
});
};
$scope.triggerFileInput = function() {
angular.element('#restore-local-file').click();
};
$scope.restoreOnline = function() {
omegaTarget.state('web.restoreOnlineUrl', $scope.restoreOnlineUrl);
$scope.restoringOnline = true;
return $http({
method: 'GET',
url: $scope.restoreOnlineUrl,
cache: false,
timeout: 10000,
responseType: "text"
}).then((function(result) {
return $rootScope.resetOptions(result.data).then((function() {
return $scope.importSuccess();
}), function() {
return $scope.restoreLocalError();
});
}), $scope.downloadError)["finally"](function() {
return $scope.restoringOnline = false;
});
};
$scope.enableOptionsSync = function(args) {
var enable;
enable = function() {
return omegaTarget.setOptionsSync(true, args)["finally"](function() {
return $window.location.reload();
});
};
if (args != null ? args.force : void 0) {
return enable();
} else {
return $rootScope.applyOptionsConfirm().then(enable);
}
};
$scope.disableOptionsSync = function() {
return omegaTarget.setOptionsSync(false).then(function() {
return $rootScope.applyOptionsConfirm().then(function() {
return $window.location.reload();
});
});
};
return $scope.resetOptionsSync = function() {
return omegaTarget.resetOptionsSync().then(function() {
return $rootScope.applyOptionsConfirm().then(function() {
return $window.location.reload();
});
});
};
});
}).call(this);
(function() {
var __hasProp = {}.hasOwnProperty;
angular.module('omega').controller('MasterCtrl', function($scope, $rootScope, $window, $q, $modal, $state, profileColors, profileIcons, omegaTarget, $timeout, $location, $filter, getAttachedName, isProfileNameReserved, isProfileNameHidden, dispNameFilter, downloadFile) {
var checkFormValid, diff, onOptionChange, showFirstRun, showFirstRunOnce, tr, type, _ref, _ref1, _ref2;
if (((typeof browser !== "undefined" && browser !== null ? (_ref = browser.proxy) != null ? _ref.register : void 0 : void 0) != null) || ((typeof browser !== "undefined" && browser !== null ? (_ref1 = browser.proxy) != null ? _ref1.registerProxyScript : void 0 : void 0) != null)) {
$scope.isExperimental = true;
$scope.pacProfilesUnsupported = true;
}
tr = $filter('tr');
$rootScope.options = null;
omegaTarget.addOptionsChangeCallback(function(newOptions) {
$rootScope.options = angular.copy(newOptions);
$rootScope.optionsOld = angular.copy(newOptions);
omegaTarget.state('syncOptions').then(function(syncOptions) {
return $scope.syncOptions = syncOptions;
});
return $timeout(function() {
$rootScope.optionsDirty = false;
return showFirstRun();
});
});
$rootScope.revertOptions = function() {
return $window.location.reload();
};
$rootScope.exportScript = function(name) {
var getProfileName;
getProfileName = name ? $q.when(name) : omegaTarget.state('currentProfileName');
return getProfileName.then(function(profileName) {
var ast, blob, fileName, missingProfile, pac, profile, profileNotFound, _ref2;
if (!profileName) {
return;
}
profile = $rootScope.profileByName(profileName);
if ((_ref2 = profile.profileType) === 'DirectProfile' || _ref2 === 'SystemProfile') {
return;
}
missingProfile = null;
profileNotFound = function(name) {
missingProfile = name;
return 'dumb';
};
ast = OmegaPac.PacGenerator.script($rootScope.options, profileName, {
profileNotFound: profileNotFound
});
pac = ast.print_to_string({
beautify: true,
comments: true
});
pac = OmegaPac.PacGenerator.ascii(pac);
blob = new Blob([pac], {
type: "text/plain;charset=utf-8"
});
fileName = profileName.replace(/\W+/g, '_');
downloadFile(blob, "OmegaProfile_" + fileName + ".pac");
if (missingProfile) {
return $timeout(function() {
return $rootScope.showAlert({
type: 'error',
message: tr('options_profileNotFound', [missingProfile])
});
});
}
});
};
diff = jsondiffpatch.create({
objectHash: function(obj) {
return JSON.stringify(obj);
},
textDiff: {
minLength: 1 / 0
}
});
$rootScope.showAlert = function(alert) {
return $timeout(function() {
$scope.alert = alert;
$scope.alertShown = true;
$scope.alertShownAt = Date.now();
$timeout($rootScope.hideAlert, 3000);
});
};
$rootScope.hideAlert = function() {
return $timeout(function() {
if (Date.now() - $scope.alertShownAt >= 1000) {
return $scope.alertShown = false;
}
});
};
checkFormValid = function() {
var fields;
fields = angular.element('.ng-invalid');
if (fields.length > 0) {
fields[0].focus();
$rootScope.showAlert({
type: 'error',
i18n: 'options_formInvalid'
});
return false;
}
return true;
};
$rootScope.applyOptions = function() {
var patch, plainOptions;
if (!checkFormValid()) {
return;
}
if ($rootScope.$broadcast('omegaApplyOptions').defaultPrevented) {
return;
}
plainOptions = angular.fromJson(angular.toJson($rootScope.options));
patch = diff.diff($rootScope.optionsOld, plainOptions);
return omegaTarget.optionsPatch(patch).then(function() {
return $rootScope.showAlert({
type: 'success',
i18n: 'options_saveSuccess'
});
});
};
$rootScope.resetOptions = function(options) {
return omegaTarget.resetOptions(options).then(function() {
return $rootScope.showAlert({
type: 'success',
i18n: 'options_resetSuccess'
});
})["catch"](function(err) {
$rootScope.showAlert({
type: 'error',
message: err
});
return $q.reject(err);
});
};
$rootScope.profileByName = function(name) {
return OmegaPac.Profiles.byName(name, $rootScope.options);
};
$rootScope.systemProfile = $rootScope.profileByName('system');
$rootScope.externalProfile = {
color: '#49afcd',
name: tr('popup_externalProfile'),
profileType: 'FixedProfile',
fallbackProxy: {
host: "127.0.0.1",
port: 42,
scheme: "http"
}
};
$rootScope.applyOptionsConfirm = function() {
if (!checkFormValid()) {
return $q.reject('form_invalid');
}
if (!$rootScope.optionsDirty) {
return $q.when(true);
}
return $modal.open({
templateUrl: 'partials/apply_options_confirm.html'
}).result.then(function() {
return $rootScope.applyOptions();
});
};
$rootScope.newProfile = function() {
var scope;
scope = $rootScope.$new('isolate');
scope.options = $rootScope.options;
scope.isProfileNameReserved = isProfileNameReserved;
scope.isProfileNameHidden = isProfileNameHidden;
scope.profileByName = $rootScope.profileByName;
scope.validateProfileName = {
conflict: '!$value || !profileByName($value)',
reserved: '!$value || !isProfileNameReserved($value)'
};
scope.profileIcons = profileIcons;
scope.dispNameFilter = dispNameFilter;
scope.options = $scope.options;
scope.pacProfilesUnsupported = $scope.pacProfilesUnsupported;
return $modal.open({
templateUrl: 'partials/new_profile.html',
scope: scope
}).result.then(function(profile) {
var choice;
profile = OmegaPac.Profiles.create(profile);
choice = Math.floor(Math.random() * profileColors.length);
if (profile.color == null) {
profile.color = profileColors[choice];
}
OmegaPac.Profiles.updateRevision(profile);
$rootScope.options[OmegaPac.Profiles.nameAsKey(profile)] = profile;
return $state.go('profile', {
name: profile.name
});
});
};
$rootScope.replaceProfile = function(fromName, toName) {
return $rootScope.applyOptionsConfirm().then(function() {
var scope;
scope = $rootScope.$new('isolate');
scope.options = $rootScope.options;
scope.fromName = fromName;
scope.toName = toName;
scope.profileByName = $rootScope.profileByName;
scope.dispNameFilter = dispNameFilter;
scope.options = $scope.options;
scope.profileSelect = function(model) {
return "
\n
";
};
return $modal.open({
templateUrl: 'partials/replace_profile.html',
scope: scope
}).result.then(function(_arg) {
var fromName, toName;
fromName = _arg.fromName, toName = _arg.toName;
return omegaTarget.replaceRef(fromName, toName).then(function() {
return $rootScope.showAlert({
type: 'success',
i18n: 'options_replaceProfileSuccess'
});
})["catch"](function(err) {
return $rootScope.showAlert({
type: 'error',
message: err
});
});
});
});
};
$rootScope.renameProfile = function(fromName) {
return $rootScope.applyOptionsConfirm().then(function() {
var profile, scope;
profile = $rootScope.profileByName(fromName);
scope = $rootScope.$new('isolate');
scope.options = $rootScope.options;
scope.fromName = fromName;
scope.isProfileNameReserved = isProfileNameReserved;
scope.isProfileNameHidden = isProfileNameHidden;
scope.profileByName = $rootScope.profileByName;
scope.validateProfileName = {
conflict: '!$value || $value == fromName || !profileByName($value)',
reserved: '!$value || !isProfileNameReserved($value)'
};
scope.dispNameFilter = $scope.dispNameFilter;
scope.options = $scope.options;
return $modal.open({
templateUrl: 'partials/rename_profile.html',
scope: scope
}).result.then(function(toName) {
var attachedName, defaultProfileName, rename, toAttachedName;
if (toName !== fromName) {
rename = omegaTarget.renameProfile(fromName, toName);
attachedName = getAttachedName(fromName);
if ($rootScope.profileByName(attachedName)) {
toAttachedName = getAttachedName(toName);
defaultProfileName = void 0;
if ($rootScope.profileByName(toAttachedName)) {
defaultProfileName = profile.defaultProfileName;
rename = rename.then(function() {
var toAttachedKey;
toAttachedKey = OmegaPac.Profiles.nameAsKey(toAttachedName);
profile = $rootScope.profileByName(toName);
profile.defaultProfileName = 'direct';
OmegaPac.Profiles.updateRevision(profile);
delete $rootScope.options[toAttachedKey];
return $rootScope.applyOptions();
});
}
rename = rename.then(function() {
return omegaTarget.renameProfile(attachedName, toAttachedName);
});
if (defaultProfileName) {
rename = rename.then(function() {
profile = $rootScope.profileByName(toName);
profile.defaultProfileName = defaultProfileName;
return $rootScope.applyOptions();
});
}
}
return rename.then(function() {
return $state.go('profile', {
name: toName
});
})["catch"](function(err) {
return $rootScope.showAlert({
type: 'error',
message: err
});
});
}
});
});
};
$scope.updatingProfile = {};
$rootScope.updateProfile = function(name) {
return $rootScope.applyOptionsConfirm().then(function() {
if (name != null) {
$scope.updatingProfile[name] = true;
} else {
OmegaPac.Profiles.each($scope.options, function(key, profile) {
if (!profile.builtin) {
return $scope.updatingProfile[profile.name] = true;
}
});
}
return omegaTarget.updateProfile(name, 'bypass_cache').then(function(results) {
var error, profileName, result, singleErr, success;
success = 0;
error = 0;
for (profileName in results) {
if (!__hasProp.call(results, profileName)) continue;
result = results[profileName];
if (result instanceof Error) {
error++;
} else {
success++;
}
}
if (error === 0) {
return $rootScope.showAlert({
type: 'success',
i18n: 'options_profileDownloadSuccess'
});
} else {
if (error === 1) {
singleErr = results[OmegaPac.Profiles.nameAsKey(name)];
if (singleErr) {
return $q.reject(singleErr);
}
}
return $q.reject(results);
}
})["catch"](function(err) {
var message, _ref2, _ref3, _ref4;
message = tr('options_profileDownloadError_' + err.name, [(_ref2 = (_ref3 = err.statusCode) != null ? _ref3 : (_ref4 = err.original) != null ? _ref4.statusCode : void 0) != null ? _ref2 : '']);
if (message) {
return $rootScope.showAlert({
type: 'error',
message: message
});
} else {
return $rootScope.showAlert({
type: 'error',
i18n: 'options_profileDownloadError'
});
}
})["finally"](function() {
if (name != null) {
return $scope.updatingProfile[name] = false;
} else {
return $scope.updatingProfile = {};
}
});
});
};
onOptionChange = function(options, oldOptions) {
if (options === oldOptions || (oldOptions == null)) {
return;
}
return $rootScope.optionsDirty = true;
};
$rootScope.$watch('options', onOptionChange, true);
$rootScope.$on('$stateChangeStart', function(event, _, __, fromState) {
if (!checkFormValid()) {
return event.preventDefault();
}
});
$rootScope.$on('$stateChangeSuccess', function() {
return omegaTarget.lastUrl($location.url());
});
$window.onbeforeunload = function() {
if ($rootScope.optionsDirty) {
return tr('options_optionsNotSaved');
} else {
return null;
}
};
document.addEventListener('click', (function() {
return $rootScope.hideAlert();
}), false);
$scope.profileIcons = profileIcons;
$scope.dispNameFilter = dispNameFilter;
_ref2 = OmegaPac.Profiles.formatByType;
for (type in _ref2) {
if (!__hasProp.call(_ref2, type)) continue;
$scope.profileIcons[type] = $scope.profileIcons['RuleListProfile'];
}
$scope.alertIcons = {
'success': 'glyphicon-ok',
'warning': 'glyphicon-warning-sign',
'error': 'glyphicon-remove',
'danger': 'glyphicon-danger'
};
$scope.alertClassForType = function(type) {
if (!type) {
return '';
}
if (type === 'error') {
type = 'danger';
}
return 'alert-' + type;
};
$scope.downloadIntervals = [15, 60, 180, 360, 720, 1440, -1];
$scope.downloadIntervalI18n = function(interval) {
return "options_downloadInterval_" + (interval < 0 ? "never" : interval);
};
$scope.openShortcutConfig = omegaTarget.openShortcutConfig.bind(omegaTarget);
showFirstRunOnce = true;
showFirstRun = function() {
if (!showFirstRunOnce) {
return;
}
showFirstRunOnce = false;
return omegaTarget.state('firstRun').then(function(firstRun) {
var profileName, scope;
if (!firstRun) {
return;
}
omegaTarget.state('firstRun', '');
profileName = null;
OmegaPac.Profiles.each($rootScope.options, function(key, profile) {
if (!profileName && profile.profileType === 'FixedProfile') {
return profileName = profile.name;
}
});
if (!profileName) {
return;
}
scope = $rootScope.$new('isolate');
scope.upgrade = firstRun === 'upgrade';
return $modal.open({
templateUrl: 'partials/options_welcome.html',
keyboard: false,
scope: scope,
backdrop: 'static',
backdropClass: 'opacity-half'
}).result.then(function(r) {
switch (r) {
case 'later':
break;
case 'show':
return $state.go('profile', {
name: profileName
}).then(function() {
return $script('js/options_guide.js');
});
}
});
});
};
return omegaTarget.refresh();
});
}).call(this);
(function() {
angular.module('omega').controller('PacProfileCtrl', function($scope, $modal) {
var oldLastUpdate, oldPacScript, oldPacUrl, onProfileChange, set;
$scope.urlRegex = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
$scope.urlWithFile = /^(ftp|http|https|file):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
$scope.isFileUrl = OmegaPac.Profiles.isFileUrl;
$scope.pacUrlCtrl = {
ctrl: null
};
set = OmegaPac.Profiles.referencedBySet($scope.profile, $scope.options);
$scope.referenced = Object.keys(set).length > 0;
oldPacUrl = null;
oldLastUpdate = null;
oldPacScript = null;
onProfileChange = function(profile, oldProfile) {
if (!(profile && oldProfile)) {
return;
}
if (profile.pacUrl !== oldProfile.pacUrl) {
if (profile.lastUpdate) {
oldPacUrl = oldProfile.pacUrl;
oldLastUpdate = profile.lastUpdate;
oldPacScript = oldProfile.pacScript;
profile.lastUpdate = null;
} else if (oldPacUrl && profile.pacUrl === oldPacUrl) {
profile.lastUpdate = oldLastUpdate;
profile.pacScript = oldPacScript;
}
}
return $scope.pacUrlIsFile = $scope.isFileUrl(profile.pacUrl);
};
$scope.$watch('profile', onProfileChange, true);
return $scope.editProxyAuth = function(scheme) {
var auth, prop, scope, _ref;
prop = 'all';
auth = (_ref = $scope.profile.auth) != null ? _ref[prop] : void 0;
scope = $scope.$new('isolate');
scope.auth = auth && angular.copy(auth);
return $modal.open({
templateUrl: 'partials/fixed_auth_edit.html',
scope: scope,
size: 'sm'
}).result.then(function(auth) {
var _base;
if (!(auth != null ? auth.username : void 0)) {
if ($scope.profile.auth) {
return $scope.profile.auth[prop] = void 0;
}
} else {
if ((_base = $scope.profile).auth == null) {
_base.auth = {};
}
return $scope.profile.auth[prop] = auth;
}
});
};
});
}).call(this);
(function() {
var __hasProp = {}.hasOwnProperty;
angular.module('omega').controller('ProfileCtrl', function($scope, $stateParams, $location, $rootScope, $timeout, $state, $modal, profileColorPalette, getAttachedName, getParentName, getVirtualTarget) {
var name, profileTemplates, unwatch;
name = $stateParams.name;
profileTemplates = {
'FixedProfile': 'profile_fixed.html',
'PacProfile': 'profile_pac.html',
'VirtualProfile': 'profile_virtual.html',
'SwitchProfile': 'profile_switch.html',
'RuleListProfile': 'profile_rule_list.html'
};
$scope.spectrumOptions = {
localStorageKey: 'spectrum.profileColor',
palette: profileColorPalette,
preferredFormat: 'hex',
showButtons: false,
showInitial: true,
showInput: true,
showPalette: true,
showSelectionPalette: true,
maxSelectionSize: 5
};
$scope.getProfileColor = function() {
var color, profile;
color = void 0;
profile = $scope.profile;
while (profile) {
color = profile.color;
profile = getVirtualTarget(profile, $scope.options);
}
return color;
};
$scope.deleteProfile = function() {
var key, parent, pname, profileName, refProfiles, refSet, refs, scope;
profileName = $scope.profile.name;
refs = OmegaPac.Profiles.referencedBySet(profileName, $rootScope.options);
scope = $rootScope.$new('isolate');
scope.profile = $scope.profile;
scope.dispNameFilter = $scope.dispNameFilter;
scope.options = $scope.options;
if (Object.keys(refs).length > 0) {
refSet = {};
for (key in refs) {
if (!__hasProp.call(refs, key)) continue;
pname = refs[key];
parent = getParentName(pname);
if (parent) {
key = OmegaPac.Profiles.nameAsKey(parent);
pname = parent;
}
refSet[key] = pname;
}
refProfiles = [];
for (key in refSet) {
if (!__hasProp.call(refSet, key)) continue;
refProfiles.push(OmegaPac.Profiles.byKey(key, $rootScope.options));
}
scope.refs = refProfiles;
$modal.open({
templateUrl: 'partials/cannot_delete_profile.html',
scope: scope
});
} else {
return $modal.open({
templateUrl: 'partials/delete_profile.html',
scope: scope
}).result.then(function() {
var attachedName, i, quickSwitch, _i, _ref;
attachedName = getAttachedName(profileName);
delete $rootScope.options[OmegaPac.Profiles.nameAsKey(attachedName)];
delete $rootScope.options[OmegaPac.Profiles.nameAsKey(profileName)];
if ($rootScope.options['-startupProfileName'] === profileName) {
$rootScope.options['-startupProfileName'] = "";
}
quickSwitch = $rootScope.options['-quickSwitchProfiles'];
for (i = _i = 0, _ref = quickSwitch.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
if (profileName === quickSwitch[i]) {
quickSwitch.splice(i, 1);
break;
}
}
return $state.go('ui');
});
}
};
$scope.watchAndUpdateRevision = function(expression) {
var onChange, revisionChanged;
revisionChanged = false;
onChange = function(profile, oldProfile) {
if (profile === oldProfile || !profile || !oldProfile) {
return profile;
}
if (revisionChanged && profile.revision !== oldProfile.revision) {
return revisionChanged = false;
} else {
OmegaPac.Profiles.updateRevision(profile);
return revisionChanged = true;
}
};
return this.$watch(expression, onChange, true);
};
$scope.exportRuleList = null;
$scope.exportRuleListOptions = null;
$scope.setExportRuleListHandler = function(exportRuleList, options) {
$scope.exportRuleList = exportRuleList;
return $scope.exportRuleListOptions = options;
};
return unwatch = $scope.$watch((function() {
var _ref;
return (_ref = $scope.options) != null ? _ref['+' + name] : void 0;
}), function(profile) {
var templ, type, unwatch2, _ref;
if (!profile) {
if ($scope.options) {
unwatch();
$location.path('/');
} else {
unwatch2 = $scope.$watch('options', function() {
if ($scope.options) {
unwatch2();
if (!$scope.options['+' + name]) {
unwatch();
return $location.path('/');
}
}
});
}
return;
}
if (OmegaPac.Profiles.formatByType[profile.profileType]) {
profile.format = OmegaPac.Profiles.formatByType[profile.profileType];
profile.profileType = 'RuleListProfile';
}
$scope.profile = profile;
type = $scope.profile.profileType;
templ = (_ref = profileTemplates[type]) != null ? _ref : 'profile_unsupported.html';
$scope.profileTemplate = 'partials/' + templ;
$scope.scriptable = true;
return $scope.watchAndUpdateRevision('profile');
});
});
}).call(this);
(function() {
angular.module('omega').controller('QuickSwitchCtrl', function($scope, $filter) {
$scope.sortableOptions = {
tolerance: 'pointer',
axis: 'y',
forceHelperSize: true,
forcePlaceholderSize: true,
connectWith: '.cycle-profile-container',
containment: '#quick-switch-settings'
};
return $scope.$watchCollection('options', function(options) {
var profile;
if (options == null) {
return;
}
return $scope.notCycledProfiles = (function() {
var _i, _len, _ref, _results;
_ref = $filter('profiles')(options, 'all');
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
profile = _ref[_i];
if (options["-quickSwitchProfiles"].indexOf(profile.name) < 0) {
_results.push(profile.name);
}
}
return _results;
})();
});
});
}).call(this);
(function() {
angular.module('omega').controller('RuleListProfileCtrl', function($scope) {
return $scope.ruleListFormats = OmegaPac.Profiles.ruleListFormats;
});
}).call(this);
(function() {
var __hasProp = {}.hasOwnProperty;
angular.module('omega').controller('SwitchProfileCtrl', function($scope, $rootScope, $location, $timeout, $q, $modal, profileIcons, getAttachedName, omegaTarget, trFilter, downloadFile) {
var advancedConditionTypesExpanded, attachedReady, attachedReadyDefer, basicConditionTypeSet, basicConditionTypesExpanded, expandGroups, exportLegacyRuleList, exportRuleList, oldLastUpdate, oldRuleList, oldSourceUrl, onAttachedChange, parseOmegaRules, parseSource, rulesReady, rulesReadyDefer, stateEditorKey, stopWatchingForRules, type, unwatchRules, unwatchRulesShowNote, updateHasConditionTypes, _i, _len;
$scope.ruleListFormats = OmegaPac.Profiles.ruleListFormats;
exportRuleList = function() {
var blob, eol, fileName, info, text;
text = OmegaPac.RuleList.Switchy.compose({
rules: $scope.profile.rules,
defaultProfileName: $scope.attachedOptions.defaultProfileName
});
eol = '\r\n';
info = '\n';
info += '; Require: SwitchyOmega >= 2.3.2' + eol;
info += ("; Date: " + (new Date().toLocaleDateString())) + eol;
info += ("; Usage: " + (trFilter('ruleList_usageUrl'))) + eol;
text = text.replace('\n', info);
blob = new Blob([text], {
type: "text/plain;charset=utf-8"
});
fileName = $scope.profile.name.replace(/\W+/g, '_');
return downloadFile(blob, "OmegaRules_" + fileName + ".sorl");
};
exportLegacyRuleList = function() {
var blob, fileName, i, regexpRules, rule, text, wildcardRules, _i, _len, _ref;
wildcardRules = '';
regexpRules = '';
_ref = $scope.profile.rules;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
rule = _ref[_i];
i = '';
if (rule.profileName === $scope.attachedOptions.defaultProfileName) {
i = '!';
}
switch (rule.condition.conditionType) {
case 'HostWildcardCondition':
wildcardRules += i + '@*://' + rule.condition.pattern + '/*' + '\r\n';
break;
case 'UrlWildcardCondition':
wildcardRules += i + '@' + rule.condition.pattern + '\r\n';
break;
case 'UrlRegexCondition':
regexpRules += i + rule.condition.pattern + '\r\n';
}
}
text = "; Summary: Proxy Switchy! Exported Rule List\n; Date: " + (new Date().toLocaleDateString()) + "\n; Website: " + (trFilter('ruleList_usageUrl')) + "\n\n#BEGIN\n\n[wildcard]\n" + wildcardRules + "\n[regexp]\n" + regexpRules + "\n#END";
blob = new Blob([text], {
type: "text/plain;charset=utf-8"
});
fileName = $scope.profile.name.replace(/\W+/g, '_');
return downloadFile(blob, "SwitchyRules_" + fileName + ".ssrl");
};
$scope.conditionHelp = {
show: $location.search().help === 'condition'
};
$scope.basicConditionTypes = [
{
group: 'default',
types: ['HostWildcardCondition', 'UrlWildcardCondition', 'UrlRegexCondition', 'FalseCondition']
}
];
$scope.advancedConditionTypes = [
{
group: 'host',
types: ['HostWildcardCondition', 'HostRegexCondition', 'HostLevelsCondition', 'IpCondition']
}, {
group: 'url',
types: ['UrlWildcardCondition', 'UrlRegexCondition', 'KeywordCondition']
}, {
group: 'special',
types: ['WeekdayCondition', 'TimeCondition', 'FalseCondition']
}
];
expandGroups = function(groups) {
var group, result, type, _i, _j, _len, _len1, _ref;
result = [];
for (_i = 0, _len = groups.length; _i < _len; _i++) {
group = groups[_i];
_ref = group.types;
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
type = _ref[_j];
result.push({
type: type,
group: 'condition_group_' + group.group
});
}
}
return result;
};
basicConditionTypesExpanded = expandGroups($scope.basicConditionTypes);
advancedConditionTypesExpanded = expandGroups($scope.advancedConditionTypes);
basicConditionTypeSet = {};
for (_i = 0, _len = basicConditionTypesExpanded.length; _i < _len; _i++) {
type = basicConditionTypesExpanded[_i];
basicConditionTypeSet[type.type] = type.type;
}
$scope.conditionTypes = basicConditionTypesExpanded;
$scope.showConditionTypes = 0;
$scope.hasConditionTypes = 0;
$scope.hasUrlConditions = false;
$scope.isUrlConditionType = {
'UrlWildcardCondition': true,
'UrlRegexCondition': true
};
updateHasConditionTypes = function() {
var rule, _j, _k, _len1, _len2, _ref, _ref1, _ref2, _results;
if (((_ref = $scope.profile) != null ? _ref.rules : void 0) == null) {
return;
}
$scope.hasUrlConditions = false;
_ref1 = $scope.profile.rules;
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
rule = _ref1[_j];
if ($scope.isUrlConditionType[rule.condition.conditionType]) {
$scope.hasUrlConditions = true;
break;
}
}
if ($scope.hasConditionTypes !== 0) {
return;
}
_ref2 = $scope.profile.rules;
_results = [];
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
rule = _ref2[_k];
if (rule.condition.conditionType === 'TrueCondition') {
rule.condition = {
conditionType: 'HostWildcardCondition',
pattern: '*'
};
}
if (!basicConditionTypeSet[rule.condition.conditionType]) {
$scope.hasConditionTypes = 1;
$scope.showConditionTypes = 1;
break;
} else {
_results.push(void 0);
}
}
return _results;
};
$scope.$watch('options["-showConditionTypes"]', function(show) {
show || (show = 0);
if (show > 0) {
$scope.showConditionTypes = show;
} else {
updateHasConditionTypes();
$scope.showConditionTypes = $scope.hasConditionTypes;
}
if ($scope.options['-exportLegacyRuleList']) {
if ($scope.showConditionTypes > 0) {
$scope.setExportRuleListHandler(exportRuleList, {
warning: true
});
} else {
$scope.setExportRuleListHandler(exportLegacyRuleList);
}
} else {
$scope.setExportRuleListHandler(exportRuleList);
}
if ($scope.showConditionTypes === 0) {
$scope.conditionTypes = basicConditionTypesExpanded;
if ($scope.options['-exportLegacyRuleList']) {
return $scope.setExportRuleListHandler(exportLegacyRuleList);
}
} else {
$scope.conditionTypes = advancedConditionTypesExpanded;
if ($scope.options["-showConditionTypes"] == null) {
$scope.options["-showConditionTypes"] = $scope.showConditionTypes;
}
return typeof unwatchRules === "function" ? unwatchRules() : void 0;
}
});
if ($scope.hasConditionTypes === 0) {
unwatchRules = $scope.$watch('profile.rules', updateHasConditionTypes, true);
}
rulesReadyDefer = $q.defer();
rulesReady = rulesReadyDefer.promise;
stopWatchingForRules = $scope.$watch('profile.rules', function(rules) {
if (!rules) {
return;
}
stopWatchingForRules();
return rulesReadyDefer.resolve(rules);
});
$scope.addRule = function() {
var rule, templ, _ref;
rule = $scope.profile.rules.length > 0 ? ((_ref = $scope.profile.rules, templ = _ref[_ref.length - 1], _ref), angular.copy(templ)) : {
condition: {
conditionType: 'HostWildcardCondition',
pattern: ''
},
profileName: $scope.attachedOptions.defaultProfileName
};
if (rule.condition.pattern) {
rule.condition.pattern = '';
}
return $scope.profile.rules.push(rule);
};
$scope.validateCondition = function(condition, pattern) {
var _;
if (condition.conditionType.indexOf('Regex') >= 0) {
try {
new RegExp(pattern);
} catch (_error) {
_ = _error;
return false;
}
}
return true;
};
$scope.conditionHasWarning = function(condition) {
var pattern;
if (condition.conditionType === 'HostWildcardCondition') {
pattern = condition.pattern;
return pattern.indexOf(':') >= 0 || pattern.indexOf('/') >= 0;
}
return false;
};
$scope.validateIpCondition = function(condition, input) {
var ip;
if (!input) {
return false;
}
ip = OmegaPac.Conditions.parseIp(input);
return ip != null;
};
$scope.getWeekdayList = OmegaPac.Conditions.getWeekdayList;
$scope.updateDay = function(condition, i, selected) {
var char;
condition.days || (condition.days = '-------');
char = selected ? 'SMTWtFs'[i] : '-';
condition.days = condition.days.substr(0, i) + char + condition.days.substr(i + 1);
delete condition.startDay;
return delete condition.endDay;
};
$scope.removeRule = function(index) {
var removeForReal, scope;
removeForReal = function() {
return $scope.profile.rules.splice(index, 1);
};
if ($scope.options['-confirmDeletion']) {
scope = $scope.$new('isolate');
scope.rule = $scope.profile.rules[index];
scope.ruleProfile = $scope.profileByName(scope.rule.profileName);
scope.dispNameFilter = $scope.dispNameFilter;
scope.options = $scope.options;
return $modal.open({
templateUrl: 'partials/rule_remove_confirm.html',
scope: scope
}).result.then(removeForReal);
} else {
return removeForReal();
}
};
$scope.cloneRule = function(index) {
var rule;
rule = angular.copy($scope.profile.rules[index]);
$scope.profile.rules.splice(index + 1, 0, rule);
return $timeout(function() {
var input, _ref, _ref1;
input = angular.element(".switch-rule-row:nth-child(" + (index + 2) + ") input");
if ((_ref = input[0]) != null) {
_ref.focus();
}
return (_ref1 = input[0]) != null ? _ref1.select() : void 0;
});
};
$scope.showNotes = false;
$scope.addNote = function(index) {
$scope.showNotes = true;
return unwatchRulesShowNote();
};
unwatchRulesShowNote = $scope.$watch('profile.rules', (function(rules) {
if (rules && rules.some(function(rule) {
return !!rule.note;
})) {
$scope.showNotes = true;
return unwatchRulesShowNote();
}
}), true);
$scope.resetRules = function() {
var scope;
scope = $scope.$new('isolate');
scope.ruleProfile = $scope.profileByName($scope.attachedOptions.defaultProfileName);
scope.dispNameFilter = $scope.dispNameFilter;
scope.options = $scope.options;
return $modal.open({
templateUrl: 'partials/rule_reset_confirm.html',
scope: scope
}).result.then(function() {
var rule, _j, _len1, _ref, _results;
_ref = $scope.profile.rules;
_results = [];
for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
rule = _ref[_j];
_results.push(rule.profileName = $scope.attachedOptions.defaultProfileName);
}
return _results;
});
};
$scope.sortableOptions = {
handle: '.sort-bar',
tolerance: 'pointer',
axis: 'y',
forceHelperSize: true,
forcePlaceholderSize: true,
containment: 'parent'
};
attachedReadyDefer = $q.defer();
attachedReady = attachedReadyDefer.promise;
$scope.$watch('profile.name', function(name) {
$scope.attachedName = getAttachedName(name);
return $scope.attachedKey = OmegaPac.Profiles.nameAsKey($scope.attachedName);
});
$scope.$watch('options[attachedKey]', function(attached) {
return $scope.attached = attached;
});
$scope.watchAndUpdateRevision('options[attachedKey]');
oldSourceUrl = null;
oldLastUpdate = null;
oldRuleList = null;
onAttachedChange = function(attached, oldAttached) {
if (!(attached && oldAttached)) {
return;
}
if (attached.sourceUrl !== oldAttached.sourceUrl) {
if (attached.lastUpdate) {
oldSourceUrl = oldAttached.sourceUrl;
oldLastUpdate = attached.lastUpdate;
oldRuleList = oldAttached.ruleList;
return attached.lastUpdate = null;
} else if (oldSourceUrl && attached.sourceUrl === oldSourceUrl) {
attached.lastUpdate = oldLastUpdate;
return attached.ruleList = oldRuleList;
}
}
};
$scope.$watch('options[attachedKey]', onAttachedChange, true);
$scope.attachedOptions = {
enabled: false
};
$scope.$watch('profile.defaultProfileName', function(name) {
$scope.attachedOptions.enabled = name === $scope.attachedName;
if (!$scope.attached || !$scope.attachedOptions.enabled) {
return $scope.attachedOptions.defaultProfileName = name;
}
});
$scope.$watch('attachedOptions.enabled', function(enabled, oldValue) {
if (enabled === oldValue) {
return;
}
if (enabled) {
if ($scope.profile.defaultProfileName !== $scope.attachedName) {
return $scope.profile.defaultProfileName = $scope.attachedName;
}
} else {
if ($scope.profile.defaultProfileName === $scope.attachedName) {
if ($scope.attached) {
$scope.profile.defaultProfileName = $scope.attached.defaultProfileName;
return $scope.attachedOptions.defaultProfileName = $scope.attached.defaultProfileName;
} else {
$scope.profile.defaultProfileName = 'direct';
return $scope.attachedOptions.defaultProfileName = 'direct';
}
}
}
});
$scope.$watch('attached.defaultProfileName', function(name) {
if (name && $scope.attachedOptions.enabled) {
return $scope.attachedOptions.defaultProfileName = name;
}
});
$scope.$watch('attachedOptions.defaultProfileName', function(name) {
attachedReadyDefer.resolve();
if ($scope.attached && $scope.attachedOptions.enabled) {
return $scope.attached.defaultProfileName = name;
} else {
return $scope.profile.defaultProfileName = name;
}
});
$scope.attachNew = function() {
$scope.attached = OmegaPac.Profiles.create({
name: $scope.attachedName,
defaultProfileName: $scope.profile.defaultProfileName,
profileType: 'RuleListProfile',
color: $scope.profile.color
});
OmegaPac.Profiles.updateRevision($scope.attached);
$scope.options[$scope.attachedKey] = $scope.attached;
$scope.attachedOptions.enabled = true;
return $scope.profile.defaultProfileName = $scope.attachedName;
};
$scope.removeAttached = function() {
var scope;
if (!$scope.attached) {
return;
}
scope = $scope.$new('isolate');
scope.attached = $scope.attached;
scope.dispNameFilter = $scope.dispNameFilter;
scope.options = $scope.options;
return $modal.open({
templateUrl: 'partials/delete_attached.html',
scope: scope
}).result.then(function() {
$scope.profile.defaultProfileName = $scope.attached.defaultProfileName;
return delete $scope.options[$scope.attachedKey];
});
};
stateEditorKey = 'web._profileEditor.' + $scope.profile.name;
$scope.loadRules = false;
$scope.editSource = false;
parseOmegaRules = function(code, _arg) {
var detect, err, key, name, refs, requireResult, setError, _ref;
_ref = _arg != null ? _arg : {}, detect = _ref.detect, requireResult = _ref.requireResult;
setError = function(error) {
var args, message, _ref1;
if (error.reason) {
args = (_ref1 = error.args) != null ? _ref1 : [error.sourceLineNo, error.source];
message = trFilter('ruleList_error_' + error.reason, args);
if (message) {
error.message = message;
}
}
return {
error: error
};
};
if (detect && !OmegaPac.RuleList.Switchy.detect(code)) {
return {
error: {
reason: 'notSwitchy'
}
};
}
refs = OmegaPac.RuleList.Switchy.directReferenceSet({
ruleList: code
});
if (requireResult && !refs) {
return setError({
reason: 'resultNotEnabled'
});
}
for (key in refs) {
if (!__hasProp.call(refs, key)) continue;
name = refs[key];
if (!OmegaPac.Profiles.byKey(key, $scope.options)) {
return setError({
reason: 'unknownProfile',
args: [name]
});
}
}
try {
return {
rules: OmegaPac.RuleList.Switchy.parseOmega(code, null, null, {
strict: true,
source: false
})
};
} catch (_error) {
err = _error;
return setError(err);
}
};
parseSource = function() {
var diff, error, oldRules, patch, rules, _ref;
if (!$scope.source) {
return true;
}
_ref = parseOmegaRules($scope.source.code.trim(), {
requireResult: true
}), rules = _ref.rules, error = _ref.error;
if (error) {
$scope.source.error = error;
$scope.editSource = true;
return false;
} else {
$scope.source.error = void 0;
}
$scope.attachedOptions.defaultProfileName = rules.pop().profileName;
diff = jsondiffpatch.create({
objectHash: function(obj) {
return JSON.stringify(obj);
},
textDiff: {
minLength: 1 / 0
}
});
oldRules = angular.fromJson(angular.toJson($scope.profile.rules));
patch = diff.diff(oldRules, rules);
jsondiffpatch.patch($scope.profile.rules, patch);
return true;
};
$scope.toggleSource = function() {
return $q.all([attachedReady, rulesReady]).then(function() {
var args, code;
$scope.editSource = !$scope.editSource;
if ($scope.editSource) {
args = {
rules: $scope.profile.rules,
defaultProfileName: $scope.attachedOptions.defaultProfileName
};
code = OmegaPac.RuleList.Switchy.compose(args, {
withResult: true
});
$scope.source = {
code: code
};
} else {
if (!parseSource()) {
return;
}
$scope.source = null;
$scope.loadRules = true;
}
return omegaTarget.state(stateEditorKey, {
editSource: $scope.editSource
});
});
};
$rootScope.$on('$stateChangeStart', function(event, _, __, fromState) {
var sourceValid;
if ($scope.editSource && $scope.source.touched) {
sourceValid = parseSource();
if (!sourceValid) {
return event.preventDefault();
}
}
});
$scope.$on('omegaApplyOptions', function(event) {
var error, _ref;
if (((_ref = $scope.attached) != null ? _ref.ruleList : void 0) && !$scope.attached.sourceUrl) {
$scope.attachedRuleListError = void 0;
error = parseOmegaRules($scope.attached.ruleList.trim(), {
detect: true
}).error;
if (error) {
if (error.reason !== 'resultNotEnabled' && error.reason !== 'notSwitchy') {
$scope.attachedRuleListError = error;
event.preventDefault();
angular.element('#attached-rulelist')[0].focus();
}
} else {
$scope.attached.format = 'Switchy';
}
}
if ($scope.editSource && $scope.source.touched) {
event.preventDefault();
if (parseSource()) {
$scope.source.touched = false;
return $timeout(function() {
return $rootScope.applyOptions();
});
}
}
});
return omegaTarget.state(stateEditorKey).then(function(opts) {
var getState;
if (opts != null ? opts.editSource : void 0) {
return $scope.toggleSource();
} else {
$scope.loadRules = true;
getState = omegaTarget.state(['web.switchGuide', 'firstRun']);
return $q.all([rulesReady, getState]).then(function(_arg) {
var firstRun, switchGuide, _, _ref;
_ = _arg[0], (_ref = _arg[1], switchGuide = _ref[0], firstRun = _ref[1]);
if (firstRun || switchGuide === 'shown') {
return;
}
omegaTarget.state('web.switchGuide', 'shown');
if ($scope.profile.rules.length === 0) {
return;
}
return $script('js/switch_profile_guide.js');
});
}
});
});
}).call(this);
(function() {
angular.module('omega').directive('inputGroupClear', function($timeout) {
return {
restrict: 'A',
templateUrl: 'partials/input_group_clear.html',
scope: {
'model': '=model',
'type': '@type',
'ngPattern': '=?ngPattern',
'placeholder': '@placeholder',
'controller': '=?controller'
},
link: function(scope, element, attrs) {
scope.catchAll = new RegExp('');
$timeout(function() {
return scope.controller = element.find('input').controller('ngModel');
});
scope.oldModel = '';
scope.controller = scope.input;
scope.modelChange = function() {
if (scope.model) {
return scope.oldModel = '';
}
};
return scope.toggleClear = function() {
var _ref;
return _ref = [scope.oldModel, scope.model], scope.model = _ref[0], scope.oldModel = _ref[1], _ref;
};
}
};
});
angular.module('omega').directive('omegaUpload', function() {
return {
restrict: 'A',
scope: {
success: '&omegaUpload',
error: '&omegaError'
},
link: function(scope, element, attrs) {
var input;
input = element[0];
return element.on('change', function() {
var reader;
if (input.files.length > 0 && input.files[0].name.length > 0) {
reader = new FileReader();
reader.addEventListener('load', function(e) {
return scope.$apply(function() {
return scope.success({
'$content': e.target.result
});
});
});
reader.addEventListener('error', function(e) {
return scope.$apply(function() {
return scope.error({
'$error': e.target.error
});
});
});
reader.readAsText(input.files[0]);
return input.value = '';
}
});
}
};
});
angular.module('omega').directive('omegaIp2str', function() {
return {
restrict: 'A',
priority: 2,
require: 'ngModel',
link: function(scope, element, attr, ngModel) {
ngModel.$parsers.push(function(value) {
if (value) {
return OmegaPac.Conditions.fromStr('Ip: ' + value);
} else {
return {
conditionType: 'IpCondition',
ip: '0.0.0.0',
prefixLength: 0
};
}
});
return ngModel.$formatters.push(function(value) {
if (value != null ? value.ip : void 0) {
return OmegaPac.Conditions.str(value).split(' ', 2)[1];
} else {
return '';
}
});
}
};
});
}).call(this);
(function() {
angular.module('omega').filter('profiles', function(builtinProfiles, profileOrder, isProfileNameHidden, isProfileNameReserved) {
var builtinProfileList, charCodePlus, profile, _;
charCodePlus = '+'.charCodeAt(0);
builtinProfileList = (function() {
var _results;
_results = [];
for (_ in builtinProfiles) {
profile = builtinProfiles[_];
_results.push(profile);
}
return _results;
})();
return function(options, filter) {
var name, result, value;
result = [];
for (name in options) {
value = options[name];
if (name.charCodeAt(0) === charCodePlus) {
result.push(value);
}
}
if (typeof filter === 'object' || (typeof filter === 'string' && filter.charCodeAt(0) === charCodePlus)) {
if (typeof filter === 'string') {
filter = filter.substr(1);
}
result = OmegaPac.Profiles.validResultProfilesFor(filter, options);
}
if (filter === 'all') {
result = result.filter(function(profile) {
return !isProfileNameHidden(profile.name);
});
result = result.concat(builtinProfileList);
} else {
result = result.filter(function(profile) {
return !isProfileNameReserved(profile.name);
});
}
if (filter === 'sorted') {
result.sort(profileOrder);
}
return result;
};
});
angular.module('omega').filter('tr', function(omegaTarget) {
return omegaTarget.getMessage;
});
angular.module('omega').filter('dispName', function(omegaTarget) {
return function(name) {
if (typeof name === 'object') {
name = name.name;
}
return omegaTarget.getMessage('profile_' + name) || name;
};
});
}).call(this);