/**
 * KTK Functions (part of KTK API)
 * Copyright by J. Christopher Pereira Zimmermann
 * Copyright by IMATRONIX S.A.
 * Prohibited use without granted permissions.
 * For more info about this API, please write to (kripper at imatronix dot cl).
 */
 
// Se ejecuta en ktkRootWindow
function ktkWindowInitFromChild(childWin) {
	if(childWin != childWin.parent) {
		// Es un hijo
		var frameId = ktkGetIFrameId(childWin);
		var wndId = window.frames[frameId].frameElement.wndId;
		if(wndId) {
			// Es una ventana
			ktkWindowInit2(childWin, wndId);
		}
	}
}

// Se ejecuta en ktkRootWindow
function ktkWindowInit2(childWin, wndId, hiddenRPC) {
	var ktkWndObj;
	if(typeof(ktkWindows) != 'undefined') {
		ktkWndObj = ktkWindows[wndId];
		ktkWndObj.registerChildWindow(childWin);

		if(window.KTK_DEBUG_WINDOWS2) {
			alert('Loaded Window ' + wndId + ' = ' + childWin.location.href);
			alert('Iframe location: ' + ktkWndObj.iframe.src);
		}

		if(!hiddenRPC && !childWin.ktkHiddenWindow) {
			// Es ejecutado desde el iframe cuando la página se ha cargado
			ktkWndObj.iframeContent = childWin.document.body;
			ktkWndObj.resize();
			ktkWndObj.show();
		}
	}
}

// Método alternativo de iniciación de ventanas desde el padre.
// También puede realizarse desde el hijo.
function waitForInit(wndId) {

	var iframeWin = ktkFindFrameByWndId(wndId);

	if(iframeWin && iframeWin.document.body) {

		// Document loaded
		var childWin = ktkFindFrameByWndId(wndId);
		ktkWindowInit2(childWin, wndId);
		alert("Esta página no posee un onload()");
		
	} else {
		setTimeout(new Function('waitForInit(' + wndId + ')'), 100);
	}
}

function ktkFindFrameByWndId(wndId) {
	var f;
	for(f = 0; window.parent.frames[f]; f++) {
		var iframeWin = window.parent.frames[f];
		if(iframeWin && iframeWin.frameElement && iframeWin.frameElement.wndId == wndId) {
			return iframeWin;
		}
	}

	for(f in window.parent.frames) {
		var iframeWin = window.parent.frames[f];
		if(iframeWin && iframeWin.frameElement && iframeWin.frameElement.wndId == wndId) {
			return iframeWin;
		}
	}
}

function RemoveChild(container, child) {
	// if(child.parentElement) {
	container.removeChild(child);
}

/**
 * Instancia un ktkWindow.
 * - rootWindow es el window en el cual se presenta la ventana
 * - parentWindow es el window desde el cual se abre la ventana y donde se ubican
 *   generalmente los campos que son modificados por un RPC.
 */
