// Javascrippt utilities Version 2.10
// Date:11/23/2001
//																												Wrtiien by JasonTsay@Netforce
/********** Layer Control **********/
var ImgPath = "../img/re_buttons/";
var HtmlPath = "../";
function GetLayer(name)
{
	if(document.all!=null)
		return document.all[name];
	else if(document.layers!=null)
		return document.layers[name];
	else return document.getElementById(name);
}
function ShowLayer(name)
{
	layer=GetLayer(name);
	if(layer.style)	layer.style.visibility="visible";
	else layer.visibility="visible";
}
function HideLayer(name)
{
	layer=GetLayer(name);
	if(layer.style)	layer.style.visibility="hidden";
	else layer.visibility="hidden";
}
function ExpLayer(name)
{
	obj=GetLayer(name);
	if(obj.style)	obj=obj.style;
	if(obj.visibility=="hidden")	obj.visibility="visible";
	else obj.visibility="hidden";
}
function GetLayerX(name)
{
	var r="0";
	layer=GetLayer(name);
	if(layer!=null && layer.style!=null)	r=""+layer.style.left;
	else r=""+layer.left;
	if(r.indexOf("px")>=0)	return r.substring(0,r.indexOf("px"));
	else return r;
}
function GetLayerY(name)
{
	var r="0";
	layer=GetLayer(name);
	if(layer!=null && layer.style!=null)	r=""+layer.style.top;
	else r=""+layer.top;
	if(r.indexOf("px")>=0)	return r.substring(0,r.indexOf("px"));
	else return r;
}
function SetLayerX(name,x)
{
	layer=GetLayer(name);
	if(layer!=null && layer.style!=null)	layer.style.left=x;
	else layer.moveTo(x,layer.top);
}
function SetLayerY(name,y)
{
	layer=GetLayer(name);
	if(layer!=null && layer.style!=null)	layer.style.top=y;
	else layer.moveTo(layer.left,y);
}

/********** Form Control **********/
function findFormObject(objectName,Win)
{
	if(Win!=null)	D=Win.document;
	else D=document;
	if(D.all!=null && D.all[objectName]!=null)
		return D.all[objectName];
	else
    for(iIndex=0,iBound=D.forms.length;iIndex<iBound;iIndex++)
      if(D.forms[iIndex][objectName]!=null) return D.forms[iIndex][objectName];
  return null;
}

/********** String utils **********/
function getStringBytes(Data)	// 取得字串佔幾個Byte
{
	var i,cnt=0;
  for(i=0;i<Data.length;i++)
	  if(escape(Data.charAt(i)).length>=4)  cnt+=2;
  	else cnt++;
  return cnt;
}
function RemovePath(filename) // 移除 Full Filename 的路徑
{
	index=filename.lastIndexOf('/');
  return filename.substring(index+1,filename.length);  
}

/********** Number Conversion **********/
function Hex2Dec(Hex)	//十六進位轉十進位 Hex 字串 回傳字串
{
  var r=-1;
  if(Hex.length>0)
  {
    switch(Hex.charAt(Hex.length-1))
    {
      case '0':	r=0;break;
      case '1':	r=1;break;
      case '2':	r=2;break;
      case '3':	r=3;break;
      case '4':	r=4;break;
      case '5':	r=5;break;
      case '6':	r=6;break;
      case '7':	r=7;break;
      case '8':	r=8;break;
      case '9':	r=9;break;
      case 'A':	r=10;break;
      case 'B':	r=11;break;
      case 'C':	r=12;break;
      case 'D':	r=13;break;
      case 'E':	r=14;break;
      case 'F':	r=15;break;
      case 'a':	r=10;break;
      case 'b':	r=11;break;
      case 'c':	r=12;break;
      case 'd':	r=13;break;
      case 'e':	r=14;break;
      case 'f':	r=15;break;
      default:	return "";
    }
    if(Hex.length>1)  r=r+16*Hex2Dec(Hex.substring(0,Hex.length-1));
  }
  return r>=0?""+r:"";
}

function Dec2Hex(Dec,Digi)	//十進位轉十六進位 Dec數字或字串，Digi不用輸入，回傳字串
{
	var r="";
	var rs=0;
	var rm=0;
	if(typeof(Dec)=="string") Dec=parseInt(Dec);
	else if(typeof(Dec)=="object") Dec=0;
	if(Dec==NaN)  Dec=0;
	rm=Dec%16;
	rs=(Dec-rm)/16;
	if(rs>0)	r=Dec2Hex(rs);	
	switch(rm)
	{
		case 0:		r=r+'0';break;
		case 1:		r=r+'1';break;
		case 2:		r=r+'2';break;
		case 3:		r=r+'3';break;
		case 4:		r=r+'4';break;
		case 5:		r=r+'5';break;
		case 6:		r=r+'6';break;
		case 7:		r=r+'7';break;
		case 8:		r=r+'8';break;
		case 9:		r=r+'9';break;
		case 10:	r=r+'A';break;
		case 11:	r=r+'B';break;
		case 12:	r=r+'C';break;
		case 13:	r=r+'D';break;
		case 14:	r=r+'E';break;
		case 15:	r=r+'F';break;
	}
  if(typeof(Digi)=="number")  while(r.length<Digi)  r="0"+r;
	return r;
}


/********** Image Util **********/
function SwapImg(name,img1,img2)
{   
  if(document.all!=null)
  {			
   	if(RemovePath(document.all[name].src)==RemovePath(img1))
	  document.all[name].src=img2;
	  else
	  document.all[name].src=img1;
  }
  else
  {
    if(RemovePath(document.images[name].src)==RemovePath(img1))
	  document.images[name].src=img2;
	  else
	  document.images[name].src=img1;
  }
}

