var IDMagic = {};

IDMagic.Reflect = {};

IDMagic.Reflect.doesApplyToElement = function(elt)
{
	if (!elt || elt.className === null || elt.className === undefined)
		return false;

	if (HTMLUtils.hasStyleClass(elt, "IDM_NoReflect"))
		return false;

	if (CSSUtils.selectorMatchesElement(elt, "#session-box.@h2"))
		return false;

	//if (CSSUtils.selectorMatchesElement(elt, "idm-tab-control.header.tab.middle.@h3"))
	if (CSSUtils.selectorMatchesElement(elt, "middle.@h3"))
		return false;

	if (HTMLUtils.getCurrentStyle(elt, "display") == "none" && !HTMLUtils.hasStyleClass(elt, "IDM_ForceReflect"))
		return false;

	var reflectElements = [ 'h2', 'h3', 'h4' ];
	var reflectStyles = [ 'idm-window.title', 'button-control', 'button', 'submit', 'idm-window.button-control', 'idm-dialog.buttons.button', '@h3.@em', 'Bloc1.Titre.@h4', 'IDM_Reflect' ];

	for (var e = 0, en = reflectElements.length ; e < en ; ++e)
	{
		if (elt.tagName.toLowerCase() == reflectElements[e])
			return true;
	}

	for (var s = 0, sn = reflectStyles.length ; s < sn ; ++s)
	{
		var styles = StringUtils.explode('.', reflectStyles[s]);

		var curElt = elt;
		var curStyle = styles.length - 1;
		var curLevel = 0;
		var maxLevel = 5 + styles.length;

		while (curElt != null && curStyle >= 0 && curLevel < maxLevel)
		{
			var style = styles[curStyle];

			if ((style[0] == '@' && ("" + curElt.tagName).toLowerCase() == style.substring(1)) ||
			    (style[0] == '#' && curElt.id == style.substring(1)) ||
			    HTMLUtils.hasStyleClass(curElt, style)
			   )
			{
				if (curStyle == 0)
					return true;

				curStyle--;

				curElt = curElt.parentNode;
				curLevel++;
			}
			else
			{
				if (curLevel == 0)  // no style class on element
					break;

				curElt = curElt.parentNode;
				curLevel++;
			}
		}
	}

	return false;
}

IDMagic.Reflect.updateElement = function(elt)
{
	if (IDMagic.Reflect.doesApplyToElement(elt))
		IDMagic.Reflect.applyToElement(elt);
	else
		elt.style.visibility = "visible";
}

IDMagic.Reflect.watchOutElement = function(elt)
{
	var fct = JSUtils.makeCallback(null, IDMagic.Reflect.updateElement, elt);

	if (JSUtils.getNavigator() == JSUtils.NAVIGATOR_IE)
		//elt.onpropertychange = fct;
		setTimeout(fct, 100);
	else
		setTimeout(fct, 100);  // FIXME: need to find something better (DOMAttrModified?)
}

IDMagic.Reflect._onClickedAButton = function(e)
{
	var ev = DOMEventUtils.getEvent(e);
	DOMEventUtils.stopPropagation(ev);

	var elt = this.m_elt.getElement();

	if (elt.onclick && !elt.onclick())
		return false;

	HTMLUtils.redirect(document, elt.href);

	return false;
}

IDMagic.Reflect.applyToElement = function(elt)
{
	if (elt.__IDM_reflectStyleApplied)
		return;

	if (elt.tagName.toLowerCase() == "a" || (elt.tagName.toLowerCase() == "input" && !window.ActiveXObject))
	{
		var text = (elt.value ? elt.value : "");
		if (text.length == 0) text = HTMLUtils.getElementText(elt);

		var id = elt.id;
		elt.id = HTMLUtils.generateUniqueId();

		var btnElt = document.createElement("button");
		btnElt.className = elt.className;
		btnElt.m_elt = NodeRef.create(elt);
		btnElt.name = elt.name;
		btnElt.id = id;

		if (elt.tagName.toLowerCase() == "a")
			btnElt.onclick = IDMagic.Reflect._onClickedAButton;
		else
			btnElt.onclick = elt.onclick;

		if (StringUtils.trim(text).length == 0)
		{
			var children = HTMLUtils.getChildrenElements(elt);

			for (var i = 0, n = children.length ; i < n ; ++i)
			{
				var child = children[i];
				btnElt.appendChild(child.cloneNode(true));
			}
		}
		else
		{
			btnElt.appendChild(document.createTextNode(text));
		}

		elt.parentNode.insertBefore(btnElt, elt);
		elt.style.display = "none";
		//elt.parentNode.removeChild(elt);

		elt = btnElt;
	}

	elt.__IDM_reflectStyleApplied = true;

	if (window.ActiveXObject && !window.XMLHttpRequest) // IE<=6
	{
		elt.style.visibility = "visible";
		return;
	}

	var tagName = elt.tagName.toLowerCase();

	var color = CSSUtils.parseColor(HTMLUtils.getCurrentStyle(elt, "color"));
	var strokeColor = null;

	if (JSUtils.getNavigator() == JSUtils.NAVIGATOR_IE)
		strokeColor = CSSUtils.parseColor(HTMLUtils.getCurrentStyle(elt, "scrollbar-face-color"));
	else
		strokeColor = CSSUtils.parseColor(HTMLUtils.getCurrentStyle(elt, "outline-color"));

	var text = "";

	if (tagName == "input")
		text = elt.value;
	else
		text = HTMLUtils.getElementText(elt);

	var align = HTMLUtils.getCurrentStyle(elt, "text-align");
	var bkgndImage = CSSUtils.parseImage(HTMLUtils.getCurrentStyle(elt, "background-image"));

	if (StringUtils.trim(text).length == 0)
	{
		elt.style.visibility = "visible";
		return;
	}

	if (strokeColor != null && strokeColor.toHex() == "#ff00ff")
		strokeColor = null;

	var fonts = StringUtils.explode(",", HTMLUtils.getCurrentStyle(elt, "font-family"));
	var font = StringUtils.encodeUTF8(fonts[0]);

	var eltSize = HTMLUtils.getElementSize(elt);

	var url = "/fw/reflect.php"
		+ "?text=" + escape(StringUtils.encodeBase64(StringUtils.encodeUTF8(text)))
		+ "&color=" + escape(color.toHex())
		+ "&stroke-color=" + (strokeColor == null ? "" : escape(strokeColor.toHex()))
		+ "&font=" + escape(font)
		+ "&height=" + eltSize.height;

	if (bkgndImage != "")
	{
		var imgElt = IDMagic.Reflect.createElement("img");
		imgElt.align = "absmiddle";
		imgElt.style.verticalAlign = "middle";
//		imgElt.alt = text;  // commented to avoid raw text being displayed while image is being loaded

		if (elt.title.length == 0)
			imgElt.title = text;
		else
			imgElt.title = elt.title;

		if (tagName == "input")
			elt.value = " ";
		else
			HTMLUtils.removeAllTextNodes(elt);

		if (window.ActiveXObject && !window.XMLHttpRequest) // IE<=6
		{
			var action = function()
			{
				imgElt.src = url;
			}

			var afterAction = function()
			{
				var size = HTMLUtils.getElementSize(imgElt);

				imgElt.style.width = size.width + "px";
				imgElt.style.height = size.height + "px";
				imgElt.src = "/styles/default/images/page/spacer.png";
				imgElt.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"
					+ url + "', sizingMethod='image')";
			}

			ImageNotification.Do(imgElt, null, action, afterAction);
		}
		else
		{
			imgElt.style.visibility = "visible";
			imgElt.src = url;
		}

		if (elt.firstChild)
		{
			elt.insertBefore(imgElt, elt.firstChild);
		}
		else
		{
			try
			{
				elt.appendChild(imgElt);
			}
			catch (e)
			{
				if (elt.tagName.toLowerCase() == "input" && (elt.type == "button" || elt.type == "submit"))
				{
					var btnElt = IDMagic.Reflect.createElement("button");
					btnElt.className = elt.className;
					btnElt.m_submitBtnElt = NodeRef.create(elt);
					btnElt.onclick = function() { this.m_submitBtnElt.getElement().click(); }
					btnElt.hideFocus = true;
					btnElt.appendChild(imgElt);

					var parentElt = elt.parentNode;
					parentElt.insertBefore(btnElt, elt);

					elt.style.position = "absolute";
					elt.style.left = elt.style.top = "-4242px";

					elt = btnElt;
				}
			}
		}
	}
	else
	{
//		elt.innerHTML = "<span style=\"visibility: hidden\">" + elt.innerHTML + "</span>";
		var s = ""; for (var i = text.length ; i >= 0 ; --i) s += "\u00a0";
		HTMLUtils.setElementText(elt, s);
		elt.style.backgroundRepeat = "no-repeat";
		elt.style.backgroundImage = "url(" + url + ")";

		if (align == "center")
			elt.style.backgroundPosition = "50% 50%";
		else if (align == "right")
			elt.style.backgroundPosition = "100% 50%";
		else // if (align == "left")
			elt.style.backgroundPosition = "0% 50%";

		elt.style.overflow = "hidden";
	}

	elt.style.visibility = "visible";

	if (elt.title.length == 0)
		elt.title = text;
}