function ktkWindow(title, rootWindow, parentWindow) {

	// Functions

	this.load = function(url) {
		if(url.indexOf("?") == -1) url += "?";
		url += "&wndId=" + this.wndId;
		if(window.KTK_DEBUG_WINDOWS2) {
			alert("Loading iframe: " + url);
		}
		this.iframe.src = url;
		// waitForInit(this.wndId);
	}
	
	this.showHTML = function(html) {
		this.isHTMLWindow = true;
		this.iframeContainer.innerHTML = html;
		this.resize();
		this.show();
	}
	
	this.close = function() {
		// CHANGED: Porque Antes del hide?. Se hace en postClose().
		// this.rootWindow.ktkWindows[this.wndId] = null;	// Antes del hide
		
		var rootDoc = this.rootWindow.document;
		if(window.KTK_DEBUG_WINDOWS2) {
			alert("Closing Window: " + this.wndId + " (Iframe: " + this.iframe.src + ")");
		}
		this.hide();

		if(MSIE) {
			setTimeout("ktkWindowPostClose(" + this.wndId + ")", 500);
		} else {
			this.postClose();
		}
	}
	
	this.postClose = function() {
		var rootDoc = this.rootWindow.document;

		try { // IE 8 produce problemas?
			if(!MOZ) { // TODO: Si se elimina, se muere el script que llamó window.close()
				RemoveChild(rootDoc.body, this.div);
			}
			RemoveChild(rootDoc.body, this.shadowDiv);
		} catch(e) {}

		try {
			RemoveChild(rootDoc.body, this.blockingDiv);
		} catch(e) {}

		this.rootWindow.windowExists = false;
		this.ktkChildWindow.ktkWndObj = null;

		if(this.shown && !ktkGetFlag('focus_changed')) {
			var obj = this.rootWindow.KTK_FOCUSED_ELEMENT;
			if(obj) {
				ktkFocus2(obj); // Devolver focus a último objeto
			} else {
				// IE Focus Hack (evita que se pierda el focus)
				var temp = rootDoc.createElement('input');
				temp.style.position = "absolute";
				temp.style.width = 0;
				temp.style.height = 0;
				rootDoc.body.appendChild(temp);
				temp.focus();
				rootDoc.body.removeChild(temp);
			}
		}
		
		this.rootWindow.ktkWindows[this.wndId] = null;
		ktkHideComboBoxes(this.rootWindow);
		if(this.onClose) {
			eval(this.onClose);
		}
	}
	
	this.show = function () {
		if(!this.shown || this.hidden) {
			ktkCompatSetStyle(this.shadowDiv, 'visibility', 'visible');
			ktkFadeIn(this.div);
			// ktkFadeIn(this.shadowDiv);
			this.shown = true;
			
			/*
			if(this.opened) {
				ktkPlaySound(KTK_URL + "/sounds/beep.wav");
			}
			*/
		}
	}
	
	this.hide = function () {
		if(KTK_DEBUG_WINDOWS) return;
		this.hidden = true;
		ktkFadeOut(this.div);
		ktkCompatSetStyle(this.shadowDiv, 'visibility', 'hidden');
		ktkHideComboBoxes(this.rootWindow);
	}
	
	this.registerChildWindow = function (childWin) {
		// ktkDebug("Registering on:\n" + childWin.location.href + "\n\nWindow:\n" + this.iframe.id);
		childWin.ktkWndObj = this;
		childWin.ktkParentWindow = this.parentWindow;
		childWin.ktkParentDocument = this.parentWindow.document;
		this.ktkChildWindow = childWin;
	}
	
	this.registerWindow = function () {
		if (typeof(this.rootWindow.ktkWindows) == "undefined") {
			this.rootWindow.ktkWindows = new Array();
			this.wndId = this.rootWindow.ktkWindows_lastId = 1;
		} else {
			this.wndId = ++this.rootWindow.ktkWindows_lastId;
		}
		
		// Buscar siguiente posición de cascada
		
		var pos = 0;
		var repeat = false;
		do {
			repeat = false;
			// TODO: Al remover una ventana, queda el elemento en null (no se elimina)
			for(var i in this.rootWindow.ktkWindows) {
				var w = this.rootWindow.ktkWindows[i];
				if(w && w.pos == pos) {
					// Posición usada => buscar otra disponible.
					pos++;
					repeat = true;
					break;
				}
			}
		} while (repeat);
		this.pos = pos;
		
		// Registrar ventana
		
		this.rootWindow.ktkWindows[this.wndId] = this;
		
		// Hooks

		// Genera problema, porque tras liberar este contexto, ya no se podrá acceder a this.rootWindow.ktkGetWindowFromRootWindow
		// porque el recurso ya fue eliminado.
		if(!this.rootWindow.ktkGetWindowFromRootWindow) this.rootWindow.ktkGetWindowFromRootWindow = ktkGetWindowFromRootWindow;
		window.ktkRootWindow = this.rootWindow;
	}

	this.resize = function(div, recursiveCounter) {
		var iFrameContent;
		var scrollTop;
		var contentObj;
		if(this.isHTMLWindow) {
			iFrameContent = this.iframeContainer; // Es el TD que contiene al iframe
			contentObj = this.iframeContainer;
		} else {
			iFrameContent = this.iframeContent;
			contentObj = this.iframe;
			scrollTop = Math.max(iFrameContent.scrollTop, iFrameContent.ownerDocument.documentElement.scrollTop);
		}
		
		// --- Dimensiones de la ventana del browser ---
		var maxHeight = ktkWindow_GetMaxHeight();
		
		// --- Dimensiones del documento contenido en el iframe ---
		
		// var docWidth = iFrameContent.offsetWidth;
		var docWidth = ktkWindow_GetMaxWidth();

		var docHeight;
		if(MSIE) {
			// MSIE: Funciona, excepto en cons. avanzadas dentro de ventanas
			// CHROME: No detecta cuando el contenido se achica
			docHeight = iFrameContent.scrollHeight;

		} else {
			// CHROME: Así un IFrame se vuelve a achicar (correcto).
			// docHeight = ktkCompatGetHeight(iFrameContent);

			docHeight = ktkCompatGetContentHeight(iFrameContent);
		}

		// if(MSIE) docHeight += 20; // Agrega 20px por los 10px de margen que tiene la ventana (en MOZ parece que ya los incluye)

		// --- Ajustar contentObj ---
		
		contentObj.style.width = (this.width ? this.width : docWidth) + "px";
		
		var oldHeight = contentObj.style.height;
		contentObj.style.height = (this.height ? this.height : docHeight) + "px";
		
		var changed = (contentObj.style.height != oldHeight);
		
		var height = parseInt(contentObj.style.height, 10);

		if(height > maxHeight) {
			if(typeof(div) != "undefined") {
				div.style.height = maxHeight + "px";
			}
			contentObj.style.height = maxHeight + "px";
			iFrameContent.ownerDocument.documentElement.scrollTop = iFrameContent.scrollTop = scrollTop;
		}
		
		// --- Dimensiones de la ventana ---

		if(MOZ) {
			this.div.style.width = ktkWindow_GetMaxWidth() + "px"; // HACK: Ocupar tamaño máximo
			contentObj.style.width = "100%";
			var w = parseInt(contentObj.clientWidth, 10);
			// Reservar espacio para el scrollbar vertical.
			// TODO: Detectar scrollbars. Ocurre en http://test.local/index.php?&a=lv&p=24, ver listado BR y luego ingresar Propiedad.
			// OBS: Primero aparece scrollbar vertical y automáticamente el horiz. Tras crecer verticalmente, no desaparecen el scrollbar, porque ahora está el scroll horizontal.
			// Solución : Aplicar overflow:hidden mientras se ajusta la ventana o detectar scrollbars (más fácil).
			w -= 26;
			iFrameContent.style.width = w + "px";
			var winWidth = parseInt(this.div.clientWidth, 10);
			var winHeight = parseInt(this.div.clientHeight, 10);
			
		} else {
			var winWidth = this.div.scrollWidth;
			var winHeight = this.div.clientHeight;
		}
		
		// Centrar
		
		var center = true;
		if (center) {
			var doc = this.rootWindow.document
			var bodyObj = doc.body;
			// var bodyObj = document.body;
			
			// Obtener "tamaño visible" (no el "tamaño total" del contenido)

			// Funciona en IE y Mozilla
			var parentWidth = ktkCompatGetWindowVisibleWidth(this.rootWindow);
			var parentHeight = ktkCompatGetWindowVisibleHeight(this.rootWindow);

			/*
			// var ow = ktkCompatGetWidth(this.div); // Obtener ancho del div
			var ow = parseInt(contentObj.style.width, 10); // Utilizar ancho del iframe (en IE7, div.clientWidth = 0)
			var oh = ktkCompatGetHeight(this.div);
			*/

			/*
			Funciona sólo en IE
			this.offsetX = rootDoc.documentElement.scrollLeft; // OBS: Demora como 200 [ms]
			this.offsetY = rootDoc.documentElement.scrollTop;
			*/

			this.offsetX = ktkCompatGetScrollLeft(this.rootWindow);
			this.offsetY = ktkCompatGetScrollTop(this.rootWindow);

			var left = (parentWidth - winWidth) / 2 + this.offsetX + this.pos * 15;
			var top = (parentHeight - winHeight) / 2 + this.offsetY + this.pos * 15;
			
			this.div.style.left = left + "px";
			this.div.style.top = top + "px";
			
			this.shadowDiv.style.left = (left + 12) + "px";
			this.shadowDiv.style.top = (top + 12) + "px";
		}

		this.shadowDiv.style.width = winWidth + "px";
		this.shadowDiv.style.height = winHeight + "px";
		
		if(changed) {
			if(typeof(recursiveCounter) == "undefined" || recursiveCounter < 10) {
				// OBS: Cuando el IFrame está dentro de un div con scroll, 
				// style.height no incrementa, changed siempre es verdadero y se produce un deadlock.
				this.resize(div, recursiveCounter + 1);
			}
		}
	
		this.x = parseInt(this.div.style.left, 10);
		this.y = parseInt(this.div.style.top, 10);

		this.w = this.div.clientWidth;
		this.h = this.div.clientHeight;

		/*
		if(MOZ) {
			contentObj.style.width = winWidth + "px";
			contentObj.style.height = winHeight + "px";
		}
		*/

		ktkHideComboBoxes(this.rootWindow);
	}
	
	// ************ Main ***********
	
	// Find Root Window
	
	if(rootWindow) {
		this.rootWindow =  rootWindow;

	} else {
		var win = window;
		// OBS: No funcinoa para iframes (BUG: la ventana se abre dentro del iframe)
		// while(win.parent != win && win.ktkIsWindow()) {
		try {
			while(win.parent != win && !win.parent.document.body.rows) { // Chequea que no sea un frameset
				// Se está abriendo una ventana dentro de otra
				win = win.parent;
			}
		} catch(e) {
		}
		this.rootWindow = win;
	}

	this.registerWindow();
	
	this.parentWindow = (parentWindow ? parentWindow : window);

	this.rootWindow.windowExists = true;
	this.ok = true;

	var rootDoc = this.rootWindow.document;
	
	// Shadow div
	
	var shadowDiv = rootDoc.createElement('div');
	var blockingDiv = rootDoc.createElement('div');
	
	ktkCompatFixStyle(shadowDiv.style);
	shadowDiv.className = 'ktkWindowShadow';
	ktkCompatSetStyle(shadowDiv, 'width', '0px');
	ktkCompatSetStyle(shadowDiv, 'left', '0');
	ktkCompatSetStyle(shadowDiv, 'top', '0');	
	ktkCompatSetStyle(shadowDiv, 'visibility', 'visible');
	ktkCompatSetStyle(shadowDiv, 'position', 'absolute');

	ktkCompatFixStyle(blockingDiv.style);
	blockingDiv.className = 'ktkWindowShadow';
	ktkCompatSetStyle(blockingDiv, 'left', '0');
	ktkCompatSetStyle(blockingDiv, 'top', '0');
	ktkCompatSetStyle(blockingDiv, 'width', '100%');
	ktkCompatSetStyle(blockingDiv, 'height', '100%');
	ktkCompatSetStyle(blockingDiv, 'visibility', 'visible');
	ktkCompatSetStyle(blockingDiv, 'position', 'absolute');

	rootDoc.body.appendChild(shadowDiv);
	this.shadowDiv = shadowDiv;

	rootDoc.body.appendChild(blockingDiv);
	this.blockingDiv = blockingDiv;
	
	// Div
	
	var div = rootDoc.createElement('div');
	ktkCompatFixStyle(div.style);
	div.className = "ktkWindow";

	ktkCompatSetStyle(div, 'left', '0');
	ktkCompatSetStyle(div, 'top', '0');	
	ktkCompatSetStyle(div, 'visibility', 'hidden');
	ktkCompatSetStyle(div, 'position', 'absolute');
	
	ktkCompatSetStyle(div, 'width', '0px'); // Setear ancho mínimo (se extiende por elementos hijos)
	
	if(!this.rootWindow.KTK_UNIQUE_ID) this.rootWindow.KTK_UNIQUE_ID = 0;
	var id = "iframeContainer" + this.rootWindow.KTK_UNIQUE_ID;
	var imgId = "closeImg" + this.rootWindow.KTK_UNIQUE_ID;
	this.rootWindow.KTK_UNIQUE_ID++;
	
	// TODO: Se debe definir siempre (necesaria por Windows)
	if(window.ktkAddGlobalKeyEvent) ktkAddGlobalKeyEvent(27, "try{ktkGetWindowFromRootWindow(" + this.rootWindow.KTK_UNIQUE_ID + ").close()} catch (e) {}");
	
	var html = "<table width=100% class='border'><tr><th class='headerCell'><table border=0 width=100%><tr><td class='titleCell'>" + title + "</td><td align=right width=5><img id='" + imgId + "' src='" + IMAGES_URL + "/closeWindow.gif' onclick='this.ktkWndObj.close()'></th></tr></table></td></tr>"
		+ "<tr><td id=" + id + "></td></tr>";
	div.innerHTML = html;
	rootDoc.body.appendChild(div);
	this.div = div;
	
	// Guardar referencia a ventana en imgButton para cerrar ventanda
	var imgObj = this.rootWindow.ktkObj(imgId);
	imgObj.ktkWndObj = this;

	// Iframe
	
	var iframe = rootDoc.createElement('iframe');
	ktkCompatFixStyle(iframe.style);
	
	this.z = iframe.id = this.rootWindow.KTK_UNIQUE_ID;
	ktkCompatSetStyle(iframe, 'width', '500px');
	ktkCompatSetStyle(iframe, 'height', '100px');
	iframe.frameBorder = 0;
	
	this.iframeContainer = rootDoc.getElementById(id);
	this.iframeContainer.appendChild(iframe);
	
	this.iframe = iframe;
	this.iframe.wndId = this.wndId;

	// Defaults


	if(KTK_DEBUG_WINDOWS) {
		ktkCompatSetStyle(div, 'visibility', 'visible');
	}
}

