(function(){ var document = window.document; var scrollTop = document.body.scrollTop; var addHandler = document.body.addEventListener ? w3cAddEvent : ieAddEvent; var removeHandler = document.body.removeEventListener ? w3cRemoveEvent : ieRemoveEvent; var daysArray = ["SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"]; var monthsArray = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"]; function $$(selector){ return document.querySelectorAll(selector); } function getById(id){ return document.getElementById(id); } function w3cAddEvent(target, eventType, handler){ target.addEventListener(eventType, handler, false); } function ieAddEvent(target, eventType, handler){ target.attachEvent("on" + eventType, handler); } function w3cRemoveEvent(target, eventType, handler){ target.removeEventListener(eventType, handler, false); } function ieRemoveEvent(target, eventType, handler){ target.detachEvent("on" + eventType, handler); } function isIE(){ return navigator.userAgent.indexOf('MSIE') !== -1; }; function Clock(options){ options = options || {}; var dateColor = options.dateColor || '#000000'; var faceColor = options.faceColor || '#000000'; var secondsColor = options.secondsColor || '#00ff00'; var minutesColor = options.minutesColor || '#0000ff'; var hoursColor = options.hoursColor || '#ff0000'; var i, len; var todaysArray = null; var face = null; var hours = null; var minutes = null; var seconds = null; var split = null; var dsplit = null; var y, x, Y, X, Dx, Dy, DX, DY; //constants var clockHeight = 40; var clockWidth = 40; var clockFromMouseY = 0; var clockFromMouseX = 100; var font = 'Arial'; var size = 1; var dim = {}; dim.width = size * 10; dim.height = size * 10; var speed = 0.6; var ymouse = 0; var xmouse = 0; var handHeight = clockHeight / 4.5 var handWidth = clockWidth / 4.5 var handY = -7; var handX = -2.5; var step = 0.06; var currStep = 0; function init(){ todaysArray = getTodaysCharArray(); faces = getFacesCharArray(); hours = getHhoursCharArray(); minutes = getMinutesCharArray(); seconds = getSecondsCharArray(); split = 360 / faces.length; dsplit = 360 / todaysArray.length; initAllArray(); draw(); } function initAllArray(){ y = []; x = []; Y = []; X = []; for (i = 0, len = faces.length; i < len; i++) { y[i] = 0; x[i] = 0; Y[i] = 0; X[i] = 0 } Dy = []; Dx = []; DY = []; DX = []; for (i = 0, len = todaysArray.length; i < len; i++) { Dy[i] = 0; Dx[i] = 0; DY[i] = 0; DX[i] = 0; } } function getTodaysCharArray(){ var date = new Date(); var day = date.getDate(); var year = date.getYear(); if (year < 2000) year = year + 1900; var todaysDate = " " + daysArray[date.getDay()] + " " + day + " " + monthsArray[date.getMonth()] + " " + year; return todaysDate.split(''); } function getFacesCharArray(){ return '1 2 3 4 5 6 7 8 9 10 11 12'.split(' '); } function getHhoursCharArray(){ return '...'.split(''); } function getMinutesCharArray(){ return '....'.split(''); } function getSecondsCharArray(){ return '.....'.split(''); } function buildTodays(){ var props2 = "<font face=" + font + " size=" + size + " color=" + dateColor + "><B>"; var html = []; for (i = 0, len = todaysArray.length; i < len; i++) html.push('<div class="cDates" style="position:absolute;top:0px;left:0;height:' + dim.height + ';width:' + dim.width + ';text-align:center">' + props2 + todaysArray[i] + '</B></font></div>'); return html.join(''); } function buildFaces(){ var props = "<font face=" + font + " size=" + size + " color=" + faceColor + "><B>"; var html = []; for (i = 0, len = faces.length; i < len; i++) html.push('<div class="cFaces" style="position:absolute;top:0px;left:0;height:' + dim.height + ';width:' + dim.width + ';text-align:center">' + props + faces[i] + '</B></font></div>'); return html.join(''); } function buildHours(){ var html = []; for (i = 0, len = hours.length; i < len; i++) html.push('<div class="cHours" style="position:absolute;width:16px;height:16px;font-family:Arial;font-size:16px;color:' + hoursColor + ';text-align:center;font-weight:bold">' + hours[i] + '</div>'); return html.join(''); } function buildMinutes(){ var html = []; for (i = 0, len = minutes.length; i < len; i++) html.push('<div class="cMinutes" style="position:absolute;width:16px;height:16px;font-family:Arial;font-size:16px;color:' + minutesColor + ';text-align:center;font-weight:bold">' + minutes[i] + '</div>'); return html.join(''); } function buildSeconds(){ var html = []; for (i = 0, len = seconds.length; i < len; i++) html.push('<div class="cSeconds" style="position:absolute;width:16px;height:16px;font-family:Arial;font-size:16px;color:' + secondsColor + ';text-align:center;font-weight:bold">' + seconds[i] + '</div>'); return html.join(''); } function buildClockFace(){ var html = []; html.push('<div id="Od" style="position:absolute;top:0px;left:0px"><div style="position:relative">'); html.push(buildTodays()); html.push('</div></div>'); html.push('<div id="Of" style="position:absolute;top:0px;left:0px"><div style="position:relative">'); html.push(buildFaces()); html.push('</div></div>'); html.push('<div id="Oh" style="position:absolute;top:0px;left:0px"><div style="position:relative">'); html.push(buildHours()); html.push('</div></div>'); html.push('<div id="Om" style="position:absolute;top:0px;left:0px"><div style="position:relative">'); html.push(buildMinutes()); html.push('</div></div>') html.push('<div id="Os" style="position:absolute;top:0px;left:0px"><div style="position:relative">'); html.push(buildSeconds()); html.push('</div></div>') return html.join(''); } function setCFacesPos(){ getById("Of").style.top = scrollTop + 'px'; var cFaces = $$(".cFaces"); var cface; for (i = 0, len = cFaces.length; i < len; i++) { cface = cFaces[i]; cface.style.top = y[i] + clockHeight * Math.sin(-1.0471 + i * split * Math.PI / 180) + 'px'; cface.style.left = x[i] + clockWidth * Math.cos(-1.0471 + i * split * Math.PI / 180) + 'px'; } } function setCHoursPos(hrs){ getById("Oh").style.top = scrollTop + 'px'; var cHours = $$(".cHours"); var cHour; for (i = 0, len = cHours.length; i < len; i++) { cHour = cHours[i]; cHour.style.top = y[i] + handY + (i * handHeight) * Math.sin(hrs) + 'px'; cHour.style.left = x[i] + handX + (i * handWidth) * Math.cos(hrs) + 'px'; } } function setCMinutesPos(min){ getById("Om").style.top = scrollTop + 'px'; var cMinutes = $$(".cMinutes"); var cMinute; for (i = 0, len = cMinutes.length; i < len; i++) { cMinute = cMinutes[i]; cMinute.style.top = y[i] + handY + (i * handHeight) * Math.sin(min) + 'px'; cMinute.style.left = x[i] + handX + (i * handWidth) * Math.cos(min) + 'px'; } } function setCSecondsPos(sec){ getById("Os").style.top = scrollTop + 'px'; var cSeconds = $$(".cSeconds"); var cSecond; for (i = 0, len = cSeconds.length; i < len; i++) { cSecond = cSeconds[i]; cSecond.style.top = y[i] + handY + (i * handHeight) * Math.sin(sec) + 'px'; cSecond.style.left = x[i] + handX + (i * handWidth) * Math.cos(sec) + 'px'; } } function setCDatesPos(){ getById("Od").style.top = scrollTop + 'px'; var cDates = $$(".cDates"); var cDate; for (i = 0, len = cDates.length; i < len; i++) { cDate = cDates[i]; cDate.style.top = Dy[i] + clockHeight * 1.5 * Math.sin(currStep + i * dsplit * Math.PI / 180) + 'px'; cDate.style.left = Dx[i] + clockWidth * 1.5 * Math.cos(currStep + i * dsplit * Math.PI / 180) + 'px'; } currStep -= step; } function clockAndAssign(){ 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.575 + Math.PI * hr / 6 + Math.PI * parseInt(time.getMinutes()) / 360; setCFacesPos(); setCHoursPos(hrs); setCMinutesPos(min); setCSecondsPos(sec); setCDatesPos(); } function delay(){ Dy[0] = Math.round(DY[0] += ((ymouse) - DY[0]) * speed); Dx[0] = Math.round(DX[0] += ((xmouse) - DX[0]) * speed); for (i = 1, len = todaysArray.length; i < len; i++) { Dy[i] = Math.round(DY[i] += (Dy[i - 1] - DY[i]) * speed); Dx[i] = Math.round(DX[i] += (Dx[i - 1] - DX[i]) * speed); } y[0] = Math.round(Y[0] += ((ymouse) - Y[0]) * speed); x[0] = Math.round(X[0] += ((xmouse) - X[0]) * speed); for (i = 1, len = faces.length; i < len; i++) { y[i] = Math.round(Y[i] += (y[i - 1] - Y[i]) * speed); x[i] = Math.round(X[i] += (x[i - 1] - X[i]) * speed); } clockAndAssign(); } function draw(){ document.body.innerHTML += buildClockFace(); return this; } function start(){ addHandler(document, "mousemove", function(e){ e = e || window.event; ymouse = !isIE() ? e.pageY + clockFromMouseY : e.y + clockFromMouseY; xmouse = !isIE() ? e.pageX + clockFromMouseX : e.x + clockFromMouseX; }); addHandler(window, "load", function(e){ window.clockTimer = setInterval(delay, 20); }); return this; } function stop(){ clearInterval(window.clockTimer); return this; } init(); return { draw: draw, start: start, stop: stop }; } window.Clock = Clock; })(); Clock().start();