Jump to content

Jquery+PHP+MySQL incompatível com IE


xsnake75
 Share

Recommended Posts

[Ajuda] - JQuery+PHP+MySQL

Boas

Tenho um form com 5 selects que vão à bd buscar valores dependendo do valor da anterior select. acontece que o JQuery funciona no Chrome e no Fiferox mas nao funciona no IE (seja qual for a versão).

Tenho a certeza que a conexão e as querys estão correctamente feitas

Coloco aqui os códigos

main.php

Código:

<div style="position:static;">
<?php
if(isset($_SESSION['user'])){
require "./php/connect.php";	
$DataM=date('d-m-Y');
$hora=date('H:i:s');
?>
<link rel="stylesheet" type="text/css" href="./css/altpass.css"/>
<link type="text/css" href="./js/jquery/css/redmond/jquery-ui-1.8.18.custom.css" rel="stylesheet" />	
<script type="text/javascript" src="./js/jquery/js/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="./js/jquery/js/jquery-ui-1.8.18.custom.min.js"></script>
<script type="text/javascript" src="./js/jquery/js/jquery_pt.js"></script>
<script type="text/javascript" language="Javascript">
function form_check(){
   if( document.reg.nic.value!='' && document.reg.n1.value!='' && document.reg.n2.value!='' ) {
      //--------------------------------------------------------------------
      var numero = document.reg.nic.value;
      if(isNaN(numero)){
         alert('NIC so aceita digitos!');
         field.focus();
	 return false;
      }
      else{
         if(document.reg.nic.value.length<10){
            alert('O NIC necessita de 10 digitos!');
            return false;
         }
      }
      //--------------------------------------------------------------------
      if(document.reg.n1.value=='0'){
         alert('É necessário indicar uma classificação!');
         return false;
      }
      //--------------------------------------------------------------------
      if(document.reg.n2.value==''){
         alert('É necessário indicar uma classificação! ');
         return false;
      }
      //--------------------------------------------------------------------
      var x = confirm('Pretende registar a chamada?');
      if(x == true){
	document.reg.submit();
        return true;
      }
      else{
         return false;
      }
   }
   else{
      alert('É necessário preencher todos os campos!');
      return false;
}
}
</script>

<h2>Registo de Chamadas</h2>
<br>
<span>Versão 3</span>

<?php require "./regcallv3/select.class.php"; ?>
<form method="post" id="reg" name="reg" onsubmit="return form_check();" action="./php/insertcall.php">
<table width="50%" border="0">
<hr>
	<tr>

		<script type="text/javascript" src="./regcallv3/script.js"></script>
		<th>Tipificação:</th>
		<td>
			<select id="n1" name="n1">
				<?php echo $opt->n1();?>
			</select>
		</td>
		<th>CallCenter:</th>
		<td>
			<select id="cc" name="cc">
			<?php
				if($_SESSION['team']!="Recursos Técnicos"){
					$achacc=mysql_query("SELECT callcenter.id,callcenter.callcenter FROM callcenter INNER JOIN team ON callcenter.id=team.callcenter_id WHERE team.nometeam='".$_SESSION['team']."'");
					while($row=mysql_fetch_row($achacc)){
						echo "<option value='".$row[0]."' selected disabled='disabled'>".$row[1]."</option>";
					}
				}else{
					echo "<option></option>";
					$listacc=mysql_query("SELECT * FROM callcenter order by callcenter");
					while($row=mysql_fetch_assoc($listacc)){
						echo "<option value='".$row['id']."'>".$row['callcenter']."</option>";
					}
				}
			?>
			</select>
		</td>
	</tr>
	<tr>
		<td> </td>
		<td><select id="n2" name="n2"></select></td>
		<th>NIC:</th>
		<td><input type="text" id="nic" name="nic" maxlength="10"/></td>
	</tr>
	<tr>
		<td> </td>
		<td><select id="n3" name="n3"></select></td>
		<th>Username:</th>
		<td><?php echo $_SESSION['nome'];?></td>
	</tr>
	<tr>
		<td> </td>
		<td><select id="n4" name="n4"></select></td>
		<th>Data:</th>
		<td><?php echo "$DataM";?></td>
	</tr>
	<tr>
		<td> </td>
		<td><select id="n5" name="n5"></select></td>
		<th>Hora:</th>
		<td><?php echo "$hora";?></td>
	</tr>
	<tr>
		<td colspan="4"><div onclick="ntc=false;return form_check();" class="btn1"> Registar Chamada </div></td>
	</tr>
</table>
</form>
<?php
}else{
header("Location: ./php/logout.php");
}
?>
</div>
[/code=javascript]
script.js [JQUERY]
Código:
[code]
$(document).ready(function(){
    $("select#n2").attr("disabled","disabled");
    $("select#n3").attr("disabled","disabled");
    $("select#n4").attr("disabled","disabled");
    $("select#n5").attr("disabled","disabled");
    
    $("select#n1").change(function(){
        $("select#n2").attr("disabled","disabled");
        $("select#n3").attr("disabled","disabled");
        $("select#n4").attr("disabled","disabled");
        $("select#n5").attr("disabled","disabled");
        
        $("select#n2").html("<option>wait...</option>");
        $("select#n3").html("<option></option>");
        $("select#n4").html("<option></option>");
        $("select#n5").html("<option></option>");
        
        var id = $("select#n1 option:selected").attr('value');
        $.post("./regcallv3/n2.php", {id:id}, function(data){
            $("select#n2").removeAttr("disabled");
            $("select#n2").html(data);
        });
    });
    $("select#n2").change(function(){
        $("select#n3").attr("disabled","disabled");
        $("select#n4").attr("disabled","disabled");
        $("select#n5").attr("disabled","disabled");
        
        $("select#n3").html("<option>wait...</option>");
        $("select#n4").html("<option></option>");
        $("select#n5").html("<option></option>");
        
        var id = $("select#n2 option:selected").attr('value');
        $.post("./regcallv3/n3.php", {id:id}, function(data){
            $("select#n3").removeAttr("disabled");
            $("select#n3").html(data);
        });
    });
    $("select#n3").change(function(){
        $("select#n4").attr("disabled","disabled");
        $("select#n5").attr("disabled","disabled");
        
        $("select#n4").html("<option>wait...</option>");
        $("select#n5").html("<option></option>");
        
        var id = $("select#n3 option:selected").attr('value');
        $.post("./regcallv3/n4.php", {id:id}, function(data){
            $("select#n4").removeAttr("disabled");
            $("select#n4").html(data);
        });
    });
    $("select#n4").change(function(){
        $("select#n5").attr("disabled","disabled");
        $("select#n5").html("<option>wait...</option>");
        var id = $("select#n4 option:selected").attr('value');
        $.post("./regcallv3/n5.php", {id:id}, function(data){
            $("select#n5").removeAttr("disabled");
            $("select#n5").html(data);
        });
    });
});