/********** Color Conversion **********/
// RGB 轉 HSL
// 輸入：Color 字串格式 #RRGGBB
// 輸出：陣列 R[3]={H,S,L}
function RGBtoHSL(Color)
{
  r= eval("0x"+Color.substr(1,2))/255;
  g= eval("0x"+Color.substr(3,2))/255;
  b= eval("0x"+Color.substr(5,2))/255;
  h = s = l = 0;
  if ( r >= g  ) cmax = r; else cmax = g;
  if ( b > cmax) cmax = b;
  if ( r <= g  ) cmin = r; else cmin = g;
  if ( b < cmin) cmin = b;
  l = (cmax + cmin) / 2;
  c = cmax - cmin;
  if ( c != 0 )
  {
    if ( l <= 0.5 ) s = c / (cmax + cmin); else s = c / ( 2 - (cmax + cmin));
    if ( r == cmax)	h = ( g - b ) / c;
		else
		{
      if (g == cmax)	h = 2 + ( b - r ) / c;
      else if ( b == cmax ) h = 4 + ( r - g ) / c;
    }
    h = h * 60;
    if ( h < 0 ) h = h + 360;
  }
	var r=new Array(3);
	r[0]=h;r[1]=s;r[2]=l;
	return r;
}
// HSL 轉 RGB
// 輸入：整數 H-int(0~360),S-float(0~1),L-float(0~1) 
// 輸出：Color 字串格式 #RRGGBB
function HSLtoRGB(h,s,l)
{
  var r=0,g=0,b=0,color=0,stTemp="";

  if (s < 0) s = 0;
  else if (s > 1) s = 1;
  if (l < 0) l = 0;
  else if (l > 1) l = 1;
  if (h > 360)	h = h % 360;
  else if (h < 0) h = h + 360;
  if (l <= 0.5)
  {
    cmin = l * ( 1 - s );
    cmax = 2 * l - cmin;
  }else{
    cmax = l * ( 1 - s ) + s;
    cmin = 2 * l - cmax;
  }
  r = h2v(h+120,cmin,cmax)*255;
  g = h2v(h,cmin,cmax)*255;
  b = h2v(h-120,cmin,cmax)*255;
	color=Math.round(r)*Math.pow(2,16)+Math.round(g)*Math.pow(2,8)+Math.round(b);
  if(color>0xffffff) color=0xffffff;
  stTemp=Dec2Hex(color);
  while(stTemp.length<6)  stTemp="0"+stTemp;
	return stTemp;
}
function h2v(hh,min,max)
{
  hh = hh % 360;
  if (hh <  0) hh = hh + 360;
  if (hh <  60) return min + (max - min) * hh / 60;
  if (hh >= 60 && hh < 180) return max;
  if (hh >=180 && hh < 240) return min+(max-min)*(240-hh)/60;
  return min;
}

/********** Select Control *********/
function AssignSelectText(SelectObject,Index,Value)
{
  SelectObject.options[Index].text=Value;
}
function AssignSelectValue(SelectObject,Index,Value)
{
  SelectObject.options[Index].value=Value;
}
function GetSelectedText(SelectObject)
{
  return SelectObject.options[SelectObject.selectedIndex].text;
}
function GetSelectedValue(SelectObject)
{
  return SelectObject.options[SelectObject.selectedIndex].value;
}
function AddSelectIetm(SelectObject,Index,Text,Value)
{
	var Option0=new Option(Text,Value);
	SelectObject.options[Index]=Option0;
}
function RemoveSelectItem(SelectObject,Index)
{
	SelectObject.options[Index]=null;
}
function ClearAllSelectItems(SelectObject)
{
	while(SelectObject.length)	SelectObject.options[0]=null;
}
function ClearAllSelectedItems(SelectObject)
{
	var iIndex=0;
	while(iIndex<SelectObject.length)
	{
		if(SelectObject.options[iIndex].selected)	SelectObject.options[iIndex]=null;
		else iIndex++;
	}
}
function MoveSelectedItems(SelectObject1,SelectObject2)
{
	var Option0=null,iIndex=0;
	while(iIndex<SelectObject1.length)
	{
		if(SelectObject1.options[iIndex].selected)
		{
			Option0=SelectObject1.options[iIndex];
			SelectObject2.options[SelectObject2.length]=new Option(Option0.text,Option0.value);
			SelectObject1.options[iIndex]=null;
		}
		else iIndex++;
	}
}
function MoveSelectedItems2(SelectObject1,SelectObject2)
{
	var Option0=null;
	for(iIndex=0;iIndex<SelectObject1.length;iIndex++)
		if(SelectObject1.options[iIndex].selected)
		{
			Option0=SelectObject1.options[iIndex];
			SelectObject2.options[SelectObject2.length]=new Option(Option0.text,Option0.value);
			SelectObject1.options[iIndex].selected=false;
		}
}
/******************** CSS *******************/
function getCSSProperties(CSS,Name)
{
	iIndex1=CSS.indexOf(Name,0);
	if(iIndex1>=0)
	{
		iIndex1=CSS.indexOf(":",iIndex1);
		iIndex2=CSS.indexOf(";",iIndex1);
		if(iIndex2>=0)	return CSS.substring(iIndex1+1,iIndex2);
		else return CSS.substring(iIndex1+1,CSS.length);		
	}
		return null;
}

/****************** Cookie *****************/
function saveCookie(name,value,expires,path,domain,secure)
{
	var stCookie = name + "=" + value;
	if(typeof(expires)!="undefined")
	{
		var curTime=new Date();
		curTime.setTime(curTime.getTime()+expires*24*60*60*1000);
		stCookie+="; expires="+curTime.toGMTString();
	}
	if(typeof(path)!="undefined")	stCookie+="; path="+path;
	if(typeof(domain)!="undefined")	stCookie+="; domain="+domain;
	if(typeof(secure)!="undefined")	stCookie+="; secure";
	stCookie += "; " + document.cookie;
	document.cookie=stCookie;
}
function getCookie(name)
{
	var stCookies=document.cookie;
	var cookieName=name+"=";
	var valueBegin,valueEnd,value=-1;
	valueBegin=stCookies.indexOf(cookieName);
	if(valueBegin==-1)	return null;
	valueEnd=stCookies.indexOf(";",valueBegin);
	if(valueEnd==-1)	valueEnd=stCookies.length;
	value=stCookies.substring(valueBegin+cookieName.length,valueEnd);
	return value;
}

// MakeColorTable
function makeColorTable(X,Y,StartColor,EndColor,Name,BorderSize,Width,Height,JCode)
{
  var total=X*Y;
  var all=EndColor-StartColor+1;
  var increase=Math.round(all/(total-1));
  var color=StartColor;
  stTemp = "<table cellSpacing=\"0\" cellPadding=\"0\" ID=\""+Name+"\" border=\""+BorderSize+"\">\n";
  for(iIndexY=0;iIndexY<Y;iIndexY++)
  {
    stTemp += "<TR>\n";
    for(iIndexX=0;iIndexX<X;iIndexX++,color+=increase)
    {
      stTemp += "<TD onClick=\"setSelectedColor(this.style.backgroundColor.toUpperCase());";
      if(color>EndColor) color=EndColor;
      stTemp += JCode;
      stTemp += "\" style=\"cursor:hand;border-width:\'1\';width:\'"+Width+"\';height:\'"+Height+"\';background-color:\'#";
      stTemp += Dec2Hex(color,6) + "\';\">";
      stTemp += "<font style=\"font-size:\'1pt\'\">&nbsp;</font></TD>\n";
    }
    stTemp += "</TR>\n";
  }
  stTemp += "</Table>\n";
  return stTemp;
}
function makeHSLColorTable(X,Y,Name,BorderSize,Width,Height,JCode)
{
	var MaxH = 359.0;
	var MaxS = 1.0;
	var defaultL = 0.5;
	var ih=MaxH/(X-1);
	var is=MaxS/(Y-1);
	stTemp = "<table cellSpacing=\"0\" cellPadding=\"0\" ID=\""+Name+"\" border=\""+BorderSize+"\">\n";
	for(iIndexY=0,cs=0;iIndexY<Y;iIndexY++,cs+=is)
	{
    stTemp += "<TR>\n";
		for(iIndexX=0,ch=0;iIndexX<X;iIndexX++,ch+=ih)
		{
      stTemp += "<TD onClick=\"setSelectedColor(this.style.backgroundColor.toUpperCase());";
      stTemp += JCode;
      stTemp += "\" style=\"cursor:hand;border-width:\'1\';width:\'"+Width+"\';height:\'"+Height+"\';background-color:\'#";
      stTemp += HSLtoRGB(ch,cs,defaultL);
      stTemp += "\';\">";
      stTemp += "<font style=\"font-size:\'1pt\'\">&nbsp;</font></TD>\n";
		}
    stTemp += "</TR>\n";
	}
  stTemp += "</Table>\n";
  return stTemp;
}

/****************** ID Generator (for RichText Editor) *****************/
function IDGenerator(nextID)
{
    this.nextID = nextID;
    this.GenerateID = IDGeneratorGenerateID;
}

function IDGeneratorGenerateID()
{
    return this.nextID++;
}

/****************** Util (for RichText Editor) *****************/
function UtilBeginScript()                                          																																																														
{                                                                   																																																														
    return String.fromCharCode(60, 115, 99, 114, 105, 112, 116, 62);    																																																															
}                                                                   																																																														
                                                                    																																																														
function UtilEndScript()                                            																																																														
{                                                                   																																																														
    return String.fromCharCode(60, 47, 115, 99, 114, 105, 112, 116, 62);																																																															
}                                                                   																																																														

/****************** Button (for RichText Editor) *****************/
var BUTTON_IMAGE_PREFIX = "buttonImage";
var BUTTON_DIV_PREFIX = "buttonDiv";
var BUTTON_PAD1_PREFIX = "buttonPad1";
var BUTTON_PAD2_PREFIX = "buttonPad2";
var buttonMap = new Object();

// class Button
function Button(idGenerator, caption, action, image)
{
    // property
    this.idGenerator = idGenerator;
    this.caption = caption;
    this.action = action;
    this.image = image;
    this.enabled = true;
    
    // function
    this.Instantiate = ButtonInstantiate;
    this.Enable = ButtonEnable;
}

function ButtonInstantiate()
{
    this.id = this.idGenerator.GenerateID();
    buttonMap[this.id] = this;
    var html = "";
    html += '<div id="';
    html += BUTTON_DIV_PREFIX;
    html += this.id;
    html += '" class="ButtonNormal"';
    html += ' onselectstart="ButtonOnSelectStart()"';
    html += ' ondragstart="ButtonOnDragStart()"';
    html += ' onmousedown="ButtonOnMouseDown(this)"';
    html += ' onmouseup="ButtonOnMouseUp(this)"';
    html += ' onmouseout="ButtonOnMouseOut(this)"';
    html += ' onmouseover="ButtonOnMouseOver(this)"';
    html += ' onclick="ButtonOnClick(this)"';
    html += ' ondblclick="ButtonOnDblClick(this)"';
    html += '>';
    html += '<table cellpadding=0 cellspacing=0 border=0><tr><td><img id="';
    html += BUTTON_PAD1_PREFIX;
    html += this.id;
    html += '" width=2 height=2></td><td></td><td></td></tr><tr><td></td><td>';
    html += '<img id="';
    html += BUTTON_IMAGE_PREFIX;
    html += this.id;
    html += '" src="';
    html += this.image;
    html += '" title="';
    html += this.caption;
    html += '" class="Image"';
    html += '>';
    html += '</td><td></td></tr><tr><td></td><td></td><td><img id="';
    html += BUTTON_PAD2_PREFIX;
    html += this.id;
    html += '" width=2 height=2></td></tr></table>';
    html += '</div>';
    document.write(html);
}

function ButtonEnable(enabled)
{
    this.enabled = enabled;
    if (this.enabled)
    {
        document.all[BUTTON_DIV_PREFIX + this.id].className = "ButtonNormal";
        document.all[BUTTON_IMAGE_PREFIX + this.id].style.filter = "";
    }
    else
    {
        document.all[BUTTON_IMAGE_PREFIX + this.id].style.filter = "progid:DXImageTransform.Microsoft.Emboss(enabled='true')";
        document.all[BUTTON_DIV_PREFIX + this.id].className = "ButtonDisabled";
    }
}

function ButtonOnSelectStart()
{
    window.event.returnValue = false;
}

function ButtonOnDragStart()
{
    window.event.returnValue = false;
}

function ButtonOnMouseDown(element)
{
    // left button is pressed
    if (event.button == 1)
    {
        var id = element.id.substring(BUTTON_DIV_PREFIX.length, element.id.length);
        var button = buttonMap[id];
        if (button.enabled)
        {
            ButtonPushButton(id);
        }
    }
}

function ButtonOnMouseUp(element)
{
    // left button is pressed
    if (event.button == 1)
    {
        var id = element.id.substring(BUTTON_DIV_PREFIX.length, element.id.length);
        var button = buttonMap[id];
        if (button.enabled)
        {
            ButtonOverButton(id);
        }
    }
}

function ButtonOnMouseOut(element)
{
    var id = element.id.substring(BUTTON_DIV_PREFIX.length, element.id.length);
    var button = buttonMap[id];
    if (button.enabled)
    {
        ButtonNormalButton(id);
    }
}

function ButtonOnMouseOver(element)
{
    var id = element.id.substring(BUTTON_DIV_PREFIX.length, element.id.length);
    var button = buttonMap[id];
    if (button.enabled)
    {
        ButtonOverButton(id);
    }
}

function ButtonOnClick(element)
{
    var id = element.id.substring(BUTTON_DIV_PREFIX.length, element.id.length);
    var button = buttonMap[id];
    if (button.enabled)
    {
        eval(button.action);
    }
}

function ButtonOnDblClick(element)
{
    ButtonOnClick(element);
}

function ButtonOverButton(id)
{
    document.all[BUTTON_PAD1_PREFIX + id].width = 1;
    document.all[BUTTON_PAD1_PREFIX + id].height = 1;
    document.all[BUTTON_PAD2_PREFIX + id].width = 3;
    document.all[BUTTON_PAD2_PREFIX + id].height = 3;
    document.all[BUTTON_IMAGE_PREFIX + id].style.filter = "progid:DXImageTransform.Microsoft.dropshadow(offX=1,offY=1,Color='gray',Positive='true')";
    document.all[BUTTON_DIV_PREFIX + id].className = "ButtonMouseOver";
}

function ButtonPushButton(id)
{
    document.all[BUTTON_IMAGE_PREFIX + id].style.filter = "";
    document.all[BUTTON_PAD1_PREFIX + id].width = 2;
    document.all[BUTTON_PAD1_PREFIX + id].height = 2;
    document.all[BUTTON_PAD2_PREFIX + id].width = 2;
    document.all[BUTTON_PAD2_PREFIX + id].height = 2;
    document.all[BUTTON_DIV_PREFIX + id].className = "ButtonPressed";
}

function ButtonNormalButton(id)
{
    document.all[BUTTON_IMAGE_PREFIX + id].style.filter = "";
    document.all[BUTTON_PAD1_PREFIX + id].width = 2;
    document.all[BUTTON_PAD1_PREFIX + id].height = 2;
    document.all[BUTTON_PAD2_PREFIX + id].width = 2;
    document.all[BUTTON_PAD2_PREFIX + id].height = 2;
    document.all[BUTTON_DIV_PREFIX + id].className = "ButtonNormal";
}

/****************** Image Chooser (for RichText Editor) *****************/
var IMAGE_CHOOSER_DIV_PREFIX = "imageChooserDiv";
var IMAGE_CHOOSER_IMG_PREFIX = "imageChooserImg";
var IMAGE_CHOOSER_ICON_PREFIX = "imageChooserIcon";
var imageChooserMap = new Object();

// class ImageChooser
function ImageChooser(idGenerator, numRows, numCols, images, callback)
{
    // property
    this.idGenerator = idGenerator;
    this.numRows = numRows;
    this.numCols = numCols;
    this.images = images;
    
    // function
    this.callback = callback;
    this.Instantiate = ImageChooserInstantiate;
    this.Show = ImageChooserShow;
    this.Hide = ImageChooserHide;
    this.IsShowing = ImageChooserIsShowing;
    this.SetUserData = ImageChooserSetUserData;
}

function ImageChooserInstantiate()
{
    this.id = this.idGenerator.GenerateID();
    imageChooserMap[this.id] = this;
    var html = '';
    html += '<table>';
    html += '<tr>';
    html += '<td>';
    html += '<div id="' + IMAGE_CHOOSER_DIV_PREFIX + this.id + '" style="display:none;position:absolute;background-color:buttonface;border-left:buttonhighlight solid 1px;border-top:buttonhighlight solid 1px;border-right:buttonshadow solid 1px;border-bottom:buttonshadow solid 1px">';
    html += '<table>';
    for (var i = 0; i < this.numRows; i++) {
        html += '<tr>';
        for (var j = 0; j < this.numCols; j++) {
            html += '<td>';
            var k = i * this.numCols + j;
            html += '<div id="' + IMAGE_CHOOSER_ICON_PREFIX + this.id + '_' + k + '" style="border:buttonface solid 1px">';
            html += '<img src="' + this.images[k] + '" id="' + IMAGE_CHOOSER_IMG_PREFIX + this.id + '_' + k + '" onmouseover="ImageChooserOnMouseOver()" onmouseout="ImageChooserOnMouseOut()" onclick="ImageChooserOnClick()">';
            html += '</div>';
            html += '</td>';
	}
        html += '</tr>';
    }
    html += '</table>';
    html += '</div>';
    html += '</td>';
    html += '</tr>';
    html += '</table>';
    document.write(html);
}

function ImageChooserShow(x, y)
{
    eval(IMAGE_CHOOSER_DIV_PREFIX + this.id).style.left = x;
    eval(IMAGE_CHOOSER_DIV_PREFIX + this.id).style.top = y;
    eval(IMAGE_CHOOSER_DIV_PREFIX + this.id).style.display = "block";
}

function ImageChooserHide()
{
    eval(IMAGE_CHOOSER_DIV_PREFIX + this.id).style.display = "none";
}

function ImageChooserIsShowing()
{
    return eval(IMAGE_CHOOSER_DIV_PREFIX + this.id).style.display == "block";
}

function ImageChooserSetUserData(userData)
{
    this.userData = userData;
}

function ImageChooserOnMouseOver()
{
    if (event.srcElement.tagName == "IMG") {
        var underscore = event.srcElement.id.indexOf("_");
        if (underscore != -1) {
            var id = event.srcElement.id.substring(IMAGE_CHOOSER_IMG_PREFIX.length, underscore);
            var index = event.srcElement.id.substring(underscore + 1);
            eval(IMAGE_CHOOSER_ICON_PREFIX + id + "_" + index).style.borderColor = "black";
        }
    }
}

function ImageChooserOnMouseOut()
{
    if (event.srcElement.tagName == "IMG") {
        var underscore = event.srcElement.id.indexOf("_");
        if (underscore != -1) {
        var id = event.srcElement.id.substring(IMAGE_CHOOSER_IMG_PREFIX.length, underscore);
        var index = event.srcElement.id.substring(underscore + 1);
            eval(IMAGE_CHOOSER_ICON_PREFIX + id + "_" + index).style.borderColor = "buttonface";
        }
    }
}

function ImageChooserOnClick()
{
    if (event.srcElement.tagName == "IMG") {
        var underscore = event.srcElement.id.indexOf("_");
        if (underscore != -1) {
            var id = event.srcElement.id.substring(IMAGE_CHOOSER_IMG_PREFIX.length, underscore);
            var imageChooser = imageChooserMap[id];
            imageChooser.Hide();
            var index = event.srcElement.id.substring(underscore + 1);
            if (imageChooser.callback) {
                imageChooser.callback(imageChooser.images[index], imageChooser.userData);
            }
        }
    }
}

/****************** Editor (for RichText Editor) *****************/
var EDITOR_COMPOSITION_PREFIX = "editorComposition";
var EDITOR_PARAGRAPH_PREFIX = "editorParagraph";
var EDITOR_LIST_AND_INDENT_PREFIX = "editorListAndIndent";
var EDITOR_TOP_TOOLBAR_PREFIX = "editorTopToolbar";
var EDITOR_BOTTOM_TOOLBAR_PREFIX = "editorBottomToolbar";
var EDITOR_SMILEY_BUTTON_PREFIX = "editorSmileyButton";
var EDITOR_IMAGE_CHOOSER_PREFIX = "editorImageChooser";
var editorMap = new Object();
var editorIDArray = new Array();
var editorIDGenerator = null;

// class Editor
function Editor(idGenerator)
{
    // property
    this.idGenerator = idGenerator;
    this.textMode = false;
    this.brief = false;
    this.instantiated = false;
    
    // function
    this.Instantiate = EditorInstantiate;
    this.GetText = EditorGetText;
    this.SetText = EditorSetText;
    this.GetHTML = EditorGetHTML;
    this.SetHTML = EditorSetHTML;
    this.GetBrief = EditorGetBrief;
    this.SetBrief = EditorSetBrief;
}

function EditorInstantiate(edHeight, textID)
{
    if (this.instantiated) {
        return;
    }
    this.id = this.idGenerator.GenerateID();
    editorMap[this.id] = this;
    editorIDArray[editorIDArray.length] = this.id;
    editorIDGenerator = this.idGenerator;
    this.textID = textID;
    if (edHeight == null)
        edHeight = 190;

    var html = "";
    
    // begin of editor
    html += "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\">";
    
    // first line of toolbar
    html += "<tr>";
    html += "<td id=\"" + EDITOR_TOP_TOOLBAR_PREFIX + this.id + "\" class=\"Toolbar\">";
    html += "<table cellpaddin=\"0\" cellspacing=\"0\" border=\"0\">";
    html += "<tr>";
    html += "<td>";
    html += "<div class=\"Space\"></div>";
    html += "</td>";
    html += "<td>";
    html += "<div class=\"Swatch\"></div>";
    html += "</td>";
    
    // cut button
    html += "<td>";
    html += UtilBeginScript();
    html += "var cutButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"剪下\",";
    html += "\"EditorOnCut(" + this.id + ")\",";
    html += "\""+ ImgPath + "cut.gif\"";
    html += ");";
    html += "cutButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // copy button
    html += "<td>";
    html += UtilBeginScript();
    html += "var copyButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"複製\",";
    html += "\"EditorOnCopy(" + this.id + ")\",";
    html += "\""+ ImgPath + "copy.gif\"";
    html += ");";
    html += "copyButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // paste button
    html += "<td>";
    html += UtilBeginScript();
    html += "var pasteButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"貼上\",";
    html += "\"EditorOnPaste(" + this.id + ")\",";
    html += "\""+ ImgPath + "paste.gif\"";
    html += ");";
    html += "pasteButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";

    // undo button
    html += "<td>";
    html += UtilBeginScript();
    html += "var undoButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"復原\",";
    html += "\"EditorOnUndo(" + this.id + ")\",";
    html += "\""+ ImgPath + "undo.gif\"";
    html += ");";
    html += "undoButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";

    // redo button
    html += "<td>";
    html += UtilBeginScript();
    html += "var redoButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"重做\",";
    html += "\"EditorOnRedo(" + this.id + ")\",";
    html += "\""+ ImgPath + "redo.gif\"";
    html += ");";
    html += "redoButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";

    // sysImg button
    //html += "<td>";
    //html += UtilBeginScript();
    //html += "var sysImgButton = new Button(";
    //html += "editorIDGenerator,";
    //html += "\"插入系統圖片\",";
    //html += "\"EditorOnSysImg(" + this.id + ")\",";
    //html += "\""+ ImgPath + "sysImg.gif\"";
    //html += ");";
    //html += "sysImgButton.Instantiate();";
    //html += UtilEndScript();
    //html += "</td>";

    // usrImg button
    //html += "<td>";
    //html += UtilBeginScript();
    //html += "var usrImgButton = new Button(";
    //html += "editorIDGenerator,";
    //html += "\"插入使用者圖片\",";
    //html += "\"EditorOnUsrImg(" + this.id + ")\",";
    //html += "\""+ ImgPath + "usrImg.gif\"";
    //html += ");";
    //html += "usrImgButton.Instantiate();";
    //html += UtilEndScript();
    //html += "</td>";

    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";

    // hyperlink button
    html += "<td>";
    html += UtilBeginScript();
    html += "var createHyperlinkButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"建立超連結\",";
    html += "\"EditorOnCreateHyperlink(" + this.id + ")\",";
    html += "\""+ ImgPath + "wlink.gif\"";
    html += ");";
    html += "createHyperlinkButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // sysUrl button
    html += "<td>";
    html += UtilBeginScript();
    html += "var sysUrlButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"插入系統頁面連結\",";
    html += "\"EditorOnSysUrl(" + this.id + ")\",";
    html += "\""+ ImgPath + "sysUrl.gif\"";
    html += ");";
    html += "sysUrlButton.Instantiate();";
    html += "sysUrlButton.Enable(false);";
    html += UtilEndScript();
    html += "</td>";

    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";

    // view source
    html += "<td class=\"Text\">";
    html += "<input type=\"checkbox\" onclick=\"EditorOnViewHTMLSource(" + this.id + ", this.checked)\">";
    html += "檢視HTML原始檔";
    html += "</td>";
    
    html += "</tr>";
    html += "</table>";
    html += "</td>";
    html += "</tr>";
    // end of first line
    
    // second line of toolbar
    html += "<tr>";
    html += "<td id=\"" + EDITOR_BOTTOM_TOOLBAR_PREFIX + this.id + "\" class=\"Toolbar\">";
    html += "<table cellpaddin=\"0\" cellspacing=\"0\" border=\"0\">";
    html += "<tr>";
    html += "<td>";
    html += "<div class=\"Space\"></div>";
    html += "</td>";
    html += "<td>";
    html += "<div class=\"Swatch\"></div>";
    html += "</td>";
    
    // font selector
    html += "<td>";
    html += "<select class=\"List\" onchange=\"EditorOnFont(" + this.id + ", this)\">";
    html += "<option class=\"Heading\">字型</option>";
    html += "<option value=\"Arial\">Arial</option>";
    html += "<option value=\"Arial Black\">Arial Black</option>";
    html += "<option value=\"Arial Narrow\">Arial Narrow</option>";
    html += "<option value=\"Comic Sans MS\">Comic Sans MS</option>";
    html += "<option value=\"Courier New\">Courier New</option>";
    html += "<option value=\"System\">System</option>";
    html += "<option value=\"Times New Roman\">Times New Roman</option>";
    html += "<option value=\"Verdana\">Verdana</option>";
    html += "<option value=\"Wingdings\">Wingdings</option>";
    html += '<option value=\"細明體\">細明體</option>';
    html += '<option value=\"新細明體\">新細明體</option>';
    html += '<option value=\"標楷體\">標楷體</options>';
    html += "</select>";
    html += "</td>";
    
    // font size selector
    html += "<td>";
    html += "<select class=\"List\" onchange=\"EditorOnSize(" + this.id + ", this)\">";
    html += "<option class=\"Heading\">大小</option>";
    html += "<option value=\"1\">1</option>";
    html += "<option value=\"2\">2</option>";
    html += "<option value=\"3\">3</option>";
    html += "<option value=\"4\">4</option>";
    html += "<option value=\"5\">5</option>";
    html += "<option value=\"6\">6</option>";
    html += "<option value=\"7\">7</option>";
    html += "</select>";
    html += "</td>";
    
    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";
    
    // bold button
    html += "<td>";
    html += UtilBeginScript();
    html += "var boldButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"粗體\",";
    html += "\"EditorOnBold(" + this.id + ")\",";
    html += "\""+ ImgPath + "bold.gif\"";
    html += ");";
    html += "boldButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // italic button
    html += "<td>";
    html += UtilBeginScript();
    html += "var italicButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"斜體\",";
    html += "\"EditorOnItalic(" + this.id + ")\",";
    html += "\""+ ImgPath + "italic.gif\"";
    html += ");";
    html += "italicButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // underline button
    html += "<td>";
    html += UtilBeginScript();
    html += "var underlineButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"底線\",";
    html += "\"EditorOnUnderline(" + this.id + ")\",";
    html += "\""+ ImgPath + "uline.gif\"";
    html += ");";
    html += "underlineButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";
    
    // fgcolor button
    html += "<td>";
    html += UtilBeginScript();
    html += "var foregroundColorButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"字體顏色\",";
    html += "\"EditorOnForegroundColor(" + this.id + ")\",";
    html += "\""+ ImgPath + "tpaint.gif\"";
    html += ");";
    html += "foregroundColorButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // bgcolor button
    html += "<td>";
    html += UtilBeginScript();
    html += "var backgroundColorButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"字底顏色\",";
    html += "\"EditorOnBackgroundColor(" + this.id + ")\",";
    html += "\""+ ImgPath + "parea.gif\"";
    html += ");";
    html += "backgroundColorButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";
    
    // alignleft button
    html += "<td>";
    html += UtilBeginScript();
    html += "var alignLeftButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"靠左對齊\",";
    html += "\"EditorOnAlignLeft(" + this.id + ")\",";
    html += "\""+ ImgPath + "aleft.gif\"";
    html += ");";
    html += "alignLeftButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // center button
    html += "<td>";
    html += UtilBeginScript();
    html += "var centerButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"置中\",";
    html += "\"EditorOnCenter(" + this.id + ")\",";
    html += "\""+ ImgPath + "center.gif\"";
    html += ");";
    html += "centerButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // alignright button
    html += "<td>";
    html += UtilBeginScript();
    html += "var alignRightButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"靠右對齊\",";
    html += "\"EditorOnAlignRight(" + this.id + ")\",";
    html += "\""+ ImgPath + "aright.gif\"";
    html += ");";
    html += "alignRightButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";
    
    // advanced tool
    html += "<td id=\"" + EDITOR_LIST_AND_INDENT_PREFIX + this.id + "\" style=\"display:" + (this.brief ? "none" : "inline") + "\">";
    html += "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
    html += "<tr>";
    
    // numberedlist button
    html += "<td>";
    html += UtilBeginScript();
    html += "var numberedListButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"編號列表\",";
    html += "\"EditorOnNumberedList(" + this.id + ")\",";
    html += "\""+ ImgPath + "nlist.gif\"";
    html += ");";
    html += "numberedListButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // bullettedlist button
    html += "<td>";
    html += UtilBeginScript();
    html += "var bullettedListButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"分項列表\",";
    html += "\"EditorOnBullettedList(" + this.id + ")\",";
    html += "\""+ ImgPath + "blist.gif\"";
    html += ");";
    html += "bullettedListButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // divider
    html += "<td>";
    html += "<div class=\"Divider\"></div>";
    html += "</td>";
    
    // decreaseindent button
    html += "<td>";
    html += UtilBeginScript();
    html += "var decreaseIndentButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"減少縮排\",";
    html += "\"EditorOnDecreaseIndent(" + this.id + ")\",";
    html += "\""+ ImgPath + "ileft.gif\"";
    html += ");";
    html += "decreaseIndentButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // increaseindent button
    html += "<td>";
    html += UtilBeginScript();
    html += "var increaseIndentButton = new Button(";
    html += "editorIDGenerator,";
    html += "\"增加縮排\",";
    html += "\"EditorOnIncreaseIndent(" + this.id + ")\",";
    html += "\""+ ImgPath + "iright.gif\"";
    html += ");";
    html += "increaseIndentButton.Instantiate();";
    html += UtilEndScript();
    html += "</td>";
    
    // divider
    //html += "<td>";
    //html += "<div class=\"Divider\"></div>";
    //html += "</td>";
    html += "</tr>";
    html += "</table>";
    html += "</td>";
    // end of advanced toolbar
    
    // smiley button
    //html += "<td id=\"" + EDITOR_SMILEY_BUTTON_PREFIX + this.id + "\">";
    //html += UtilBeginScript();
    //html += "var insertSmileyButton = new Button(";
    //html += "editorIDGenerator,";
    //html += "\"插入表情符號\",";
    //html += "\"EditorOnStartInsertSmiley(" + this.id + ")\",";
    //html += "\""+ ImgPath + "smiley.gif\"";
    //html += ");";
    //html += "insertSmileyButton.Instantiate();";
    //html += UtilEndScript();
    //html += "</td>";
    
    html += "</tr>";
    html += "</table>";
    html += "</td>";
    html += "</tr>";
    // end of second toolbar
    
    // edit area
    html += "<tr>";
    html += "<td>";
    html += "<iframe id=\"" + EDITOR_COMPOSITION_PREFIX + this.id + "\" width=\"100%\" height=\"" + edHeight + "\">";
    html += "</iframe>";
    html += "</td>";
    html += "</tr>";
    html += "</table>";
    // end of editor
    
    // instantiate imagechooser
    html += UtilBeginScript();
    html += "var " + EDITOR_IMAGE_CHOOSER_PREFIX + this.id + " = new ImageChooser(";
    html += "editorIDGenerator,";
    html += "5, 5,";
    html += "[";
    html += "\"/manager/images/re_smileys/1.gif\",";
    html += "\"/manager/images/re_smileys/2.gif\",";
    html += "\"/manager/images/re_smileys/3.gif\",";
    html += "\"/manager/images/re_smileys/4.gif\",";
    html += "\"/manager/images/re_smileys/5.gif\",";
    html += "\"/manager/images/re_smileys/6.gif\",";
    html += "\"/manager/images/re_smileys/7.gif\",";
    html += "\"/images/re_smileys/8.gif\",";
    html += "\"/images/re_smileys/9.gif\",";
    html += "\"/images/re_smileys/a.gif\",";
    html += "\"/images/re_smileys/b.gif\",";
    html += "\"/images/re_smileys/c.gif\",";
    html += "\"/images/re_smileys/d.gif\",";
    html += "\"/images/re_smileys/e.gif\",";
    html += "\"/images/re_smileys/f.gif\",";
    html += "\"/images/re_smileys/g.gif\",";
    html += "\"/images/re_smileys/h.gif\",";
    html += "\"/images/re_smileys/i.gif\",";
    html += "\"/images/re_smileys/j.gif\",";
    html += "\"/images/re_smileys/k.gif\",";
    html += "\"/images/re_smileys/l.gif\",";
    html += "\"/images/re_smileys/m.gif\",";
    html += "\"/images/re_smileys/n.gif\",";
    html += "\"/images/re_smileys/o.gif\",";
    html += "\"/images/re_smileys/y.gif\"";
    html += "],";
    html += "EditorOnEndInsertSmiley";
    html += ");";
    html += EDITOR_IMAGE_CHOOSER_PREFIX + this.id + ".SetUserData(" + this.id + ");";
    html += EDITOR_IMAGE_CHOOSER_PREFIX + this.id + ".Instantiate();";
    html += UtilEndScript();
    
    document.write(html);
    
    // initialate iframe (edit area)
    html = '';
    html += '<body style="font:10pt arial" oncontextmenu="return false">';
    //html += ' onload="var textArea = parent.document.all[\'' + this.textID + '\'];document.body.innerHTML = textArea.value;">';
    html += document.all[this.textID].value;
    html += '</body>';
    eval(EDITOR_COMPOSITION_PREFIX + this.id).document.open();
    eval(EDITOR_COMPOSITION_PREFIX + this.id).document.write(html);
    eval(EDITOR_COMPOSITION_PREFIX + this.id).document.close();
    eval(EDITOR_COMPOSITION_PREFIX + this.id).document.designMode = "on";
    eval(EDITOR_COMPOSITION_PREFIX + this.id).document.onclick = new Function("EditorOnClick(" + this.id + ")");
    
    editorIDGenerator = null;
    this.instantiated = true;
    }

