Avatar billede zeusdk Nybegynder
14. december 2002 - 15:51 Der er 8 kommentarer og
2 løsninger

Reservations-script

Hej

Jeg har et script, som smider ikke-reserverede datoer ind i en dropdown-box.

Der er bare den begrænsning i scriptet, at 1 dato kun kan reserveres en gang. Nu er det imidlertid blevet sådan i "virkelighedens verden", at en dato godt kan reserveres 2 gange, hvis de 30 kommende datoer allerede er blevet reserveret. Hvis dette er tilfældet, altså at de næste 30 dage er blevet reserveret, skal en dato kunne reserveres 2 gange. Men når en dato er blevet reserveret 2 gange, skal man ikke kunne reservere dem mere – lige meget hvad.

<script>

rd = "22/02/2003, 22/03/2003, 29/03/2003, 01/04/2003"; //reservations-datoer
nu = new Date();

temp = rd.split(", ");

function eia(str) {
    for (n = 0; n < temp.length; n++)
        if (temp[n] == str) return true;
   
    return false;
}

document.write('<select name="datoPublikation" style="font-size: 10pt; font-family: Trebuchet MS">');

for (i = 1; i <= 364; i++) {
    td = new Date(nu.getTime() + 1000 * 60 * 60 * 24 * i);
    str = ((td.getDate() < 10) ? "0" + td.getDate() : td.getDate()) + "-" + ((td.getMonth() + 1 < 10) ? "0" + (td.getMonth() + 1) : td.getMonth() + 1) + "-" + td.getFullYear();
    if (!eia(str))
        document.write('<option value="' + str + '">' + str + '</option>');
}
document.write('<select>');
</script>
Avatar billede Slettet bruger
15. december 2002 - 20:17 #1
Puha, det bliver nok noget af en opgave for browseren at køre alle de løkker igennem (og jeg er ikke helt sikker på, at jeg har fået logikken på plads), men prøve dette:

function eia(str) {
    f = 0;
    for (n = 0; n < temp.length; n++) {
        if (temp[n] == str) f++;
        if (f > 1)
            return true;
        if (f == 0)
            return false;       
    }
    bla = str.split("/");
    dato = new Date(parseInt(bla[2], 10), parseInt(bla[1], 10), parseInt(bla[0], 10));
    for (i = 1; i <= 30; i++) {
        test = new Date(dato.getTime() + 1000 * 60 * 60 * 24 * i);
        teststr = ((test.getDate() < 10) ? "0" + test.getDate() : test.getDate()) + "/" + ((test.getMonth() + 1 < 10) ? "0" + (test.getMonth() + 1) : test.getMonth() + 1) + "/" + test.getFullYear();
            hf = false;
            for (n = 0; n < temp.length; n++) {
              if (temp[n] == teststr) {
                    hf = true;
                    break;
              }
            }
            if (!hf)
              return true;
    }
    return false;
}
Avatar billede zeusdk Nybegynder
16. december 2002 - 20:02 #2
Men hvordan skal det bygges sammen med min eksisterende kode? Hvordan skal de ikke-reserverede datoer smides i dropdown-boxen osv?
Avatar billede Slettet bruger
17. december 2002 - 15:46 #3
Du skifter bare den gamle eia-funktion ud med det, jeg har skrevet her. Så skulle det gerne virke (med mindre jeg har lavet en fejl i scriptet; det får vi at se). Smid gerne et link, hvis noget går galt!
Avatar billede zeusdk Nybegynder
18. december 2002 - 20:19 #4
Det er hermed gjort, men desværre virker det med, at scriptet ikke skal liste dato, som er blevet reserveret to gange. Den lister fejlagtigt alle datoer lige meget hvor mange gange de er blevet reserveret.
Avatar billede Slettet bruger
19. december 2002 - 17:02 #5
Vil du ikke smide et link? Det er sævrt for mig at arbejde på denne måde!
Avatar billede zeusdk Nybegynder
22. december 2002 - 19:19 #6
>Vil du ikke smide et link?
Det skal jeg nok, men jeg skal lige ordne noget før det kan lade sig gøre.

Men jeg har fundet ud at, at fejlen sikkert opstår ved at datoen skabes af klienten (javascript), fordi det giver nogle problemer, hvis personen har indstillet på sin computers dato.

Så derfor har jeg skrev følgende om til ASP:
nu = new Date();

Til:
nu = "<% response.write date() %>";

Men det skaber en fejl i:
td = new Date(nu.getTime() + 1000 * 60 * 60 * 24 * i);

Den siger:
Object does not support this property or method

Kan du hjælpe?
Avatar billede Slettet bruger
23. december 2002 - 14:19 #7
Ja, prøv:

nu = new Date(<% response.write date() %>);

Jeg ved ikke, hvad output det giver, men det skal outputte antal millisekunder siden 1/1-1970.
Avatar billede zeusdk Nybegynder
24. december 2002 - 10:11 #8
>...millisekunder siden 1/1-1970.
Ja, outputtet blev ovennævnte dato, men jeg troede ellers at date() gav serverens aktuelle dato, men det gør den åbenbart ikke. Hvordan udbygges koden - nu = new Date(<% response.write date() %>); - så den returnerer serverens aktuelle dato?
Avatar billede Slettet bruger
24. december 2002 - 12:15 #9
date() bør også give den aktuelle dato på serveren (jeg kender ikke så meget til ASP, men jeg kan da lidt PHP). De formater du kan udskrive en dato til et Date-objekt i JavaScript står her:
http://www.w3schools.com/js/js_datetime.asp

Du kan evt. eksperimentere med det.
Avatar billede zeusdk Nybegynder
24. december 2002 - 13:24 #10
Jeg lukker indlægget nu, da det er meget problematisk at tage en dato i ASP og smide den videre over i javascript. Jeg bliver nødt til at have datoen fra serveren da klienten kan have indstillet den forkert. Derfor "flytter" jeg nu spørgmålet over til asp-eksperterne og beder dem om at skrive koden i asp. Jeg takker for hjælpen :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester