Cart=function(checkout,container){
	//hack to stop back cache
	window.onunload=function(){}

	this.cart_id="my-cart";
	this.hide_cart_name="hide-cart";

	this.checkout=checkout;
	this.cart_container=container;

	if(this.cart_container==null){
		//try to find a div called cart container first
		var cc=DOM.getElementById("cart-container");

		if(cc!=null){
			this.cart_container=cc;
		}else{
			this.cart_container=document.body;
		}
	}

	this.load_cart();
	this.link_setup();
}
Cart.prototype.load_cart=function(){
	var hidden=STD.get_cookie(this.hide_cart_name);

	if(hidden!=null){
		if(hidden=="true"){
			this.hidden=true;
		}else if(hidden=="false"){
			this.hidden=false;
		}
	}
}
Cart.prototype.link_setup=function(){
	var i=0;

	var links;
	var link;

	links=DOM.getElementsByClassName("show-cart");
	for(i=0;i<links.length;i++){
		link=links[i];
		link.onclick=STD.delegate(this,this.show_click);
	}

	var item_id;
	var data;
	var item_div;
	var div;
	var name;
	var price;

	var items=new Array();
	var item_data;

	var nodes;

	links=DOM.getElementsByClassName("add-to-cart");
	for(i=0;i<links.length;i++){
		link=links[i];
		link.onclick=STD.delegate(this,this.add_click);
	}

	links=DOM.getElementsByClassName("named-add-to-cart");
	for(i=0;i<links.length;i++){
		link=links[i];

		item_id=link.href.substring(link.href.indexOf("#")+1);
		items.push(item_id);
	}

	data=this.get_store_data(items);

	if(data!=null){
		for(i=0;i<links.length;i++){
			link=links[i];
			link.onclick=STD.delegate(this,this.add_click);

			item_id=items[i];

			nodes=DOM.xpath("//item[id="+item_id+"]",data);
			item_data=nodes[0];

			if(item_data!=null){
				item_div=DOM.createElement("div");
				item_div.className="item";

				if(DOM.hasClass(link,"last")==true){
					item_div.className="item last";
				}

				nodes=DOM.xpath("name",data,item_data);
				name=nodes[0].firstChild.nodeValue;
				div=DOM.createElement("div",name);
				div.className="name";
				item_div.appendChild(div);

				nodes=DOM.xpath("price",data,item_data);
				price=parseFloat(nodes[0].firstChild.nodeValue);
				div=DOM.createElement("div",STD.dollar(price));
				div.className="price";
				item_div.appendChild(div);

				link.parentNode.insertBefore(item_div,link);
				link.parentNode.removeChild(link);
				item_div.appendChild(link);
			}else{
				link.parentNode.removeChild(link);
			}
		}
	}

	items=new Array();
	links=DOM.getElementsByClassName("priced-add-to-cart");
	for(i=0;i<links.length;i++){
		link=links[i];

		item_id=link.href.substring(link.href.indexOf("#")+1);
		items.push(item_id);
	}

	data=this.get_store_data(items);
	if(data!=null){
		for(i=0;i<links.length;i++){
			link=links[i];
			link.onclick=STD.delegate(this,this.add_click);

			item_id=items[i];

			nodes=DOM.xpath("//item[id="+item_id+"]",data);
			item_data=nodes[0];

			if(item_data!=null){
				item_div=DOM.createElement("div");
				item_div.className="item";

				if(DOM.hasClass(link,"last")==true){
					item_div.className="item last";
				}

				nodes=DOM.xpath("price",data,item_data);
				price=parseFloat(nodes[0].firstChild.nodeValue);
				div=DOM.createElement("div",STD.dollar(price));
				div.className="price";
				item_div.appendChild(div);

				link.parentNode.insertBefore(item_div,link);
				link.parentNode.removeChild(link);
				item_div.appendChild(link);
			}
			else{
				link.parentNode.removeChild(link);
			}
		}
	}
}
Cart.prototype.build_mini_carts=function(){
	var mini_carts=DOM.getElementsByClassName("mini-cart");
	for(i=0;i<mini_carts.length;i++){
		this.render_mini_cart(mini_carts[i]);
	}
}
Cart.prototype.render_mini_cart=function(mini_cart){
	var new_min_cart=mini_cart.cloneNode(false);

	var my_cart=DOM.createElement("a","My Cart");
	my_cart.onclick=STD.delegate(this,this.show_click);
	my_cart.className="important show-cart";
	new_min_cart.appendChild(my_cart);

	var items=this.items();
	if(items!=null){
		var num_items=DOM.createElement("span",items.length+" items");
		new_min_cart.appendChild(num_items);

		var item;
		var nodes;
		var price;
		var total=0;

		for(var i=0;i<items.length;i++){
			item=items[i];

			nodes=DOM.xpath("price",item.ownerDocument,item);
			price=parseFloat(nodes[0].firstChild.nodeValue);
			total+=price;
		}

		var total_span=DOM.createElement("span","Total: $"+total);
		new_min_cart.appendChild(total_span);

		mini_cart.parentNode.replaceChild(new_min_cart,mini_cart);
	}
}
Cart.prototype.cart_action=function(action){
	var rpc=STD.rpc("/common/cart.php?"+action,"get");
	rpc.send(null);

	var data=rpc.responseXML;

	return data;
}
Cart.prototype.get_store_data=function(item_ids){
	if(item_ids.length>0){
		var rpc=STD.rpc("/common/store.php","post");

		var params="";
		for(var i=0;i<item_ids.length;i++){
			params+="ids[]="+item_ids[i];

			if(i<item_ids.length-1){
				params+="&";
			}
		}

		rpc.send(params);

		var data=rpc.responseXML;

		if(data==null){
			return null;
		}

		if(DOM.getElementByTagName("error",data)!=null){
			return null;
		}

		if(DOM.getElementByTagName("item",data)==null){
			return null;
		}

		return data;
	}
}
Cart.prototype.items=function(){
	var data=this.cart_action("cart-items=get");

	if(data!=null){
		var items=DOM.getElementsByTagName("item",data);
		return items;
	}

	return null;
}
Cart.prototype.render=function(){
	var cart_div=DOM.createElement("div");
	cart_div.setAttribute("id",this.cart_id);
	cart_div.className="cart";

	var hide=DOM.createElement("a","close");
	hide.className="close";
	hide.onclick=STD.delegate(this,this.hide_click);
	cart_div.appendChild(hide);

	var items_div=DOM.createElement("div");
	items_div.className="items small";

	var item_div;
	var item_id;
	var div;
	var remove_link;

	var item;
	var nodes;
	var name;
	var price;
	var total=0;

	var items=this.items();

	if(items.length>0){
		for(var i=0;i<items.length;i++){
			item=items[i];

			item_div=DOM.createElement("div");
			item_div.className="item";

			nodes=DOM.xpath("name",item.ownerDocument,item);
			name=nodes[0].firstChild.nodeValue;
			div=DOM.createElement("div",name);
			div.className="name";
			item_div.appendChild(div);

			nodes=DOM.xpath("price",item.ownerDocument,item);
			price=parseFloat(nodes[0].firstChild.nodeValue);
			total+=price;
			div=DOM.createElement("div",STD.dollar(price));
			div.className="price";
			item_div.appendChild(div);

			nodes=DOM.xpath("id",item.ownerDocument,item);
			item_id=nodes[0].firstChild.nodeValue;
			remove_link=DOM.createElement("a","remove");
			remove_link.className="remove-from-cart button";
			remove_link.setAttribute("href","#"+item_id);
			remove_link.onclick=STD.delegate(this,this.remove_click);
			item_div.appendChild(remove_link);

			items_div.appendChild(item_div);
		}
	}else{
		item_div=DOM.createElement("div","Your cart is empty.");
		items_div.appendChild(item_div);
	}

	cart_div.appendChild(items_div);

	var total_div=DOM.createElement("div");
	total_div.className="total";

	div=DOM.createElement("span","Subtotal: ");
	div.className="label";
	total_div.appendChild(div);

	div=DOM.createElement("span",STD.dollar(total));
	div.className="subtotal";
	total_div.appendChild(div);

	cart_div.appendChild(total_div);

	if(this.checkout!=null){
		var checkout=DOM.createElement("a","checkout");
		checkout.className="checkout button";
		checkout.setAttribute("href",this.checkout);

		cart_div.appendChild(checkout);
	}

	return cart_div;
}
Cart.prototype.add_click=function(event){
	var target=STD.target(event);
	var href=target.href;

	var item_id=href.substring(href.indexOf("#")+1);
	this.add(item_id);

	return false;
}
Cart.prototype.remove_click=function(event){
	var target=STD.target(event);
	var href=target.href;

	var item_id=href.substring(href.indexOf("#")+1);

	this.remove(item_id);

	return false;
}
Cart.prototype.add=function(item_id){
	var result=this.cart_action("add-item="+item_id);
	var error=DOM.getElementByTagName("error",result);

	if(error!=null){
		this.handle_errors(error);
	}else{
		this.update(true);
		this.save_state();
	}
}
Cart.prototype.remove=function(item_id){
	this.cart_action("remove-item="+item_id);
	this.update();
}