select.class.php

PHP Code:

<?php class MakeTipificacao{
    protected $conn;
         public function __construct(){
            $this->DbConnect();
        }
         protected function DbConnect(){
            $host="localhost";
            $user="root";
            $password=null;
            $db="sisap";
            $this->conn = mysql_connect($host,$user,$password) OR die("Unable to connect to the database");
            mysql_select_db($db,$this->conn) OR die("can not select the database $db");
            return TRUE;
        }
         public function callcenter(){
            $sql = "SELECT * FROM callcenter order by callcenter";
            $res = mysql_query($sql,$this->conn);
            $cc = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $cc .= '<option value="' . $row['id'] . '">' . $row['callcenter'] . '</option>';
            }
            return $cc;
        } 
               public function n1(){
            $sql = "SELECT * FROM regcall_nivel1 order by class";
            $res = mysql_query($sql,$this->conn);
            $n1 = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $n1 .= '<option value="' . $row['id'] . '">' . $row['class'] . '</option>';
            }
            return $n1;
        }
         public function n2(){
            $sql = "SELECT * FROM regcall_nivel2 WHERE id_reg1=".$_POST['id'];
            $res = mysql_query($sql,$this->conn);
            $n2 = '<option></option>';
            $n2.=$sql;
            while($row = mysql_fetch_array($res)){
                $n2 .= '<option value="' . $row[0] . '">' . $row['class'] . '</option>';
            }
            return $n2;
        }
                public function n3(){
            $sql = "SELECT * FROM regcall_nivel3 WHERE id_reg2=$_POST[id]";
            $res = mysql_query($sql,$this->conn) or die (mysql_error);
            $n3 = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $n3 .= '<option value="' . $row['id'] . '">' . $row['class'] . '</option>';
            }
            return $n3; 
       } 
               public function n4(){
            $sql = "SELECT * FROM regcall_nivel4 WHERE id_reg3=".$_POST['id'];
            $res = mysql_query($sql,$this->conn);
            $n4 = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $n4 .= '<option value="' . $row['id'] . '">' . $row['class'] . '</option>';
            }
            return $n4;
        }
        public function n5(){
            $sql = "SELECT * FROM regcall_nivel5 WHERE id_reg4=".$_POST['id'];
            $res = mysql_query($sql,$this->conn);
            $n5 = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $n5 .= '<option value="' . $row['id'] . '">' . $row['class'] . '</option>';
            }
            return $n5;
        }
}
$opt = new MakeTipificacao();?>

