/*
DynAPI Distribution
HTMLClock Class - based on Scrolling Clock script from The JavaScript Source!! (http://javascript.internet.com)
The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
Requires: HTMLContainer
*/
function HTMLClock(css){
this.HTMLContainer = HTMLContainer;
this.HTMLContainer(css,null,90,90);
this._Ypos =44;
this._Xpos =44;
this._Ybase = 8;
this._Xbase = 8;
this._dots = 12;
this._hLn = 4; // # dots for hours
this._mLn = 5; // # dots for minutes
this._sLn = 6; // # dots for seoncds
this._showTime();
};
var p = dynapi.setPrototype('HTMLClock','HTMLContainer');
// Design Properties
p.digitCol = '000000'; //digit colour.
p.secCol = 'ff0000'; //seconds colour.
p.minCol = '000000'; //minutes colour.
p.hourCol = '000000'; //hours colour.
// Methods
p._oldHCLKGetInnerHTML = HTMLContainer.prototype.getInnerHTML;
p._getDSValue = function(){return this._date}; // DataSource functions
p._setDSValue = dynapi.functions.Null;
p._build = function(){
var html='';
var attr,attrB;
if(dynapi.ua.ns4) {
attr = 'top=0 left=0 height=30 width=30';
attrB = 'top=0 left=0 bgcolor=@0 clip="0,0,2,2"';
for (i = 0; i < this._dots; i++) html+=this.HC.buildLayer(this.id+i+'Digits"',attr,'
'+(i+1)+'');
}
else {
attr ='style="visibility:hidden;position:absolute;left:0px;top:0px;width:30px;height:30px;font-family:Arial,Verdana;font-size:10px;color:'+this.digitCol+';text-align:center;padding-top:10px"';
attrB = 'style="visibility:hidden;position:absolute;left:0px;top:0px;width:2px;height:2px;font-size:2px;background-color:@0"';
for (i = 0; i < this._dots; i++) html+=this.HC.buildLayer(this.id+i+'Digits',attr,(i+1));
}
for (i = 0; i < this._mLn; i++) html+=this.HC.buildLayer(this.id+i+'Y',attrB.replace(/@0/,this.minCol),'');
for (i = 0; i < this._hLn; i++) html+=this.HC.buildLayer(this.id+i+'Z',attrB.replace(/@0/,this.hourCol),'');
for (i = 0; i < this._sLn; i++) html+=this.HC.buildLayer(this.id+i+'X',attrB.replace(/@0/,this.secCol),'');
html='';
this.html=html;
};
p._showTime = function() {
var x,y,lyr;
var time = new Date ();
var secs = time.getSeconds();
var sec = -1.57 + Math.PI * secs/30;
var mins = time.getMinutes();
var min = -1.57 + Math.PI * mins/30;
var hr = time.getHours();
var hrs = -1.57 + Math.PI * hr/6 + Math.PI*parseInt(time.getMinutes())/360;
if (this.getElm()) {
for (i = 0; i < this._dots; ++i){
lyr = this.HC.getLayerById(this.id+i+'Digits',this.doc);
y = this._Ypos - ((dynapi.ua.ns4)? 5:15) + 40 * Math.sin(-0.49+this._dots+i/1.9);
x = this._Xpos - ((dynapi.ua.ns4)? 15:14) + 40 * Math.cos(-0.49+this._dots+i/1.9);
lyr.setLocation(x,y);
lyr.setVisible(true);
}
for (i = 0; i < this._sLn; i++){
lyr = this.HC.getLayerById(this.id+i+'X',this.doc);
y = this._Ypos + i * this._Ybase * Math.sin(sec);
x = this._Xpos + i * this._Xbase * Math.cos(sec);
lyr.setLocation(x,y);
lyr.setVisible(true);
}
for (i = 0; i < this._mLn; i++){
lyr = this.HC.getLayerById(this.id+i+'Y',this.doc);
y = this._Ypos + i * this._Ybase * Math.sin(min);
x = this._Xpos + i * this._Xbase * Math.cos(min);
lyr.setLocation(x,y);
lyr.setVisible(true);
}
for (i = 0; i < this._hLn; i++){
lyr = this.HC.getLayerById(this.id+i+'Z',this.doc);
y = this._Ypos + i * this._Ybase * Math.sin(hrs);
x = this._Xpos + i * this._Xbase * Math.cos(hrs);
lyr.setLocation(x,y);
lyr.setVisible(true);
}
//check alarm
if(this._alarm){
var a = new Date(this._alarm);
if (a && (
a.getHours()==time.getHours() &&
a.getMinutes()==time.getMinutes() &&
a.getSeconds()==time.getSeconds()
)) {
this._alarm=null;
this.invokeEvent('alarm');
this._ePlaySnd('alarm');
}
}
}
// loop
window.setTimeout(this+'._showTime()', 50);
};
p.getInnerHTML = function(){
this._build();
return this._oldHCLKGetInnerHTML();
};
// Time format: [Date object] or Hours:Minutes:Seconds
p.setAlarm = function(dt){
if(typeof(dt)!='string') {
dt = new Date(dt);
if(!isNaN(dt)) this._alarm = dt;
}
else {
var d=new Date();
dt=(dt+'').split(':');
if(!isNaN(dt[0])) d.setHours(dt[0]||0);
if(!isNaN(dt[1])) d.setMinutes(dt[1]||0);
if(!isNaN(dt[2])) d.setSeconds(dt[2]||0);
this._alarm = d;
}
};