function updateUnifiedCheckout() {
	$("#delivery_addr").css("display", $("#c_separate_addresses").is(":checked") ? "": "none");
	var $forComp =  $("#c_order_for_comp");
	var isForComp = ($forComp.attr("type") == "hidden" || $forComp.is(":checked"));
	$("#co-comp_name-tr,#co-comp_bic-tr").css("display", (isForComp ? "" : "none"));
}

function bindOptionGroupsToSelectBoxes() {
	$(".descr_optgroup").each(function() {
		var optgroup = $(this);
		var options = $("input[type=radio]", this);
		if(options.length == 0) return;
		var selectBox = $("<select>", {
			"name":	options[0].name,
			"id":	"c_" + options[0].name
		});
		var descrSpan = $("<span>", {"class": "meth_descr meth_descr_stat"});
		options.each(function(){
			var val = $(this).attr("value");
			var text = $("#meth_text_"+val).text();
			var descr = $("#meth_descr_"+val).text();
			selectBox.append($("<option>", {
				"value":	val,
				"text":		text,
				"title":	descr,
				"selected":	($(this).is(":checked") ? "selected": null)
			}));
		});
		var changeFunc = function(){descrSpan.text($("option:selected", this).attr("title"));};
		selectBox.change(changeFunc);
		
		var wrapper = $("<div>", {"class": "meth_select_wrapper"}).append(selectBox).append(descrSpan);		
		$(this).parent().empty().append(wrapper);
		changeFunc.call(selectBox);
	});	
}

function updatePName() {
	var firstName = $("#c_firstname").val();
	var lastName = $("#c_lastname").val();
	$("#c_p_name,#c_d_name").each(function(){
		if(!$(this).data("touched")) $(this).val(firstName + " " + lastName);
	});
}

function getCurrentDeliveryMethodID() {
	var methId = $("#c_delivery_method").val();
	if(!methId) {
		methId = $("input[name=delivery_method]:checked").val();
	}
	return methId;
}

var lastSelectedMHId = null;
var lastMhReq = null;

function updateMatkahuoltoLocations()
{
	if(!window.methodModuleMap) { // Assume something weird happened and we don't have the full page we need; bail out!
		return;
	}
	var $mhDiv = $("#matkahuolto_lahella_selection");
	var methId = getCurrentDeliveryMethodID();
	var methInfo = methodModuleMap[methId];
	if(!methInfo) return;
	
	var mhid = $("input[name=matkahuolto_select]:checked").val();
	if(!mhid) mhid = $("#mh_selectbox").val();
	if(mhid) window.lastSelectedMHId = mhid;

	if (methInfo.module.indexOf("Matkahuolto") > -1)
	{
		
		var fieldPrefix = "#c_p_";
		if($("#c_separate_addresses").is(":checked")) fieldPrefix = "#c_d_";
		
		var request_data = {
			"OfficeType":		(methInfo.officeType || ""),
			"City":				$(fieldPrefix+"city").val(),
			"PostalCode":		$(fieldPrefix+"zipcode").val(),
			"StreetAddress":	$(fieldPrefix+"street").val()
		};

		$mhDiv.html("Haetaan toimipaikkoja, odota hetki...");

		if(lastMhReq) {
			try { lastMhReq.abort(); } catch(e) { }
			lastMhReq = null;
		}

		lastMhReq = $.ajax({
			url:		matkahuoltoOfficesURL,
			data:		request_data,
			dataType:	"json",
			success:	function(data){
				renderMatkahuoltoSelectionHTML($mhDiv, data);
			}
		});
	}
	else
	{
		$mhDiv.empty();
	}
}

