File "esplayer_tes.js"

Full Path: /home/raylsmit/public_html/wp-content/plugins/esaudioplayer/esplayer_tes.js
File size: 31.83 KB
MIME-type: text/plain
Charset: utf-8

var esplayer_debug = false;
/*var esplayer_isAdmin = false;
if (typeof soundManager == 'undefined') {
	esplayer_isAdmin = true;
}*/

var Array_EsAudioPlayer = new Array();
var esp_playing_no = 0;  // number of players now playing
var esp_auto_playing = 0;
var esp_auto_playing_player_num = 0;
var esp_series_playing = false;
var esp_series_playing_btn_id="";
var esp_series_playing_loop = false;
var soundManager_ready = false;
var esplayer_jquery_prepared = false;

jQuery(document).ready(function(){
	esplayer_jquery_prepared = true;

	for (var i=1; i<2048 ; i++) {
		var params = jQuery("#esplayervar"+i).val();
		if (typeof params == 'undefined') break;
		var args = params.split("|");
		var a = new EsAudioPlayer(
			args[0],
			args[1],
			args[2],
			args[3],
			args[4],
			args[5],
			args[6],
			args[7],
			args[8],
			args[9],
			args[10],
			args[11],
			(args[12].toLowerCase()=="true"),	//loop
			(args[13].toLowerCase()=="true"),	//autoplay
			(args[14].toLowerCase()=="true"),	//seriesplaybutton
			args[15],
			args[16],
			args[17],
			args[18],
			args[19]);
	}
	esplayer_autoplay(i-1);
});

if (!esplayer_isAdmin) {
	soundManager.url = esAudioPlayer_plugin_URL + '/swf/';
	soundManager.flashVersion = 9; // optional: shiny features (default = 8)
	soundManager.useFlashBlock = false; // optionally, enable when you're ready to dive in
	// enable HTML5 audio support, if you're feeling adventurous. iPad/iPhone will always get this.
	soundManager.useHTML5Audio = true;
	soundManager.preferFlash = false;
	soundManager.debugMode = false;
	soundManager.debugFlash = false;
	soundManager.allowpolling = true;
	soundManager.useConsole = true;
	soundManager.onready(function() {
		soundManager_ready = true;
	});
}


function esplayer_seriesplay(sid, loop)
{
	esp_series_playing_btn_id = sid;
	esp_series_playing_loop = loop;
	for (var i=0; i<Array_EsAudioPlayer.length; i++) {
		if ((Array_EsAudioPlayer[i].sid==sid || sid=="") && !Array_EsAudioPlayer[i].seriesplaybutton) {
			Array_EsAudioPlayer[i].autoplay = true;
		} else {
			Array_EsAudioPlayer[i].autoplay = false;
		}
	}
	esp_auto_playing = 0;
	esp_series_playing = true;
	esplayer_autoplay(Array_EsAudioPlayer.length);
}

function esplayer_reset_seriesplaybutton()
{
	for (var i=0; i<Array_EsAudioPlayer.length; i++) {
		var es=Array_EsAudioPlayer[i];
		if (es.seriesplaybutton) {
			es.draw_button('play');
		}
	}
}

function esplayer_autoplay(player_num)
{
	player_num = typeof(player_num) != 'undefined' ? player_num : 0;
	if (player_num > 0) esp_auto_playing_player_num = player_num;
	if (esp_auto_playing < 0) return;

	if (Array_EsAudioPlayer.length < esp_auto_playing_player_num) {
		setTimeout('esplayer_autoplay()', 100);
		return;
	}

	if (esp_playing_no) {
		setTimeout('esplayer_autoplay()', 100);
		return;
	}

	for (var i=esp_auto_playing; i<esp_auto_playing_player_num; i++) {
		if (Array_EsAudioPlayer[i].autoplay) {
			esp_auto_playing = i;
			break;
		}
	}
	if (i>=esp_auto_playing_player_num) {
		esp_auto_playing = -1;
		if (esp_series_playing) {
			if (esp_series_playing_loop) {
				esplayer_seriesplay(esp_series_playing_btn_id, esp_series_playing_loop);
			} else {
				esp_series_playing = false;
				esplayer_reset_seriesplaybutton();
			}
		}
		return;
	}
	var ep = Array_EsAudioPlayer[esp_auto_playing];
	if ((ep.created && ep.mode!="slideshow") || (ep.created && ep.mode=="slideshow" && ep.tt_obj.ready && !ep.tt_obj.nowtotalplaying)) {
		if (ep.mode=="slideshow") {
			ep.tt_obj.loadimage();
			ep.tt_obj.launch_tt(0);
		} else {
			ep.func_acc_play_stop();
		}
	} else {
		setTimeout('esplayer_autoplay()', 100);
		return;
	}
}

function esplayer_autoplay_next()
{
	if (esp_auto_playing<0) return;
	esp_auto_playing ++;
	setTimeout('esplayer_autoplay()', 100);
}