Tenho ainda outro php para cada select... Eis um exemplo:

n2.php

PHP Code:

<?php require "./select.class.php";echo $opt->n2(); ?>

Podem ajudar?

Link to comment
Share on other sites

<table width="50%" border="0">
        <hr>
                <tr>

                        <script type="text/javascript" src="./regcallv3/script.js"></script>
                        <th>Tipificação:</th>
                        <td>

Vi até aqui, e nem vi mais. Esta estrutura não é válida e a DOM vai depender muito do que é que o browser tentar resolver dessa salganhada. Já tens sorte que o JS funcione nalguns...

Corrige a estrutura para estrutura válida e, se continuar sem funcionar, então volta cá.

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

obrigado desde já pelo alerta !😞

Já corrigi mas mesmo assim continua a dar o erro  :wallbash:

descobri no PHP que o valor do jquery que vai para post desaparece sem razão, e como consequência, o php nao vizualiza a variável 😞(

Mais alguma sugestão que me possam ajudar? 😄

Link to comment
Share on other sites

descobri no PHP que o valor do jquery que vai para post desaparece sem razão

Mais alguma sugestão que me possam ajudar? 😄

A estrutura continua inválida. É a única razão para essas coisas acontecerem num browser e não noutro.

"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Link to comment
Share on other sites

A estrutura continua inválida. É a única razão para essas coisas acontecerem num browser e não noutro.

Dizes então que é apenas uma questão de html?

Estranho porque nao há muito tempo isto funcionava... e há que realçar que não alterei uma linha de código  😄

Link to comment
Share on other sites

Eu tentei não só fazer o q o mjamado

Eu tb tentei perceber o próprio código js. Se bem q te diga... Sem cores n vou a lado algum, isso está perto (ou é) spagetti code e código repetitivo, mesmo muito (demasiado) repetitivo..

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to comment
Share on other sites

Ok... coloco aqui o codigo de novo mas com cores desta vez 😞

<div style="position:static;">
<?php
if(isset($_SESSION['user'])){
        require "./php/connect.php";        
        $DataM=date('d-m-Y');
        $hora=date('H:i:s');
?>
<link rel="stylesheet" type="text/css" href="./css/altpass.css"/>
<link type="text/css" href="./js/jquery/css/redmond/jquery-ui-1.8.18.custom.css" rel="stylesheet" />        
<script type="text/javascript" src="./js/jquery/js/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="./js/jquery/js/jquery-ui-1.8.18.custom.min.js"></script>
<script type="text/javascript" src="./js/jquery/js/jquery_pt.js"></script>
<script type="text/javascript" language="Javascript">
function form_check(){
   if( document.reg.nic.value!='' && document.reg.n1.value!='' && document.reg.n2.value!='' ) {
      //--------------------------------------------------------------------
      var numero = document.reg.nic.value;
      if(isNaN(numero)){
         alert('NIC so aceita digitos!');
         field.focus();
                 return false;
      }
      else{
         if(document.reg.nic.value.length<10){
            alert('O NIC necessita de 10 digitos!');
            return false;
         }
      }
      //--------------------------------------------------------------------
      if(document.reg.n1.value=='0'){
         alert('É necessário indicar uma classificação!');
         return false;
      }
      //--------------------------------------------------------------------
      if(document.reg.n2.value==''){
         alert('É necessário indicar uma classificação! ');
         return false;
      }
      //--------------------------------------------------------------------
      var x = confirm('Pretende registar a chamada?');
      if(x == true){
                document.reg.submit();
        return true;
      }
      else{
         return false;
      }
   }
   else{
      alert('É necessário preencher todos os campos!');
      return false;
        }
}
</script>

<h2>Registo de Chamadas</h2>
<br>
<span>Versão 3</span>

<?php require "./regcallv3/select.class.php"; ?>
<form method="post" id="reg" name="reg" onsubmit="return form_check();" action="./php/insertcall.php">
        <table width="50%" border="0">
        <hr>
                <tr>

                        <script type="text/javascript" src="./regcallv3/script.js"></script>
                        <th>Tipificação:</th>
                        <td>
                                <select id="n1" name="n1">
                                        <?php echo $opt->n1();?>
                                </select>
                        </td>
                        <th>CallCenter:</th>
                        <td>
                                <select id="cc" name="cc">
                                <?php
                                        if($_SESSION['team']!="Recursos Técnicos"){
                                                $achacc=mysql_query("SELECT callcenter.id,callcenter.callcenter FROM callcenter INNER JOIN team ON callcenter.id=team.callcenter_id WHERE team.nometeam='".$_SESSION['team']."'");
                                                while($row=mysql_fetch_row($achacc)){
                                                        echo "<option value='".$row[0]."' selected disabled='disabled'>".$row[1]."</option>";
                                                }
                                        }else{
                                                echo "<option></option>";
                                                $listacc=mysql_query("SELECT * FROM callcenter order by callcenter");
                                                while($row=mysql_fetch_assoc($listacc)){
                                                        echo "<option value='".$row['id']."'>".$row['callcenter']."</option>";
                                                }
                                        }
                                ?>
                                </select>
                        </td>
                </tr>
                <tr>
                        <td> </td>
                        <td><select id="n2" name="n2"></select></td>
                        <th>NIC:</th>
                        <td><input type="text" id="nic" name="nic" maxlength="10"/></td>
                </tr>
                <tr>
                        <td> </td>
                        <td><select id="n3" name="n3"></select></td>
                        <th>Username:</th>
                        <td><?php echo $_SESSION['nome'];?></td>
                </tr>
                <tr>
                        <td> </td>
                        <td><select id="n4" name="n4"></select></td>
                        <th>Data:</th>
                        <td><?php echo "$DataM";?></td>
                </tr>
                <tr>
                        <td> </td>
                        <td><select id="n5" name="n5"></select></td>
                        <th>Hora:</th>
                        <td><?php echo "$hora";?></td>
                </tr>
                <tr>
                        <td colspan="4"><div onclick="ntc=false;return form_check();" class="btn1"> Registar Chamada </div></td>
                </tr>
        </table>
</form>
<?php
}else{
        header("Location: ./php/logout.php");
}
?>
</div>

PHP class:

<?php class MakeTipificacao{
    protected $conn;
         public function __construct(){
            $this->DbConnect();
        }
         protected function DbConnect(){
            $host="localhost";
            $user="root";
            $password=null;
            $db="sisap";
            $this->conn = mysql_connect($host,$user,$password) OR die("Unable to connect to the database");
            mysql_select_db($db,$this->conn) OR die("can not select the database $db");
            return TRUE;
        }
         public function callcenter(){
            $sql = "SELECT * FROM callcenter order by callcenter";
            $res = mysql_query($sql,$this->conn);
            $cc = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $cc .= '<option value="' . $row['id'] . '">' . $row['callcenter'] . '</option>';
            }
            return $cc;
        } 
               public function n1(){
            $sql = "SELECT * FROM regcall_nivel1 order by class";
            $res = mysql_query($sql,$this->conn);
            $n1 = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $n1 .= '<option value="' . $row['id'] . '">' . $row['class'] . '</option>';
            }
            return $n1;
        }
         public function n2(){
            $sql = "SELECT * FROM regcall_nivel2 WHERE id_reg1=".$_POST['id'];
            $res = mysql_query($sql,$this->conn);
            $n2 = '<option></option>';
            $n2.=$sql;
            while($row = mysql_fetch_array($res)){
                $n2 .= '<option value="' . $row[0] . '">' . $row['class'] . '</option>';
            }
            return $n2;
        }
                public function n3(){
            $sql = "SELECT * FROM regcall_nivel3 WHERE id_reg2=$_POST[id]";
            $res = mysql_query($sql,$this->conn) or die (mysql_error);
            $n3 = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $n3 .= '<option value="' . $row['id'] . '">' . $row['class'] . '</option>';
            }
            return $n3; 
       } 
               public function n4(){
            $sql = "SELECT * FROM regcall_nivel4 WHERE id_reg3=".$_POST['id'];
            $res = mysql_query($sql,$this->conn);
            $n4 = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $n4 .= '<option value="' . $row['id'] . '">' . $row['class'] . '</option>';
            }
            return $n4;
        }
        public function n5(){
            $sql = "SELECT * FROM regcall_nivel5 WHERE id_reg4=".$_POST['id'];
            $res = mysql_query($sql,$this->conn);
            $n5 = '<option></option>';
            while($row = mysql_fetch_array($res)){
                $n5 .= '<option value="' . $row['id'] . '">' . $row['class'] . '</option>';
            }
            return $n5;
        }
}
$opt = new MakeTipificacao();?>

JS

$(document).ready(function(){
    $("select#n2").attr("disabled","disabled");
    $("select#n3").attr("disabled","disabled");
    $("select#n4").attr("disabled","disabled");
    $("select#n5").attr("disabled","disabled");
    
    $("select#n1").change(function(){
        $("select#n2").attr("disabled","disabled");
        $("select#n3").attr("disabled","disabled");
        $("select#n4").attr("disabled","disabled");
        $("select#n5").attr("disabled","disabled");
        
        $("select#n2").html("<option>wait...</option>");
        $("select#n3").html("<option></option>");
        $("select#n4").html("<option></option>");
        $("select#n5").html("<option></option>");
        
        var id = $("select#n1 option:selected").attr('value');
        $.post("./regcallv3/n2.php", {id:id}, function(data){
            $("select#n2").removeAttr("disabled");
            $("select#n2").html(data);
        });
    });
    $("select#n2").change(function(){
        $("select#n3").attr("disabled","disabled");
        $("select#n4").attr("disabled","disabled");
        $("select#n5").attr("disabled","disabled");
        
        $("select#n3").html("<option>wait...</option>");
        $("select#n4").html("<option></option>");
        $("select#n5").html("<option></option>");
        
        var id = $("select#n2 option:selected").attr('value');
        $.post("./regcallv3/n3.php", {id:id}, function(data){
            $("select#n3").removeAttr("disabled");
            $("select#n3").html(data);
        });
    });
    $("select#n3").change(function(){
        $("select#n4").attr("disabled","disabled");
        $("select#n5").attr("disabled","disabled");
        
        $("select#n4").html("<option>wait...</option>");
        $("select#n5").html("<option></option>");
        
        var id = $("select#n3 option:selected").attr('value');
        $.post("./regcallv3/n4.php", {id:id}, function(data){
            $("select#n4").removeAttr("disabled");
            $("select#n4").html(data);
        });
    });
    $("select#n4").change(function(){
        $("select#n5").attr("disabled","disabled");
        $("select#n5").html("<option>wait...</option>");
        var id = $("select#n4 option:selected").attr('value');
        $.post("./regcallv3/n5.php", {id:id}, function(data){
            $("select#n5").removeAttr("disabled");
            $("select#n5").html(data);
        });
    });
});

