171 lines
4.4 KiB
JavaScript
171 lines
4.4 KiB
JavaScript
|
/*!
|
||
|
* jquery.tzineClock.js - Tutorialzine Colorful Clock Plugin
|
||
|
*
|
||
|
* Copyright (c) 2009 Martin Angelov
|
||
|
* http://tutorialzine.com/
|
||
|
*
|
||
|
* Licensed under MIT
|
||
|
* http://www.opensource.org/licenses/mit-license.php
|
||
|
*
|
||
|
* Launch : December 2009
|
||
|
* Version : 1.0
|
||
|
* Released: Monday 28th December, 2009 - 00:00
|
||
|
*/
|
||
|
|
||
|
(function($){
|
||
|
|
||
|
// A global array used by the functions of the plug-in:
|
||
|
var gVars = {};
|
||
|
|
||
|
// Extending the jQuery core:
|
||
|
$.fn.tzineClock = function(opts){
|
||
|
|
||
|
// "this" contains the elements that were selected when calling the plugin: $('elements').tzineClock();
|
||
|
// If the selector returned more than one element, use the first one:
|
||
|
|
||
|
var container = this.eq(0);
|
||
|
|
||
|
if(!container)
|
||
|
{
|
||
|
try{
|
||
|
console.log("Invalid selector!");
|
||
|
} catch(e){}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if(!opts) opts = {};
|
||
|
|
||
|
var defaults = {
|
||
|
/* Additional options will be added in future versions of the plugin. */
|
||
|
};
|
||
|
|
||
|
/* Merging the provided options with the default ones (will be used in future versions of the plugin): */
|
||
|
$.each(defaults,function(k,v){
|
||
|
opts[k] = opts[k] || defaults[k];
|
||
|
})
|
||
|
|
||
|
// Calling the setUp function and passing the container,
|
||
|
// will be available to the setUp function as "this":
|
||
|
setUp.call(container);
|
||
|
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
function setUp()
|
||
|
{
|
||
|
// The colors of the dials:
|
||
|
var colors = ['orange','blue','green'];
|
||
|
|
||
|
var tmp;
|
||
|
|
||
|
for(var i=0;i<3;i++)
|
||
|
{
|
||
|
// Creating a new element and setting the color as a class name:
|
||
|
|
||
|
tmp = $('<div>').attr('class',colors[i]+' clock').html(
|
||
|
'<div class="display"></div>'+
|
||
|
|
||
|
'<div class="front left"></div>'+
|
||
|
|
||
|
'<div class="rotate left">'+
|
||
|
'<div class="bg left"></div>'+
|
||
|
'</div>'+
|
||
|
|
||
|
'<div class="rotate right">'+
|
||
|
'<div class="bg right"></div>'+
|
||
|
'</div>'
|
||
|
);
|
||
|
|
||
|
// Appending to the container:
|
||
|
$(this).append(tmp);
|
||
|
|
||
|
// Assigning some of the elements as variables for speed:
|
||
|
tmp.rotateLeft = tmp.find('.rotate.left');
|
||
|
tmp.rotateRight = tmp.find('.rotate.right');
|
||
|
tmp.display = tmp.find('.display');
|
||
|
|
||
|
// Adding the dial as a global variable. Will be available as gVars.colorName
|
||
|
gVars[colors[i]] = tmp;
|
||
|
}
|
||
|
|
||
|
// Setting up a interval, executed every 1000 milliseconds:
|
||
|
setInterval(function(){
|
||
|
|
||
|
var currentTime = new Date();
|
||
|
var h = currentTime.getHours();
|
||
|
var m = currentTime.getMinutes();
|
||
|
var s = currentTime.getSeconds();
|
||
|
|
||
|
animation(gVars.green, s, 60);
|
||
|
animation(gVars.blue, m, 60);
|
||
|
animation(gVars.orange, h, 24);
|
||
|
|
||
|
},1000);
|
||
|
}
|
||
|
|
||
|
function animation(clock, current, total)
|
||
|
{
|
||
|
// Calculating the current angle:
|
||
|
var angle = (360/total)*(current+1);
|
||
|
|
||
|
var element;
|
||
|
|
||
|
if(current==0)
|
||
|
{
|
||
|
// Hiding the right half of the background:
|
||
|
clock.rotateRight.hide();
|
||
|
|
||
|
// Resetting the rotation of the left part:
|
||
|
rotateElement(clock.rotateLeft,0);
|
||
|
}
|
||
|
|
||
|
if(angle<=180)
|
||
|
{
|
||
|
// The left part is rotated, and the right is currently hidden:
|
||
|
element = clock.rotateLeft;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// The first part of the rotation has completed, so we start rotating the right part:
|
||
|
clock.rotateRight.show();
|
||
|
clock.rotateLeft.show();
|
||
|
|
||
|
rotateElement(clock.rotateLeft,180);
|
||
|
|
||
|
element = clock.rotateRight;
|
||
|
angle = angle-180;
|
||
|
}
|
||
|
|
||
|
rotateElement(element,angle);
|
||
|
|
||
|
// Setting the text inside of the display element, inserting a leading zero if needed:
|
||
|
clock.display.html(current<10?'0'+current:current);
|
||
|
}
|
||
|
|
||
|
function rotateElement(element,angle)
|
||
|
{
|
||
|
// Rotating the element, depending on the browser:
|
||
|
var rotate = 'rotate('+angle+'deg)';
|
||
|
|
||
|
if(element.css('MozTransform')!=undefined)
|
||
|
element.css('MozTransform',rotate);
|
||
|
|
||
|
else if(element.css('WebkitTransform')!=undefined)
|
||
|
element.css('WebkitTransform',rotate);
|
||
|
|
||
|
// A version for internet explorer using filters, works but is a bit buggy (no surprise here):
|
||
|
else if(element.css("filter")!=undefined)
|
||
|
{
|
||
|
var cos = Math.cos(Math.PI * 2 / 360 * angle);
|
||
|
var sin = Math.sin(Math.PI * 2 / 360 * angle);
|
||
|
|
||
|
element.css("filter","progid:DXImageTransform.Microsoft.Matrix(M11="+cos+",M12=-"+sin+",M21="+sin+",M22="+cos+",SizingMethod='auto expand',FilterType='nearest neighbor')");
|
||
|
|
||
|
element.css("left",-Math.floor((element.width()-200)/2));
|
||
|
element.css("top",-Math.floor((element.height()-200)/2));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
})(jQuery)
|