// Calculateur de prix

var PrixCalc = new Class({
    initialize: function(elTtc, elTauxTva, elHt){
        this._elTtc 	= $(elTtc);
        this._elTauxTva = $(elTauxTva);
        this._elHt		= $(elHt);
        
        if(this._elTtc == null || this._elTauxTva == null || this._elHt == null) 
        	return;
        
        this._elTtc.addEvent('keyup', this._onTtc.bind(this));
        this._elTauxTva.addEvent('click', this._onTauxTva.bind(this));
        this._elTauxTva.addEvent('keyup', this._onTauxTva.bind(this));
        this._elHt.addEvent('keyup', this._onHt.bind(this));
        this._calcprix = 'ht';
        if(this._elTtc.get('readonly')) {
        	this._calcprix = 'ttc';
        }
    },
    _onTtc: function() {    	
    	this._calc();
    },
    _onTauxTva: function() {
    	this._calc();
    },
    _onHt: function() {
    	this._calc();
    },
    _calc: function() {    	
    	if(this._calcprix == 'ht') {
   			this._calcHt();
    	} else {
    		this._calcTtc();
    	}
    },
    _calcHt: function() {
    	ttc = this._elTtc.value.replace(',','.').toFloat();
    	tauxtva = this._elTauxTva.value.replace(',','.').toFloat();

    	if(isNaN(ttc) || isNaN(tauxtva)) {
    		ht = 0;
    	} else {
    		ht = ttc / (tauxtva / 100 + 1);
    	}
    	this._elHt.value = ht.round(2);
    },
    _calcTtc: function() {
    	ht = this._elHt.value.replace(',','.').toFloat();
    	tauxtva = this._elTauxTva.value.replace(',','.').toFloat();

    	if(isNaN(ht) || isNaN(tauxtva)) {
    		ttc = 0;
    	} else {
    		ttc = ht * (tauxtva / 100 + 1);
    	}
    	this._elTtc.value = ttc.round(2);
    }
});

var FormImg = new Class();
FormImg.remove = function(prefix, name) {
	el = $(prefix + name);
	if(el == null) return;
	
	var input = new Element('input', {
	    'type': 'hidden',
	    'name': name + '_del',
	    'value': '1'
	});
	input.inject(el, 'before');
	
	el.dispose();
}

var surface_cloneline = function(suprow) {
	el = $('modelline');
	
	if(suprow == 1) {
		removeClass = (el.getParent().getElements('TR').length / 2) % 2 == 0;
	} else {
		removeClass = el.getParent().getElements('TR').length % 2 != 0;
	}
	
	elClone = el.clone();
	elLastRow = el.getParent().getLast();
	elClone.inject(elLastRow, 'after');
	elClone.clearInputChilds().clearSelectChilds();
	elClone.getElements('.prix').set('text', '-');
	if(removeClass) {
		elClone.removeClass('pairline');
	}
	
	if(suprow == 1) {
		el = el.getNext();
		elClone = el.clone();
		elLastRow = el.getParent().getLast();
		elClone.inject(elLastRow, 'after');
		elClone.clearInputChilds().clearSelectChilds();
		elClone.getElements('.prix').set('text', '-');
		if(removeClass) {
			elClone.removeClass('pairline');
		}
	}
}

var surface_calcline = function(el, suprow) {	
	if(!jsondata)return;

	row = $(el).getParent('tr');
	inputs = row.getElements('INPUT');
	selects = row.getElements('SELECT');
	prixels  = row.getElements('.prix');
		
	if(suprow == -1) {
		row = row.getPrevious();
		inputs.combine(row.getElements('INPUT'));
		selects.combine(row.getElements('SELECT'));
		prixels.combine(row.getElements('.prix'));
	}
	if(suprow == 1) {
		row = row.getNext();
		inputs.combine(row.getElements('INPUT'));
		selects.combine(row.getElements('SELECT'));
		prixels.combine(row.getElements('.prix'));
	}
	
	if(prixels.length == 0)return;
	prixel = prixels[0];
	
	arrprix = new Hash(jsondata.optionsprix);
	
	val = Form.Validator.getValidator('validate-numeric');
	valEmpty = Form.Validator.getValidator('IsEmpty');
	failed = false;
	
	inputs.each(function(input) {
		if(val.test(input)) {
			input.removeClass('validation-failed');
			if(valEmpty.test(input)) failed = true;
		} else {
			input.addClass('validation-failed');
			failed = true;
		}
	});
	
	if(failed) {
		prixel.set('text', '-');
		return;
	} else {
		long = inputs[0].value.replace(',','.').toFloat();
		if(long < jsondata.longmin || long > jsondata.longmax) {
			inputs[0].addClass('validation-failed');
			failed = true;
		}
		larg = inputs[1].value.replace(',','.').toFloat();
		if(larg < jsondata.largmin || larg > jsondata.largmax) {
			inputs[1].addClass('validation-failed');
			failed = true;
		}
		if(failed) {
			prixel.set('text', '-');
			return;
		}
		qte  = inputs[2].value.replace(',','.').toFloat();
		m2 = long * larg / 10000;
		prixunitaire = jsondata.prix * m2;
		selects.each(function(select, index){
			prixdata = arrprix.get(select.value);
		
			switch(prixdata.mode) {
				case "m2":
					prixunitaire += prixdata.prix * m2;
					break;
				case "forfait":
					prixunitaire += prixdata.prix;
					break;
			}
		});			
		prixtotal = prixunitaire * qte;
		prixel.set('text', prixtotal.round(2) + ' € TTC');
	}
}

var lineaire_calcline = function(el, jsondata) {
	data = JSON.decode(jsondata);
	arrprix = new Hash(data.prix);
	row = $(el).getParent().getParent();
	inputs = row.getElements('INPUT');
	select = row.getElement('SELECT'); 
	prixel   = row.getElement('.prix');
	
	val = Form.Validator.getValidator('validate-numeric');
	valEmpty = Form.Validator.getValidator('IsEmpty');
	failed = false;
	
	inputs.each(function(input) {
		if(val.test(input)) {
			input.removeClass('validation-failed');
			if(valEmpty.test(input)) failed = true;
		} else {
			input.addClass('validation-failed');
			failed = true;
		}
	});
	
	if(failed) {
		prixel.set('text', '-');
		return;
	} else {
		long = inputs[0].value.replace(',','.').toFloat();
		if(long < data.longmin || long > data.longmax) {
			inputs[0].addClass('validation-failed');
			failed = true;
		}
		if(failed) {
			prixel.set('text', '-');
			return;
		}
		qte  = inputs[1].value.replace(',','.').toFloat();
		m = long / 100;
		prixunitaire = arrprix.get(select.value);
		prixtotal	 = prixunitaire * m * qte;
		prixel.set('text', prixtotal.round(2) + ' € TTC');
	}
}
