// JavaScript Document
// Dectectar clicks con control y click contrarios en objetos con OnClick -- Rafael Pólit Jr V1.0Beta

// Parametros a cambiar por el usuario
var menuContextualVersion = '1.0Beta';
var nombreDeMenuContextual = 'divMenuContextual';
//--
var ctrlIsDown = false;
var urlDeDiv = '';

function documentOnKeyDown( e )
{
    var event = (e) ? e : window.event;
    if( event.keyCode == 17 )
    {
        ctrlIsDown = true;
    }
}
 
function documentOnKeyUp( e )
{
    var event = (e) ? e : window.event;
    if( event.keyCode == 17 )
    {
        ctrlIsDown = false;
    }
}
function cerrarMenuContextual( e ) {
	elMenu = document.getElementById(nombreDeMenuContextual);
	elMenu.style.display = "none";
	document.onclick = null;
}
function clickContrario( e ) {
	var event = (e) ? e : window.event;
	event.cancelBubble=true;
	// Asignar objeto que convoca - crossBrowser
	element = event.target || event.srcElement;
	//------------------------------------------
	// Encontrar el objeto que tiene el link
	while (typeof(element.onclick)!="function") {
		element = element.parentNode;
	}
	// Determinar el Url
	textoOnClick = element.onclick.toString();
	if (textoOnClick.indexOf("'")!=-1) {
		urlDeDiv = textoOnClick.substr(textoOnClick.indexOf("'")+1,textoOnClick.lastIndexOf("'")-(textoOnClick.indexOf("'")+1));
	}
	if (textoOnClick.indexOf('"')!=-1) {
		urlDeDiv = textoOnClick.substr(textoOnClick.indexOf('"')+1,textoOnClick.lastIndexOf('"')-(textoOnClick.indexOf('"')+1));
	}
	// Posicionar el menu flotante
	elMenu = document.getElementById(nombreDeMenuContextual);
	// Determinar tamaño de pantalla madre
	var clientWidth;
	var clientHeight;
	var clientScrollX;
	var clientScrollY;
	var clientX = event.clientX;
	var clientY = event.clientY;
	switch(BrowserDetect.browser) {
		case "Explorer":
			if (document.documentElement && document.documentElement.clientWidth) {
				clientWidth = document.documentElement.clientWidth;
				clientScrollX = document.documentElement.scrollLeft;
			}
			else if (document.body) {
				clientWidth = document.body.clientWidth;
				clientScrollX = document.body.scrollLeft;
			//clientWidth = document.documentElement.clientWidth;
			}
			if (document.documentElement && document.documentElement.clientHeight) {
				clientHeight = document.documentElement.clientHeight;
				clientScrollY = document.documentElement.scrollTop;
			}
			else if (document.body) {
				clientHeight = document.body.clientHeight;
				clientScrollY = document.body.scrollTop;
			//clientHeight = document.documentElement.clientHeight;
			}
			break;
		case "Safari":
			clientWidth = window.innerWidth;
			clientScrollX = window.pageXOffset;
			clientHeight = window.innerHeight;
			clientScrollY = window.pageYOffset;
			// Safari entiende event.clientX como pos+scroll
			clientX -= clientScrollX;
			clientY -= clientScrollY;
			break;
		default:  // Firefox, etc.
			clientWidth = Math.min(window.innerWidth, document.documentElement.clientWidth);
			clientScrollX = document.documentElement.scrollLeft;
			clientHeight = Math.min(window.innerHeight, document.documentElement.clientHeight);
			clientScrollY = document.documentElement.scrollTop;
			break;
	}
	//alert(clientHeight+", "+clientScrollY+","+event.clientY);
	//-----
	elMenu.style.display = "block";
	elMenu.style.left = ((clientX+elMenu.offsetWidth)<clientWidth)?((clientX+clientScrollX)+"px"):(((clientWidth-elMenu.offsetWidth)+clientScrollX)+"px");
	elMenu.style.top = ((clientY+elMenu.offsetHeight)<clientHeight)?((clientY+clientScrollY)+"px"):(((clientHeight-elMenu.offsetHeight)+clientScrollY)+"px");
	// asignar evento para el onclick general
	document.onclick = cerrarMenuContextual;
	return false;
}
function menuContextualClick(tipo) {
	/*	1 - en la misma ventana
		2 - en nueva ventana
	*/
	switch (tipo) {
		case "1":
			window.location = urlDeDiv;
			break;
		case "2":
			abrirConClickContrario(urlDeDiv, '');
			break;
	}
}
function irAUrl(url) {
	if (ctrlIsDown) {
		ctrlIsDown = false;
		abrirConClickContrario(url, '');
	}
	else {
		ctrlIsDown = false;
		window.location = url;
	}
}
function abrirConClickContrario(url, nombreID) {
	if (arguments.length==4) {
		window.open(url,nombreID,'resizable=no, scrollbars=no, width='+ancho+', height='+alto+',top=200, left=200');
	}
	if (arguments.length==2) {
		window.open(url,nombreID);
	}
}
function creaLinkEnMenu(nombre,accion) {
	return '<div onclick="'+accion+'" onmouseover="javascript:this.style.background=\'#b2b4bf\';" onmouseout="javascript:this.style.background=\'#ffffff\';" style="padding:2px; padding-left:5px; padding-right:5px; cursor:pointer;">'+nombre+'</div>';
}
function crearSeparadorEnMenu() {
	return '<div class="separadorMenu" style="border-top:1px solid #aaaaaa; font-size:0px; margin:2px;  margin-top:4px; margin-bottom:4px;"><!-- --></div>';
}
function crearMenuContextual() {
	/* Estructura del Menu Contextual:
		<div id="divMenuContextual">
			<div onclick="javascript:menuNuevaVentana();">Abrir en ventana nueva</div>
			<div class="separadorMenu"><!-- --></div>
			<div class="info">Menu Ver 1.0Beta</div>
		</div>
	*/
	var divMenuContextual = document.createElement('div');
	divMenuContextual.setAttribute('id','divMenuContextual');
	divMenuContextual.style.display = 'none';
	divMenuContextual.style.position = 'absolute';
	divMenuContextual.style.background = '#ffffff';
	divMenuContextual.style.border = '1px solid #909090';
	divMenuContextual.style.padding = '2px';
	divMenuContextual.style.fontFamily = 'Verdana, Arial, Helvetica, sans-serif';
	divMenuContextual.style.fontSize = '70%';
	divMenuContextual.style.zIndex = '3';
	
	divMenuContextual.innerHTML ='';
	divMenuContextual.innerHTML += creaLinkEnMenu('Abrir','javascript:menuContextualClick(\'1\');');
	divMenuContextual.innerHTML += creaLinkEnMenu('Abrir en nueva ventana','javascript:menuContextualClick(\'2\');');
	divMenuContextual.innerHTML += crearSeparadorEnMenu();
	divMenuContextual.innerHTML += '<div style="padding:2px; padding-left:5px;  padding-right:5px; color:#aaaaaa;">Menu Contextual Ver '+menuContextualVersion+'</div>';
	document.body.appendChild(divMenuContextual);
}
//---------------------------------------------
function registrarMenuContextual() {
	document.onkeydown=documentOnKeyDown;
	document.onkeyup=documentOnKeyUp;
	
	crearMenuContextual();
	
	todosLosObjetos = document.getElementsByTagName("body")[0].getElementsByTagName("*");
	for(i=0;i<todosLosObjetos.length;i++) {
		// Interceptar el Click contrario
		/*if (todosLosObjetos[i].className.indexOf(nombreDeClaseAInterceptar)!=-1) {
			todosLosObjetos[i].oncontextmenu = clickContrario;
		}*/
		// Reemplazar OnClicks de window.location a irAUrl
		if(typeof(todosLosObjetos[i].onclick)=='function') {
			textoOnClick = todosLosObjetos[i].onclick.toString();
			if (textoOnClick.indexOf('window.location')!=-1) {
				if (textoOnClick.indexOf("'")!=-1) {
					urlLocal = textoOnClick.substr(textoOnClick.indexOf("'")+1,textoOnClick.lastIndexOf("'")-(textoOnClick.indexOf("'")+1));
				}
				if (textoOnClick.indexOf('"')!=-1) {
					urlLocal = textoOnClick.substr(textoOnClick.indexOf('"')+1,textoOnClick.lastIndexOf('"')-(textoOnClick.indexOf('"')+1));
				}
				todosLosObjetos[i].oncontextmenu = clickContrario;
				eval("todosLosObjetos[i].onclick = function () { irAUrl('"+urlLocal+"'); }");
			}
		}
	}
}
//---------------------------------------
// Agregar el manejo de eventos al Onload sin alterar los onload existentes
// Firefox, Mozila, Etc.
if (window.addEventListener) {
	window.addEventListener('load',registrarMenuContextual,false);
}
// IE
if (window.attachEvent) {
	window.attachEvent('onload',registrarMenuContextual);
}
//---------------------------------------
// Detectar Brwoser - http://www.quirksmode.org/js/detect.html
/*  * Browser name: BrowserDetect.browser
    * Browser version: BrowserDetect.version
    * OS name: BrowserDetect.OS
*/
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();
//----------------------
// Size and Scroll bar - http://www.softcomplex.com/docs/get_window_size_and_scrollbar_position.html
function f_clientWidth() {
	return f_filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}
function f_clientHeight() {
	return f_filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}
function f_scrollLeft() {
	return f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
function f_scrollTop() {
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}
