var url1 = "Scripts/enviaramigos.php?piada="; // The server-side script
var url2 = "Scripts/mostraenviaramigos.php?piada="; // The server-side script
var url3 = "Scripts/votar.php?piada="; // The server-side script
var url4 = "Scripts/mostracat.php?categoria=";
var url6 = "contato.php?nomesugestao="; // The server-side script
var url7 = "Scripts/receberemail.php?nome="; // The server-side script
var url8 = "Scripts/mostramenu.php";
var url9 = "Scripts/sessionfacebook.php?logfacebook="; // The server-side script

var inicio="";
var iniciocategoria="";
var divvotar ="";
function handleHttpResponse() {   
if (http.readyState == 4) {
	  if(http.status==200) {
		  var results=http.responseText;
		  	if (inicio=="envia") {
			  document.getElementById("EnviaAmigos").style.height="300px";
			  document.getElementById("EnviaAmigos").style.marginTop="-150px";			  
			  document.getElementById('EnviaAmigos').innerHTML = results;
			} else if (inicio=="mostrar") {			  
			  document.getElementById('EnviaAmigos').innerHTML = results;
			  document.forms['formEnviaAmigos'].elements['email'].focus();
			} else if (inicio=="votar") {			  
			  document.getElementById(divvotar).innerHTML = results;
			} else if (inicio=="recomendar") {
			  document.getElementById('recomenda').innerHTML = results;
			} else if (inicio=="mostracat") {			  
			  document.getElementById('mostracat').innerHTML = results;
			} else if (inicio=="mostramenu") {			  
			  document.getElementById('mostramenu').innerHTML = results;
			} else if (inicio=="mostramenudetalhes") {			  
			  document.getElementById('mostramenu').innerHTML = results;
              mostracat(iniciocategoria);
			}
	  	}
	  }
}

function sessionfacebook(logfacebook) {  
	inicio="nada";
	http.open("GET", url9 + escape(logfacebook) + "&t="+((new Date()).valueOf()), true);
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}

function contato() {  
	inicio="recomendar";

	var nomesugestao = document.getElementById("nomesugestao").value;
	var emailsugestao = document.getElementById("emailsugestao").value;
	var assuntosugestao = document.getElementById("assuntosugestao").value;
	var mensagemsugestao = document.getElementById("mensagemsugestao").value;
	
	http.open("GET", url6 + escape(nomesugestao) + "&emailsugestao=" + escape(emailsugestao) + "&assuntosugestao=" + escape(assuntosugestao) + "&mensagemsugestao=" + escape(mensagemsugestao) + "&t="+((new Date()).valueOf()), true);
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}

function mostracat(categoria) {  
	inicio="mostracat";
	document.getElementById('mostracat').innerHTML='<img src="Scripts/ajax-loader.gif" width="128" height="15" class="MostraCatDet" />';
	http.open("GET", url4 + escape(categoria), true); 
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}

function mostramenu(categoria) {  
	if (categoria==0){
		inicio="mostramenu";
    } else {
	    inicio="mostramenudetalhes";
        iniciocategoria=categoria;
    }
	document.getElementById('mostramenu').innerHTML='<p style="padding-bottom:500px"><img src="Scripts/ajax-loadermenu.gif" width="16" height="11" vspace="15"/></p>';
	http.open("GET", url8, true); 
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}

function receberemail() {  
	inicio="recomendar";

	var nome = document.getElementById("nome").value;
	var email= document.getElementById("email").value;
	http.open("GET", url7 + escape(nome) + "&email=" + escape(email) + "&t="+((new Date()).valueOf()), true);
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}