function  EditorGetText()
{
    return eval(EDITOR_COMPOSITION_PREFIX + this.id).document.body.innerText;
}

function  EditorSetText(text)
{
    text = text.replace(/\n/g, "<br>");
    eval(EDITOR_COMPOSITION_PREFIX + this.id).document.body.innerHTML = text;
}

function  EditorGetHTML()
{
    if (this.textMode) {
        return eval(EDITOR_COMPOSITION_PREFIX + this.id).document.body.innerText;
    }
    EditorCleanHTML(this.id);
    EditorCleanHTML(this.id);
    return eval(EDITOR_COMPOSITION_PREFIX + this.id).document.body.innerHTML;
}

function  EditorSetHTML(html)
{
    if (this.textMode) {
        eval(EDITOR_COMPOSITION_PREFIX + this.id).document.body.innerText = html;
    }
    else {
        eval(EDITOR_COMPOSITION_PREFIX + this.id).document.body.innerHTML = html;
    }
}

function EditorGetBrief()
{
    return this.brief;
}

function EditorSetBrief(brief)
{
    this.brief = brief;
    var display = this.brief ? "none" : "inline";
    if (this.instantiated) {
        eval(EDITOR_PARAGRAPH_PREFIX + this.id).style.display = display;
        eval(EDITOR_LIST_AND_INDENT_PREFIX + this.id).style.display = display;
    }
}

