//currently this code relies on javascript arrays dynamically created in the adcostJS.ctp view element.
function initAC() {
	ac = new AdcostController();
}


var AdcostController = Class.create();
AdcostController.prototype = {
	initialize: function() {
		this.view = view; //from adcostJS.ctp
		this.adcostTable = $('adcost');
		this.hideTable.bind(this);
		this.showTable.bind(this);
		this.setWeeks.bind(this);
		this.calcCost.bind(this);
		
		if($$('.deletedates')) {
			var deldateBoxes = $$('.deletedates');
			for(var d = 0; d < deldateBoxes.length; d++) {
				deldateBoxes[d].observe('change', this.calcCost.bind(this));
			}
		}
		if(parseInt(TopPlacements.enabled)) {
			if($$('.tpdates')) {
				var tpdateBoxes = $$('.tpdates');
				for(var t = 0; t < tpdateBoxes.length; t++) {
					tpdateBoxes[t].observe('change', this.calcCost.bind(this));
				}
			}
		}
		
		
		// if(!Object.isUndefined(this.catID)) {
		// 			this.weeklyRate = wklyrates[catrates[this.catID].rate_id].rate;
		// 			this.weeklyRateName = wklyrates[catrates[this.catID].rate_id].name;
		// 			this.category = catrates[this.catID].name;
		// 			this.parentCat = catrates[this.catID].parent;
		// 		}
		
	},
	
	hideTable: function() {
		Effect.BlindUp(this.adcostTable, { duration: 0.5 });
	},
	
	showTable: function() {
		Effect.BlindDown(this.adcostTable, { delay: 0.5, duration: 0.5 });
	},
	
	calcCost: function() {
		//clean slate
		this.totalCost = 0;  
		this.totalImageCosts = 0;
		this.tpWeeks = 0;
		this.tpCost = 0;
		this.isRts = false;
		this.discountMultiplier = 1;
		this.discountWeeks = 0;
		this.imageCosts = {};
		this.hasImages = this.checkForImages();
		
		//these first properties are common to print and online calculations
		this.boldRate = boldRate; //from adcostJS.ctp
		this.over25Rate = over25Rate; //from adcostJS.ctp
		this.hotlinkRate = hotlinkRate; //from adcostJS.ctp
		this.tpRate = TopPlacements.rate; //from adcostJS.ctp
		this.wordcount = $F('ClassifiedAdBillWordCount');
		this.boldcount = $F('ClassifiedAdBillBoldCount');
		this.ovr25count = $F('ClassifiedAdBillOver25Count');
		this.hotlinkCount = $F('ClassifiedAdBillHotlinkCount');
		this.setWeeks();
		this.ooType = $('ClassifiedAdBillOnlineOnly').readAttribute('type');
		if(this.ooType == 'checkbox') {
			this.onlineOnly = $('ClassifiedAdBillOnlineOnly').checked;
		} else {
			this.onlineOnly = parseInt($F('ClassifiedAdBillOnlineOnly'));
		}
		if(this.view == 'edit') this.applyWeekEdits();
		this.applyDiscounts();
		if(parseInt(RunTillSold.enabled)) {
			if($('ClassifiedAdBillIsRts')) {
				this.rtsType = $('ClassifiedAdBillIsRts').readAttribute('type');
				if(this.rtsType == 'checkbox') {
					this.isRts = $('ClassifiedAdBillIsRts').checked;
				} else {
					this.isRts = parseInt($F('ClassifiedAdBillIsRts'));
				}
				if(this.isRts) {
					this.upsellWeeks = RunTillSold.upsellWeeks;
					this.billableWeeks = RunTillSold.billedWeeks;
					this.totalWeeks = RunTillSold.totalWeeks;
					this.discountMultiplier = 1;  //BulkDiscount and RunTillSold are mutually exclusive
					this.discountWeeks = this.totalWeeks - this.billableWeeks;
				}
			}
		}
		
		if(parseInt(TopPlacements.enabled)) {
			this.applyTopPlacements();
		}
		
		this.catID = $F('ClassifiedAdClassifiedChildCatId');
		if(catrates[this.catID] != undefined) {
			this.category = catrates[this.catID].name;
			this.parentCat = catrates[this.catID].parent;
		} else {
			this.category = 'Subcategory';
			this.parentCat = 'Main Category';
		}
		
		
		//calculate common elements
		if(this.hasImages) {
			this.imageCosts.firstImageFee = this.imageCosts.firstImageCount * this.imageCosts.firstImageRate * this.upsellWeeks;
			this.imageCosts.extraImageFee = this.imageCosts.extraImageCount * this.imageCosts.extraImageRate * this.upsellWeeks;
			this.totalImageCosts = this.imageCosts.firstImageFee + this.imageCosts.extraImageFee;
		} 
		this.boldTotal = this.boldcount * this.boldRate * this.upsellWeeks;
		this.over25Total = this.ovr25count * this.over25Rate * this.upsellWeeks;
		this.hotlinkTotal = this.hotlinkCount * this.hotlinkRate * this.upsellWeeks;
		
		
		
		if(this.onlineOnly) {
			this.calcOnlineOnlyCost();
		} else {
			this.styleID = $F('ClassifiedAdBillAdStyleId');
			if(catrates[this.catID] != undefined) {
				this.weeklyRate = wklyrates[catrates[this.catID].rate_id].rate;
				this.weeklyRateId = wklyrates[catrates[this.catID].rate_id].id;
				$('weekly_rate_id_field').value = this.weeklyRateId;
				this.weeklyRateName = wklyrates[catrates[this.catID].rate_id].name;
			} else {
				this.weeklyRate = 0;
				this.weeklyRateId = 0;
				$('weekly_rate_id_field').value = this.weeklyRateId;
				this.weeklyRateName = 'None';
			}
			this.borderRate = adstyles[this.styleID].rate; //adstyles is created dynamically in adcostJS.ctp
			this.borderName = adstyles[this.styleID].name;
			
			this.borderTotal = this.borderRate * this.upsellWeeks;
			this.wklyRateTotal = this.weeklyRate * this.billableWeeks;
			

			this.totalCost = (this.borderTotal + this.wklyRateTotal + this.boldTotal + this.over25Total + this.hotlinkTotal + this.totalImageCosts + this.tpCost) * this.discountMultiplier;
			
		}
		this.populateView();
	},
	
	calcOnlineOnlyCost: function() {
		this.onlineRate = this.getOnlineRate();
		this.weeklyRate = this.onlineRate.rate;
		this.weeklyRateId = this.onlineRate.id;
		$('weekly_rate_id_field').value = this.weeklyRateId;
		this.weeklyRateName = this.onlineRate.name;
		
		this.wklyRateTotal = this.weeklyRate * this.billableWeeks;
		this.totalCost = (this.wklyRateTotal + this.boldTotal + this.over25Total + this.totalImageCosts + this.hotlinkTotal + this.tpCost) * this.discountMultiplier;
	},
	
	checkForImages: function() {
		if($('ClassifiedAdBillFirstImageCount')) {
			this.imageCosts = { 
				firstImageRate: $F('ClassifiedAdBillFirstImageRate'),  //TODO set/get from adcostJS.ctp
				firstImageCount: parseInt($F('ClassifiedAdBillFirstImageCount')),
				firstImageFee: $F('ClassifiedAdBillFirstImageFee'),
				extraImageRate: $F('ClassifiedAdBillExtraImageRate'),
				extraImageCount: parseInt($F('ClassifiedAdBillExtraImageCount')),
				extraImageFee: $F('ClassifiedAdBillExtraImageCount')
			};
			if(this.imageCosts.firstImageCount) {
				return true;
			}
		}
		return false;
	},
	
	setWeeks: function() {
		if($('ClassifiedAdBillTotalWeeks')) {
			if(!isNaN(parseInt($F('ClassifiedAdBillTotalWeeks')))) {
				this.totalWeeks = $F('ClassifiedAdBillTotalWeeks');
			} else {
				this.totalWeeks = 1;
				$('ClassifiedAdBillTotalWeeks').value = 1;
			} 
		} else {
			this.totalWeeks = 1;
		}
		//since all discounts will be calculated after this, we are setting billableWeeks = totalWeeks
		this.billableWeeks = this.totalWeeks;
		// if($('ClassifiedAdBillBillableWeeks')) {
		// 			if(!isNaN(parseInt($F('ClassifiedAdBillBillableWeeks')))) {
		// 				this.billableWeeks = $F('ClassifiedAdBillBillableWeeks');
		// 			} else {
		// 				this.billableWeeks = this.totalWeeks;
		// 				$('ClassifiedAdBillBillableWeeks').value = this.totalWeeks;
		// 			}
		// 		} else {
		// 			this.billableWeeks = this.totalWeeks;
		// 		}
		
	},
	
	getOnlineRate: function() {
		for (var i = 1; i < wklyrates.length; i++) {
			if(wklyrates[i].name == 'Online') {
				return wklyrates[i];
			}
		}
	},
	
	applyTopPlacements: function() {
		if($$('.tpdates').length) {
			var tpdateBoxes = $$('.tpdates');
			var tpdateTotal = 0;
			for(var t = 0; t < tpdateBoxes.length; t++) {
				if(tpdateBoxes[t].checked) {
					tpdateTotal++;
				}
			}
			this.tpWeeks = tpdateTotal;
		} else if ($('ClassifiedAdBillTopPlacementCount')) {
			this.tpWeeks = parseInt($F('ClassifiedAdBillTopPlacementCount'));
		}
		this.tpCost = this.tpRate * this.tpWeeks;
	},
	
	applyWeekEdits: function() {
		if(this.onlineOnly) {
			var userTotalWeeks = parseInt($('ClassifiedAdBillUserTotalWeeks').value);
			if(userTotalWeeks != this.totalWeeks) {
				console.log('userTotalWeeks is different');
				this.totalWeeks = userTotalWeeks;
			}
		} else {
			if($$('.deletedates')) {
				var deldateBoxes = $$('.deletedates');
				var delTotal = 0;
				for(var d = 0; d < deldateBoxes.length; d++) {
					if(deldateBoxes[d].checked) {
						delTotal++;
					}
				}
				this.totalWeeks = parseInt(this.totalWeeks) - parseInt(delTotal);
			}
			if($('ClassifiedAdWeeksToAdd')) {
				if($F('ClassifiedAdWeeksToAdd')) {
					this.totalWeeks = parseInt(this.totalWeeks) + parseInt($F('ClassifiedAdWeeksToAdd'));
				}
			}
		}
		
	},
	
	applyDiscounts: function() {
		if(parseInt(BulkDiscount.enabled)) {
			if(this.totalWeeks >= BulkDiscount.minWeeks) {
				this.discountMultiplier = BulkDiscount.rate;
			}
		}
		
		this.upsellWeeks = this.totalWeeks;
		
		if(parseInt(FreeWeek.enabled)) {
			this.discountWeeks = Math.floor((this.totalWeeks/FreeWeek.divisor)); 
			this.billableWeeks = this.totalWeeks - this.discountWeeks;
		}
		
	},
	
	populateView: function() {
		if(parseInt(this.boldcount) == 1) {
			this.boldUnit = ' word';
		} else {
			this.boldUnit = ' words';
		}
		if(parseInt(this.boldcount) == 0) {
			$('adcostBold').hide();
		} else {
			$('adcostBold').show();
		}
		
		if(parseInt(this.ovr25count) == 1) {
			this.ovr25Unit = ' word';
		} else {
			this.ovr25Unit = ' words';
		}
		if(parseInt(this.ovr25count) == 0) {
			$('adcostOvr25').hide();
		} else {
			$('adcostOvr25').show();
		}
		
		if(parseInt(this.hotlinkCount) == 1) {
			this.hotlinkUnit = ' link';
		} else {
			this.hotlinkUnit = ' links';
		}
		if(parseInt(this.hotlinkCount) == 0) {
			$('adcostHotlinks').hide();
		} else {
			$('adcostHotlinks').show();
		}
		
		if(this.billableWeeks > 1) {
			this.weekUnit = ' weeks';
		} else {
			this.weekUnit = ' week';
		}
		
		if(this.tpWeeks == 1) {
			this.tpweekUnit = ' week';
		} else {
			this.tpweekUnit = ' weeks';
		}
		if(this.tpWeeks == 0) {
			$('adcostTP').hide();
		} else {
			$('adcostTP').show();
		}
		
		if(this.hasImages) {
			$('adcostFirstImg').show();
			if(this.imageCosts.extraImageCount > 1) {
				this.imageUnit = ' images';
			} else {
				this.imageUnit = ' image';
			}
			if(this.imageCosts.extraImageCount > 0) {
				$('adcostExtraImg').show();
			} else {
				$('adcostExtraImg').hide();
			}
		} else {
			$('adcostFirstImg').hide();
			$('adcostExtraImg').hide();
		}
		
		if(this.discountWeeks == 1) {
			this.discountWeeksUnit = ' week';
		} else {
			this.discountWeeksUnit = ' weeks';
		}
		
		if(this.view == 'edit') $('totalweeks_span').innerHTML = this.totalWeeks+this.weekUnit;
		$('weeksToRun').innerHTML = 'Your ad is set to run for '+this.totalWeeks+this.weekUnit;
		$('ClassifiedAdBillBillableWeeks').value = this.billableWeeks;
		$('parentCat').innerHTML = this.parentCat+'  --> ';
		if($('online_parent_cat'))
			$('online_parent_cat').innerHTML = this.parentCat;
		$('childCat').innerHTML = this.category;
		if($('online_child_cat'))
			$('online_child_cat').innerHTML = this.category;
		$('perweekrate').innerHTML = '$'+parseFloat(this.weeklyRate).toFixed(2)+' per week';
		if(this.discountWeeks) {
			$('totalWeeks').innerHTML = this.billableWeeks+this.weekUnit+' (discounted '+this.discountWeeks+this.discountWeeksUnit+')';
		} else {
			$('totalWeeks').innerHTML = this.billableWeeks+this.weekUnit;
		}
		$('adRateTotal').innerHTML = '$'+parseFloat(this.wklyRateTotal).toFixed(2);
		$('tpCount').innerHTML = this.tpWeeks+this.tpweekUnit;
		$('tpTotal').innerHTML = '$'+parseFloat(this.tpCost).toFixed(2);
		$('boldRate').innerHTML = '$'+parseFloat(this.boldRate).toFixed(2)+' per word per week';
		$('boldCount').innerHTML = this.boldcount+this.boldUnit+' x '+this.upsellWeeks+this.weekUnit;
		$('boldTotal').innerHTML = '$'+parseFloat(this.boldTotal).toFixed(2);
		$('over25Rate').innerHTML = '$'+parseFloat(this.over25Rate).toFixed(2)+' per word per week';
		$('over25Count').innerHTML = this.ovr25count+this.ovr25Unit+' x '+this.upsellWeeks+this.weekUnit;
		$('over25Total').innerHTML = '$'+parseFloat(this.over25Total).toFixed(2);
		if(this.onlineOnly) {
			$('borderStyle').innerHTML = 'n/a';
			$('borderRate').innerHTML = 'n/a';
			$('borderTotal').innerHTML = 'n/a';
			$('borderCount').innerHTML = 'n/a';
		} else {
			$('borderStyle').innerHTML = this.borderName;
			$('borderRate').innerHTML = '$'+parseFloat(this.borderRate).toFixed(2)+' per week';
			$('borderTotal').innerHTML = '$'+parseFloat(this.borderTotal).toFixed(2);
			$('borderCount').innerHTML = this.upsellWeeks+this.weekUnit;
		}
		if(this.hasImages) {
			$('firstImageRate').innerHTML = '$'+parseFloat(this.imageCosts.firstImageRate).toFixed(2)+' per week';
			$('firstImageCount').innerHTML = this.imageCosts.firstImageCount+' image x '+this.upsellWeeks+this.weekUnit;
			$('firstImageTotal').innerHTML = '$'+parseFloat(this.imageCosts.firstImageFee).toFixed(2);
			$('extraImageRate').innerHTML = '$'+parseFloat(this.imageCosts.extraImageRate).toFixed(2)+' per week';
			$('extraImageCount').innerHTML = this.imageCosts.extraImageCount+' '+this.imageUnit+' x '+this.upsellWeeks+this.weekUnit;
			$('extraImageTotal').innerHTML = '$'+parseFloat(this.imageCosts.extraImageFee).toFixed(2);
		}
		$('hotlinkRate').innerHTML = '$'+parseFloat(this.hotlinkRate).toFixed(2)+' per link per week';
		$('hotlinkCount').innerHTML = this.hotlinkCount+' '+this.hotlinkUnit+' x '+this.upsellWeeks+this.weekUnit;
		$('hotlinkTotal').innerHTML = '$'+parseFloat(this.hotlinkTotal).toFixed(2);
		
		this.totalCostOut = '$'+parseFloat(this.totalCost).toFixed(2);
		if(parseInt(BulkDiscount.enabled)) {
			if(this.totalWeeks >= 8) {
				if(!this.isRts) {
					this.totalCostOut += ' (15% discount)';
				}
			}
		}
		$('totalCost').innerHTML = this.totalCostOut;
		
		
	}
};