$(function () {
		P.module('currency', function () {
			var currencyTypes = [],
				$popup = $('#converter_popup').slidebox(),
				$input = $popup.find('#ipt_currency_name'),
				$results = $popup.find('.results');

			function Currency (specs) {
				return P.augment(specs, {
					getMatch: function (str) {
						var reg = new RegExp('\\b' + str, 'i');
						if (reg.test(specs.currency_label)) {
							return { 
								label: specs.currency_label.replace(reg, '<strong style="text-transform: capitalize;">' + str + '</strong>'),
								code: specs.currency_code
							};
						} else {
							return false;
						}
					}
				});
			}

			function currencyFeedCallback (feed) {
				var i, results = feed.results;
				for (i = 0; i < feed.total; i++) {
					currencyTypes.push(Currency(results[i]));
				}
			}

			function convert (code, amount, callback) {
				$.get('/feeds/currency_converter.php?currency_code=' + code.toUpperCase() + '&amount=' + amount, callback);
				$popup.slidebox('go', 1).find('.conversion').text('Converting...');
				$popup.find('.back').hide();
			}

			function change (e) {
				var $this = $(this);
				$results.empty();
				if ($this.val().length < 1) return;
				$.each(getMatches($this.val()), function () {
					$results.append('<li><a href="javascript:;" class="currency_selection" code="' + this.code + '">' + this.label + '</a></li>');
				});
			}

			function select (e) {
				var code = $(this).attr('code'),
					label = $(this).text();
				convert(code, 365, function (response) {
					$popup.find('.conversion').text(response + ' ' + label + 's');
					$popup.find('.back').show();
				});
			}

			function show (e) {
				$popup.css({
					opacity: 0,
					left: e.pageX + 'px',
					top: e.pageY + 'px'
				}).animate({
					opacity: 1
				}, 400);
			}

			function close (e) {
				$popup.animate({
					opacity: 0
				}, 400, function () {
					$popup.slidebox('go', 0).css({
						left: '-9999px'
					});
					$input.val('Currency conversion provided as estimate only');
				});
				$results.empty();
			}

			function getMatches (str) {
				var results = [];
				$.each(currencyTypes, function (i) {
					var result = this.getMatch(str);
					if (result) {
						results.push(result);
					}
				});
				return results;
			}

			return {
				init: function () {
					$.getJSON('/feeds/feeder.php?cmd=get_currency_types', currencyFeedCallback);
					$input.css('width','100%').css('color', '#999').val('Currency conversion provided as estimate only').keyup(change);
					$('.convert_this').click(show);
					$('.currency_selection').live('click', select);
					$popup.find('.back').click(function () {
						$popup.slidebox('go', 0);
					});
					$popup.find('.close').click(close);
				}()
			};
		});
});