//============================================================================\\
//                          Funciones generales                               \\
//============================================================================\\
//____________________________________________________________________________\\
/** 
 * Función abre una ventana modal para pedir datos
 *
 * @param   page: La página html a mostrar en la ventana modal
 * @return  Lo que se quiera devolver en la página mediante window.returnValue
 */
function openModalWindow(inPage,inWidth,inHeight) {
    var strFeatures;
    var arg = "";
    var strReturnData;  // Los datos devueltos por la ventana

    strFeatures =  "dialogWidth:" + inWidth + "px;";
    strFeatures += "dialogHeight:" + inHeight + "px;";
    //strFeatures += "dialogTop:200px;";
    strFeatures += "center:yes;";
    strFeatures += "help:no;border:thin;status:no;scrollbars=no;toolbar=no;menubar=no;";
    strFeatures += "scroll:no;resizable: no; status: no;unadorned:yes";
    strReturnData = window.showModalDialog(inPage,arg,strFeatures);
    return strReturnData
}
//___________________________________________________________________________\\
/**
 * Añade una linea a la tabla.
 * NOTA: La tabla solo puede contener lineas de una celda
 *
 * @param   objTable: 	La tabla a la que hay que añadir una linea
 * @param   strHTML:	El codigo HTML a insertar en la celda
 */
function addRowInTable(objTable,strHTML) {
    var objTable;   // Tabla padre de la fila
    var objRow;     // Nueva linea
    var objCell;    // Nueva celda en la linea que contiene el html
    
    if (objTable == null || strHTML == null) return;
    
    // Buscar la tabla a partir del boton que se ha pulsado, insertar una linea
    // y una celda en esa linea con el html que se pasa
    try {
        // Insertar la nueva linea contenedora
        objRow = objTable.insertRow();  // Insertar una línea (TR)
        objCell = objRow.insertCell();  // Insertar una celda (TD)
        objCell.innerHTML = strHTML;    // En la celda insertar el HTML
    } catch (e) {
    	alert(e);
    }
}
/**
 * Borra una linea de una tabla que contiene el objeto que se pasa
 *
 * @param   obj: El objeto contenido en la tabla
 */
function deleteContainingRowInTable(obj) {
	try {
		// Encontrar el objeto TR que contiene al objeto
		// que se pasa
	    var objTR = obj;
	    do {
	        objTR = objTR.parentElement;	// Subir en la jerarquia
	    } while (objTR.tagName != "TR");

	    // Ahora buscar la tabla que contiene el TR
	    var objTABLE = objTR;
	    do {
			objTABLE = objTABLE.parentElement;	// Subir en la jerarquia
		} while (objTABLE.tagName != "TABLE");
		objTABLE.deleteRow(objTR.rowIndex);
	} catch (e) {
		alert("Exception al borrar una linea de la tabla");
	}
}
//___________________________________________________________________________\\
/**
 * Agrega a un combo una opcion con el texto indicado 
 * @param oSelect: El objeto select
 * @param optionValue: El valor (key) de la opcion
 * @param optionText: El texto de la opcion
 * @param bSelected: Si la opcion se marca como seleccionada
 */
function addOptionToSelect(oSelect,optionKey,optionText,bSelected) {
      var oOption = document.createElement("option");
      oSelect.options.add(oOption,0);
      oOption.value = (optionKey == null ? "":optionKey);
      oOption.innerText = optionText; 
      oOption.selected = (bSelected == true ? "true":"false");     
}
//___________________________________________________________________________\\
/**
 * getAnchorPosition(anchorname)
 *   Devuelve un objeto que tiene las propiedades .x y .y que son las coordenadas
 *   relativas a la página de un elemento anchor <a></a>.
 */
function getAnchorPosition(anchorname) {
	// This function will return an Object with x and y properties
	var useWindow = false;
	var coordinates = new Object();
	var x=0;
	var y=0;
	// Browser capability sniffing
	var use_dom = false;
	var use_css = false;
	var use_layers = false;
	if (document.getElementById) { 
		use_dom = true;
	} else if (document.all) { 
		use_css = true; 
	} else if (document.layers) { 
		use_layers = true;
	}
	// Logic to find position
 	if (use_dom && document.all) {
		x = AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
		y = AnchorPosition_getPageOffsetTop(document.all[anchorname]);
	} else if (use_dom) {
		var o = document.getElementById(anchorname);
		x = o.offsetLeft;
		y = o.offsetTop;
	} else if (use_css) {
		x = AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
		y = AnchorPosition_getPageOffsetTop(document.all[anchorname]);
	} else if (use_layers) {
		var found=0;
		for (var i=0; i<document.anchors.length; i++) {
			if (document.anchors[i].name == anchorname) {
				found=1;
				break;
			}
		}
		if (found == 0) {
			coordinates.x=0; 
			coordinates.y=0; 
			return coordinates;
		}
		x = document.anchors[i].x;
		y = document.anchors[i].y;
	} else {
		coordinates.x=0; 
		coordinates.y=0; 
		return coordinates;
	}
	coordinates.x = x;
	coordinates.y = y;
	return coordinates;
	}