//STATES----------------------------------
Cart.prototype.show_click=function(event){
	this.show();
	this.save_state();
}
Cart.prototype.hide_click=function(event){
	this.hide();
	this.save_state();
}
Cart.prototype.update=function(force){
	if(this.hidden==false || force==true){
		this.show();
	}

	this.build_mini_carts();
	this.save_state();

	if(this.onchange!=undefined){
		this.onchange();
	}
}
Cart.prototype.show=function(){
	this.hidden=false;

	var cart=this.render();
	var current_cart=DOM.getElementById(this.cart_id);

	if(current_cart==null){
		this.cart_container.appendChild(cart);
	}else{
		if(current_cart.parentNode==this.cart_container){
			current_cart.parentNode.replaceChild(cart,current_cart);
		}else{
			current_cart.parentNode.removeChild(current_cart);
			this.cart_container.appendChild(cart);
		}
	}
}
Cart.prototype.hide=function(){
	this.hidden=true;

	var cart=DOM.getElementById(this.cart_id);

	if(cart!=null){
		cart.parentNode.removeChild(cart);
	}
}
Cart.prototype.save_state=function(){
	var rd=STD.root_domain();
	var cd="."+rd;

	if(this.hidden==true){
		STD.set_cookie(this.hide_cart_name,"true",cd);
	}else if(this.hidden==false){
		STD.set_cookie(this.hide_cart_name,"false",cd);
	}
}

