function cart(settings){
	var self=this;	
	DOMReady(function(){
		for (key in settings) self[key]=settings[key];
		self.form=DOM(self.formID);		
		self.form.listen('submit', function(e){
			self.addElement();
		});
		self.informer=DOM(self.informerID);
		self.fader=DOM(self.faderID);
		self.rules=DOM('order_rules');
		if (self.rules){
			document.body.appendChild(self.rules);
		}
		self.fader.listen('click', function(){self.hideForm();});
		
	});
}

cart.prototype.addElement= function(){	
	if (op.locked(this.form.id)) return;
	var count=this.form['count_'+this.area_id].value;
	if (!/^[1-9]\d*$/.test(count)){
		alert('Количество должно быть числом.');
		return;
	}
	op.lock(this.form.id);
	//send form:	
	this.popup.loading();
	if (this.rules){
		setElementOpacity(this.rules,0.5);
	}
	var self=this;
	op.query(this.action, function(resp){
		var cart=resp.selectStruct('cart');
		
		for (key in cart){			
			if (t=DOM(self.namespace+'.'+key)){				
				t.innerHTML=cart[key];
			}			
		}
		if (cart.isValid){
			DOM('basket_valid_button').style.display='';
			DOM('basket_invalid_button').style.display='none';
		}
		else {
			DOM('basket_valid_button').style.display='none';
			DOM('basket_invalid_button').style.display='';
		}
		if (!self.informer.clientHeight){
			//display informer if it is hidden:
			self.informer.style.visibility='hidden';
			self.informer.style.display='block';
			var height=parseInt(self.informer.clientHeight);
			//put out of display:
			self.informer.style.top='-'+height+'px';
			self.informer.style.visibility='visible';
			//animate display:
			op.animateRange(function(h){				
				document.body.style.paddingTop=h+'px';				
				var top=height-h;
				self.informer.style.top='-'+top+'px';
			}, 
			function(){
				op.free(self.form.id);
			}, 
			0, height, self.animateStep, self.animateWait, null)
		}
		else {
			op.free(self.form.id);
		}		
		self.popup.loaded();		
		self.hideForm();
	},op.toArray(this.form));
}

cart.prototype.hideForm= function(){	
	this.popup.hide();
	this.fader.hide();	
	if (this.rules){
		this.rules.hide();
	}
}

cart.prototype.displayForm= function(sender, e){

	var properties=sender.id.split('.');
	this.form['class_'+this.area_id].value=properties[0];
	this.form['id_'+this.area_id].value=properties[1];
	this.form['count_'+this.area_id].value='1';		
	var position=this.popup.show(sender, e);
	if (this.rules){		
		this.rules.style.top=position.top+'px';
		
		
		this.rules.style.visibility='hidden';
		this.rules.style.display='block';
		var left=position.left-this.rules.clientWidth;
		this.rules.style.left=left+'px';
		this.rules.style.display='block';
		this.rules.style.visibility='visible';
	}
	
	this.form['count_'+this.area_id].focus();
	DOM(this.faderID).show();
	return false;
}

cart.popupInsertBeforeSender= function(divID){
	var ret=[];
	ret.show= function(rel){
		var div=DOM(divID);
		rel.parentNode.insertBefore(div, rel);
		div.show();
	};
	ret.hide= function(){
		DOM(divID).hide();		
	};
	ret.loading= function(){
		setElementOpacity(DOM(divID),0.5);		
	}
	ret.loaded= function(){
		setElementOpacity(DOM(divID),1);
	}
	return ret;
}

cart.popupEvent= function(divID, settings){
	var ret=[];
	ret.show= function(rel, e){				
		var div=DOM(divID);
		div.style.visibility='hidden';
		div.style.display='block';
		e=op.event(e);
		x=e.pageX-div.offsetWidth-settings.left;
		y=e.pageY-div.offsetHeight-settings.top;
				
		div.style.left=x+'px';
		div.style.top=y+'px';
		div.style.visibility='visible';
		return {left:x, top:y};
	};
	ret.hide= function(){
		DOM(divID).hide();		
	};
	ret.loading= function(){
		setElementOpacity(DOM(divID),0.5);
	}
	ret.loaded= function(){
		setElementOpacity(DOM(divID),1);
	}
	return ret;
}

cart.needConfirm=false;
cart.isOrderEnabled=null;

cart.onChangeCount= function(){
	var submit=DOM('cart_recalculate');
	submit.style.display='';
	cart.needConfirm=submit.title;
}

cart.onOrder= function(){
	//confirmation:
	if (cart.needConfirm){
		if (confirm(cart.needConfirm)){
			DOM('cart_recalculate').form.submit();
			return false;
		}		
	}
	//external check:
	if (cart.isOrderEnabled){
		if (!cart.isOrderEnabled()) return false;
	}
	
	return true;
}

cart.orderForm= function(id){
	DOMReady(function(){		
		var form=DOM(id);
		var areaID=form.getAttribute('rel');
		var prepareID= function(id){
			return id.substr(0, id.length-areaID.length-1);
		}
		
		form.inputs=[];
		//init inputs:
		var inputs=form.getElementsByTagName('input');
		for (var i=0; i<inputs.length; i++) form.inputs[prepareID(inputs[i].id)]=inputs[i];
		var inputs=form.getElementsByTagName('textarea');
		for (var i=0; i<inputs.length; i++) form.inputs[prepareID(inputs[i].id)]=inputs[i];
		var inputs=form.getElementsByTagName('select');
		for (var i=0; i<inputs.length; i++) form.inputs[prepareID(inputs[i].id)]=inputs[i];
		//init labels:
		form.labels=[];
		
		
		var labels=form.getElementsByTagName('label');
		for (var i=0; i<labels.length; i++) form.labels[prepareID(labels[i].htmlFor)]=labels[i];
		
		form.throwError= function(input){			
			alert(form.getAttribute('rev')+form.labels[prepareID(input.id)].innerHTML.toLowerCase().stripTags());
			input.focus();
			return false;
		}		
		form.listen('submit', function(){
			if (!form.inputs.PHONE.value){
				alert(form.inputs.PHONE.value);
				return form.throwError(form.inputs.PHONE);
			}
			if (!form.inputs.REGION.value){
				return form.throwError(form.inputs.REGION);
			}
			if (!form.inputs.CITY.value){
				return form.throwError(form.inputs.CITY);
			}			
			if (!form.inputs.POSTAL_INDEX.value){
				return form.throwError(form.inputs.POSTAL_INDEX);
			} 
			if (!form.inputs.INBOX.value && !form.inputs.ADDRESS.value){
				form.inputs.ADDRESS.focus();
				alert(form.labels.ADDRESS.title);
				return false;
			}
			if (!form.inputs.PAYMENT_TYPE.value){
				return form.throwError(form.inputs.PAYMENT_TYPE);
			}
			return true;
		});
	});
}
//init geo targetting:
cart.prototype.applyGeo= function(settings){
		
	if (typeof YMaps == 'undefined'){		
		return;
	}
	if (!YMaps.location){
		return;
	}	
	for (var i=0; i<settings.length; i++){		
		if (this.geoCheck(settings[i].query)){			
			DOM(settings[i].display).show();
			return;
		}
	}
}

cart.prototype.geoCheck= function(q){
	for (var key in q){
		if (YMaps.location[key]!=q[key]) return false;
	}
	return true;
}