function ktkWindowPostClose(wndId) {
	ktkGetWindowFromRootWindow(wndId).postClose();
}

/**
 * Utilizado por el botón close, ejecutado desde la ventana padre.
 */
function ktkGetWindowFromRootWindow(id) {
	return window.ktkRootWindow.ktkWindows[id];
}

// Ver también: ktkOpenLink()
function ktkWindowOpen(title, name, url, onClose) {
	var win = new ktkWindow(title);
	if(win.ok) {
		win.opened = true;
		win.load(url);
		win.onClose = onClose;
	}
}

function ktkHideComboBoxes(parentWindow) {
	if(!(MSIE && MSIE_VERSION < 7)) return;
	var panels = parentWindow.ktkWindows;
	var doc = parentWindow.document.getElementsByTagName('BODY').item(0);
	
	ktkToBeHiddenLeft = new Array();
	ktkToBeHiddenTop = new Array();

	ktkToBeHidden = new Array();
	ktkScanChildrens(parentWindow, panels, doc, 0, 0, 0);
	
	for (i = 0; i < ktkToBeHidden.length; i++) {
		
		// stop_here = STOP_HERE;
		
		var obj = ktkToBeHidden[i];
		var bx1 = obj.ktkX;
		var by1 = obj.ktkY;
		var bx2 = bx1 + obj.offsetWidth;
		var by2 = by1 + obj.offsetHeight;
		var z = obj.z;
		
		var show = true;
		for(var pi in panels) {
			var p = panels[pi];
			if(p && p.z > z && ktkLayersOverlap(p.x, p.y, p.w, p.h, bx1, by1, bx2, by2)) {
				show = false;
				break;
			}
		}
		
		if(show && obj.hiddenByWin) {
			if(!obj.hiddenByMenu) {
				obj.style.visibility = "visible";
			}
			obj.hiddenByWin = false;
		}
		
		if(!show) {
			obj.style.visibility = "hidden";
			obj.hiddenByWin = true;
		}
	}
}

