Kapesní astrolog

24. prosince 2002

Znamení zvěrokruhu, znamení čínského horoskopu, den narození… Pokud nemáte ambice vytvářet profesionální astrologický server a chcete jen nabídnout svým návštěvníkům několik zajímavostí, vypočtených z data narození, tento článek vám bude návodem.

Hned na úvod je třeba podotknout, že astrologie (ať již v ni věříme či nikoliv) je aspoň z matematického hlediska věda poměrně složitá. Existují stovky komplikovaných programů, které počítají z data narození, uvedeného ovšem s minutovou přesností, desítky různých aspektů. Můj skript si takové ambice neklade, berte jej proto spíše jako hříčku určenou pro pobavení, jakýsi ekvivalent horoskopů z populárních časopisů.

V následujícím formuláři si můžete celý skript vyzkoušet. Zadejte své datum narození a stiskněte tlačítko pod tabulkou:

Astrolog do kapsy

Popis jednotlivých částí skriptu

Nejprve je třeba vytvořit formulář, v němž bude uživatel zadávat datum svého narození. Formulář zároveň slouží jako výstup výpočtu. Můžeme si vybrat, chceme-li jej vytvořit v HTML nebo JavaScriptu, v příkladu bylo použito kombinace obou metod. Část formuláře je vypsána v HTML, tabulku a pole SELECT vytváříme JavaScriptovou funkcí WriteTable:

