/* Copyright 2008 Marc Mongenet */

var w2mlEditURI = w2mlURI + "edit/";


// Return translated string or identity.
function w2mltr(str, i18n)
{
/* Expected i18n object format:
var i18n = {
	"save":
		{ "fr": "sauver", "de": "speichern", "...": "..." },
	"...":
		{ "...": "...", },
};*/
	var lang = navigator.language ? navigator.language : navigator.browserLanguage;
	lang = lang.substring(0,2);
	if (str in i18n && lang in i18n[str])
		return i18n[str][lang];
	return str;
}


// Object used as a map to keep "edited object id"/"edited object" pairs.
// The edited objects must provide a w2mlSerializeEdition method to serialize
// the edited content.
var w2mlEditedElms = new Object();
var w2mlEditedElmsCount = 0;

function w2mlSave()
{
	// Create form to collect data to submit.
	var f = document.createElement("form");
	f.action = location;
	f.method = "post";
	f.encoding = "multipart/form-data";
	f.style.display = "none";

	// Serialize the content of each edited element in a hidden form field.
	for (var e in w2mlEditedElms) {
		try { // w2mlSerializeEdition() may throw
			var i = document.createElement("input");
			i.type = "hidden";
			i.name = e;
			i.value = w2mlEditedElms[e].w2mlSerializeEdition();
			f.appendChild(i);
		} catch (e) {}
	}

	// Submit the form.
	document.body.appendChild(f);
	f.submit();
}

function w2mlSaveNothing()
{
	w2mlEditedElms = new Object();
	w2mlSave();
}


// An UI to save modifications.
var w2mlSaveUI;

function w2mlMakeSaveUI(posY)
{
	var i18n = {
		"save":
			{ "fr": "sauvegarder", "de": "speichern" },
		"Save":
			{ "fr": "Sauvegarder", "de": "Speichern" }
	};

	posY = posY || 3;
	var ui = document.createElement("div");
	ui.style.backgroundColor = "#d4d0c8";
	ui.style.padding = "1px";
	ui.unselectable = "on";
	var buttonsDiv = document.createElement("div");
	buttonsDiv.unselectable = "on";
	{
		var img = document.createElement("img");
		img.w2mlEnabled = false;
		img.src = w2mlEditURI + "save.gif";
		img.title = img.alt = w2mltr("save", i18n);
		img.unselectable = "on"; // lots of interesting side effects in MSIE
		img.style.width = "20px";
		img.style.verticalAlign = "text-bottom";
		img.onclick = w2mlSave;
		buttonsDiv.appendChild(img);
	}
	ui.appendChild(buttonsDiv);
	w2mlSaveUI = new W2Bar(w2mltr("Save", i18n), ui, 3, posY, 2, 0, w2mlSaveNothing);
	w2mlSaveUI.window = w2mlSaveUI;
}


// Register an edited object and add required methods if necessary.
// Return true iff it is the first object to be registered.
function w2mlRegisterEditedObject(obj)
{
	// Default implementation for w2mlGetEditionId and w2mlSerializeEdition.
	if (!obj.w2mlGetEditionId) {
		obj.w2mlGetEditionId = function() { return obj.name; };
	}
	if (!obj.w2mlSerializeEdition) {
		obj.w2mlSerializeEdition = function() { return obj.value; };
	}
	// Register.
	w2mlEditedElms[obj.w2mlGetEditionId()] = obj;
	return w2mlEditedElmsCount++ == 0;
}


var w2mlNewDestinations = new Object();
var w2mlDelDestinations = new Object();

function w2mlLinkEditors(elm, inTemplate)
{
	var attr;
	inTemplate = inTemplate || false;
	// Register template
	attr = elm.getAttribute("w2mltemplate");
	if (attr) {
		w2mlTemplates[attr] = elm;
		inTemplate = true;
	}
	// Register new destination
	attr = elm.getAttribute("w2mlnew");
	if (attr) w2mlNewDestinations[attr] = elm;
	// Register delete destination
	attr = elm.getAttribute("w2mldel");
	if (attr) w2mlDelDestinations[attr] = elm;
	// Register editor
	attr = elm.getAttribute("w2mled");
	if (attr) {
		if (!elm.className.match("\bw2ml"+attr+"Editable\b"))
			elm.className = elm.className + " w2ml" + attr + "Editable";
		if (!inTemplate) eval("w2mlRegister"+attr+"Editor(elm)");
	}
	// Recursive registering
	for (var child = elm.firstChild; child; child = child.nextSibling) {
		if (child.nodeType == 1) w2mlLinkEditors(child, inTemplate);
	}
}


// Images pre-loading (from Rhino book 4th edition, p. 238)
(new Image()).src = w2mlEditURI + "pencil.gif";
(new Image()).src = w2mlEditURI + "save.gif";
