/*
 * "translation", "productsSchedules" and "productsPrices"
 *  are included as javascript files
 *
 * Need "tools.lib.js" for "formatNumber" function
 */

$(document).ready(function(){
	CatalogForms = new CatalogForms();	
});

function CatalogForms() {
	this.construct();
};

CatalogForms.prototype.constructor = CatalogForms;

CatalogForms.prototype = {
	msie:false,
	
	cssClass: new Array('disabled','promotion','special'),
	forms:new Array(),
	
	startFromDate:null,
	endToDate:null,
	
	weekStartDay:1,
	daysPerMonth:new Array(31,28,31,30,31,30,31,31,30,31,30,31),
	disabledWeekDays:new Array(),
	
	FromCalendar:null,
	ToCalendar:null,
	
	hasFromCalendar:false,
	hasToCalendar:false,
	
	construct: function() {
		this.msie  = ($.browser.msie);

		this.forms = $('.product-form form');
		//this.forms = $('form.product-form');
		
		currentDate = new Date();
		this.startFromDate = new Date(currentDate.getFullYear(),currentDate.getMonth(),currentDate.getDate(),0,0,0);
		this.endToDate     = new Date(this.startFromDate.getFullYear()+1,11,31,23,59,59);
		
		this.setForms();
		this.setCalendars();
	},
	
	/*
	 * TODO: Ne controle pas les horaires
	 */
	control: function(index,type,fromDate,toDate,weekDay,displayAlert) {
		//console.log('control('+index+','+type+','+fromDate+','+toDate+','+weekDay+','+displayAlert+')');
		rtn = {
			enabled           : true,
			every             : false,
			price             : null,
			priceText         : '',
			stock             : null,
			stockText         : '',
			controlText       : '',
			cssClass          : '',
			dayAndTime        : false,
			dayTimeAndLanguage: false,
			maxQuantity       : false,
			timePrice         : false
		};
		
		if(arguments.length==3||typeof(arguments[3])=='undefined') {
			//console.log('--------------------------------------');
			//console.log('Product: '+this.forms[index].product);
			//console.log('Date: '+fromDate);
			rtn = this.controlDefaultDateRange(fromDate,rtn);
			//console.log('controlDefaultDateRange:              '+rtn.enabled);
			rtn = this.controlSchedules(this.forms[index].product,fromDate,rtn);
			//console.log('controlSchedules:                     '+rtn.enabled);
			rtn = this.controlPrices(this.forms[index].product,fromDate,rtn);
			//console.log('controlPrices:                        '+rtn.enabled);
			rtn = this.controlStocks(this.forms[index].product,fromDate,rtn);
			//console.log('controlStocks:                        '+rtn.enabled);
			rtn = this.controlTimePrice(this.forms[index].product,fromDate,rtn);
			//console.log('controlTimePrice:                     '+rtn.enabled);
			if(this.forms[index].hasLanguage) {
				rtn = this.controlDayTimeAndLanguageAssociation(this.forms[index].product,fromDate,rtn);
				//console.log('controlDayTimeAndLanguageAssociation: '+rtn.enabled);
			}
			rtn = this.controlDayAndTimeAssociation(this.forms[index].product,fromDate,rtn);
			//console.log('controlDayAndTimeAssociation:         '+rtn.enabled);
			/*
			for(attr in rtn) {
				console.log('   rtn.'+attr+' = '+rtn[attr]);
			}
			*/
		}
		// Control every day in range
		else {
			enabled = true;
			every = 0;
			
			firstWeekDay = fromDate.getDay()-this.weekStartDay;
			firstWeekDay = (firstWeekDay<0) ? firstWeekDay+7 : firstWeekDay;
			offset = ((weekDay-firstWeekDay)<0) ? weekDay-firstWeekDay+7 : weekDay-firstWeekDay;
			count = 0;
			date = new Date(fromDate.getFullYear(),fromDate.getMonth(),fromDate.getDate()+offset);
			for(null;date<toDate;null) {
				rtn = this.control(index,type,date);
				enabled = (!rtn.enabled) ? false : rtn.enabled;
				every += (rtn.enabled) ? 1 : 0;
				count++;
				date = new Date(date.getFullYear(),date.getMonth(),date.getDate()+7);
			}
			rtn.enabled = enabled;
			//rtn.every = (every==0||every==count);
			rtn.every = (every==0||every==count) ? true : false;
		}
		return rtn;
	},
	
	controlDayAndTimeAssociation: function(product,date,rtn) {
		if(
			rtn.enabled&&
			productsDayTime[product]!=undefined
		) {
			weekDay = date.getDay()-this.weekStartDay;
			if(weekDay<0) {
				    weekDay += 7;
			 }
			for(n=0;n<productsDayTime[product].length;n++) {
				if(
					(
						productsDayTime[product][n][0]<=date||
						productsDayTime[product][n][0]==null
					) &&
					(
						productsDayTime[product][n][1]>=date||
						productsDayTime[product][n][1]==null
					) &&
					productsDayTime[product][n][3][weekDay]=='1'
				) {
					rtn.enabled = true;
					rtn.controlText = (rtn.controlText&&rtn.controlText.length>0) ? rtn.controlText+', ' : translation.schedules+translation.colonWithSpace;
					rtn.controlText += productsDayTime[product][n][2].join(', ');
				}
			}
		}
		return rtn;
	},
	
	/*
	 * TODO: control day with more than one time and specific languages
	 */
	controlDayTimeAndLanguageAssociation: function(product,date,rtn) {
		if(
			rtn.enabled&&
			productsPrices[product]!=undefined
		) {
			if(
				rtn.enabled&&
				productsDayTimeLanguage[product]!=undefined&&
				productsDayTimeLanguage[product].length>0
			) {
				times = new Array();
				languagesIds = new Array();
				languagesNames = new Array();
				for(n=0;n<productsDayTimeLanguage[product].length;n++) {
					if(
						(
							productsDayTimeLanguage[product][n][0]<=date||
							productsDayTimeLanguage[product][n][0]==null
						) &&
						(
							productsDayTimeLanguage[product][n][1]>=date||
							productsDayTimeLanguage[product][n][1]==null
						) &&
						productsDayTimeLanguage[product][n][5][weekDay]=='1'
					) {
						for(id in productsDayTimeLanguage[product][n][2]) {
							if(jQuery.inArray(productsDayTimeLanguage[product][n][2][id],languagesIds)==-1) {
								languagesIds.push(productsDayTimeLanguage[product][n][2][id]);
								languagesNames.push(productsDayTimeLanguage[product][n][3][id]);
							}
						}
						for(id in productsDayTimeLanguage[product][n][4]) {
							if(jQuery.inArray(productsDayTimeLanguage[product][n][4][id],times)==-1) {
								times.push(productsDayTimeLanguage[product][n][4][id]);
							}
						}
					}
				}
				if(times.length==0&&languagesNames.length==0) {
					rtn.enabled = false;
					rtn.controlText = translation.dateNotValid;
					rtn.cssClass = 'disabled';
				}
				else {
					languagesNames.sort();
					rtn.controlText = (times.length>0) ? translation.dateAtTime+' '+times.join(', ') : '';
					rtn.controlText += (languagesNames.length>0) ? ' '+translation.miscIn+' '+languagesNames.join(', ') : '';
				}
			}
		}
		return rtn;
	},
	
	controlDefaultDateRange: function(date,rtn) {
		if(rtn.enabled) {
			if(
				this.startFromDate>date||
				this.endToDate<date
			) {
				rtn.enabled = false;
				rtn.price = 0;
				rtn.priceText = null;
				rtn.stock = 0;
				rtn.stockText = null;
				rtn.controlText = translation.dateNotValid;
				rtn.cssClass = 'disabled';
			}
		}
		return rtn;
	},
	
	controlPrices: function(product,date,rtn) {
		if(
			rtn.enabled&&
			productsPrices[product]!=undefined
		) {
			for(n=0;n<productsPrices[product].length;n++) {
				if(
					productsPrices[product][n][0]==null&&
					productsPrices[product][n][1]==null
				) {
					defaultPrice = parseFloat(productsPrices[product][n][2],10);
					rtn.price = defaultPrice;
					rtn.priceText = productsPrices[product][n][3];
				}
				else if(
					(
						productsPrices[product][n][0]<=date||
						productsPrices[product][n][0]==null
					) &&
					(
						productsPrices[product][n][1]>=date||
						productsPrices[product][n][1]==null
					)
				) {
					rtn.price = parseFloat(productsPrices[product][n][2],10);
					rtn.enabled = (rtn.price>0) ? true : false;
					rtn.priceText = productsPrices[product][n][3];
					if(
						rtn.enabled&&
						typeof(defaultPrice)=='number'&&
						rtn.price!=defaultPrice
					) {
						rtn.cssClass = (rtn.price<defaultPrice) ? 'promotion' : 'special';
					}
					else if(!rtn.enabled) {
						rtn.cssClass = 'disabled';
					}
					break;
				}
			}
		}
		return rtn;
	},
	
	controlSchedules: function(product,date,rtn) {
		if(
			rtn.enabled&&
			productsSchedules[product]!=undefined
		) {
			weekDay = date.getDay()-this.weekStartDay;
			if(weekDay<0) {
				weekDay += 7;
			}
			for(n=0;n<productsSchedules[product].length;n++) {
				if(
					productsSchedules[product][n][0]==null&&
					productsSchedules[product][n][1]==null
				) {
					rtn.enabled = productsSchedules[product][n][weekDay+2];
					rtn.every = true;
					if(!rtn.enabled) {
						rtn.price = 0;
						rtn.controlText = translation.day[weekDay]+' - '+translation.dateClosed;
						rtn.cssClass = 'disabled';
					}
				}
				else if(
					(
						productsSchedules[product][n][0]<=date||
						productsSchedules[product][n][0]==null
					) &&
					(
						productsSchedules[product][n][1]>=date||
						productsSchedules[product][n][1]==null
					)
				) {
					rtn.enabled = productsSchedules[product][n][weekDay+2];
					rtn.every = false;
					if(!rtn.enabled) {
						rtn.price = 0;
						rtn.controlText = translation.day[weekDay]+' - '+translation.dateClosed;
						rtn.cssClass = 'disabled';
					}
					else {
						rtn.controlText = '';
						rtn.cssClass = '';
					}
					break;
				}
			}
		}
		return rtn;
	},
	
	controlStocks: function(product,date,rtn) {
		//console.log('controlStocks('+product+','+date+','+rtn.toString()+')');
		if(
			rtn.enabled&&
			productsStocks[product]!=undefined
		) {
			for(n=0;n<productsStocks[product].length;n++) {
				if(
					productsStocks[product][n][0]==null&&
					productsStocks[product][n][1]==null
				) {
					defaultStock = parseFloat(productsStocks[product][n][2],10);
					rtn.stock = defaultStock;
					rtn.stockText = productsStocks[product][n][3];
				}
				else if(
					(
						productsStocks[product][n][0]<=date||
						productsStocks[product][n][0]==null
					) &&
					(
						productsStocks[product][n][1]>=date||
						productsStocks[product][n][1]==null
					)
				) {
					rtn.stock = parseFloat(productsStocks[product][n][2],10);
					rtn.enabled = rtn.stock==0 ? false : rtn.enabled;
					rtn.cssClass = rtn.stock==0 ? 'disabled' : rtn.cssClass;
					rtn.stockText = productsStocks[product][n][3];
					break;
				}
			}
		}
		/*
		console.log('rtn.stock: '+rtn.stock);
		console.log('rtn.enabled: '+rtn.enabled);
		console.log('rtn.cssClass: '+rtn.cssClass);
		console.log('rtn.stockText: '+rtn.stockText);
		*/
		return rtn;
	},
	
	controlTimePrice: function(product,date,rtn) {
		if(
			rtn.enabled&&
			productsTimePriceIncrease[product]!=undefined&&
			productsTimePriceIncrease[product].length>0
		) {
			time = addZero(date.getHours(),2)+':'+addZero(date.getMinutes(),2);
			for(n=0;n<productsTimePriceIncrease[product].length;n++) {
				if(
					(
						productsTimePriceIncrease[product][n][0]<=date||
						productsTimePriceIncrease[product][n][0]==null
					) &&
					(
						productsTimePriceIncrease[product][n][1]>=date||
						productsTimePriceIncrease[product][n][1]==null
					) && 
					(
						time>=productsTimePriceIncrease[product][n][2]&&
						time<=productsTimePriceIncrease[product][n][3]
					)
				) {
					priceIncrease = productsTimePriceIncrease[product][n][4];
					rtn.price += parseFloat(priceIncrease,10);
					rtn.timePrice = true;
					rtn.priceText = (rtn.priceText&&rtn.priceText.length>0) ? rtn.priceText+', ' : '';
					rtn.priceText += translation.timePriceIncrease+translation.colonWithSpace+priceIncrease+'&euro;';
					break;
				}
			}
		}
		return rtn;
	},

	setCalendars: function() {
		var CatalogForms = this;
		if(this.hasFromCalendar) {
			this.FromCalendar = new Calendar({
				cssClass: 'calendar default wauto'
			});
			this.FromCalendar.setControlFunction(
				function(index,type,fromDate,toDate,day) {
					return CatalogForms.control(index,type,fromDate,toDate,day);
				}
			);
			this.FromCalendar.setUpdateFunction(
				function(index,type,date) {
					CatalogForms.updateDateSelects(index,type,date,true);
				}
			);
		}
		if(this.hasToCalendar) {
			this.ToCalendar = new Calendar({
				cssClass:'calendar default wauto'
			});
			this.ToCalendar.setControlFunction(
				function(index,type,fromDate,toDate,day) {
					return CatalogForms.control(index,type,fromDate,toDate,day);
				}
			);
			this.ToCalendar.setUpdateFunction(
				function(index,type,date) {
					CatalogForms.updateDateSelects(index,type,date,true);
				}
			);
		}
	},
	
	setForms: function() {
		var CatalogForms = this;
		/*
		$(':submit',this.forms).hover(
			function () { $(this).addClass('hover'); }, 
			function () { $(this).removeClass('hover') 
			}
		);
		*/
		for(var i=0;i<this.forms.length;i++) {
			form = $(this.forms[i]);
			form.attr('ctp:index',i);
			form.submit(
				function() {
					/**
					 * @todo: Controler l'impact du paramètre 'from'
					 */
					control = CatalogForms.control(
						$(this).attr('ctp:index'),
						'from',
						CatalogForms.forms[$(this).attr('ctp:index')].selectedFromDate,
						CatalogForms.forms[$(this).attr('ctp:index')].selectedToDate,
						null,
						true
					);
					return control.enabled;
				}
			);
			
			linked_quantity = form.find('.product-linked input.quantity');
			for(j=0;j<linked_quantity.length;j++) {
				$(linked_quantity[j]).setField();
			}
			
			// Other fields
			this.forms[i].product  = form.attr('ctp:product');
			
			this.forms[i].quantity = form.find('.main-product input.quantity');
			if(this.forms[i].quantity.length==1) {
				this.forms[i].quantity.setField();
			}
			
			this.forms[i].daysNightsNumber = form.find('.main-product input.days-nights-number');
			if(this.forms[i].daysNightsNumber.length==1) {
				this.forms[i].daysNightsNumber.setField();
			}
			
			this.forms[i].language = form.find('.main-product select.language');
			if(this.forms[i].language.length==1) {
				this.forms[i].language.setField();;
				this.forms[i].hasLanguage = true;
			}
			
			this.forms[i].unitPrice = form.find('.main-product span.unit-price');
			this.forms[i].totalPrice = form.find('.main-product span.total-price');
			
			this.forms[i].alertBox = form.find('.alert');
			
			if(this.forms[i].unitPrice.length==1) {
				this.forms[i].currentPrice = parseFloat(this.forms[i].unitPrice.html().replace(',','.'),10);
			}
			//this.calculPrice(i);
			
			// "From date" selects
			this.forms[i].fromDate   = form.find('.main-product select.from-date');
			this.forms[i].fromYear   = form.find('.main-product select.from-year');
			this.forms[i].fromMonth  = form.find('.main-product select.from-month');
			this.forms[i].fromDay    = form.find('.main-product select.from-day');
			this.forms[i].fromTime   = form.find('.main-product select.from-time');
			this.forms[i].fromHour   = form.find('.main-product select.from-time-h');
			this.forms[i].fromMinute = form.find('.main-product select.from-time-i');
			
			if(
				this.forms[i].fromYear.length&&
				this.forms[i].fromMonth.length&&
				this.forms[i].fromDay.length
			) {
				this.hasFromCalendar = true;
				
				this.forms[i].fromYear.setField();;
				this.forms[i].fromMonth.setField();;
				this.forms[i].fromDay.setField();;
				
				// Set Calendar
				this.forms[i].selectedFromDate = new Date();
				
				this.forms[i].fromCalendarOpener = this.forms[i].fromYear.parent().find('span.calendar.opener');
				this.forms[i].fromCalendarAnchor = this.forms[i].fromCalendarOpener;
				
				this.forms[i].fromCalendarOpener.click(
					function(e) {
						e.stopPropagation();
						//index = $(this).parents('.product-form form').attr('ctp:index');
						index = $(this).parents('form').attr('ctp:index');
						CatalogForms.FromCalendar.setIndex(index);
						CatalogForms.FromCalendar.setType('from');
						CatalogForms.FromCalendar.setOpener(this);
						CatalogForms.FromCalendar.setAnchor(CatalogForms.forms[index].fromCalendarAnchor);
						CatalogForms.FromCalendar.setSelectedDate(CatalogForms.forms[index].selectedFromDate);
						CatalogForms.FromCalendar.display(true);
					}
				);
				
				CatalogForms.updateDateSelects(i,'from',this.forms[i].selectedFromDate,true);
				
				this.forms[i].fromYear.change(
					function() {
						CatalogForms.updateDateSelects(
							$(this).parents('form').attr('ctp:index'),
							'from',
							null,
							true
						);
					}
				);
				
				this.forms[i].fromMonth.change(
					function() {
						CatalogForms.updateDateSelects(
							$(this).parents('form').attr('ctp:index'),
							'from',
							null,
							true
						);
					}
				);
				
				this.forms[i].fromDay.change(
					function() {
						CatalogForms.updateDateSelects(
							$(this).parents('form').attr('ctp:index'),
							'from',
							null,
							true
						);
					}
				);
			}

			if(
				this.forms[i].fromTime.length==1
			) {
				this.forms[i].fromTime.setField();
				
				this.forms[i].fromTime.change(function() {
					CatalogForms.updateDateSelects(
						$(this).parents('form').attr('ctp:index'),
						'from',
						null,
						true
					);
				});
			}
			else if(
				this.forms[i].fromHour.length==1&&
				this.forms[i].fromMinute.length==1
			) {
				this.forms[i].fromHour.setField();
				this.forms[i].fromMinute.setField();
				
				this.forms[i].fromHour.change(
					function() {
						CatalogForms.updateDateSelects(
							$(this).parents('form').attr('ctp:index'),
							'from',
							null,
							true
						);
					}
				);
				this.forms[i].fromMinute.change(
					function() {
						CatalogForms.updateDateSelects(
							$(this).parents('form').attr('ctp:index'),
							'from',
							null,
							true
						);
					}
				);
			}
			
			if(this.forms[i].fromDate.length) {
				val = this.forms[i].fromDate.val().split(' ');
				d = val[0].split('-');
				t = val[1].split(':');
				this.forms[i].selectedFromDate = new Date(parseInt(d[0],10),parseInt(d[1],10)-1,parseInt(d[2],10));
				//this.forms[i].maxQuantity = parseFloat($(this.forms[i].fromDate).find('option:selected').attr('ctp:maxvalue'),10);
				
				this.forms[i].fromDate.setField();
				/*
				this.forms[i].fromDate.change(
					function() {
						index = $(this).parents('form').attr('ctp:index');
						
					}
				);
				*/
			}
			
			// "To date" selects
			this.forms[i].toDate   = form.find('select.to-date');
			this.forms[i].toYear   = form.find('select.to-year');
			this.forms[i].toMonth  = form.find('select.to-month');
			this.forms[i].toDay    = form.find('select.to-day');
			this.forms[i].toTime   = form.find('select.to-time');
			this.forms[i].toHour   = form.find('select.to-time-h');
			this.forms[i].toMinute = form.find('select.to-time-i');
			
			if(
				this.forms[i].toYear.length&&
				this.forms[i].toMonth.length&&
				this.forms[i].toDay.length
			) {
				this.hasToCalendar = true;
				
				// Set Calendar
				this.forms[i].selectedToDate = new Date();
				
				this.forms[i].toCalendarOpener = this.forms[i].toYear.parent().find('span.calendar.opener');
				this.forms[i].toCalendarAnchor = this.forms[i].toCalendarOpener;
				
				this.forms[i].toCalendarOpener.click(function(e) {
					e.stopPropagation();
					//index = $(this).parents('.product-form form').attr('ctp:index');
					index = $(this).parents('form').attr('ctp:index');
					CatalogForms.ToCalendar.setIndex(index);
					CatalogForms.ToCalendar.setType('to');
					CatalogForms.ToCalendar.setOpener(this);
					CatalogForms.ToCalendar.setAnchor(CatalogForms.forms[index].toCalendarAnchor);
					CatalogForms.ToCalendar.setSelectedDate(CatalogForms.forms[index].selectedToDate);
					CatalogForms.ToCalendar.display(true);
				});
				
				CatalogForms.updateDateSelects(i,'to',this.forms[i].selectedToDate,true);
				
				this.forms[i].toYear.change(function() {
					CatalogForms.updateDateSelects(
						$(this).parents('form').attr('ctp:index'),
						'to',
						null,
						true
					);
				});
				
				this.forms[i].toMonth.change(function() {
					CatalogForms.updateDateSelects(
						$(this).parents('form').attr('ctp:index'),
						'to',
						null,
						true
					);
				});
				
				this.forms[i].toDay.change(function() {
					CatalogForms.updateDateSelects(
						$(this).parents('form').attr('ctp:index'),
						'to',
						null,
						true
					);
				});
			}
			else if(this.forms[i].toDate.length) {
				val = this.forms[i].toDate.val().split(' ');
				d = val[0].split('-');
				t = val[1].split(':');
				this.forms[i].selectedToDate = new Date(parseInt(d[0],10),parseInt(d[1],10)-1,parseInt(d[2],10));
			}
		}
	},
	
	calculPrice: function(index) {
		var CatalogForms = this;
		if(
			CatalogForms.forms[index].currentPrice!=undefined&&
			CatalogForms.forms[index].quantity!=undefined
		) {
			linked_price = 0;
			trs = $(CatalogForms.forms[index]).find('.product-linked');
			for(i=0;i<trs.length;i++) {
				linked_price += parseFloat($(trs[i]).find('input.quantity').val().replace(',','.'),10)*
					parseFloat($(trs[i]).find('.unit-price').html().replace(',','.'),10);
			}
			
			CatalogForms.forms[index].unitPrice.html(
				formatNumber(CatalogForms.forms[index].currentPrice)
			);
			
			CatalogForms.forms[index].totalPrice.html(
				formatNumber(
					parseFloat(CatalogForms.forms[index].currentPrice,10)*
					parseFloat(CatalogForms.forms[index].quantity.val().replace(',','.'),10)*
					(CatalogForms.forms[index].daysNightsNumber.val() || 1)+
					linked_price
				)
			);
		}
	},
	
	displayAlert: function(index,priceText,stockText,controlText,cssClass,show) {
		alertBox = this.forms[index].alertBox;
		if(show) {
			text = '';
			text += priceText!=null&&priceText.length>0 ? priceText : '';
			text += text.length>0&&stockText!=null&&stockText.length>0 ? '<br />' : '';
			text += stockText!=null&&stockText.length>0 ? stockText : '';
			text += text.length>0&&controlText!=null&&controlText.length>0 ? '<br />' : '';
			text += controlText!=null&&controlText.length>0 ? controlText : '';
			alertBox.html(text);
			for(i=0;i<this.cssClass.length;i++) {
				alertBox.toggleClass(this.cssClass[i],false);
			}
			alertBox.toggleClass(cssClass,true);
			if(this.msie) {
				alertBox.css({display:'auto'});
			}
			else {
				alertBox.slideDown(250);
			}
		}
		else {
			if(this.msie) {
				alertBox.css({display:'none'});
				alertBox.hide();
			}
			else {
				alertBox.slideUp(500);
			}
		}
	},
	
	getTime: function(index,type) {
		if(type=='from') {
			if(this.forms[index].fromTime.length==1) {
				s = split(':',$(this.forms[index].fromTime).val());
				rtn = {
					h:s[0],
					i:s[1]
				};
			}
			else if(
				this.forms[index].fromHour.length==1&&
				this.forms[index].fromMinute.length==1
			) {
				rtn = {
					h:$(this.forms[index].fromHour).val(),
					i:$(this.forms[index].fromMinute).val()
				};
			}
			else {
				rtn = {
					h:0,
					i:0
				};
			}
		}
		else if(type=='to') {
			if(this.forms[index].toTime.length==1) {
				s = split(':',$(this.forms[index].toTime).val());
				rtn = {
					h:s[0],
					i:s[1]
				};
			}
			else if(
				this.forms[index].toHour.length==1&&
				this.forms[index].toMinute.length==1
			) {
				rtn = {
					h:$(this.forms[index].toHour).val(),
					i:$(this.forms[index].toMinute).val()
				};
			}
			else {
				rtn = {
					h:0,
					i:0
				};
			}
		}
		return rtn;
	},
	
	/**
	 * TODO: cas des produits liés : pour l'instant pas de contrôle des dates
	 */
	updateDateSelects: function(index,type,selectedDate,displayAlert) {
		var CatalogForms = this;
		if(type=='from') {
			yearSelect = this.forms[index].fromYear;
			monthSelect = this.forms[index].fromMonth;
			daySelect = this.forms[index].fromDay;
		}
		else if(type=='to') {
			yearSelect = this.forms[index].toYear;
			monthSelect = this.forms[index].toMonth;
			daySelect = this.forms[index].toDay;
		}
		
		if(typeof(selectedDate)!='object'||selectedDate==null) {
			y = parseInt($(yearSelect).val(),10);
			m = parseInt($(monthSelect).val(),10);
			d = parseInt($(daySelect).val(),10);
			time = this.getTime(index,type);
			h = parseInt(time['h'],10)||0;
			min = parseInt(time['i'],10)||0;
		}
		else {
			y = selectedDate.getFullYear();
			m = selectedDate.getMonth()+1;
			d = selectedDate.getDate();
			h = selectedDate.getHours();
			min = selectedDate.getMinutes();
		}
		
		//TODO: DEBUG
		//document.getElementById('debug').innerHTML = y+'-'+m+'-'+d+' '+h+':'+min;
		
		hidden = 0;
		switch(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;
				break;
			case  2:
				hidden = ((y%4)==0&&(y%100)!==0||(y%400)==0) ? 2 : 3;
				break;
		}
		
		options = daySelect.children('option');
		optionsLength = options.length;
		newOptionsLength = 31-hidden;
		
		if(d>newOptionsLength) {
			d = newOptionsLength;
		}
		
		if(optionsLength>newOptionsLength) {
			for(i=optionsLength-1;i>=newOptionsLength;i--) {
				$(options[i]).remove();
			}
		}
		else if(optionsLength<newOptionsLength) {
			for(i=optionsLength;i<newOptionsLength;i++) {
				opt = document.createElement('option');
				opt = new Option((i+1),(i+1),false,false);
				opt.innerHTML = i+1;
				daySelect.append(opt);
			}
		}
		
		// Options with title attribute can't be send
		options = daySelect.children('option');
		for(i=0;i<options.length;i++) {
			control = this.control(index,type,new Date(y,m-1,i+1,0,0,0));
			text = '';
			if(typeof(control.priceText)=='string'&&control.priceText.length>0) {
				control.priceText = control.priceText.replace('"','&quote;');
				text += control.priceText+' ';
			}
			if(typeof(control.controlText)=='string'&&control.controlText.length>0) {
				control.controlText = control.controlText.replace('"','&quote;');
				text += '('+control.controlText+')';
			}
			options[i].className = control.cssClass;
			options[i].setAttribute('title',(!control.enabled) ? text : '');
			options[i].disabled = (!control.enabled) ? true : false;
		}
		
		yearSelect.val(y);
		monthSelect.val((m<10)?'0'+m:m);
		daySelect.val((d<10)?'0'+d:d);
		
		selectedDate = new Date(y,m-1,d,h,min);
		//window.alert(y+','+(m-1)+','+d+','+h+','+min+'\n'+selectedDate);
		
		if(type=='from'&&typeof(this.FromCalendar)=='object'&&this.FromCalendar!=null) {
			this.forms[index].selectedFromDate = selectedDate;
			this.FromCalendar.setSelectedDate(selectedDate);
		}
		else if(type=='to'&&typeof(this.ToCalendar)=='object'&&this.ToCalendar!=null) {
			this.forms[index].selectedToDate = selectedDate;
			this.ToCalendar.setSelectedDate(selectedDate);
		}
		
		control = this.control(index,type,selectedDate);
		this.forms[index].currentPrice = control.price;
		this.forms[index].currentText = control.controlText;
		
		this.calculPrice(index);
		
		if(
			displayAlert&&
			(
				typeof(control.controlText)=='string'&&
				control.controlText.length>0
			)||
			(
				typeof(control.priceText)=='string'&&
				control.priceText.length>0
			)||
			(
				typeof(control.stockText)=='string'&&
				control.stockText.length>0
			)
		) {
			this.displayAlert(index,control.priceText,control.stockText,control.controlText,control.cssClass,true);
		}
		else {
			this.displayAlert(index,null,null,null,null,false);
		}
		return true;
	}
};