Obrigado desde já para a disponibilidade 😄

Link to comment
Share on other sites

o erro de estrutura do hr e do script dentro da tabela está removido... o que pretendia saber, se possivel, é se existe mais algum erro para alem desses :S

gostava tambem de ter alguma ajuda visto que nao sou grande frequentador deste tipo de scripts... alem de que estou pela primeira vez a trabalhar com jquery :S

ando ja a bater com a cabeça nas paredes e já ando pelos caminhos dos headers e tudo

:wallbash:

Link to comment
Share on other sites

Bem então o que está a acontecer é que não está a preencher o select com as opções devolvidas no $.post.

podes sempre tentar usar o método append() em vez do html():

em vez de :

$("select#n2").html(data);

usar:

$("select#n2").append(data);

Se isto não funcionar diria que pode ter a ver com caracteres estranhos nas opções que vais buscar, como tabs, enters etc...

ps: uma dica extra... Se os teus controlos têm um id, usa isso no selector apenas em vez de colocares tag e id como estás a fazer que ganhas em tempo de execução

ficaria assim: $("#n2").append(data);

Link to comment
Share on other sites

Bem então o que está a acontecer é que não está a preencher o select com as opções devolvidas no $.post.

podes sempre tentar usar o método append() em vez do html():

em vez de :

