Kapesní astrolog
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> <select name=’month‘>“ );
for( j=1; j<=12; j+=1 ) {
document.write( „<option value='“+j+“‚>“ + j + „</option>“ );
}
document.write( „</select> <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.
Mohlo by vás také zajímat
-
Landing page: Jak vytvořit landing page s vysokým CTR
7. května 2024 -
Regulace digitálních služeb: Co přináší nové nařízení DSA?
20. února 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
AI v programování: Jak používat GitHub Copilot (část 1)
12. února 2024
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024