function renderMatkahuoltoSelectionHTML($mhDiv, data) {
	lastMhReq = null;
	if(data.error) {
		$mhDiv.empty();
		$mhDiv.text(data.error);
		return;
	}
	
	$mhDiv.empty();
	var selectorStyle = (window.matkahuoltoSelectorStyle || "normal");
	if(selectorStyle == "normal") {
		
		var $table = $("<table>", {"width": "100%"});
		$mhDiv.append($table);
		var $tr = $("<tr>");
		$table.append($tr);
		$.each(data.data, function(){
			var officeData = this;
			var checkBoxId = "mh_"+officeData.Id;
			var $officeDiv = $("<td>",  {"align": "center", "valign": "top"});
			var $officeImg = $("<img>", {"align": "center", "src": officeData.imageSrc})
			var $officeButton = $("<input>", {"align": "center", "id": checkBoxId, "name": "matkahuolto_select", "type": "radio", "value": officeData.Id});
			// IE 7 and 6 can't really handle dynamically created radio buttons properly
			if ($.browser.msie && $.browser.version <= 7){
				$officeButton = $('<input align="center" name="matkahuolto_select" type="radio" value="'+officeData.Id+'" id="'+checkBoxId+'" />');
			}
			
			$officeDiv.append($("<label>", {"for": checkBoxId}).
				append($officeImg).
				append("<br/>").
				append(
					officeData.Name + "<br/>" +
					officeData.StreetAddress + "<br/>" +
					officeData.PostalCode + "<br/>" +
					officeData.City + "<br/>"
				)
			).append($officeButton);
			$tr.append($officeDiv);
		});
		if(lastSelectedMHId) $("input[name=matkahuolto_select][value=" + lastSelectedMHId + "]").attr("checked", "checked");
	} else if(selectorStyle == "select") {
		var $select = $("<select>", {
			"id":		"mh_selectbox",
			"name":		"matkahuolto_select",
			"class":	"mh_selectbox",
			"style":	"width:100%"
		});
		
		$.each(data.data, function(){
			var officeData = this;
			var $option = $("<option>", {
				"value":	officeData.Id,
				"text":		officeData.Name + " -- " + officeData.StreetAddress + ", " + officeData.PostalCode + " " + officeData.City
			});
			$select.append($option);
		});
		var $table = $(
			"<table class='checkout_table' style='width:100%'><tr>" + 
			"<td class='co-caption-td'><label>Matkahuollon toimipaikka</label></td>" + 
			"<td class='co-field-td'><div class='mhcdiv'></div></td>" +
			"</tr></table>"
		);
		$mhDiv.append($table);
		$(".mhcdiv", $table).append($select);
		if(lastSelectedMHId) $select.val(lastSelectedMHId); 
	}
}

function addPrinettiOfficeData(officeInfoDiv, data) {
	officeInfoDiv.empty();
	
	if(!data.data) {
		officeInfoDiv.append("<p>Postinumerolla ei löydy toimipaikkoja</p>");
		officeInfoDiv.append("<input type='hidden' name='prinetti_office_code' value=''>");
		return false;
	}
	
	officeInfoDiv.append("<p><b>Kaupunki: </b>"+data.data[0].City+"</p>");
	officeInfoDiv.append("<p><b>Alue: </b>"+data.data[0].Area+"</p>");
	officeInfoDiv.append("<p><b>Aukiolo: </b>"+data.data[0].Availability+"</p>");
	officeInfoDiv.append("<p><b>Osoite: </b>"+data.data[0].LabelAddress+"</p>");
	officeInfoDiv.append("<input type='hidden' name='prinetti_office_code' value='"+data.data[0].FetchLocationCode+"|"+data.data[0].LabelAddress+"|"+data.data[0].Area+"'>");
	return true;
}