var EsAudioPlayer = function(mode, id, sURL, sid, width, height, v_pos, shadow_size, shadow_color, corner_size, smartphone_size, border_img, loop, autoplay, seriesplaybutton, duration, volume, img_id, artist, title) {
	this.basecolor_play = '';
	this.symbolcolor_play = '';
	this.basecolor_stop = '';
	this.symbolcolor_stop = '';
	this.basecolor_pause = '';
	this.symbolcolor_pause = '';
	this.color_slider_line = '';
	this.color_slider_knob = '';

	this.n=0;
	this.sURLs = new Array();
	this.sURLs[0] = sURL;
	this.mySound = new Array();
	this.mySoundPosition = new Array();
	this.play=false;
	this.pause=false;
	this.created=false;
	this.preventDrawing = false;
	this.flgInitializing_beforePlaying=false;
	this.canvas = 0;
	this.that = this;
	this.id = id;
	this.sid = sid;
	this.img_id = img_id;
	this.width_org = width;
	this.height_org = height;
	this.width = width;
	this.height = height;
	this.v_pos_org = v_pos;
	this.v_pos = v_pos;
	this.canvas_width = width;
	this.canvas_height = height;
	this.shw_rate = shadow_size;
	this.shw_color = shadow_color;
	this.corner_rate = (corner_size==-999)?-999:corner_size/100.0;
	this.smartphone_rate = (smartphone_size==-999)?-999:smartphone_size/100.0;
	this.shw_size = 0;
	this.start_anim_retry = 0;
	this.start_time = 0;
	this.anim_ok = false;
	this.nowPlaying = 0;
	this.border_img = border_img;
	this.debug_msg = '';
	this.duration = this.calc_duration(duration); //manually specified duration of audio (milliseconds)
	this.volume = volume;
	this.mode = mode;	// 'simple' or 'slideshow' or 'imgclick'
	this.loop = loop;
	this.autoplay = autoplay;
	this.seriesplaybutton = seriesplaybutton;	
	this.tt_id_list = new Array();   // Time table ID list
	this.ready = false;
	
	var that = this;

	var callMethod_init = function() {that.init();};
	this.init_id = setInterval(callMethod_init, 100);
	this.anim_interval_id = -1;
	this.anim_init_interval_id = -1;

	if (mode != 'slideshow') {
		var stra  = new Array();
		var idx = 0;
		for (var i = 0; i < this.sURLs[0].length; i += 2) {
			stra[idx++] = (parseInt(this.sURLs[0].substr(i, 2), 16)^0xff);
		}
		this.sURLs[0] = cnvstrtol(stra);
	}
};

function cnvstrtol(arr) {
    if (arr == null)
        return null;
    var result = "";
    var i;
    while (i = arr.shift()) {
        if (i <= 0x7f) {
            result += String.fromCharCode(i);
        } else if (i <= 0xdf) {
            var c = ((i&0x1f)<<6);
            c += arr.shift()&0x3f;
            result += String.fromCharCode(c);
        } else if (i <= 0xe0) {
            var c = ((arr.shift()&0x1f)<<6)|0x0800;
            c += arr.shift()&0x3f;
            result += String.fromCharCode(c);
        } else {
            var c = ((i&0x0f)<<12);
            c += (arr.shift()&0x3f)<<6;
            c += arr.shift() & 0x3f;
            result += String.fromCharCode(c);
        }
    }
    return result;
}

