Jump to content

Recommended Posts

Within a intranet system I am building I have a PHP script(let us call it A) which generates a web page which on user input calls an Ajax script(we will call this B) to update the server based database with the values entered by the user. The update of the server based database is done via a PHP script(we will call this C) with no HTML. To make life a bit better I am using session variables to store data between calls to the database update script C.

This works perfectly the 1st time through but after the 2nd time around I find that certain session variables values have reverted to the values they contained before any processing was done. The scenario follows:-

Web page A is created via PHP containing data.

On user input Ajax B is "called" which calls C which returns to B which updates Web page A.

As follows B->C->B->update A->B->C->B->update A

I have been through my code a number of times and cannot see where this code could be reverting the data other than where I want it to.

Am I missing something?

I am on purpose not sending or including any code in case I am misunderstanding session variables or something equally silly.

 

I do have session_start() in both PHP scripts.

I do not mind sharing the source code.

Would you like me to send you the Javascript & database update PHP?

I do not believe that the PHP script that creates the page is in any way involved other than to create the page.

What you need to provide is

1) The original PHP page that display intial values and sets $_SESSION variables

2) The Javascript (Ajax) in your HTML file.

3) The PHP script that the Ajax is calling.

 

Post those here and we'll do our darnedest to help you out. :)

Or to do a quick test, just create 2-3 new .php pages.

 

Put $_SESSION_START(); at the top of all three and then just do

$_SESSION["test"] = "Hi";

 

Then on your other page do

 

echo $_SESSION["test"];

 

And see if you get "Hi" on your other two pages.  If so, then at least you have verified Sessions work properly on your webhost.

 

It is reasonably large but you did ask for it........:-)

The code that creates the page

<?php

//

// TI5SCAN-4.php called from TI4SGM-3.php to Issue tickets via scanning of ticket bundles

//     Retrieve data from TI4SGM-3 created session variables and insert into TicketIssued & BundleIssued tables

//

require_once('includes/configuration.php');     // database connect script & the rest.

    DBConnect();        // Connect to Events database



    $Datum = date("Y-m-d H:i:s");    /* 2006-03-17 23:22:32 */

    $Event         = $_SESSION['Event'];

    $EventName     = $_SESSION['EventName'];

    $MemberNum     = $_SESSION['MemberNum'];

    $Name          = $_SESSION['MemberName'];



    $SlotsValue    = $_SESSION['SlotsTickets'];

    $SlotsIssued   = $_SESSION['SlotsIssued'];



    $TableValue    = $_SESSION['TableTickets'];

    $TableIssued   = $_SESSION['TableIssued'];



    $BonusTickets  = $_SESSION['BonusTickets'];

    $BonusIssued   = $_SESSION['BonusIssued'];



    $TotalTickets = $SlotsValue + $TableValue + $BonusTickets;

    $TotalIssued = $SlotsIssued + $TableIssued + $BonusIssued;

    $RemainingTickets = $TotalTickets - $TotalIssued;



//    $ErrorMessage = "";

//    $_SESSION['ErrorMessage'] = "";



    $Temp = $RemainingTickets;

    $DSuggestion = intval($Temp/500);

    $Temp %= 500;

    $CSuggestion = intval($Temp/100);

    $Temp %= 100;

    $LSuggestion = intval($Temp/50);

    $Temp %= 50;

    $XSuggestion = intval($Temp/10);

    $ISuggestion = intval(($Temp %= 10));

    $_SESSION['FirstTime'] = 1;

    $DIssued   = $_SESSION['DIssued'];

    $CIssued   = $_SESSION['CIssued'];

    $LIssued   = $_SESSION['LIssued'];

    $XIssued   = $_SESSION['XIssued'];

    $IIssued   = $_SESSION['IIssued'];

/*

* Get Event details

*

*/

    $SQL = "SELECT EventID, MessageID FROM Event WHERE EventID='".$Event ."'";

    $rs = mssql_query($SQL, $link);

    $row = mssql_fetch_array($rs);

    $EventID = $row['EventID'];

    $MessageID = $row['MessageID'];



    $SQLMessage = "Select Message from Message where MessageID =". $MessageID;

    $rs = mssql_query($SQLMessage, $link);

    $row = mssql_fetch_array($rs);

    $txtMessage = $row['Message'];



