// Editor de grupos de elementos o invididuales
var editGroups = Array();
function loadAutoEdits() {
	var fields = document.getElementsByAttribute("autoEdit");
	var i = 0;
	for (i=0;i<fields.length;i++) {
		if (groupId = fields[i].getAttribute("editGroup")) {
			if(window.editGroups[groupId] == undefined) {
				editGroups[groupId]            = Array();
				editGroups[groupId]["elems"]   = Array();
				editGroups[groupId]["manuals"] = Array();
				editGroups[groupId]["loader"]  = Array();
				if (action = fields[i].getAttribute("editAction")) editGroups[groupId]["action"] = action;
				if (fields[i].getAttribute("editLoader")) editGroups[groupId]["loader"] = fields[i].getAttribute("editLoader");
			}
			if ((replace = fields[i].getAttribute("manualReplace")) && $(replace) && $(replace+"__container")) {
				manualReplace(fields[i],replace,true);
			} else createEditableText(fields[i], true);
		} else {
			createEditableText(fields[i], false);
		}
	}
}

function createEditableText(obj, isGroup) {
	// Switch modes
	var mode = obj.getAttribute("editMode");
	var editElement, staticElement, id, grupo, edit, name;
	edit = obj.getAttribute("autoEdit");
	if (isGroup) grupo = obj.getAttribute("editGroup");
	// Campo de edicion
	switch (mode) {
		case "multi"    : editElement = createTextArea();
		break;
		case "password" : editElement = createPassword();
		break;
		default         : editElement = createInput();
		break;
	}
	if (isGroup) {
		if (obj.id != undefined && obj.id != "") id = obj.id;
		else id = grupo + "_" + edit;
		name = "data["+edit+"]";
		editGroups[grupo]["elems"].push(id);
	} else {
		if (obj.id != undefined && obj.id != "") id = obj.id;
		else id = edit;
		name    = edit;
	}
	editElement.id            = id + "__edit";
	editElement.name          = name;
	editElement.style.display = "none";
	editElement.value         = obj.innerHTML;
	if (mode == "multi") {
		editElement.value = obj.innerHTML.replace(/<br>/g, "");
		editElement.value = editElement.value.replace(/<br \/>/g, "");
		editElement.value = editElement.value.replace(/<BR>/g, "");
	}
	// Texto estático
	staticElement    = obj.cloneNode(true);
	staticElement.id = id + "__static";
	staticElement.removeAttribute("autoEdit");
	staticElement.removeAttribute("editGroup");
	staticElement.removeAttribute("editMode");
	staticElement.removeAttribute("style");
	staticElement.removeAttribute("class");
	staticElement.removeAttribute("className");
	// Limpiar contenido y adjuntar nuevos nodos
	obj.id        = id;
	obj.innerHTML = "";
	obj.appendChild(staticElement);
	obj.appendChild(editElement);
}

function manualReplace(obj, replacement, isGroup) {
	var id, grupo;
	var aux_data = Array();
	if (isGroup) grupo = obj.getAttribute("editGroup");
	if (obj.id != undefined && obj.id != "") id = obj.id;
	else {
		id = replacement + "__static";
		obj.id = id;
	}
	aux_data["name"]        = obj.getAttribute("autoEdit");
	aux_data["id"]          = id;
	aux_data["replacement"] = replacement;
	if (type  = obj.getAttribute("replaceType")) {
		aux_data["type"] = type;
	}
	if (index = obj.getAttribute("selectDefault")) aux_data["default"] = index;
	editGroups[groupId]["manuals"].push(aux_data);
}

function editGroup(groupId) {
	if (window.editGroups[groupId] != undefined) {
		// Elementos normales
		for (i=0; i<window.editGroups[groupId]["elems"].length; i++) {
			name = window.editGroups[groupId]["elems"][i];
			hideThis(name+"__static");
			showThis(name+"__edit");
		}
		// Elementos manuales
		for (i=0; i<window.editGroups[groupId]["manuals"].length; i++) {
			var manual = window.editGroups[groupId]["manuals"][i];
			var id = (manual["replacement"] + "__container");
			var container = $(id);
			hideThis(manual["id"]);
			showThis(id);
			// Tipo
			if ((type = window.editGroups[groupId]["manuals"][i]["type"]) != undefined) {
				switch(type) {
					case "select" : if ((value = window.editGroups[groupId]["manuals"][i]["default"]) != undefined) {
										select = $(window.editGroups[groupId]["manuals"][i]["replacement"]);
										select.selectedIndex = returnValueSelectIndex(select, value);
									}
					break;
					case "radio"  : radios = container.getElementsByTagName("input");
									for (y=0; y<radios.length;y++) {
										if (radios[y].name == "" || radios[y].name == undefined) {
											// Crear radio
											value = radios[y].value;
											label = radios[y].getAttribute("label");
											id    = radios[y].id;
											name  = "data["+window.editGroups[groupId]["manuals"][i]["name"]+"]";
											try{
												newRad = document.createElement('<input type="radio" name="' + name + '" id="' + id + '" value="' + value + '" label = "' + label + '" />');
											}catch(err){
												newRad = document.createElement('input');
												newRad.setAttribute('type','radio');
												newRad.setAttribute('id',id);
												newRad.setAttribute('name',name);
												newRad.setAttribute('value',value);
												newRad.setAttribute('label', label);
											}
											radios[y].parentNode.replaceChild(newRad, radios[y]);
										}
									}
									radios[(window.editGroups[groupId]["manuals"][i]["default"])-1].checked = true;
					break;
				}
			}
		}
	}
}