$("select#n2").html(data);

usar:

$("select#n2").append(data);

Se isto não funcionar diria que pode ter a ver com caracteres estranhos nas opções que vais buscar, como tabs, enters etc...

ps: uma dica extra... Se os teus controlos têm um id, usa isso no selector apenas em vez de colocares tag e id como estás a fazer que ganhas em tempo de execução

ficaria assim: $("#n2").append(data);

tambem nao é do append... a função html está lá para limpar o que o select tiver e inserir o que vem da BD...

Obrigado pela disponibilidade 😁

Link to comment
Share on other sites

Isso não é bem assim a função .html() de jquery usa a propriedade innerHTML que pode não ser mapeada no DOM da mesma forma para todos os browsers.

Para ter a certeza que está a funcionar podes sempre usar javascript puro também:

document.getElementById('n2').innerHTML = data;

de qualquer forma... eu verificava a questão dos caracteres... De certeza que não vem um \t ou \n do servidor? É que aí o IE também se passa 😁

Link to comment
Share on other sites

Isso não é bem assim a função .html() de jquery usa a propriedade innerHTML que pode não ser mapeada no DOM da mesma forma para todos os browsers.

Para ter a certeza que está a funcionar podes sempre usar javascript puro também:

document.getElementById('n2').innerHTML = data;

de qualquer forma... eu verificava a questão dos caracteres... De certeza que não vem um \t ou \n do servidor? É que aí o IE também se passa 😁

Mas um \t ou \n na BD ou no php?

Link to comment
Share on other sites

BD, porque é aí que vais buscar dados para construir as opções da combo

e php também se andas a colocar caracteres manhosos pelo meio do html que queres passar para a combo - mas isso não me parece pelo código que mostraste

e entretanto experimenta com o document.getElementById.

Link to comment
Share on other sites

BD, porque é aí que vais buscar dados para construir as opções da combo

e php também se andas a colocar caracteres manhosos pelo meio do html que queres passar para a combo - mas isso não me parece pelo código que mostraste

e entretanto experimenta com o document.getElementById.

Mudei o collation na bd para o latin1_general_cs por causa dos acentos e das cedilhas mas o erro continua... entretanto eu posso colocar java script puro assim misturado com o jquery 'à papo seco'? (desculpem mas nao arranjei expressão melhor xD)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.