function loadCompositions(){
	ajaxXML("loadCompositions.php",null,replyLoadCompositions,true);
	var options=id("composition").options;
	var d=document.getElementById("compEdit");
	//removeAll - clear
	if (d.hasChildNodes()){
		while(d.childNodes.length>0){d.removeChild(d.firstChild);} 
	}
	if(options.length==1){
		id("compHeader").innerHTML="Please enter a name for your basket and press save.";
	}else{
		id("composition").selectedIndex=1;
		options[1].composition.paint();
	}
}

function replyLoadCompositions(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
		var options=id("composition").options;
		options.length=0;
		options[0]=new Composition(0,"New...").option;
		var compositions=xml.getElementsByTagName("composition");
		for(var a=0;a<compositions.length;a++){
			var c=new Composition();
			c.initXML(compositions[a]);
			options[options.length]=c.option;
		}
	}else{
		markErrors(error);
	}	
}

function clearComposition(){
	id("compHeader").innerHTML="Please enter a name for your basket and press save.";
	id("compEdit").innerHTML="";
	id("compositionName").value="";
	id("previousTotal").innerHTML="0.00";
	id("Total").innerHTML="0.00";
	id("totalVar").innerHTML="±0.00%";
	id("compEdit").style.height="10px";
	display("compFooter",false);
	display("statistics",false);
}
function saveComposition(){
	var s="";
	s+="name="+encodeURI(compositionName.value);
	s+="&value="+id("composition").options[id("composition").selectedIndex].value;
	ajaxXML("saveComposition.php",s,replySaveComposition,true);
}

function replySaveComposition(xml){
	var error=xml.getElementsByTagName("error");
	clearErrors();
	if(error.length==0){
		var gef=false,options=id("composition").options;
		var fid=xml.getElementsByTagName("id")[0].firstChild.data;
		var fname=xml.getElementsByTagName("name")[0].firstChild.data;
		for(var a=0;a<options.length;a++){
			if(options[a].value==fid){
				options[a].composition.setName(fname);
				gef=true;
				break;
			}
		}
		if(!gef){
			id("composition").composition=new Composition(fid,fname);
			options[options.length]=id("composition").composition.option;
			id("composition").selectedIndex=options.length-1;
			id("composition").composition.paint();
			id("delcomposition").disabled=false;
		}
	}else{
		markErrors(error);
	}
}

