
/* Flags */

var tk_g_init		= false;
var tk_g_debug		= true;
var tk_g_isCSS		= false;
var tk_g_isW3C		= false;
var tk_g_isIE4		= false;
var tk_g_isNN4		= false;
var tk_g_isIE6CSS	= false;
var tk_g_isIE		= false;
var tk_g_isOpera	= false;


/* Initializer */

function TKInit() {

	if(document.images) {

		tk_g_isIE = navigator.appVersion.match(/MSIE (\d\.\d)/);
		tk_g_isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
		tk_g_isCSS = (document.body && document.body.style) ? true : false;
		tk_g_isW3C = (tk_g_isCSS && document.getElementById) ? true : false;
		tk_g_isIE4 = (tk_g_isCSS && document.all) ? true : false;
		tk_g_isNN4 = (document.layers) ? true : false;
		tk_g_isIE6CSS = (document.compatMode && document.compatMode.indexOf("CSS1") >= 0 ) ? true : false;

	}

	tk_g_init = true;

}

/* Size, Position Function */

function TKCoord() {
}

TKCoord.prototype = {

	getLeft: function(obj){
		var ost = $(obj);
		var osl = 0;
		while(ost){
			osl += ost.offsetLeft;
			ost = ost.offsetParent;
		}
		if(navigator.userAgent.indexOf("Mac") != -1 && typeof document.body.leftMargin != "undefined" ) {
			osl += document.body.leftMargin;
		}
		return parseInt(osl);
	},

	getTop: function(obj){
		var ost = $(obj);
		var ost = 0;
		while(ost){
			ost += ost.offsetTop;
			ost = ost.offsetParent;
		}
		if(navigator.userAgent.indexOf("Mac") != -1
			&& typeof document.body.leftMargin != "undefined" ) {
			ost += document.body.topMargin;
		}
		return parseInt(ost);
	},

	getWidth: function(obj){
		var e = $(obj);
		var r = 0;
		if(e.offsetWidth) {
			r = e.offsetWidth;
		}
		else if(e.clip && e.clip.width) {
			r = e.clip.width;
		}
		else if(e.style && e.style.pixelWidth) {
			r = e.style.pixelWidth;
		}
		return parseInt(r);
	},

	getHeight: function(obj){
		var e = $(obj);
		var r = 0;
		if(e.offsetHeight) {
			r = e.offsetHeight;
		}
		else if(e.clip && e.clip.height) {
			r = e.clip.height;
		}
		else if(e.style && e.style.pixelHeight) {
			r = e.style.pixelHeight;
		}
		return parseInt(r);
	},

	getScrollLeft: function() {
		if (typeof window.pageXOffset != 'undefined') {
			return window.pageXOffset;
		}
		else if (typeof document.documentElement.scrollLeft
			!= 'undefined' && document.documentElement.scrollLeft > 0) {
			return document.documentElement.scrollLeft;
		}
		else if (typeof document.body.scrollLeft != 'undefined') {
			return document.body.scrollLeft;
		}
		return 0;
	},

	getScrollTop: function(){
		if (typeof window.pageYOffset != 'undefined') {
			return window.pageYOffset;
		}
		else if (typeof document.documentElement.scrollTop
			!= 'undefined' && document.documentElement.scrollTop > 0) {
			return document.documentElement.scrollTop;
		}
		else if (typeof document.body.scrollTop != 'undefined') {
			return document.body.scrollTop;
		}
		return 0;
	},

	getClientWidth: function(){
		if (typeof window.innerWidth != 'undefined') {
			return window.innerWidth;
		}
		else if (typeof document.documentElement != 'undefined'
			&& typeof document.documentElement.clientWidth != 'undefined'
			&& document.documentElement.clientWidth != 0) {
			return document.documentElement.clientWidth;
		}
		else {
			return document.getElementsByTagName('body')[0].clientWidth;
		}
	},

	getClientHeight: function(){
		if (typeof window.innerHeight != 'undefined') {
			return window.innerHeight;
		}
		else if (typeof document.documentElement != 'undefined'
			&& typeof document.documentElement.clientHeight != 'undefined'
			&& document.documentElement.clientHeight != 0) {
			return document.documentElement.clientHeight;
		}
		else {
			return document.getElementsByTagName('body')[0].clientHeight;
		}
	}

}

