$(function(){
	im.init();
});

(function(){
	im = window.im || {};
	
	im.init = function(){
		$('.em a').click(function(e){
			e.preventDefault();
			im.modal.init($('#mail_form').clone().html());
			
			$('#dialog #from').focus();
			
			$('#dialog .cancel').click(function(e){
				e.preventDefault();
				im.modal.kill();
			});

			$('#dialog .submit').click(function(e){
				e.preventDefault();
				if(im.validate_email($('#dialog #from').val()) && $('#dialog #message').val().length > 0){
					im.errors.clear();
					$.ajax({
						url: '/',
						type: 'POST',
						data: $('#dialog #mail').serialize(),
						success: function(data){
							if(data.match('error:')){
								im.errors.add('Your message could not be sent.');
								im.errors.add(data);
							} else {
								im.modal.kill();
								im.errors.add('Your message was successfully sent.', true);
							}
						}
					});
				} else {
					im.errors.add('Please enter your e-mail address and a message.');
				}
			});
		});
		
		im.errors.init($('#errors'));
	};
	
	// utility object for modal dialog windows
	im.modal = {

		// entry point for modal functions
		init: function(html){
			im.modal.dialog(html);
		},

		// grey out the screen to prepare for dialog
		screen: function(){
			var screen = $('#screen');
			if(screen.length < 1){
				$('body').append('<div id="screen"></div>');
				screen = $('#screen');
				screen.animate({opacity:0.75,height:$(window).height()}, 600);
			} else if(!screen.is(':visible')){
				screen.animate({opacity:0.75,height:$(window).height()}, 600);
			} else {
				screen.fadeOut();
			}
			screen.click(function(){
				im.modal.kill();
			});
		},

		// pop actual dialog box
		dialog: function(html){
			im.modal.screen();

			var dialog = $('#dialog');
			if(dialog.length < 1){
				$('body').append('<div id="dialog"></div>');
				dialog = $('#dialog');
				dialog.append(html);
			} else if(!dialog.is(':visible')){
				dialog.fadeIn();
			}

			var offsetLeft = Math.floor((parseInt($(window).width(), 10) - 530) / 2),
				offsetTop = Math.floor((parseInt($(window).height(), 10) - 420) / 2);
			$('#dialog').css({'left':offsetLeft, 'top':offsetTop});
		},

		// kill screen & dialog
		kill: function(){
			$('#screen').remove();
			$('#dialog').remove();
			im.errors.clear();
		}

	};
	
	im.errors = {
		// initialize error event handling
		// - pass in jQuery collection containing UL element to house errors
		init: function(el){
			im.errors.el = el;
			el.live('error_change', function(e){
				$(this).find('li').length > 0 ? $(this).slideDown() : $(this).slideUp();
			});
		},

		// add errors to dom container
		// if flag is true, message is "success"-style, not "error"-style
		add: function(err, flag){
			im.errors.el.find('ul').append('<li>' + err + '</li>');
			im.errors.el.trigger('error_change');
			if(flag){
				$('#errors').addClass('success');
				$('#errors h5').text('Good news:');
			}
		},

		// clear error container
		clear: function(){
			im.errors.el.find('li').remove();
			im.errors.el.removeClass('success');
			$('#errors h5').text('There was an error:');
			im.errors.el.trigger('error_change');
		}
	};
	
	im.validate_email = function(email){
		var emRE = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i;
		return emRE.test(email);
	};
	
})();