function ktkScanChildrens(parentWindow, panels, element, zorder, offsetX, offsetY)
{
	// TODO: OPT: Usar aquí también mi parche de phplayersmenu
	
	// Konqueror 3.2 needs hiding only for the following two form elements, but, alas,
	// at the time of this writing (Konqueror 3.2.2), hiding of such two form elements
	// on Konqueror 3.2.x does not work, it is affected by the following bug: http://bugs.kde.org/72885

	if(!element) return;
	
	IE5 = IE = true;
	Konqueror = Konqueror22 = Konqueror30 = Konqueror31 = Konqueror32 = false;
	
	var counter = element.childNodes.length;
	
	for (var i = 0; i < counter; i++) {
		var foobar = element.childNodes.item(i);
		
		// alert(level + ": " + foobar.nodeName + " - " + foobar.childNodes.length);
		
		var nodeName = foobar.nodeName.toLowerCase();
		if (
			( (Konqueror22 || Konqueror30 || Konqueror31) &&
			 (
			  	nodeName == 'input'
				|| nodeName == 'select'
				|| nodeName == 'textarea'
			 )
			)
			||
			( Konqueror32 &&
			 (
				((nodeName == 'select') && foobar.size > 1)
				|| nodeName == 'textarea'
			 )
			)
			||
			( IE &&
			 ( nodeName == 'select' )
			)
		) {
			foobar.ktkX = ktkCompatGetX(foobar) + offsetX;
			foobar.ktkY = ktkCompatGetY(foobar) + offsetY;
			foobar.z = zorder;
			ktkToBeHidden[ktkToBeHidden.length] = foobar;
		}
		
		if(nodeName == "iframe") {
			for(var p in panels) {
				if(panels[p] && foobar == panels[p].iframe) {
					var iframeContent = panels[p].iframeContent;
					if(iframeContent) {
						try { // A veces iframeContent.document no es accesible (permission denied)
							ktkScanChildrens(parentWindow, panels, iframeContent.document.getElementsByTagName('BODY').item(0), panels[p].z, ktkCompatGetX(foobar), ktkCompatGetY(foobar));
						} catch(e) {};
					}
					break;
				}
			}
		} else {
			if (foobar.childNodes.length > 0) {
				ktkScanChildrens(parentWindow, panels, foobar, zorder, offsetX, offsetY);
			}
		}
	}
	
	if ( !( (Konqueror && !Konqueror22) || IE5) ) {
		return;
	}
}