IDMagic.Reflect.s_createElementFunc = null;

IDMagic.Reflect.createElement = function(tagName)
{
	if (document.all)
		return IDMagic.Reflect.s_createElementFunc(tagName);
	else
		return IDMagic.Reflect.s_createElementFunc.call(document, tagName);
}

IDMagic.Reflect.init = function()
{
	// Preload UI images
	var imageDir = "/-/images/";
	var images = new ArrayList();

	images.add(imageDir + "page/loginbox/popup/signin.png");
	images.add(imageDir + "page/loginbox/popup/signup.png");

	images.add(imageDir + "page/bullet.png");
	images.add(imageDir + "page/header.png");
	images.add(imageDir + "page/header2.png");

	images.add(imageDir + "fw/window-bordertopleft.png");
	images.add(imageDir + "fw/window-bordertopright.png");
	images.add(imageDir + "fw/window-bordertop.png");
	images.add(imageDir + "fw/window-bkgnd.png");

	images.add(imageDir + "fw/button-bkgnd2.png");
	images.add(imageDir + "fw/button-bkgnd2-big.png");
	images.add(imageDir + "fw/button-bkgnd.png");

	images.add(imageDir + "page/table-th.png");

	images.add(imageDir + "fw/uploadmode-builtin.png");
	images.add(imageDir + "fw/uploadmode-simple.png");

	IDM.ImagePreloader.getInstance().addImages(images);

	if (StringUtils.contains(document.location, "/admin/") ||
	    StringUtils.contains(document.location, "/shop/admin/") ||
	    StringUtils.contains(document.location, "/designer/"))
	{
		var cssFile = "/data/shared/files/css/admin.css";

		try
		{
			if (document.createStyleSheet)
			{
				document.createStyleSheet(cssFile);
			}
			else
			{
				var newSS = document.createElement("link");
				newSS.rel = "stylesheet";
				newSS.href = cssFile;

				document.getElementsByTagName("head")[0].appendChild(newSS);
			}
		}
		catch (e)
		{
		}
	}
	else
	{
		// Replace element creation
		if (document.all)
		{
			IDMagic.Reflect.s_createElementFunc = document.createElement;

			document.createElement = function(tagName)
			{
				var elt = IDMagic.Reflect.s_createElementFunc(tagName);
				IDMagic.Reflect.watchOutElement(elt);
				return elt;
			}
		}
		else
		{
			IDMagic.Reflect.s_createElementFunc = HTMLDocument.prototype.createElement;

			HTMLDocument.prototype.createElement = function(tagName)
			{
				var elt = IDMagic.Reflect.s_createElementFunc.call(this, tagName);
				IDMagic.Reflect.watchOutElement(elt);
				return elt;
			}
		}

		// Replace static elements
		var tagNames = [ "div", "button", "input", "a", "h2", "h3", "h4", "em", "strong" ];

		for (var i = 0, n = tagNames.length ; i < n ; ++i)
		{
			var tagElts = document.getElementsByTagName(tagNames[i]);

			for (var j = 0, p = tagElts.length ; j < p ; ++j)
			{
				var elt = tagElts[j];
				IDMagic.Reflect.updateElement(elt);
			}
		}
	}
}

HTMLUtils.addOnPostLoadFunction(IDMagic.Reflect.init);


IDMagic.LoginBox = {};

IDMagic.LoginBox.init = function()
{
	IDMagic.LoginBox.update();
}

