//	      ___           ___           ___           ___           ___           ___           ___       ___           ___     
//  	   /\__\         /\  \         /\  \         /\  \         /\__\         /\  \         /\__\     /\  \         /\__\    
//	    /::|  |       /::\  \       /::\  \       /::\  \       /:/  /        /::\  \       /:/  /    /::\  \       /::|  |   
//	   /:|:|  |      /:/\:\  \     /:/\:\  \     /:/\ \  \     /:/__/        /:/\:\  \     /:/  /    /:/\:\  \     /:|:|  |   
//	  /:/|:|__|__   /::\~\:\  \   /:/  \:\  \   _\:\~\ \  \   /::\__\____   /:/  \:\  \   /:/  /    /::\~\:\  \   /:/|:|  |__ 
//	 /:/ |::::\__\ /:/\:\ \:\__\ /:/__/ \:\__\ /\ \:\ \ \__\ /:/\:::::\__\ /:/__/ \:\__\ /:/__/    /:/\:\ \:\__\ /:/ |:| /\__\
//	 \/__/~~/:/  / \/__\:\/:/  / \:\  \  \/__/ \:\ \:\ \/__/ \/_|:|~~|~    \:\  \ /:/  / \:\  \    \/__\:\/:/  / \/__|:|/:/  /
//	       /:/  /       \::/  /   \:\  \        \:\ \:\__\      |:|  |      \:\  /:/  /   \:\  \        \::/  /      |:/:/  / 
//	      /:/  /        /:/  /     \:\  \        \:\/:/  /      |:|  |       \:\/:/  /     \:\  \       /:/  /       |::/  /  
//	     /:/  /        /:/  /       \:\__\        \::/  /       |:|  |        \::/  /       \:\__\     /:/  /        /:/  /   
//	     \/__/         \/__/         \/__/         \/__/         \|__|         \/__/         \/__/     \/__/         \/__/    
//
//
//
//		© 2010 Utbildningslabbet AB
//
//		Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files 
//		(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, 
//		publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
//		subject to the following conditions:
//
//		The above copyright notice, ascii art and this permission notice shall be included in all copies or substantial portions of the Software.
//		The Software shall be used for Good, not Evil.
//
//		THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
//		MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
//		FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
//		WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