?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional"  "http://www.w3.org/TR/REC-html40/loose.dtd">

<HTML>

<HEAD>

<title>Scan Ticket Issue</title>

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="Mon, 22 Jul 2000 11:12:01 GMT" />

<META HTTP-EQUIV="Pragma" CONTENT="no-cache" />

<META HTTP-EQUIV="Expires" CONTENT="-1" />

<link rel="stylesheet" type="text/css" href="style/style.css">

<script language="JavaScript" type="text/javascript" src="js/TicketIssueFunctions.js"></script>

<script language="JavaScript" type="text/javascript" src="js/Mandy.js"></script>

<script type="text/javascript">

function submit_click(BundleNumber)

    {

    if (BundleNumber == "")

        {

        strErrorMsg += "Please scan a bundle or ticket\n";

        alert(strErrorMsg);

        }

    else

        {

        var Command = "TI5SCAN-5.php?EventID="+<?php echo $EventID ?>+"&MemberNum="+<?php echo $MemberNum ?>+

                        "&BundleNumber="+BundleNumber;

//      alert("Command = " + Command);

        progExe(Command);

        return false;

        }

    }

</script>





</head>

<!-- <body onafterprint="afterprint()"> -->

<body>

<form name='GetBundle' id='GetBundle' method='get' onSubmit='return false;'>

<h2>Ticket Status for <?php echo $EventName ?> <br /><font size=-1> as at <?php echo $Datum ?></font></h2>

<table border=1 frame=box cellpadding=3 align=center width=325>

<tr><td width=80% align=left>Event:</td>

<td colspan="2"> <?php echo $EventName ?></td></tr>

<tr><td align=left>Member No:</td>

<td colspan="2"><input type=text readonly name="CardNumber" id="CardNumber" value ='<?php echo $MemberNum ?>'></td></tr>

<tr><TD align=left>Member Name :</td>

<td colspan="2" id="MemberName"><?php echo $Name ?></td></tr>



<tr><TD align=left>Total tickets :</td>

<td align=center colspan="2" id="OutstandingValue"><?php echo $TotalTickets ?></td></tr>

<tr><TD align=left>Remaining tickets:</td>

<td align=center colspan="2" id="TablesValue"><?php echo $RemainingTickets ?></td></tr>

<tr><TD align=left>Bundles Issued :</td><td align=center>Issued</td><td align=center>Suggestion</td></tr>



<tr><TD align=left>Five Hundreds: :</td>

<td align=center width=25% id="DIssued"><?php echo $DIssued ?></td>

<td align=center width=25% id="DSuggestion"><?php echo $DSuggestion ?></td></tr>



<tr><TD align=left>Hundreds :</td>

<td align=center width=25% id="CIssued"><?php echo $CIssued ?></td>

<td align=center width=25% id="CSuggestion"><?php echo $CSuggestion ?></td></tr>

<tr><td>Fifties:</td>

<td align=center width=25% id="LIssued"><?php echo $LIssued ?></td>

<td align=center width=25% id="LSuggestion"><?php echo $LSuggestion ?></td></tr>

<tr><TD align=left>Tens :</td>

<td align=center width=25% id="XIssued"><?php echo $XIssued ?></td>

<td align=center width=25% id="XSuggestion"><?php echo $XSuggestion ?></td></tr>

<tr><td>Singles:</td>

<td align=center width=25% id="IIssued"><?php echo $IIssued ?></td>

<td align=center width=25% id="ISuggestion"><?php echo $ISuggestion ?></td></tr>



<tr><TD align=left>Total Issued:</td>

<div><td align=center colspan="2" name="Total" id="Total"><?php echo $TotalIssued ?></td></div></tr>

<tr><TD align=left>Bundle/Ticket Num :</td>

<td colspan="2" width=50%><input type=text name="BundleNum" id="BundleNum" onChange=submit_click(this.value)></td>

</tr>

<tr><div><td colspan="3" name="ErrorMessage" id="ErrorMessage"> </td></div>

</tr>

<tr>

<td align=center colspan="3" name="loadingNode" id="loadingNode"></td>

</tr>

</table>

</form>

<br />

<center>

