Blue Hawaii

a js solution

by ItsLeeOwen

HTML

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
<script src="http://code.angularjs.org/1.1.5/angular-resource.min.js"></script>
<script src="http://underscorejs.org/underscore-min.js"></script>
<a href="http://www.puzzlenode.com/puzzles/7-blue-hawaii">Blue Hawaii</a>
<hr />
<puzzlenode-bluehawaii>
    <div ng-repeat="rental in rentals">{{rental.name}}: {{rental.quote}}</div>
</puzzlenode-bluehawaii>

JavaScript

/// DISCLAIMER:  Browser Date implementations differ greatly between browsers
/// this was written for Chrome 27.0.1453.116; 
/// mileage may vary depending on the browser.
angular.module('app', ['ngResource']).directive('puzzlenodeBluehawaii', function() { return {
    restrict: 'E', 
    controller: function($scope, $http, $resource) {
        var inputUrl = 'https://dl.dropboxusercontent.com/u/7218835/codernight/bluehawaii/input.txt',
            rentalsUrl = 'https://dl.dropboxusercontent.com/u/7218835/codernight/bluehawaii/vacation_rentals.json';

        // get input values & set on $scope
        $http.get(inputUrl).success(function(response) {
            var range = response.split(' - ');
            var start = new Date(Date.parse(range[0])),
                end = new Date(Date.parse(range[1])); 
            $scope.requested = {
                start: {
                    date: start,
                    time: start.getTime(),
                    year: start.getFullYear()
                }, end: {
                    date: end,
                    time: end.getTime(),
                    year: end.getFullYear()
                }
            }
        });
        
        // when $scope.requested is set then get & parse rental data
        var unregisterWatch = $scope.$watch('requested', function(value) {
            if (value) {
                unregisterWatch();
                $scope.rentals = $resource(rentalsUrl).query(function() {                        
                    _.each($scope.rentals, function(rental) {
                        // cost + cleaning
                        var cost = _.isUndefined(rental['cleaning fee']) 
                            ? 0 
                            : parseInt(rental['cleaning fee'].substring(1));
                        
                        // add seasonal nightly rates
                        if (rental.seasons) {                            
                            // season model seems clumbsy,...