Studijní materiál - javascriptový kód modulu, který vypočte a zobrazí kondiciogram.

Kdo chce zkoumat, jak jsou nějaké javascripty dělané, může si samozřejmě vždy najít ve zkoumané stránce, odkud se javaskript tahá a stáhnout si ho. Nejsem zastáncem utajování, když na to někdo má, nechť kopíruje...


Date.months = 'leden.únor.březen.duben.květen.červen.červenec.srpen.září.říjen.listopad.prosinec'.split('.');

Date.prototype.getMyString = function()
{
	var out = this.getDate() + '. ';
	out += Date.months[this.getMonth()] + ' ';
	out += this.getFullYear();
	return out;
};

var rg = /([0-9]{1,2})[^0-9]([0-9]{1,2})[^0-9]([0-9]{1,4})/g;

var kgram = {
    init: function()
    {
	var dv = document.createElement('div');
	dv.setAttribute('id', 'kgram');
	dv.style.cssText = 'position: absolute; top: 200px; right: 140px; background-color: gray; padding: 12px; border: ridge 3px limegreen;';
	var df = document.createElement('form');
	var dtb = document.createElement('table');
	var dtbb = document.createElement('tbody');
	var dtr = document.createElement('tr');
	var dtd = document.createElement('td');
	df.style.cssText = 'padding: 12px 6px 12px 6px';
	dtd.appendChild(document.createTextNode('Datum narození:'));
	dtr.appendChild(dtd);
	var di = document.createElement('input');
	di.setAttribute('type', 'text');
	di.setAttribute('size', 8);
	di.setAttribute('name', 'f_datnar');
	dtd = document.createElement('td');
	dtd.appendChild(di);
	dtr.appendChild(dtd);
	dtbb.appendChild(dtr);
	dtr = document.createElement('tr');
	dtd = document.createElement('td');
	dtd.appendChild(document.createTextNode('[DD.MM.RRRR]'));
	dtr.appendChild(dtd);
	di = document.createElement('input');
	di.setAttribute('type', 'submit');
	di.setAttribute('value', 'Výpočet');
	di.style.cssText = 'margin: 0; padding: 0 4px;';
	di.onclick = function() { return kgram.view(this.form[0].value); };
	dtd = document.createElement('td');
	dtd.style.textAlign = 'right';
	dtd.appendChild(di);
	dtr.appendChild(dtd);
	dtbb.appendChild(dtr);
	dtb.appendChild(dtbb);
	df.appendChild(dtb);
	dv.appendChild(df);
	document.body.appendChild(dv);
	df.elements[0].focus();
    },
    viewErr: function(er)
    {
	var errs = [
	    'Nepodařilo se parsovat zadané datum!',
	    'Den mimo rozsah!',
	    'Měsíc mimo rozsah!',
	    'Pokud chcete kondiciogram pro historickou postavu, narozenou od druhého století, zkuste na začátku roku nuly, mělo by to jít. Ale počítejte s tím, že program pracuje s Gregoriánským kalendářem zavedeným o něco později - 1582, u nás 1584!',
	    'Když ještě není na světě, nač kondiciogram pro tento měsíc?'
	];
	var dv = document.getElementById('kgram');
	var erdspn = document.createElement('span');
	erdspn.setAttribute('id', 'error');
	erdspn.appendChild(document.createTextNode(errs[er]));
	erdspn.style.backgroundColor = 'orange';
	erdspn.style.display = 'inline-block';
	erdspn.style.width = '20em';
	dv.appendChild(erdspn);
	return false;
    },
    view: function(a)
    {
	var AMPLITUDE = 60;
	var STEP = 6;
	var del = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	var dny = ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'];
	var aa;
	var dv = document.getElementById('kgram');
	var erdspn;
	if(erdspn = document.getElementById('error'))
	{
	    dv.removeChild(erdspn);
	};
	try {
	    aa = rg.exec(a);
	    aa.shift();
	} catch(er)
	{
	    return kgram.viewErr(0);
	}
	if(aa[1] < 1) return kgram.viewErr(2);
	if(aa[1] > 12) return kgram.viewErr(2);
	if(aa[0] < 1) return kgram.viewErr(1);
	if(aa[0] > del[aa[1] - 1]) return kgram.viewErr(1);
	if(aa[2].toString().length < 4) return  kgram.viewErr(3);

	var ad;
	try { ad = new Date(aa[2], aa[1] - 1, aa[0]); } catch(er) { return kgram.viewErr(0); };

	var now = new Date; var den = now.getDate();
	var moc = new Date(now.getFullYear(), now.getMonth() + 1, 1);
	if(ad >= moc) return  kgram.viewErr(4);

	while(dv.firstChild) { dv.removeChild(dv.firstChild); };
	var dtob = document.createElement('table');
	var dtbob = document.createElement('tbody');
	var dtrob = document.createElement('tr');
	var dtdob = document.createElement('td');
	var dt = document.createElement('table');
	var dtb = document.createElement('tbody');
	var dtr1 = document.createElement('tr');
	var dtr2 = document.createElement('tr');
	var dtr3 = document.createElement('tr');
	var dtd1, dtd2, dtd3, dimg;
	var dc = document.createElement('caption');
	dc.style.cssText = 'text-align: left; padding: 0 0 12px 2em; font-family: "MS Sans Serif"; font-size: 13px;';
	dc.appendChild(document.createTextNode('Narození: '));
	var dsp = document.createElement('span');
	dsp.style.cssText = 'background-color: white; padding: 0 .4em;';
	dsp.appendChild(document.createTextNode(ad.getMyString()));
	dc.appendChild(dsp);
	dc.appendChild(document.createTextNode(', kondiciogram pro '));
	dsp = document.createElement('span');
	dsp.style.cssText = 'background-color: white; padding: 0 .4em;';
	dsp.appendChild(document.createTextNode(Date.months[now.getMonth()] + ' ' + now.getFullYear()));
	dc.appendChild(dsp);
	var dii = document.createElement('img');
	dii.setAttribute('src', 'img/refr.gif');
	dii.style.cssText = 'position: absolute; top: 0; right: 0; cursor: pointer; border: none; margin: 3px 3px 0 0;';
	dii.onclick = kgram.refr;
	dc.appendChild(dii);
	dt.appendChild(dc);
	var sest = [
	    {name: 'ph', cykl: 23, title: 'fyzická'},
	    {name: 'sens', cykl: 28, title: 'citová'},
	    {name: 'reas', cykl: 33, title: 'rozumová'}
	];
	var sin, j, b;
	var lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0);
	for(var i = 1; i <= lastDay.getDate(); i++)
	{
	    j = new Date(now.getFullYear(), now.getMonth(), i);
	    b = Math.floor((j.getTime() - ad.getTime()) / 3600000 / 24);
	    dtd1 = document.createElement('td');
	    dtd1.style.cssText = 'vertical-align: bottom;';
	    dtd2 = document.createElement('td');
	    dtd2.style.cssText = 'vertical-align: top;';
	    for(var k = 0; k < sest.length; k++)
	    {
		sin = kgram.sinVyp(b, sest[k].cykl);
		if(sin > 0) {
		    dimg = document.createElement('img');
		    dimg.setAttribute('src', 'img/' + sest[k].name + '.gif');
		    dimg.setAttribute('width', STEP);
		    dimg.setAttribute('height', Math.ceil(sin * AMPLITUDE));
		    dimg.style.verticalAlign = 'bottom';
		    dtd1.appendChild(dimg);
		    dtr1.appendChild(dtd1);
		    dimg = document.createElement('img');
		    dimg.setAttribute('src', 'img/null.gif');
		    dimg.setAttribute('width', STEP);
		    dimg.setAttribute('height', 0);
		    dtd2.appendChild(dimg);
		    dtr2.appendChild(dtd2);
		} else {
		    dimg = document.createElement('img');
		    dimg.setAttribute('src', 'img/null.gif');
		    dimg.setAttribute('width', STEP);
		    dimg.setAttribute('height', 0);
		    dtd1.appendChild(dimg);
		    dtr1.appendChild(dtd1);
		    dimg = document.createElement('img');
		    dimg.setAttribute('src', 'img/' + sest[k].name + '.gif');
		    dimg.setAttribute('width', STEP);
		    dimg.setAttribute('height', Math.ceil(-1 * sin * AMPLITUDE));
		    dimg.style.verticalAlign = 'top';
		    dtd2.appendChild(dimg);
		    dtr2.appendChild(dtd2);
		}
	    };
	    dtd3 = document.createElement('td');
	    dtd3.style.cssText = 'font-size: 12px; text-align: center;';
	    if( i == den ) dtd3.style.backgroundColor = 'white';
	    dtd3.appendChild(document.createTextNode(i));
	    dtd3.appendChild(document.createElement('br'));
	    dtd3.appendChild(document.createTextNode(dny[j.getDay()]));
	    dtr3.appendChild(dtd3);
	};
	dtb.appendChild(dtr1);
	dtb.appendChild(dtr2);
	dtb.appendChild(dtr3);
	dt.appendChild(dtb);
	dtdob.appendChild(dt);
	dtrob.appendChild(dtdob);
	dtbob.appendChild(dtrob);
	
	dtrob = document.createElement('tr');
	var dtd = document.createElement('td');
	var dth = document.createElement('hr');
	dtd.appendChild(dth);
	dtd.appendChild(document.createTextNode('Legenda: kondiční křivka - '));
	for(k = 0; k < sest.length; k++)
	{
	    dts = document.createElement('span');
	    dts.appendChild(document.createTextNode(sest[k].title));
	    dts.style.padding = '3px .6em';
	    dts.style.backgroundImage = "url( 'img/" + sest[k].name + ".gif' )";
	    dtd.appendChild(dts);
	};
	dtrob.appendChild(dtd);
	dtbob.style.cssText = 'text-align: right; padding: 2px 2em;';
	dtbob.appendChild(dtrob);

	dtob.appendChild(dtbob);
	dv.appendChild(dtob);
	return false;
    },
    sinVyp: function(a, cykl)
    {
	return Math.sin((a % cykl) * 2 * Math.PI / cykl);
    },
    refr: function()
    {
	location.reload();
    }
};

core.add( kgram.init );