<a href="./Administration.php?Diva=<?php echo rand() ?>"><img src=images/Back.png></a>

</center>

</body>

</html>

<script type="text/javascript">

// PrintReceipt(<?php echo $Event ?>)

document.getElementById("BundleNum").focus();

</script>

and the Ajax code is:-

function getXMLHttpRequest ()

    {

    try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {};

    try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {};

    try { return new XMLHttpRequest(); } catch(e) {};

    return null;

    }



// Make the XMLHttpRequest object

    var xhr = getXMLHttpRequest();



function progExe(CommandString)

    {

//    alert("Mandy");

    xhr.open("GET", CommandString, true);

    xhr.onreadystatechange = ServerResponse;

    xhr.send(null);

    }



function ServerResponse()

    {

//    alert("entered ServerResponse()");

/* The full list of the readyState values is as follows:

    * 0 (uninitialized)

    * 1 (loading)

    * 2 (loaded)

    * 3 (interactive)

    * 4 (complete)

*/

    if(xhr.readyState == 0)

        {

        document.getElementById("loadingNode").innerHTML = "Uninitialized........";

        }

    else

    if(xhr.readyState == 1)

        {

        document.getElementById("loadingNode").innerHTML = "Loading........";

        }

    else

    if(xhr.readyState == 2)

        {

        document.getElementById("loadingNode").innerHTML = "Loaded........";

        }

    else

    if(xhr.readyState == 3)

        {

        document.getElementById("loadingNode").innerHTML = "Interactive........";

        }

    else

    if(xhr.readyState == 4)

        {

        if (xhr.status == 200)

            {

            var parts = xhr.responseText.split("|");

//           alert("0 = "+parts[0]+" 1 = "+parts[1]);



            if (parts[0] == "X")

                {

                alert(parts[1]);

                }

            else

                {

                document.getElementById("loadingNode").innerHTML = " ";

                document.getElementById("DIssued").innerHTML = parts[1];

                document.getElementById("DSuggestion").innerHTML = parts[2];

                document.getElementById("CIssued").innerHTML = parts[3];

                document.getElementById("CSuggestion").innerHTML = parts[4];

                document.getElementById("LIssued").innerHTML = parts[5];

                document.getElementById("LSuggestion").innerHTML = parts[6];

                document.getElementById("XIssued").innerHTML = parts[7];

                document.getElementById("XSuggestion").innerHTML = parts[8];

                document.getElementById("IIssued").innerHTML = parts[9];

                document.getElementById("ISuggestion").innerHTML = parts[10];

                document.getElementById("BundleNum").value = "";

                var SlotsValue = (parts[11])*1;

                var TableValue = (parts[12])*1;

                var BonusTickets = (parts[13])*1;

                var SlotsIssued = (parts[14])*1;

                var TableIssued = (parts[15])*1;

                var BonusIssued = (parts[16])*1;

// alert("SlotsValue = "+SlotsValue+" TableValue = "+TableValue+" BonusTickets = "+BonusTickets+"\nTotal Issued = "+TotalIssued+" Remaining Tickets = "+RemainingTickets);

        // Calculate Remaining tickets

                var RemainingTickets = ((SlotsValue*1 + TableValue*1 + BonusTickets*1) - (SlotsIssued*1 + TableIssued*1 + BonusIssued*1));

                document.getElementById("TablesValue").innerHTML = RemainingTickets;

        // Calculate Total Issued

                var TotalIssued = SlotsIssued*1 + TableIssued*1 + BonusIssued*1;

                document.getElementById("Total").innerHTML = TotalIssued;

//                var BoodSkap = parts[17];

//                if (BoodSkap == "x" || BoodSkap == "X") BoodSkap == " ";

                document.getElementById("ErrorMessage").innerHTML = parts[17];;

//                history.go(0);

                }

            }

        }

    }

and the PHP that updates the database

<?php

/*

*

* Update BundlesIssued table

*

* Added

* ALTER TABLE BundlesIssued ADD CONSTRAINT NeinDuplicates UNIQUE (FirstNumber)

* to table resolved duplicates

*/