function ktkLayersOverlap(x, y, w, h, bx1, by1, bx2, by2)
{
	if (Konqueror22) {
		return true;
	}

	var ax1 = x;
	var ay1 = y;
	var ax2 = x + w;
	var ay2 = y + h;
	
	// alert("Ventana: " + ax1 + ", " + ay1 + ", " + ax2 + ", " + ay2 + " ------ Objeto: " + bx1 + ", " + by1 + ", " + bx2 + ", " + by2);

	if (bx1 > ax1) ax1 = bx1;
	if (bx2 < ax2) ax2 = bx2;
	if (by1 > ay1) ay1 = by1;
	if (by2 < ay2) ay2 = by2;

	return (ax2 > ax1 && ay2 > ay1);
}

function ktkGetIFrameId(childWin) {

	// Esta rutina encuentra sólo los frames creados por ktkIFrame
	// CODE_POS: Debe ir antes
	for(var f in window.frames) {
		try {
			if(window.frames[f] == childWin) {
				return f;
			}
		} catch (e) {}
	}
	
	// Esta rutina encuentra sólo los frames creados dinámicamente
	for(f = 0; window.frames[f]; f++) {
		if(window.frames[f] == childWin) {
			return f;
		}
	}
	
	return null;
}

function ktkGetContainerScrollState(obj) {
	for(var elem = obj.parentNode; elem; elem = elem.parentNode) {
		if(elem.scrollTop || elem.scrollLeft) {
			return {
				container : elem,
				scrollTop : elem.scrollTop,
				scrollLeft : elem.scrollLeft
			};
		}
		if(elem.parentNode == elem) return null;
	}
	return null;
}

