var messageCount = 0;

function isdefined(object, variable) {
	return (typeof (eval(object)[variable]) == "undefined") ? false : true;
}

function selectComponent(comp, inLine, insertText, url, msg) {

	setWaitMessage(msg);

	ajaxWaitON();
	var selectAjax = new Ajax(url, {
		update :$('message'),
		onComplete :waitRemoveMessage
	}).request();

	var components = $ES("#content_update .insert");

	// update insert link
	for ( var i = 0; i < components.length; i++) {
		var insertLink = components[i].getElement('a.edit');
		insertLink.setHTML(insertText);
	}

	// update inline state
	var links = $ES("#content_update .container .insert .insert-component");
	for ( var i = 0; i < links.length; i++) {
		var insertLink = links[i];
		if (inLine == 'true') {
			insertLink.removeAttribute("style");
		} else {
			insertLink.setAttribute("style",
					"font-size: 0px; visibility: hidden;");
		}
	}

	// remove old selected element
	var selectedElement = $ES("#command .selected");
	selectedElement[0].removeClass("selected");

	// select new element
	var select = $('select-' + comp);
	select.addClass("selected");
	/* select.setStyle("font-weight", "bold"); */
}

function insertComponent(positionId, checkURL, url, msg) {
	ajaxWaitON();
	var selectAjax = new Ajax(checkURL, {
		update :$('message'),
		onComplete :waitRemoveMessage
	}).request();
	ajaxWaitON();
	var insertAjax = new Ajax(url, {
		update :$(positionId),
		onComplete :refreshDOM
	}).request();
}

function refreshDOM() {
	new AjaxCentral( {});
}

function autoScroll() {
	var listContainer = $$(".list-container .selected");
	var lastParent;
	for (i = 0; i < listContainer.length; i++) {
		if (lastParent != listContainer[i].getParent()) { /*
															 * select first
															 * element if multi
															 * list (gallery)
															 */
			scrollTo(listContainer[i].getParent(), listContainer[i]);
			lastParent = listContainer[i].getParent();
		}
	}
}

function scrollTo(scroolElement, targetElement) {
	var refPosition = targetElement.getPosition()['y']
			- scroolElement.getPosition()['y'];
	scroolElement.scrollTo(0, refPosition - 30);
}

var compId;
function reloadComponent(id, uri) {
	if (ajaxRunning) {
		( function() {
			reloadComponent(id, uri)
		}).delay(250); // wait a quart of second and recall the fonction
	} else {
		compId = "cp_" + id;
		var internalDiv = $$("#" + compId + " div");
		internalDiv[0].setOpacity(0.1);
		var url = uri + "?ajaxaction=reload&id=" + id;
		if ($('no-link-component')) {
			url = url + "&insert-link=false";
		}
		ajaxWaitON();
		var component = $(compId);
		var deleteAjax = new Ajax(url, {
			update :$(compId),
			onComplete :reloadComplete
		}).request();
	}
}

function reloadPreviewComponent(id, uri) {
	if (ajaxRunning) {
		( function() {
			reloadComponent(id, uri)
		}).delay(250); // wait a quart of second and recall the fonction
	} else {
		compId = "cp_" + id;
		var internalDiv = $$("#" + compId + " div");
		internalDiv[0].setOpacity(0.1);
		var url = uri + "?ajaxaction=previewreload&id=" + id;
		ajaxWaitON();
		var component = $(compId);
		var deleteAjax = new Ajax(url, {
			update :$(compId),
			onComplete :reloadComplete
		}).request();
	}
}

function reloadComplete() {
	var internalDiv = $$("#" + compId + " div");
	internalDiv[0].setOpacity(1);
	waitRemoveMessage();
	autoScroll();
	var ajaxCentral = new AjaxCentral( {});
}

function cutSelection(text) {
	var sel = "";
	if (text.setSelectionRange) {
		sel = text.value.substring(text.selectionStart, text.selectionEnd);
		text.value = text.value.substring(0, text.selectionStart)
				+ text.value.substring(text.selectionEnd, text.value.length);
	} else if (document.selection) {
		text.focus();
		sel = document.selection.createRange().text;
		document.selection.createRange().text = "";
	}
	return sel;
}