V hlavicce stranky:
function WriteTable( ) {
    var i,j;
    document.write( „<table border=’1′ bgcolor=’cyan‘>“ );
    document.write( „<tr><td>Datum narození:</td><td><select name=’day‘>“ );
    for( j=1; j<=31; j+=1 ) {
        document.write( „<option value='“+j+“‚>“ + j + „</option>“ );
    }
    document.write( „</select>&nbsp;<select name=’month‘>“ );
    for( j=1; j<=12; j+=1 ) {
        document.write( „<option value='“+j+“‚>“ + j + „</option>“ );
    }
    document.write( „</select>&nbsp;<select name=’year‘>“ );
    for( j=1901; j<=2002; j+=1 ) {
        document.write( „<option „+(j==1980?“selected“:““) +“ value='“+j+“‚>“ + j + „</option>“ );
    }
    document.write( „</select></td></tr>“);
    document.write( „<tr><td>Znamení zvěrokruhu:</td><td><input type=’text‘ name=’zodiac‘></td></tr>“);
    document.write( „<tr><td>Čínské znamení:</td><td><input type=’text‘ name=’china‘></td></tr>“);
    document.write( „<tr><td>Dní od narození:</td><td><input type=’text‘ name=’daysonearth‘ ></td></tr>“);
    document.write( „<tr><td>Narozen dne:</td><td><input type=’text‘ name=’born‘></td></tr>“);
    document.write( „</table>“ );
}
Ve strance:
<FORM name=Form1>
<SCRIPT language=JavaScript>
<!–
    WriteTable();
// –>
</SCRIPT>
<P><INPUT onclick=compute(this.form) type=button value=“Spočítat výsledek“></P>
</FORM>

Po stisku tlačítka „Spočítat výsledek“ je volána funkce compute, která má na svědomí většinu výpočtů. Vzhledem k její délce si ji ukážeme po částech. Hlavička funkce je triviální. Další je řádek s deklaracemi, který rovněž načítá vstupní hodnoty z formuláře. Následuje kontrola na platnost zadaného data:

function compute(theForm) {
var start = 1901, birthyear = theForm.year.selectedIndex+1901, date=theForm.day.selectedIndex+1, month=theForm.month.selectedIndex+1;
    if (date>30 && (month == 2 || month==4 || month==6 || month==9 || month==11)) {
        window.alert(„Den „+date+“ v měsíci „+month+“ neexistuje“);
        return false
    }
    if (date>29 && month==2) {
        window.alert(„Den „+date+“ v měsíci „+month+“ neexistuje“);
    return false
    }
    if ((month == 2 && date == 29) && IsYearLeap(birthyear) ) {
        window.alert(„29. únor neexistuje v roce „+birthyear);
    return false
    }

První počítanou hodnotou je znamení „normálního“ zvěrokruhu, tedy toho, který je používán v „západním“ světě. Data, vymezující jednotlivá znamení, představují běžně používaný průměr. Ve skutečnosti je ovšem u mezních dat celá problematika trochu složitější, do hry v těchto případech vstupuje i rok a přesný čas narození. Pro „běžné“ účely je ovšem uvedená přesnost dostačující:

with (theForm.zodiac){
    if (month == 1 && date >=20 || month == 2 && date <=18) {value = „Vodnář“;}
    if (month == 2 && date >=19 || month == 3 && date <=20) {value = „Ryby“;}
    if (month == 3 && date >=21 || month == 4 && date <=19) {value = „Beran“;}
    if (month == 4 && date >=20 || month == 5 && date <=20) {value = „Býk“;}
    if (month == 5 && date >=21 || month == 6 && date <=21) {value = „Blíženci“;}
    if (month == 6 && date >=22 || month == 7 && date <=22) {value = „Rak“;}
    if (month == 7 && date >=23 || month == 8 && date <=22) {value = „Lev“;}
    if (month == 8 && date >=23 || month == 9 && date <=22) {value = „Panna“;}
    if (month == 9 && date >=23 || month == 10 && date <=22) {value = „Váhy“;}
    if (month == 10 && date >=23 || month == 11 && date <=21) {value = „Štír“;}
    if (month == 11 && date >=22 || month == 12 && date <=21) {value = „Střelec“;}
    if (month == 12 && date >=22 || month == 1 && date <=19) {value = „Kozoroh“;}
}

U znamení čínského horoskopu je situace obdobná. Běžně se uvádí varianta, kdy celý jeden rok je přiřazen jednomu ze dvanácti znamení. V odborné literatuře se ovšem uvádí přesnější rozdělení, kdy zlom mezi jednotlivými znameními probíhá ke konkrétnímu (pokaždé jinému) datu na počátku nebo konci roku. Následující skript vychází z jednodušší varianty jeden rok = jedno znamení:

x = (start – birthyear) % 12
with (theForm.china){
    if (x == 1 || x == -11) {value = „Krysa“;}
    if (x == 0) { value = „Buvol“; }
    if (x == 11 || x == -1) {value = „Tygr“;}
    if (x == 10 || x == -2) {value = „Králík“;}
    if (x == 9 || x == -3) {value = „Drak“;}
    if (x == 8 || x == -4) {value =“Had“;}
    if (x == 7 || x == -5) {value = „Kůň“;}
    if (x == 6 || x == -6) {value = „Koza“;}
    if (x == 5 || x == -7) {value = „Opice“;}
    if (x == 4 || x == -8) {value = „Kohout“;}
    if (x == 3 || x == -9) {value = „Pes“;}
    if (x == 2 || x == -10) {value = „Prase“;}
}

Zajímavou hodnotou je počet dnů, které dotyčný strávil na tomto světě. V těle funkce compute spočteme příslušnou hodnotu voláním pomocné funkce howLong. Kód této a dalších pomocných funkcí si uvedeme najednou na konci článku. Působivé je rovněž ze získané hodnoty vytvořit počet vteřin a ten za pomoci časovače dále inkrementovat, toto rozšíření jistě každý čtenář Intervalu zvládne „levou zadní“. Nyní tedy pouze volání funkce howLong:

theForm.daysonearth.value = howLong(birthyear,month,date);

Výpočet dne narození za nás udělá vestavěná metoda getDay objektu Date, je ovšem třeba pouze převést číslo dne z „amerického“ číslování na evropské a případně také vypsat adekvátní český název:

var tmpDays = [ „Pondělí“, „Úterý“, „Středa“, „Čtvrtek“, „Pátek“, „Sobota“, „Neděle“ ];
var w_day= new Date(birthyear,month-1,date);
w_day=w_day.getDay();
w_day=w_day==0?6:w_day-1
theForm.born.value=tmpDays[w_day];

Poslední činností, kterou funkce compute provádí, je uložení zadaného data narození do Cookie. Účel tohoto opatření si ozřejmíme v následujícím odstavci. Do cookie vkládáme informace prostřednictvím pomocného objektu MyCookie. Za kódem následuje jedna pravá složená závorka navíc jako ukončení definice celé funkce compute:

    MyCookie.Write( „AstroDay“, date, 1825 );
    MyCookie.Write( „AstroMonth“, month, 1825 );
    MyCookie.Write( „AstroYear“, birthyear, 1825 );
}

Proč ukládáme datum narození do Cookie? Jedna odpověď by zněla „Člověk nikdy neví, kdy se to může hodit.“ V tomto konkrétním případě je ale důvodem jedno drobné vylepšení – když už nám jednou návštěvník sdělil své datum narození, proč mu při příští návštěvě (připadne-li náhodou na jeho narozeniny) nepoblahopřát. Pokud se na váš server návštěvníci opakovaně vracejí, je tato možnost docela reálná, za cenu několika málo řádků kódu. Ostatně, vyzkoušejte si to sami Změníte-li například systémové datum svého počítače na stejný rok a měsíc, jako jste zadali do formuláře, a provedete-li reload této stránky, objeví se nad formulářem krátké blahopřání. Zde je potřebný kód:

var pomD = MyCookie.Read( „AstroDay“ );
var pomM = MyCookie.Read( „AstroMonth“ );
var pomY = MyCookie.Read( „AstroYear“ );
var pomDate = new Date();
if (pomD!=null) {
    if( (pomDate.getDate()==pomD) && (pomDate.getMonth()+1==pomM) ) {
        document.write( „<b><font color=’red‘>Všechno nejlepší k Vašim narozeninám!</font></b><br><br>“ );
    }
}

Zbývá uvést kód několika pomocných funkcí, jež byly v příkladu použity. MyCookie je obsluha zápisu a čtení do cookies, howLong počítá počet dnů od zadaného data a IsYearLeap zjišťuje, zda je zadaný rok přestupný či nikoliv:

var MyCookie = {
    Write:function(name,value,days) {
        var D = new Date();
        D.setTime(D.getTime()+86400000*days)
        document.cookie = escape(name)+“=“+escape(value)+
        ((days == null)?““:(„;expires=“+D.toGMTString()))
        return (this.Read(name) == value);
    },
    Read:function(name) {
        var EN=escape(name)
        var F=‘ ‚+document.cookie+‘;‘, S=F.indexOf(“+EN);
        return S==-1 ? null : unescape(F.substring(EN=S+EN.length+2,F.indexOf(‚;‘,EN)) );
    }
}
function IsYearLeap(y) {
    return ( (y%4 != 0) || (y%100 == 0 && y%400 != 0));
}
function howLong(yr, mo, dy) { //Parameters are calendar Year,Month,Day
    var nDate = new Date(); // current date (local)
    var nowTime = nDate.getTime(); // current time (UTC)
    var thenTime = Date.UTC(yr, mo-1, dy); // specified time (UTC)
    if (nowTime <thenTime) return „Datum je v budoucnosti“;
    return(Math.floor((nowTime-thenTime)/86400000));
}

Kompletní zdrojový kód příkladu najdete v textovém souboru.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *