//*** START page initialization ***//

$(function () {

	// for tooltip positioning
	$("#body").css({ "position": "static" });

	// sort the partners list (just in case)... this is failing on IE?
	partners = partners.sort(function (a, b) {
		try {
			a = a.name.toLowerCase();
			b = b.name.toLowerCase();
			if (a === b) { return 0; }
			else { return (a > b ? 1 : -1); }
		} catch(e) {
			return 0;
		}
	});
	
	// show some initially-hidden elements
	$(".show_on_load").show();
	
	// criteria types
	$("#criteria").append("<p>Search for a Visa card provider by selecting the product and/or partner type(s) you are looking for.</p>");
	$("#criteria").append("<div id='product'>Products<ul></ul></div>");
	$("#criteria").append("<div id='partner'>Partner Type<ul></ul></div>");
	$("#criteria").append('<div class="clear"></div>');
	$("<a id='clear'>Clear all</a>").click(clear_filters).appendTo("#criteria");
	
	// draw the criteria select boxes
	$.each(criteria, function(key, criterion) {
		var $item = $("<li><input type='checkbox'><label><a href='javascript:void(0)'>" + criterion.name + "<\/a></label></li>");
		criterion.checkbox = $item.find("input").click(toggle_filter);
		criterion.checkbox.get(0).criterion = criterion;
		criterion.span = $item.find("a").mouseover(jq_tooltip);
		criterion.span.get(0).criterion = criterion;
		$item.appendTo("#" + criterion.type + " ul");
	});
	
	// the 'no matches' info
	$("<div id='nomatches'>Your search did not return any results. Please modify your selection.<\/div>").hide().appendTo("#partners");
	
	$.each(partners, function(i, partner) {
		// create list divs for partners, and attach references to the objects
		partner.div = $("<div>").appendTo("#partners");
		$("<a class='partner_name' href='#partner" + i + "' id='partner" + i + "'>" + partner.name + "<\/a>").appendTo(partner.div).click(popover).get(0).partner = partner;
		var list = $("<ul>").appendTo(partner.div);
		$.each(criteria, function(key, criterion) {
			if (criterion.type === "partner" && partner[key]) {
				list.append("<li>" + criterion.name + "</li>");
			}
		});
	});
	
	$("#print_reference").click(print_page); // TODO
	$("#close_reference").click(close_popover);
	// remove the annoying Firefox blur on links
	$("a").click(function() {if (this.blur()) this.blur()});
});

//*** END page initialization ***//

//*** START filter code ***//

// toggle an individual filter
function toggle_filter() {
	this.criterion.apply = this.checked;
	window.setTimeout(apply_filters, 5);
}

// clear all filters
function clear_filters() {
	$.each(criteria, function(key, criterion) {
		criterion.checkbox.attr("checked", "");
		criterion.apply = false;
	});
	window.setTimeout(apply_filters, 5);
}

// take the active filter set and show/hide providers
function apply_filters() {
	close_popover();
	var total_shown = partners.length;
	$.each(partners, function(i, partner) {
		var show = true;
		$.each(criteria, function(key, criterion) {
			// criterion is applied, and partner does not have that criterion
			if (criterion.apply && !partner[key]) { show = false; }
		});
		if (show) {
			partner.div.show("normal");
		} else {
			partner.div.hide("normal");
			total_shown--;
		}
	});
	if (total_shown === 0) {
		$("#nomatches").show("normal");
	} else {
		$("#nomatches").hide("normal");
	}
}

//*** END filter code ***//

//*** START tooltip/popover code ***//

// like the visa.js tooltip, but customized for the data on this page
// attached to (and refers to) specific DOM nodes
function jq_tooltip() {
	$(this).mouseout(function () { $("#tooltip").hide(); });
	$("#tooltip_text").html(this.criterion.description);
	var t = getAbsoluteTop(this) - 10;
	var l = getAbsoluteLeft(this) + this.offsetWidth + 10;
	$("#tooltip").css({ top: t, left: l }).show();
}

// similar to the tooltip code, but on click and no auto-hide
function popover() {
	var selected = this.partner;
	if ($("#popover").get(0).partner == selected) return; // already open
	$("#footer").css("padding-bottom", "300px");
	$.each(partners, function(i, partner) {
		if (partner.div.css("display") === "none") { return; }
		else if (partner === selected) { partner.div.fadeTo("normal", 1.0) ; }
		else { partner.div.fadeTo("normal", 0.4); }
	});
	$("#reference_name").html(selected.name);
	$("#reference_description").html(selected.description);
	$("#reference_address").html(formatAddress(selected));
	$("#reference_contact").html(formatContact(selected));
	$("#reference_product").empty();
	$("#reference_partner").empty();
	$.each(criteria, function(key, criterion) {
		if (selected[key]) { $("#reference_" + criterion.type).append(criterion.name + "<br/>"); }
	});
	var t = getAbsoluteTop(this) + this.offsetHeight;
	$("#popover").hide().css({ top: t }).slideDown("fast").get(0).partner = selected;
}

// closes the popover
function close_popover() {
	$("#footer").css("padding-bottom", "0");
	$("#popover").hide("fast").get(0).partner = null;
	$.each(partners, function(i, partner) {
		if (partner.div.css("display") === "none") { return; }
		else { partner.div.fadeTo("normal", 1.0); }
	});
}

function print_page() {
    print();
}

function formatAddress(partner) {
	var formattedAddress = partner.address_1;
	
	if(partner.address_2) {
		formattedAddress += "<br />" + partner.address_2;
	}
	
	formattedAddress += "<br />" + partner.city + ", " + partner.state + " " + partner.postal_code;
	
	return formattedAddress;
}

function formatContact(partner) {
	var formattedContact = "";
	
	if(partner.last_name) {
		formattedContact += partner.first_name + " " + partner.middle_name + " " + partner.last_name + "<br />";
		
		if(partner.title) {
			formattedContact += partner.title + "<br />";
		}
	}
	
	if(partner.email) {
		formattedContact += '<a href="mailto:' + partner.email + '">' + partner.email + "</a><br />";
	}
	
	if(partner.phone_area_code) {
		formattedContact += "Telephone: (" + partner.phone_area_code + ") " + partner.phone_number.substring(0, 3) + "-" + partner.phone_number.substring(3) + "<br />";
	}
	
	if(partner.fax_area_code) {
		formattedContact += "Fax: (" + partner.fax_area_code + ") " + partner.fax_number.substring(0, 3) + "-" + partner.fax_number.substring(3) + "<br />";
	}

	if(partner.url) {
		formattedContact += '<a href="' + partner.url + '" target="_blank">' + partner.url + "</a>";
	}
	
	return formattedContact;
}

//*** END tooltip/popover code ***//

