/**
 * @module co2calc
 * @requires jQuery, tbelt, json
*/

(function($j, $tb) {

    /**
    * Household Class Description
    * @namespace co2calc.widget
    * @class Household
    * @extends co2calc.widget.Widget
    */
    co2calc.widget.Household = (function() {

        /**
        * Description.
        * @constructor
        * @param {Object} opts An object whose properties are copied to the Household instance.
        */
        function Household(opts) {
            var I = this;
            co2calc.widget.Widget.apply(I, arguments);

        }

        $j.extend(Household.prototype, co2calc.widget.Widget.prototype,
        {
            name: "Household"

        });

        return Household;

    })();


    /**
    * HouseholdViewQuick Class Description
    * @namespace co2calc.widget
    * @class HouseholdViewQuick
    * @extends co2calc.widget.WidgetView
    */
    co2calc.widget.HouseholdViewQuick = (function() {

        /**
        * Description.
        * @constructor
        * @param {Object} opts An object whose properties are copied to the HouseholdViewQuick instance.
        */
        function HouseholdViewQuick(opts) {
            var I = this;
            co2calc.widget.WidgetView.apply(I, arguments);
            //console.log(I.calculate);
        }

        $j.extend(true, HouseholdViewQuick.prototype, co2calc.widget.WidgetView.prototype,
        {
			name: "Quick",
			
			data:{
				zipCode:new co2calc.widget.WidgetViewDataItem({
					user:function(){return co2calc.zipCode()},
					typical: function() { return co2calc.dataSet.TypicalValues.ZipCode; }	
				}),
				homeType: new co2calc.widget.WidgetViewDataItem({
                    typical: function() { return co2calc.dataSet.TypicalValues.HomeType; }
                }),
                numRooms: new co2calc.widget.WidgetViewDataItem({
                    typical: function(homeType) {
                        if(!homeType) homeType = this.view.data.homeType.user();
						return co2calc.dataSet.TypicalValues[homeType].NumberOfRooms;
                    }
                }),
                numResidents: new co2calc.widget.WidgetViewDataItem({
                    typical: function() {
						return co2calc.dataSet.TypicalValues.NumAdults + (co2calc.dataSet.TypicalValues.NumChildren*.7);
						//return co2calc.dataSet.TypicalValues.HouseholdSize
                    }
                }),
				sqFtPerRoom: new co2calc.widget.WidgetViewDataItem({
					typical:function(homeType){
						if(!homeType)homeType = this.view.data.homeType.user();
						return co2calc.dataSet.TypicalValues[homeType].SqFtPerRoom;
					}
				})
			},
			
			init:function(){
				var I = this;
				co2calc.widget.WidgetView.prototype.init.apply(I, arguments);
				
				
				
			},

            calculate: function(isAverage) {
                var I = this,
					co2Total=0.00;
				
				if(isAverage && I.staticAverage>-1) return I.staticAverage;
				
				try{
					//if all of the text fields are set to nothing, and no checkboxes are checked, the user total is zero
					var isZero=true;
					for(var f=0; f<I.formHandler.fields.length;f++){
						var field = I.formHandler.fields[f],
							element = field.element || field.elements,
							elType = (element[0].type) ? element[0].type.toLowerCase() : null;
						if( element.val()!=null && element.val()!="" ){							
							if(elType!="checkbox" || elType=="checkbox" && !element.filter(":checked").length==0 ){
								//console.log(elType + " : " +element.val());
								isZero=false;
								break;
							}
						}
					}
					if(isZero && !isAverage) return 0;
					
					// Set required variables below
		            var typHomeType = I.data.homeType.typical(),
					typnumRooms = I.data.numRooms.typical(typHomeType),
					typSqFtPerRoom = I.data.sqFtPerRoom.typical(typHomeType),
					typNumResidents = co2calc.dataSet.TypicalValues.NumAdults + (co2calc.dataSet.TypicalValues.NumChildren*.7),
					
					dataHomeType = (isAverage) ? typHomeType : I.data.homeType.user(),
					dataNumRooms = (isAverage) ? typnumRooms : I.data.numRooms.user(),
					dataSqFtPerRoom = (isAverage) ? typSqFtPerRoom : I.data.sqFtPerRoom.user(),
					dataNumResidents = (isAverage) ? typNumResidents : I.data.numResidents.user(),
					
					typeAdj = co2calc.dataSet.Adjustments[dataHomeType].TypeAdj,
					floorAreaAdj = co2calc.dataSet.Adjustments[dataHomeType].FloorAreaAdj,
					occupantAdj = co2calc.dataSet.Adjustments.OccupantAdj;
		            // End of required variables
		            
		            
		            // Get House Type and Floor Area adjustments based on house size
		            
		            // Add House Type Electric Adjustment *** total += (1 + HouseTypeAdj) * Typical Electric CO2
		            co2Total += (1 + typeAdj) * co2calc.dataSet.TypicalValues.ElectricCO2lbs;
		            
		            // Add House Type Heating Fuel Adjustment *** total += (1 + HouseTypeAdj) * Typical Heating Fuel CO2
		            co2Total += (1 + typeAdj) * co2calc.dataSet.TypicalValues.HeatingFuelCO2lbs;
		            
		            // Add Floor Area Adjustment *** total += FloorAreaAdj * (CalculatedSize - (Typical # Rooms * Typical SqFtPerRoom for this House Type))
		            co2Total += floorAreaAdj * ( (dataNumRooms * dataSqFtPerRoom) - (typnumRooms * typSqFtPerRoom) );
		            
		            // Add redidents Adjustment *** total += OccupantAdj * numResidents
		            co2Total += occupantAdj * (dataNumResidents-typNumResidents);
					
					//Convert to tonnes
					if(co2Total<3400) co2Total=3400;
					co2Total = co2calc.toTons(co2Total);
				
				}catch(err){
					trace(I.className+".calculate("+(isAverage||false)+"): "+err);
				};
				
				if(co2Total==null||co2Total==undefined) co2Total = (isAverage) ? I.average : I.total;
				else if(isAverage) I.average = co2Total;
				else I.total=co2Total;
				
				I.jI.trigger(I.className+".calculate", (isAverage||false));	
	           
	            return co2Total;

				
            }
        });

        return HouseholdViewQuick;

    })();



    /**
    * HouseholdViewDetailed Class Description
    * @namespace co2calc.widget
    * @class HouseholdViewDetailed
    * @extends co2calc.widget.WidgetView
    */
    co2calc.widget.HouseholdViewDetailed = (function() {

        /**
        * Description.
        * @constructor
        * @param {Object} opts An object whose properties are copied to the HouseholdViewDetailed instance.
        */
        function HouseholdViewDetailed(opts) {
            var I = this;
			
            co2calc.widget.WidgetView.apply(I, arguments);
            //console.log(I.calculate);
			
        }

        $j.extend(true, HouseholdViewDetailed.prototype, co2calc.widget.WidgetView.prototype,
        {
            name: "Detailed",
			
			/**
			 * Contains all of the data for this widget view.
			 * @property data
			 * @type Object
			 * @default {acType, acDryerRefrigerator, cflLighting, changeFridgeFilters, doublePanedWindows, energyStar, energyStarAppliances, extraFreezer, extraInsulation, extraTVsComputers, heatedPool, heatingFuelType, homeType, hotTub, houseAge, lowerWaterHeaterTemp, lowFlowShowerheads, multipleRefrigerators, numRooms, numChildren, numAdults, numResidents, progThermostat, squareFeet, weatherStripping, zipCode}
			 */
			data:{
				acType: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(homeType){
						return co2calc.dataSet.TypicalValues.ACType;
					}
	            }),
				acDryerRefrigerator: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				cflLighting: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				changeFridgeFilters: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				doublePanedWindows: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				energyStar: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				energyStarAppliances: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				extraFreezer: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				extraInsulation: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				extraTVsComputers: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				heatedPool: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				heatingFuelType: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return co2calc.dataSet.TypicalValues.HeatingFuelType;
					}
	            }),
				homeType: new co2calc.widget.WidgetViewDataItem({	                
					typical: co2calc.widget.HouseholdViewQuick.prototype.data.homeType.typical
	            }),
				hotTub: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				houseAge: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(homeType){
						return co2calc.dataSet.TypicalValues.HouseAge;
					}
	            }),
				lowerWaterHeaterTemp: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				lowFlowShowerheads: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				multipleRefrigerators: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
	            numRooms: new co2calc.widget.WidgetViewDataItem({	                
					typical: co2calc.widget.HouseholdViewQuick.prototype.data.numRooms.typical
	            }),
				numAdults: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return co2calc.dataSet.TypicalValues.NumAdults;
					}
	            }),
				numChildren: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return co2calc.dataSet.TypicalValues.NumChildren;
					}
	            }),
				numResidents: new co2calc.widget.WidgetViewDataItem({	                
					typical: co2calc.widget.HouseholdViewQuick.prototype.data.numResidents.typical
	            }),
				progThermostat: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
	            squareFeet: new co2calc.widget.WidgetViewDataItem({					
					typical: function(homeType, numRooms){
						if (homeType == null) homeType = this.view.data.homeType.typical()
						if (numRooms == null) numRooms = this.view.data.numRooms.typical(homeType);
						return co2calc.dataSet.TypicalValues[homeType].SqFtPerRoom * numRooms;
					}
				}),
				weatherStripping: new co2calc.widget.WidgetViewDataItem({	                
					typical: function(){
						return false;
					}
	            }),
				zipCode:new co2calc.widget.WidgetViewDataItem({					
					user:function(){return co2calc.zipCode()},
					typical: function() { return co2calc.dataSet.TypicalValues.ZipCode; }	
				})
            },	
			
			/**
			 * Initializes the widget.
			 * Employs co2calc.widget.WidgetView.prototype.init.
			 * @method init
			 * @return {HouseholdViewDetailed} This HouseholdViewDetailed instance.
			 */			
			init:function(){
				
				co2calc.widget.WidgetView.prototype.init.apply(this, arguments);			
				
			},

			/**
			 * Calculates the total or average for this view.
			 * @method calculate
			 * @param {boolean} isAverage When true, the typical/default values are used for the calculation, returning the average the current zip code area.
			 * @return {float} The total of the typical or user values.
			 */
            calculate: function(isAverage) {
                var I = this, 
					co2Total=0.00;
					
				if(isAverage && I.staticAverage>-1) return I.staticAverage;
    			
				try{
		            //if all of the text fields are set to nothing, and no checkboxes are checked, the user total is zero
					var isZero=true;
					for(var f=0; f<I.formHandler.fields.length;f++){
						var field = I.formHandler.fields[f],
							element = field.element || field.elements,
							elType = (element[0].type) ? element[0].type.toLowerCase() : null;
						if( element.val()!=null && element.val()!="" ){
							
							if(elType!="checkbox" || elType=="checkbox" && !element.filter(":checked").length==0 ){
								console.log(elType + " : " +element.val());
								isZero=false;
								break;
							}
						}
					}
					if(isZero && !isAverage) return 0;
					
					// Set required variables below
	                var typHomeType = I.data.homeType.typical(),
					dataHomeType = (isAverage) ? typHomeType : I.data.homeType.user(),
					
					typElectricCO2lbs = co2calc.dataSet.TypicalValues.ElectricCO2lbs,
	                typHeatingFuelCO2lbs = co2calc.dataSet.TypicalValues.HeatingFuelCO2lbs,
					typSqFt = I.data.squareFeet.typical(dataHomeType),
					typNumChildren = I.data.numChildren.typical(),
					typNumAdults = I.data.numAdults.typical(),
					typNumResidents = I.data.numResidents.typical(),					
					
	                dataSqFt = (isAverage) ? typSqFt : I.data.squareFeet.user(),
					dataNumAdults = (isAverage) ?  typNumAdults : I.data.numAdults.user(),
	                dataNumChildren = (isAverage) ? typNumChildren : I.data.numChildren.user(),
	                dataNumResidents = dataNumAdults+(dataNumChildren*.7),
	                dataHouseAge = (isAverage) ? I.data.houseAge.typical() : I.data.houseAge.user(),
	                dataACTypeIndex = (isAverage) ? I.data.acType.typical() : I.data.acType.user(),
	                dataHeatingFuelIndex = (isAverage) ? I.data.heatingFuelType.typical() : I.data.heatingFuelType.user(),
					
					typeAdj = co2calc.dataSet.Adjustments[dataHomeType].TypeAdj,
	                floorAreaAdj = co2calc.dataSet.Adjustments[dataHomeType].FloorAreaAdj,
	                occupantAdj = co2calc.dataSet.Adjustments.OccupantAdj;
	                // End of required variables
	                
	                var tempNum1 = 0.00;
	                
	                //+ ProgThermoAdj * “House Square Foot”
					if(I.data.progThermostat.user() || (isAverage && I.data.progThermostat.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.ProgThermostat * dataSqFt;
					
					//+ CFLlghtAdj
	                if(I.data.cflLighting.user() || (isAverage && I.data.cflLighting.typical()))
						co2Total += co2calc.dataSet.Adjustments.CFL;
						
					//+ DHWHeaterEnergySettingAdj * (“NumofAdults”+”NumofChildren” *0.7)
					if(I.data.lowerWaterHeaterTemp.user() || (isAverage && I.data.lowerWaterHeaterTemp.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.WaterHeaterEnergySetting * dataNumResidents;
						
					//+ LowFlowShowerHeads/FaucetsAdj * (“NumofAdults”+”NumofChildren” *0.7)
	                if(I.data.lowFlowShowerheads.user() || (isAverage && I.data.lowFlowShowerheads.typical()))
						co2Total += co2calc.dataSet.Adjustments.LowFlowFixtures * dataNumResidents;
					
					//+ DoublePaneWindowAdj * “House Square Foot”
					if(I.data.doublePanedWindows.user() || (isAverage && I.data.doublePanedWindows.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.DoublePaneWindow * dataSqFt;
					
					//+ WeatherStripAdj * “House Square Foot”
					if(I.data.weatherStripping.user() || (isAverage && I.data.weatherStripping.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.WeatherStrip * dataSqFt;	
					
					//+ ExtraInsulationAdj * “House Square Foot”				
					if(I.data.extraInsulation.user() || (isAverage && I.data.extraInsulation.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.ExtraInsulation * dataSqFt;
						
					//+ MajorApplianceUpgrade
					if(I.data.acDryerRefrigerator.user() || (isAverage && I.data.acDryerRefrigerator.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.MajorApplianceUpgrade;
					
					//+ FrigFilterChangeAdj
					if(I.data.changeFridgeFilters.user() || (isAverage && I.data.changeFridgeFilters.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.FridgeFilterChange;	
					
					//+ EnergyStarHomeAdj * “House Square Foot”
					if(I.data.energyStar.user() || (isAverage && I.data.energyStar.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.EnergyStarHome * dataSqFt;
						
					//+ EnergyStarAppliances
					if(I.data.energyStarAppliances.user() || (isAverage && I.data.energyStarAppliances.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.EnergyStarAppliances;
	            
	                //+ HotTubAdj
					if(I.data.hotTub.user() || (isAverage && I.data.hotTub.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.HotTub;
	            
	                //+ HeatedPoolAdj
					if(I.data.heatedPool.user() || (isAverage && I.data.heatedPool.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.HeatedPool;
						
					//+ MoreTVComputerAdj
					if(I.data.extraTVsComputers.user() || (isAverage && I.data.extraTVsComputers.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.MoreTVComputer;
						
					//+ MoreRefrigAdj
	            	if(I.data.multipleRefrigerators.user() || (isAverage && I.data.multipleRefrigerators.typical()))
						co2Total += co2calc.dataSet.Adjustments.MoreRefrigerators;
						
					//+ ExtraLargeFreezerAdj
					if(I.data.extraFreezer.user() || (isAverage && I.data.extraFreezer.typical()))
	                	co2Total += co2calc.dataSet.Adjustments.ExtraLargeFreezer;
						
					// Get House Type and Floor Area adjustments based on house size
	                
	                // Add House Type Electric Adjustment *** total += (1 + HouseTypeAdj) * Typical Electric CO2
	                co2Total += (1 + typeAdj) * typElectricCO2lbs;
	                
	                // Add House Type Heating Fuel Adjustment *** total += (1 + HouseTypeAdj) * Typical Heating Fuel CO2
	                co2Total += (1 + typeAdj) * typHeatingFuelCO2lbs;
	                
	                // Add Floor Area Adjustment *** total += FloorAreaAdj * (CalculatedSize - (Typical # Rooms * Typical SqFtPerRoom for this House Type))
	                co2Total += floorAreaAdj * ( dataSqFt - typSqFt );
					
					//+ ACTypeAdj’n’ * TypicalHouseElectricCO2
	                co2Total += co2calc.dataSet.Adjustments.AC.double[dataACTypeIndex] * typElectricCO2lbs;
					
					//+ HeatingFuelTypeAdj’n’ * TypicalHouseHeatingFuelCO2
	                co2Total += co2calc.dataSet.Adjustments.HeatingFuel.double[dataHeatingFuelIndex] * typHeatingFuelCO2lbs;
	                
	                //+ HouseAgeAdj’n’ * (TypicalHouseElectricCO2 + TypicalHouseHeatingFuelCO2)
	                if (dataHouseAge > 0 && dataHouseAge <= 3)
	                    tempNum1 = co2calc.dataSet.Adjustments.Age.double[0];
	                else if (dataHouseAge > 3 && dataHouseAge <= 7)
	                    tempNum1 = co2calc.dataSet.Adjustments.Age.double[1];            
	                else if (dataHouseAge > 7 && dataHouseAge <= 16)
	                    tempNum1 = co2calc.dataSet.Adjustments.Age.double[2];            
	                else if (dataHouseAge > 16 && dataHouseAge <= 30)
	                    tempNum1 = co2calc.dataSet.Adjustments.Age.double[3];            
	                else if (dataHouseAge > 30)
	                    tempNum1 = co2calc.dataSet.Adjustments.Age.double[4];            
	
	                co2Total += tempNum1 * ( typElectricCO2lbs + typHeatingFuelCO2lbs);
	                
	                // Add redidents Adjustment *** total += OccupantAdj * numResidents
	                co2Total += occupantAdj * (dataNumResidents-typNumResidents);	                
						
					//Convert to tonnes
					if(co2Total<3400) co2Total=3400;
					co2Total = co2calc.toTons(co2Total);
	            
            	}catch(err){
					trace(I.className+".calculate("+(isAverage||false)+"): "+err);
				};
				
				if(co2Total==null) co2Total = (isAverage) ? I.average : I.total;
				else if(isAverage) I.average = co2Total;
				else I.total=co2Total;
				
				I.jI.trigger(I.className+".calculate", (isAverage||false));	    
            
                return co2Total;

            }
        });

        return HouseholdViewDetailed;

    })();



})(jQuery, tbelt);





