(function($) {
	
	var RMHC = window.RMHC || {};

	RMHC.Ecard = {
		
		textAreaMaxLength: 500,
		
		init: function() {
			RMHC.Ecard.buildPreview();
			RMHC.Ecard.events();
		},
		
		buildPreview: function() {
			$('#preview')
				.css('display', 'block');
		},
		
		events: function() {
			$('input[name=recipient_name_1]').keyup(function(event) {
				var text = $(this).val();
				// For IE display bug
				if (text.length < 1) {
					$('#preview-receiver-name').html('&nbsp;')
					return;
				}
				$('#preview-receiver-name').safeHtml(text);
			}).keyup();
			
			$('input[name=recipient_email_1]').keyup(function(event) {
				var text = $(this).val();
				if (text.length) {
					text = '(' + text + ')';
				}
				$('#preview-receiver-email').safeHtml(text);
			}).keyup();
			
			// max length keyup must come before preview keyup
			$('textarea[name=message]').maxLength({limit: RMHC.Ecard.textAreaMaxLength});
			$('textarea[name=message]').keyup(function(event) {
				var wrapped = $.wordWrap($(this).val(), 30, " ", true); 
				$('#preview-message').safeHtml(wrapped);
			}).keyup();
			
			$('input[name=sender_name]').keyup(function(event) {
				$('#preview-sender-name').safeHtml($(this).val());
			}).keyup();
			
			$('#template li').click(function(event) {
				var input = $('input', this);
				input.attr('checked', 'checked');
				$('#preview').removeClass().addClass('template' + input.val());
			});
			$('#template input[checked=checked]').parent().click();
		},
		
		textAreaLimit: function(textarea) {
			var limit = RMHC.Ecard.textAreaMaxLength;
			var text = $(textarea).val();
			
			if (text.length > limit) {
				$(textarea).val(text.substr(0, limit));
				return false;
			} else {
				return true;
			}
			
		}
		
	};

	$(document).ready(RMHC.Ecard.init);
	
	/*
	 * Plugins
	 */
	/* safeHtml */
	$.fn.safeHtml = function(text) {
		var safeText = text
			.replace(/&/g, '&amp;')
			.replace(/</g, '&lt;')
			.replace(/>/g, '&gt;');
		return this.each(function() {
			$(this).html(safeText);
		});
	};
	
	/* MaxLength */
	$.fn.maxLength = function(settings) {
		
	    if (typeof settings == 'string') {
	        settings = { limit: settings };
	    }
	
	    settings = $.extend({}, $.fn.maxLength.defaults, settings);
	    
	    return this.each(function () {
			var el = this;
	        var field = this,
	        	$field = $(field),
	        	$form = $(field.form),
	        	limit = parseInt(settings.limit),
	        	$charsLeft = $form.find(settings.feedback);
	
	    	function limitCheck(event) {
	        	var len = el.value.length,
	        	    exceeded = len >= limit,
	        		code = event.keyCode;

	        	if ( !exceeded )
	        		return;
	
	            switch (code) {
	                case 8:  // allow delete
	                case 9:
	                case 17:
	                case 36: // and cursor keys
	                case 35:
	                case 37: 
	                case 38:
	                case 39:
	                case 40:
	                case 46:
	                case 65:
	                    return;
	
	                default:
	                    return settings.words && code != 32 && code != 13 && len == limit;
	            }
	        }
	
	
	        var updateCount = function () {
	            var len = el.value.length,
	            	diff = limit - len;
	
	            $charsLeft.html( diff || "0" );
	
	            // truncation code
	            if (settings.hardLimit && diff < 0) {
	            	field.value = settings.words ? 
	            	    // split by white space, capturing it in the result, then glue them back
	            		field.value.split(/(\s+)/, (limit*2)-1).join('') :
	            		field.value.substr(0, limit);
	
	                updateCount();
	            }
	        };
	
	        $field.keyup(updateCount).change(updateCount);
	        if (settings.hardLimit) {
	            $field.keydown(limitCheck);
	        }
	
	        updateCount();
	    });
	};
	
	$.fn.maxLength.defaults = {
		limit: 255,
	    useInput: false,
	    hardLimit: true,
	    feedback: '.charsLeft'
	};
	
	/* Wordwrap */
	$.wordWrap = function( str, int_width, str_break, cut ) {
	    // PHP Defaults
	    var m = ((arguments.length >= 2) ? arguments[1] : 75   );
	    var b = ((arguments.length >= 3) ? arguments[2] : "\n" );
	    var c = ((arguments.length >= 4) ? arguments[3] : false);
	 
	    var i, j, l, s, r;
	 
	    str += '';
	 
	    if (m < 1) {
	        return str;
	    }
	 
	    for (i = -1, l = (r = str.split("\n")).length; ++i < l; r[i] += s) {
	        for(s = r[i], r[i] = ""; s.length > m; r[i] += s.slice(0, j) + ((s = s.slice(j)).length ? b : "")){
	            j = c == 2 || (j = s.slice(0, m + 1).match(/\S*(\s)?$/))[1] ? m : j.input.length - j[0].length || c == 1 && m || j.input.length + (j = s.slice(m).match(/^\S*/)).input.length;
	        }
	    }
	 
	    return r.join("\n");
	};


})(jQuery);

