Module = Class.create({
	initialize: function(calculator) {
		this.calculator = calculator;
		this.fee = {
			client: {'in': 0, out: 0}, 
			store: {'in': 0, out: 0} 
		};
		this.limit = {
			client: {
				'in': {min: null, max: null},
				out: {min: null, max: null}
			}, 
			store: {
				'in': {min: null, max: null},
				out: {min: null, max: null}
			} 
		};
		this.id = Math.random();
	},
	update: function(fee, limit) {
		Object.extend(this.fee, fee);
		Object.extend(this.limit, limit);
	},
	bindFrom: function() {
		$(this.calculator.frm.elements.sum_in).observe('blur', this.calculateSumInPs.bindAsEventListener(this));
		$(this.calculator.frm.elements.sum_in).observe('x:change', this.calculateSumInPs.bindAsEventListener(this));
	},
	bindFromPs: function() {
		if ($('sum-in-ps')) {
			$('sum-in-ps').observe('blur', this.calculateSumIn.bindAsEventListener(this));
		}
	},
	bindTo: function() {
		$(this.calculator.frm.elements.sum_out).observe('blur', this.calculateSumOutPs.bindAsEventListener(this));
		$(this.calculator.frm.elements.sum_out).observe('x:change', this.calculateSumOutPs.bindAsEventListener(this));
	},
	bindToPs: function() {
		if ($('sum-out-ps')) {
			$('sum-out-ps').observe('blur', this.calculateSumOut.bindAsEventListener(this));
		}
	},
	calculateComiss: function(scope, dir, sum) {
		var cms = (sum*this.fee[scope][dir]).ceil()/100;
		if (this.limit[scope][dir].min != null) {
			cms = Math.max(this.limit[scope][dir].min, cms);
		}
		if (this.limit[scope][dir].max != null) {
			cms = Math.min(this.limit[scope][dir].max, cms);
		}		
		return cms;
	},
	getAvailableSum: function(scope, sum) {
		if (sum == 0) {
			return 0;
		}
		var avg = (sum/(1+this.fee[scope].out/100)*100).round()/100;
		var avail = sum - this.calculateComiss(scope, 'out', avg);
		return (avail*100).floor() / 100;
	},
	getOutgoingSum: function(scope, sum) {
		if (sum == 0) {
			return 0;
		}
		var avg = (sum/(1-this.fee[scope]['in']/100)*100).round()/100;
		var avail = sum + this.calculateComiss(scope, 'in', avg);
		return (avail*100).ceil() / 100;
	},
	calculateSumInPs: function() {
		if (!$('sum-in-ps')) {
			return;
		}
		var val = this.calculator.frm.elements.sum_in.value;
		val = Number(val)+this.calculateComiss('client', 'out', val);
		$('sum-in-ps').value = String(val).toFloat(2);
	},
	calculateSumIn: function() {
		var fld = $('sum-in-ps');
		fld.value = fld.value.toFloat(2);
		var sum = (fld.value/(1+this.fee.client.out/100)*100).round()/100;
		sum = Number(fld.value)-this.calculateComiss('client', 'out', sum);
		this.calculator.changeSum(sum, 'in', 'calcpsin');
	},
	calculateSumOutPs: function(e) {
		if (!$('sum-out-ps')) {
			return;
		}
		var id = this.id;
		var val = this.calculator.frm.elements.sum_out.value;
		val = Number(val)-this.calculateComiss('client', 'in', val);
		$('sum-out-ps').value = String(val).toFloat(2);
	},
	calculateSumOut: function() {
		var fld = $('sum-out-ps');
		fld.value = fld.value.toFloat(2);
		var sum = (fld.value/(1-this.fee.client['in']/100)*100).round()/100;
		sum = Number(fld.value)+this.calculateComiss('client', 'in', sum);
		this.calculator.changeSum(sum, 'out', 'calcpsout');
	}
});