function updatePrinettiSearch() {
	var methId = $("#c_delivery_method option:selected, #c_delivery_method_tab :checked").val();
	var searchDiv = $("#prinetti_search_div");
	var methInfo = methodModuleMap[methId];

	if(!methInfo || methInfo.module.indexOf("Prinetti") < 0 || methInfo.allowAltFetchOffice == "Ei") {
		searchDiv.hide();	
		return false;
	}
	searchDiv.show();
	
	var postalCodeField = $("#c_p_zipcode");
	var searchInput = $("#prinettiZipCodeSearchField");
	var officeInfoDiv = $("#prinettiPickUpPoint");
	
	officeInfoDiv.empty();
	officeInfoDiv.append("<p>Haetaan tietoja...</p>")

	if(!searchInput.val()) {
		searchInput.val(postalCodeField.val());
	}
	
	prinettiOfficeData = $.ajax({
		url:		prinettiOfficesURL+"?postalCode="+searchInput.val(),
		dataType:	"json",
		success:	function(data){
			addPrinettiOfficeData(officeInfoDiv, data);
		}
	});
	return true;
}

var $deliveryMethodSelector; // Can be used by other .js on the unified checkout page too.
var $paymentMethodSelector;

function initUnifiedCheckout() {
	updateUnifiedCheckout();
	if(!(window.useOptionGroups)) bindOptionGroupsToSelectBoxes();

	$("#c_separate_addresses,#c_order_for_comp").change(updateUnifiedCheckout);
	$("#c_p_name,#c_d_name").live("focus", function(){$(this).data("touched", true);});
	$("#c_firstname,#c_lastname").live("keypress", updatePName).live("change", updatePName);
	$deliveryMethodSelector = $("#c_delivery_method,input[name=delivery_method]");
	$paymentMethodSelector = $("#c_payment_method,input[name=payment_method]");
	
	$deliveryMethodSelector.change(updateMatkahuoltoLocations);
	$deliveryMethodSelector.change(updatePrinettiSearch);
	$("#prinettiZipCodeSearchButton").click(updatePrinettiSearch);
	$("#c_p_zipcode,#c_d_zipcode,#c_p_city,#c_d_city,#c_p_street,#c_d_street").blur(updateMatkahuoltoLocations);

	$("#useAltFetch").click(function(){
		var check = $("#useAltFetch:checked");
		if(check.val()){
			$("#prinettiZipCodeSearchField").removeAttr("disabled");
		} else {
			$("#prinettiZipCodeSearchField").attr("disabled", "disabled");
		}
	});

	setTimeout(function() {
		updateMatkahuoltoLocations();
	}, 500);

	//initUnifiedUpdateForm();
	bindDiscountLinesModify();
}
function initUnifiedUpdateForm(){
	var updateBtn = $("input#update_btn");
	updateBtn.replaceWith(
		$("<a>", {
			"text": updateBtn.val(),
			"class": "button right",
			"href": "#"
		}).bind("click", function(){
			$(this).attr("disabled", "true");
			var $form = $("#checkout_unified_basket_form");
			var data = $form.serialize();
			$.ajax({
				url:		$form.attr("action") || location.href,
				type:		"post",
				data:		data,
				dataType:	"html",
				success:	function(html) {
					$form.replaceWith($("<div>").html(html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')).find("#checkout_unified_basket_form"));
					initUnifiedUpdateForm();
				},
				error:		function(){
					$form.submit();
				}
			});
			//$("#checkout_unified_basket_form").submit();
			return false;
		})
	);
}

function checkjQueryVersion(majorReq, minorReq) {
	if(jQuery.fn && jQuery.fn.jquery) {
		var parts = jQuery.fn.jquery.split(".");
		var major = parseInt(parts[0]);
		var minor = parseInt(parts[1]);
		if(major < majorReq) return false;
		if(minor < minorReq) return false;
		return true;
	}
	return false;
}

function bindDiscountLinesModify() {
	$(".freeProdSelect").live("change", function(){
		var selectedProdId = $(this).val();
		var rel = $(this).attr("rel");
		var args = {};
		args[rel] = selectedProdId;
		$.post(discountLinesModifyURL, args);
	})
}

$(document).ready(initUnifiedCheckout);