function Composition(value,name){
	this.option=new Option();
	this.option.composition=this;
	this.option.value=value;
	this.option.text=name;
	this.id=value;
	this.name=name;
	this.products=new Array();
	this.dates=new Array();
}
Composition.prototype.setName=function(name){
	this.name=name;
	this.option.text=name;
}
Composition.prototype.setId=function(id){
	this.id=id;
	this.option.value=id;
}
Composition.prototype.paint=function(){
	var dh=id("compHeader");
	var d=id("compEdit");
	if(d.hasChildNodes()){
		while(d.childNodes.length>0){d.removeChild(d.firstChild);} 
	}
	if(this.id>0){
		//paintHeader
		var s="<input type=\"button\" id=\"addproduct\" onclick=\"addProduct()\" value=\"Add Product\" style=\"position:absolute;top:2px;left:2px;\">";
		s+="<div id=\"ajaxStatus\" class=\"ajaxStatus\"></div>";
		s+="<input type=\"button\" id=\"adddate\" value=\"Add Date\" style=\"position:absolute;top:2px;left:550px;width:70px\" onclick=\"displayCalendarActDate(this,'yyyy-mm-dd',this,'addDate();');\">";
		s+="<select id=\"dateSelect\" onchange=\"document.getElementById('composition').composition.updatePrices(false)\" onkeyup=\"document.getElementById('composition').composition.updatePrices(false)\" style=\"position:absolute;top:4px;left:620px;width:90px\"></select>"
		s+="<input type=\"button\" id=\"deldate\" value=\"Del Date\" style=\"position:absolute;top:2px;left:710px;width:70px\" onclick=\"document.getElementById('composition').composition.delDate()\">";
		s+="<div style=\"position:absolute;top:30px;left:40px;width:350px;text-align:center;\">Product, Place of Purchase, Quantity</div><div style=\"position:absolute;top:30px;left:370px;width:80px;text-align:center;\">Frequency</div><div style=\"position:absolute;top:30px;left:615px;width:100px;text-align:center;\">Actual Price</div><div style=\"position:absolute;top:30px;left:710px;width:70px;text-align:center;\">Variation</div>";
		dh.innerHTML=s;
		//paintDates
		for(var a=0;a<this.dates.length;a++){
			id("dateSelect").options[a]=this.dates[a].option;
		}
		//paintProducts
		for(var a=0;a<this.products.length;a++){
			this.products[a].paint(a);
		}
		this.calcTotal(true);
		if(this.dates.length==0){
			id("deldate").disabled=true;
			this.blockPrices(true);
		}
		id("compositionName").value=this.name;
		this.recalcCompEditHeight();
		id("composition").composition=this;
		display("compFooter",true);
	}else{
		clearComposition();
	}
}
Composition.prototype.paintFooter=function(xml){
	var d=id("compFooter");
	var s="<div type>";
}
Composition.prototype.initXML=function(xml){
	this.id=xmlInt(xml,"id");
	this.name=xmlString(xml,"name");
	this.option.value=this.id;
	this.option.text=this.name;

	var prod=xml.getElementsByTagName("product");
	for(var a=0;a<prod.length;a++){
		var p=new Product(xmlInt(prod[a],"id"),xmlString(prod[a],"name"),xmlInt(prod[a],"frequency"),this);
		this.products.push(p);
	}
	prod=xml.getElementsByTagName("date");
	for(var a=0;a<prod.length;a++){
		var p=new Fecha(xmlInt(prod[a],"id"),xmlString(prod[a],"text"));
		this.dates.push(p);
	}
	prod=xml.getElementsByTagName("prices");
	for(var a=0;a<prod.length;a++){
		var p=new Price(xmlInt(prod[a],"id"),xmlInt(prod[a],"productid"),xmlFloat(prod[a],"price"),xmlString(prod[a],"pricedate"),this);
		for(var b=0;b<this.products.length;b++){
			if(this.products[b].id==p.productid){
				this.products[b].prices.push(p);
			}
		}
	}
}
Composition.prototype.recalcCompEditHeight=function(){
	id("compEdit").style.height=(10+this.products.length*26)+"px";
}
Composition.prototype.calcTotal=function(updateChart){
	var actualPrice,previousPrice,times,p,previousTotal=0,Total=0;
	for(var a=0;a<this.products.length;a++){
		p=this.products[a];
		actualPrice=id("productPrice"+p.id).actualPrice;
		previousPrice=id("productPrice"+p.id).previousPrice;
		if(previousPrice==null)previousPrice=actualPrice;
		if(actualPrice!=null){
			if(actualPrice.price==0)actualPrice.price=previousPrice.price;
			if(previousPrice.price>0){
				previousTotal+=30/p.frequency*previousPrice.price;
				Total+=30/p.frequency*actualPrice.price;
			}
		}
	}
	id("previousTotal").innerHTML=numberFormat(Math.round(previousTotal*100),2);
	id("Total").innerHTML=numberFormat(Math.round(Total*100),2);
	var dif=Math.round((Total/previousTotal-1)*10000);
	if(dif!=0){
		var s=(dif<0) ? "" : "+";
		id("totalVar").innerHTML=s+numberFormat(dif,2)+"%";
	}else{
		id("totalVar").innerHTML="±0.00%";
	}
	if(updateChart)this.updateChart();
}
Composition.prototype.updateChart=function(){
	if(!displayed("statistics")){
		if(document.getElementById("statisticsDisplay")!=null){
			document.getElementById("statistics").removeChild(document.getElementById("statisticsDisplay"));
		}
		display("statistics",true);
	}
	if(document.getElementById("statisticsDisplay")==null){
		var im=document.createElement("img");
		im.src="statistics.php?compositionid="+this.id+"&time="+(new Date().getTime());
		im.id="statisticsDisplay";
		document.getElementById("statistics").appendChild(im);
	}else{
		document.getElementById("statisticsDisplay").src="statistics.php?compositionid="+this.id+"&time="+(new Date().getTime());
	}
}
Composition.prototype.updatePrices=function(chartUpdate){
	for(var a=0;a<this.products.length;a++){
		this.products[a].paintPrice();
	}
	this.calcTotal(chartUpdate);
}
Composition.prototype.blockPrices=function(block){
	for(var a=0;a<this.products.length;a++){
		this.products[a].blockPrice(block);
	}
}
Composition.prototype.addProduct=function(){
	status("Adding Product...");
	ajaxXML("addProduct.php","compositionID="+this.id,replyAddProduct,true);
	var p=new Product(pID,"",30,this);
	this.products.push(p);
	p.paint(this.products.length-1);
	if(this.products.length==1){
		this.updateChart();
	}
	this.recalcCompEditHeight();
	status(null);
}