function ktkSetContainerScrollState(scrollState) {
	if(!scrollState) return;
	scrollState.container.scrollTop = scrollState.scrollTop;
	scrollState.container.scrollLeft = scrollState.scrollLeft;
}

/*
 * Ajusta el tamaño del iframe al contenido.
 *
 * Elementos:
 * - container -> IFrame -> content
 *
 * Objetivo:
 * - Si el tamaño mínimo del contenido excede al del iframe se incrementa el tamaño del iframe.
 * - En caso contrario, no se hace nada.
 * - Verificar que al agrandar el iframe no se produzca un deadlock (que se vuelva a agrandar el contenido)
 *
 * TODO: BUG:
 * - El contenido inicialmente se carga con un ancho que excede al del container
 * - El container se ajusta al contenido (aumenta)
 * - El contenido nuevamente se ajusta al contenedor recursivamente (deadlock)
 *
 * Discusión:
 * - Otro modo : ajustar el contenido al iframe. No hacer siempre ya que también
 *   se requiere poder definir un iframe sin tamaño y que este se ajsute al
 *   documento.
 * - TODO: Implementar ambos modos
 *
 * Se ejecuta en parentWindow (frames) o rootWindow (windows)
 * ChildWin es la ventana contenida (iframe).
 * 
 * BUG: En Transtecnia > Clientes > Productos
 * - Se muestra otro proceso dentro del IFrame
 * - Al recargarse el contenido del iframe, se vuelve a ejecutar ktkResizeIFrame()
 *
 * Al mostrarse un proceso dentro de un tab:
 * - Se debe ajustar el ancho del iframe al del contenido sólo si el contenido no cabe (resizeFrameWidth = "grow")
 *
 * Para cada dimensión (ancho, alto) existen estas posibilidades:
 * - "fit" : ajustar IFrame al contenido siempre (incluso si el contenido es menor)
 * - "grow" : ajustar IFrame al contenido sólo si contenido > iframe
 * - "none" : no ajustar al contenido y mostrar scrollbars si el contenido es mayor al iframe
 *
 * See Also:
 * - ktkCopyParentsWidth()
 */
