// $Id: node_cloning.js 3042 2007-06-19 08:17:41Z zeke $

// counter - for js tag additions
var counter = 0;

//
// Disable 'delete tag' button if there is only one copy of tag to clone
//
function fn_check_last_tag(tag)
{
	if (!tag.previousSibling || tag.previousSibling.id == 'header' || typeof(tag.previousSibling.id) == 'undefined') {
		return true;
	}

	return false;
}

//
// Remove the tag
//
function fn_remove_tag(tag_id, nocheck)
{
	if(document.getElementById) {
		src = document.getElementById("box_"+tag_id);
		if(typeof(nocheck) == "undefined") {
			if (!fn_check_last_tag(src)) {
				src.parentNode.removeChild(src);
			}
		}
		else {
			src.parentNode.removeChild(src);
		}
	}
}


function fn_replace(substring, level)
{
	var re = new RegExp();
	var i = 0;
	re.compile("\\[\\d+\\]", "g");

	for (i=1; i<=level; i++) {
		re.exec(substring);
	}

	substring = RegExp.leftContext+'['+counter+']'+RegExp.rightContext;
	return substring;
}

//
// Adds the tag
//
// @tag_id - tag id that should be cloned
// @level - level in variable name that should be replaced
// @clone - if set, the field values will be copied
// E.g. (replace on '30')
// level = 1, varname = data[20][sub][50] - after replacement data[30][sub][50]
// level = 2, varname = data[20][sub][50] - after replacement data[20][sub][30]

function fn_add_tag(tag_id, level, clone)
{
	var j = 0;
	var i = 0;
	var re_names = new RegExp();
	var re_ids = new RegExp();

	if(document.getElementById) {
		counter++;
		new_id = tag_id+"_"+counter;

		src = document.getElementById("box_"+tag_id);
		var newNode = src.cloneNode(true);
		newNode.id = "box_"+new_id;

		re_names.compile("\\w*(\\[\\w*\\])+", "gi");
		node_elms = newNode.getElementsByTagName('*');

		for (i=0;i<node_elms.length;i++) {
			if (node_elms[i].id.length>0) {
				if (node_elms[i].name == 'remove' && node_elms[i].id == tag_id) {
					node_elms[i].style.display = 'none';
					node_elms[i+1].style.display = '';
				}
				if (node_elms[i].id != 'header') {
					node_elms[i].id = node_elms[i].id + '_'+counter;
				}
			}

			if (node_elms[i].htmlFor) {
				node_elms[i].htmlFor += '_' + counter;
			}


			if (node_elms[i].nodeName=='TD') {
				if (node_elms[i].style.display == 'none' && clone != 'Y') {
					node_elms[i].style.display = '';
				}
			}

			// Remove all javascript code from new tag
			if (node_elms[i].nodeName=='SCRIPT') {
				node_elms[i].parentNode.removeChild(node_elms[i]);
				continue;
			}

			if (node_elms[i].name) {
				 var matches = node_elms[i].name.match(re_names);
				 if (matches) {
					new_name = node_elms[i].name.str_replace(matches[0],fn_replace(node_elms[i].name,level));

					// IE can not handle renaming radioboxes properly
					if (browser_info.browser == 'Internet Explorer' && node_elms[i].type == 'radio') {
						var newelm = document.createElement('<input type="radio" name="'+ new_name +'" value="' + node_elms[i].value +'" />');
						newelm.onclick = node_elms[i].onclick;
						newelm.id = node_elms[i].id;
						newelm.defaultChecked = node_elms[i].defaultChecked;
						newelm.className = node_elms[i].className;
						node_elms[i].replaceNode(newelm);
					} else {
						node_elms[i].name = new_name;
					}
				 }
			}
		}

		// Insert node into the document
		newNode = src.parentNode.insertBefore(newNode,src.nextSibling);
		// Process INPUT types...

		child_inputs = newNode.getElementsByTagName('INPUT');
		parent_inputs = src.getElementsByTagName('INPUT');
		for (i=0;i<child_inputs.length;i++) {

			if (child_inputs[i].type!='file' && child_inputs[i].type!='hidden') { // Skip values assignment for file and hidden input types
				child_inputs[i].value = (clone == "Y")? parent_inputs[i].value : '';
			}
			if (child_inputs[i].type=='button' || child_inputs[i].type=='radio' || child_inputs[i].type=='checkbox') { // Skip values assignment for file input type.
				child_inputs[i].value = parent_inputs[i].value;
			}
			if (child_inputs[i].type == 'radio' || child_inputs[i].type == 'checkbox') { // Assignment checked state for checkboxes and radios.
				child_inputs[i].checked = (clone == "Y")? parent_inputs[i].checked : parent_inputs[i].defaultChecked; 
			}
		}

		// Process TEXTAREA type...
		child_texts = newNode.getElementsByTagName('TEXTAREA');
		parent_texts = src.getElementsByTagName('TEXTAREA');
		for (i=0;i<child_texts.length;i++) {
			child_texts[i].value = (clone == "Y")? parent_texts[i].value : '';
		}

		// Process SELECT type...
		child_selects = newNode.getElementsByTagName('SELECT');
		parent_selects = src.getElementsByTagName('SELECT');
		for (i=0;i<child_selects.length;i++) {
			for (j=0;j<child_selects[i].options.length;j++) {
				child_selects[i].options[j].selected = (clone == "Y")? parent_selects[i].options[j].selected : parent_selects[i].options[j].defaultSelected;
			}
		}
	}
}