function EditorOnUndo(id)
{
    EditorFormat(id, "undo");
}

function EditorOnRedo(id)
{
    EditorFormat(id, "redo");
}

function EditorOnSysImg(id)
{
    if (!EditorValidateMode(id)) {
        return;
    }
    
    var wnd = window.open("/library/page0.html","SysImg","width=800,height=600,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no");
    wnd.focus();
}

function EditorOnUsrImg(id)
{
    if (!EditorValidateMode(id)) {
        return;
    }
    
    var wnd = window.open("?Part=PicManage","UsrImg","width=800,height=600,location=no,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no");
    wnd.focus();
}

function EditorOnSysUrl(id)
{
    if (!EditorValidateMode(id)) {
        return;
    }
    
    //var wnd = window.open();
    if (eval(EDITOR_COMPOSITION_PREFIX + id).document.selection.type == "Control") {
        var objs = eval(EDITOR_COMPOSITION_PREFIX + id).document.selection.createRange();
        if (objs.length == 1 && objs.item(0).tagName == "IMG")
            objs.execCommand("InsertImage", true);
    }
}

function EditorOnCut(id)
{
    EditorFormat(id, "cut");
}

function EditorOnCopy(id)
{
    EditorFormat(id, "copy");
}

function EditorOnPaste(id)
{
    EditorFormat(id, "paste");
}

function EditorOnBold(id)
{
    EditorFormat(id, "bold");
}

function EditorOnItalic(id)
{
    EditorFormat(id, "italic");
}

function EditorOnUnderline(id)
{
    EditorFormat(id, "underline");
}

function EditorOnForegroundColor(id)
{
    if (!EditorValidateMode(id)) {
        return;
    }
    var color = showModalDialog(HtmlPath + "ColorSelect.html", "", "font-family:Verdana;font-size:12;dialogWidth:30em;dialogHeight:35em");
	if (color) {
        EditorFormat(id, "forecolor", color);
    }
    else {
        eval(EDITOR_COMPOSITION_PREFIX + id).focus();
    }
}

function EditorOnBackgroundColor(id)
{
    if (!EditorValidateMode(id)) {
        return;
    }
    var color = showModalDialog(HtmlPath + "ColorSelect.html", "", "font-family:Verdana;font-size:12;dialogWidth:30em;dialogHeight:35em");
    if (color) {
        EditorFormat(id, "backcolor", color);
    }
    else {
        eval(EDITOR_COMPOSITION_PREFIX + id).focus();
    }
}