/* Date */

Date.prototype.addHours = function (n) {this.setHours (this.getHours () + n)}


/* Visibility */

function TKStyle(){
}

TKStyle.prototype = {

	getStyle: function(obj){
		var elm = $(obj);
		if(elm && tk_g_isCSS) {
			elm = elm.style;
		}
		return elm;
	}

}

/* Node Manipulation */

function TKDom() {
}

TKDom.prototype = {

	removeElement: function(obj) {
		var elm = $(obj);
		if(elm){
			elm.parentNode.removeChild(elm);
		}
	}

}


/* HTML Element */

function TKHtmlElement(){
}

TKHtmlElement.prototype = {

	setFocus: function(obj){
		var elm = $(obj);
		if(elm){
			elm.focus();
		}
	}

}


/* Formatter */

function TKFormatter() {
}

TKFormatter.prototype = {

	getPhone : function(s) {
		var __ptn = /\b(\d{3})(\d{3})(\d{4})\b/;
		var m = s.match(__ptn);
		if(m){
			return '(' + m[1] + ') ' + m[2] + '-' + m[3];
		}
		return s;
	},


	getUTCDateTime : function(t) {
		var m ;
		if(t.getUTCMinutes() < 9) {
			m = '0' + t.getUTCMinutes();
		}
		else {
			m = t.getUTCMinutes();
		}

		return (t.getUTCMonth()+1) + '/' + t.getUTCDate() + '/' + t.getUTCFullYear()
			+ ' ' + t.getUTCHours() + ':' + m;
	},

	getLink : function(s){

		if(!s){
			return '';
		}

		var re_url = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
		var re_mail = /(^((?:\w+\.?)*\w+@(?:\w+\.)+\w+)$)/gi;

		s = s.replace( re_url, '<a href="$1" target="_blank">$1</a>' );
		s = s.replace( re_mail, '<a href="mailto:$1">$1</a>');

		return s;

	},
	
	unescapeHTML : function(s){
	
		if(!s){
			return '';
		}
		
		s = s.replace(/\\&#039;/gi, "&#039;");
		s = s.replace(/\\'/gi, "'");
	
		return s;
	},
	
	toabc : function(s){
	
		s = s.replace(/Ａ/g, "A");
		s = s.replace(/Ｂ/g, "B");
		s = s.replace(/Ｃ/g, "C");
		s = s.replace(/Ｄ/g, "D");
		s = s.replace(/Ｅ/g, "E");
		s = s.replace(/Ｆ/g, "F");
		s = s.replace(/Ｇ/g, "G");
		s = s.replace(/Ｈ/g, "H");
		s = s.replace(/Ｉ/g, "I");
		s = s.replace(/Ｊ/g, "J");
		s = s.replace(/Ｋ/g, "K");
		s = s.replace(/Ｌ/g, "L");
		s = s.replace(/Ｍ/g, "M");
		s = s.replace(/Ｎ/g, "N");
		s = s.replace(/Ｏ/g, "O");
		s = s.replace(/Ｐ/g, "P");
		s = s.replace(/Ｑ/g, "Q");
		s = s.replace(/Ｒ/g, "R");
		s = s.replace(/Ｓ/g, "S");
		s = s.replace(/Ｔ/g, "T");
		s = s.replace(/Ｕ/g, "U");
		s = s.replace(/Ｖ/g, "V");
		s = s.replace(/Ｗ/g, "W");
		s = s.replace(/Ｘ/g, "X");
		s = s.replace(/Ｙ/g, "Y");
		s = s.replace(/Ｚ/g, "Z");

		s = s.replace(/ａ/g, "a");
		s = s.replace(/ｂ/g, "b");
		s = s.replace(/ｃ/g, "c");
		s = s.replace(/ｄ/g, "d");
		s = s.replace(/ｅ/g, "e");
		s = s.replace(/ｆ/g, "f");
		s = s.replace(/ｇ/g, "g");
		s = s.replace(/ｈ/g, "h");
		s = s.replace(/ｉ/g, "i");
		s = s.replace(/ｊ/g, "j");
		s = s.replace(/ｋ/g, "k");
		s = s.replace(/ｌ/g, "l");
		s = s.replace(/ｍ/g, "m");
		s = s.replace(/ｎ/g, "n");
		s = s.replace(/ｏ/g, "o");
		s = s.replace(/ｐ/g, "p");
		s = s.replace(/ｑ/g, "q");
		s = s.replace(/ｒ/g, "r");
		s = s.replace(/ｓ/g, "s");
		s = s.replace(/ｔ/g, "t");
		s = s.replace(/ｕ/g, "u");
		s = s.replace(/ｖ/g, "v");
		s = s.replace(/ｗ/g, "w");
		s = s.replace(/ｘ/g, "x");
		s = s.replace(/ｙ/g, "y");
		s = s.replace(/ｚ/g, "z");
		
		return s;
	}

}


/* StringBuilder */

function TKStringBuffer() {
	this.__buffer = new Array();
}


TKStringBuffer.prototype = {
	clear : function() { this.__buffer = new Array(); },
	append : function(s) { this.__buffer.push(s); },
	appendn : function(s) { this.append(s); this.append('\n'); },
	toString : function() {	return this.__buffer.join(''); },
	/* Alias */
	a : function(s) { this.append(s); },
	an : function(s) { this.appendn(s); }
}


/* Utilities */

function TKUrl(){
}

TKUrl.prototype = {

	getFileName: function(){
		var parts = document.location.pathname.split('/');
		if(parts==null){
			return null;
		}
		return parts[parts.length-1].split('.')[0];
	},

	getArgs: function(){
		var args = new Object();
		var query = location.search.substring(1);
		var pairs = query.split('&');
		for(var i=0; i<pairs.length; i++){
			var pos = pairs[i].indexOf('=');
			if(pos == -1){
				continue;
			}
			var argname = pairs[i].substring(0,pos);
			var value = pairs[i].substring(pos+1);
			value = decodeURIComponent(value);
			args[argname] = value;
		}
		return args;
	}

}

/* Debug Utilities */

function TKDebug(){
}

TKDebug.prototype = {

	alert: function(s){
		if(tk_g_debug){
			alert(s);
		}
	}

}


/* Helper Class */

function TKPoint(a,b){
	this.x = a;
	this.y = b;
}


function TKShape(s){
	this.shape = s;
	this.left = 0;
	this.top = 0;
	this.width = 0;
	this.height = 0;
}


/* Graphics Library */


var tk_g_grfxid = 0;

var tk_g_circle		= 'CIRCLE';
var tk_g_triangle	= 'TRIANGLE';
var tk_g_rect		= 'RECT';
var tk_g_line		= 'LINE';
var tk_g_VMLStyleAdded = false;

function TKGraphics(cvs){

	this.__col_fill			= '#000000';
	this.__col_line			= '#000000';
	this.__line_width		= '2px';
	this.__endcap			= 'round';
	this.__opacity			= '0';
	this.__canvas			= $(cvs);
	this.__shapes			= new Array();
	var coord = new TKCoord();
	this.__canvas_width		= coord.getWidth(cvs);
	this.__canvas_height	= coord.getHeight(cvs);
	this.__canvas_id		= tk_g_grfxid++;

	if(!tk_g_init){
		TKInit();
	}

	if(tk_g_isIE){

		// xmlns:v="urn:schemas-microsoft-com:vml"
		var elms = document.getElementsByTagName('html');
		for(var i=0; i<elms.length; i++){
			elms[i].setAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml');
		}

		if(!tk_g_VMLStyleAdded){
			var s = this.__canvas.ownerDocument.createStyleSheet();
			s.addRule('v\\:*', "behavior: url(#default#VML);");
			tk_g_VMLStyleAdded = true;
		}

	}
	else{ // FireFox

		var root = document.createElement('canvas');
		root.setAttribute('id','canvas' + this.__canvas_id);
		root.setAttribute('width', this.__canvas_width);
		root.setAttribute('height', this.__canvas_height);

		// Remove old canvas element
		var cs = this.__canvas.getElementsByTagName('canvas');
		for(var i=0;i<cs.length;i++){
			tk_removeObject(cs[i]);
		}

		this.__canvas.appendChild(root);
	}

}


TKGraphics.prototype = {

	setFillColorRGB: function(r,g,b){
		var c = new TKColor();
		if(c.setRGBColor(r,g,b)){
			this.__col_fill = c.hex;
			return true;
		}
		return false;
	},


	setFillColor: function(col){
		var c = new TKColor();
		if(c.setHexColor(c.getHexByNamedColor(col))){
			this.__col_fill = c.hex;
			return true;
		}
		return false;
	},


	setLineColorRGB: function(r,g,b){
		var c = new TKColor();
		if(c.setRGBColor(r,g,b)){
			this.__col_line = c.hex;
			return true;
		}
		return false;
	},


	setLineColor: function(col){
		var c = new TKColor();
		if(c.setHexColor(c.getHexByNamedColor(col))){
			this.__col_line = c.hex;
			return true;
		}
		return false;
	},


	setLineWidth: function(w){
		this.__line_width = w;
	},


	setOpacity: function(v){
		var p = parseFloat(v);
		if(0<=p && p<=1){
			this.__opacity = p;
		}
	},


	setEndCap: function(s){
		if(s.match(/^(butt|round|square)$/i)){
			this.__endcap = s;
			return true;
		}
		return false;
	},

	getIEEndCap: function(s){
		switch(s.toUpperCase()){
		case 'ROUND':
			return 'round';
		case 'SQUARE':
			return 'square';
		case 'BUTT':
			return 'flat';
		}
		return '';
	},

	// Flush

	flush: function(){

		var opacity;
		var top, left, width, height;
		var tag;

		if(tk_g_isIE){

			// dalert('flush() for IE');
			var sb = new TKStringBuffer();
			var coord = new TKCoord();
			var c_x = coord.getLeft(this.__canvas_id);
			var c_y = coord.getTop(this.__canvas_id);

			sb.a('<v:group id="canvas_group' + this.__canvas_id + '" coordorigin="0,0" style="position:absolute;left:' + c_x + ';top:' + c_y + ';width:' + this.__canvas_width + ';height:' + this.__canvas_height + ';" coordsize="' + this.__canvas_width + ',' + this.__canvas_height + '">');

			// Build HTML
			for(var i=0; i<this.__shapes.length; i++){

				var s = this.__shapes[i];

				switch(s.shape){
				case tk_g_line:

					opacity	= 1 - (parseFloat(s.opacity));

					sb.a('<v:line');
					sb.a(' from="' + s.x1 + ',' + s.y1 + '" to="' + s.x2 + ',' + s.y2 + '"');
					sb.a(' strokecolor="' + s.strokecolor + '"');
					sb.a(' strokeweight="' + s.strokeweight + '"');
					sb.a('>');
					sb.a('<v:stroke opacity="' + opacity + '"/>');
					sb.a('</v:line>');

					break;
				case tk_g_circle:

					opacity	= 1 - (parseFloat(s.opacity));
					left	= parseFloat(s.x) - parseFloat(s.r);
					top	= parseFloat(s.y) - parseFloat(s.r);
					width	= 2 * parseFloat(s.r);
					height	= width;

					sb.a('<v:oval');
					sb.a(' style="top:' + top + ';left:' + left + ';width:' + width + ';height:' + height + '"');
					sb.a(' strokeweight="' + s.strokeweight + '"');
					sb.a(' strokecolor="' + s.strokecolor + '"');
					//sb.a(' coordorigin="0,0"');
					//sb.a(' coordsize="' + this.__canvas_width + ' ' + this.__canvas_height + '"');

					sb.a('>');
					if(s.fill){
						sb.a('<v:fill');
						sb.a(' type="solid" color="' + s.fillcolor + '" color2="' + s.fillcolor + '"');
						sb.a(' opacity="' + opacity + '"');
						sb.a('/>');
					}
					sb.a('<v:stroke opacity="' + opacity + '"/>');
					sb.a('</v:oval>');

					break;

				case tk_g_rect:

					opacity = 1 - (parseFloat(s.opacity));

					if(s.endcap.toUpperCase() == 'ROUND'){
						tag = 'roundrect';
					}
					else{
						tag = 'rect';
					}

					sb.a('<v:' + tag);
					sb.a(' strokecolor="' + s.strokecolor + '"');
					sb.a(' strokeweight="' + s.strokeweight + '"');
					sb.a(' style="top:' + s.top + ';left:' + s.left + ';width:' + s.width + ';height:' + s.height + '"');
					sb.a(' coordorigin="0,0"');
					//sb.a(' coordsize="' + this.__canvas_width + ' ' + this.__canvas_height + '"');

					if(tag=='roundrect'){
						sb.a(' arcsize="2%"');
					}
					sb.a('>');
					if(s.fill){
						sb.a('<v:fill type="solid" color="' + s.fillcolor + '" color2="' + s.fillcolor + '" opacity="' + opacity + '"/>');
					}
					sb.a('<v:stroke type="solid" opacity="' + opacity + '"/>');
					sb.a('</v:' + tag + '>');
					break;

				case tk_g_triangle:

					opacity = 1 - (parseFloat(s.opacity));

					sb.a('<v:shape');
					sb.a(' strokecolor="' + s.strokecolor + '"');
					sb.a(' strokeweight="' + s.strokeweight + '"');
					sb.a(' coordorigin="0,0"');
					sb.a(' coordsize="' + this.__canvas_width + ' ' + this.__canvas_height + '"');
					sb.a(' style="top:' + s.top + ';left:' + s.left + ';width:' + s.width + ';height:' + s.height + '"');
					sb.a(' path="m ' + s.x1 + ',' + s.y1 + ' l ' + s.x2 + ',' + s.y2 + ', ' + s.x3 + ',' + s.y3 + ' x e"');
					sb.a('>');
					if(s.fill){
						sb.a('<v:fill type="solid" color="' + s.fillcolor + '" color2="' + s.fillcolor + '" opacity="' + opacity + '"/>');
					}
					sb.a('<v:stroke opacity="' + opacity + '" endcap="' + this.getIEEndCap(s.endcap) + '"/>');
					sb.a('</v:shape>');
					break;

				}
			}

			sb.a('</v:group>');

			// dalert(sb.toString());

			this.__canvas.innerHTML = sb.toString();

		}// End Of IE flush()
		else{

			//dalert('flush() for Firefox');

			var elm = $('canvas' + this.__canvas_id);
			var ctx = elm.getContext('2d');
			var c;

			for(var i=0;i<this.__shapes.length;i++){

				var s = this.__shapes[i];

				switch(s.shape){
				case tk_g_line:

					opacity = 1 - (parseFloat(s.opacity));
					c = new TKColor();

					c.setHexColor(c.getHexByNamedColor(s.strokecolor));
					ctx.strokeStyle = 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + opacity + ')';
					ctx.lineWidth = s.strokeweight;
					ctx.lineJoin	= s.endcap;

					ctx.beginPath();
					ctx.moveTo(s.x1,s.y1);
					ctx.lineTo(s.x2,s.y2);
					ctx.closePath();
					ctx.stroke();
					break;

				case tk_g_circle:
					opacity = 1 - (parseFloat(s.opacity));
					c = new TKColor();

					if(s.fill){
						c.setHexColor(c.getHexByNamedColor(s.fillcolor));
						ctx.fillStyle = 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + opacity + ')';
						ctx.beginPath();
						ctx.arc(s.x, s.y, s.r, 0, 2*Math.PI,false);
						ctx.fill();
					}

					c.setHexColor(c.getHexByNamedColor(s.strokecolor));
					ctx.strokeStyle = 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + opacity + ')';
					ctx.lineWidth = s.strokeweight;
					ctx.beginPath();
					ctx.arc(s.x, s.y, s.r, 0, 2*Math.PI, false);
					ctx.stroke();
					break;

				case tk_g_rect:
					opacity = 1 - (parseFloat(s.opacity));
					c = new TKColor();

					if(s.fill){
						c.setHexColor(c.getHexByNamedColor(s.fillcolor));
						ctx.fillStyle = 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + opacity + ')';
						ctx.fillRect(s.left, s.top, s.width, s.height);
					}

					c.setHexColor(c.getHexByNamedColor(s.strokecolor));
					ctx.strokeStyle = 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + opacity + ')';
					ctx.lineWidth = s.strokeweight;
					ctx.lineJoin	= s.endcap;
					ctx.strokeRect(s.left, s.top, s.width, s.height);
					break;

				case tk_g_triangle:
					opacity = 1 - (parseFloat(s.opacity));
					c = new TKColor();
					ctx.lineWidth	= s.strokeweight;

					c.setHexColor(c.getHexByNamedColor(s.strokecolor));
					ctx.strokeStyle = 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + opacity + ')';

					if(s.fill){
						c.setHexColor(c.getHexByNamedColor(s.fillcolor));
						ctx.fillStyle = 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + opacity + ')';

						ctx.beginPath();
						ctx.moveTo(s.x1,s.y1);
						ctx.lineTo(s.x2,s.y2);
						ctx.lineTo(s.x3,s.y3);
						ctx.fill();
					}

					ctx.lineJoin	= s.endcap;
					ctx.beginPath();
					ctx.moveTo(s.x1,s.y1);
					ctx.lineTo(s.x2,s.y2);
					ctx.lineTo(s.x3,s.y3);
					ctx.closePath();

					ctx.stroke();

					break;
				}
			}

		}// End Of FF Flush();

		// Clear
		this.__shapes = new Array();

	},

	// Circle

	circle: function(x,y,r,fill,fillcolor){

		var s = new TKShape(tk_g_circle);
		s.fill = fill;

		if(fill){
			if(fillcolor == null){
				s.fillcolor = this.__col_fill;
			}
			else{
				s.fillcolor = fillcolor;
			}
		}

		s.strokecolor	= this.__col_line;
		s.strokeweight	= this.__line_width;
		s.opacity	= this.__opacity;

		s.x = x;
		s.y = y;
		s.r = r;

		this.__shapes.push(s);
	},


	drawCircle: function(x,y,r){

		this.circle(x,y,r,false,null);

	},


	fillCircle: function(x,y,r,fillcolor){

		this.circle(x,y,r,true,fillcolor);

	},


	drawLine: function(x1, y1, x2, y2){

		var s = new TKShape(tk_g_line);

		s.strokecolor 	= this.__col_line;
		s.strokeweight	= this.__line_width;
		s.endcap	= this.__endcap;
		s.opacity	= this.__opacity;

		s.x1	= x1;
		s.y1	= y1;
		s.x2	= x2;
		s.y2	= y2;

		this.__shapes.push(s);

	},

	// Rectangle

	rect: function(left,top,width,height,fill,fillcolor){

		var s = new TKShape(tk_g_rect);
		s.fill = fill;

		if(fill){
			if(fillcolor == null){
				s.fillcolor = this.__col_fill;
			}
			else{
				s.fillcolor = fillcolor;
			}
		}
		s.strokecolor 	= this.__col_line;
		s.strokeweight	= this.__line_width;
		s.endcap	= this.__endcap;
		s.opacity	= this.__opacity;

		s.left		= left;
		s.top		= top;
		s.width		= width;
		s.height	= height;

		this.__shapes.push(s);


	},


	drawRect: function(left,top,width,height){

		this.rect(left,top,width,height,false,null);

	},


	fillRect: function(left,top,width,height,fillcolor){

		this.rect(left,top,width,height,true,fillcolor);

	},

	// Triangle

	triangle: function(pt1, pt2, pt3, fill, fillcolor){

		var s = new TKShape(tk_g_triangle);
		s.fill = fill;
		if(fill){
			if(fillcolor == null){
				s.fillcolor = this.__col_fill;
			}
			else{
				s.fillcolor = fillcolor;
			}
		}
		s.strokecolor	= this.__col_line;
		s.strokeweight	= this.__line_width;
		s.endcap	= this.__endcap;

		s.left		= 0;
		s.top		= 0;
		s.width		= this.__canvas_width;
		s.height	= this.__canvas_height;

		s.opacity = this.__opacity;

		s.x1 = pt1.x;
		s.y1 = pt1.y;
		s.x2 = pt2.x;
		s.y2 = pt2.y;
		s.x3 = pt3.x;
		s.y3 = pt3.y;

		this.__shapes.push(s);

	},

	drawTriangle: function(pt1, pt2, pt3){

		this.triangle(pt1,pt2,pt3,false,null);

	},


	fillTriangle: function(pt1, pt2, pt3, fillcolor){

		this.triangle(pt1,pt2,pt3,true,fillcolor);

	}

}


/* Color Utils */


function TKColor(){
	this.r = 0;
	this.g = 0;
	this.b = 0;
	this.hex = '#000000';
}


TKColor.prototype = {


	setRGBColor: function(r, g, b){
		if(0<=r && r<=255 && 0<=g && g<=255 && 0<=b && b<=255){
			var hr = r < 16 ? '0' + r.toString(16) : r.toString(16);
			var hg = g < 16 ? '0' + g.toString(16) : g.toString(16);
			var hb = b < 16 ? '0' + b.toString(16) : b.toString(16);
			this.hex = '#' + hr + hg + hb;
			this.r = r;
			this.g = g;
			this.b = b;
			return true;
		}
		return false;
	},


	setHexColor: function(c){
		if(c.match(/^#(\d|[a-f]){6}$/)){
			this.r = parseInt(c.substr(1,2),16);
			this.g = parseInt(c.substr(3,2),16);
			this.b = parseInt(c.substr(5,2),16);
			this.hex = c;
			return true;
		}
		return false;
	},


	getHexByNamedColor: function(s){
		if(s==null){
			return '';
		}
		if(s.match(/^#(\d|[a-f]){6}$/)){
			return s;
		}
		var named_colors = [
			['AliceBlue','#F0F8FF'],
			['AntiqueWhite','#FAEBD7'],
			['Aqua','#00FFFF'],
			['Aquamarine','#7FFFD4'],
			['Azure','#F0FFFF'],
			['Beige','#F5F5DC'],
			['Bisque','#FFE4C4'],
			['Black','#000000'],
			['BlanchedAlmond','#FFEBCD'],
			['Blue','#0000FF'],
			['BlueViolet','#8A2BE2'],
			['Brown','#A52A2A'],
			['BurlyWood','#DEB887'],
			['CadetBlue','#5F9EA0'],
			['Chartreuse','#7FFF00'],
			['Chocolate','#D2691E'],
			['Coral','#FF7F50'],
			['CornflowerBlue','#6495ED'],
			['Cornsilk','#FFF8DC'],
			['Crimson','#DC143C'],
			['Cyan','#00FFFF'],
			['DarkBlue','#00008B'],
			['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'],
			['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'],
			['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']
		];

		for(var i=0;i<named_colors.length;i++){
			if(s.toUpperCase() == named_colors[i][0].toUpperCase()){
				return named_colors[i][1];
			}
		}

		return s;
	}

}


function pt(a,b){
	this.x = a;
	this.y = b;
}


/* String Methods */

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

String.prototype.toDate = function() {
	/* 2008-08-23 17:08:11 */
	var __ptn = /\b(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\b/;
	var m = this.match(__ptn);
	if(m){
		return new Date(m[1],m[2],m[3],m[4],m[5],m[6],0);
	}
	return null;

}

String.prototype.toUTCDate = function() {
	/* 2008-08-23 17:08:11 */
	var __ptn = /\b(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\b/;
	var m = this.match(__ptn);
	if(m){
		var d = new Date();
		d.setUTCFullYear(m[1],m[2] - 1,m[3]);
		d.setUTCHours(m[4],m[5],m[6]);
		return d;
	}
	return null;

}

String.prototype.toUSDateString = function() {
	var d = this.toDate();
	if(d){
		return d.getUSDateString();
	}
	else{
		return '';
	}
}

String.prototype.toUTCUSDateString = function() {
	var d = this.toUTCDate();
	if(d){
		return d.getUSDateString();
	}
	else{
		return '';
	}
}

Date.prototype.getUSDateString = function() {
	var sb = new TKStringBuffer();
	sb.a(this.getMonth() + 1);
	sb.a('/');
	sb.a(this.getDate());
	sb.a('/' );
	var y = this.getYear();
	if(y < 1000){
		y += 1900;
	}
	sb.a(y);
	sb.a(' ');
	sb.a(this.getHours());
	sb.a(':');
	var m = this.getMinutes();
	if(m<10){
		sb.a('0');
	}
	sb.a(m);
	return sb.toString();
}