function extractContent(divId, compId, url, msg, text) {

	var selArray = extractSelection(text);
	var beforeValue = selArray[0];
	var sel = selArray[1];
	var afterValue = selArray[2];

	if (sel.length == 0) {
		return false;
	}

	setWaitMessage(msg);

	var inputField = $$('#extract_ajax input[name="compId"]');
	inputField.setProperty("value", compId);

	var inputField = $$('#extract_ajax input[name="content"]');
	inputField.setProperty("value", sel);

	var inputField = $$('#extract_ajax input[name="before_value"]');
	inputField.setProperty("value", beforeValue);

	var inputField = $$('#extract_ajax input[name="after_value"]');
	inputField.setProperty("value", afterValue);

	var extractForm = $('extract_ajax');
	extractForm.setProperty("action", url);
	ajaxWaitON();
	extractForm.send( {
		update :$(divId),
		onComplete :clearMessage
	});

	return true;

	// var insertAjax = new
	// Ajax(url+"&compId="+compId+"&content="+sel+"&before_value="+beforeValue+"&after_value="+afterValue,
	// {update: $(divId), onComplete: clearMessage} ).request();
}

function deleteComponent(comp, compId, url, msg) {
	
	url = url.replace('#', ','); // hack for resolve base64 probs
	
	setWaitMessage(msg);
	ajaxWaitON();
	var component = $(compId);
	var inputComp = component.getElement(".component");
	inputComp.remove(inputComp);
	var link = $('insert-' + comp);
	if (link) {
		link.remove(link);
	}
	var deleteAjax = new Ajax(url, {
		update :$('message'),
		onComplete :waitRemoveMessage
	}).request();
}

function setWaitMessage(msg) {
	if ($('message') && msg) {
		$('message').setHTML(msg);
	}
}

function replaceChar(value, indice, newChar) {
	if (value.length > 1) {
		if (indice == 0) {
			return newChar + value.substring(1, value.length);
		} else if (indice == value.length) {
			return value.substring(0, value.length - 1) + newChar;
		} else {
			return value.substring

		}
	} else {
		if (indice == 0) {
			return newChar;
		}
	}
	return value;
}

function replaceChar(value, indice, newChar) {
	if (value.length > 1) {
		if (indice == 0) {
			return newChar + value.substring(1, value.length);
		} else if (indice < value.length - 1) {
			return value.substring(0, indice) + newChar
					+ value.substring(indice + 1, value.length);
		} else if (indice == value.length - 1) {
			return value.substring(0, value.length - 1) + newChar;
		}
	} else {
		if (indice == 0) {
			return newChar;
		}
	}
	return value;
}

/*
 * comment if problem with encoding when ajax request is sended.
 * 
 */
function updateComponent(form, ajaxURL) {
	ajaxWaitON();
	var inputFile = form.getElementsByTagName("input");
	// with ajax your can't upload file -> if upload needed -> standard request
	var needMultipart = false;
	for ( var i = 0; i < inputFile.length; i++) {
		if (inputFile[i].type == 'file') {
			if (inputFile[i].value.length > 0) {
				needMultipart = true;
			}
		}
	}

	var select = $$("#content select");
	for ( var i = 0; i < select.length; i++) {
		if (select[i].getProperty("multiple") == 'multiple') {
			needMultipart = true;
		}
	}

	/* replace microsoft chars with iso char */
	var textarea = form.getElementsByTagName("textarea");
	for ( var i = 0; i < textarea.length; i++) {
		var value = textarea[i].value;
		for ( var j = 0; j < value.length; j++) {
			if ((value.charCodeAt(j) == 8220) || (value.charCodeAt(j) == 8221)
					|| (value.charCodeAt(j) == 8222)
					|| (value.charCodeAt(j) == 8223)) {
				value = replaceChar(value, j, '"');
			} else if ((value.charCodeAt(j) == 8217)
					|| (value.charCodeAt(j) == 8218)
					|| (value.charCodeAt(j) == 8216)
					|| (value.charCodeAt(j) == 8219)) {
				value = replaceChar(value, j, "'");
			} else if (value.charCodeAt(j) == 8211) {
				value = replaceChar(value, j, "-");
			} else if (value.charCodeAt(j) == 8364) {
				value = replaceChar(value, j, "&euro;");
			} else if (value.charCodeAt(j) == 8230) {
				value = replaceChar(value, j, "...");
			} else if (value.charCodeAt(j) == 7) {
				value = replaceChar(value, j, "&nbsp;&nbsp;&nbsp;&nbsp;");
			} else if (value.charCodeAt(j) == 25) {
				value = replaceChar(value, j, "");
			} else if (value.charCodeAt(j) == '&') {
				value = replaceChar(value, j, "&amp;");
			}
		}
		textarea[i].value = value;
	}

	if (!needMultipart) {
		var holdURL = form.action;
		form.action = ajaxURL;
		/*
		 * form.send({update: $('message'), onComplete: updateComplete} );
		 * REPLACE FOR IE
		 */
		$("content_update").send( {
			update :$('message'),
			onComplete :updateComplete
		});
		form.action = holdURL;
	} else {
		form.submit();
	}
}

