<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@1.2.4" data-semver="1.2.4" src="http://code.angularjs.org/1.2.4/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body ng-app="app" ng-controller="Ctrl">
    <div class="blk" ng-repeat="color in colors track by $index" 
      ng-style="{'background-color':'#'+color}"
      cd-readable-color="color"
    >
        Franz jagt im komelett verrückten Taxi
        <br>
        <input type="text" ng-model="colors[$index]">
    </div>
    
    <p></p>
    <button ng-click="addColor()">Add color</button>
    
  </body>

</html>
angular.module('app', []);

angular.module('app').controller('Ctrl', ['$scope', function ($scope) {
  $scope.colors = [
    'ff00ff',
    'ff0000',
    'FFFF00',
    '999999',
    'dedede',
    'a3d221',
    '121212',
    '5A000A',
    'E34C31',
    '028C02',
    'D1AF19',
    'FFF2B8',
    '6E6E00',
    'E0A03D',
    '0D1F48'
  ]; 
  
  $scope.addColor = function() {
    $scope.colors.push('FFFFFF');
  };
}]);


angular.module('app').directive('cdReadableColor', function() {
  return {
    'restrict': 'A',
    'scope': {
      color: '=cdReadableColor'
    },
    'link': function link(scope, element, attrs) {
      
      function getReadableColor(color) {
        var r,g,b,erg,m;
        if(color.length == 7 && color.substr(1) == '#') color = color.substr(1);
        if((m = color.match(/^rgb\(([0-9]+), ?([0-9]+), ?([0-9]+)\)$/))) {
          r = m[1];
          g = m[2];
          b = m[3];
        } else if(color.length == 6) {
          r = parseInt(color.substr(0,2), 16);
          g = parseInt(color.substr(2,2), 16);
          b = parseInt(color.substr(4,2), 16);
        } else if(color.length == 3) {
          r = parseInt(color.substr(0,1)+color.substr(0,1), 16);
          g = parseInt(color.substr(1,1)+color.substr(1,1), 16);
          b = parseInt(color.substr(2,1)+color.substr(2,1), 16);
        } else {
          r = g = b = 255;
        }
    
        erg = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
        return (erg > 0.5) ? '#000000' : '#ffffff';
      }

      if(scope.color) {
        scope.$watch('color', function() {
          element.css('color', getReadableColor(scope.color));  
        });
      } else {
        element.ready(function(){
          element.css('color', getReadableColor(element.css('background-color')));  
        });
      }
    }
  }
});
/* Styles go here */

.blk {
  padding: 10px;
  display: inline-block;
  margin-left: 10px;
  margin-bottom: 10px;
}

input[type=text] {
  border: 1px solid #aaa;
  padding: 2px;
  width: 60px;
}