require_once('includes/configuration.php');     // database connect script & the rest.

    DBConnect();        // Connect to Events database



    $Datum = date("Y-m-d H:i:s");

    $EventID = strip_tags($_REQUEST['EventID']);

    $MemberNum = strip_tags($_REQUEST['MemberNum']);

    $BundleNumber = strip_tags($_REQUEST['BundleNumber']);

/*

* for debug purposes

*/

//    $Message = "EventID = ".$EventID." MemberNum = ".$MemberNum." BundleNumber = ".$BundleNumber;

//    trigger_error($Message, E_USER_ERROR);





    $SavedBundle = $BundleNumber;

    if ($BundleNumber == "")

        {

        $Message = "X|Please scan a bundle or ticket";

        $bError = TRUE;

//        trigger_error($Message, E_USER_ERROR);

        }

    else

        {

        if (strlen($BundleNumber) == 12)

            {

// Bundle

            $BundleSize = substr($BundleNumber, 0, 2)*10;

            $FirstNumber = substr($BundleNumber, 2, 10);

            $LastNumber = intval($FirstNumber) + (intval($BundleSize) - 1);

            if (strlen($LastNumber) < 10) $LastNumber = "0".$LastNumber;

            }

        else if (strlen($BundleNumber) == 10)

            {

// Single ticket

            $BundleSize = 1;

            $FirstNumber = substr($BundleNumber, 0, 10);

            $LastNumber = $FirstNumber;

            }

        else if ((strlen($BundleNumber) != 10) && (strlen($BundleNumber) != 10))

            {

            $Message = "X|Bundle/ticket ".$BundleNumber." has Incorrect length of ".strlen($BundleNumber);

            $bError = TRUE;

//            trigger_error($Message, E_USER_ERROR);

            }

        }



    $SlotsTurnover = 0;

    $TableTurnover = 0;



    $SlotsTickets  = $_SESSION['SlotsTickets'];

    $SlotsIssued   = $_SESSION['SlotsIssued'];



    $TableTickets  = $_SESSION['TableTickets'];

    $TableIssued   = $_SESSION['TableIssued'];



    $BonusTickets  = $_SESSION['BonusTickets'];

    $BonusIssued   = $_SESSION['BonusIssued'];



    $TotalTickets = $SlotsTickets + $TableTickets + $BonusTickets;

    $SlotsBalance = $SlotsTickets - $SlotsIssued;

    $TableBalance = $TableTickets - $TableIssued;

    $BonusBalance = $BonusTickets - $BonusIssued;

    $RemainingTickets = $SlotsTickets + $TableTickets + $BonusTickets;

    $TotalIssued = $SlotsIssued + $TableIssued + $BonusIssued;



    if($BundleSize > $RemainingTickets)

         {

         $Message = sprintf("X|Bundle size of [%d] is greater than number outstanding [%d].",$BatchSize,$RemainingTickets);

         $bError = true;

//         trigger_error($Message, E_USER_ERROR);

         }

// Save the size of the bundle for use when calling stored procedure

    $SizeOfBundle = $BundleSize;

/*

* Check that this bundle has not already been issued.

*/

    $SQL = sprintf("SELECT * FROM BundlesIssued WHERE FirstNumber = ".$FirstNumber);

    $rs = mssql_query($SQL, $link);

    $row = mssql_fetch_array($rs);

    $FN = $row['FirstNumber'];

    $LN = $row['LastNumber'];

    if (($FN == $FirstNumber) && ($LN == $LastNumber))

        {

        $Message = sprintf("X|Bundle [%s] has already been issued [%s] [%s]", $SavedBundle,$FirstNumber,$LastNumber);

        $bError = true;

        trigger_error($Message, E_USER_ERROR);

        }



