RingMenu.js
Summary
No overview generated for 'RingMenu.js'
function RingMenu(){
this.menuNum = 0;
this.posX = 0;
this.posY = 0;
this.visible = false;
this.url = new Array(20);
this.image = new Array(20);
this.frameImage = '';
this.angle = new Array(20);
this.feedInterval = 20;
this.feedCount = 0;
this.maxTimerCount = 20;
this.feedAngle = 180;
this.feedInId = '';
this.feedOutId = '';
this.roleId = '';
this.movePageId = '';
this.roleCount = 0;
this.maxRoleCount = 5;
this.minRadius = 100;
this.maxRadius = 500;
this.selectedId = 0;
this.blinkCount = 0;
this.maxBlinkCount = 5;
this.idPrefixName = "imgRingMenu";
this.framePostfixName = new Array("TL","TR","BL","BR");
this.addMenu = function(imageUrl,linkUrl){
this.image[this.menuNum] = new Image();
this.image[this.menuNum].src = imageUrl;
this.url[this.menuNum] = linkUrl;
this.menuNum ++;
}
this.setFrameImage = function(imageUrl){
this.frameImage = new Image();
this.frameImage.src = imageUrl;
}
this.init = function(){
Event.observe(document, "mousedown",this.clickEvent.bind(this), false);
Event.observe(document, "contextmenu",this.contextMenuEvent.bind(this), false);
Event.observe(document, "dblclick",this.dblClickEvent.bind(this), false);
Event.observe(document, "mousemove", this.mouseMoveEvent.bind(this), false);
if(Prototype.Browser.Opera){
document.addEventListener("keypress",this.keyPressEvent.bind(this),false);
}
else{
Event.observe(document, "keydown", this.keyPressEvent.bind(this), false);
}
Event.observe(document, "mousewheel", this.mouseWheelEvent.bind(this), false);
Event.observe(document, "DOMMouseScroll", this.mouseWheelEvent.bind(this), false);
for(var i = 0; i < this.menuNum; i ++){
this.angle[i] = 90 - i*360/this.menuNum;
var imageObj = document.createElement("img");
imageObj.setAttribute("src",this.image[i].src);
imageObj.setAttribute("id",this.idPrefixName + i);
imageObj.style.position = 'absolute';
imageObj.style.top = -1000;
imageObj.style.left = -1000;
document.body.appendChild(imageObj);
}
if(this.frameImage != ''){
var w = this.frameImage.width;
var l = this.frameImage.height;
for(var i = 0; i < 4; i ++){
var imageObjFrame = document.createElement("img");
imageObjFrame.setAttribute("src",this.frameImage.src);
imageObjFrame.setAttribute("id",this.idPrefixName + this.framePostfixName[i]);
if(i == 0){
imageObjFrame.style.clip = "rect(0," + w/2 + "," + l/2 + ",0)";
}
else if(i == 1){
imageObjFrame.style.clip = "rect(0," + w + "," + l/2 + "," + (w/2 + 1) + ")";
}
else if(i == 2){
imageObjFrame.style.clip = "rect(" + (l/2 + 1) + "," + w/2 + "," + l + ",0)";
}
else if(i == 3){
imageObjFrame.style.clip = "rect(" + (l/2 + 1) + "," + w + "," + l + "," + (w/2 + 1) + ")";
}
imageObjFrame.style.position = 'absolute';
imageObjFrame.style.top = -1000;
imageObjFrame.style.left = -1000;
document.body.appendChild(imageObjFrame);
}
}
}
this.startFeedIn = function(){
this.feedCount = 0;
this.feedInId = setInterval((function(){this.feedIn()}).bind(this),this.feedInterval);
}
this.feedIn = function(){
this.feedCount = this.feedCount + 1;
var length = (this.maxRadius - this.minRadius)*(this.maxTimerCount - this.feedCount)/this.maxTimerCount;
var angle = this.feedAngle*(this.maxTimerCount - this.feedCount)/this.maxTimerCount;
for(var j = 0; j < this.menuNum; j ++){
var angleIndex = (j - this.selectedId + this.menuNum)%this.menuNum;
document.getElementById(this.idPrefixName + j).style.left = this.posX - this.image[j].width/2 + (this.minRadius + length)*Math.cos((this.angle[angleIndex] + angle)/180*Math.PI);
document.getElementById(this.idPrefixName + j).style.top = this.posY - this.image[j].height/2 - (this.minRadius + length)*Math.sin((this.angle[angleIndex] + angle)/180*Math.PI);
}
if(this.feedCount >= this.maxTimerCount){
clearInterval(this.feedInId);
this.feedInId = '';
this.frameShow();
this.visible = true;
}
}
this.startFeedOut = function(){
clearInterval(this.feedInId);
this.feedInId = '';
this.feedCount = 0;
this.feedOutId = setInterval((function(){this.feedOut()}).bind(this),this.feedInterval);
}
this.feedOut = function(){
if(this.frameImage != ''){
for(var i = 0; i < 4; i ++){
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.left = -1000;
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.top = -1000;
}
}
this.feedCount = this.feedCount + 1;
var length = (this.maxRadius - this.minRadius)*this.feedCount/this.maxTimerCount;
var angle = this.feedAngle*this.feedCount/this.maxTimerCount;
for(var j = 0; j < this.menuNum; j ++){
var angleIndex = (j - this.selectedId + this.menuNum)%this.menuNum;
document.getElementById(this.idPrefixName + j).style.left = this.posX - this.image[j].width/2 + (this.minRadius + length)*Math.cos((this.angle[angleIndex] + angle)/180*Math.PI);
document.getElementById(this.idPrefixName + j).style.top = this.posY - this.image[j].height/2 - (this.minRadius + length)*Math.sin((this.angle[angleIndex] + angle)/180*Math.PI);
}
if(this.feedCount >= this.maxTimerCount){
clearInterval(this.feedOutId);
this.feedOutId = '';
for(var j = 0; j < this.menuNum; j ++){
document.getElementById(this.idPrefixName + j).style.top = -1000;
document.getElementById(this.idPrefixName + j).style.left = -1000;
}
this.visible = false;
}
}
this.startMovePage = function () {
this.blinkCount = 0;
this.movePageId = setInterval((function(){this.movePage()}).bind(this),200);
}
this.movePage = function () {
this.blinkCount = this.blinkCount + 1;
document.getElementById(this.idPrefixName + this.selectedId).style.visibility = (document.getElementById(this.idPrefixName + this.selectedId).style.visibility == "visible") ? "hidden" : "visible";
if(this.blinkCount >= this.maxBlinkCount){
clearInterval(this.movePageId);
document.getElementById(this.idPrefixName + this.selectedId).style.visibility = 'visible';
setTimeout((function(){location.href = this.url[this.selectedId];}).bind(this),500);
}
}
this.startRoleMenu = function (direction){
if(direction == 'left'){
this.roleCount = 0;
this.selectedId = (this.selectedId + 1) % this.menuNum;
this.roleId = setInterval((function(){this.roleMenu('left')}).bind(this),this.feedInterval);
}
if(direction == 'right'){
this.roleCount = 0;
this.selectedId = (this.selectedId + this.menuNum - 1) % this.menuNum;
this.roleId = setInterval((function(){this.roleMenu('right')}).bind(this),this.feedInterval);
}
}
this.roleMenu = function (direction){
this.roleCount = this.roleCount + 1;
var angle = 0;
if(direction == 'left'){
angle = (360/this.menuNum)*((this.maxRoleCount - this.roleCount)/this.maxRoleCount)*-1;
}
else{
angle = (360/this.menuNum)*((this.maxRoleCount - this.roleCount)/this.maxRoleCount);
}
for(var j = 0; j < this.menuNum; j ++){
var angleIndex = (j - this.selectedId + this.menuNum)%this.menuNum;
document.getElementById(this.idPrefixName + j).style.left = this.posX - this.image[j].width/2 + this.minRadius*Math.cos((this.angle[angleIndex] + angle)/180*Math.PI);
document.getElementById(this.idPrefixName + j).style.top = this.posY - this.image[j].height/2 - this.minRadius*Math.sin((this.angle[angleIndex] + angle)/180*Math.PI);
}
if(this.roleCount >= this.maxRoleCount){
clearInterval(this.roleId);
this.roleId = '';
this.frameShow();
}
}
this.frameShow = function (){
if(this.frameImage != ''){
var w = this.frameImage.width;
var l = this.frameImage.height;
var baseX = this.posX - this.image[this.selectedId].width/2;
var baseY = this.posY - this.image[this.selectedId].height/2 - this.minRadius;
for(var i = 0; i < 4; i ++){
if(i == 0){
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.left = baseX;
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.top = baseY;
}
else if(i == 1){
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.left = baseX + (this.image[this.selectedId].width - w);
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.top = baseY;
}
else if(i == 2){
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.left = baseX;
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.top = baseY + (this.image[this.selectedId].height - l);
}
else if(i == 3){
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.left = baseX + (this.image[this.selectedId].width - w);
document.getElementById(this.idPrefixName + this.framePostfixName[i]).style.top = baseY + (this.image[this.selectedId].height - l);
}
}
}
}
this.keyPressEvent = function(event){
if(this.feedInId == '' && this.visible == true && this.feedOutId == ''){
if((this.roleId == '' || this.roleId == null) && event.keyCode == 38){
this.startRoleMenu('left');
}
if((this.roleId == '' || this.roleId == null) && event.keyCode == 40){
this.startRoleMenu('right');
}
if(event.keyCode == 13){
this.startMovePage();
}
}
if(this.feedInId != '' || this.visible == true || this.feedOutId != ''){
Event.stop(event);
try{
event.returnValue = false;
event.preventDefault();
}
catch(e){
}
}
}
this.clickEvent = function(event){
if(this.visible == true || this.feedOutId != ''){
if(Event.isLeftClick(event) && this.movePageId == ''){
this.startMovePage();
}
if(Event.isRightClick(event) && this.feedOutId == ''){
this.startFeedOut();
}
Event.stop(event);
}
}
this.contextMenuEvent = function(event){
if(this.visible == true || this.feedOutId != ''){
Event.stop(event);
}
}
this.dblClickEvent = function(event){
if(this.visible == false && this.feedInId == ''){
try{
if(document.selection){
var selection = document.selection.createRange();
selection.setEndPoint("StartToEnd", selection);
selection.select();
}
}catch(e){
;
}
try{
var selection = window.getSelection();
selection.collapse(document.body, 0);
}catch(e){
;
}
this.posX = Event.pointerX(event);
this.posY = Event.pointerY(event);
this.startFeedIn();
}
}
this.mouseWheelEvent = function (event) {
if(this.feedInId == '' && this.visible == true && this.feedOutId == ''){
if((event.detail ? event.detail : event.wheelDelta) >= 0){
if(this.roleId == '' || this.roleId == null){
this.roleCount = 0;
this.selectedId = (this.selectedId + 1) % this.menuNum;
this.roleId = setInterval((function(){this.roleMenu('left')}).bind(this),this.feedInterval);
}
}
if((event.detail ? event.detail : event.wheelDelta) < 0){
if(this.roleId == '' || this.roleId == null){
this.roleCount = 0;
this.selectedId = (this.selectedId + this.menuNum - 1) % this.menuNum;
this.roleId = setInterval((function(){this.roleMenu('right')}).bind(this),this.feedInterval);
event.returnValue = false;
}
}
}
if(this.feedInId != '' || this.visible == true || this.feedOutId != ''){
Event.stop(event);
}
}
this.mouseMoveEvent = function(event){
if((this.feedInId != '' || this.visible == true) && this.feedOutId == ''){
var diff = this.minRadius + 50;
if( Event.pointerX(event) < this.posX - diff || this.posX + diff < Event.pointerX(event)
|| Event.pointerY(event) < this.posY -diff || this.posY + diff < Event.pointerY(event) ){
this.startFeedOut();
}
}
}
}
Documentation generated by
JSDoc on Sat Jul 26 15:46:55 2008