(function($) {

    $.fn.groups = function(settings) {
	
		settings = $.extend({
			ageClass: 'age',
			childAge: 13,
			maxChildren: 3,
			maxAdults: 4,
			numberNights: 2,
			coupleCost: 150,
			adultCost: 75,
			addMemberButton: 'addMember',
			removeMemberButton: 'removeMember',
			addPartnerButton: 'addPartner',
			removePartnerButton: 'removePartner',
			addChildButton: 'addChild',
			removeChildButton: 'removeChild',
			memberTemplate: 'memberTemplate',
			partnerTemplate: 'partnerTemplate',
			childTemplate: 'childTemplate'
		}, settings);
		
		var self = $(this);
		var numAdults = $.groups.countAdults(self, settings);
		var numChildren = $.groups.countChildren(self, settings);

		var memberPrototype = $('textarea#'+settings.memberTemplate).val();
		var partnerPrototype = $('textarea#'+settings.partnerTemplate).val();
		var childPrototype = $('textarea#'+settings.childTemplate).val();

		return this.each(function () {
			
			if(self.hasClass('disabled')) {
				$('a', self).bind('click', function(e){
					e.preventDefault();
				})
				$('input, select', self).bind('focus', function(e) {
					$(this).blur();
				})
				
				
				
				
				return false;
			}
			
			
			/* apply addMember buttons */
			$('a.addMember').live('click', function(e) { 
				e.preventDefault();
				$.groups.addMember(self, settings, memberPrototype, $(this));
			});
			
			/* apply removeMember Buttons */
			$('a.'+settings.removeMemberButton, self).live('click', function(e) { 
				e.preventDefault(); 
				$.groups.removeMember(self, settings, $(this));
			});
			
			/* apply addPartner buttons */
			$('a.'+settings.addPartnerButton, self).live('click', function(e) { 
				e.preventDefault();
				$.groups.addPartner(self, settings, partnerPrototype, $(this));
			});
			
			/* apply removePartner Buttons */
			$('a.'+settings.removePartnerButton, self).live('click', function(e) { 
				e.preventDefault(); 
				$.groups.removePartner(self, settings, $(this));
			});
			
			/* apply addChild Buttons */
			$('a.'+settings.addChildButton, self).live('click', function(e) { 
				e.preventDefault(); 
				$.groups.addChild(self, settings, childPrototype, $(this));
			});
			
			/* apply removeChild buttons */
			$('a.'+settings.removeChildButton, self).live('click', function(e) { 
				e.preventDefault(); 
				$.groups.removeChild(self, settings, $(this));
			});
			
			/* prevent ages less than 13*/
			$('input.'+settings.ageClass, self).live('blur', function(e) {
				$.groups.blurAdultAge(self, settings, $(this));
			})
			
			/* prevent ages over than 13*/
			$('input.childAge', self).live('blur', function(e) {
				$.groups.blurChildAge(self, settings, $(this));
			})
			
			/* prevent non-numerics on age inputs */
			$('input.age, input.childAge').live('keyup', function(){
				age = $(this).val().replace(/[^0-9]/g,'').substring(0,2);
				$(this).val(age);
			});
			
			/* apply reset to default button */
	
		});
		
	}
	
	
	$.groups = {
	
		addMember: function(self, settings, prototype, element) {
			var nextClass = self.find('table.memberRow:last').parents('tr:first').hasClass('even-row')?'odd-row':'even-row';
			var Id = $.groups.nextId(self, settings);
			var template = $.groups.replaceId(prototype, Id);
			var member = $(template);
			member.find('table.memberRow').parents('tr').addClass(nextClass);
			member.appendTo($(' > tbody', self));
			numAdults = $.groups.countAdults(self, settings);
			numChildren = $.groups.countChildren(self, settings);
		},
	
		/* get the next row Id */
		nextId: function(self, settings) {
			var arr = new Array();
			$('tbody tr', self).each(function(k, e) {
				current_id = $(this).attr('id').replace(/row_/gi, '');
				arr.push(current_id);
			});
			var id = arr.max();
			id++;
			return id;
		},
	
		replaceId: function(str, id) {
			return str.replace(/\{id\}/gi, id);
		},
	
	
		blurAdultAge: function(self, settings, element) {
			if($(element).val() <= settings.childAge) {
				alert('Adults must be over the age of '+settings.childAge);
				$(element).val('').focus();
			}
		},
		
		blurChildAge: function(self, settings, element) {
			if($(element).val() > settings.childAge) {
				alert('Children must be under the age of '+(settings.childAge+1));
				$(element).val('').focus();
			}
		},
	
		/* count the number of rows */
		 countRows: function(self, settings) {
			numRows = $('table tbody tr', self).length;
			return numRows;
		},
		

		/* count the number of adults */
		countAdults :function(self, settings) {
			
			numAdults = $('tr.memberOuter, tr.partnerOuter', self).length;
			//alert(numAdults);
			if(numAdults >= settings.maxAdults) {
				$('a.'+settings.addMemberButton).fadeOut();
				$('a.'+settings.addPartnerButton).fadeOut();
			} else {
				$('a.'+settings.addMemberButton).fadeIn();
				$('tr.memberOuter').each(function(){
					if($(this).next('tr').hasClass('partnerOuter') == false) {
						$('a.'+settings.addPartnerButton, $(this)).fadeIn();
					}
				})
				// show partner only if 
				
			}
			
			return numAdults;
			
			
		/*
			// work out costs
			var tCost = 0;
			var cost = 0;
			$('table tbody tr', self).each(function(k, row){
				if(k=='0') {
					cost = (settings.coupleCost*settings.numberNights);
					$('span.rowCost', row).text(cost.toFixed(2)); 
				} else {
					cost = 0;
					if($('.memberOuter', row).length) cost += (settings.adultCost*settings.numberNights);
					if($('.partnerOuter', row).length) cost += (settings.adultCost*settings.numberNights);
					$('span.rowCost', row).text(cost.toFixed(2)); 
				}
				tCost += cost;
			})
			$('span.totalCost').text(tCost.toFixed(2)); 
		*/
		
			
		},
	
		/* count the number children*/
		countChildren: function(self, settings) {
			numChildren = self.find('tr.childOuter').length;
			
			//alert(numChildren)
			
			if(numChildren >= settings.maxChildren) {
				$('a.'+settings.addChildButton).fadeOut();
			} else {
				$('a.'+settings.addChildButton+':hidden').fadeIn();
			}
			return numChildren;
		},
		
		
	
		addPartner: function(self, settings, prototype, element) {
			if($(element).parents('tr').find('.partnerOuter').length) {
				return false;
			}
			
			var parent = $(element).parents('table.memberRow');
			var Id = parent.parents('tr:first').attr('id').replace(/row_/gi, '');
			var template = $.groups.replaceId(prototype, Id);
			$(template).insertAfter($(element).parents('tr').find('.memberOuter')).fadeIn();
			numAdults = $.groups.countAdults(self, settings);
			$(element).fadeOut();
		},
		
		
		
		addChild: function(self, settings, prototype, element) {
			numChildren = $.groups.countChildren(self, settings);
			if(numChildren+1 > settings.maxChildren) {
				alert('Only '+settings.maxChildren+' children allowed');
				return false;
			}
			var parent = $(element).parents('table.memberRow');
			var Id = parent.parents('tr:first').attr('id').replace(/row_/gi, '');
			var template = $.groups.replaceId(prototype, Id);
			var Cid = parseInt(parent.find('tr.childOuter').length);
			template = template.replace(/\{cid\}/gi, Cid);
			$(template).find('td').hide().end().appendTo(parent).find('td').fadeIn();
			numAdults = $.groups.countAdults(self, settings);
			numChildren = $.groups.countChildren(self, settings);
		},
		
		removeMember: function(self, settings, element) {
			var row = $(element).parents('table.memberRow:first').parents('tr:first');
			row.find(' > td').fadeOut(function() { 
				$(this).parent().remove();
				numAdults = $.groups.countAdults(self, settings);
			});
			
		},
		
		removePartner: function(self, settings, element) {
			$(element).parents('tr.partnerOuter:first').find('td').fadeOut(function() { 
				$(element).parents('tr.partnerOuter:first').remove();
				numAdults = $.groups.countAdults(self, settings);
			});
		},
		
		removeChild: function(self, settings, element) {
			$(element).parents('tr.childOuter:first').find('td').fadeOut(function() { 
				$(this).parent().remove();
				numChildren = $.groups.countChildren(self, settings);
			});
			if(numChildren < settings.maxChildren) {
				$(element).parents('.childOuter').find('a.'+settings.addChildButton).fadeIn();
			}
		}
		
	};	
	
	Array.prototype.max = function () {
		if (this.length == 0) return undefined;
		var n = Number(this[0]);
		for (var i=1; i<this.length; i++) {n = Math.max(n, this[i])};
		return n;
	}
		
})(jQuery);