function ktkResizeIFrame(childWin) {
	var bodyObj = childWin.document.body;
	var iframe, iframeId;

	if(MOZ) {
		iframe = childWin.frameElement;
		iframeId = iframe.id;
	} else {
		iframeId = ktkGetIFrameId(childWin);
		if(iframeId == null) return;
		iframe = ktkObj(iframeId);
		if(!iframe) return;
	}

	// TODO: resizeFrameWidth debe pasarse en el documento
	// CHANGED: Was false, debido a Transtecnia > Cliente > Movimientos
	// En Progestión > Campañas > Ver Campaña > Tab OTs se debe hacer resizeFrameWidth.
	var resizeFrameWidthMode, resizeFrameHeightMode;

	resizeFrameWidthMode = iframe.getAttribute("ktkHorizontalResizeMode");
	resizeFrameHeightMode = iframe.getAttribute("ktkVerticalResizeMode");

	if(!resizeFrameWidthMode) resizeFrameWidthMode = "grow";
	if(!resizeFrameHeightMode) resizeFrameHeightMode = "grow";

	iframe.resizeFrameHeightMode = resizeFrameHeightMode;

	// ktkDebug(resizeFrameWidthMode + ", " + resizeFrameHeightMode);
	
	var scrollState = ktkGetContainerScrollState(iframe);

	var frameBodyObj = iframe.ownerDocument.body;
	if(!frameBodyObj.scrollWidth) return; // Ventana invisible => salir para que el iframe no quede con width y height 0 (después no se arregla)

	if(resizeFrameWidthMode == "fit") {
		iframe.style.width = "1px"; // Achicar para obtener tamaño mínimo
	}

	if(resizeFrameHeightMode == "fit") {
		iframe.style.height = "1px"; // Achicar para obtener tamaño mínimo
	}
	
	// TODO: NS6: if (currentfr.contentDocument && currentfr.contentDocument.body.offsetHeight)
	/*
	var getFFVersion=navigator.userAgent.substring(navigator.userAgent.indexOf("Firefox")).split("/")[1]
	var FFextraHeight=parseFloat(getFFVersion)>=0.1? 16 : 0 //extra height in px to add to iframe in FireFox 1.0+ browsers
	currentfr.height = currentfr.contentDocument.body.offsetHeight + FFextraHeight; 
	*/

	var contentWidth = bodyObj.scrollWidth + (frameBodyObj.offsetWidth - frameBodyObj.clientWidth);

	// OBS: bodyObj.clientWidth da 0 (incorrecto) en Transtecnia > Cliente > Movimientos
	if(resizeFrameWidthMode == "fit") {
		iframe.style.width = contentWidth + "px";

	} else if(resizeFrameWidthMode == "grow") {
		var iframeWidth = ktkCompatGetWidth(iframe);
		if(iframeWidth) { // Inicialmente se obtiene iframeWidth = 0 (incorrecto) => ignorar.
			var widthTolerance = 25;
			var newIFrameWidth = contentWidth;
			if(newIFrameWidth - widthTolerance > iframeWidth) {
				newIFrameWidth += 20; // Evita scrollbars el IFrame en ASOF
				iframe.style.width = newIFrameWidth + "px";
			}
		}
	}

	// Proporcionar referencias a ktkResizeIFrame_Cont()
	iframe.bodyObj = bodyObj;
	iframe.frameBodyObj = frameBodyObj;
	iframe.scrollState = scrollState;

	if(newIFrameWidth > 1024) {
		// HACK:
		// Simular doEvents() para que se pueda leer contentHeight correctamente.
		// Fallaba en MSIE cuando el ancho era muy grande.
		setTimeout("ktkResizeIFrame_Cont('" + iframeId + "')", 0);
	} else {
		ktkResizeIFrame_Cont(iframeId);
	}
}

function ktkResizeIFrame_Cont(iframeId) {
	var iframe = ktkObj(iframeId);

	if(iframe.resizeFrameHeightMode == "grow") {
		var frameBodyObj = iframe.frameBodyObj;

		var contentHeight = ktkCompatGetContentHeight(iframe.bodyObj);

		if(MSIE) {
			contentHeight += (frameBodyObj.offsetHeight - frameBodyObj.clientHeight);

			// Reservar espacio para los scrollbars verticales
			// contentHeight += 20;

		} else {
			// TODO: Implementar código equivalente.

			// FIX: Para Chrome
			// TODO: Parece que en IE, se limita el alto de un elemento padre.
			// if(contentHeight > 500) contentHeight = 500;
		}

		// ktkDebug(iframeId + ": " + contentHeight);
		iframe.style.height = contentHeight + "px";
		// alert(iframe.id + " : " + iframe.style.height);

		ktkSetContainerScrollState(iframe.scrollState);
	}

	ktkWindowResized();
}