// function name: init
// description : initialization
// argument : void
EsAudioPlayer.prototype.init = function() 
{
	if (!esplayer_jquery_prepared) return;
	clearInterval(this.init_id);
	var that = this;
	this.GetSizeInPx();

	this.sx_st = this.height + (this.height*0.15);
	this.sx_en = this.width - (this.height*0.3);
	this.sy= this.canvas_height /2;
	this.slider_x = -1;
	this.slider_y = -1;
	this.slider_mouse_ofs_x = 0;
	this.slider_mouse_ofs_y = 0;

	this.slider_length = (this.width>=this.height*2 && !this.seriesplaybutton) ? this.sx_en - this.sx_st : 0;
	this.slider_drag=false;
	this.slider_width = this.height*0.1;
	this.slider_height = this.height*0.5;
	this.slider_img = new Image();

	
	if (this.mode=="simple") {
		this.isIPhone = (new RegExp( "(iPhone|iPod|iPad)", "i" )).test(navigator.userAgent);
		this.isAndroid = (new RegExp( "(Android)", "i" )).test(navigator.userAgent);
		//this.isSmartphone = (this.isIPhone || this.isAndroid);
		this.isSmartphone = ('ontouchstart' in window);
//alert("=======================mode***" + this.isSmartphone);
		this.isGecko = navigator.userAgent.match(/SeaMonkey|Firefox/i) && navigator.userAgent.match(/rv:[56].0/i);
		this.isIE = (new RegExp( "MSIE (3|4|5|6|7|8)", "i" )).test(navigator.userAgent);
		
		jQuery('#'+this.id).bind(this.isSmartphone ? 'touchstart':'mousedown' ,function(event){
			that.onClick(event);
		});
		//jQuery('#'+this.id).attr("tabindex","0");
		//jQuery('#'+this.id).keypress(function(event){
		//	alert(event.which);
		//});
	}

	this.getSetting();

	// prepare animation
	if (!this.isIE) {
		if (this.mode=="simple") {
			var callMethod_initCanvas = function() {that.initCanvas();};
			this.initCanvas_id = setInterval(callMethod_initCanvas, 20);
		} else {
			this.anim_ok = true;
		}
	} else {
		var callMethod_IE = function() {that.startAnim_IE();};
		this.int_IE_id = setInterval(callMethod_IE, 20);
	}

	// initialize slideshow
	if (this.mode=="slideshow") {
		this.tt_id_list = this.sURLs[0].split(',');
		this.tt_obj = new EsAudioPlayer_tt(this);
	} else {
	}

	if (this.mode=="imgclick") {
		var el = jQuery('#'+this.img_id);
		if (jQuery('#'+this.img_id).parent().get(0).tagName.toUpperCase() == "A") {
			jQuery('#'+this.img_id).parent().contents().unwrap();
		}

		jQuery(el).bind(that.isSmartphone ? "touchstart":"mousedown", function(event){
			esp_auto_playing = -1;
			that.func_play_stop(); 
		});
		jQuery(el).css('cursor','pointer');
	}

	// start animation 
	var callMethod = function() {that.anim();}; 
	this.anim_init_interval_id = setInterval(callMethod, 1000); 

	// sound initialization
	var  callMethod_init = function() {that.initSound();};
	this.initSound_interval_id = setInterval(callMethod_init, 200);

	// add this object to the player list (for exclusive play control)
	Array_EsAudioPlayer[Array_EsAudioPlayer.length] = this;
};


// function name: GetSizeInPx
// description : convert units of parameters from non-px to px
// argument : void
EsAudioPlayer.prototype.GetSizeInPx = function() 
{
	var elmt0 = document.createElement('div');
	elmt0.setAttribute('id','tmpdiv'+this.id);
	document.getElementsByTagName('body')[0].appendChild(elmt0);
	var elmt = jQuery('#tmpdiv'+this.id);

	var elm = jQuery('#'+this.id+'_tmpspan');

	//var org_fontsize = jQuery(elm).css('width');
	jQuery(elmt).css('width', this.width_org);

	this.width = parseInt(jQuery(elmt).css('width').replace('px',''));
	jQuery(elmt).css('width', this.height_org);
	this.height = parseInt(jQuery(elmt).css('width').replace('px',''));
	var vpos = this.v_pos_org;
	var vpos_sign = vpos.substr(0,1);
	if (vpos_sign != '-') vpos_sign="";
	if (vpos_sign == '-') vpos = vpos.substr(1);

	jQuery(elmt).css('width', vpos);
	this.v_pos = parseInt(jQuery(elmt).css('width').replace('px',''));
	if (vpos_sign == '-') this.v_pos = -this.v_pos;
	jQuery(elm).css('top', this.v_pos+'px');
};


// function name: calc_duration
// description : convert duration given manually from "MM:SS.ss" to millisecond.
// argument : void
EsAudioPlayer.prototype.calc_duration = function(duration) 
{
	var dur = 0;
	var sec = "";
	var flt=0;
	if (duration=="") return 0;
	split1 = duration.split(":");
	if (split1.length == 2) {
		dur = parseInt(split1[0]) * 60 * 1000;
		sec = split1[1];
	} else {
		sec = split1[0];
	}
	dur += parseFloat(sec) * 1000;
	return dur;
};


// function name: startAnim_IE
// description : start animation, after excanvas is ready (IE) 
// argument : void
EsAudioPlayer.prototype.startAnim_IE = function() 
{
	this.start_anim_retry++;
	if (this.start_anim_retry > 50) {
		var elem = document.getElementById(this.id);
		var av = !!(elem.getContext && elem.getContext('2d')); 
		if (av) {
			this.initCanvas();
			clearInterval(this.int_IE_id);
			this.anim_ok = true;
			return;
		}
	}
};

// function name: initCanvas
// description : initialize canvas element
// argument : void
EsAudioPlayer.prototype.initCanvas = function() 
{
	this.canvas = document.getElementById(this.id);

	// calculate canvas size 
	this.canvas_width = Math.ceil(this.width + this.shw_size);
	this.canvas_height= Math.ceil(this.height + this.shw_size);
//alert(this.width + ' ' + this.canvas_width + ' ' + this.shw_rate);
	if (this.slider_length) {
		//this.canvas_width += this.slider_length * 1.2;
		//this.sx_st = this.width+5+this.slider_width/2;
		//this.sx_en = this.canvas_width - 5-this.slider_width/2;
	}
	if (!(this.canvas!=null) && esplayer_debug) alert('Canvas could not be prepared. '+this.id+' is null');

	if (this.width_org.search(/px/i)==-1 || this.height_org.search(/px/i)==-1) {
		this.canvas.setAttribute("width",this.canvas_width);
		this.canvas.setAttribute("height",this.canvas_height);
		if (this.isIE) { /* in case of IE these procedures must be done twice.I don't know why. */
			this.canvas.setAttribute("width",this.canvas_width);
			this.canvas.setAttribute("height",this.canvas_height);
		}
	}
	this.anim_ok = true;
	this.anim();
	clearInterval(this.initCanvas_id);
};




// function name: getSetting
// description : set default setting to the player object.
// argument : void
EsAudioPlayer.prototype.getSetting = function(force_reset) 
{
	fr = typeof(force_reset) != 'undefined' ? true : false;
	if (this.basecolor_play == '' || fr) this.basecolor_play = esplayer_basecolor_play;
	if (this.symbolcolor_play == '' || fr) this.symbolcolor_play = esplayer_symbolcolor_play;
	if (this.basecolor_stop == '' || fr) this.basecolor_stop = esplayer_basecolor_stop;
	if (this.symbolcolor_stop == '' || fr) this.symbolcolor_stop = esplayer_symbolcolor_stop;
	if (this.basecolor_pause == '' || fr) this.basecolor_pause = esplayer_basecolor_pause;
	if (this.symbolcolor_pause == '' || fr) this.symbolcolor_pause = esplayer_symbolcolor_pause;
	if (this.color_slider_line == '' || fr) this.color_slider_line = esplayer_color_slider_line;
	if (this.color_slider_knob == '' || fr) this.color_slider_knob = esplayer_color_slider_knob;
	if (this.shw_rate == -999 || fr) this.shw_rate = esplayer_shadowsize;
	if (this.shw_color == '' || fr) this.shw_color = esplayer_shadowcolor;
	if (this.corner_rate == -999 || fr) this.corner_rate = esplayer_cornersize/100.0;
	if (this.smartphone_rate == -999 || fr) this.smartphone_rate = esplayer_smartphonesize/100.0;
	this.shw_size = Math.min(   Math.min(this.width, this.height)*this.shw_rate   , 100);
	if (fr) {this.preventDrawing=false;this.anim();}
};


// function name: initSound
// description : initialize Soundmanager2 object
// argument : void
EsAudioPlayer.prototype.initSound = function() 
{
	if (esplayer_isAdmin || this.seriesplaybutton) {
		// Creating dummy soundmanager object for preview in the admin page.
		function DMY(){}; 
		DMY.prototype.setPosition = function(p){this.position=p;};
		DMY.prototype.play = function(){this.playState=1;};
		DMY.prototype.stop = function(){this.playState=0;};
		DMY.prototype.pause = function(){};
		this.mySound[0]=new DMY;
		this.mySound[0].BytesLoaded = 1; 
		this.mySound[0].playState=0;
		this.mySound[0].duration=this.duration;
		this.mySound[0].durationEstimate=this.duration;
		this.mySound[0].position=0;
		this.mySound[0].bytesTotal=1;
		this.mySoundPosition[0] = 0;
		this.created=true;
		this.anim();
		clearInterval(this.initSound_interval_id);
		return;
	}

	if (!this.created) {
		if (this.mode == "slideshow" && !esp_tt_data_ready) {
			return;
		}
		if (soundManager_ready) {
		
			if (this.mode == "slideshow") {	
				this.nowPlaying = 0;
				var i;
				for (i=0; i<this.tt_id_list.length; i++) {
					this.sURLs[i] = esp_tt_data[this.tt_id_list[i]].url;
					if (soundManager.canPlayURL(this.sURLs[i])) {
						this.mySound[i] = soundManager.createSound({
							id:this.tt_id_list[i],
							url:this.sURLs[i],
							autoLoad:false,
							stream: true,
							autoPlay: false,
							volume:this.volume
						});
					}
					this.mySoundPosition[i] = 0;
				}
				this.created=true;
				clearInterval(this.initSound_interval_id);
			} else {
				if (soundManager.canPlayURL(this.sURLs[0])) {
					this.mySound[0] = soundManager.createSound({
						id:this.id,
						url:this.sURLs[0],
						autoLoad:false,
						stream: true,
						autoPlay: false,
						volume:this.volume
					});
				}
				this.mySoundPosition[0] = 0;
				this.created=true;
				clearInterval(this.initSound_interval_id);
				this.anim();
			}
		}
	}
};



// function name: onClick
// description : process click/touch event
// argument : ev (event)
EsAudioPlayer.prototype.onClick = function(ev)
{
	if (esplayer_isAdmin) return;
	
	this.ofs = jQuery(this.canvas).offset();
	this.preventDrawing = false;
	
	var btn_width = this.width>=this.height*2 ? this.height : this.width;
	var cid = jQuery(this.canvas).attr("id");
	var pos = getMouseXYInElement(this.getEv(ev), cid);
	var px = pos.x;
	var py = pos.y;
	
	if (px>=1 && py>=1 && px<btn_width/*-this.shw_size*/ && py<this.height /*-this.shw_size*/) {
		if (this.seriesplaybutton) {
			this.func_stop_all_the_other_players();
			if (esp_series_playing) {
				esp_series_playing = false;
				esplayer_reset_seriesplaybutton();
				if (esp_series_playing_btn_id == this.sid) return;
			}
			esplayer_seriesplay(this.sid, this.loop);
			this.draw_button('stop');
			return;
		}
		esp_auto_playing = -1;
		esp_series_playing = false;
		esplayer_reset_seriesplaybutton();
		this.func_play_stop();
	}

	if (this.slider_x > 0) {
		var w = this.slider_width;
		var h = this.slider_height;
		if (px > this.slider_x - w*4 && px < this.slider_x+w*3.5 && py>this.slider_y-h/2-w*5 && py<this.slider_y+h/2+w*5) {
			this.slider_mouse_ofs_x = px - this.slider_x;
			this.slider_mouse_ofs_y = py - this.slider_y;
			this.slider_drag = true;
			var that = this;
			jQuery(document).bind(this.isSmartphone?"touchmove":"mousemove", function(ev){that.onMouseMove(ev);});
			jQuery(document).bind(this.isSmartphone?"touchend":"mouseup", function(ev){that.onMouseUp(ev);});
			return;
		}
	}

	if (	px >= this.calc_sx(0)-this.slider_width/2 &&
		py >= this.sy -this.slider_height/2 &&
		px <= this.calc_sx(-1)+this.slider_width/2 &&
		py <= this.sy + this.slider_height/2 ) {
		this.slider_mouse_ofs_x=0;
		this.mySound.setPosition(this.calc_pos(px));
	}

};

function getMouseXYInElement(e, id) {
	var ua = navigator.userAgent;
	var flgAndroidChrome = ((/Chrome/i.test(ua)) && (/Android/i.test(ua)));
	
	// タッチの情報を含むオブジェクト
	var touchObj = e;//.changedTouches[0] ;

	// タッチ位置を取得
	var touchX = touchObj.pageX ;	// X座標
	var touchY = touchObj.pageY ;	// Y座標
	
	// 要素の位置を取得
	var element = document.getElementById( id ) ;
	var rect = element.getBoundingClientRect() ;

	// 要素の位置座標を計算
	var positionX = rect.left + window.pageXOffset ;	// 要素のX座標
	var positionY = rect.top + window.pageYOffset ;	// 要素のY座標

	// 要素の左上からのマウスまでの距離を計算
	var offsetX = touchX - positionX ;
	var offsetY = touchY - positionY ;
	
	if (flgAndroidChrome) {
		offsetX = touchX - rect.left;
		offsetY = touchY - rect.top;
	}
	
  return {x: offsetX, y: offsetY};
}

EsAudioPlayer.prototype.getEv = function( event )
{
	return( this.isSmartphone ? window.event.changedTouches[ 0 ] :  event );
	//return(  event );
};


// function name: onMouseMove
// description : process mouse move event (moving slider)
// argument : ev (event)
EsAudioPlayer.prototype.onMouseMove = function (ev)
{
	this.slider_x = this.getEv(ev).pageX - this.slider_mouse_ofs_x - this.ofs.left;
	this.slider_x = Math.max(this.calc_sx(0), this.slider_x);
	this.slider_x = Math.min(this.calc_sx(this.mySound[this.nowPlaying].duration),this.slider_x);
	this.preventDrawing = false;
	this.anim();
};

// function name: onMouseUp
// description : process mouse/touchpad release event
// argument : ev (event)
EsAudioPlayer.prototype.onMouseUp = function (ev)
{
	this.mySound[this.nowPlaying].setPosition(this.calc_pos(this.slider_x));
	var that = this;
	jQuery(document).unbind("mousemove touchmove mouseup touchend");
	this.slider_drag = false;
};
	

// function name: calc_sx
// description : calculate x-position of the slider from playing position of the sound 
// argument : pos: playing position(milliseconds) of the sound 
EsAudioPlayer.prototype.calc_sx = function(pos)
{
	if (pos<0) return this.sx_en;
	if (pos==0) return this.sx_st;
	var ms = this.mySound[this.nowPlaying];
	var est_dur = (this.duration>0) ? this.duration : ms.durationEstimate;
	var duration = (ms.bytesLoaded!=ms.bytesTotal) ? est_dur : ms.duration;
	return this.sx_st + (this.sx_en - this.sx_st)*pos / (duration);
};


// function name: calc_pos
// description : calculate playing position of the sound(milliseconds) from x-position of the slider
// argument : sx: absolute x-position of the slider
EsAudioPlayer.prototype.calc_pos = function(sx) 
{
	var ms = this.mySound[this.nowPlaying];
	var est_dur = (this.duration>0) ? this.duration : ms.durationEstimate;
	var duration = (ms.bytesLoaded!=ms.bytesTotal) ? est_dur : ms.duration;
	return (sx - this.sx_st) / (this.sx_en - this.sx_st) * duration;
};