IDMagic.LoginBox.update = function(forceSessionRefresh)
{
	var session = SC.Session.get(forceSessionRefresh);

	var loginBoxElt = document.getElementById("login-box");

	if (!loginBoxElt)
	{
		var headerElt = document.getElementById("header");

		if (!headerElt)
			return;

		loginBoxElt = document.createElement("div");
		loginBoxElt.id = "login-box";

		headerElt.appendChild(loginBoxElt);

		loginBoxElt.innerHTML =
'<div class="signed-in-layer" style="display: none">' +
'     <div class="user-infos">' +
'           <div class="name"></div>' +
'           <div class="credits"></div>' +
'     </div>' +
'     <div class="action-help-bubble" style="display: none">' +
'     </div>' +
'     <div class="actions">' +
'     </div>' +
'</div>' +
'<div class="not-signed-in-layer" style="display: none">' +
'     <button class="signin-button" onclick="IDMagic.LoginBox._onClickedSignIn()">Se connecter</button>' +
'     <button class="signup-button" onclick="IDMagic.LoginBox._onClickedSignUp()">S\'inscrire</button>' +
'</div>';
	}

	var siLayerElt = HTMLUtils.getChildWithClass(loginBoxElt, "signed-in-layer", "div");
	var nsiLayerElt = HTMLUtils.getChildWithClass(loginBoxElt, "not-signed-in-layer", "div");

	if (!session || !session.isLogon())
	{
		HTMLUtils.setElementDisplay(nsiLayerElt, true);
		HTMLUtils.setElementDisplay(siLayerElt, false);
	}
	else
	{
		HTMLUtils.setElementDisplay(siLayerElt, true);
		HTMLUtils.setElementDisplay(nsiLayerElt, false);

		var custInfos = session.getCustomerInfos();
		var authLinks = session.getAuthLinks();

		// User infos
		var infosElt = HTMLUtils.getChildWithClass(siLayerElt, "user-infos", "div");
		var nameElt = HTMLUtils.getChildWithClass(infosElt, "name", "div");
		var creditsElt = HTMLUtils.getChildWithClass(infosElt, "credits", "div");

		HTMLUtils.setElementText(nameElt, custInfos.showName);
		//HTMLUtils.setElementText(creditsElt, "0 étoiles"); // TODO
		HTMLUtils.setElementText(creditsElt, "");

		// Actions
		var actionsElt = HTMLUtils.getChildWithClass(siLayerElt, "actions", "div");
		var actionHelpElt = HTMLUtils.getChildWithClass(siLayerElt, "action-help-bubble", "div");

		HTMLUtils.removeAllChildren(actionsElt);

		var startElt = document.createElement("div");
		startElt.className = "start";
		actionsElt.appendChild(startElt);

		for (var i = 0 ; i < authLinks.length ; ++i)
		{
			var authLink = authLinks[i];

			if (!authLink.visible)
				continue;

			var actionElt = document.createElement("button");
			actionsElt.appendChild(actionElt);

			actionElt.className = "IDM_NoReflect action " + authLink.id;
			actionElt.style.cursor = "pointer";
			actionElt.onclick = JSUtils.makeCallback(null, IDMagic.LoginBox._onClickedAction, authLink);
			//actionElt.title = authLink.description;
			actionElt.onmouseover = JSUtils.makeCallback(null, IDMagic.LoginBox._onMouseOverAction, authLink);
			actionElt.onmouseout = JSUtils.makeCallback(null, IDMagic.LoginBox._onMouseOutAction, authLink);
		}

		var endElt = document.createElement("div");
		endElt.className = "end";
		actionsElt.appendChild(endElt);

		IDMagic.LoginBox.s_actionHelpElt = NodeRef.create(actionHelpElt);

		if (forceSessionRefresh && session.getCredits().getCount() != 0)
			IDMagic.LoginBox.showCredits();
	}
}

IDMagic.LoginBox._onClickedSignIn = function()
{
	var dlg = new SC.SignInDialog(JSUtils.makeCallback(null, IDMagic.LoginBox.update, true));
	dlg.show();

	return false;
}

IDMagic.LoginBox._onClickedSignUp = function()
{
	var dlg = new SC.SignUpDialog(JSUtils.makeCallback(null, IDMagic.LoginBox.update, true));
	dlg.show();

	return false;
}

IDMagic.LoginBox._onClickedAction = function(authLink)
{
	if (authLink.redirect)
	{
		HTMLUtils.redirect(document, authLink.url);
	}
	else
	{
		var webs = new IDM.WebService(authLink.url);
		webs.call();

		if (authLink.id == "logout")
			HTMLUtils.redirect(document, "/");
		else
			IDMagic.LoginBox.update();
	}

	return false;
}