//___________________________________________________________________________\\
/**
 * getAnchorWindowPosition(anchorname)
 *   Devuelve un objeto que tiene las propiedades .x y .y que son las coordenadas
 *   relativas a la ventana de un elemento anchor <a></a>.
 */
function getAnchorWindowPosition(anchorname) {
	var coordinates = getAnchorPosition(anchorname);
	var x=0;
	var y=0;
	if (document.getElementById) {
		if (isNaN(window.screenX)) {
			x = coordinates.x - document.body.scrollLeft + window.screenLeft;
			y = coordinates.y - document.body.scrollTop + window.screenTop;
		} else {
			x = coordinates.x + window.screenX + (window.outerWidth-window.innerWidth) - window.pageXOffset;
			y = coordinates.y + window.screenY + (window.outerHeight-24-window.innerHeight) - window.pageYOffset;
		}
	} else if (document.all) {
		x = coordinates.x - document.body.scrollLeft + window.screenLeft;
		y = coordinates.y - document.body.scrollTop + window.screenTop;
	} else if (document.layers) {
		x = coordinates.x + window.screenX + (window.outerWidth-window.innerWidth) - window.pageXOffset;
		y = coordinates.y + window.screenY + (window.outerHeight-24-window.innerHeight) - window.pageYOffset;
	}
	coordinates.x = x;
	coordinates.y = y;
	return coordinates;
	}
//___________________________________________________________________________\\
// Funciones de IE para obtener la posicion de un elemento
function AnchorPosition_getPageOffsetLeft (el) {
	var ol = el.offsetLeft;
	while ((el = el.offsetParent) != null) { 
		ol += el.offsetLeft; 
	}
	return ol;
}
function AnchorPosition_getWindowOffsetLeft (el) {
	var scrollamount = document.body.scrollLeft;
	return AnchorPosition_getPageOffsetLeft(el)-scrollamount;
}	
function AnchorPosition_getPageOffsetTop (el) {
	var ot = el.offsetTop;
	while((el = el.offsetParent) != null) { 
		ot += el.offsetTop; 
	}
	return ot;
}
function AnchorPosition_getWindowOffsetTop (el) {
	var scrollamount = document.body.scrollTop;
	return AnchorPosition_getPageOffsetTop(el)-scrollamount;
}






//============================================================================\\
//                 Funciones para mostrar ventanas popup                      \\
//============================================================================\\
//___________________________________________________________________________\\
/**
 * Posiciona una ventana popup al lado del anchor <a> cuyo nombre se pasa
 */
function PopupWindow_getXYPosition(anchorname) {
	var coordinates;
	if (this.type == "WINDOW") {
		coordinates = getAnchorWindowPosition(anchorname);
	} else {
		coordinates = getAnchorPosition(anchorname);
	}
	this.x = coordinates.x;
	this.y = coordinates.y;
}
//___________________________________________________________________________\\
/**
 * Establece el tamaño (width/height) de un popup tipo div
 */
function PopupWindow_setSize(width,height) {
	this.width = width;
	this.height = height;
}
//___________________________________________________________________________\\
/**
 * Llena una ventana con el conteido HTML
 */
function PopupWindow_populate(contents) {
	this.contents = contents;
	this.populated = false;
}
//___________________________________________________________________________\\
/**
 * Refresca los contenidos mostrados en una ventana
 */
function PopupWindow_refresh() {
	if (this.divName != null) {
		// refresh the DIV object
		if (this.use_dom) {
			document.getElementById(this.divName).innerHTML = this.contents;
		} else if (this.use_css) { 
			document.all[this.divName].innerHTML = this.contents;
		} else if (this.use_layers) { 
			var d = document.layers[this.divName]; 
			d.document.open();
			d.document.writeln(this.contents);
			d.document.close();
		}
	} else {
		if (this.popupWindow != null && !this.popupWindow.closed) {
			this.popupWindow.document.open();
			this.popupWindow.document.writeln(this.contents);
			this.popupWindow.document.close();
		}
	}
}
//___________________________________________________________________________\\
/**
 * Muestra y posiciona una ventana en relacion a la posicion del anchor <a>
 * que se pasa
 */
function PopupWindow_showPopup(anchorname) {
	this.getXYPosition(anchorname);
	this.x += this.offsetX;
	this.y += this.offsetY;
	if (!this.populated && (this.contents != "")) {
		this.populated = true;
		this.refresh();
	}
	if (this.divName != null) {
		// Show the DIV object
		if (this.use_dom) {
			document.getElementById(this.divName).style.left = this.x;
			document.getElementById(this.divName).style.top = this.y;
			document.getElementById(this.divName).style.visibility = "visible";
		} else if (this.use_css) {
			document.all[this.divName].style.left = this.x;
			document.all[this.divName].style.top = this.y;
			document.all[this.divName].style.visibility = "visible";
		} else if (this.use_layers) {
			document.layers[this.divName].left = this.x;
			document.layers[this.divName].top = this.y;
			document.layers[this.divName].visibility = "visible";
		}
	} else {
		if (this.popupWindow == null || this.popupWindow.closed) {
			// If the popup window will go off-screen, move it so it doesn't
			if (screen && screen.availHeight) {
				if ((this.y + this.height) > screen.availHeight) {
					this.y = screen.availHeight - this.height;
				}
			}
			if (screen && screen.availWidth) {
				if ((this.x + this.width) > screen.availWidth) {
					this.x = screen.availWidth - this.width;
				}
			}
			this.popupWindow = window.open("about:blank","window_"+anchorname,"toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no,width="+this.width+",height="+this.height+",screenX="+this.x+",left="+this.x+",screenY="+this.y+",top="+this.y+"");
		}
		this.refresh();
	}
}
//___________________________________________________________________________\\
/**
 * Oculta una ventana popup
 */
