var BuyOrder = {


	options: [],
	optionString: '',
	offerAdviceTemplate: new Template('(You have enough free balance to bid up to £#{amount} for #{qty} contracts)'),
	qtyAdviceTemplate: new Template('(You have enough free balance to order to #{qty} contracts at £#{amount})'),
	
	initialiseOptions: function() {
		this.options = [];
		this.optionString = '';
	},

	calculateMaxQty: function(offer, balance) {
		return Math.floor(balance / offer);
	},
	
	calculateMaxOffer: function(qty, balance) {
		return (balance / qty).toFixed(2);
	},
	
	updateOptions: function(el, qtyElem, balance, qtyAdviceElem) {
		//	get selected option		
		var selectedOption = $F(qtyElem);

		//	assign options to qtyElem
		var maxQty = this.calculateMaxQty($F(el), balance);
		this.generateOptions(maxQty, selectedOption);
		$(qtyElem).update(this.optionString);
		
		var data = {
				qty: maxQty, 
				amount: $F(el)
			};
		$(qtyAdviceElem).update(this.qtyAdviceTemplate.evaluate(data));
		//	set selected option

		qtyElem.selectedIndex = selectedOption;

	},
	
	updateMaxOffer: function(el, offerAdviceElem, balance) {
		
		var selectedQty = $F(el);
		if(selectedQty) {

			var data = {
				qty: selectedQty, 
				amount: BuyOrder.calculateMaxOffer(selectedQty, balance)
			};

			$(offerAdviceElem).update(this.offerAdviceTemplate.evaluate(data));
		} else {
			offerAdviceElem.innerHTML = ('');
		}
	},

	
	generateOptions: function(maxQty, selectedIndex) {
		this.initialiseOptions();
		//	create an array of options from 1 to maxQty and assign it to this.options
		if (maxQty != "Infinity") {
			for(var i = 0, optionString = ''; i <= maxQty; i++) {
				this.optionString += '<option '+(i==selectedIndex ? 'selected="selected" ' : '' )+'value="' + (i == 0 ? '' : i) + '">' + (i == 0 ? '' : i) + '</option>';
			}
		}
	},

	checkParams: function(qtyElem, qtyAdviceElem, offerElem, offerAdviceElem, balance, availContracts) {
		//	Validation rules:
		//	Warn when there are more orders than contracts you don't own
		//	Cannot order more than you have money to spend
		//	Greater than xero offer
		//	Greater than zero qty
		var success = true;
		if($F(qtyElem) < 1) {
			$(qtyAdviceElem).update('<span style="color: red">You must choose to order at least one contract</span>');
			success = false;
		}
		if($F(offerElem) <= 0) {
			$(offerAdviceElem).update('<span style="color: red">You must offer at least a penny!</span>');
			success = false;
		}
		if($F(offerElem) * $F(qtyElem) > balance) {
			$(offerAdviceElem).update('<span style="color: red">You don\'t have enough free balance to make this order. Either reduce your offer or reduce the number of contracts you are ordering</span>');
			success = false;
		}
		return success;
	}

};


Serializers = {
	input: function(element) {
		switch (element.type.toLowerCase()) {
			case 'checkbox':
			case 'radio':
				return Serializers.inputSelector(element);
			default:
			return Serializers.textarea(element);
		}
	},
 
	inputSelector: function(element) {
		return element.checked ? element.value : null;
	},

	textarea: function(element) {
		return element.value;
	},

	select: function(element) {
		return this[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element);
	},

	selectOne: function(element) {
		var index = element.selectedIndex;
		return index >= 0 ? this.optionValue(element.options[index]) : null;
	},

	selectMany: function(element) {
		var values, length = element.length;
		if (!length) return null;

		for (var i = 0, values = []; i < length; i++) {
			var opt = element.options[i];
			if (opt.selected) values.push(this.optionValue(opt));
		}
		return values;
	},
 
	optionValue: function(opt) {
		// extend element because hasAttribute may not be native
		return $(opt).readAttribute('value') ? opt.value : opt.text;
	}
}