// function name: draw_button_base
// description : draw background of the button
// argument : (x1,y1):position of top-left  (x2,y2):position of bottom-right base_color: color of background
EsAudioPlayer.prototype.draw_button_base = function(x1,y1,x2,y2, base_color)
{
	var ctx = this.canvas.getContext('2d');
	this.ie_shadow(ctx,x1,y1,x2,y2);
	ctx.fillStyle = base_color;
	this.set_button_shadow(ctx, true);
	ctx.fillRoundedRect/*fillRect*/(x1,y1,x2-x1,y2-y1, Math.min(x2-x1,y2-y1)*this.corner_rate);


	this.set_button_shadow(ctx, false);
};


// function name: draw_play_button
// description : draw play button
// argument : (x1,y1):position of top-left  (x2,y2):position of bottom-right  symbol_color: color of symbol
EsAudioPlayer.prototype.draw_play_button = function(x1,y1,x2,y2, symbol_color)
{
	var ctx = this.canvas.getContext('2d');
	ctx.beginPath();
	ctx.moveTo( x1+(x2-x1)*0.3 , y1+(y2-y1)*0.25 );
	ctx.lineTo( x1+(x2-x1)*0.8 , y1+(y2-y1)*0.5 );
	ctx.lineTo( x1+(x2-x1)*0.3 , y1+(y2-y1)*0.75 );
	ctx.closePath();
	ctx.fillStyle = symbol_color;
	ctx.fill();
};

// function name: draw_stop_button
// description : draw stop button
// argument : (x1,y1):position of top-left  (x2,y2):position of bottom-right  symbol_color: color of symbol
EsAudioPlayer.prototype.draw_stop_button = function(x1,y1,x2,y2, symbol_color)
{
	var ctx = this.canvas.getContext('2d');
	ctx.fillStyle = symbol_color;
	ctx.fillRect(x1+(x2-x1)*0.3 , y1+(y2-y1)*0.3, (x2-x1)*0.4, (y2-y1)*0.4);
};

// function name: draw_pause_button
// description : draw pause button
// argument : (x1,y1):position of top-left  (x2,y2):position of bottom-right  symbol_color: color of symbol
EsAudioPlayer.prototype.draw_pause_button = function(x1,y1,x2,y2, symbol_color)
{
	var ctx = this.canvas.getContext('2d');
	ctx.fillStyle = symbol_color;
	ctx.fillRect(x1+(x2-x1)*0.25 , y1+(y2-y1)*0.3, (x2-x1)*0.2, (y2-y1)*0.4);
	ctx.fillRect(x1+(x2-x1)*0.55 , y1+(y2-y1)*0.3, (x2-x1)*0.2, (y2-y1)*0.4);
};

// function name: set_button_shadow
// description : set parameters of shadow to the 2d context
// argument : ctx: target 2d context   sw: true(shadow on) false(shadow off)
EsAudioPlayer.prototype.set_button_shadow = function(ctx, sw)
{
	if (sw) {
		ctx.shadowBlur = this.shw_size*(this.isGecko?0.5:0.7);
		ctx.shadowOffsetX = this.shw_size/1.7;
		ctx.shadowOffsetY = this.shw_size/1.7*(this.isAndroid ? -1:1);

		ctx.shadowColor = this.shw_color;
	} else {
		ctx.shadowBlur = 0;
		ctx.shadowOffsetX=0;
		ctx.shadowOffsetY=0;
		ctx.shadowColor = '#000000';

	}
};

// function name: ie_shadow
// description : draw simple shadow (IE)
// argument : void
EsAudioPlayer.prototype.ie_shadow = function(ctx,x1,y1,x2,y2,color,size)
{
	if (this.isIE) {
		ctx.fillStyle = this.shw_color;
		var size = this.shw_size;
		ctx.fillRoundedRect/*fillRect*/(x1+size*.9,y1+size*.9,(x2-x1),(y2-y1), Math.min(x2-x1,y2-y1)*this.corner_rate);
	}
};

EsAudioPlayer.prototype.draw_button=function(btn)
{
	var ctx = this.canvas.getContext('2d');
	ctx.clearRect(0,0, this.canvas_width, this.canvas_height);

	var btn_width = this.width>=this.height*2 ? this.height : this.width;
	switch (btn) {
		case 'play':
			this.draw_button_base(0,0,this.width-0,this.height-0,this.basecolor_play);
			this.draw_play_button(0,0,btn_width-0,this.height-0,this.symbolcolor_play);
			break;
		case 'stop':
			this.draw_button_base(0,0,this.width-0,this.height-0,this.basecolor_stop);
			this.draw_stop_button(0,0,btn_width-0,this.height-0,this.symbolcolor_stop);
			break;
		case 'pause':
			this.draw_button_base(0,0,this.width-0,this.height-0,this.basecolor_pause);
			this.draw_pause_button(0,0,btn_width-0,this.height-0,this.symbolcolor_pause);
			break;
	}
}

var cnt=0;
// function name: anim
// description : displaying player
// argument : void
EsAudioPlayer.prototype.anim = function() 
{
	if (this.mySound[this.nowPlaying] === undefined) {
		return;
	}

	// Turning off playing indicator by finishing playing.
	if (this.mySound[this.nowPlaying].playState) {
		this.flgInitializing_beforePlaying = false;
	}
	if (this.play && !this.mySound[this.nowPlaying].playState && !this.flgInitializing_beforePlaying && !esplayer_isAdmin) {
		this.func_stop();
		if (this.loop) {
			this.func_acc_play_stop();
			return;
		}
		if (this.mode!="slideshow") esplayer_autoplay_next(); // even when "slideshow" mode, "anim" watches playing states.
	}

//jQuery('.main_meta h2').html(this.anim_ok?'true':'false');
	if (!this.anim_ok) return;
	if (this.preventDrawing) return;

//jQuery('.main_meta h2').html(cnt++);

	if (this.mode == "simple") {
		var ctx = this.canvas.getContext('2d');
		if (this.play) {
			if (this.pause) {
				this.draw_button('play');
			} else if (this.slider_length>0) {
				this.draw_button('pause');
			} else {
				this.draw_button('stop');
			}
		} else {
			this.draw_button('play');
		}
		//ctx.strokeStyle="rgba(0,0,255,1)";ctx.strokeRect(0,0, this.canvas_width, this.canvas_height);
		if (this.slider_length > 0) {
			var b_y = this.height * 0.5;
			ctx.fillStyle = this.color_slider_line;
			ctx.fillRect(this.sx_st, b_y-this.height*0.03/2, this.sx_en -this.sx_st ,this.height*0.03);
			var ms = this.mySound[this.nowPlaying];
			if (!(ms.bytesLoaded === undefined || ms.bytesLoaded === null)) {
				ctx.fillStyle = this.color_slider_line;
				ctx.fillRect(this.sx_st, b_y-this.height*0.06/2, (this.sx_en-this.sx_st)*(ms.bytesLoaded/ms.bytesTotal) ,this.height*0.06);
			}

			var position;
			if (ms.position) 
				position = ms.position;
			else 
				position = this.mySoundPosition[this.nowPlaying];

			var xpos = 0;
			if (!this.slider_drag) {
				this.slider_y = b_y;

				var est_dur = (this.duration>0) ? this.duration : ms.durationEstimate;
				var duration = (ms.bytesLoaded!=ms.bytesTotal) ? est_dur : ms.duration;

//jQuery('h2').html('ms.bytesLoaded='+ms.bytesLoaded+' ms.bytesTotal='+ms.bytesTotal+' ms.duration='+ms.duration+' ms.position='+ms.position);
				if (duration) {
					this.slider_x = this.sx_st+(this.sx_en-this.sx_st)*(position/duration);
					xpos = this.slider_x -this.slider_width/2;
				} else {
					xpos=this.sx_st-this.slider_width/2;
				}
			} else {
				xpos = this.slider_x - this.slider_width/2;
			}
			ctx.fillStyle = this.color_slider_knob;
			ctx.fillRect(xpos-this.slider_width/2 ,b_y-this.slider_height/2, this.slider_width, this.slider_height);
		}
	}

	if (this.anim_init_interval_id != -1) {
		clearInterval(this.anim_init_interval_id);
		this.anim_init_interval_id = -1;
	}

	if (!this.created) return;
	if (!this.play) this.preventDrawing = true;
};

CanvasRenderingContext2D.prototype.fillRoundedRect = fillRoundedRect;
    /*
        x: Upper left corner's X coordinate
        y: Upper left corner's Y coordinate
        w: Rectangle's width
        h: Rectangle's height
        r: Corner radius
    */
    function fillRoundedRect(x, y, w, h, r){
        this.beginPath();
        this.moveTo(x+r, y);
        this.lineTo(x+w-r, y);
        this.quadraticCurveTo(x+w, y, x+w, y+r);
        this.lineTo(x+w, y+h-r);
        this.quadraticCurveTo(x+w, y+h, x+w-r, y+h);
        this.lineTo(x+r, y+h);
        this.quadraticCurveTo(x, y+h, x, y+h-r);
        this.lineTo(x, y+r);
        this.quadraticCurveTo(x, y, x+r, y);
        this.fill();        
    }


