Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
CIRCLE
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
94
Merge Requests
10
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
bf5e2383
authored
Sep 05, 2013
by
Őry Máté
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dashboard: merge from dashboard
parent
0997c609
Hide whitespace changes
Inline
Side-by-side
Showing
33 changed files
with
2435 additions
and
0 deletions
+2435
-0
circle/circle/settings/base.py
+1
-0
circle/circle/urls.py
+1
-0
circle/dashboard/__init__.py
+0
-0
circle/dashboard/models.py
+3
-0
circle/dashboard/static/dashboard/dashboard.css
+143
-0
circle/dashboard/static/dashboard/dashboard.js
+41
-0
circle/dashboard/static/dashboard/js/jquery.knob.js
+686
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/.gitignore
+4
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/README.md
+28
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/css/simple-slider.css
+55
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/demo.html
+80
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/grunt.js
+69
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/js/simple-slider.coffee
+361
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/js/simple-slider.js
+363
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/js/simple-slider.min.js
+12
-0
circle/dashboard/static/dashboard/loopj-jquery-simple-slider-fa64f59/package.json
+33
-0
circle/dashboard/templates/dashboard/base.html
+44
-0
circle/dashboard/templates/dashboard/index-files.html
+33
-0
circle/dashboard/templates/dashboard/index-groups.html
+33
-0
circle/dashboard/templates/dashboard/index-nodes.html
+46
-0
circle/dashboard/templates/dashboard/index-templates.html
+33
-0
circle/dashboard/templates/dashboard/index-vm.html
+63
-0
circle/dashboard/templates/dashboard/index.html
+38
-0
circle/dashboard/templates/dashboard/vm-detail-access.html
+20
-0
circle/dashboard/templates/dashboard/vm-detail-activity.html
+10
-0
circle/dashboard/templates/dashboard/vm-detail-console.html
+1
-0
circle/dashboard/templates/dashboard/vm-detail-home.html
+16
-0
circle/dashboard/templates/dashboard/vm-detail-network.html
+83
-0
circle/dashboard/templates/dashboard/vm-detail-resources.html
+29
-0
circle/dashboard/templates/dashboard/vm-detail.html
+73
-0
circle/dashboard/tests.py
+16
-0
circle/dashboard/urls.py
+8
-0
circle/dashboard/views.py
+9
-0
No files found.
circle/circle/settings/base.py
View file @
bf5e2383
...
...
@@ -229,6 +229,7 @@ LOCAL_APPS = (
'storage'
,
'firewall'
,
'network'
,
'dashboard'
,
)
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
...
...
circle/circle/urls.py
View file @
bf5e2383
...
...
@@ -15,4 +15,5 @@ urlpatterns = patterns('',
url
(
r'^admin/'
,
include
(
admin
.
site
.
urls
)),
url
(
r'^network/'
,
include
(
'network.urls'
)),
url
(
r'^dashboard/'
,
include
(
'dashboard.urls'
)),
)
circle/dashboard/__init__.py
0 → 100644
View file @
bf5e2383
circle/dashboard/models.py
0 → 100644
View file @
bf5e2383
from
django.db
import
models
# Create your models here.
circle/dashboard/static/dashboard/dashboard.css
0 → 100644
View file @
bf5e2383
/* Move down content because we have a fixed navbar that is 50px tall */
body
{
padding-top
:
50px
;
padding-bottom
:
20px
;
}
/* Set widths on the navbar form inputs since otherwise they're 100% wide */
.navbar-form
input
[
type
=
"text"
],
.navbar-form
input
[
type
=
"password"
]
{
width
:
180px
;
}
/* Wrapping element */
/* Set some basic padding to keep content from hitting the edges */
.body-content
{
padding-left
:
15px
;
padding-right
:
15px
;
}
/* Responsive: Portrait tablets and up */
@media
screen
and
(
min-width
:
768px
)
{
/* Let the jumbotron breathe */
.container
>
:first-child
{
margin-top
:
20px
;
}
/* Remove padding from wrapping element since we kick in the grid classes here */
.body-content
{
padding
:
0
;
}
}
.no-margin
{
margin
:
0
!important
;
}
.list-group
.list-group-footer
{
padding-top
:
5px
;
padding-bottom
:
5px
;
}
.big
{
font-size
:
2em
;
}
.bigbig
{
font-size
:
3em
;
}
.timeline
{
border-left
:
4px
#428bca
solid
;
margin-left
:
20px
;
padding-left
:
20px
;
}
.timeline
>
div
{
margin
:
0
;
padding
:
0
;
margin-left
:
-34px
;
margin-bottom
:
.5em
;
line-height
:
24px
;
}
.timeline
>
div
:last-child
{
margin-bottom
:
0
;
}
.timeline
.timeline-icon
{
margin
:
0
;
padding
:
0
;
width
:
24px
;
height
:
24px
;
text-align
:
center
;
display
:
inline-block
;
border-radius
:
50%
;
background-color
:
#428bca
;
color
:
#fff
;
}
.timeline-icon.timeline-warning
{
border-color
:
#c09853
;
border-style
:
solid
;
border-width
:
2px
;
background-color
:
white
;
color
:
#c09853
;
line-height
:
20px
;
}
.timeline
.timeline-icon.timeline-nobg
{
background-color
:
transparent
;
}
.table-with-form-fields
tbody
tr
td
{
line-height
:
34px
;
}
#vm-detail-panel
.panel-body
{
min-height
:
20em
;
}
:link
i
:before:hover
{
text-decoration
:
none
!important
;
}
.slider
{
display
:
inline-block
;
}
.slider
.track
{
height
:
20px
;
top
:
50%
;
}
.slider
>
.dragger
,
.slider
>
.dragger
:hover
{
border-radius
:
0px
;
-moz-border-radius
:
0px
;
-webkit-border-radius
:
0px
;
width
:
8px
;
height
:
24px
;
margin-top
:
-12px
!important
;
text-shadow
:
0
1px
0
#fff
;
background-image
:
-webkit-gradient
(
linear
,
left
0%
,
left
100%
,
from
(
#428bca
),
to
(
#3071a9
));
background-image
:
-webkit-linear-gradient
(
top
,
#428bca
,
0%
,
#3071a9
,
100%
);
background-image
:
-moz-linear-gradient
(
top
,
#428bca
0%
,
#3071a9
100%
);
background-image
:
linear-gradient
(
to
bottom
,
#428bca
0%
,
#3071a9
100%
);
background-repeat
:
repeat-x
;
border-color
:
#2d6ca2
;
filter
:
progid
:
DXImageTransform
.
Microsoft
.
gradient
(
startColorstr
=
'#ff428bca'
,
endColorstr
=
'#ff3071a9'
,
GradientType
=
0
);
}
.slider
>
.dragger
:hover
{
background-color
:
#3071a9
;
background-image
:
none
;
border-color
:
#2d6ca2
;
}
.slider
>
.highlight-track
{
height
:
20px
;
top
:
50%
;
}
.slider
+
.output
{
}
.rule-table
tr
>
:nth-child
(
1
)
{
text-align
:
right
;
}
.rule-table
tr
>
:nth-child
(
2
)
{
text-align
:
center
;
}
.dashboard-index
.panel
{
height
:
300px
;
}
circle/dashboard/static/dashboard/dashboard.js
0 → 100644
View file @
bf5e2383
$
(
function
()
{
$
(
'[href=#vm-graph-view]'
).
click
(
function
(
e
)
{
$
(
'#vm-list-view'
).
hide
();
$
(
'#vm-graph-view'
).
show
();
$
(
'[href=#vm-list-view]'
).
removeClass
(
'disabled'
);
$
(
'[href=#vm-graph-view]'
).
addClass
(
'disabled'
);
e
.
stopImmediatePropagation
();
return
false
;
});
$
(
'[href=#vm-list-view]'
).
click
(
function
(
e
)
{
$
(
'#vm-graph-view'
).
hide
();
$
(
'#vm-list-view'
).
show
();
$
(
'[href=#vm-list-view]'
).
addClass
(
'disabled'
);
$
(
'[href=#vm-graph-view]'
).
removeClass
(
'disabled'
);
e
.
stopImmediatePropagation
();
return
false
;
}).
addClass
(
'disabled'
);
$
(
'[title]'
).
tooltip
();
$
(
':input[title]'
).
tooltip
({
trigger
:
'focus'
,
placement
:
'auto right'
});
$
(
".knob"
).
knob
();
$
(
"[data-slider]"
)
.
each
(
function
()
{
var
input
=
$
(
this
);
$
(
"<span>"
)
.
addClass
(
"output"
)
.
html
(
$
(
this
).
val
())
.
insertAfter
(
input
);
})
.
bind
(
"slider:ready slider:changed"
,
function
(
event
,
data
)
{
$
(
this
)
.
nextAll
(
".output:first"
)
.
html
(
data
.
value
.
toFixed
(
3
));
});
$
(
"[data-mark]"
)
.
each
(
function
()
{
var
value
=
$
(
this
).
attr
(
'data-mark'
).
parseFloat
();
});
});
circle/dashboard/static/dashboard/js/jquery.knob.js
0 → 100644
View file @
bf5e2383
/*!jQuery Knob*/
/**
* Downward compatible, touchable dial
*
* Version: 1.2.0 (15/07/2012)
* Requires: jQuery v1.7+
*
* Copyright (c) 2012 Anthony Terrien
* Under MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* Thanks to vor, eskimoblood, spiffistan, FabrizioC
*/
(
function
(
$
)
{
/**
* Kontrol library
*/
"use strict"
;
/**
* Definition of globals and core
*/
var
k
=
{},
// kontrol
max
=
Math
.
max
,
min
=
Math
.
min
;
k
.
c
=
{};
k
.
c
.
d
=
$
(
document
);
k
.
c
.
t
=
function
(
e
)
{
return
e
.
originalEvent
.
touches
.
length
-
1
;
};
/**
* Kontrol Object
*
* Definition of an abstract UI control
*
* Each concrete component must call this one.
* <code>
* k.o.call(this);
* </code>
*/
k
.
o
=
function
()
{
var
s
=
this
;
this
.
o
=
null
;
// array of options
this
.
$
=
null
;
// jQuery wrapped element
this
.
i
=
null
;
// mixed HTMLInputElement or array of HTMLInputElement
this
.
g
=
null
;
// 2D graphics context for 'pre-rendering'
this
.
v
=
null
;
// value ; mixed array or integer
this
.
cv
=
null
;
// change value ; not commited value
this
.
x
=
0
;
// canvas x position
this
.
y
=
0
;
// canvas y position
this
.
$c
=
null
;
// jQuery canvas element
this
.
c
=
null
;
// rendered canvas context
this
.
t
=
0
;
// touches index
this
.
isInit
=
false
;
this
.
fgColor
=
null
;
// main color
this
.
pColor
=
null
;
// previous color
this
.
dH
=
null
;
// draw hook
this
.
cH
=
null
;
// change hook
this
.
eH
=
null
;
// cancel hook
this
.
rH
=
null
;
// release hook
this
.
scale
=
1
;
// scale factor
this
.
run
=
function
()
{
var
cf
=
function
(
e
,
conf
)
{
var
k
;
for
(
k
in
conf
)
{
s
.
o
[
k
]
=
conf
[
k
];
}
s
.
init
();
s
.
_configure
()
.
_draw
();
};
if
(
this
.
$
.
data
(
'kontroled'
))
return
;
this
.
$
.
data
(
'kontroled'
,
true
);
this
.
extend
();
this
.
o
=
$
.
extend
(
{
// Config
min
:
this
.
$
.
data
(
'min'
)
||
0
,
max
:
this
.
$
.
data
(
'max'
)
||
100
,
stopper
:
true
,
readOnly
:
this
.
$
.
data
(
'readonly'
),
// UI
cursor
:
(
this
.
$
.
data
(
'cursor'
)
===
true
&&
30
)
||
this
.
$
.
data
(
'cursor'
)
||
0
,
thickness
:
this
.
$
.
data
(
'thickness'
)
||
0.35
,
lineCap
:
this
.
$
.
data
(
'linecap'
)
||
'butt'
,
width
:
this
.
$
.
data
(
'width'
)
||
200
,
height
:
this
.
$
.
data
(
'height'
)
||
200
,
displayInput
:
this
.
$
.
data
(
'displayinput'
)
==
null
||
this
.
$
.
data
(
'displayinput'
),
displayPrevious
:
this
.
$
.
data
(
'displayprevious'
),
fgColor
:
this
.
$
.
data
(
'fgcolor'
)
||
'#87CEEB'
,
inputColor
:
this
.
$
.
data
(
'inputcolor'
)
||
this
.
$
.
data
(
'fgcolor'
)
||
'#87CEEB'
,
inline
:
false
,
step
:
this
.
$
.
data
(
'step'
)
||
1
,
// Hooks
draw
:
null
,
// function () {}
change
:
null
,
// function (value) {}
cancel
:
null
,
// function () {}
release
:
null
,
// function (value) {}
error
:
null
// function () {}
},
this
.
o
);
// routing value
if
(
this
.
$
.
is
(
'fieldset'
))
{
// fieldset = array of integer
this
.
v
=
{};
this
.
i
=
this
.
$
.
find
(
'input'
)
this
.
i
.
each
(
function
(
k
)
{
var
$this
=
$
(
this
);
s
.
i
[
k
]
=
$this
;
s
.
v
[
k
]
=
$this
.
val
();
$this
.
bind
(
'change'
,
function
()
{
var
val
=
{};
val
[
k
]
=
$this
.
val
();
s
.
val
(
val
);
}
);
});
this
.
$
.
find
(
'legend'
).
remove
();
}
else
{
// input = integer
this
.
i
=
this
.
$
;
this
.
v
=
this
.
$
.
val
();
(
this
.
v
==
''
)
&&
(
this
.
v
=
this
.
o
.
min
);
this
.
$
.
bind
(
'change'
,
function
()
{
s
.
val
(
s
.
_validate
(
s
.
$
.
val
()));
}
);
}
(
!
this
.
o
.
displayInput
)
&&
this
.
$
.
hide
();
this
.
$c
=
$
(
'<canvas width="'
+
this
.
o
.
width
+
'px" height="'
+
this
.
o
.
height
+
'px"></canvas>'
);
this
.
c
=
this
.
$c
[
0
].
getContext
?
this
.
$c
[
0
].
getContext
(
'2d'
)
:
null
;
if
(
!
this
.
c
)
{
this
.
o
.
error
&&
this
.
o
.
error
();
return
;
}
this
.
$
.
wrap
(
$
(
'<div style="'
+
(
this
.
o
.
inline
?
'display:inline;'
:
''
)
+
'width:'
+
this
.
o
.
width
+
'px;height:'
+
this
.
o
.
height
+
'px;"></div>'
))
.
before
(
this
.
$c
);
this
.
scale
=
(
window
.
devicePixelRatio
||
1
)
/
(
this
.
c
.
webkitBackingStorePixelRatio
||
this
.
c
.
mozBackingStorePixelRatio
||
this
.
c
.
msBackingStorePixelRatio
||
this
.
c
.
oBackingStorePixelRatio
||
this
.
c
.
backingStorePixelRatio
||
1
);
if
(
this
.
scale
!==
1
)
{
this
.
$c
[
0
].
width
=
this
.
$c
[
0
].
width
*
this
.
scale
;
this
.
$c
[
0
].
height
=
this
.
$c
[
0
].
height
*
this
.
scale
;
this
.
$c
.
width
(
this
.
o
.
width
);
this
.
$c
.
height
(
this
.
o
.
height
);
}
if
(
this
.
v
instanceof
Object
)
{
this
.
cv
=
{};
this
.
copy
(
this
.
v
,
this
.
cv
);
}
else
{
this
.
cv
=
this
.
v
;
}
this
.
$
.
bind
(
"configure"
,
cf
)
.
parent
()
.
bind
(
"configure"
,
cf
);
this
.
_listen
()
.
_configure
()
.
_xy
()
.
init
();
this
.
isInit
=
true
;
this
.
_draw
();
return
this
;
};
this
.
_draw
=
function
()
{
// canvas pre-rendering
var
d
=
true
,
c
=
document
.
createElement
(
'canvas'
);
c
.
width
=
s
.
o
.
width
*
s
.
scale
;
c
.
height
=
s
.
o
.
height
*
s
.
scale
;
s
.
g
=
c
.
getContext
(
'2d'
);
s
.
clear
();
s
.
dH
&&
(
d
=
s
.
dH
());
(
d
!==
false
)
&&
s
.
draw
();
s
.
c
.
drawImage
(
c
,
0
,
0
);
c
=
null
;
};
this
.
_touch
=
function
(
e
)
{
var
touchMove
=
function
(
e
)
{
var
v
=
s
.
xy2val
(
e
.
originalEvent
.
touches
[
s
.
t
].
pageX
,
e
.
originalEvent
.
touches
[
s
.
t
].
pageY
);
if
(
v
==
s
.
cv
)
return
;
if
(
s
.
cH
&&
(
s
.
cH
(
v
)
===
false
)
)
return
;
s
.
change
(
s
.
_validate
(
v
));
s
.
_draw
();
};
// get touches index
this
.
t
=
k
.
c
.
t
(
e
);
// First touch
touchMove
(
e
);
// Touch events listeners
k
.
c
.
d
.
bind
(
"touchmove.k"
,
touchMove
)
.
bind
(
"touchend.k"
,
function
()
{
k
.
c
.
d
.
unbind
(
'touchmove.k touchend.k'
);
if
(
s
.
rH
&&
(
s
.
rH
(
s
.
cv
)
===
false
)
)
return
;
s
.
val
(
s
.
cv
);
}
);
return
this
;
};
this
.
_mouse
=
function
(
e
)
{
var
mouseMove
=
function
(
e
)
{
var
v
=
s
.
xy2val
(
e
.
pageX
,
e
.
pageY
);
if
(
v
==
s
.
cv
)
return
;
if
(
s
.
cH
&&
(
s
.
cH
(
v
)
===
false
)
)
return
;
s
.
change
(
s
.
_validate
(
v
));
s
.
_draw
();
};
// First click
mouseMove
(
e
);
// Mouse events listeners
k
.
c
.
d
.
bind
(
"mousemove.k"
,
mouseMove
)
.
bind
(
// Escape key cancel current change
"keyup.k"
,
function
(
e
)
{
if
(
e
.
keyCode
===
27
)
{
k
.
c
.
d
.
unbind
(
"mouseup.k mousemove.k keyup.k"
);
if
(
s
.
eH
&&
(
s
.
eH
()
===
false
)
)
return
;
s
.
cancel
();
}
}
)
.
bind
(
"mouseup.k"
,
function
(
e
)
{
k
.
c
.
d
.
unbind
(
'mousemove.k mouseup.k keyup.k'
);
if
(
s
.
rH
&&
(
s
.
rH
(
s
.
cv
)
===
false
)
)
return
;
s
.
val
(
s
.
cv
);
}
);
return
this
;
};
this
.
_xy
=
function
()
{
var
o
=
this
.
$c
.
offset
();
this
.
x
=
o
.
left
;
this
.
y
=
o
.
top
;
return
this
;
};
this
.
_listen
=
function
()
{
if
(
!
this
.
o
.
readOnly
)
{
this
.
$c
.
bind
(
"mousedown"
,
function
(
e
)
{
e
.
preventDefault
();
s
.
_xy
().
_mouse
(
e
);
}
)
.
bind
(
"touchstart"
,
function
(
e
)
{
e
.
preventDefault
();
s
.
_xy
().
_touch
(
e
);
}
);
this
.
listen
();
}
else
{
this
.
$
.
attr
(
'readonly'
,
'readonly'
);
}
return
this
;
};
this
.
_configure
=
function
()
{
// Hooks
if
(
this
.
o
.
draw
)
this
.
dH
=
this
.
o
.
draw
;
if
(
this
.
o
.
change
)
this
.
cH
=
this
.
o
.
change
;
if
(
this
.
o
.
cancel
)
this
.
eH
=
this
.
o
.
cancel
;
if
(
this
.
o
.
release
)
this
.
rH
=
this
.
o
.
release
;
if
(
this
.
o
.
displayPrevious
)
{
this
.
pColor
=
this
.
h2rgba
(
this
.
o
.
fgColor
,
"0.4"
);
this
.
fgColor
=
this
.
h2rgba
(
this
.
o
.
fgColor
,
"0.6"
);
}
else
{
this
.
fgColor
=
this
.
o
.
fgColor
;
}
return
this
;
};
this
.
_clear
=
function
()
{
this
.
$c
[
0
].
width
=
this
.
$c
[
0
].
width
;
};
this
.
_validate
=
function
(
v
)
{
return
(
~~
(((
v
<
0
)
?
-
0.5
:
0.5
)
+
(
v
/
this
.
o
.
step
)))
*
this
.
o
.
step
;
};
// Abstract methods
this
.
listen
=
function
()
{};
// on start, one time
this
.
extend
=
function
()
{};
// each time configure triggered
this
.
init
=
function
()
{};
// each time configure triggered
this
.
change
=
function
(
v
)
{};
// on change
this
.
val
=
function
(
v
)
{};
// on release
this
.
xy2val
=
function
(
x
,
y
)
{};
//
this
.
draw
=
function
()
{};
// on change / on release
this
.
clear
=
function
()
{
this
.
_clear
();
};
// Utils
this
.
h2rgba
=
function
(
h
,
a
)
{
var
rgb
;
h
=
h
.
substring
(
1
,
7
)
rgb
=
[
parseInt
(
h
.
substring
(
0
,
2
),
16
)
,
parseInt
(
h
.
substring
(
2
,
4
),
16
)
,
parseInt
(
h
.
substring
(
4
,
6
),
16
)];
return
"rgba("
+
rgb
[
0
]
+
","
+
rgb
[
1
]
+
","
+
rgb
[
2
]
+
","
+
a
+
")"
;
};
this
.
copy
=
function
(
f
,
t
)
{
for
(
var
i
in
f
)
{
t
[
i
]
=
f
[
i
];
}
};
};
/**
* k.Dial
*/
k
.
Dial
=
function
()
{
k
.
o
.
call
(
this
);
this
.
startAngle
=
null
;
this
.
xy
=
null
;
this
.
radius
=
null
;
this
.
lineWidth
=
null
;
this
.
cursorExt
=
null
;
this
.
w2
=
null
;
this
.
PI2
=
2
*
Math
.
PI
;
this
.
extend
=
function
()
{
this
.
o
=
$
.
extend
(
{
bgColor
:
this
.
$
.
data
(
'bgcolor'
)
||
'#EEEEEE'
,
angleOffset
:
this
.
$
.
data
(
'angleoffset'
)
||
0
,
angleArc
:
this
.
$
.
data
(
'anglearc'
)
||
360
,
inline
:
true
},
this
.
o
);
};
this
.
val
=
function
(
v
)
{
if
(
null
!=
v
)
{
this
.
cv
=
this
.
o
.
stopper
?
max
(
min
(
v
,
this
.
o
.
max
),
this
.
o
.
min
)
:
v
;
this
.
v
=
this
.
cv
;
this
.
$
.
val
(
this
.
v
);
this
.
_draw
();
}
else
{
return
this
.
v
;
}
};
this
.
xy2val
=
function
(
x
,
y
)
{
var
a
,
ret
;
a
=
Math
.
atan2
(
x
-
(
this
.
x
+
this
.
w2
)
,
-
(
y
-
this
.
y
-
this
.
w2
)
)
-
this
.
angleOffset
;
if
(
this
.
angleArc
!=
this
.
PI2
&&
(
a
<
0
)
&&
(
a
>
-
0.5
))
{
// if isset angleArc option, set to min if .5 under min
a
=
0
;
}
else
if
(
a
<
0
)
{
a
+=
this
.
PI2
;
}
ret
=
~~
(
0.5
+
(
a
*
(
this
.
o
.
max
-
this
.
o
.
min
)
/
this
.
angleArc
))
+
this
.
o
.
min
;
this
.
o
.
stopper
&&
(
ret
=
max
(
min
(
ret
,
this
.
o
.
max
),
this
.
o
.
min
));
return
ret
;
};
this
.
listen
=
function
()
{
// bind MouseWheel
var
s
=
this
,
mw
=
function
(
e
)
{
e
.
preventDefault
();
var
ori
=
e
.
originalEvent
,
deltaX
=
ori
.
detail
||
ori
.
wheelDeltaX
,
deltaY
=
ori
.
detail
||
ori
.
wheelDeltaY
,
v
=
parseInt
(
s
.
$
.
val
())
+
(
deltaX
>
0
||
deltaY
>
0
?
s
.
o
.
step
:
deltaX
<
0
||
deltaY
<
0
?
-
s
.
o
.
step
:
0
);
if
(
s
.
cH
&&
(
s
.
cH
(
v
)
===
false
)
)
return
;
s
.
val
(
v
);
}
,
kval
,
to
,
m
=
1
,
kv
=
{
37
:
-
s
.
o
.
step
,
38
:
s
.
o
.
step
,
39
:
s
.
o
.
step
,
40
:
-
s
.
o
.
step
};
this
.
$
.
bind
(
"keydown"
,
function
(
e
)
{
var
kc
=
e
.
keyCode
;
// numpad support
if
(
kc
>=
96
&&
kc
<=
105
)
{
kc
=
e
.
keyCode
=
kc
-
48
;
}
kval
=
parseInt
(
String
.
fromCharCode
(
kc
));