function enviaamigos() {  
	inicio="envia";
	var piada = document.forms['formEnviaAmigos'].elements['piada'].value;
	var email = document.forms['formEnviaAmigos'].elements['email'].value;
	var nome = document.forms['formEnviaAmigos'].elements['nome'].value;
	var mensagem = document.forms['formEnviaAmigos'].elements['mensagem'].value;

	var emailamigo1 = document.forms['formEnviaAmigos'].elements['emailamigo1'].value;
	var emailamigo2 = document.forms['formEnviaAmigos'].elements['emailamigo2'].value;
	var emailamigo3 = document.forms['formEnviaAmigos'].elements['emailamigo3'].value;
	var emailamigo4 = document.forms['formEnviaAmigos'].elements['emailamigo4'].value;
	var emailamigo5 = document.forms['formEnviaAmigos'].elements['emailamigo5'].value;
	var emailamigo6 = document.forms['formEnviaAmigos'].elements['emailamigo6'].value;
	var emailamigo7 = document.forms['formEnviaAmigos'].elements['emailamigo7'].value;
	var emailamigo8 = document.forms['formEnviaAmigos'].elements['emailamigo8'].value;
	var emailamigo9 = document.forms['formEnviaAmigos'].elements['emailamigo9'].value;
	var emailamigo10 = document.forms['formEnviaAmigos'].elements['emailamigo10'].value;

	
	
	http.open("GET", url1 + escape(piada) + "&email=" + escape(email) + "&nome=" + escape(nome) + "&mensagem=" + escape(mensagem) + "&emailamigo1=" + escape(emailamigo1) + "&emailamigo2=" + escape(emailamigo2) + "&emailamigo3=" + escape(emailamigo3) + "&emailamigo4=" + escape(emailamigo4) + "&emailamigo5=" + escape(emailamigo5) + "&emailamigo6=" + escape(emailamigo6) + "&emailamigo7=" + escape(emailamigo7) + "&emailamigo8=" + escape(emailamigo8) + "&emailamigo9=" + escape(emailamigo9) + "&emailamigo10=" + escape(emailamigo10) + "&t="+((new Date()).valueOf()), true);
	
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}

function mostrarenviaamigos(piada) {  
	inicio="mostrar";
	var numpiada = piada;
	var emailrecebido = document.forms['famigo'+numpiada].elements['txtemailamigo'].value;
	http.open("GET", url2 + escape(numpiada) + "&emailamigo1=" + escape(emailrecebido) + "&t="+((new Date()).valueOf()), true);
	
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}

function votar(piada,div) {  
	inicio="votar";
	divvotar = div;
	var numpiada = piada;
	
	document.getElementById(div).innerHTML='<a href="javascript:votar(,"'+div+'");"><img src="imagens/iconeVotar2.jpg" alt="Votar" width="14" height="15" hspace="3" align="absbottom" border="0" />A VOTAR...</a>';
	
	http.open("GET", url3 + escape(numpiada) + "&t="+((new Date()).valueOf()), true);
	
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
}

