﻿/*
 * Clonefield 1.1 - jQuery plugin to allow users to duplicate/remove DOM elements
 *
 * Copyright (c) 2008/2009 João Gradim
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 */
(function($){

	var _cloned_elemsb = [];
	var nClonedElemsb = -1;
	var _cfCounterb = 0;
	var _cfClassb = "remove-cloned-fieldb";
	$.fn.cloneFieldB = function(elems, options) {
		
		var opts = $.extend({}, $.fn.cloneFieldB.defaults, options);
		
		return this.each(function() {
			var $this = $(this);
			var ob = $.meta ? $.extend({}, opts, $this.data()) : opts;
			
			if(!ob.useCounter) {
				var hcb = '<input type="hidden" id="clonefield-counterb" name="clonefield-counterb" value="'+ob.startVal+'" />';
				$this.after(hcb);
				var counterFieldb = $("input#clonefield-counterb");
			}
			else {
				var counterFieldb = $("input#"+ob.useCounter);
			}
			if(ob.allowRemove) {
				_remove_btn = $this.clone(ob.clone).attr("id","clonefield-removeb").text(ob.removeLabel);
				$this.after(_remove_btn);
			}
			_cfCounterb = ob.startVal;
			$this.bind(ob.event, function() {
				if(_cfCounterb == ob.maxClones + 1 && ob.maxClones > 0)
					return false;
				
				counterFieldb.val(++_cfCounterb);
				elems.each(function() {
					
					// new element id and name
					var eIDb = $(this).attr("id").replace(/\d+$/,"");
					
					if(ob.method == "number")
						var eNameb = $(this).attr("name").replace(/\d+$/,"");
					else
						var eNameb = $(this).attr("name").replace(/\[\]$/,"");
					
					// label for element
					if(ob.label) {
						var eLabel = $("label[for="+$(this).attr("id")+"]").text().replace(/\d+/, _cfCounterb);
						
						_cloned_elemsb.push(
							$("label[for="+$(this).attr("id")+"]")
							.clone(ob.clone)
							.text(eLabel)
							.attr("for", eIDb+_cfCounterb)
							.insertBefore($this));
					}
					
					var _nameSuffixb = (ob.method == "number") ? _cfCounterb : '[]';
					
					// element
					 _cloned_elemsb.push($(this)
						.clone(ob.clone)
						.attr("id", eIDb+_cfCounterb)
						.attr("name", eNameb+_nameSuffixb)
						.attr("value", ob.value)
						.insertBefore($this)); 
					
				});
				nClonedElemsb = (nClonedElemsb == -1) ? _cloned_elemsb.length : nClonedElemsb;
				return false;
			});
			_remove_btn.bind(ob.event,function(){
				if(_cfCounterb > 1) {
					if(_cloned_elems.length) {
						for(var i = 0; i < nClonedElemsb; i++) {
							_cloned_elemsb.pop().remove();
						}
					}
					$("."+_cfClassb+_cfCounterb).remove();
					counterFieldb.val(--_cfCounterb);
				}
				return false
			});
		});
	};
	
	$.fn.cloneFieldB.defaults = {
		allowRemove: true,		// allow removal of cloned elements; automatically creates removal button based on "add" button markup to create consistency
		removeLabel: "Remove",	// text for removal button
		maxClones: 0,			// maximum number of cloned fields
		label: true,			// create label for cloned elements, based on existing labels
		labelAfter: '',			// html to add after the cloned labels
		labelWrap: '',			// html to wrap cloned labels in
		clone: true,			// copy associated event handlers
		after: '<br />',		// html to add after the cloned elements
		wrap: '',				// html to wrap clone elements in
		value: '',				// default 'value' attribute for cloned elements
		event: 'click',			// event to trigger cloning of elements
		startVal: 1,			// start value of cloned elements
		method:	'array',		// either 'array' (for name="name[]") or 'number' (for name="name1", name="name2", etc...)
		useCounter: false		// use existing hidden field for keeping track of number of cloned elements
	}
})(jQuery);