function PopupWindow_hidePopup() {
	if (this.divName != null) {
		if (this.use_dom) {
			document.getElementById(this.divName).style.visibility = "hidden";
		} else if (this.use_css) {
			document.all[this.divName].style.visibility = "hidden";
		} else if (this.use_layers) {
			document.layers[this.divName].visibility = "hidden";
		}
	} else {
		if (this.popupWindow && !this.popupWindow.closed) {
			this.popupWindow.close();
			this.popupWindow = null;
		}
	}
}
// Pass an event and return whether or not it was the popup DIV that was clicked
function PopupWindow_isClicked(e) {
	if (this.divName != null) {
		if (this.use_layers) {
			var clickX = e.pageX;
			var clickY = e.pageY;
			var t = document.layers[this.divName];
			if ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height)) {
				return true;
			} else { 
				return false; 
			}
		} else if (document.all) { // Need to hard-code this to trap IE for error-handling
			var t = window.event.srcElement;
			while (t.parentElement != null) {
				if (t.id==this.divName) {
					return true;
				}
				t = t.parentElement;
			}
			return false;
		} else if (this.use_dom) {
			var t = e.originalTarget;
			while (t.parentNode != null) {
				if (t.id==this.divName) {
					return true;
				}
				t = t.parentNode;
			}
			return false;
		}
		return false;
	}
	return false;
}

// Check an onMouseDown event to see if we should hide
function PopupWindow_hideIfNotClicked(e) {
	if (this.autoHideEnabled && !this.isClicked(e)) {
		this.hidePopup();
	}
}
// Call this to make the DIV disable automatically when mouse is clicked outside it
function PopupWindow_autoHide() {
	this.autoHideEnabled = true;
}
// This global function checks all PopupWindow objects onmouseup to see if they should be hidden
function PopupWindow_hidePopupWindows(e) {
	for (var i=0; i<popupWindowObjects.length; i++) {
		if (popupWindowObjects[i] != null) {
			var p = popupWindowObjects[i];
			p.hideIfNotClicked(e);
		}
	}
}
// Run this immediately to attach the event listener
function PopupWindow_attachListener() {
	if (document.layers) {
		document.captureEvents(Event.MOUSEUP);
	}
	window.popupWindowOldEventListener = document.onmouseup;
	if (window.popupWindowOldEventListener != null) {
		document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");
	} else {
		document.onmouseup = PopupWindow_hidePopupWindows;
	}
}
// CONSTRUCTOR for the PopupWindow object
// Pass it a DIV name to use a DHTML popup, otherwise will default to window popup
function PopupWindow(divName) {
	if (!window.popupWindowIndex) { 
		window.popupWindowIndex = 0; 
	}
	if (!window.popupWindowObjects) { 
		window.popupWindowObjects = new Array(); 
	}
	if (!window.listenerAttached) {
		window.listenerAttached = true;
		PopupWindow_attachListener();
	}
	this.index = popupWindowIndex++;
	popupWindowObjects[this.index] = this;
	this.divName = null;
	this.popupWindow = null;
	this.width=0;
	this.height=0;
	this.populated = false;
	this.visible = false;
	this.autoHideEnabled = false;
	
	this.contents = "";
	if (arguments.length > 0) {
		this.type="DIV";
		this.divName = arguments[0];
	} else {
		this.type="WINDOW";
	}
	this.use_dom = false;
	this.use_css = false;
	this.use_layers = false;
	// Ver como acceder a los objetos
	if (document.getElementById) { 
		this.use_dom = true; 
	} else if (document.all) { 
		this.use_css = true; 
	} else if (document.layers) { 
		this.use_layers = true; 
	} else { 
		this.type = "WINDOW"; 
	}
	this.offsetX = 0;
	this.offsetY = 0;
	// Method mappings
	this.getXYPosition = PopupWindow_getXYPosition;
	this.populate = PopupWindow_populate;
	this.refresh = PopupWindow_refresh;
	this.showPopup = PopupWindow_showPopup;
	this.hidePopup = PopupWindow_hidePopup;
	this.setSize = PopupWindow_setSize;
	this.isClicked = PopupWindow_isClicked;
	this.autoHide = PopupWindow_autoHide;
	this.hideIfNotClicked = PopupWindow_hideIfNotClicked;
}