$(function () {
	
	// enable placeholder support
	$('input[placeholder]').placeholder();
	
	// validator
	$.tools.validator.localize("sv", {
		'*' : 'Felaktigt ifyllt',
		':email' : 'Felaktig e-post',
		':number' : 'Måste vara en sifra',
		':url' : 'Felaktig webbadress',
		'[max]' : 'Sifran ska vara mindre än: $1',
		'[min]' : 'Sifran ska vara större än $1',
		'[required]' : 'Måste anges'
	});	
	var inputs = $("#invoice_order").validator({ lang: 'sv' });
	
	///////////////////////////////////////////////////////////////
	
	var mac = {
		cookie_cart: store.get('cart') || [],
		orderid: store.get('orderid'),
		cart: [],
		products: null
	};
	
	var calculations = {
		total: 0,
		grand_total: 0,
		shipping: 19,
		fees: 25,
		discount: 0
	};
	
	var params = {
		discount: true, // true / false
		discount_string: null,
		ordernumber_inv: null,
		address_lev: false
	};
	
	var messages = {
		cc_ok: "<div id='#status_cc'><h2>Din beställning är genomförd!</h2><p>En beställningsbekräftelse kommer skickas till din e-post</p><p>Pengarna dras när beställningen har skickats till dig.</p></div>",
		cc_fail: "<div id='#status_cc'><h2>Din betalning gick tyvärr inte igenom.</h2><p><a href='http://store.macskolan.com/'>Klicka här för att ladda om sidan och försöka igen</a></p></div>",
		discount_ok: "<p id='discount_status' class='failure'>Felaktig rabattkod</p>",
		getaddr_fail: "<div id='status_addr' class='failure'>Fyll i giltigt personnummer / orgnr</div>",
		order_empty: "<div id='status_pay' class='failure'>Du har inga varor i kundvagnen. Klicka på en vara längst upp på sidan för att gå vidare med beställningen.</div>",
		order_noval: "<div id='status_pay' class='failure'>Vänligen fyll i dom markerade fälten för att gå vidare med beställningen.</div>"
	};
	
	$(window).hashchange( function(){
		var hash = location.hash;
			$("#stage_1").hide();
	    $("#stage_0").fadeIn();
		if (hash.match(/^#\/person/)) {
			$("#stage_0").hide();
			$("#stage_1").fadeIn();
		}
		
		if (hash.match(/^#\/cc/)) {
			$("form").hide();
			$("#totals").hide();
			$(".cart_header").hide();
			$("#status_cc").empty();
			
			if (hash === "#/cc_ok") {
				store.remove("orderid");
				store.remove("cart");
				$("header").after(messages.cc_ok);
			}
			if (hash === "#/cc_fail") {
				$("header").after(messages.cc_fail);
			}
		}
  });


 

  $(window).hashchange();
	
	(function () { // generate and set order id in storage
		var d = new Date(),  
				rand;
		
		if (mac.orderid) {
			params.ordernumber_inv = mac.orderid;
		} else { // new orderid
			// Generate orderid. 
			rand = [d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getMilliseconds()].join('');
			rand += Math.floor(Math.random() * (100 - 10) + 10);
			
			store.set('orderid', rand); // set orderid
			params.ordernumber_inv = rand;
		}
	}());
	
	//////////////////////////////////////////////////////////////
	
	var mac_cart = {
		set: function () {
			mac.cart = [];	
			for (var i = 0, len = mac.cookie_cart.length; i < len; i += 1) {
				var key = mac.cookie_cart[i],
						o = {};
				
				// assign properties to object
				o.artno = key;
				o.inc = i;
				o.prod_title = mac.products[key].prod_title; 
				o.unit_price = mac.products[key].unit_price; 
				o.prod_img = mac.products[key].prod_img; 
				o.quantity = 1;
				
				mac.cart.push(o); // add object(s) to cart array
			} // end for
			
			this.view(); //draw-view
			this.calc(); //do-calc
		},
		view: function () { // link to template + other stuff
			var cart = mac.cart,
					self = this;
					
			$(".products").empty();
			$("#carttmpl").tmpl({cart: cart}).appendTo(".products");
			
			$("div.product").each(function (i) { // bind inputs to the data items
				var product = cart[i];
				$("input.product", this).link(product);
				
				$(product).bind("changeData", function () {
					self.calc(); //re-calc
				});
				
				// remove product
				$(".product-remove", this).click(function () {		    
					cart.splice(i, 1); //splice clicked prod out of the array
					
					var cookie_cart = mac.cookie_cart;
					cookie_cart.splice(i, 1);
					store.set('cart', cookie_cart);				
					
					self.view(); //re-draw
					self.calc(); //re-calc
				});
			});
		},
		viewParams: function () {
			$("#form").empty();
			$("#formtmpl").tmpl(params).appendTo("#form");
			$(".params").link(params);
		},
		calc: function () {
			var c = calculations;
			c.total = 0;
			c.grand_total = 0;
			
			$(mac.cart).each(function (i) {
				var quant = mac.cart[i].quantity,
						price = mac.cart[i].unit_price;
				if (quant) {
					c.total += (quant * price);
				}
			});
						
			discount_tot = (c.discount < 1 ? (c.total) * (1 - c.discount) : c.total - c.discount);
			
			if (c.total) {
				c.grand_total = (Math.round((discount_tot) + c.shipping + c.fees)).tPenge();
			}		
			c.total = c.total.tPenge();
			
			(function () {
				$("#totals").empty();
				$("#totalstmpl").tmpl(calculations).appendTo("#totals");
			}());
		}
	};
	
	mac_cart.viewParams();
	
	///////////////////////////////////////////////////////////////////////////////////////////////////
	
	$.ajax({ url: 'products.json', async: false, dataType: "json",
	  success: function(data) {
			mac.products = data; // push into mac obj
			mac_cart.set();
	  }
	});
	
	///////////////////////////////////////////////////////////////////////////////////////////////////
	
	var actions = {
		get_discount: function () {
			$.get("php/helpers/get_discount.php?ds=" + params.discount_string, function (data) {			
				calculations.discount = +(data); //add to object
				
				var status = $("#get_discount"),
						discount = 0;
				
				$("#discount_status").remove();				
				if (data === "0") {
					status.after(messages.discount_ok);
				} else {
					discount = (data < 1 ? (100 * data) + "%" : data + " SEK");

					status.after("<p id='discount_status' class='success'>" + discount + " Rabatt!</p>");
				}
				
				mac_cart.calc();
			});
		},
		add_product: function (that) {
			var artno = that.attr("id"), 
					cart = mac.cookie_cart;
			
			if ($.inArray(artno, cart) > -1) { 
				//var asd2 = JSON.stringify(mac.cart);
				// lägg till en till i kvantiteten, hur fan letar man i en array med objekt?!
			}
			else {
				cart.push(artno);
				store.set('cart', cart);
				
				mac_cart.set();
			}
		},
		get_adress: function () {
			var pno = $("#pno").val(), 
					regex = pno.match(/(\d{4,8}(-)?\d{3,4}(\w)?)/);
						
			(function loader() {
				$("#get_adress").after("<img src='images/ajax-loader.gif' id='loader' alt='load' />");
			}());
			
			//get_address flow: only if country is sweden and pno matches regex
			if (regex) {
				$.get("php/helpers/get_addr.php?pno=" + pno, function (data) {
					var address = data.split(" ; ", 5),
							address_multi,
							multi_addr_list;

					// if there was a error returned by klarna
					if (data.match(/^!/)) {
						$("#loader, #status_addr").remove();

						$("#get_adress").after("<div id='status_addr' class='failure'>" + data + "</div>");
					}

					// success
					else {
						$("#loader, #status_addr").remove();
						$(".addr_data").removeClass("hidden");

						$("#fname").val(address[0]);
						$("#lname").val(address[1]);
						$("#street").val(address[2]);
						$("#zip").val(address[3]);
						$("#city").val(address[4]);

						// determine if business
						selects.customer_type("privat");
						if (address[0] === "") {
							selects.customer_type("foretag");
						}

						// Multiple addresses > choose
						if (data.match(/ ;  ; /)) {
							address_multi = data.split(" ;  ; ");
							address_multi[0] = address_multi[0].split(/^ ; /).join("");

							multi_addr_list = $("#multi_addr_list");
							multi_addr_list.empty();

							$("#multi_addr_list_container").removeClass("hidden");

							//interate over returned array and show a select list
							var frag = '';
							$.each(address_multi, function (i, value) {
								value = value.replace(/.{3}(209)(.+)?$/, '');

								frag += "<option>" + value + "</option>";
							});
							multi_addr_list.html(frag);
						}
					}
				});
			}
			
			//basically a general error going on here:
			else {
				$("#loader, #status_addr").remove();
				$("#get_adress").after(messages.getaddr_fail);
		  }
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////

	$("#get_adress").click(function () {
		actions.get_adress();
	});
	
	$("#get_discount").live('click', function() {
		actions.get_discount();
	});
	
	$(".add_product").click(function () {
		that = $(this);
		actions.add_product(that);
	});
	
	///////////////////////////////////////////////////////////////////////////////////////////////////

	//apply the chosen addr from the selection-list (multiple addresses)
	$("#multi_addr_list").change(function () {
		var addr = $("select[id='multi_addr_list'] option:selected").val().split(" ; ");
		
		$("#lname").val(addr[0]);
		$("#street").val(addr[1]);
		$("#zip").val(addr[2]);
		$("#city").val(addr[3]);
	});
	
	///////////////////////////////////////////////////////////////////////////////////////////////////
	
	var selects = {
		paymethod: {
			set:  function () {
				var	how = store.get('payment_method');
				if (how) {
					$("input[value=" + how + "]").attr("checked", true);
				} else {
					how = $("input[name='payment_method']:checked").val();
				}
				
				params.pay_method = how;
				this.view(how);
			},
			update:	function (method) { 
				store.set('payment_method', method);
				params.pay_method = method;

				this.view(method);
			},
			view: function (method) {
				var cc = $(".cc_data"),
						invoice = $(".inv_data");
						addr = $(".addr_data");
								
				if (method === "cc") {
					cc.removeClass("hidden");
					invoice.addClass("hidden");
					addr.removeClass("hidden");
					
					$("#pno").removeAttr("required");
					
					$(calculations).data("fees", 0);
				} else {
					cc.addClass("hidden");
					invoice.removeClass("hidden");
					addr.addClass("hidden");
					
					$("#pno").attr("required", true);
					
					$(calculations).data("fees", 25);
				}
				mac_cart.calc();
			}
		},
		
		customer_type: function (type) {
			var fname = $("#fname").parent();
					message = $("#message").parent();
			
			if (type === "foretag") {
				message.removeClass("hidden");
				fname.addClass("hidden");
				$("#fname").removeAttr("required");
				
			} else {
				message.addClass("hidden");
				fname.removeClass("hidden");
				$("#fname").attr("required", true);
			}
		},
		
		address_lev: function (bool) {
			params.address_lev = bool;

			this.shipping_fee();
			
			if (bool) {
				$(".lev_data").removeClass("hidden");
				$("#name_lev, #street_lev, #zip_lev, #city_lev").attr("required", true);
				
			} else {
				$(".lev_data").addClass("hidden");
				$("#name_lev, #street_lev, #zip_lev, #city_lev").removeAttr("required");
			}
		},
		
		shipping_fee: function (country) {
			var	country_lev = $("#country_lev").val(),
					country_cc = $("#country").val();
										
			$(calculations).data("shipping", 0);
			
			if (params.pay_method === "invoice") {
				if (country !== "Sverige") {
					$(calculations).data("shipping", 40);
					$(".addr_data").removeClass("hidden");
					$(".int_invoice_data").removeClass("hidden");
					$("#get_adress").addClass("hidden");
				} else {
					$(".int_invoice_data").addClass("hidden");
					$("#get_adress").removeClass("hidden");
				}
			} 
			else {
				if (!params.address_lev && country_cc !== "Sverige") {
					$(calculations).data("shipping", 40);
				}
				if (params.address_lev && country_lev !== "Sverige") {
					$(calculations).data("shipping", 40);
				}
			}
			mac_cart.calc();
		}
	};
	
	selects.paymethod.set();

	///////////////////////////////////////////////////////////////////////////////////////////////////

	$("[name=payment_method]").change(function () {
		selects.paymethod.update($(this).val());
	});
			
	$("#address_lev").change(function () {
		selects.address_lev($(this).is(":checked"));
	});
	
	$("#country_list, #country, #country_lev").change(function () {
		selects.shipping_fee($(this).val());
	});
	
	///////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////
	
	$.fn.clearForm = function() {
	  return this.each(function() {
	    var type = this.type, tag = this.tagName.toLowerCase();
	    if (tag === 'form') {
	      return $(':input',this).clearForm();
	    }
	    if (type === 'text' || tag === 'email') {
	      this.value = '';
	    }
	  });
	};
	
	///////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////

	$("#invoice_order").submit(function (event) {
		event.preventDefault(); 
		
		var button = $("#submit_order"),
				validate = inputs.data("validator").checkValidity(),
				cart_status = null,
				calc_total = +(calculations.total);
				
		if (!calc_total) {
			validate = false;
			cart_status = false;
			
		} else {
			cart_status = true;
		}
		
		// disable button
		button.attr({"value": "Bearbetar beställning...", "disabled": "disabled"}).addClass("disabled");
		
		(function loader() {
			button.after("<img src='images/ajax-loader.gif' id='loader' alt='load' />");
		}());
		
		// hack
		$("[name=quantity]").each(function () {
		   $(this).attr("name", "quantity[]");
		});
		
		$(".addr_data").removeClass("hidden");
		
		if (validate) {
			$.get("php/save.php?", $(this).serialize() , function (data) {
				$("#status_pay, #loader").remove();
				
				button.after("<div id='status_pay'>" + data + "</div>");
				
				if (data.match(/^!/)) {
					button.attr("value", "Skicka Beställning").removeAttr("disabled").removeClass("disabled");
					$("#status_pay").addClass("failure");
					
					$("[name=quantity]").each(function () {
					   $(this).attr("name", "quantity");
					});
				} else {
					button.hide();
					$("#status_pay").addClass("success");
				}
			});
		}
		else {
			button.attr("value", "Skicka Beställning").removeAttr("disabled").removeClass("disabled");
			$("#status_pay, #loader").remove();
			
			if (!cart_status) {
				button.after(messages.order_empty);
			} else {
				button.after(messages.order_noval);
			}
			
			$("[name=quantity]").each(function () {
			   $(this).attr("name", "quantity");
			});
		}
	});
	
	///////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////
	
	$("#feedback_form").submit(function (event) {
		event.preventDefault();		
		var button = $("#submit_feedback");
		
		button.attr({"value": "Bearbetar formulär...", "disabled": "disabled"}).addClass("disabled");
		(function loader() {
			button.after("<img src='images/ajax-loader.gif' id='loader_fb' alt='load' />");
		}());
		
		$.get("php/feedback.php?", $(this).serialize() , function (data) {
			$("#status_feedback, #loader_fb").remove();
			button.after("<div id='status_feedback'>" + data + "</div>");
			
			if (data.match(/^!/)) {
				button.attr("value", "Skicka meddelande").removeAttr("disabled").removeClass("disabled");
				$("#status_feedback").addClass("failure");
			}
			else {
				button.hide();
				$("#status_feedback").addClass("success");
				$("#feedback_elms").hide();
			}
		});
	});
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////////////////////////////
		
	$(".prev_def").click(function (event) {
		event.preventDefault(); // for "dead: #" links
	});
		
	// Lightbox me stuff
	$("#click_pers-info").click(function () {
	  $("#pers-info").lightbox_me();
	});
	
	$("#click_pers-addr").click(function () {
	  $("#pers-addr").lightbox_me();
	});
	
	$("#klarna_invoice").click(function () {
	  $("#klarna_information").lightbox_me();
	});
	
	$("#faq_info").click(function () {
	  $("#faq_info_box").lightbox_me();
	});
	
	$(".feedback_modal").click(function () {
	  $("#feedback_contact_box").lightbox_me();
	});
	
	
});