/*

* If Bundle size greater than Slots balance decrease bundle size by slots balance

*              and make slotstoissue equal to slots balance

*/

    if ($BundleSize > $SlotsBalance)

        {

        $BundleSize -= $SlotsBalance;

        $SlotsToIssue = $SlotsBalance;

        }

     else if ($BundleSize < $SlotsBalance)

        {

        $SlotsToIssue = $BundleSize;

        $BundleSize = 0;

        }

     else if ($SlotsBalance == 0)

        {

        $SlotsToIssue = $BundleSize = 0;

        }



    if ($BundleSize > $TableBalance)

       {

       $BundleSize -=  $TableBalance;

       $TableToIssue = $TableBalance;

       }

    else if ($BundleSize <  $TableBalance)

       {

       $TableToIssue = $BundleSize;

       $BundleSize = 0;

       }

    else if ($TableBalance == 0)

       {

       $TableToIssue = $BundleSize = 0;

       }



    if ($BundleSize > $BonusBalance)

        {

        $BundleSize -=  $BonusBalance;

        $BonusToIssue = $BonusBalance;

        }

    else if ($BundleSize <  $BonusBalance)

        {

        $BonusToIssue = $BundleSize;

        $BundleSize = 0;

        }

    else if ($BonusBalance == 0)

        {

        $BonusToIssue = $BundleSize = 0;

        }

