// Copyright 2007-2009 futomi http://www.html5.jp/
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// progress.js v1.0.1
/* -------------------------------------------------------------------
* define objects (name space) for this library.
* ----------------------------------------------------------------- */
if( typeof html5jp == 'undefined' ) {
html5jp = new Object();
}
(function () {
/* -------------------------------------------------------------------
* constructor
* ----------------------------------------------------------------- */
html5jp.progress = function (id, p) {
if( ! id ) { return; }
var pnode = document.getElementById(id);
if(! pnode) { return; }
if( ! pnode.nodeName.match(/^DIV$/i) ) { return; }
var nodes = {};
nodes.parent = pnode;
/* -------------------------------------------------------------------
* default settings
* ----------------------------------------------------------------- */
var dp = {
full: 100, // value of 100%
from: 0, // value of start point
to: 0, // value of end point
animation: 5, // animation speed
nd: 0, //number of decimals
width: 300, // width of progress bar (pixel)
height: 12, //height of progress bar (pixel)
// styles of frame
frm_bgc: "#cccccc", // backgroundColor
frm_bdtc: null, // borderTopColor
frm_bdrc: null, // borderRightColor
frm_bdbc: null, // borderBottomColor
frm_bdlc: null, // borderLeftColor
frm_bdw: "1px", // borderWidth
// styles of bar
bar_bgc: "#039ab2", // backgroundColor
bar_bdtc: null, // borderTopColor
bar_bdrc: null, // borderRightColor
bar_bdbc: null, // borderBottomColor
bar_bdlc: null, // borderLeftColor
bar_bdw: "1px", // borderWidth
// styles of percentage
per_shw: true,
per_ftc: "white", // color
per_ftf: "Arial,sans-serif", // fontFamily
per_fts: "11px", // fontSize
// styles of percentage shadow
per_sd: true,
per_sdc: "#101010", // color
// gradation
gradation: true
};
/* -------------------------------
* initialize parameters
* ----------------------------- */
if( typeof(p) == "undefined" ) { p = {}; }
for( var k in dp ) {
if( typeof(p[k]) == "undefined" ) {
p[k] = dp[k];
}
}
// value of 100%
p.full = parseFloat(p.full);
// value of start point
p.from = parseFloat(p.from);
if( p.from < 0 ) {
p.from = 0;
} else if( p.from > p.full ) {
p.from = p.full;
}
// value of end point
p.to = parseFloat(p.to);
if( p.to < 0 ) {
p.to = 0;
} else if( p.to > p.full ) {
p.to = p.full;
}
// animation speed
p.animation = parseFloat(p.animation);
if( p.animation < 0 ) {
p.animation = 0;
} else if( p.animation > 10 ) {
p.animation = 10;
}
// number of decimals
p.nd = parseFloat(p.nd);
if( p.nd < 0 ) {
p.nd = 0;
} else if( p.nd > 8 ) {
p.nd = 8;
}
// width of progress bar
p.width = parseFloat(p.width);
if( p.width < 10 ) {
p.width = 10;
} else if( p.width > 2400 ) {
p.width = 2400;
}
// height of progress bar
p.height = parseFloat(p.height);
if( p.height < 5 ) {
p.height = 5;
} else if( p.height > 500 ) {
p.height = 500;
}
// boolean parameters
var boolean_params = ["per_shw", "per_sd", "gradation"];
for( var i=0; i 10 ) {
v = 10;
}
// number of decimals
} else if(k == "nd") {
v = parseFloat(v);
if( v < 0 ) {
v = 0;
} else if( v > 8 ) {
v = 8;
}
}
//
this.p[k] = v;
};
proto.incr = function(num) {
if( ! num ) { return; }
num = parseFloat(num);
if(num == 0) { return; }
this.p.from = this.p.val;
this.p.val += num;
if(this.p.val < 0) {
this.p.val = 0;
} else if(this.p.val > this.p.full) {
this.p.val = this.p.full;
}
this.p.to = this.p.val;
this.p.per = this._set_per();
this._draw_bar();
return this.p.val;
};
proto.decr = function(num) {
if( ! num ) { return; }
num = parseFloat(num);
if(num == 0) { return; }
this.p.from = this.p.val;
this.p.val -= num;
if(this.p.val < 0) {
this.p.val = 0;
} else if(this.p.val > this.p.full) {
this.p.val = this.p.full;
}
this.p.to = this.p.val;
this.p.per = this._set_per();
this._draw_bar();
return this.p.val;
};
proto.draw = function() {
var p = this.p;
var nodes = this.nodes;
var pnode = nodes.parent;
// clear child nodes
this._clear();
// create div element for the frame
nodes.frm = this._create_frame_div_node();
pnode.appendChild(nodes.frm);
// create div element for the bar
nodes.bar = this._create_bar_div_node();
nodes.frm.appendChild(nodes.bar);
// create div element for the percentage display box
if(p.per_shw == true) {
nodes.per = this._create_per_div_node();
this._draw_per(50);
var per_size = this._get_box_size(nodes.per);
// define a position of the percentage display box
p.per_left = ( ( p.width + parseInt(p.bar_bdw) * 2 ) / 2 ) - ( per_size.w / 2);
p.per_top = ( ( p.height + parseInt(p.bar_bdw) * 2 ) / 2 ) - ( per_size.h / 2);
nodes.per.style.left = p.per_left + "px";
nodes.per.style.top = p.per_top + "px";
// create div element for the percentage shadow display box
if(p.per_sd == true) {
this._create_per_shadow();
}
nodes.frm.appendChild(nodes.per);
}
// draw the bar
this._draw_bar();
};
proto.reset = function() {
for( var k in this.initp ) {
var v = this.initp[k];
this.p[k] = v;
}
this.draw();
};
/* -------------------------------------------------------------------
* private methods
* ----------------------------------------------------------------- */
proto._create_per_shadow = function() {
var p = this.p;
if(p.per_shw != true) { return ;}
var nodes = this.nodes;
nodes.persd = [];
var dif = [ [ 0, 1], [ 0, -1], [ 1, 0], [ 1, 1], [ 1, -1], [-1, 0], [-1, 1], [-1, -1] ];
for(var j=0; j<8; j++) {
var sd = nodes.per.cloneNode(true);
sd.style.margin = "0px";
sd.style.padding = "0px";
sd.style.position = "absolute";
sd.style.color = p.per_sdc;
sd.style.fontFamily = p.per_ftf;
sd.style.fontSize = p.per_fts;
sd.style.left = (p.per_left + dif[j][0]) + "px";
sd.style.top = (p.per_top + dif[j][1]) + "px";
nodes.frm.appendChild(sd);
nodes.persd.push(sd);
}
};
proto._create_per_div_node = function() {
var p = this.p;
if(p.per_shw != true) { return ;}
var el = this._create_div_node();
el.style.position = "absolute";
el.style.color = p.per_ftc;
el.style.fontFamily = p.per_ftf;
el.style.fontSize = p.per_fts;
return el;
};
proto._create_bar_div_node = function() {
var p = this.p;
var el = this._create_div_node();
el.style.borderWidth = p.bar_bdw;
el.style.borderStyle = "solid";
var w = p.width;
var h = p.height;
if(document.uniqueID && document.compatMode == "BackCompat") {
w += ( parseInt(p.bar_bdw) * 2 );
h += ( parseInt(p.bar_bdw) * 2 );
}
el.style.width = w + "px";
el.style.height = h + "px";
el.style.position = "absolute";
el.style.left = "-" + p.width + "px";
el.style.top = "0px";
el.style.fontSize = "1px";
// calculate border color of the bar
var bar_rgb = this._conv_color_to_rgb(p.bar_bgc);
var bar_border_rgb1 = this._lighten_rgb(bar_rgb, 0.25);
var bar_border_rgb2 = this._lighten_rgb(bar_rgb, -0.25);
var bar_border_color1 = this._conv_rgb_to_css(bar_border_rgb1);
var bar_border_color2 = this._conv_rgb_to_css(bar_border_rgb2);
if(p.bar_bdtc == null) {
el.style.borderTopColor = bar_border_color1;
} else {
el.style.borderTopColor = p.bar_bdtc;
}
if(p.bar_bdrc == null) {
el.style.borderRightColor = bar_border_color2; // borderRightColor
} else {
el.style.borderRightColor = p.bar_bdrc;
}
if(p.bar_bdbc == null) {
el.style.borderBottomColor = bar_border_color2; // borderBottomColor
} else {
el.style.borderBottomColor = p.bar_bdbc;
}
if(p.bar_bdlc == null) {
el.style.borderLeftColor = bar_border_color1; // borderLeftColor
} else {
el.style.borderLeftColor = p.bar_bdlc;
}
//gradation
if(p.gradation == true) {
var rgb = this._conv_color_to_rgb(p.bar_bgc);
var rgb1 = this._lighten_rgb(rgb, -0.15);
var rgb2 = this._lighten_rgb(rgb, 0.15);
var canvas = document.createElement("CANVAS");
if ( canvas && canvas.getContext ) {
var color1 = this._conv_rgb_to_css(rgb1);
var color2 = this._conv_rgb_to_css(rgb2);
// draw by CANVAS
var ctx = canvas.getContext('2d');
canvas.style.margin = "0px";
canvas.style.padding = "0px";
canvas.width = w;
canvas.height = h;
el.appendChild(canvas);
ctx.beginPath();
var grad = ctx.createLinearGradient(0, 0, 0, h);
grad.addColorStop(0, color2);
grad.addColorStop(0.4, p.bar_bgc);
grad.addColorStop(1, color1);
ctx.fillStyle = grad;
ctx.rect(0, 0, w, h);
ctx.fill();
} else if(document.uniqueID) {
// for Internet Explorer
var color1 = this._conv_rgb_to_css_hex(rgb1);
var color2 = this._conv_rgb_to_css_hex(rgb2);
el.style.filter = "progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=" + color2 + ",EndColorStr=" + color1 + ")";
} else {
el.style.backgroundColor = p.bar_bgc;
}
} else {
el.style.backgroundColor = p.bar_bgc;
}
//
return el;
};
proto._create_frame_div_node = function() {
var p = this.p;
var el = this._create_div_node();
var w = p.width + parseInt(p.bar_bdw) * 2;
var h = p.height + parseInt(p.bar_bdw) * 2;
if(document.uniqueID && document.compatMode == "BackCompat") {
w += parseInt(p.frm_bdw) * 2;
h += parseInt(p.frm_bdw) * 2;
}
el.style.width = w + "px";
el.style.height = h + "px";
el.style.position = "relative";
el.style.overflow = "hidden";
el.style.borderWidth = p.frm_bdw;
el.style.borderStyle = "solid";
// calculate border color of the frame
var frm_rgb = this._conv_color_to_rgb(p.frm_bgc);
var frm_border_rgb = this._lighten_rgb(frm_rgb, -0.25);
var frm_border_color = this._conv_rgb_to_css(frm_border_rgb);
if(p.frm_bdtc == null) {
el.style.borderTopColor = frm_border_color;
} else {
el.style.borderTopColor = p.frm_bdtc;
}
if(p.frm_bdrc == null) {
el.style.borderRightColor = frm_border_color;
} else {
el.style.borderRightColor = p.frm_bdrc;
}
if(p.frm_bdbc == null) {
el.style.borderBottomColor = frm_border_color;
} else {
el.style.borderBottomColor = p.frm_bdbc;
}
if(p.frm_bdlc == null) {
el.style.borderLeftColor = frm_border_color;
} else {
el.style.borderLeftColor = p.frm_bdlc;
}
//gradation
if(p.gradation == true) {
var rgb = this._conv_color_to_rgb(p.frm_bgc);
var rgb1 = this._lighten_rgb(rgb, 0.15);
var rgb2 = this._lighten_rgb(rgb, -0.15);
var canvas = document.createElement("CANVAS");
if ( canvas && canvas.getContext ) {
var color1 = this._conv_rgb_to_css(rgb1);
var color2 = this._conv_rgb_to_css(rgb2);
// draw by CANVAS
var ctx = canvas.getContext('2d');
canvas.style.margin = "0px";
canvas.style.padding = "0px";
canvas.width = w;
canvas.height = h;
el.appendChild(canvas);
ctx.beginPath();
var grad = ctx.createLinearGradient(0, 0, 0, h);
grad.addColorStop(0, color2);
grad.addColorStop(0.4, p.frm_bgc);
grad.addColorStop(1, color1);
ctx.fillStyle = grad;
ctx.rect(0, 0, w, h);
ctx.fill();
} else if(document.uniqueID) {
// draw by VML for Internet Explorer
var color1 = this._conv_rgb_to_css_hex(rgb1);
var color2 = this._conv_rgb_to_css_hex(rgb2);
el.style.filter = "progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=" + color2 + ",EndColorStr=" + color1 + ")";
} else {
el.style.backgroundColor = p.frm_bgc;
}
} else {
el.style.backgroundColor = p.frm_bgc;
}
//
return el;
}
proto._create_div_node = function() {
var node = document.createElement("DIV");
node.style.margin = "0px";
node.style.padding = "0px";
return node;
};
proto._clear = function() {
var pnode = this.nodes.parent;
while (pnode.firstChild) {
pnode.removeChild(pnode.firstChild);
}
};
proto._draw_per = function(per) {
if(this.p.per_shw != true) { return ;}
if( ! per ) {
per = this.p.per;
}
var nd = this.p.nd;
per = parseInt( per * Math.pow(10, nd) ) / Math.pow(10, nd);
var cap = per + "%";
if( this.nodes.persd ) {
for( var i=0; i 100 ) { per = 100; }
return per;
};
proto._draw_bar_static = function(per) {
this.nodes.bar.style.left = "-" + ( this.p.width * (100 - per) / 100 ) + "px";
this._draw_per(per);
}
proto._draw_bar = function() {
var speed = this.p.animation;
var from = this.p.from;
var to = this.p.to;
if( speed <= 0 || speed > 10 || from == to ) {
this._draw_bar_static(this.p.per);
} else {
var per1 = this._calc_per(this.p.from);
var per2 = this.p.per;
var _this = this;
var fn = function() {
var dif = 0.1 * _this.p.animation;
if(per1 < per2) {
per1 += dif;
if(per1 > per2) {
per1 = per2;
}
} else {
per1 -= dif;
if(per1 < per2) {
per1 = per2;
}
}
_this._draw_bar_static(per1);
if(per1 != per2) {
setTimeout(fn, 10 );
}
}
fn();
}
};
proto._get_box_size = function(el) {
var visible = el.style.visible;
el.style.visible = "hidden";
this.nodes.frm.appendChild( el );
var o = {
w: el.offsetWidth,
h: el.offsetHeight
};
this.nodes.frm.removeChild(el);
el.style.visible = visible;
return o;
}
proto._conv_rgb_to_css = function(rgb) {
if( typeof(rgb.a) == "undefined" ) {
return "rgb(" + rgb.r + "," + rgb.g + "," + rgb.b + ")";
} else {
return "rgba(" + rgb.r + "," + rgb.g + "," + rgb.b + "," + rgb.a + ")";
}
};
proto._conv_rgb_to_css_hex = function(rgb) {
var r = rgb.r.toString(16);
var g = rgb.g.toString(16);
var b = rgb.b.toString(16);
if( r.length == 1 ) { r = "0" + r; }
if( g.length == 1 ) { g = "0" + g; }
if( b.length == 1 ) { b = "0" + b; }
return "#" + r + g + b;
};
proto._lighten_rgb = function(rgb, gain_rate) {
// convert rgb to yuv
var yuv = this._rgb_to_yuv(rgb);
// compute the luma (Y') information
var luma = yuv.y + gain_rate * 256;
yuv.y = luma;
return this._yuv_to_rgb(yuv);
};
proto._conv_color_to_rgb = function(color) {
/* color name mapping */
var color_name_map = {
aliceblue : "#F0F8FF",
antiquewhite : "#FAEBD7",
aqua : "#00FFFF",
aquamarine : "#7FFFD4",
azure : "#F0FFFF",
beige : "#F5F5DC",
bisque : "#FFE4C4",
black : "#000000",
blanchedalmond : "#FFEBCD",
blue : "#0000FF",
blueviolet : "#8A2BE2",
brass : "#B5A642",
brown : "#A52A2A",
burlywood : "#DEB887",
cadetblue : "#5F9EA0",
chartreuse : "#7FFF00",
chocolate : "#D2691E",
coolcopper : "#D98719",
copper : "#BF00DF",
coral : "#FF7F50",
cornflower : "#BFEFDF",
cornflowerblue : "#6495ED",
cornsilk : "#FFF8DC",
crimson : "#DC143C",
cyan : "#00FFFF",
darkblue : "#00008B",
darkbrown : "#DA0B00",
darkcyan : "#008B8B",
darkgoldenrod : "#B8860B",
darkgray : "#A9A9A9",
darkgreen : "#006400",
darkkhaki : "#BDB76B",
darkmagenta : "#8B008B",
darkolivegreen : "#556B2F",
darkorange : "#FF8C00",
darkorchid : "#9932CC",
darkred : "#8B0000",
darksalmon : "#E9967A",
darkseagreen : "#8FBC8F",
darkslateblue : "#483D8B",
darkslategray : "#2F4F4F",
darkturquoise : "#00CED1",
darkviolet : "#9400D3",
deeppink : "#FF1493",
deepskyblue : "#00BFFF",
dimgray : "#696969",
dodgerblue : "#1E90FF",
feldsper : "#FED0E0",
firebrick : "#B22222",
floralwhite : "#FFFAF0",
forestgreen : "#228B22",
fuchsia : "#FF00FF",
gainsboro : "#DCDCDC",
ghostwhite : "#F8F8FF",
gold : "#FFD700",
goldenrod : "#DAA520",
gray : "#808080",
green : "#008000",
greenyellow : "#ADFF2F",
honeydew : "#F0FFF0",
hotpink : "#FF69B4",
indianred : "#CD5C5C",
indigo : "#4B0082",
ivory : "#FFFFF0",
khaki : "#F0E68C",
lavender : "#E6E6FA",
lavenderblush : "#FFF0F5",
lawngreen : "#7CFC00",
lemonchiffon : "#FFFACD",
lightblue : "#ADD8E6",
lightcoral : "#F08080",
lightcyan : "#E0FFFF",
lightgoldenrodyellow : "#FAFAD2",
lightgreen : "#90EE90",
lightgrey : "#D3D3D3",
lightpink : "#FFB6C1",
lightsalmon : "#FFA07A",
lightseagreen : "#20B2AA",
lightskyblue : "#87CEFA",
lightslategray : "#778899",
lightsteelblue : "#B0C4DE",
lightyellow : "#FFFFE0",
lime : "#00FF00",
limegreen : "#32CD32",
linen : "#FAF0E6",
magenta : "#FF00FF",
maroon : "#800000",
mediumaquamarine : "#66CDAA",
mediumblue : "#0000CD",
mediumorchid : "#BA55D3",
mediumpurple : "#9370DB",
mediumseagreen : "#3CB371",
mediumslateblue : "#7B68EE",
mediumspringgreen : "#00FA9A",
mediumturquoise : "#48D1CC",
mediumvioletred : "#C71585",
midnightblue : "#191970",
mintcream : "#F5FFFA",
mistyrose : "#FFE4E1",
moccasin : "#FFE4B5",
navajowhite : "#FFDEAD",
navy : "#000080",
oldlace : "#FDF5E6",
olive : "#808000",
olivedrab : "#6B8E23",
orange : "#FFA500",
orangered : "#FF4500",
orchid : "#DA70D6",
palegoldenrod : "#EEE8AA",
palegreen : "#98FB98",
paleturquoise : "#AFEEEE",
palevioletred : "#DB7093",
papayawhip : "#FFEFD5",
peachpuff : "#FFDAB9",
peru : "#CD853F",
pink : "#FFC0CB",
plum : "#DDA0DD",
powderblue : "#B0E0E6",
purple : "#800080",
red : "#FF0000",
richblue : "#0CB0E0",
rosybrown : "#BC8F8F",
royalblue : "#4169E1",
saddlebrown : "#8B4513",
salmon : "#FA8072",
sandybrown : "#F4A460",
seagreen : "#2E8B57",
seashell : "#FFF5EE",
sienna : "#A0522D",
silver : "#C0C0C0",
skyblue : "#87CEEB",
slateblue : "#6A5ACD",
slategray : "#708090",
snow : "#FFFAFA",
springgreen : "#00FF7F",
steelblue : "#4682B4",
tan : "#D2B48C",
teal : "#008080",
thistle : "#D8BFD8",
tomato : "#FF6347",
turquoise : "#40E0D0",
violet : "#EE82EE",
wheat : "#F5DEB3",
white : "#FFFFFF",
whitesmoke : "#F5F5F5",
yellow : "#FFFF00",
yellowgreen : "#9ACD32"
};
if( /^[a-zA-Z]+$/.test(color) && color_name_map[color] ) {
color = color_name_map[color];
}
var rgb = {};
var m;
if( m = color.match( /rgb\(\s*(\d+)\,\s*(\d+)\,\s*(\d+)\s*\)/ ) ) {
rgb.r = parseInt(m[1], 10);
rgb.g = parseInt(m[2], 10);
rgb.b = parseInt(m[3], 10);
rgb.a = 1;
} else if( m = color.match( /rgba\(\s*(\d+)\,\s*(\d+)\,\s*(\d+),\s*(\d+)\s*\)/ ) ) {
rgb.r = parseInt(m[1], 10);
rgb.g = parseInt(m[2], 10);
rgb.b = parseInt(m[3], 10);
rgb.a = parseInt(m[4], 10);
} else if( m = color.match( /\#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})$/ ) ) {
rgb.r = parseInt(m[1], 16);
rgb.g = parseInt(m[2], 16);
rgb.b = parseInt(m[3], 16);
rgb.a = 1;
} else if( m = color.match( /\#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])$/ ) ) {
rgb.r = parseInt(m[1]+m[1], 16);
rgb.g = parseInt(m[2]+m[2], 16);
rgb.b = parseInt(m[3]+m[3], 16);
rgb.a = 1;
} else if( color == "transparent" ) {
rgb.r = 255;
rgb.g = 255;
rgb.b = 255;
rgb.a = 1;
} else {
return null;
}
/* for Safari */
if( rgb.r == 0 && rgb.g == 0 && rgb.b == 0 && rgb.a == 0 ) {
rgb.r = 255;
rgb.g = 255;
rgb.b = 255;
rgb.a = 1;
}
/* */
return rgb;
};
proto._rgb_to_yuv = function(rgb) {
var yuv = {
y: parseInt( 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b ),
u: parseInt( -0.169 * rgb.r - 0.3316 * rgb.g + 0.500 * rgb.b ),
v: parseInt( 0.500 * rgb.r - 0.4186 * rgb.g - 0.0813 * rgb.b )
};
return yuv;
};
proto._yuv_to_rgb = function(yuv) {
var rgb = {
r: parseInt( yuv.y + 1.402 * yuv.v ),
g: parseInt( yuv.y - 0.714 * yuv.v - 0.344 * yuv.u ),
b: parseInt( yuv.y + 1.772 * yuv.u )
};
for( var k in rgb ) {
if(rgb[k] > 255) {
rgb[k] = 255;
} else if(rgb[k] < 0) {
rgb[k] = 0;
}
}
return rgb;
};
/* -------------------------------------------------------------------
* for static drawing by class attributes
* ----------------------------------------------------------------- */
_add_event_listener(window, "load", _static_init);
function _static_init() {
var elms = _get_elements_by_class_name(document, "html5jp-progress");
for( var i=0; i 0 ) {
if( document.evaluate ) {
var contains = new Array();
for(var i=0; i