var pID;
function replyAddProduct(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
		pID=xml.getElementsByTagName("id")[0].firstChild.data;
	}else{
		markErrors(error);
	}	
}

function deleteComposition(){
	var c=id("composition");
	var comp=c.composition;
	status("Deleting Product");
	ajaxXML("delComposition.php","id="+comp.id,replyDelComposition,true);
	if(pID){
		for(var a=1;a<c.options.length;a++){
			if(c.options[a].composition.id==comp.id){
				c.options[a]=null;
				break;
			}
		}
		if(c.options.length>1){
			if(c.selectedIndex==0){
				c.selectedIndex=1;
			}
			c.composition=c.options[c.selectedIndex].composition;
			c.composition.paint();
		}else{
			id("delcomposition").disabled=true;
			clearComposition();
		}
	}
	status(null);
}
function replyDelComposition(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
		pID=true;
	}else{
		pID=false;
		markErrors(error);
	}	
}

function addProduct(){
	id("composition").composition.addProduct();
}

function Product(id,name,frequency,comp){
	this.id=id;
	this.name=name;
	this.frequency=frequency;
	this.prices=new Array();
	
	this.composition=comp;

	this.div=document.createElement("div");
	this.div.product=this;
	this.div.style.left="0px";
	this.div.style.position="absolute";
	var s="<input type=\"button\" value=\"Del\" onclick=\"this.parentNode.product.deleteProduct();\" style=\"left:0px;top:0px;width:40px;height:22px;\" class=\"product\">";
	s+="<input id=\"productName"+this.id+"\" onblur=\"this.parentNode.product.save('name',this.value)\" type=\"text\" style=\"left:40px;width:350px;\" class=\"product\" maxlength=80>";
	s+="<input id=\"productFrequency"+this.id+"\" onkeypress=\"onlyNumberKeys(event)\" onblur=\"this.parentNode.product.save('frequency',this.value)\" type=\"text\" style=\"left:390px;text-align:center;width:40px;\" class=\"product\">";
	s+="<div id=\"productPreviousPrice"+this.id+"\" style=\"left:430px;top:2px;width:190px;text-align:center;\" class=\"product\"></div>";
	s+="<input id=\"productPrice"+this.id+"\" onblur=\"this.actualPrice.save(this);this.parentNode.product.composition.calcTotal(true);\" type=\"text\" onclick=\"this.select()\" onkeypress=\"ignoreKey(event,[45])\" onkeyup=\"this.parentNode.product.paintVariation(numberText(this,2,event));\" style=\"left:620px;text-align:right;width:90px;\" class=\"product\">";
	s+="<div id=\"productVar"+this.id+"\" style=\"left:710px;top:2px;width:70px;text-align:right;\" class=\"product\"></div>";
	this.div.innerHTML=s;
}
Product.prototype.save=function(field,value){
	var save=false;
	if(field=="name"){
		if(value!=this.name){
			save=true;
			this.name=value;
		}
	}else if(field=="frequency"){
		value=parseInt(value);
		if(value!=this.frequency){
			if(value<1){
				alert("Please enter the frequency of the purchase measured in days. The value has to be higher than 0.");
				id("productFrequency"+this.id).value=this.frequency;
				return;
			}
			save=true;
			this.frequency=value;
		}
		id("productFrequency"+this.id).value=this.frequency;
		this.composition.calcTotal(true);
	}
	if(save){
		status("Saving...");
		ajaxXML("saveProduct.php","productid="+this.id+"&name="+encodeURI(this.name)+"&frequency="+this.frequency,replySaveProduct,true);
		status(null);
	}
}
function replySaveProduct(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
	}else{
		markErrors(error);
	}	
}
function status(s){
	if(s==null){
		if(navigator.appName=="Microsoft Internet Explorer"){setTimeout("statustext('');",500);}
		else statustext('');
	}else{
		statustext(s);
	}
}
function statustext(text){
	var s=id("ajaxStatus");
	if(s!=null)s.innerHTML=text;
}
Product.prototype.paint=function(pos){
	var d=document.getElementById("compEdit");
	this.div.style.top=(pos*26)+"px";
	d.appendChild(this.div);
	id("productName"+this.id).value=this.name;
	id("productFrequency"+this.id).value=this.frequency;
	this.paintPrice();
}
Product.prototype.paintPrice=function(){
	var actualDate=null,actualPrice=null,previousPrice=null;
	if(id("dateSelect").options.length>0){
		actualDate=id("dateSelect").options[id("dateSelect").selectedIndex].text;
		actualDate=Date.UTC(actualDate.substring(0,4),actualDate.substring(5,7),actualDate.substring(8,10));
		for(var a=0;a<this.prices.length;a++){
			if(this.prices[a].date==actualDate){
				actualPrice=this.prices[a];
			}else if((this.prices[a].date<actualDate)&&((previousPrice==null)||(this.prices[a].date>previousPrice.date))){
				previousPrice=this.prices[a];
			}
		}
	}
	if(this.composition.dates.length==0){
		this.blockPrice(true);
	}else{
		this.blockPrice(false);
		if(actualPrice==null){
			actualPrice=new Price(0,this.id,0,id("dateSelect").options[id("dateSelect").selectedIndex].text,this.composition);
			id("productPrice"+this.id).value="";
		}else{
			id("productPrice"+this.id).value=numberFormat(Math.floor(actualPrice.price*100),2);
		}
		id("productPrice"+this.id).actualPrice=actualPrice;
		id("productPrice"+this.id).previousPrice=previousPrice;
	
		if(previousPrice!=null){
			id("productPreviousPrice"+this.id).innerHTML="Previous ("+previousPrice.dateText+") "+numberFormat(Math.floor(previousPrice.price*100),2);
		}else{
			id("productPreviousPrice"+this.id).innerHTML="No previous Price informed.";
		}
		this.paintVariation();
	}
}
Product.prototype.paintVariation=function(ap){
	var previousPrice=id("productPrice"+this.id).previousPrice;
	if(ap==null){
		ap=id("productPrice"+this.id).actualPrice.price;
	}
	if((previousPrice!=null)&&(previousPrice.price>0)&&(ap>0)){
		var dif=(parseFloat(ap)/previousPrice.price-1)*10000;
		dif=Math.round(dif);
		var s=(dif<0) ? "" : "+";
		id("productVar"+this.id).innerHTML=s+numberFormat(dif,2)+"%";
	}else{
		id("productVar"+this.id).innerHTML="\u00b10.00%";
	}
}
Product.prototype.blockPrice=function(block){
	id("productPrice"+this.id).value=block ? "Add a Date" : "";
	id("productPrice"+this.id).disabled=block;
	id("productPrice"+this.id).style.textAlign=block ? "center" : "right";
	id("productPreviousPrice"+this.id).style.visibility=block ? "hidden" : "visible";
}
Product.prototype.deleteProduct=function(){
	status("Deleting Product...");
	ajaxXML("delProduct.php","productid="+this.id,replyDelProduct,true);
	if(pID){
		for(var a=0;a<this.composition.products.length;a++){
			if(this.composition.products[a].id==this.id){
				this.composition.products.splice(a,1);
				id("compEdit").removeChild(this.div);
				break;
			}
		}
		for(var a=0;a<this.composition.products.length;a++){
			this.composition.products[a].div.style.top=a*26+"px";
		}
		this.composition.recalcCompEditHeight();
		this.composition.calcTotal(true);
	}
	status(null);
}
function replyDelProduct(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
		pID=true;
	}else{
		pID=false;
		markErrors(error);
	}	
}