//other functions
Cart.prototype.get_total=function(){
	var item;
	var price;
	var total=0;

	var items=this.items();
	var nodes;

	for(var i=0;i<items.length;i++){
		item=items[i];

		nodes=DOM.xpath("price",item.ownerDocument,item);
		price=parseFloat(nodes[0].firstChild.nodeValue);

		total+=price;
	}

	return total;
}
Cart.prototype.get_weight=function(){
	var item;
	var weight;
	var total=0;

	var items=this.items();
	var nodes;

	for(var i=0;i<items.length;i++){
		item=items[i];

		nodes=DOM.xpath("weight",item.ownerDocument,item);
		if(nodes.length>0){
			weight=parseFloat(nodes[0].firstChild.nodeValue);
			total+=weight;
		}
	}

	return total;
}
Cart.prototype.get_taxable_total=function(){
	var item;
	var price;
	var weight;
	var total=0;

	var items=this.items();
	var nodes;

	for(var i=0;i<items.length;i++){
		item=items[i];

		nodes=DOM.xpath("price",item.ownerDocument,item);
		price=parseFloat(nodes[0].firstChild.nodeValue);

		nodes=DOM.xpath("weight",item.ownerDocument,item);
		if(nodes.length>0){
			weight=parseFloat(nodes[0].firstChild.nodeValue);

			if(weight>0){
				total+=price;
			}
		}else{
			total+=price;
		}
	}

	return total;
}