function getHTTPObject() {
  var xmlhttp;

  if(window.XMLHttpRequest){
    xmlhttp = new XMLHttpRequest();
  }
  else if (window.ActiveXObject){
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    if (!xmlhttp){
        xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
   
}
  return xmlhttp;

 
}
var http = getHTTPObject(); // We create the HTTP Object


/****************/

function initStatLyr() {
  // args: id, left, top, w, h, duration of glide to location onscroll, acceleration factor
  // acceleration factor should be -1 to 1. -1 is full deceleration
	var statLyr = new Glider("glideDiv",595,30,null,null,300,-1);
  statLyr.show();
}
 
// torna o fundo cinzento para CONTACTO, SUGERIR ANEDOTA, PARTICIPE
function grayOut3(vis, options, bg, titulo, nome, email)   
     {  
     var optionsoptions = options || {};    
     var zindex = options.zindex || 55;   
     var opacity = options.opacity || 70;  
     var opaque = (opacity / 100);   
     var bgcolor = options.bgcolor || bg;   
     var dark=document.getElementById('darkenScreenObject');  
    if (!dark)   
    {  
     // The dark layer doesn't exist, it's never been created.  So we'll    
     // create it here and apply some basic styles.     
     var tbody = document.getElementsByTagName("body")[0];  
     var tnode = document.createElement('div');             
     tnode.style.position='absolute';  
     tnode.style.top='0px';  
     tnode.style.left='0px';     
     tnode.style.overflow='hidden';  
     tnode.style.display='none';  
     tnode.id='darkenScreenObject';  
     tbody.appendChild(tnode);                              
     dark=document.getElementById('darkenScreenObject');    
     }    
 
    if (vis)  
     {   
	 if (titulo!='Participe') {
	 novotexto='<form id="formcontato" name="formrecomenda" method="post" action=""><div style="width:400px; height:25px; text-align:right"><a href="#" onclick="grayOut3(false, \'\'); return false"><img src="images/fechar.jpg" width="12" height="12" border="0" /></a></div>  <table width="400" border="0" cellspacing="5" cellpadding="0" style="margin-left:10px"><tr><td height="30" colspan="2" align="left" valign="top"><h2 style="float:left; padding-top:0px; margin-top:0px;"><u>'+titulo+'</u>:</h2></td></tr><tr>  <td align="right" valign="middle" ><p style="padding:0px; margin:0px;">Nome:</p></td><td align="left"><input name="nomesugestao" type="text" class="txtrecomenda" id="nomesugestao" value="'+nome+'" /></td></tr><tr><td align="right" ><p style="padding:0px; margin:0px;">E-mail:</p></td><td align="left"><input name="emailsugestao" type="text" class="txtrecomenda" id="emailsugestao" value="'+email+'" /></td></tr><tr><td align="right" ><p style="padding:0px; margin:0px;">Assunto:</p></td><td align="left"><input name="assuntosugestao" type="text" class="txtrecomenda" id="assuntosugestao" /></td></tr><tr><td align="right" valign="top" ><p style="padding:0px; margin:0px;">Mensagem:</p></td><td align="left"><textarea name="mensagemsugestao" cols="20" rows="5" class="txtrecomenda" id="mensagemsugestao"></textarea></td></tr><tr><td align="left"></td><td height="30" align="left"><input name="button" type="button"  id="button" onclick="contato();" value="Enviar!" class="txtrecomenda"/></td></tr></table></form>';
	 }else{
	 novotexto='<form id="formcontato" name="formrecomenda" method="post" action=""><div style="width:400px; height:25px; text-align:right"><a href="#" onclick="grayOut3(false, \'\'); return false"><img src="images/fechar.jpg" width="12" height="12" border="0" /></a></div>  <table width="400" border="0" cellspacing="5" cellpadding="0" style="margin-left:10px"><tr><td height="30" colspan="2" align="left" valign="top"><h2 style="float:left; padding-top:0px; margin-top:0px;"><u>'+titulo+'</u>:</h2></td></tr><tr>  <td align="right" valign="middle" ><p style="padding:0px; margin:0px;">Nome:</p></td><td align="left"><input name="nomesugestao" type="text" class="txtrecomenda" id="nomesugestao" value="'+nome+'" /></td></tr><tr><td align="right" ><p style="padding:0px; margin:0px;">E-mail:</p></td><td align="left"><input name="emailsugestao" type="text" class="txtrecomenda" id="emailsugestao" value="'+email+'" /></td></tr><tr><td align="right" valign="top" ><p style="padding:0px; margin:0px;">Mensagem:</p></td><td align="left"><textarea name="mensagemsugestao" cols="20" rows="5" class="txtrecomenda" id="mensagemsugestao"></textarea></td></tr><tr><td align="left"></td><td height="30" align="left"><input name="button" type="button"  id="button" onclick="contato();" value="Enviar!" class="txtrecomenda"/><input name="assuntosugestao" type="hidden" class="txtrecomenda" id="assuntosugestao" value = "Definição de Humor"/></td></tr></table></form>';		 
	 }

	 document.getElementById('recomenda2').innerHTML='<div id=recomenda>'+novotexto+'</div>';
      var pageWidth='100%';   
      var pageHeight='100%';   
     dark.style.opacity=opaque;   
     dark.style.MozOpacity=opaque;         
     dark.style.filter='alpha(opacity='+opacity+')';   
     dark.style.zIndex=zindex;  
     dark.style.backgroundColor=bgcolor;   
     dark.style.width= pageWidth;    
     dark.style.height= pageHeight;   
     dark.style.display='block';    
       }  
     else  
     {     
	   document.getElementById("recomenda").style.display="none";
      dark.style.display='none';   
     }  
 }  

// torna o fundo cinzento para Receber Email
function grayOutReceberEmail(vis, options, bg, nomesessao, emailsessao)   
     {  
     var optionsoptions = options || {};    
     var zindex = options.zindex || 55;   
     var opacity = options.opacity || 70;  
     var opaque = (opacity / 100);   
     var bgcolor = options.bgcolor || bg;   
     var dark=document.getElementById('darkenScreenObject');  
    if (!dark)   
    {  
     // The dark layer doesn't exist, it's never been created.  So we'll    
     // create it here and apply some basic styles.     
     var tbody = document.getElementsByTagName("body")[0];  
     var tnode = document.createElement('div');             
     tnode.style.position='absolute';  
     tnode.style.top='0px';  
     tnode.style.left='0px';     
     tnode.style.overflow='hidden';  
     tnode.style.display='none';  
     tnode.id='darkenScreenObject';  
     tbody.appendChild(tnode);                              
     dark=document.getElementById('darkenScreenObject');    
     }    
 
    if (vis)  
     {   
	 //novotexto='<form id="formcontato" name="formrecomenda" method="post" action=""><div style="width:400px; height:25px; text-align:right"><a href="#" onclick="grayOut3(false, \'\'); return false"><img src="images/fechar.jpg" width="12" height="12" border="0" /></a></div>  <table width="400" border="0" cellspacing="5" cellpadding="0" style="margin-left:10px"><tr><td height="30" colspan="2" align="left" valign="top"><div style="float:left;"><strong><u>Contato</u>:</strong></div></td></tr><tr>  <td align="right" valign="middle" >Nome:</td><td align="left"><input name="nomesugestao" type="text" class="txtrecomenda" id="nomesugestao" /></td></tr><tr><td align="right" >E-mail: </td><td align="left"><input name="emailsugestao" type="text" class="txtrecomenda" id="emailsugestao" /></td></tr><tr><td align="right" >Assunto: </td><td align="left"><input name="assuntosugestao" type="text" class="txtrecomenda" id="assuntosugestao" /></td></tr><tr><td align="right" valign="top" >Mensagem: </td><td align="left"><textarea name="mensagemsugestao" cols="20" rows="5" class="txtrecomenda" id="mensagemsugestao"></textarea></td></tr><tr><td align="left"></td><td height="30" align="left"><input name="button" type="button"  id="button" onclick="contato();" value="Enviar!" class="txtrecomenda"/></td></tr></table></form>';

	 novotexto='<form id="formreceberemail" name="formreceberemail" method="post" action=""><div style="width:400px; height:25px; text-align:right"><a href="#" onclick="grayOutReceberEmail(false, \'\'); return false"><img src="images/fechar.jpg" width="12" height="12" border="0" /></a></div>  <table border="0" cellspacing="5" cellpadding="0" align=center><tr><td height="30" colspan="2" align="left" valign="top"><div style="float:left;"><h2>Recebe Anedotas Fantásticas, Grátis!</h2></div></td></tr><tr><td colspan=2>&nbsp;</td></tr><tr>  <td align="right" valign="middle" ><p style="margin:0px; padding:0px">Nome:</p></td><td align="left"><input name="nome" type="text" class="txtrecomenda" id="nome" value="'+nomesessao+'" /></td></tr><tr><td align="right" ><p style="margin:0px; padding:0px">E-mail: </p></td><td align="left"><input name="email="text" class="txtrecomenda" id="email" value="'+emailsessao+'" /></td></tr><tr><td colspan=2>&nbsp;</td></tr><tr><td align="left"></td><td height="30" align="left"><input name="button" type="button"  id="button" onclick="receberemail();" value="Enviar!" class="txtrecomenda"/></td></tr></table></form>';


	 document.getElementById('recomenda2').innerHTML='<div id=recomenda>'+novotexto+'</div>';
      var pageWidth='100%';   
      var pageHeight='100%';   
     dark.style.opacity=opaque;   
     dark.style.MozOpacity=opaque;         
     dark.style.filter='alpha(opacity='+opacity+')';   
     dark.style.zIndex=zindex;  
     dark.style.backgroundColor=bgcolor;   
     dark.style.width= pageWidth;    
     dark.style.height= pageHeight;   
     dark.style.display='block';    
       }  
     else  
     {     
	   document.getElementById("recomenda").style.display="none";
      dark.style.display='none';   
     }  
 }  

function grayOut(vis, options, bg)   
     {  
     var optionsoptions = options || {};    
     var zindex = options.zindex || 55;   
     var opacity = options.opacity || 50;  
     var opaque = (opacity / 100);   
     var bgcolor = options.bgcolor || bg;   
     var dark=document.getElementById('darkenScreenObject');  
    if (!dark)   
    {  
     // The dark layer doesn't exist, it's never been created.  So we'll    
     // create it here and apply some basic styles.     
     var tbody = document.getElementsByTagName("body")[0];  
     var tnode = document.createElement('div');             
     tnode.style.position='absolute';  
     tnode.style.top='0px';  
     tnode.style.left='0px';     
     tnode.style.overflow='hidden';  
     tnode.style.display='none';  
     tnode.id='darkenScreenObject';  
     tbody.appendChild(tnode);                              
     dark=document.getElementById('darkenScreenObject');    
     }    
 
    if (vis)  
     {   
	 novotexto='TEXTO';
	 document.getElementById("EnviaAmigos").style.height="515px";
	 document.getElementById("EnviaAmigos").style.marginTop="-265px";
	 document.getElementById("EnviaAmigos").style.visibility="visible";
	 document.getElementById('EnviaAmigos').innerHTML='';
     var pageWidth='100%';   
     var pageHeight='300%';   
     dark.style.opacity=opaque;   
     dark.style.MozOpacity=opaque;   
	 dark.style.filter='alpha(opacity='+opacity+')';
     dark.style.zIndex=zindex;  
     dark.style.backgroundColor=bgcolor;   
     dark.style.width= pageWidth;    
     dark.style.height= pageHeight;   
     dark.style.display='block';      
       }  
     else  
     {     
	   document.getElementById("EnviaAmigos").style.visibility="hidden";
      dark.style.display='none';   
     }  
 }  
 
function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

function imprimir(anedota){
	alert(anedota);
}
function changeColor(color, ID) {
	document.getElementById(ID).bgColor = "#" + color;
}
function MostraLimite(ID) {
	document.getElementById(ID).style.borderTopColor='#CC3300';
	document.getElementById(ID).style.borderBottomColor='#CC3300';
	document.getElementById(ID).style.borderRightStyle='none';
}
function TiraLimite(ID) {
	document.getElementById(ID).style.borderTopColor='#FFFFCC';
	document.getElementById(ID).style.borderBottomColor='#FFFFCC';
	document.getElementById(ID).style.borderRightStyle='ridge';
}
function EnviarAmigo(codigoanedota, emailamigo){
	window.open('enviaramigo.php?codanedota='+codigoanedota+'&enviaremailamigo='+emailamigo, 'Imprimir', 'scrollbars=1,width=600,height=500');	
}
function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_validateForm() { //v4.0
  var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
  for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
    if (val) { nm=val.name; if ((val=val.value)!="") {
      if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
        if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';
      } else if (test!='R') { num = parseFloat(val);
        if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';
        if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
          min=test.substring(8,p); max=test.substring(p+1);
          if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
    } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; }
  } if (errors) alert('The following error(s) occurred:\n'+errors);
  document.MM_returnValue = (errors == '');
}
function MM_callJS(jsStr) { //v2.0
  return eval(jsStr)
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
MM_preloadImages('imagens/btnAnterior_over.png','imagens/btnSeguinte_over.png');
shortcut = {
	'all_shortcuts':{},//All the shortcuts are stored in this array
	'add': function(shortcut_combination,callback,opt) {
		//Provide a set of default options
		var default_options = {
			'type':'keydown',
			'propagate':false,
			'disable_in_input':false,
			'target':document,
			'keycode':false
		}
		if(!opt) opt = default_options;
		else {
			for(var dfo in default_options) {
				if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
			}
		}

		var ele = opt.target;
		if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
		var ths = this;
		shortcut_combination = shortcut_combination.toLowerCase();

		//The function to be called at keypress
		var func = function(e) {
			e = e || window.event;
			
			if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
				var element;
				if(e.target) element=e.target;
				else if(e.srcElement) element=e.srcElement;
				if(element.nodeType==3) element=element.parentNode;

				if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
			}
	
			//Find Which key is pressed
			if (e.keyCode) code = e.keyCode;
			else if (e.which) code = e.which;
			var character = String.fromCharCode(code).toLowerCase();
			
			if(code == 188) character=","; //If the user presses , when the type is onkeydown
			if(code == 190) character="."; //If the user presses , when the type is onkeydown

			var keys = shortcut_combination.split("+");
			//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
			var kp = 0;
			
			//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
			var shift_nums = {
				"`":"~",
				"1":"!",
				"2":"@",
				"3":"#",
				"4":"$",
				"5":"%",
				"6":"^",
				"7":"&",
				"8":"*",
				"9":"(",
				"0":")",
				"-":"_",
				"=":"+",
				";":":",
				"'":"\"",
				",":"<",
				".":">",
				"/":"?",
				"\\":"|"
			}
			//Special Keys - and their codes
			var special_keys = {
				'esc':27,
				'escape':27,
				'tab':9,
				'space':32,
				'return':13,
				'enter':13,
				'backspace':8,
	
				'scrolllock':145,
				'scroll_lock':145,
				'scroll':145,
				'capslock':20,
				'caps_lock':20,
				'caps':20,
				'numlock':144,
				'num_lock':144,
				'num':144,
				
				'pause':19,
				'break':19,
				
				'insert':45,
				'home':36,
				'delete':46,
				'end':35,
				
				'pageup':33,
				'page_up':33,
				'pu':33,
	
				'pagedown':34,
				'page_down':34,
				'pd':34,
	
				'left':37,
				'up':38,
				'right':39,
				'down':40,
	
				'f1':112,
				'f2':113,
				'f3':114,
				'f4':115,
				'f5':116,
				'f6':117,
				'f7':118,
				'f8':119,
				'f9':120,
				'f10':121,
				'f11':122,
				'f12':123
			}
	
			var modifiers = { 
				shift: { wanted:false, pressed:false},
				ctrl : { wanted:false, pressed:false},
				alt  : { wanted:false, pressed:false},
				meta : { wanted:false, pressed:false}	//Meta is Mac specific
			};
                        
			if(e.ctrlKey)	modifiers.ctrl.pressed = true;
			if(e.shiftKey)	modifiers.shift.pressed = true;
			if(e.altKey)	modifiers.alt.pressed = true;
			if(e.metaKey)   modifiers.meta.pressed = true;
                        
			for(var i=0; k=keys[i],i<keys.length; i++) {
				//Modifiers
				if(k == 'ctrl' || k == 'control') {
					kp++;
					modifiers.ctrl.wanted = true;

				} else if(k == 'shift') {
					kp++;
					modifiers.shift.wanted = true;

				} else if(k == 'alt') {
					kp++;
					modifiers.alt.wanted = true;
				} else if(k == 'meta') {
					kp++;
					modifiers.meta.wanted = true;
				} else if(k.length > 1) { //If it is a special key
					if(special_keys[k] == code) kp++;
					
				} else if(opt['keycode']) {
					if(opt['keycode'] == code) kp++;

				} else { //The special keys did not match
					if(character == k) kp++;
					else {
						if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
							character = shift_nums[character]; 
							if(character == k) kp++;
						}
					}
				}
			}
			
			if(kp == keys.length && 
						modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
						modifiers.shift.pressed == modifiers.shift.wanted &&
						modifiers.alt.pressed == modifiers.alt.wanted &&
						modifiers.meta.pressed == modifiers.meta.wanted) {
				callback(e);
	
				if(!opt['propagate']) { //Stop the event
					//e.cancelBubble is supported by IE - this will kill the bubbling process.
					e.cancelBubble = true;
					e.returnValue = false;
	
					//e.stopPropagation works in Firefox.
					if (e.stopPropagation) {
						e.stopPropagation();
						e.preventDefault();
					}
					return false;
				}
			}
		}
		this.all_shortcuts[shortcut_combination] = {
			'callback':func, 
			'target':ele, 
			'event': opt['type']
		};
		//Attach the function with the event
		if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
		else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
		else ele['on'+opt['type']] = func;
	},

	//Remove the shortcut - just specify the shortcut and I will remove the binding
	'remove':function(shortcut_combination) {
		shortcut_combination = shortcut_combination.toLowerCase();
		var binding = this.all_shortcuts[shortcut_combination];
		delete(this.all_shortcuts[shortcut_combination])
		if(!binding) return;
		var type = binding['event'];
		var ele = binding['target'];
		var callback = binding['callback'];

		if(ele.detachEvent) ele.detachEvent('on'+type, callback);
		else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
		else ele['on'+type] = false;
	}
}
