'use strict'; angular.module('copayApp.directives') .directive('validAddress', ['$rootScope', 'bitcore', function($rootScope, bitcore) { return { require: 'ngModel', link: function(scope, elem, attrs, ctrl) { var URI = bitcore.URI; var Address = bitcore.Address var validator = function(value) { // Regular url if (/^https?:\/\//.test(value)) { ctrl.$setValidity('validAddress', true); return value; } // Bip21 uri if (/^bitcoin:/.test(value)) { var uri, isAddressValidLivenet, isAddressValidTestnet; var isUriValid = URI.isValid(value); if (isUriValid) { uri = new URI(value); isAddressValidLivenet = Address.isValid(uri.address.toString(), 'livenet') isAddressValidTestnet = Address.isValid(uri.address.toString(), 'testnet') } ctrl.$setValidity('validAddress', isUriValid && (isAddressValidLivenet || isAddressValidTestnet)); return value; } if (typeof value == 'undefined') { ctrl.$pristine = true; return; } // Regular Address var regularAddressLivenet = Address.isValid(value, 'livenet'); var regularAddressTestnet = Address.isValid(value, 'testnet'); ctrl.$setValidity('validAddress', (regularAddressLivenet || regularAddressTestnet)); return value; }; ctrl.$parsers.unshift(validator); ctrl.$formatters.unshift(validator); } }; } ]) .directive('validAmount', ['configService', function(configService) { return { require: 'ngModel', link: function(scope, element, attrs, ctrl) { var val = function(value) { var settings = configService.getSync().wallet.settings; var vNum = Number((value * settings.unitToSatoshi).toFixed(0)); if (typeof value == 'undefined' || value == 0) { ctrl.$pristine = true; } if (typeof vNum == "number" && vNum > 0) { if (vNum > Number.MAX_SAFE_INTEGER) { ctrl.$setValidity('validAmount', false); } else { var decimals = Number(settings.unitDecimals); var sep_index = ('' + value).indexOf('.'); var str_value = ('' + value).substring(sep_index + 1); if (sep_index >= 0 && str_value.length > decimals) { ctrl.$setValidity('validAmount', false); return; } else { ctrl.$setValidity('validAmount', true); } } } else { ctrl.$setValidity('validAmount', false); } return value; } ctrl.$parsers.unshift(val); ctrl.$formatters.unshift(val); } }; } ]) .directive('walletSecret', function(bitcore) { return { require: 'ngModel', link: function(scope, elem, attrs, ctrl) { var validator = function(value) { if (value.length > 0) { var m = value.match(/^[0-9A-HJ-NP-Za-km-z]{70,80}$/); ctrl.$setValidity('walletSecret', m ? true : false); } return value; }; ctrl.$parsers.unshift(validator); } }; }) .directive('ngFileSelect', function() { return { link: function($scope, el) { el.bind('change', function(e) { $scope.formData.file = (e.srcElement || e.target).files[0]; $scope.getFile(); }); } } }) .directive('contact', ['addressbookService', 'lodash', function(addressbookService, lodash) { return { restrict: 'E', link: function(scope, element, attrs) { var addr = attrs.address; addressbookService.get(addr, function(err, ab) { if (ab) { var name = lodash.isObject(ab) ? ab.name : ab; element.append(name); } else { element.append(addr); } }); } }; } ]) .directive('ignoreMouseWheel', function($rootScope, $timeout) { return { restrict: 'A', link: function(scope, element, attrs) { element.bind('mousewheel', function(event) { element[0].blur(); $timeout(function() { element[0].focus(); }, 1); }); } } }) .directive('wallets', function($log, profileService, walletService, lodash) { return { restrict: 'E', templateUrl: 'views/includes/wallets.html', scope: { wallets: '=wallets' }, link: function(scope, element, attrs) { scope.$on("$ionicSlides.sliderInitialized", function(event, data) { scope.slider = data.slider; scope.$emit('Wallet/Changed', scope.wallets ? scope.wallets[0] : null); }); scope.$on("$ionicSlides.slideChangeEnd", function(event, data) { scope.$emit('Wallet/Changed', scope.wallets ? scope.wallets[data.slider.activeIndex] : null); }); } } });