IDMagic.LoginBox._onMouseOverAction = function(authLink)
{
	var actionHelpElt = IDMagic.LoginBox.s_actionHelpElt.getElement();

	HTMLUtils.setElementText(actionHelpElt, authLink.description);
	HTMLUtils.setElementVisible(actionHelpElt, true);
}

IDMagic.LoginBox._onMouseOutAction = function(authLink)
{
	var actionHelpElt = IDMagic.LoginBox.s_actionHelpElt.getElement();

	HTMLUtils.setElementVisible(actionHelpElt, false);
}

IDMagic.LoginBox.goToSignUp = function(callback)
{
	var dlg = new SC.SignUpDialog(callback);
	dlg.show();
}

IDMagic.LoginBox.goToProductComposition = function(productId, modelId, params)
{
	var url = new URL("/shop/shop.php");
	url = url.addParam("sid", g_shopId);
	url = url.addParam("op", "compose");
	url = url.addParam("product", productId);
	url = url.addParam("model", modelId);

	for (p in params)
		url = url.addParam(p, params[p]);

	IDMagic.LoginBox.loginAndRedirect(url);
}

IDMagic.LoginBox.checkAdvertCampaignProductCode = function(code)
{
	var url = new URL("/services/advert/check-campaign-code.php");
	url = url.addParam("code", code);

	var webs = new IDM.WebService(url);

	return webs.call() && !webs.isError();
}

IDMagic.LoginBox.getAdvertCampaignDestination = function(code)
{
	var url = new URL("/services/advert/go-campaign-code.php");
	url = url.addParam("code", code);

	var webs = new IDM.WebService(url);

	if (webs.call() && !webs.isError())
	{
		var dom = webs.getResult();
		var node = XMLUtils.getRootElement(dom);

		var dest = new Object();
		dest.url = node.getAttribute("url");
		dest.needLogin = (node.getAttribute("need-login") == "true");

		return dest;
	}
	else
	{
		return null;
	}
}

IDMagic.LoginBox.goToAdvertCampaignProductComposition = function(url)
{
	IDMagic.LoginBox.loginAndRedirect(url);
}

IDMagic.LoginBox.goToAdvertCampaignProductComposition = function(url)
{
	var session = SC.Session.get();

	if (!session || !session.isLogon())
	{
		var dlg = new SC.LoginRequiredDialog(JSUtils.makeCallback
			(null, IDMagic.LoginBox.goToAdvertCampaignProductCompositionImpl, url), true);

		dlg.show();
	}
	else
	{
		IDMagic.LoginBox.goToAdvertCampaignProductCompositionImpl(url);
	}
}

IDMagic.LoginBox.loginAndRedirect = function(url)
{
	var session = SC.Session.get();

	if (!session || !session.isLogon())
	{
		var dlg = new SC.LoginRequiredDialog(JSUtils.makeCallback
			(null, IDMagic.LoginBox.loginAndRedirectImpl, url), true);

		dlg.show();
	}
	else
	{
		IDMagic.LoginBox.loginAndRedirectImpl(url);
	}
}

IDMagic.LoginBox.loginAndRedirectImpl = function(url)
{
	var waitDlg = new IDM.MessageBox();
	waitDlg.setTitle("Veuillez patienter");
	waitDlg.setText("Merci de patienter quelques instants...");
	waitDlg.setButtons([]);
	waitDlg.show();

	JSUtils.invokeLater(JSUtils.makeCallback(null, IDMagic.LoginBox.loginAndRedirectImpl2, url));
}

IDMagic.LoginBox.loginAndRedirectImpl2 = function(url)
{
	HTMLUtils.redirect(document, url);
}

IDMagic.LoginBox.goToAlbumMgt = function()
{
	var session = SC.Session.get();

	if (!session || !session.isLogon())
	{
		var dlg = new SC.LoginRequiredDialog(JSUtils.makeCallback
			(null, IDMagic.LoginBox.goToAlbumMgtImpl), true);

		dlg.show();
	}
	else
	{
		IDMagic.LoginBox.goToAlbumMgtImpl();
	}
}

IDMagic.LoginBox.goToAlbumMgtImpl = function()
{
	var url = new URL("/shop/shop.php");
	url = url.addParam("sid", g_shopId);
	url = url.addParam("op", "albummgt");

	HTMLUtils.redirect(document, url);
}

IDMagic.LoginBox.showCredits = function()
{
	var dlg = new SC.CreditsDialog();
	dlg.show();
}


HTMLUtils.addOnLoadFunction(IDMagic.LoginBox.init);