function saveGroup(groupId) {
	var postData = "";
	var notFirst = false;
	var toChange = Array();
	var toManualChange = Array();
	if (window.editGroups[groupId] != undefined) {
		// Normales
		for (i=0; i<window.editGroups[groupId]["elems"].length; i++) {
			name = window.editGroups[groupId]["elems"][i];
			// Datos del post
			if (notFirst) postData += "&";
			else notFirst = true;
			postData += $(name+"__edit").name + "=" + $(name+"__edit").value;
			// Modo
			mode = ($(name).getAttribute("editMode"));
			switch(mode) {
				case "password" : // Una vez puesto el post lo dejamos en blanco por prolijidad
								  $(name+"__edit").value = "";
				break;
				default         : // Vista
								  $(name+"__static").innerHTML = nl2br($(name+"__edit").value);
				break;
			}
			toChange.push(name);
		}
		// Elementos manuales
		for (i=0; i<window.editGroups[groupId]["manuals"].length; i++) {
			replace = $(window.editGroups[groupId]["manuals"][i]["replacement"]);
			normal  = $(window.editGroups[groupId]["manuals"][i]["id"]);
			if (notFirst) postData += "&";
			else notFirst = true;
			// Vista segun tipo de elemento
			if (window.editGroups[groupId]["manuals"][i]["type"] == undefined) type = "";
			else type = window.editGroups[groupId]["manuals"][i]["type"];
			switch(type) {
				case "select" : normal.innerHTML = replace.options[replace.selectedIndex].text;
								window.editGroups[groupId]["manuals"][i]["default"] = replace.value;
								postData += replace.name + "=" + replace.value;
				break;
				case "radio"  : radios = $(window.editGroups[groupId]["manuals"][i]["replacement"] + "__container").getElementsByTagName("input");
								y = 0;
								while (y < radios.length && radios[y].checked == false) y++;
								normal.innerHTML = (radios[y].getAttribute("label"));
								window.editGroups[groupId]["manuals"][i]["default"] = y +1;
								postData += replace.name + "=" + radios[y].value;
				break;
				default       : //normal.innerHTML = (replace.value.replace(/\\n/g, "<br>"));
								postData += replace.name + "=" + replace.value;
				break;
			}
			toManualChange.push(editGroups[groupId]["manuals"][i]);
		}
		// Update
		new Ajax.Request(window.editGroups[groupId]["action"], {
			postBody  : postData,
			onLoading  : function() {
				toggleLoaderIfSet(groupId);
			},
			onComplete : function() {
				resetFields(toChange);
				resetManuals(toManualChange);
				toggleLoaderIfSet(groupId);
			}
		});
	}
}

function toggleLoaderIfSet(groupId) {
	if (window.editGroups[groupId]["loader"] != undefined) {
		if ($(editGroups[groupId]["loader"])) toggleView(editGroups[groupId]["loader"]);
	}
}

function resetManuals(toChange) {
	var i;
	for (i=0;i<toChange.length;i++) {
		showThis((toChange[i]["id"]));
		hideThis((toChange[i]["replacement"] + "__container"));
	}
}

function resetFields(toChange){
	var i;
	for (i=0;i<toChange.length;i++) {
		showThis((toChange[i]+"__static"));
		hideThis((toChange[i]+"__edit"));
	}
}

function createInputWithType(type) {
	var aux = document.createElement("input");
	aux.type = type;
	return (aux);
}

function createInput() {
	return createInputWithType("text");
}

function createPassword(){
	return createInputWithType("password");
}

function createTextArea() {
	var aux = document.createElement("textarea");
	return aux;
}

/********************************************************************/

function returnValueSelectIndex(select, value) {
	var i = 0;
	while ((select.options[i].value != value) && (i < select.options.length)) i++;
	return (i);
}

/* Show elememt */
function showThis(id) {
	var obj = $(id);
	if(obj) obj.style.display = 'block';
}
/* Hide elememt */
function hideThis(id) {
	var obj = $(id);
	if(obj) obj.style.display = 'none';
}
/* Toggle View */
function toggleView(div) {
	var obj = $(div);
	if(obj.style.display == 'block') obj.style.display = 'none';
	else obj.style.display = 'block';
}

/* nl2br Js*/
function nl2br(str) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: nl2br('Kevin\nvan\nZonneveld');
    // *     returns 1: 'Kevin<br/>van<br/>Zonneveld'

    return str.replace(/([^>])\n/g, '$1<br/>');
}

function debug(text) {
	if (!($("debug"))) {
		aux = document.createElement("div");
		aux.id = "debug";
		document.body.appendChild(aux);
	}
	$("debug").innerHTML += text + "<br />";
}
/********************************************************************/
// Cargar campos
loadAutoEdits();