var analogClock = function (divElem, index) {
this.mainElem = divElem;
this.index = index;
var numStyles = Array();
numStyles["1"] = Array("1","2","3","4","5","6","7","8","9","10","11","12");
numStyles["i"] = Array("i","ii","iii","iv","v","vi","vii","viii","ix","x","xi","xii");
numStyles["I"] = Array("I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII");
numStyles["."] = Array("·","·","—","·","·","|","·","·","—","·","·","||");
this.position = analogClock.prototypes.position;
numstyle = String(this.mainElem.getAttribute('numstyle'));
if ("1I.".indexOf(numstyle.toUpperCase())==-1) numstyle="1";
var numstyle=numStyles[numstyle];
var radius = Math.floor(parseInt(this.mainElem.getAttribute('size'))/2);
if (isNaN(radius)) radius=50;
this.mainElem.style.width=radius*2;
this.mainElem.style.height=radius*2;
this.mainElem.style.position='relative';
this.mainElem.style.overflow='hidden';
this.mainElem.style.margin='0px';
this.mainElem.style.padding='0px';
//Create Hour labels
this.hourLabels = Array();
for (var i=0; i<12; i++) {
this.hourLabels[i]=document.createElement("div");
this.hourLabels[i].appendChild(document.createTextNode(numstyle[i]));
this.hourLabels[i].style.position='absolute';
this.mainElem.appendChild(this.hourLabels[i]);
}
var numhours = Math.floor(radius*0.5);
this.hourHand = Array();
for (i=0; i<numhours; i++) {
this.hourHand[i]=document.createElement("div");
this.hourHand[i].style.backgroundColor=this.mainElem.getAttribute("hours");
this.hourHand[i].style.width=Math.ceil(radius*3/75)+1;
this.hourHand[i].style.height=Math.ceil(radius*3/75)+1;
this.hourHand[i].style.position='absolute';
this.hourHand[i].style.overflow='hidden';
this.mainElem.appendChild(this.hourHand[i]);
}
var numminutes = Math.floor(radius*0.75);
this.minuteHand = Array();
for (i=0; i<numminutes; i++) {
this.minuteHand[i]=document.createElement("div");
this.minuteHand[i].style.backgroundColor=this.mainElem.getAttribute("minutes");
this.minuteHand[i].style.width=Math.round(radius*2/75)+1;
this.minuteHand[i].style.height=Math.round(radius*2/75)+1;
this.minuteHand[i].style.position='absolute';
this.minuteHand[i].style.overflow='hidden';
this.mainElem.appendChild(this.minuteHand[i]);
}
var numseconds = Math.floor(radius*0.90);
this.secondHand = Array();
for (i=0; i<numseconds; i++) {
this.secondHand[i]=document.createElement("div");
this.secondHand[i].style.backgroundColor=this.mainElem.getAttribute("seconds");
this.secondHand[i].style.width=Math.floor(radius*1/75)+1;
this.secondHand[i].style.height=Math.floor(radius*1/75)+1;
this.secondHand[i].style.position='absolute';
this.secondHand[i].style.overflow='hidden';
this.mainElem.appendChild(this.secondHand[i]);
}
this.AmPm=document.createElement("div");
this.AmPm.style.position="absolute";
this.mainElem.appendChild(this.AmPm);
this.DoW=document.createElement("div");
this.DoW.style.position="absolute";
this.mainElem.appendChild(this.DoW);
this.City=document.createElement("div");
this.City.style.position="absolute";
this.City.font="8pt Times";
this.mainElem.appendChild(this.City);
this.Country=document.createElement("div");
this.Country.style.position="absolute";
this.Country.font="8pt Times";
this.mainElem.appendChild(this.Country);
this.position();
}
analogClock.prototypes = Array();
analogClock.prototypes.position = function () {
var Week = Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
var radius = Math.floor(parseInt(this.mainElem.getAttribute('size'))/2);
if (isNaN(radius)) radius=50;
var Today = new Date();
var Mills = Today.getMilliseconds();
var Second = Today.getSeconds()+Mills/1000;
var Minute = Today.getMinutes()+Second/60;
var Hour = Today.getHours()+Minute/60;
if (this.mainElem.getAttribute('tick')) {
Hour=Math.floor(Hour);
Minute=Math.floor(Minute);
Second=Math.floor(Second);
}
if ("1\\yes\\true".indexOf(this.mainElem.getAttribute('localzone').toLowerCase())==-1) {
Hour-=analogClock.getGMT();
cz=parseInt(this.mainElem.getAttribute('clockzone'));
Hour+=cz+analogClock.needDST(cz);
}
while (Hour>=24) Hour-=12;
while (Hour<0) Hour+=12;
for (var i=0; i<this.hourLabels.length; i++) {
radpos = (i+1)*2*Math.PI/12-Math.PI/2;
this.hourLabels[i].style.top=radius+Math.sin(radpos)*radius*0.90-parseInt(this.hourLabels[i].offsetHeight)/2;
this.hourLabels[i].style.left=radius+Math.cos(radpos)*radius*0.90-parseInt(this.hourLabels[i].offsetWidth)/2;
}
radpos=(Hour%12)*Math.PI*2/12-Math.PI/2;
for (i=0; i<this.hourHand.length; i++) {
this.hourHand[i].style.top=radius+Math.sin(radpos)*i;
this.hourHand[i].style.left=radius+Math.cos(radpos)*i;
}
radpos=Minute*Math.PI*2/60-Math.PI/2;
for (i=0; i<this.minuteHand.length; i++) {
this.minuteHand[i].style.top=radius+Math.sin(radpos)*i;
this.minuteHand[i].style.left=radius+Math.cos(radpos)*i;
}
radpos=Second*Math.PI*2/60-Math.PI/2;
for (i=0; i<this.secondHand.length; i++) {
this.secondHand[i].style.top=radius+Math.sin(radpos)*i;
this.secondHand[i].style.left=radius+Math.cos(radpos)*i;
}
this.AmPm.innerHTML=(Hour>=12)?"PM":"AM";
this.AmPm.style.bottom=1.333*radius;
this.AmPm.style.left=radius-parseInt(this.AmPm.offsetWidth)/2;
this.AmPm.style.zIndex=-1;
this.DoW.innerHTML=Week[Today.getDay()];
this.DoW.style.top=0.666*radius;
this.DoW.style.left=radius-parseInt(this.DoW.offsetWidth)/2;
this.DoW.style.zIndex=-1;
this.City.innerHTML=this.mainElem.getAttribute('city');
this.City.style.bottom=0.666*radius;
this.City.style.left=radius-parseInt(this.City.offsetWidth)/2;
this.City.style.zIndex=-1;
this.Country.innerHTML=this.mainElem.getAttribute('country');
this.Country.style.top=1.333*radius;
this.Country.style.left=radius-parseInt(this.Country.offsetWidth)/2;
this.Country.style.zIndex=-1;
}
analogClock.arClocks = new Array();
analogClock.replace = function () {
var Divs = document.getElementsByTagName('div');
for (var i=0; i<Divs.length; i++)
if (Divs[i].className.toLowerCase().indexOf("analogclock")!=-1)
analogClock.arClocks[analogClock.arClocks.length]=new analogClock(Divs[i],analogClock.arClocks.length);
setTimeout('analogClock.update();', 100);
}
analogClock.update = function () {
for (var i=0; i<analogClock.arClocks.length; i++)
analogClock.arClocks[i].position();
var interval = Math.floor(50*Math.pow(analogClock.arClocks.length,1.5));
setTimeout('analogClock.update();', (analogClock.active)?(interval):(1000))
}
analogClock.getGMT = function () {
var day;
var Today = new Date();
var gmtAdjust=-Today.getTimezoneOffset()/60;
var lsm = new Date;
var lso = new Date;
lsm.setMonth(2); lsm.setDate(31); day = lsm.getDay(); lsm.setDate(31-day);
lso.setMonth(9); lso.setDate(31); day = lso.getDay(); lso.setDate(31-day);
if (Today < lsm || Today >= lso) gmtAdjust -= 1;
return gmtAdjust;
}
analogClock.needDST = function (a) {
if ((a<-8)||(a>-5)) return 0;
var day;
var Today = new Date();
var dst=0;
var lsm = new Date;
var lso = new Date;
lsm.setMonth(2); lsm.setDate(31); day = lsm.getDay(); lsm.setDate(31-day);
lso.setMonth(9); lso.setDate(31); day = lso.getDay(); lso.setDate(31-day);
if (Today >= lsm || Today < lso) dst = 1;
return dst;
}
analogClock.suspend = function () {
analogClock.active=false;
}
analogClock.resume = function () {
analogClock.active=true;
}
analogClock.attach = function () {
if (window.attachEvent) {
window.attachEvent('onload',analogClock.replace);
window.attachEvent('onblur',analogClock.suspend);
window.attachEvent('onfocus',analogClock.resume);
}
if (window.addEventListener) {
window.addEventListener('load',analogClock.replace,false);
window.addEventListener('blur',analogClock.suspend,false);
window.addEventListener('focus',analogClock.resume,false);
}
}
analogClock.active=true;
analogClock.attach();