function updateComponent_(form, ajaxURL, msg) {
	form.submit();
}

var ajaxRunning = false;

function ajaxWaitOFF() {
	if ($$('.no-loader').length > 0) {
		$$('.loader').each( function(item) {
			item.addClass("hidden");
		});
		$$('.no-loader').each( function(item) {
			item.removeClass("hidden");
		});
	}
	ajaxRunning = false;
}

function ajaxWaitON() {
	if ($$('.no-loader').length > 0) {
		$$('.loader').each( function(item) {
			item.addClass("hidden")
		});
		$$('.no-loader').each( function(item) {
			item.removeClass("hidden")
		});
	}
	ajaxRunning = true;
}

function updateComplete() {
	if ($('message')) {
		if ($('message').getElements('span[class="refresh"]').length > 0) {
			window.location.href = window.location.href;
		}
	}
	waitRemoveMessage();
}

function waitRemoveMessage() {
	ajaxWaitOFF();
	messageCount++;
	displayMessageErrorMessageAsPopup();
	removeMessage.delay(10000);
}

function removeMessage() {
	if (messageCount <= 1) {
		animMessage();
	}
	messageCount--;
}

var anim = false;
function animMessage() {
	if ($$('#message .error').length == 0) {
		if (!anim) {
			anim = true;
			var myFx = new Fx.Style('message', 'opacity', {
				onComplete :clearMessage
			}).start(1, 0);// display a transition from transparent to opaque.
		}
	}
}

function clearMessage() {
	if ($$('#message .error').length == 0) {
		if ($('message')) {
			$('message').setHTML("<span></span>");
			var myFx = new Fx.Style('message', 'opacity').set(1);
		}
		anim = false;
		ajaxWaitOFF();
	}
}

var componentOpen = true;

function openCloseComponent() {
	if (componentOpen == null) {
		return;
	}
	var compList = $$('#insert .box-body')[0];
	var openCloseLink = $$('#open_close_component a')[0];
	var contentWidth = $('content-width');
	if (componentOpen) {
		compList.setStyle("overflow", "hidden");

		var animTime = 0;

		var heightChange = new Fx.Style(compList, 'height', {
			duration :animTime
		});
		saveHeight = compList.getCoordinates().height;
		heightChange.start(saveHeight, 0);

		var marginChange = new Fx.Style(contentWidth, 'margin-right', {
			duration :animTime
		});
		marginChange.start(230, 0);
		marginChange = new Fx.Style(contentWidth, 'margin-top', {
			duration :animTime
		});
		marginChange.start(0, 15);

		openCloseLink.setProperty("class", "close");
		componentOpen = false;
	} else {
		var heightChange = new Fx.Style(compList, 'height', {
			duration :animTime
		});
		heightChange.start(0, saveHeight);

		var marginChange = new Fx.Style(contentWidth, 'margin-right', {
			duration :animTime
		});
		marginChange.start(0, 230);
		marginChange = new Fx.Style(contentWidth, 'margin-top', {
			duration :animTime
		});
		marginChange.start(15, 0);

		openCloseLink.setProperty("class", "open");
		componentOpen = true;
	}
}

function openCloseBox(box) {
	if (box.hasClass("open")) {
		box.removeClass("open");
		box.addClass("close");
	} else {
		box.removeClass("close");
		box.addClass("open");
	}
}

