function CAristPrice(){
	
	var pricelist=new Array();
	this.setPriceList=function(arr,calcid){
		pricelist[calcid]=arr;
	}
	
	
	var levels=new Array();
	this.regLevelEl=function(calcid,el_id){
		
		var el=document.getElementById(el_id);
		if(levels[calcid]==null) levels[calcid]=new Array();
		
		var level=levels[calcid].length;
		levels[calcid][level]=el;
		el.pricelevel=level;
		el.calcid=calcid;
		
		if(el.alloptions==null && el.tagName.toLowerCase() == 'select'){
			el.alloptions=new Array();
			var seloptions=el.options;
			for(var i=0; i< seloptions.length; i++){
				var opt=seloptions[i];
				el.alloptions[el.alloptions.length]={el:opt, inp:opt, parent:opt.parentNode};
			}
		}
		
		if(level) {
			registerDependedEl(levels[calcid][level-1].id,levels[calcid][level].id,"AristPrice.changeSelectStructure(depended)");
		}
		registerDependedEl(levels[calcid][level].id,null,AristPrice.updateTotals);
	}
	
	this.regOptions=function(sel_id,ids){
		var sel=document.getElementById(sel_id);
		if(sel.alloptions==null) sel.alloptions=new Array();
		for(var i=0; i < ids.length; i++){
			var el=document.getElementById(ids[i].el);
			if(ids[i].inp != null)
				var inp=document.getElementById(ids[i].inp);
			else 
				var inp=el;
			sel.alloptions[sel.alloptions.length]={el:el, inp:inp, parent:el.parentNode};
		}
		
	}
	
	this.updateTotals = function(parent){
		
		var curlevels=levels[parent.calcid];
		if((parent.pricelevel + 1) == curlevels.length) 
			AristPrice.chengeAllTotals(parent.calcid);
	}
	
	this.changeSelectStructure = function(el){
		
		if(el.calcid==null) 
			return;
		if(typeof(pricelist[el.calcid])!='object') return;
		
		var curlevels=levels[el.calcid];
		if(curlevels[el.pricelevel]!=null){
			var i=0, curlist=pricelist[el.calcid];
			do{
				curlist=curlist[curlevels[i].value];
				i++;
			}while(i < el.pricelevel && typeof(curlist)=='object');
			if(typeof(curlist)!='object') curlist=new Array();
			
			var values=new Array();
			var el_value=el.value;
			var el_text=(el[el.selectedIndex].text!=null)?el[el.selectedIndex].text:null;
			var value_by_text=null;
			var seloptions=el.alloptions;
			for(i=0; i< seloptions.length; i++){
				var index=seloptions[i].inp.value;
				if(curlist[index]!=null) {
					values[values.length]=index;
					if(seloptions[i].el.parentNode != seloptions[i].parent){
						seloptions[i].parent.appendChild(seloptions[i].el);
						if(seloptions[i].el.text!=null && el_text == seloptions[i].el.text) value_by_text=index;
					}
				}
				else{
					if(seloptions[i].el.parentNode == seloptions[i].parent)
						seloptions[i].parent.removeChild(seloptions[i].el);
				}
			}
			
			if(!in_array(el_value,values)){
				if(value_by_text != null) el.value=value_by_text;
				else el.value=values[0];
			}
			if(typeof(el.onchange) == 'function'){
				el.onchange();
			}
		}
		
	}
	

	var main_raplaces=new Array(
		{name:'price',js:'price'},
		{name:'last',js:'last'},
		{name:'save',js:'save'},
		{name:'disc',js:'disc'}
	);
	var makeReplaces=function(total_id,template,inp_replaces){
		
		var el=document.getElementById(total_id);
		var i,j;
		if(inp_replaces == null) inp_replaces=new Array();
		var replaces=inp_replaces.concat(main_raplaces);
		
		var s=template;
		for(i=0;i<replaces.length;i++){
			var repl=replaces[i];
			var reg=new RegExp("\\{\\$" + repl.name + "\\}","ig");
			s=s.replace(reg,'<span class="' + total_id + '_' + repl.name + '">0</span>');
		}
		
		
		el.innerHTML=s;
		
		var spans=el.getElementsByTagName('span');
		
		var out_repls=new Array();
		for(j=0;j<spans.length;j++){
			for(i=0;i<replaces.length;i++){
				var repl=replaces[i];
				if(spans[j].className == (total_id + '_' + repl.name)){
					out_repls[out_repls.length]={el:spans[j], js:repl.js}
				}
			}
		}
		return out_repls;
	}
	
	
	this.regTotal = function(level_id,total_id,index,template,replaces){
		var levelel=document.getElementById(level_id);
		if(levelel.curtotals==null) levelel.curtotals=new Array();

		levelel.curtotals[levelel.curtotals.length]={
			el:document.getElementById(total_id),
			index:index,
			template:template,
			replaces:makeReplaces(total_id,template,replaces)
		};
	}
	
	var finaltotals=new Array();
	this.regTotalFinal = function(calcid,total_id,template,replaces){
		if(typeof(finaltotals[calcid]) != 'object') finaltotals[calcid]=new Array();
		
		finaltotals[calcid][finaltotals[calcid].length]={
			el:document.getElementById(total_id),
			index:null,
			template:template,
			replaces:makeReplaces(total_id,template,replaces)
		};
	}
		
		
	this.chengeAllTotals=function(calcid){
		
		var curlevels=levels[calcid];
		for(var i=0; i<curlevels.length; i++){
			if(typeof(curlevels[i].curtotals) == 'object')
				AristPrice.changeTotal(calcid,i,curlevels[i].curtotals);
		}
		if(typeof(finaltotals[calcid]) == 'object')
			AristPrice.changeTotal(calcid,curlevels.length,finaltotals[calcid]);
	}

	this.changeTotal = function(calcid, level, curtotals){
		if(typeof(pricelist[calcid])!='object') return;
		var curlevels=levels[calcid];
		
		for(var j=0; j < curtotals.length; j++){
			
			var i=0, curlist=pricelist[calcid];
			do{
				curlist = curlist[(level==i) ? curtotals[j].index : curlevels[i].value];
				i++;
			}while(i < curlevels.length && typeof(curlist)=='object');
			if(typeof(curlist)!='object') curlist=new Object();
			
			var price=curlist.p?curlist.p:0;
			if(pages[calcid]!=null) price=price*pages[calcid].value;
			if(curtotals[j].template==null){
				
				curtotals[j].el.innerHTML=price;
			}
			else{
				
				var last=curlist.l?curlist.l:price;
				if(pages[calcid]!=null) {
					numpages=pages[calcid].value;
					last=last*pages[calcid].value;
				}
				else numpages=null;
				var save=last-price;
				var disc=price?(Math.round(save*10000/price)/100):0;
				for(i=0;i<curtotals[j].replaces.length;i++){
					var repl=curtotals[j].replaces[i];
					startValue(repl.el,eval(repl.js));
				}

				
			}
		}
	}
	
	
	var go_els=new Array();
	var startValue=function(el,value){
		el.time_go_value=new Date();
		el.start_value=1*el.innerHTML;
		el.delta_value=value-el.start_value;
		for(var i=0; i<go_els.length; i++)
			if(go_els[i]==el) return;
		go_els[go_els.length]=el;
		if(go_els.length==1) setTimeout(goValue, 41);
	}
	var goValue=function(){
		var new_go_els=new Array();
		for(var i=0; i<go_els.length; i++){
			var el=go_els[i];
			var time=new Date();
			time=time-el.time_go_value;
			if(time>=1000)
				el.innerHTML=Math.round((el.start_value+el.delta_value)*100)/100;
			else {
				new_go_els[new_go_els.length]=el;
				el.innerHTML=Math.round(el.start_value*100+el.delta_value*time/10)/100;
			}
		}
		go_els=new_go_els;
		if(go_els.length) setTimeout(goValue, 41);
	}
	
	var pages=new Array();
	this.regNumPages=function(calcid,el_id){
		var el=document.getElementById(el_id);
		pages[calcid]=el;
		registerDependedEl(pages[calcid].id,null,"AristPrice.chengeAllTotals('" + calcid + "');");
		
	}
	return this;
}

AristPrice=new CAristPrice;