//ERRORS
Cart.prototype.handle_errors=function(error){
	var error_message=error.firstChild.nodeValue;
	var code=parseInt(error.getAttribute("code"));

	var id;
	var message;
	var message_inner;
	var div;
	var h;
	var p;
	var span;

	switch(code){
		case 1:
			id="no-account-error";
			message=DOM.getElementById(id);

			if(message==null){
				message=DOM.createElement("div");
				message.setAttribute("id",id);
				message.className="cover-data";

				message_inner=DOM.createElement("div");
				message_inner.className="inner block";

				h=DOM.createElement("h1",error_message);
				message_inner.appendChild(h);

				p=DOM.createElement("p","You are trying to purchase a member only course. In order to purchase this course online, you must be a signed in.");
				message_inner.appendChild(p);

				div=DOM.createElement("div");
				div.className="block";

				link=DOM.createElement("a","sign in");
				link.className="button";
				link.setAttribute("href","https://account."+STD.root_domain()+"/sign-in/");
				div.appendChild(link);

				message_inner.appendChild(div);

				div=DOM.createElement("div");
				div.className="block";

				h=DOM.createElement("h2","Account Features");
				div.appendChild(h);

				p=DOM.createElement("p");
				div.appendChild(p);

				link=DOM.createElement("a","View");
				link.setAttribute("href","https://account."+STD.root_domain()+"/types/");
				p.appendChild(link);

				span=DOM.createElement("span"," the features you get by signing up with us.");
				p.appendChild(span);

				div.appendChild(p);

				message_inner.appendChild(div);

				div=DOM.createElement("div");
				div.className="block";

				h=DOM.createElement("h2","Don't have an account create one now!");
				div.appendChild(h);

				link=DOM.createElement("a","sign up");
				link.className="button";
				link.setAttribute("href","https://account."+STD.root_domain()+"/sign-up/");
				div.appendChild(link);

				message_inner.appendChild(div);

				message.appendChild(message_inner);
				message.style.display="block";
				document.body.appendChild(message);
			}

			Reveal.open(message);
			break;
		case 2:
			id="student-verification-error";
			message=DOM.getElementById(id);

			if(message==null){
				message=DOM.createElement("div");
				message.setAttribute("id",id);
				message.className="cover-data";

				message_inner=DOM.createElement("div");
				message_inner.className="inner block";

				h=DOM.createElement("h1",error_message);
				message_inner.appendChild(h);

				p=DOM.createElement("p","You are trying to purchase a student only course. In order to purchase this course online, you must be logged in and verified as a student.");
				message_inner.appendChild(p);

				var link;

				div=DOM.createElement("div");
				div.className="block";

				h=DOM.createElement("h2","If you do not have an account");
				div.appendChild(h);

				p=DOM.createElement("p","If you do not have an account please create one. Then go to student verification and enter your certificate number.");
				div.appendChild(p);

				link=DOM.createElement("a","sign up");
				link.className="button";
				link.setAttribute("href","https://account."+STD.root_domain()+"/sign-up/");
				div.appendChild(link);

				message_inner.appendChild(div);

				div=DOM.createElement("div");
				div.className="block";

				h=DOM.createElement("h2","If you have an account, but are not verified");
				div.appendChild(h);

				p=DOM.createElement("p","If you do have an account please sign in and verify yourself with a certificate number.");
				div.appendChild(p);

				link=DOM.createElement("a","get verified");
				link.className="button";
				link.setAttribute("href","https://account."+STD.root_domain()+"/student-verification/");
				div.appendChild(link);

				message_inner.appendChild(div);

				div=DOM.createElement("div");
				div.className="block";

				h=DOM.createElement("h2","If you do not have a certificate number");
				div.appendChild(h);

				p=DOM.createElement("p","If you are as student who purchased a course and you do not have a certificate number please contact us for assistance.");
				div.appendChild(p);

				message_inner.appendChild(div);

				message.appendChild(message_inner);
				message.style.display="block";
				document.body.appendChild(message);
			}

			Reveal.open(message);
			break;
		default:
			alert(error_message);
			break;
	}
}