function EditorOnAlignLeft(id)
{
    EditorFormat(id, "justifyleft");
}

function EditorOnCenter(id)
{
    EditorFormat(id, "justifycenter");
}

function EditorOnAlignRight(id)
{
    EditorFormat(id, "justifyright");
}

function EditorOnNumberedList(id)
{
    EditorFormat(id, "insertOrderedList");
}

function EditorOnBullettedList(id)
{
    EditorFormat(id, "insertUnorderedList");
}

function EditorOnDecreaseIndent(id)
{
    EditorFormat(id, "outdent");
}

function EditorOnIncreaseIndent(id)
{
    EditorFormat(id, "indent");
}

function EditorOnCreateHyperlink(id)
{
    if (!EditorValidateMode(id)) {
        return;
    }
    var anchor = EditorGetElement("A", eval(EDITOR_COMPOSITION_PREFIX + id).document.selection.createRange().parentElement());
    var link = prompt("加入網站連結 (如 http://www.yahoo.com)：", anchor ? anchor.href : "http://");
    if (link && link != "http://") {
        if (eval(EDITOR_COMPOSITION_PREFIX + id).document.selection.type == "None") {
            var range = eval(EDITOR_COMPOSITION_PREFIX + id).document.selection.createRange();
            range.pasteHTML('<A HREF="' + link + '"></A>');
	    range.select();
        }
	else {
            EditorFormat(id, "CreateLink", link);
        }
    }
}

function EditorOnStartInsertSmiley(id)
{
    if (eval(EDITOR_IMAGE_CHOOSER_PREFIX + id).IsShowing()) {
        eval(EDITOR_IMAGE_CHOOSER_PREFIX + id).Hide();
    }
    else {
        var editor = editorMap[id];
        editor.selectionRange = eval(EDITOR_COMPOSITION_PREFIX + id).document.selection.createRange();
        eval(EDITOR_IMAGE_CHOOSER_PREFIX + id).Show(eval(EDITOR_SMILEY_BUTTON_PREFIX + id).offsetLeft - 124, eval(EDITOR_BOTTOM_TOOLBAR_PREFIX + id).offsetTop + eval(EDITOR_BOTTOM_TOOLBAR_PREFIX + id).offsetHeight - 124);
    }
}

function EditorOnEndInsertSmiley(image, id)
{
    if (!EditorValidateMode(id)) {
        return;
    }
    var imgTag = '<img src="' + image + '">';
    var editor = editorMap[id];
    var bodyRange = eval(EDITOR_COMPOSITION_PREFIX + id).document.body.createTextRange();
    if (bodyRange.inRange(editor.selectionRange)) {
        editor.selectionRange.pasteHTML(imgTag);
        eval(EDITOR_COMPOSITION_PREFIX + id).focus();
    }
    else {
        eval(EDITOR_COMPOSITION_PREFIX + id).document.body.innerHTML += imgTag;
        editor.selectionRange.collapse(false);
        editor.selectionRange.select();
    }
}

function EditorOnParagraph(id, select)
{
    EditorFormat(id, "formatBlock", select[select.selectedIndex].value);
    select.selectedIndex = 0;
}

function EditorOnFont(id, select)
{
    EditorFormat(id, "fontname", select[select.selectedIndex].value);
    select.selectedIndex = 0;
}

function EditorOnSize(id, select)
{
    EditorFormat(id, "fontsize", select[select.selectedIndex].value);
    select.selectedIndex = 0;
}

function EditorOnViewHTMLSource(id, textMode)
{
    var editor = editorMap[id];
    editor.textMode = textMode;
    if (editor.textMode) {
        EditorCleanHTML(id);
        EditorCleanHTML(id);
        eval(EDITOR_COMPOSITION_PREFIX + id).document.body.innerText = eval(EDITOR_COMPOSITION_PREFIX + id).document.body.innerHTML;
    }
    else {
        eval(EDITOR_COMPOSITION_PREFIX + id).document.body.innerHTML = eval(EDITOR_COMPOSITION_PREFIX + id).document.body.innerText;
    }
    eval(EDITOR_COMPOSITION_PREFIX + id).focus();
}

function EditorOnClick(id)
{
    eval(EDITOR_IMAGE_CHOOSER_PREFIX + id).Hide();
}
		
function EditorValidateMode(id)
{
    var editor = editorMap[id];
    if (!editor.textMode) {
	return true;
    }
    alert("請先取消勾選 \"編輯HTML原始檔\"");
    eval(EDITOR_COMPOSITION_PREFIX + id).focus();
    return false;
}

function EditorFormat(id, what, opt)
{
    if (!EditorValidateMode(id)) {
        return;
    }
    if (opt == "removeFormat") {
        what = opt;
        opt = null;
    }
    if (opt == null) {
        eval(EDITOR_COMPOSITION_PREFIX + id).document.execCommand(what);
    }
    else {
        eval(EDITOR_COMPOSITION_PREFIX + id).document.execCommand(what, "", opt);
    }
}

function EditorCleanHTML(id)
{
    var fonts = eval(EDITOR_COMPOSITION_PREFIX + id).document.body.all.tags("FONT");
    for (var i = fonts.length - 1; i >= 0; i--) {
        var font = fonts[i];
        if (font.style.backgroundColor == "#ffffff") {
            font.outerHTML = font.innerHTML;
        }
    }
}

function EditorGetElement(tagName, start)
{
    while (start && start.tagName != tagName) {
        start = start.parentElement;
    }
    return start;
}

function EditorExportHTML()
{
    for (i = 0; i < editorIDArray.length; i++) {
        var editor = editorMap[editorIDArray[i]];
        var txt = editor.GetHTML();
        var count = getStringBytes(txt);
        /*if (count > 32000) {
			alert("目前主要文字資料框的字數為" + count + "，已超過最大限定字數32000個字。\n請調整字數後再按「確定」。");
			event.returnValue = false;
			break;
        }*/
		
		if (count > 100000) {
		var intJ=Math.ceil(count/100000);		
		document.all[editor.textID].value =txt.substr(0,100000);
		for(var j=1;j<intJ;j++){
		addOBJ(txt.substr(j*100000,100000),editor.textID);
		 }
		}
		else document.all[editor.textID].value = editor.GetHTML();
	}
}
function addOBJ(x,thisID){
  var addText=document.createElement('input');
  addText.type="text";
  addText.name=document.all[thisID].name;
    addText.value=x;
document.forms[0].appendChild(addText);
}