function ktkResizeIFrame_old(childWin, recursiveCounter) {
	var debug = 0;
	var newAlg = 0;
	
	if(!window.recursiveCounter) recursiveCounter = 0;
	   
	var bodyObj = childWin.document.body;
	
	var iframeId = ktkGetIFrameId(childWin);
	if(iframeId == null) return;
	var iframe = ktkObj(iframeId);
	if(!iframe) return;
	
	var oldFrameWidth = iframe.style.width;
	var oldFrameHeight = iframe.style.height;
	// iframe.style.height = 100000;
	
	// --- Obtener tamaño mínimo del documento en el iframe ---
	
	var containerBody = window.document.body; // documento en el iframe

	/*
	Ejemplo para obtener tamaño mínimo
	var containerBak = containerBody.style.width; // Respaldar
	iframe.style.width = "50px";
	containerBody.style.width = "100px"; // Achicar documento container para obtener ancho mínimo del iframe contenido	
	contentWidth = bodyObj.scrollWidth;
	window.document.body.style.width = containerBak; // Restaurar tamaño original
	*/

	var contentWidth = bodyObj.scrollWidth;
	if(!contentWidth) return; // Ventana invisible => salir para que el iframe no quede con width y height 0 (después no se arregla)
	var frameBodyObj = iframe.document.body;
	var contentHeight = frameBodyObj.scrollHeight + (frameBodyObj.offsetHeight - frameBodyObj.clientHeight);
	
	ktkDebug(1);
	
	if(newAlg) {
		if(iframe.ktkSeized) {
			// El iframe ya ha sido ajustado anteriormente.
			
			// El contenido siempre excede al iframe (style = 100%) => arreglar contenido ajustándolo al iframe
			// alert(contentWidth);
			
		} else {
			iframe.ktkSeized = true;
		}
	}
	
	// Ajustar iframe
	iframe.style.width = contentWidth + "px";
	iframe.style.height = contentHeight + "px";
	
	var changed = (iframe.style.height != oldFrameHeight);
	
	if(debug) {
		alert("Content: " + contentWidth + ", " + contentHeight + "\nIFrame: " + oldFrameWidth + " -> " + iframe.style.width + ", " + oldFrameHeight + " -> " + iframe.style.height + "\nContainer Width: " + containerBody.style.width);
	}
	
	if(recursiveCounter > 10) {
		if(debug) alert("Deadlock");
		changed = false;
	}
	
	if(changed) {
		// OBS: Cuando el IFrame está dentro de un div con overflow (scroll), 
		// style.height no incrementa, changed siempre es verdadero y se produce un deadlock.
		ktkResizeIFrame(childWin, recursiveCounter + 1);
	} else {
		// Iframe resized => invocar evento resize si el iframe es una ventana
		ktkWindowResized();
	}
}

function ktkWindow_GetRootWindow(win) {
	if(window.parent && window.parent != win) {
		return window.parent;
	} else {
		return win;
	}
}

function ktkWindow_GetMaxHeight() {
	return Math.round(ktkCompatGetWindowVisibleHeight(ktkWindow_GetRootWindow()) * 0.9);
	/*
	var rootWin = ktkWindow_GetRootWindow();
	var parentHeight = rootWin.document.documentElement.clientHeight;
	if(!parentHeight) {
		var parentHeight = parseInt(rootWin.document.body.clientHeight, 10);
	}
	return parentHeight * 0.8;
	*/
}

// Retorna el ancho máximo dado por el tamaño total
function ktkWindow_GetMaxWidth() {
	return Math.round(ktkCompatGetWindowVisibleWidth(ktkWindow_GetRootWindow()) * 0.9);
	/*
	var rootWin = ktkWindow_GetRootWindow();
	var parentWidth = rootWin.document.documentElement.clientWidth;
	if(!parentWidth) {
		var parentWidth = parseInt(rootWin.document.body.clientWidth, 10);
	}
	return parentWidth * 0.8;
	*/
}

