function CatalogForm(arg) {
	var CtgForm = this;

	this.dbg = false;

	this.itv = new Object();
	this.rqt = new Object();
	this.rqt.time = 200;	//	TEMPS AVANT NOUVELLE TENTATIVE

	this.prd = new Object();
	this.prd.prc = new Object();
	this.prd.ofr = new Array();

	this.date = new Object();
	
	this.HTML = new Object();
	this.HTML.slc = new Object();
	this.HTML.spn = new Object();
	this.HTML.ipt = new Object();

	this.init(arg);
}

CatalogForm.prototype.constructor = CatalogForm;

/*	METHODS	*/
CatalogForm.prototype = {
	init: function(arg) {
		var CtgForm = this;
		if(this.dbg) { window.alert('CatalogForm.init()'); }
		
		this.setLang(arg['lang']);
		
		this.rqt.list = null;	//	STOCK LE DERNIER APPEL
		
		this.itv.prc = false;
		this.itv.ofr = false;
		
		this.date.dsbWeekDays = new Object();
		for(i = 0; i < arg['dsb_d'].length; i++) {
			this.date.dsbWeekDays[arg['dsb_d'][i]] = true;
		}
		
		this.date.daysPerMonth	= new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		
		pattern = (arg['date_pattern']) ? arg['date_pattern'] : 'Y-m-d';
		pattern = (pattern.split('-').length > 1) ? pattern.split('-') : pattern.split('/');
		
		this.date.pattern	= new Array();
		this.date.pattern['d'] = pattern[2]; 
		this.date.pattern['m'] = pattern[1]; 
		this.date.pattern['y'] = pattern[0];
		
		this.date.now = new Date();
		
		switch(typeof(arg['date_s'])) {
			case 'string':
			(arg['date_s'] == 'now') ? this.date.s = new Date(this.date.now.getFullYear(),this.date.now.getMonth(),this.date.now.getDate()-1) : new Date(arg['date_s'].split('-')[2],(arg['date_s'].split('-')[1]-1),arg['date_s'].split('-')[0]);
			break;
			case 'object':
			this.date.s = arg['date_s'];
			break;
			default:
			this.date.s = new Date(this.date.now.getFullYear(),this.date.now.getMonth(),(this.date.now.getDate()-1));
			break;
		}
		switch(typeof(arg['date_e'])) {
			case 'string':
			if(arg['date_e'] == 'null') { this.date.e = null; }
			else {
				this.date.e = new Date(arg['date_e'].split('-')[2],(arg['date_e'].split('-')[1]-1),arg['date_e'].split('-')[0]);
			}
			break;
			case 'object':
			this.date.e = arg['date_e'];
			break;
			default:
			this.date.e = null;
			break;
		}
		
		switch(typeof(arg['date_sld'])) {
			case 'object':
			this.date.sld = arg['date_sld'];
			break;
			default:
			case 'string':
			(arg['date_sld'] == 'now' || arg['date_sld'] == undefined) ? this.date.sld = this.date.now : new Date(arg['date_sld'].split('-')[2],(arg['date_sld'].split('-')[1]-1),arg['date_sld'].split('-')[0]);
			break;
		}
		
		this.HTML.slc.d = document.getElementById(arg['slc_d_id']);
		this.HTML.slc.m = document.getElementById(arg['slc_m_id']);
		this.HTML.slc.y = document.getElementById(arg['slc_y_id']);

		
		this.HTML.spn.prc = document.getElementById(arg['spn_prc_id']);
		this.HTML.spn.tot = document.getElementById(arg['spn_tot_id']);
		this.HTML.spn.txt = document.getElementById(arg['spn_txt_id']);
		
		this.HTML.ipt.qty = document.getElementById(arg['ipt_qty_id']);
		
		this.prd.id = arg['prd_id'];
		(arg['prd_prc']) ? this.prd.prc.ini = parseFloat(arg['prd_prc']) : this.getPrc(null);
		(arg['prd_qty']) ? this.prd.qty = parseFloat(arg['prd_qty']) : this.setQty(this.HTML.ipt.qty.value);
		
		this.getOfr(null);
		this.setCal(arg);
		
		Add_Event(window,'load',function() {
			cleanWhiteSpace(CtgForm.HTML.slc.d);	//	SUPPRIME LES NOEUDS INUTILES QUI EMPECHE updSlcOpt
			CtgForm.updSlcOpt(CtgForm.date.sld.getFullYear(),CtgForm.date.sld.getMonth(),CtgForm.date.sld.getDate(),false);
			CtgForm.Cal.fct.upd	= function(y,m,d) { CtgForm.updSlcOpt(y,m,d,true); };
		});
		Add_Event(this.HTML.ipt.qty,'keyup',function() {
			CtgForm.setQty(CtgForm.HTML.ipt.qty.value);
			CtgForm.dspPrc();
		});
		Add_Event(this.HTML.slc.d,'change',function() {
			CtgForm.updSlcOpt(CtgForm.HTML.slc.y.value,addZero(parseInt(parseFloat(CtgForm.HTML.slc.m.value))-1),addZero(parseInt(parseFloat(CtgForm.HTML.slc.d.value))),true);
		});
		Add_Event(this.HTML.slc.m,'change',function() {
			CtgForm.updSlcOpt(CtgForm.HTML.slc.y.value,addZero(parseInt(parseFloat(CtgForm.HTML.slc.m.value))-1),addZero(parseInt(parseFloat(CtgForm.HTML.slc.d.value))),true);
		});
		Add_Event(this.HTML.slc.y,'change',function() {
			CtgForm.updSlcOpt(CtgForm.HTML.slc.y.value,addZero(parseInt(parseFloat(CtgForm.HTML.slc.m.value))-1),addZero(parseInt(parseFloat(CtgForm.HTML.slc.d.value))),true);
		});
	},
	
	ctlOfr: function(date) {
		if(this.dbg) { window.alert('CatalogForm.getOfr('+date+')'); }
		rtn = false;
		for(k = 0; k < this.prd.ofr.length; k++) {
			date_s = this.prd.ofr[k][0].split('-');
			date_e = this.prd.ofr[k][1].split('-');
			date_s = new Date(date_s[0],(date_s[1]-1),date_s[2]);
			date_e = new Date(date_e[0],(date_e[1]-1),date_e[2]);
			if(date_s <= date && date <= date_e) {
				return this.prd.ofr[k];
			}
		}
		day = (date.getDay() != 0) ? date.getDay() : 7;
		if(null != this.date.s && date <= this.date.s) {
			//window.alert('date.s: '+date+' < '+this.date.s);
			rtn = Array(null,null,-(this.prd.prc.ini*10),TLT.dateNotValdid[this.lang]);
		}
		else if(null != this.date.e && date >= this.date.e) {
			//window.alert('date.e: '+date+' >= '+this.date.e);
			rtn = Array(null,null,-(this.prd.prc.ini*10),TLT.dateNotValdid[this.lang]);
		}
		else if(this.date.dsbWeekDays[day]) {
			rtn = Array(null,null,-(this.prd.prc.ini*10),TLT.day.name[this.lang][date.getDay()]+' - '+TLT.closed[this.lang]);
		}
		if(this.dbg) { window.alert('CatalogForm.ctlOfr('+date+')\n\treturn: '+rtn); }
		return rtn;
	},
	
	dspPrc: function() {
		if(this.dbg) { window.alert('CatalogForm.dspPrc()'); }
		this.HTML.spn.prc.innerHTML = this.prd.prc.cur;
		this.HTML.spn.tot.innerHTML = parseFloat(this.prd.qty*this.prd.prc.cur) || 0;
	},
	
	getOfr: function(fct) {
		if(this.dbg) { window.alert('CatalogForm.getOfr('+fct+')\nitv:\n\tofr:'+this.itv.ofr+'\n\tprc:'+this.itv.prc+'\n\nxhr:\n\tlst:'+this.rqt.list); }
		var CtgForm = this;
		var fct;
		if(this.rqt.list == null || this.rqt.list == 'ofr') {
			if(this.itv.ofr != false) {
				window.clearInterval(this.itv.ofr);
				this.itv.ofr = false;
			}
			this.rqt.list = 'ofr';
			this.xhr = getXhr();
			this.xhr.onreadystatechange = function() {
				if(CtgForm.xhr.readyState == 4 && CtgForm.xhr.status == 200) {
					CtgForm.rqt.list = null;
					XMLDoc = CtgForm.xhr.responseXML.documentElement;
					if(XMLDoc.nodeName == 'ofr_lst') {
						ofr = XMLDoc.getElementsByTagName('ofr');
						for(i=0;i<ofr.length;i++) {
							CtgForm.prd.ofr.push(new Array(ofr[i].getAttribute('date_s'),ofr[i].getAttribute('date_e'),ofr[i].getAttribute('val'),ofr[i].getAttribute('txt')));
						}
						if(fct != null) { fct.apply(CtgForm); }
					}
					else if(XMLDoc.nodeName == 'err') {
						if(CtgForm.dbg) { window.alert('err: '+XMLDoc.firstChild.value); }
					}
					return true;
				}
			};
			//soirees-a-paris
			this.xhr.open("POST","/_php/_ajax/catalog_form.ajx.php",true);
			this.xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			this.xhr.send('rqt=ofr&id='+this.prd.id+'&date_s='+this.date.s.getFullYear()+'-'+(this.date.s.getMonth()+1)+'-'+this.date.s.getDate()+'&lang_int='+this.lang_int);
		}
		else if(this.itv.ofr == false) {
			this.itv.ofr = window.setInterval(function() { CtgForm.getOfr(fct); },CtgForm.rqt.time);
		}
	},
	
	getPrc: function(fct) {
		if(this.dbg) { window.alert('CatalogForm.getPrc('+fct+')\nitv:\n\tofr:'+this.itv.ofr+'\n\tprc:'+this.itv.prc+'\n\nxhr:\n\tlst:'+this.rqt.list); }
		var CtgForm = this;
		var fct;
		if(this.rqt.list == null || this.rqt.list == 'prc') {
			if(this.itv.prc != false) {
				window.clearInterval(this.itv.prc);
				this.itv.prc = false;
			}
			this.rqt.list = 'prc';
			this.xhr = getXhr();
			this.xhr.onreadystatechange = function() {
				if(CtgForm.xhr.readyState == 4 && CtgForm.xhr.status == 200) {
					CtgForm.rqt.list = null;
					XMLDoc = CtgForm.xhr.responseXML.documentElement;
					if(XMLDoc.nodeName == 'prc') {
						CtgForm.prd.prc.ini = parseFloat(XMLDoc.getAttribute('val'));
						if(fct != null) { fct.apply(CtgForm); }
					}
					else if(XMLDoc.nodeName == 'err') {
						if(CtgForm.dbg) { window.alert('err: '+XMLDoc.firstChild.value); }
					}
					return true;
				}
			};
			this.xhr.open("POST","/_php/_ajax/catalog_form.ajx.php",true);
			this.xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			this.xhr.send('rqt=prc&id='+this.prd.id);
		}
		else if(this.itv.prc == false) {
			this.itv.prc = window.setInterval(function() { CtgForm.getPrc(fct); },CtgForm.rqt.time);
		}
	},
	
	setCal: function(arg) {
		if(this.dbg) { window.alert('CatalogForm.setCal('+arg+')'); }
		var CtgForm = this;
		this.Cal = new Calendar({
			lang			:CtgForm.lang,
			prd_id			:CtgForm.prd.id,
			anchor			:arg['anchor_id'],
			opener			:arg['opener_id'],
			date_pattern	:arg['date_pattern'],
			date_default	:CtgForm.date.sld.getFullYear()+'-'+CtgForm.date.sld.getMonth()+1+'-'+CtgForm.date.sld.getDate(),	// SI NON PRÉCISÉ: DATE ACTUELLE
			date_start		:arg['date_s'],
			date_end		:CtgForm.date.e,
			slct_d			:arg['slc_d_id'],
			slct_m			:arg['slc_m_id'],
			slct_y			:arg['slc_y_id'],
			ofr				:CtgForm.prd.ofr,
			fct_cpr			:function(x) { return (((parseFloat(CtgForm.prd.prc.ini)+parseFloat(x))>0)?true:false); },
			fct_ofr			:function(date) { return CtgForm.ctlOfr(date); },
			/*
			fct_upd			:function(y,m,d) { CtgForm.updSlcOpt(y,m,d,true); },
			*/
			dsb_d			:CtgForm.date.dsbWeekDays
		});
	},
	
	setLang: function(lang) {
		if(this.dbg) { window.alert('CatalogForm.setLang('+lang+')'); }
		switch(lang) {
			case 'gb':
			case 'en':
			case 'eng':
			case 'en-EN':
			case 'english':
			this.lang = 'eng';
			this.lang_int = 2;
			this.lang_str = 'en';
			break;
			
			case 'it':
			case 'it-IT':
			case 'ita':
			case 'italian':
			this.lang = 'ita';
			this.lang_int = null;
			this.lang_str = null;
			break;
			
			case 'de':
			case 'deu':
			case 'ger':
			case 'german':
			this.lang = 'ger';
			this.lang_int = 3;
			this.lang_str = 'de';
			break;
			
			case 'es':
			case 'es-ES':
			case 'spa':
			case 'spanish':
			this.lang = 'spa';
			this.lang_int = 4;
			this.lang_str = 'es';
			break;
			
			case 'fr':
			case 'fre':
			case 'fr-FR':
			case 'french':
			default:
			this.lang = 'fre';
			this.lang_int = 1;
			this.lang_str = 'fr';
			break;
		}
		return true;
	},
	
	setPrc: function(prc) {
		if(this.dbg) { window.alert('CatalogForm.setPrc('+prc+')'); }
		this.prd.prc.cur = parseFloat(prc);
		this.dspPrc();
	},
	
	setQty: function(qty) {
		if(this.dbg) { window.alert('CatalogForm.setQty('+qty+')'); }
		this.prd.qty = parseInt(parseFloat(qty));
	},
	
	updSlcOpt: function(y,m,d,dspAlert) {
		if(this.dbg) { window.alert('CtgForm.updSlcOptions('+y+','+m+','+d+','+dspAlert+')'); }
		m++;
		currentDate = new Date();
		if((y == currentDate.getFullYear()) && (m < currentDate.getMonth())) {
			y++;
		}
		
		hidden = 0;
		switch(parseInt(parseFloat(m))) {
			case  1:
			case  3:
			case  5:
			case  7:
			case  8:
			case 10:
			case 12:
			hidden = 0;
			break;
			
			case  4:
			case  6:
			case  9:
			case 11:
			hidden = 1;
			if(d == 31) {
				this.HTML.slc.d.value = '30';
				this.HTML.slc.d.options[29].selected = true;
			}
			break;
			
			case  2:
			if((y%4) == 0 && (y%100) !== 0 || (y%400) == 0) {
				hidden = 2;
			}
			else {
				hidden = 3;
			}
			break;
		}
		
		opt_num = this.HTML.slc.d.childNodes.length;
		if(opt_num > (31-hidden)) {
			for(i = 27; i < opt_num; i++) {
				if(parseInt(parseFloat(this.HTML.slc.d.options[i].value)) > (31 - hidden)) {
					this.HTML.slc.d.removeChild(this.HTML.slc.d.childNodes[i]);
					i--;
					opt_num--;
				}
			}
		}
		else {
			for(i = opt_num; i < (31-hidden); i++) {
				opt = document.createElement("option");
				opt = new Option((i+1),(i+1),false,false);
				opt.innerHTML = i+1;
				this.HTML.slc.d.appendChild(opt);
			}
		}
		
		y = parseInt(parseFloat(y));
		m = parseInt(parseFloat(m));
		d = (d < this.HTML.slc.d.childNodes.length) ? parseInt(parseFloat(d)) : this.HTML.slc.d.childNodes.length;
		this.date.sld = new Date(y,(m-1),d);
		y_str = addZero(y);
		m_str = addZero(m);
		d_str = addZero(d);
		this.HTML.slc.y.value = y_str;
		this.HTML.slc.m.value = m_str;
		this.HTML.slc.d.value = d_str;
		
		try {
			this.HTML.slc.y.options[y-this.date.now.getFullYear()].selected = true;
			this.HTML.slc.m.options[m-1].selected = true;
			this.HTML.slc.d.options[d-1].selected = true;
		}
		catch(e) {	//	IE6
			this.HTML.slc.y.selectedIndex = y-this.date.now.getFullYear();
			this.HTML.slc.m.selectedIndex = m-1;
			this.HTML.slc.d.selectedIndex = d-1;
		}
		
		//	DES TITLES DANS LES OPTIONS EMPÊCHENT LEUR ENVOI PAR POST
		for(i = 0; i < this.HTML.slc.d.childNodes.length; i++) {
			css = '';
			date_cur = new Date(y,m-1,i+1,0,0,0);
			if(ofr = this.ctlOfr(date_cur)) {
				css = (((parseFloat(this.prd.prc.ini)+(parseFloat(ofr[2])/10))>0)?'spc':'dsb');
				css += (css == 'spc' && (parseFloat(ofr[2])<0)?' promo':'');
				this.HTML.slc.d.childNodes[i].title = (css == 'dsb') ? ofr[3] : '';
			}
			else { this.HTML.slc.d.childNodes[i].title = ''; }
			//window.alert(date_cur+': '+css);
			this.HTML.slc.d.childNodes[i].disabled = (css =='dsb') ? true : false;
			this.HTML.slc.d.childNodes[i].className = css;
		}
		
		if(ofr = this.ctlOfr(this.date.sld)) {
			this.setPrc(this.prd.prc.ini+parseFloat(ofr[2]/10));
			this.HTML.spn.txt.innerHTML = ofr[3];
			(parseFloat(ofr[2])<0) ? addClassName(this.HTML.spn.txt,'spc') : removeClassName(this.HTML.spn.txt,'spc');
			if(dspAlert) { window.alert(ofr[3]); }
		}
		else {
			this.setPrc(this.prd.prc.ini);
			this.HTML.spn.txt.innerHTML = '';
		}
		
		return true;
	}
}