function openCloseItemBox() {
	if (itemBoxOpen == null) {
		return;
	}
	var boxBody = $('item-box-body');
	var openCloseLink = $$('#item_open_close a')[0];
	if (itemBoxOpen) {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		itemSaveHeight = boxBody.getCoordinates().height;
		heightChange.start(itemSaveHeight, 0);
		$('item-open-state').setProperty("value", "false");
		$('item-height').setProperty("value", itemSaveHeight);
		$("item_open_close").send();

		openCloseLink.setProperty("class", "close");
		itemBoxOpen = false;
	} else {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		heightChange.start(0, itemSaveHeight);
		$('item-open-state').setProperty("value", "true");
		$("item_open_close").send();

		openCloseLink.setProperty("class", "open");
		itemBoxOpen = true;
	}
}

function openCloseMacroBox() {
	if (macroBoxOpen == null) {
		return;
	}
	var boxBody = $('macro-box-body');
	var openCloseLink = $$('#macro_open_close a')[0];
	if (macroBoxOpen) {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		macroSaveHeight = boxBody.getCoordinates().height;
		heightChange.start(macroSaveHeight, 0);
		$('macro-open-state').setProperty("value", "false");
		$('macro-height').setProperty("value", macroSaveHeight);
		$("macro_open_close").send();

		openCloseLink.setProperty("class", "close");
		macroBoxOpen = false;
	} else {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		heightChange.start(0, macroSaveHeight);
		$('macro-open-state').setProperty("value", "true");
		$("macro_open_close").send();

		openCloseLink.setProperty("class", "open");
		macroBoxOpen = true;
	}
}

var pageStructureOpen = true;
var pageStructureSaveHeight = 0;

function openClosePageBox() {
	if (pageStructureOpen == null) {
		return;
	}
	var boxBody = $('page-structure-box-body');
	var openCloseLink = $$('#page-structure_open_close a')[0];
	if (pageStructureOpen) {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		pageStructureSaveHeight = boxBody.getCoordinates().height;
		heightChange.start(itemSaveHeight, 0);

		openCloseLink.setProperty("class", "close");
		pageStructureOpen = false;
	} else {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		heightChange.start(0, pageStructureSaveHeight);

		openCloseLink.setProperty("class", "open");
		pageStructureOpen = true;
	}
}

function openCloseMenuBox() {
	var boxBody = $('menu-box-body');
	var openCloseLink = $$('#menu_open_close a')[0];
	if (menuBoxOpen) {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		menuSaveHeight = boxBody.getCoordinates().height;
		heightChange.start(menuSaveHeight, 0);
		$('menu-open-state').setProperty("value", "false");
		$('menu-height').setProperty("value", menuSaveHeight);
		$("menu_open_close").send();

		openCloseLink.setProperty("class", "close");
		menuBoxOpen = false;
	} else {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		heightChange.start(0, menuSaveHeight);
		$('menu-open-state').setProperty("value", "true");
		$("menu_open_close").send();

		openCloseLink.setProperty("class", "open");
		menuBoxOpen = true;
	}
}

function openClosePersistenceBox() {
	if (persistenceBoxOpen == null) {
		return;
	}
	var boxBody = $('persistence-box-body');
	var openCloseLink = $$('#persistence_open_close a')[0];
	if (persistenceBoxOpen) {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		persistenceSaveHeight = boxBody.getCoordinates().height;
		heightChange.start(persistenceSaveHeight, 0);
		$('persistence-open-state').setProperty("value", "false");
		$('persistence-height').setProperty("value", persistenceSaveHeight);
		$("persistence_open_close").send();

		openCloseLink.setProperty("class", "close");
		persistenceBoxOpen = false;
	} else {
		var heightChange = new Fx.Style(boxBody, 'height', {
			duration :0
		});
		heightChange.start(0, persistenceSaveHeight);
		$('persistence-open-state').setProperty("value", "true");
		$("persistence_open_close").send();

		openCloseLink.setProperty("class", "open");
		persistenceBoxOpen = true;
	}
}

function searchComponentId(startTag) {
	/* search component id */
	var parent = startTag;
	while ((parent != null)
			&& ((parent.getProperty("id") == null) || (!parent
					.getProperty("id").test("cp_")))) {
		parent = parent.getParent();
	}
	if (parent != null) {
		return parent.getProperty("id").substring(3);
	}
	return;
}

/**
 * clean the component list
 */
function cleanComponentList() {
	var children = $ES('#content_update .component_block');
	for (i = 0; i < children.length; i++) {
		var subChildren = $ES('.component_block', children[i]);
		if (subChildren.length > 0) {
			alert("error in component structure");
		}
	}
}