function Fecha(id,text){
	this.id=id;
	this.dateText=text;
	this.date=Date.UTC(text.substring(0,4),text.substring(5,7),text.substring(8,10));
	
	this.option=new Option(this.dateText,this.id);
	this.option.fecha=this;
}


function addDate(){
	var newdate=id("adddate").date;
	id("composition").composition.addDate(newdate);
}

Composition.prototype.addDate=function(d){
	//check if exists date
	var ds=id("dateSelect");
	for(var a=0;a<ds.options.length;a++){
		if(ds.options[a].text==d){
			ds.selectedIndex=a;
			this.updatePrices(false);
			alert("The date already exists.");
			return;
		}
	}
	//----------
	status("Adding Date...");
	ajaxXML("addDate.php","compositionID="+this.id+"&fecha="+encodeURI(d),replyAddDate,true);
	var p=new Fecha(pID,d);
	this.dates.push(p);
	this.orderDates(p.dateText);
	if(this.dates.length==1){
		id("deldate").disabled=false;
		this.blockPrices(false);
	}
	this.updatePrices(true);
	status(null);
}
var pID;
function replyAddDate(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
		pID=xmlInt(xml,"id");
	}else{
		markErrors(error);
	}	
}

Composition.prototype.delDate=function(){
	var ds=id("dateSelect"),d=ds.options[ds.selectedIndex].text;
	status("Deleting Date...");
	ajaxXML("delDate.php","compositionid="+this.id+"&date="+encodeURI(d),replyDelDate,true);
	if(pID){
		for(var a=0;a<ds.options.length;a++){
			if(ds.options[a].text==d){
				ds.options[a]=null;
				break;
			}
		}
		for(var a=0;a<this.dates.length;a++){
			if(this.dates[a].dateText==d){
				this.dates.splice(a,1);
				break;
			}
		}
		for(var a=0;a<this.products.length;a++){
			for(var b=0;b<this.products[a].prices.length;b++){
				if(this.products[a].prices[b].dateText==d){
					this.products[a].prices.splice(b,1);
					break;
				}
			}
		}
		if(this.dates.length==0){
			id("deldate").disabled=true;
			this.blockPrices(true);
		}
		this.updatePrices(true);
	}
	status(null);
}
function replyDelDate(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
		pID=true;
	}else{
		pID=false;
		markErrors(error);
	}	
}