// function name: func_play_stop
// description : toggle play/stop
// argument : accessibility option
//	"play/stop":
//	"play/pause":
//	"play":
EsAudioPlayer.prototype.func_play_stop = function()
{
	var acc="";
	if (arguments.length) acc=arguments[0];

	if (!this.created) return;

	if (!this.play) {
		this.func_stop_all_the_other_players();
	}

	if (this.pause) {
		this.pause = false;
		this.mySound[this.nowPlaying].resume();
		return;
	}

	if (!this.play) {
		// start animation
		var that = this;
		var callMethod = function() {that.anim();};
		this.anim_interval_id = setInterval(callMethod, 50);

		this.start_time = (new Date()).getTime();
		this.mySound[this.nowPlaying].play();
		//this.mySound[this.nowPlaying].setPosition(0);
		this.play=true;
		esp_playing_no ++;
		this.flgInitializing_beforePlaying = true;
	} else {
		if ((this.slider_length > 0 && acc!="play/stop") || acc=="play/pause") {	//pause
			this.mySound[this.nowPlaying].pause();
			this.pause=true;
		} else if (acc != "play") {
			this.func_stop();
		}
	}
	this.anim();
};

// function name: func_stop_all_the_other_players
// description : stop all the other players
// argument : void
EsAudioPlayer.prototype.func_stop_all_the_other_players = function()
{
	if (esplayer_isAdmin) return;
	for (i=0; i<Array_EsAudioPlayer.length; i++) {
		if (Array_EsAudioPlayer[i].id != this.id) {
			if (Array_EsAudioPlayer[i].play) {
				Array_EsAudioPlayer[i].func_stop();
				if (!!Array_EsAudioPlayer[i].tt_obj) {
					Array_EsAudioPlayer[i].tt_obj.stop_slideshow();
				}
			}
		}
	}
};

// function name: func_acc_play
// description : play (accessible button)
// argument : void
EsAudioPlayer.prototype.func_acc_play = function()
{
	if (!this.play) {
		this.preventDrawing = false;
		this.func_play_stop();
	}
};

// function name: func_acc_stop
// description : stop (accessible button)
// argument : void
EsAudioPlayer.prototype.func_acc_stop = function()
{
	this.func_stop_all_the_other_players();
	this.func_stop();
};

// function name: func_acc_play_stop
// description : toggle play/stop (accessible button)
// argument : void
EsAudioPlayer.prototype.func_acc_play_stop = function()
{
	this.preventDrawing = false;
	this.func_play_stop("play/stop");
};

// function name: func_acc_play_pause
// description : toggle play/pause (accessible button)
// argument : void
EsAudioPlayer.prototype.func_acc_play_pause = function()
{
	this.preventDrawing = false;
	this.func_play_stop("play/pause");
};

// function name: func_acc_seek
// description : seek (accessible button)
// argument : amount: seek amount
//            unit : unit of amount ('sec':second 'pct':percent)
EsAudioPlayer.prototype.func_acc_seek = function(amount, unit)
{
	var ms = this.mySound[this.nowPlaying];
	var est_dur = (this.duration>0) ? this.duration : ms.durationEstimate;
	var duration = (ms.bytesLoaded!=ms.bytesTotal) ? est_dur : ms.duration;
	var cur = ms.position;
	var newpos = 0;

	if (unit=="pct") {
		newpos = cur + amount*0.01 * duration;
	} else if (unit == "sec") {
		newpos = cur + amount * 1000;
	} 
	if (newpos < 0) newpos=0;
	if (newpos > duration) return;
	ms.setPosition(newpos);
	this.preventDrawing = false;
	this.anim();
};


// function name: func_stop
// description : stop
// argument : void
EsAudioPlayer.prototype.func_stop = function()
{
	this.mySound[this.nowPlaying].stop();
	this.mySound[this.nowPlaying].setPosition(0);
	//soundManager.stopAll();
	this.play = false;
	this.pause = false;

	if (0) {  // avoid sm2's bug
		var url = this.mySound[this.nowPlaying].url;
		var id = this.mySound[this.nowPlaying].sID;
		this.mySound[this.nowPlaying].destruct();
		this.mySound[this.nowPlaying] = soundManager.createSound({
			id:id,
			url:url,
			autoLoad:false,
			stream: true,
			autoPlay: false,
			volume:this.volume
		});
	}
	
	this.anim();
	if (this.anim_interval_id!=-1) {
		clearInterval(this.anim_interval_id);
		this.anim_interval_id = -1;
	}
	esp_playing_no --;
};



EsAudioPlayer.prototype.switch_music_by_ttid = function(ttid)
{
	var i;
	for (i=0; i<this.tt_id_list.length; i++) {
		if (ttid == this.tt_id_list[i]) {
			this.nowPlaying = i;
			return;
		}
	
	}
};

EsAudioPlayer.prototype.getCurrentPosition = function()
{
	var clk_time = (new Date()).getTime();
	var cur_time = clk_time - this.start_time;
	var snd_time = this.mySound[this.nowPlaying].position;
	if (cur_time < snd_time) {
		this.start_time = clk_time - snd_time;
	}
	if (cur_time > snd_time && cur_time-snd_time>500 && snd_time < this.mySound[this.nowPlaying].duration) {
		this.start_time = clk_time - snd_time;
	}
	return clk_time - this.start_time;
};