/*
* Script : WindOpener plugin for DOMAssistant
* Auteur:  Samuel desnoes - http://www.ifacta.fr
* Création : 17 04 2009
* Version : 0.6 - 02 05 2010 ( for DOMAssistant v2.7 and sup. )
* Licence : X11 - MIT
* Documentation : http://www.ifacta.fr/labo/scripts/domassistant.gradient/
* Requires DOMAssistant library - http://www.domassistant.com
*/

/*global DOMAssistant, $, $$, window, document, self*/

DOMAssistant.windopener = function () {
	return {
		
		maxWidth : 0,
		maxHeight : 0,
		message : {
			closeMessage : "Fermer la fenêtre",
			closeLink : "[x]&nbsp;Fermer"
		},
		addGet : "fromDW",
		autoOpen : false,
		memoScroll : [0, 0],
		
		publicMethods : [
			"ready"
		],
		
		init : function () {
			DOMAssistant.DOMReady(function () {
				var windowWidth, windowHeight, navDim, overlay, windowFirst;
				windowFirst = $$(document.body);
				navDim = DOMAssistant.windopener.getNavDim();
				DOMAssistant.windopener.maxWidth = navDim[0] - 20;
				DOMAssistant.windopener.maxHeight = navDim[1] - 40;
				//alert(DOMAssistant.windopener.maxHeight);//debug
				/*création de l'overlay*/
				windowWidth = document.body.scrollWidth;
				windowHeight = document.body.scrollHeight;
				overlay = $(document.body).create("div", {
					id : "DWContainer"
				}, 1, "<a href=\"#\" id=\"closeDawin\" title=\"" + DOMAssistant.windopener.message.closeMessage + "\">&nbsp;</a>").setStyle({
					width : windowWidth + "px",
					height : windowHeight + "px",
					filter : "alpha(opacity=80)", /* IE */
					"-moz-opacity" : "0.8", /* Mozilla */
					opacity : "0.8", /* CSS3 */
					"-khtml-opacity" : ".8", /* Safari */
					display : "none",
					"z-index" : 1000
				});
				$$(document.body).create("div", {
					id : "DWindow"
				}, 1, "<div id=\"DWTitle\"><div id=\"DWTitleContent\"></div></div><div id=\"DWContent\"></div><div id=\"DWCloseCont\"><a href=\"#\" id=\"closeDawinLink\" title=\"" + DOMAssistant.windopener.message.closeMessage + "\">" + DOMAssistant.windopener.message.closeLink + "</a></div>").setStyle({
					display : "none",
					"z-index" : 1100
				});
				DOMAssistant.windopener.ready();
			});
		},
		
		ready : function () {
			var urlCur;
			$("#closeDawin", "#closeDawinLink").addEvent("click", function(e) {
				DOMAssistant.preventDefault(e);
				DOMAssistant.windopener.closeDawin();
			});
			/*recup liste des liens concernés*/
			$(".dawin").addEvent("click", function (e) {
				//alert("open it!");//debug
				var targL, urlL, optionsL, titleL;
				DOMAssistant.preventDefault(e);
				targL = DOMAssistant.windopener.parseOptions($(this).href);
				urlL = targL[0];
				optionsL = targL[1];
				if (typeof $(this).title !== "undefined" && $(this).title !== "") {
					optionsL['title'] = $(this).title;
				}
				DOMAssistant.windopener.openDawin(urlL, optionsL);
			});
			urlCur = window.document.location.href.split("#");
			if (urlCur.length > 1 && typeof $("#" + urlCur[1]) !== "undefined") {
				DOMAssistant.windopener.autoOpen = true;
				$$(urlCur[1]).triggerEvent("click");
			}
		},
		
		openDawin : function (urlw, opt) {
			var iF, dimT, hTitle, fromTop, fromLeft;
			/*masque les applications flash*/
			$("embed", "object", "select").setStyle("visibility", "hidden");
			/*vérif des dimensions de la fenêtre*/
			DOMAssistant.windopener.setDims();
			if (opt !== null) {
				if (!opt.width || opt.width > DOMAssistant.windopener.maxWidth - 40) {
					opt.width = DOMAssistant.windopener.maxWidth - 40;
				}
				if (!opt.height || opt.height > DOMAssistant.windopener.maxHeight - 40) {
					opt.height = DOMAssistant.windopener.maxHeight - 40;
				}
				if (!opt.title || opt.title === "") {
					opt.title = "&nbsp;";
				}
			}
			else {
				opt.width = DOMAssistant.windopener.maxWidth - 40;
				opt.height = DOMAssistant.windopener.maxHeight - 40;
			}
			//alert(opt.width + "(max = " + DOMAssistant.windopener.maxWidth + ")\n" + opt.height + "(max = " + DOMAssistant.windopener.maxHeight + ")");//debug
			//alert(document.documentElement.scrollTop + "\n" + document.documentElement.scrollLeft);//debug
			//alert(document.body.scrollTop + "\n" + document.body.scrollLeft);//debug
			fromTop = (DOMAssistant.windopener.autoOpen === false) ? (document.documentElement.scrollTop || document.body.scrollTop) : 0;
			fromLeft = (DOMAssistant.windopener.autoOpen === false) ? (document.documentElement.scrollLeft || document.body.scrollLeft) : 0;
			DOMAssistant.windopener.memoScroll = [fromLeft, fromTop];
			//alert(fromTop + "\n" + fromLeft);//debug
			$$("DWindow").setStyle({
				width : opt.width + "px",
				height : opt.height + "px",
				top : Math.ceil((DOMAssistant.windopener.maxHeight - opt.height) / 2) + fromTop + "px",
				left : Math.ceil((DOMAssistant.windopener.maxWidth - opt.width) / 2) + fromLeft + "px"
			});
			$(document.body, "html", document.documentElement).setStyle("overflow", "hidden");
			/*remise en l'état initial du scroll modifié par l'overflow*/
			document.documentElement.scrollLeft = document.body.scrollLeft = DOMAssistant.windopener.memoScroll[0];
			document.documentElement.scrollTop = document.body.scrollTop = DOMAssistant.windopener.memoScroll[1];
			$("#DWContainer", "#DWindow").setStyle("display", "block");
			/*Ajout du titre*/
			$$("DWTitleContent").innerHTML = opt.title;
			/*Dimensions titre*/
			/*IE 6 bug*/
			if ($$("DWTitle").offsetWidth > opt.width) {
				$("#DWTitle", "#DWTitleContent").setStyle({
					width : opt.width + "px"
				});
			}
			dimT = $$("DWTitle").offsetWidth - ($$("closeDawinLink").offsetWidth + 30);
			$$("DWTitleContent").setStyle({
				width : dimT + "px"
			});
			$$("DWCloseCont").setStyle({
				left : dimT + "px"
			});
			hTitle = $$("DWTitle").offsetHeight;
			if ($$("DWContent").cssSelect("iframe").length === 0) {
				$$("DWContent").setStyle({
					width : "100%",
					height : (opt.height - hTitle) + "px"
				}).create("iframe", {
					src : urlw,
					frameborder : 0
				}, 1).setStyle({
					width : "100%",
					height : "100%",
					border : 0
				});
			}
			else {
				$$("DWContent").setStyle({
					width : "100%",
					height : (opt.height - hTitle) + "px"
				}).cssSelect("iframe").first().setAttributes({
					src : urlw,
					frameborder : 0
				}).setStyle({
					width : "100%",
					height : "100%",
					border : 0
				});
			}
		},
		
		closeDawin : function () {
			DOMAssistant.windopener.autoOpen = false;
			$("embed", "object", "select").setStyle({
				visibility : "visible"
			});
			$("#DWContainer", "#DWindow").setStyle({
				display : "none"
			});
			$$("DWContent").replaceContent("");
			$(document.body, "html", document.documentElement).setStyle({
				overflow : "auto"
			});
			/*remise en l'état initial du scroll modifié par l'overflow*/
			document.documentElement.scrollLeft = document.body.scrollLeft = DOMAssistant.windopener.memoScroll[0];
			document.documentElement.scrollTop = document.body.scrollTop = DOMAssistant.windopener.memoScroll[1];
		},
		
		parseOptions : function (url) {
			var opt, comp, i, v, vid, r;
			url = url.split("?");
			opt = url[1].split("&");
			r = {}; comp = [];
			for (i = 0; i < opt.length; i += 1) {
				v = opt[i].split("=");
				if (v[0] === "width") {
					r.width = v[1];
				}
				else if (v[0] === "height") {
					r.height = v[1];
				}
				else if (v[0] === "addget") {
					v[1] = (v[1] === "false") ? false : v[1];
					DOMAssistant.windopener.addGet = v[1];
				}
				else {
					comp.push(opt[i]);
				}
			}
			if (DOMAssistant.windopener.addGet !== false && DOMAssistant.windopener.addGet !== "") {
				comp.push(DOMAssistant.windopener.addGet);
			}
			if (comp.length > 0) {
				url[0] = url[0] + "?" + comp.join("&");
			}
			//alert(r.width + "\n" + r.height);//debug
			return [url[0] ,r];
		},
		
		getNavDim : function () {
			if( typeof( window.innerWidth ) == 'number' ) {
				return [window.innerWidth, window.innerHeight];
			}
			else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
				return [document.documentElement.clientWidth, document.documentElement.clientHeight];
			}
			else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
				return [document.body.clientWidth, document.body.clientHeight];
			}
			else {
				return [-1, -1];
			}
		},
		
		setDims : function () {
			var windowWidth, windowHeight, navDim, overlay;
			navDim = DOMAssistant.windopener.getNavDim();
			DOMAssistant.windopener.maxWidth = navDim[0];
			DOMAssistant.windopener.maxHeight = navDim[1];
			/*dimensions de l'overlay*/
			windowWidth = document.body.scrollWidth + 30;
			windowHeight = document.body.scrollHeight + 30;
			$$("DWContainer").setStyle({
				width : windowWidth + "px",
				height : windowHeight + "px"
			});
		}
	
	};

}();

DOMAssistant.attach(DOMAssistant.windopener);