Composition.prototype.orderDates=function(selDate){
	var ds=id("dateSelect"),sel=-1;
	ds.options.length=0;
	this.dates.sort(function (a,b){return a.date-b.date});
	for(var a=0;a<this.dates.length;a++){
		ds.options[a]=this.dates[a].option;
		if(selDate==this.dates[a].dateText){
			sel=a;
		}
	}
	if(sel>-1)ds.selectedIndex=sel;
}

function Price(pid,productid,price,date,comp){
	this.id=pid;
	this.productid=productid;
	this.price=price;
	this.dateText=date;
	this.date=Date.UTC(date.substring(0,4),date.substring(5,7),date.substring(8,10));
	
	this.composition=comp;
}
Price.prototype.save=function(inputbox){
	if((inputbox.value=="0.00")&&(this.id==0)){
		inputbox.value="";
	}
	if(((inputbox.value=="")||(inputbox.value=="0.00"))&&(this.id>0)){
		status("Deleting Price...");
		ajaxXML("deletePrice.php","id="+this.id,replyDeletePrice,true);
		if(pID){
			for(var a=0;a<this.composition.products.length;a++){
				if(this.productid==this.composition.products[a].id){
					for(var b=0;b<this.composition.products[a].prices.length;b++){
						if(this.composition.products[a].prices[b].id==this.id){
							this.composition.products[a].prices.splice(b,1);
							break;
						}
					}
					break;
				}
			}
			this.id=0;this.price=0;
			inputbox.value="";
		}
		inputbox.parentNode.product.paintVariation(0);
	}else if(((inputbox.value=="")||(inputbox.value=="0.00"))&&(this.id==0)){
		return;
	}else{
		var price=parseFloat(numberFormatReverse(inputbox.value));
		if(this.price==price){return;}
		this.price=price;
		status("Saving...");
		ajaxXML("savePrice.php","id="+this.id+"&productid="+this.productid+"&compositionid="+this.composition.id+"&price="+this.price+"&date="+this.dateText,replySavePrice,true);
		if(this.id==0){
			this.id=pID;
			for(var a=0;a<this.composition.products.length;a++){
				if(this.productid==this.composition.products[a].id){
					this.composition.products[a].prices.push(this);
				}
			}
		}
	}
	status(null);
}
function replySavePrice(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
		pID=xmlInt(xml,"id");
	}else{
		pID=0;
		markErrors(error);
	}	
}
function replyDeletePrice(xml){
	var error=xml.getElementsByTagName("error");
	if(error.length==0){
		pID=true;
	}else{
		pID=false;
		markErrors(error);
	}	
}