/*

* for debug purposes

*/

    $Message = sprintf("%s %d<br />RemainingTickets = [%s] bError = [%d]",__FILE__, __LINE__,$RemainingTickets, $bError);

    trigger_error($Message, E_USER_ERROR);





    if (($RemainingTickets > 0) && ($bError != TRUE))

        {

/*

* Get Event details

*

*/

        $SQL = "SELECT EventID, MessageID FROM Event WHERE EventID='".$EventID ."'";

        $rs = mssql_query($SQL, $link);

        $row = mssql_fetch_array($rs);

        $EventID2 = $row['EventID'];

        $MessageID = $row['MessageID'];

/*

* for debug purposes

*

*       $Message = "EventID=$EventID or $Event";

*       trigger_error($Message, E_USER_ERROR);

*/

        $SQLMessage = "Select Message from Message where MessageID =". $MessageID;

        $rs = mssql_query($SQLMessage, $link);

        $row = mssql_fetch_array($rs);

        $txtMessage = $row['Message'];



/*

*  Call spIssueScannedTickets stored procedure to update BundleIssued and TicketIssued

*                      required parameters are:-

*                              MemberNumber, EventID, BundleSize, FirstNumber, LastNumber, UserID, Invalid and

*                                      SlotsBalance & TableBalance & BonusBalance

*                                      ie the amount of tickets to issue for Slots, Tables & Bonus

*/

        $Result = 0;

        $proc = mssql_init("spIssueScannedTickets",$link);

        mssql_bind($proc, "@MemberNum", $MemberNum, SQLVARCHAR);

        mssql_bind($proc, "@iEventID", $EventID, SQLINT2);

        mssql_bind($proc, "@BatchSize", $SizeOfBundle, SQLINT2);

        mssql_bind($proc, "@FirstNumber", $FirstNumber, SQLVARCHAR);

        mssql_bind($proc, "@LastNumber", $LastNumber, SQLVARCHAR);

        mssql_bind($proc, "@UserID", $_SESSION['UID'], SQLINT2);

        mssql_bind($proc, "@SlotsBalance", $SlotsToIssue, SQLINT2);

        mssql_bind($proc, "@TableBalance", $TableToIssue, SQLINT2);

        mssql_bind($proc, "@BonusBalance", $BonusToIssue, SQLINT2);

        mssql_bind($proc, "RETVAL", $Result, SQLINT2);

        mssql_execute($proc);

        mssql_free_statement($proc);

/*

* for debug purposes

*       $Message = "Result = ".$Result."SizeOfBundle = ".$SizeOfBundle;

*       trigger_error($Message, E_USER_ERROR);

*/

        if ($Result == $SizeOfBundle)

            {

// Update screen with new values

            switch ($BundleSize)

                {

                case 500:

                    $DIssued += 1;

                    break;

                case 100:

                    $CIssued += 1;

                    break;

                case 50:

                    $LIssued += 1;

                    break;

                case 10:

                    $XIssued += 1;

                    break;

                case 1:

                    $IIssued += 1;

                    break;

                }



/*

* for debug purposes

            $Message = "<br />0 Tickets=$Tickets<br />Issued=$Issued<br />DSuggestion=$DSuggestion<br />CSuggestion=$CSuggestion<br />LSuggestion=$LSuggestion<br />XSuggestion=$XSuggestion<br />ISuggestion=$ISuggestion<br />Remaining=$RemainingTickets<br />SlotsTickets=$SlotsTickets<br />SlotsIssued=$SlotsIssued<br />TableTickets=$TableTickets<br />TableIssued=$TableIssued<br />BonusTickets=$BonusTickets<br />BonusIssued=$BonusIssued<br />";

            trigger_error($Message, E_USER_ERROR);

            $Message = "<br />SlotsToIssue = $SlotsToIssue<br />TableToIssue=$TableToIssue<br />BonusToIssue=$BonusToIssue";

            trigger_error($Message, E_USER_ERROR);

*/

            $SlotsTickets -= $SlotsToIssue;

            $SlotsIssued  += $SlotsToIssue;

            $TableTickets -= $TableToIssue;

            $TableIssued  += $TableToIssue;

            $BonusTickets -= $BonusToIssue;

            $BonusIssued  += $BonusToIssue;

            $Tickets = ($SlotsTickets + $TableTickets + $BonusTickets);

            $Issued  = ($SlotsIssued + $TableIssued + $BonusIssued);

            $RemainingTickets = $Tickets;



            $_SESSION['SlotsTickets'] = $SlotsTickets;

            $_SESSION['SlotsIssued'] = $SlotsIssued;



            $_SESSION['TableTickets'] = $TableTickets;

            $_SESSION['TableIssued'] = $TableIssued;



            $_SESSION['BonusTickets'] = $BonusTickets;

            $_SESSION['BonusIssued'] = $BonusIssued;



            $_SESSION['IssuedValue'] = $Issued;

            $_SESSION['OutstandingValue'] = $Tickets - $Issued;

// Recalculate suggestions

            $Temp = (int)$RemainingTickets;

            $DSuggestion = (int)($Temp/500);

            $Temp %= 500;

            $CSuggestion = (int)($Temp/100);

            $Temp %= 100;

            $LSuggestion = (int)($Temp/50);

            $Temp %= 50;

            $XSuggestion = (int)($Temp/10);

            $ISuggestion = (int)(($Temp %= 10));

/*

* for debug purposes

*

*           $Message = "<br />1 Tickets=$Tickets<br />Issued=$Issued<br />DSuggestion=$DSuggestion<br />CSuggestion=$CSuggestion<br />LSuggestion=$LSuggestion<br />XSuggestion=$XSuggestion<br />ISuggestion=$ISuggestion<br />Remaining=$RemainingTickets<br />SlotsTickets=$SlotsTickets<br />SlotsIssued=$SlotsIssued<br />TableTickets=$TableTickets<br />TableIssued=$TableIssued<br />BonusTickets=$BonusTickets<br />BonusIssued=$BonusIssued<br />";

*           trigger_error($Message, E_USER_ERROR);

*/

            $Message = "Bundle/ticket ".$BundleNumber." has been processed";

            }

        else

            {

            $Message = "X|Bundle/ticket ".$BundleNumber." has failed to update".$Result." ".$BundleSize;

            }

        }





    DBDisConnect();     // Disconnect from Events database

    $Message = "0|$DIssued|$DSuggestion|$CIssued|$CSuggestion|$LIssued|$LSuggestion|$XIssued|$XSuggestion|$IIssued|$ISuggestion|$SlotsTickets|$SlotsIssued|$TableTickets|$TableIssued|$BonusTickets|$BonusIssued|$Message|";

//              0    1         2           3          4          5         6           7         8           9          10         11           12              13          14          15              16          17

    trigger_error(sprintf("%s %d<br />%s",__FILE__,__LINE__,$Message), E_USER_ERROR);

    echo $Message;

?>

I hope that the above all makes sense.

rajivgonsalves, I have been under the impression that caching only came into play when a page was reloaded.

With Ajax reloading pages is redundant, or so I thought.

Please tell me if you feel that the code that I posted above might possibly have a caching problem and how I should fix it.

well this is what I used

 

 

today = new Date();
cur_time=today.getYear()+""+today.getMonth()+""+today.getDate()+""+today.getHours()+""+today.getMinutes()+""+today.getSeconds();

if(xmlhttp.readyState==0 || xmlhttp.readyState==4)
{
	xmlhttp.open("GET", "index.php?module=Ajax&function=getCat&date="+cur_time+"&strCat="+strCat,false);
	xmlhttp.onreadystatechange = function handleResponse() 

 

 

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

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.