var functions = (function() {
	// means of travel function
	var dist = function(km, factor) {
		if (!parseInt(km)) {
			return 0;
		}
		return km * factor;
	}
	// accommodation function
	var nights = function(number, factor) {
		if (!parseInt(number)) {
			return 0;
		}
		return number * factor;
	}
	// activities function
	// options: 1: every day, 2: sometimes, 3: seldom, 4: never
	var activities = function(option, factor) {
		switch (option) {
		case 'activities.1':
			return factor * duration; // duration has been set in form
		case 'activities.2':
			return factor * duration * 0.3;
		case 'activities.3':
			return factor;
		case 'activities.4':
			return 0;
		}
	}
	// food function
	// otions: 1=vegetarian, 2=mostly vegetarian, 3=3-4 times meat per week,
	// 4=meat every day, 5=everything, 6=unknown
	var food = function(option) {
		switch (option) {
		case 'food.1':
			return 0.822 * duration;
		case 'food.2':
			return 1.644 * duration;
		case 'food.3':
			return 3.288 * duration;
		case 'food.4':
			return 4.932 * duration;
		case 'food.5':
			return 8.219 * duration;
		case 'food.6':
			return 0; // TODO: is this correct?
		}

	}
	return {
		// means of travel
		FLIGHT : function(kilo) {
			return kilo;
		},
		TRAIN : function(km) {
			return dist(km, 0.068);
		},
		BUS : function(km) {
			return dist(km, 0.043);
		},
		VAN : function(km) {
			return dist(km, 0.128);
		},
		CAR : function(km) {
			return dist(km, 0.181);
		},
		CAR_TOGETHER : function(km) {
			return dist(km, 0.09);
		},
		FERRY : function(km) {
			return dist(km, 0.125);
		},
		BIKE : function(km) {
			return dist(km, 0.004);
		},
		// means of travel local
		TRAIN_LOCAL : function(km) {
			return dist(km, 0.068);
		},
		BUS_LOCAL : function(km) {
			return dist(km, 0.043);
		},
		VAN_LOCAL : function(km) {
			return dist(km, 0.128);
		},
		CAR_LOCAL : function(km) {
			return dist(km, 0.181);
		},
		CAR_TOGETHER_LOCAL : function(km) {
			return dist(km, 0.09);
		},
		FERRY_LOCAL : function(km) {
			return dist(km, 0.125);
		},
		BIKE_LOCAL : function(km) {
			return dist(km, 0.004);
		},
		DINGHY_LOCAL : function(km) {
			return dist(km, 0); // TODO: is this correct?
		},
		ON_FOOT_LOCAL : function(km) {
			return dist(km, 0);// TODO: is this correct?
		},
		// accommodation
		GUESTHOUSE : function(n) {
			return nights(n, 25.35);
		},
		CAMPING : function(n) {
			return nights(n, 7.25);
		},
		SAILBOAT : function(n) {
			return nights(n, 2.78);
		},
		OPEN_AIR : function(n) {
			return nights(n, 0); // TODO: is this correct?
		},
		HOTEL : function(n) {
			return nights(n, 42.36);
		},
		HOTEL_WITH_POOL : function(n) {
			return nights(n, 36.69);
		},
		HOST_FAMILY : function(n) {
			return nights(n, 11.4);
		},
		CRUISE_SHIP : function(n) {
			return nights(n, 174.0);
		},
		// activities
		BATHING_OPEN_AIR_POOL : function(n) {
			return activities(n, 0.979);
		},
		BATHING_SEA : function(n) {
			return activities(n, 0);
		},
		BATHING_INDOOR_POOL : function(n) {
			return activities(n, 3.989);
		},
		OUTDOOR_ADVENTURE : function(n) {
			return activities(n, 0);
		},
		OUTDOOR_ACTIVITIES : function(n) {
			return activities(n, 0);
		},
		INDOOR_ACTIVITIES : function(n) {
			return activities(n, 0.172);
		},
		SIGHTSEEING : function(n) {
			return activities(n, 1.629);
		},
		VISITING_ZOO : function(n) {
			return activities(n, 2.87);
		},
		SKIING : function(n) {
			return activities(n, 12.92);
		},
		DISCO : function(n) {
			return activities(n, 5.873);
		},
		FESTIVAL : function(n) {
			return activities(n, 16.286);
		},
		THEME_PARK : function(n) {
			return activities(n, 8.515);
		},
		WATERSPORTS_NO_MOTOR : function(n) {
			return activities(n, 1.288);
		},
		WATERSPORTS_MOTOR : function(n) {
			return activities(n, 3.915);
		},
		MOTORSPORTS : function(n) {
			return activities(n, 2.012);
		},
		// food
		FOOD : function(n) {
			return food(n);
		}
	};
})();
