<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

	<head>
		<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
		<meta name="generator" content="Adobe GoLive" />
		<title>i-mode Emoji</title>
	</head>

	<body>
		<hr />
		<p>ADOBE SYSTEMS INCORPORATED</p>
		<p>Copyright 2001 - 2005 Adobe Systems Incorporated<br />
			All Rights Reserved</p>
		<p>NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms of the Adobe license agreement accompanying it. If you have received this file from a source other than Adobe, then your use, modification, or distribution of it requires the prior written permission of Adobe.</p>
		<hr />
		<p><b>Extension Name:</b> emoji</p>
		<p><b>Folder name:</b> i-mode Emoji</p>
		<hr />
		<p><b>Description:</b></p>
		<p>The i-mode Emoji extension allows the user to input Emoji pictograms in Compact HTML documents for NTT DoCoMo i-mode mobile phones. Please see the readme for more information.</p>
		<hr />
		<p><b>Module Definition:</b></p>
		<jsxmodule debug="false" info="$$$/extendscript/iModeEmoji/info=This extension adds support for i-mode compatible pictograms. It includes an Emoji common object and associated palette." name="emoji" version="2.0" /> 
		<p><b>Scripts:</b></p>
		<script><!--
//--------------------------------------------------------------------
// GLOBAL VARIABLES
//--------------------------------------------------------------------
var inputType;	// = "SJISBinary", "SJISDecCode", "UCS2HexCode" for inspector
var inputTypePal; // for emoji palette
var defaultInputType; // = "SJISBinary", "SJISDecCode", "UCS2HexCode"
var emojiAppearance;  // = "MonoImages", "ColorImages", "EmojiFont"
var useEmojiFont;
var useColorEmojis;

var emojiNames;
var emojiChars;
var emojiGroupIndex;
var numEmojiGroups;
var emojiIndex;
//var emojiWidth;
//var emojiHeight;
var emojiCellWidth;
var emojiCellHeight;
var emojiObjectWidth;
var emojiObjectHeight;

var numCellColumns;
var numCellLines;
var numEmojis;
var numBasicEmojis;
var numExtendedEmojis;

var emojiAll;
var emojiGroup1;
var emojiGroup2;
var emojiGroup3;
var emojiGroup4;
var emojiGroup5;
var emojiGroup6;
var emojiGroup7;
var emojiGroup8;
var emojiGroup9;
var emojiGroup10;
var emojiGroup11;
var emojiGroup12;
var emojiGroup13;
var emojiGroup14;
var emojiGroup15;

var lastGroupPos;

var allEmojis;
var emojiImages;	// Array containing picture objects - initializeModule
var emojiButtonNormal;
var emojiButtonUp;
var emojiButtonDown;
var emojiExampleImages;

var listItemHeight;
var listItemVMargin; // top:3 + bottom:3
var listItemHMargin; // left:5 + right:5
var numListItems;
var stringHeight;
var offsetToString;

var lastUrlEncode;
var moduleFolderUrl;

var onWindows;
var emojiSettingsState;

//--------------------------------------------------------------------
// CALLBACK FUNCTIONS
//--------------------------------------------------------------------

//---------------------------------------------------------
// initializeModule - called after the module has been loaded
//
// Description
//   Use to initialize global variables and data structures, and
//   create Picture objects using createPicture.

function initializeModule() 
{

	emojiNames = new Array(
		// Basic Emoji characters
		"$$$/extendscript/iModeEmoji/emojiNames/Fine=Fine",
		"$$$/extendscript/iModeEmoji/emojiNames/Cloudy=Cloudy",
		"$$$/extendscript/iModeEmoji/emojiNames/Rain=Rain",
		"$$$/extendscript/iModeEmoji/emojiNames/Snow=Snow",
		"$$$/extendscript/iModeEmoji/emojiNames/Thunder=Thunder",
		"$$$/extendscript/iModeEmoji/emojiNames/Typhoon=Typhoon",
		"$$$/extendscript/iModeEmoji/emojiNames/Fog=Fog",
		"$$$/extendscript/iModeEmoji/emojiNames/Drizzle=Drizzle",
		"$$$/extendscript/iModeEmoji/emojiNames/Aries=Aries",
		"$$$/extendscript/iModeEmoji/emojiNames/Taurus=Taurus",
		"$$$/extendscript/iModeEmoji/emojiNames/Gemini=Gemini",
		"$$$/extendscript/iModeEmoji/emojiNames/Cancer=Cancer",
		"$$$/extendscript/iModeEmoji/emojiNames/Leo=Leo",
		"$$$/extendscript/iModeEmoji/emojiNames/Virgo=Virgo",
		"$$$/extendscript/iModeEmoji/emojiNames/Libra=Libra",
		"$$$/extendscript/iModeEmoji/emojiNames/Scorpio=Scorpio",
		"$$$/extendscript/iModeEmoji/emojiNames/Sagittarius=Sagittarius",
		"$$$/extendscript/iModeEmoji/emojiNames/Capricorn=Capricorn",
		"$$$/extendscript/iModeEmoji/emojiNames/Aquarius=Aquarius",
		"$$$/extendscript/iModeEmoji/emojiNames/Pisces=Pisces",
		"$$$/extendscript/iModeEmoji/emojiNames/Sports=Sports",
		"$$$/extendscript/iModeEmoji/emojiNames/Baseball=Baseball",
		"$$$/extendscript/iModeEmoji/emojiNames/Golf=Golf",
		"$$$/extendscript/iModeEmoji/emojiNames/Tennis=Tennis",
		"$$$/extendscript/iModeEmoji/emojiNames/Soccer=Soccer",
		"$$$/extendscript/iModeEmoji/emojiNames/Ski=Ski",
		"$$$/extendscript/iModeEmoji/emojiNames/Basketball=Basketball",
		"$$$/extendscript/iModeEmoji/emojiNames/MotorSports=Motor sports",
		"$$$/extendscript/iModeEmoji/emojiNames/Pager=Pager",
		"$$$/extendscript/iModeEmoji/emojiNames/Train=Train",
		"$$$/extendscript/iModeEmoji/emojiNames/Subway=Subway",
		"$$$/extendscript/iModeEmoji/emojiNames/BulletTrain=Bullet train",
		"$$$/extendscript/iModeEmoji/emojiNames/CarSedan=Car (sedan)",
		"$$$/extendscript/iModeEmoji/emojiNames/CarRV=Car (RV)",
		"$$$/extendscript/iModeEmoji/emojiNames/Bus=Bus",
		"$$$/extendscript/iModeEmoji/emojiNames/Ship=Ship",
		"$$$/extendscript/iModeEmoji/emojiNames/Airplane=Airplane",
		"$$$/extendscript/iModeEmoji/emojiNames/House=House",
		"$$$/extendscript/iModeEmoji/emojiNames/Building=Building",
		"$$$/extendscript/iModeEmoji/emojiNames/PostOffice=Post office",
		"$$$/extendscript/iModeEmoji/emojiNames/Hospital=Hospital",
		"$$$/extendscript/iModeEmoji/emojiNames/Bank=Bank",
		"$$$/extendscript/iModeEmoji/emojiNames/ATM=ATM",
		"$$$/extendscript/iModeEmoji/emojiNames/Hotel=Hotel",
		"$$$/extendscript/iModeEmoji/emojiNames/ConvenienceStore=Convenience store",
		"$$$/extendscript/iModeEmoji/emojiNames/GasStation=Gas station",
		"$$$/extendscript/iModeEmoji/emojiNames/Parking=Parking",
		"$$$/extendscript/iModeEmoji/emojiNames/TrafficSignal=Traffic signal",
		"$$$/extendscript/iModeEmoji/emojiNames/Toilet=Toilet",
		"$$$/extendscript/iModeEmoji/emojiNames/Restaurant=Restaurant",
		"$$$/extendscript/iModeEmoji/emojiNames/Cafe=Cafe",
		"$$$/extendscript/iModeEmoji/emojiNames/Bar=Bar",
		"$$$/extendscript/iModeEmoji/emojiNames/Beer=Beer",
		"$$$/extendscript/iModeEmoji/emojiNames/FastFood=Fast food",
		"$$$/extendscript/iModeEmoji/emojiNames/Boutique=Boutique",
		"$$$/extendscript/iModeEmoji/emojiNames/Hairdresser=Hairdresser",
		"$$$/extendscript/iModeEmoji/emojiNames/Karaoke=Karaoke",
		"$$$/extendscript/iModeEmoji/emojiNames/Movie=Movie",
		"$$$/extendscript/iModeEmoji/emojiNames/DiagonallyUpwardTowardRight=Diagonally upward toward right",
		"$$$/extendscript/iModeEmoji/emojiNames/AmusementPark=Amusement park",
		"$$$/extendscript/iModeEmoji/emojiNames/Music=Music",
		"$$$/extendscript/iModeEmoji/emojiNames/Art=Art",
		"$$$/extendscript/iModeEmoji/emojiNames/Drama=Drama",
		"$$$/extendscript/iModeEmoji/emojiNames/Event=Event",
		"$$$/extendscript/iModeEmoji/emojiNames/Ticket=Ticket",
		"$$$/extendscript/iModeEmoji/emojiNames/Smoking=Smoking",
		"$$$/extendscript/iModeEmoji/emojiNames/NonSmoking=Nonsmoking",
		"$$$/extendscript/iModeEmoji/emojiNames/Camera=Camera",
		"$$$/extendscript/iModeEmoji/emojiNames/Bag=Bag",
		"$$$/extendscript/iModeEmoji/emojiNames/Book=Book",
		"$$$/extendscript/iModeEmoji/emojiNames/Ribbon=Ribbon",
		"$$$/extendscript/iModeEmoji/emojiNames/Present=Present",
		"$$$/extendscript/iModeEmoji/emojiNames/Birthday=Birthday",
		"$$$/extendscript/iModeEmoji/emojiNames/Phone=Phone",
		"$$$/extendscript/iModeEmoji/emojiNames/MobilePhone=Mobile phone",
		"$$$/extendscript/iModeEmoji/emojiNames/Memo=Memo",
		"$$$/extendscript/iModeEmoji/emojiNames/TV=TV",
		"$$$/extendscript/iModeEmoji/emojiNames/Game=Game",
		"$$$/extendscript/iModeEmoji/emojiNames/CD=CD",
		"$$$/extendscript/iModeEmoji/emojiNames/Heart=Heart",
		"$$$/extendscript/iModeEmoji/emojiNames/Spade=Spade",
		"$$$/extendscript/iModeEmoji/emojiNames/Diamond=Diamond",
		"$$$/extendscript/iModeEmoji/emojiNames/Club=Club",
		"$$$/extendscript/iModeEmoji/emojiNames/Eyes=Eyes",
		"$$$/extendscript/iModeEmoji/emojiNames/Ear=Ear",
		"$$$/extendscript/iModeEmoji/emojiNames/HandRock=Hand (rock)",
		"$$$/extendscript/iModeEmoji/emojiNames/HandScissors=Hand (scissors)",
		"$$$/extendscript/iModeEmoji/emojiNames/HandPaper=Hand (paper)",
		"$$$/extendscript/iModeEmoji/emojiNames/DiagonallyDownwardTowardRight=Diagonally downward toward right",
		"$$$/extendscript/iModeEmoji/emojiNames/DiagonallyUpwardTowardLeft=Diagonally upward toward left",
		"$$$/extendscript/iModeEmoji/emojiNames/Foot=Foot",
		"$$$/extendscript/iModeEmoji/emojiNames/Shoe=Shoe",
		"$$$/extendscript/iModeEmoji/emojiNames/Eyeglasses=Eyeglasses",
		"$$$/extendscript/iModeEmoji/emojiNames/Wheelchair=Wheelchair",
		"$$$/extendscript/iModeEmoji/emojiNames/NewMoon=New moon",
		"$$$/extendscript/iModeEmoji/emojiNames/WaningMoon=Waning moon",
		"$$$/extendscript/iModeEmoji/emojiNames/HalfMoon=Half moon",
		"$$$/extendscript/iModeEmoji/emojiNames/CrescentMoon=Crescent moon",
		"$$$/extendscript/iModeEmoji/emojiNames/FullMoon=Full moon",
		"$$$/extendscript/iModeEmoji/emojiNames/Dog=Dog",
		"$$$/extendscript/iModeEmoji/emojiNames/Cat=Cat",
		"$$$/extendscript/iModeEmoji/emojiNames/Resort=Resort",
		"$$$/extendscript/iModeEmoji/emojiNames/Christmas=Christmas",
		"$$$/extendscript/iModeEmoji/emojiNames/DiagonallyDownwardTowardLeft=Diagonally downward toward left",
		"$$$/extendscript/iModeEmoji/emojiNames/PhoneTo=Phone to",
		"$$$/extendscript/iModeEmoji/emojiNames/MailTo=Mail to",
		"$$$/extendscript/iModeEmoji/emojiNames/FaxTo=Fax to",
		"$$$/extendscript/iModeEmoji/emojiNames/iMode=i-mode",
		"$$$/extendscript/iModeEmoji/emojiNames/iModeWithFrame=i-mode with frame",
		"$$$/extendscript/iModeEmoji/emojiNames/Mail=Mail",
		"$$$/extendscript/iModeEmoji/emojiNames/ProvidedByDoCoMo=Provided by DoCoMo",
		"$$$/extendscript/iModeEmoji/emojiNames/DoCoMoPoint=DoCoMo point",
		"$$$/extendscript/iModeEmoji/emojiNames/FeeCharging=Fee charging",
		"$$$/extendscript/iModeEmoji/emojiNames/FreeOfCharge=Free of charge",
		"$$$/extendscript/iModeEmoji/emojiNames/ID=ID",
		"$$$/extendscript/iModeEmoji/emojiNames/Password=Password",
		"$$$/extendscript/iModeEmoji/emojiNames/Continuing=Continuing",
		"$$$/extendscript/iModeEmoji/emojiNames/Clear=Clear",
		"$$$/extendscript/iModeEmoji/emojiNames/Search=Search",
		"$$$/extendscript/iModeEmoji/emojiNames/New=New",
		"$$$/extendscript/iModeEmoji/emojiNames/LocationInformation=Location information",
		"$$$/extendscript/iModeEmoji/emojiNames/FreeDial=Free dial",
		"$$$/extendscript/iModeEmoji/emojiNames/SharpDial=Sharp dial",
		"$$$/extendscript/iModeEmoji/emojiNames/MopaQ=MopaQ",
		"$$$/extendscript/iModeEmoji/emojiNames/1=1",
		"$$$/extendscript/iModeEmoji/emojiNames/2=2",
		"$$$/extendscript/iModeEmoji/emojiNames/3=3",
		"$$$/extendscript/iModeEmoji/emojiNames/4=4",
		"$$$/extendscript/iModeEmoji/emojiNames/5=5",
		"$$$/extendscript/iModeEmoji/emojiNames/6=6",
		"$$$/extendscript/iModeEmoji/emojiNames/7=7",
		"$$$/extendscript/iModeEmoji/emojiNames/8=8",
		"$$$/extendscript/iModeEmoji/emojiNames/9=9",
		"$$$/extendscript/iModeEmoji/emojiNames/0=0",
		"$$$/extendscript/iModeEmoji/emojiNames/Accept=Accept",
		"$$$/extendscript/iModeEmoji/emojiNames/BlackHeart=Black heart",
		"$$$/extendscript/iModeEmoji/emojiNames/FlutteringHeart=Fluttering heart",
		"$$$/extendscript/iModeEmoji/emojiNames/HeartBreak=Heartbreak",
		"$$$/extendscript/iModeEmoji/emojiNames/Hearts=Hearts",
		"$$$/extendscript/iModeEmoji/emojiNames/HappyFace=Happy face",
		"$$$/extendscript/iModeEmoji/emojiNames/AngryFace=Angry face",
		"$$$/extendscript/iModeEmoji/emojiNames/DisappointedFace=Disappointed face",
		"$$$/extendscript/iModeEmoji/emojiNames/SadFace=Sad face",
		"$$$/extendscript/iModeEmoji/emojiNames/Dizzy=Dizzy",
		"$$$/extendscript/iModeEmoji/emojiNames/Good=Good (upward arrow)",
		"$$$/extendscript/iModeEmoji/emojiNames/Cheerful=Cheerful",
		"$$$/extendscript/iModeEmoji/emojiNames/Comfort=Comfort (thermal spring)",
		"$$$/extendscript/iModeEmoji/emojiNames/Cute=Cute",
		"$$$/extendscript/iModeEmoji/emojiNames/Kiss=Kiss",
		"$$$/extendscript/iModeEmoji/emojiNames/ShiningNew=Shining new",
		"$$$/extendscript/iModeEmoji/emojiNames/GoodIdea=Good idea",
		"$$$/extendscript/iModeEmoji/emojiNames/Angry=Angry",
		"$$$/extendscript/iModeEmoji/emojiNames/Punch=Punch",
		"$$$/extendscript/iModeEmoji/emojiNames/Bomb=Bomb",
		"$$$/extendscript/iModeEmoji/emojiNames/Mood=Mood",
		"$$$/extendscript/iModeEmoji/emojiNames/Bad=Bad (downward arrow)",
		"$$$/extendscript/iModeEmoji/emojiNames/Sleepy=Sleepy (sleep)",
		"$$$/extendscript/iModeEmoji/emojiNames/ExclamationMark=Exclamation mark",
		"$$$/extendscript/iModeEmoji/emojiNames/ExclamationQuestionMarks=Exclamation & question marks",
		"$$$/extendscript/iModeEmoji/emojiNames/TwoExclamationMarks=Two exclamation marks",
		"$$$/extendscript/iModeEmoji/emojiNames/Bump=Bump (collision)",
		"$$$/extendscript/iModeEmoji/emojiNames/Sweat=Sweat",
		"$$$/extendscript/iModeEmoji/emojiNames/ColdSweat=Cold sweat",
		"$$$/extendscript/iModeEmoji/emojiNames/Dash=Dash (running dash)",
		"$$$/extendscript/iModeEmoji/emojiNames/Macron1=Macron 1",
		"$$$/extendscript/iModeEmoji/emojiNames/Macron2=Macron 2",
		"$$$/extendscript/iModeEmoji/emojiNames/Clapboard=Clapboard",
		"$$$/extendscript/iModeEmoji/emojiNames/Pouch=Pouch",
		"$$$/extendscript/iModeEmoji/emojiNames/Pen=Pen",
		"$$$/extendscript/iModeEmoji/emojiNames/Silhouette=Silhouette",
		"$$$/extendscript/iModeEmoji/emojiNames/Chair=Chair",
		"$$$/extendscript/iModeEmoji/emojiNames/Night=Night",
		"$$$/extendscript/iModeEmoji/emojiNames/Soon=Soon",
		"$$$/extendscript/iModeEmoji/emojiNames/On=On",
		"$$$/extendscript/iModeEmoji/emojiNames/End=End",
		"$$$/extendscript/iModeEmoji/emojiNames/Clock=Clock",

		// Extended Emoji characters
		"$$$/extendscript/iModeEmoji/emojiNames/iAppli=i-appli",
		"$$$/extendscript/iModeEmoji/emojiNames/iAppliWithBorder=i-appli (with border)",
		"$$$/extendscript/iModeEmoji/emojiNames/Tshirt=T-shirt (border)",
		"$$$/extendscript/iModeEmoji/emojiNames/Purse=Purse",
		"$$$/extendscript/iModeEmoji/emojiNames/Makeup=Make-up",
		"$$$/extendscript/iModeEmoji/emojiNames/Jeans=Jeans",
		"$$$/extendscript/iModeEmoji/emojiNames/Snowboarding=Snowboarding",
		"$$$/extendscript/iModeEmoji/emojiNames/Chapel=Chapel",
		"$$$/extendscript/iModeEmoji/emojiNames/Door=Door",
		"$$$/extendscript/iModeEmoji/emojiNames/MoneyBag=Money bag",
		"$$$/extendscript/iModeEmoji/emojiNames/Computer=Computer",
		"$$$/extendscript/iModeEmoji/emojiNames/LoveLetter=Love letter",
		"$$$/extendscript/iModeEmoji/emojiNames/Wrench=Wrench",
		"$$$/extendscript/iModeEmoji/emojiNames/Pencil=Pencil",
		"$$$/extendscript/iModeEmoji/emojiNames/Crown=Crown",
		"$$$/extendscript/iModeEmoji/emojiNames/Ring=Ring",
		"$$$/extendscript/iModeEmoji/emojiNames/Sandglass=Sandglass",
		"$$$/extendscript/iModeEmoji/emojiNames/Bicycle=Bicycle",
		"$$$/extendscript/iModeEmoji/emojiNames/Yunomi=Yunomi (Tea cup)",
		"$$$/extendscript/iModeEmoji/emojiNames/WristWatch=Wrist watch",
		"$$$/extendscript/iModeEmoji/emojiNames/ThinkingFace=Thinking face",
		"$$$/extendscript/iModeEmoji/emojiNames/ReliefFace=Relief face",
		"$$$/extendscript/iModeEmoji/emojiNames/ColdSweat1=Cold sweat",
		"$$$/extendscript/iModeEmoji/emojiNames/ColdSweat2=Cold sweat 2",
		"$$$/extendscript/iModeEmoji/emojiNames/PoutingFace=Pouting face",
		"$$$/extendscript/iModeEmoji/emojiNames/ExpressionlessFace=Expressionless face",
		"$$$/extendscript/iModeEmoji/emojiNames/HeartShapedEyes=Heart shaped eyes",
		"$$$/extendscript/iModeEmoji/emojiNames/ThumbsUp=Thumbs up",
		"$$$/extendscript/iModeEmoji/emojiNames/StickingTongueOut=Sticking tongue out",
		"$$$/extendscript/iModeEmoji/emojiNames/Wink=Wink",
		"$$$/extendscript/iModeEmoji/emojiNames/HappyFace=Happy face",
		"$$$/extendscript/iModeEmoji/emojiNames/EnduringFace=Enduring face",
		"$$$/extendscript/iModeEmoji/emojiNames/Cat2=Cat 2",
		"$$$/extendscript/iModeEmoji/emojiNames/Crying=Crying",
		"$$$/extendscript/iModeEmoji/emojiNames/Tear=Tear",
		"$$$/extendscript/iModeEmoji/emojiNames/NG=NG (No good)",
		"$$$/extendscript/iModeEmoji/emojiNames/PaperClip=Paper clip",
		"$$$/extendscript/iModeEmoji/emojiNames/Copyright=Copyright",
		"$$$/extendscript/iModeEmoji/emojiNames/Trademark=Trademark",
		"$$$/extendscript/iModeEmoji/emojiNames/RunningMan=Running man",
		"$$$/extendscript/iModeEmoji/emojiNames/TopSecret=Top secret",
		"$$$/extendscript/iModeEmoji/emojiNames/Recycle=Recycle",
		"$$$/extendscript/iModeEmoji/emojiNames/RegisteredTrademark=Registered trademark",
		"$$$/extendscript/iModeEmoji/emojiNames/DangerCaution=Danger / Caution",
		"$$$/extendscript/iModeEmoji/emojiNames/Prohibited=Prohibited",
		"$$$/extendscript/iModeEmoji/emojiNames/Vacant=Vacant",
		"$$$/extendscript/iModeEmoji/emojiNames/Approved=Approved",
		"$$$/extendscript/iModeEmoji/emojiNames/Full=Full",
		"$$$/extendscript/iModeEmoji/emojiNames/HorizontalArrows=Horizontal arrows",
		"$$$/extendscript/iModeEmoji/emojiNames/VerticalArrows=Vertical arrows",
		"$$$/extendscript/iModeEmoji/emojiNames/School=School",
		"$$$/extendscript/iModeEmoji/emojiNames/Wave=Wave",
		"$$$/extendscript/iModeEmoji/emojiNames/MountFuji=Mount Fuji",
		"$$$/extendscript/iModeEmoji/emojiNames/4leafClover=4-leaf clover",
		"$$$/extendscript/iModeEmoji/emojiNames/Cherries=Cherries",
		"$$$/extendscript/iModeEmoji/emojiNames/Tulip=Tulip",
		"$$$/extendscript/iModeEmoji/emojiNames/Banana=Banana",
		"$$$/extendscript/iModeEmoji/emojiNames/Apple=Apple",
		"$$$/extendscript/iModeEmoji/emojiNames/Seedling=Seedling",
		"$$$/extendscript/iModeEmoji/emojiNames/MapleLeaf=Maple leaf",
		"$$$/extendscript/iModeEmoji/emojiNames/CherryBlossom=Cherry blossom",
		"$$$/extendscript/iModeEmoji/emojiNames/RiceBall=Rice ball",
		"$$$/extendscript/iModeEmoji/emojiNames/ShortCake=Short cake",
		"$$$/extendscript/iModeEmoji/emojiNames/SakeBottle=Sake bottle (sake cup)",
		"$$$/extendscript/iModeEmoji/emojiNames/Bowl=Bowl",
		"$$$/extendscript/iModeEmoji/emojiNames/Bread=Bread",
		"$$$/extendscript/iModeEmoji/emojiNames/Snail=Snail",
		"$$$/extendscript/iModeEmoji/emojiNames/BabyChick=Baby chick",
		"$$$/extendscript/iModeEmoji/emojiNames/Penguin=Penguin",
		"$$$/extendscript/iModeEmoji/emojiNames/Fish=Fish",
		"$$$/extendscript/iModeEmoji/emojiNames/Yumm=Yumm!",
		"$$$/extendscript/iModeEmoji/emojiNames/HeHeHe=He he he",
		"$$$/extendscript/iModeEmoji/emojiNames/Horse=Horse",
		"$$$/extendscript/iModeEmoji/emojiNames/Pig=Pig",
		"$$$/extendscript/iModeEmoji/emojiNames/Wineglass=Wine glass",
		"$$$/extendscript/iModeEmoji/emojiNames/VeryThin=Very thin");

	emojiChars = new Array(
		// Basic Emoji characters
		"\uE63E","\uE63F","\uE640","\uE641","\uE642","\uE643","\uE644",
		"\uE645","\uE646","\uE647","\uE648","\uE649","\uE64A","\uE64B",
		"\uE64C","\uE64D","\uE64E","\uE64F","\uE650","\uE651","\uE652",
		"\uE653","\uE654","\uE655","\uE656","\uE657","\uE658","\uE659",
		"\uE65A","\uE65B","\uE65C","\uE65D","\uE65E","\uE65F","\uE660",
		"\uE661","\uE662","\uE663","\uE664","\uE665","\uE666","\uE667",
		"\uE668","\uE669","\uE66A","\uE66B","\uE66C","\uE66D","\uE66E",
		"\uE66F","\uE670","\uE671","\uE672","\uE673","\uE674","\uE675",
		"\uE676","\uE677","\uE678","\uE679","\uE67A","\uE67B","\uE67C",
		"\uE67D","\uE67E","\uE67F","\uE680","\uE681","\uE682","\uE683",
		"\uE684","\uE685","\uE686","\uE687","\uE688","\uE689","\uE68A",
		"\uE68B","\uE68C","\uE68D","\uE68E","\uE68F","\uE690","\uE691",
		"\uE692","\uE693","\uE694","\uE695","\uE696","\uE697","\uE698",
		"\uE699","\uE69A","\uE69B","\uE69C","\uE69D","\uE69E","\uE69F",
		"\uE6A0","\uE6A1","\uE6A2","\uE6A3","\uE6A4","\uE6A5","\uE6CE",
		"\uE6CF","\uE6D0","\uE6D1","\uE6D2","\uE6D3","\uE6D4","\uE6D5",
		"\uE6D6","\uE6D7","\uE6D8","\uE6D9","\uE6DA","\uE6DB","\uE6DC",
		"\uE6DD","\uE6DE","\uE6DF","\uE6E0","\uE6E1","\uE6E2","\uE6E3",
		"\uE6E4","\uE6E5","\uE6E6","\uE6E7","\uE6E8","\uE6E9","\uE6EA",
		"\uE6EB","\uE70B","\uE6EC","\uE6ED","\uE6EE","\uE6EF","\uE6F0",
		"\uE6F1","\uE6F2","\uE6F3","\uE6F4","\uE6F5","\uE6F6","\uE6F7",
		"\uE6F8","\uE6F9","\uE6FA","\uE6FB","\uE6FC","\uE6FD","\uE6FE",
		"\uE6FF","\uE700","\uE701","\uE702","\uE703","\uE704","\uE705",
		"\uE706","\uE707","\uE708","\uE709","\uE70A","\uE6AC","\uE6AD",
		"\uE6AE","\uE6B1","\uE6B2","\uE6B3","\uE6B7","\uE6B8","\uE6B9",
		"\uE6BA",

		// Extended Emoji characters
		"\uE70C","\uE70D","\uE70E","\uE70F","\uE710","\uE711","\uE712",
		"\uE713","\uE714","\uE715","\uE716","\uE717","\uE718","\uE719",
		"\uE71A","\uE71B","\uE71C","\uE71D","\uE71E","\uE71F","\uE720",
		"\uE721","\uE722","\uE723","\uE724","\uE725","\uE726","\uE727",
		"\uE728","\uE729","\uE72A","\uE72B","\uE72C","\uE72D","\uE72E",
		"\uE72F","\uE730","\uE731","\uE732","\uE733","\uE734","\uE735",
		"\uE736","\uE737","\uE738","\uE739","\uE73A","\uE73B","\uE73C",
		"\uE73D","\uE73E","\uE73F","\uE740","\uE741","\uE742","\uE743",
		"\uE744","\uE745","\uE746","\uE747","\uE748","\uE749","\uE74A",
		"\uE74B","\uE74C","\uE74D","\uE74E","\uE74F","\uE750","\uE751",
		"\uE752","\uE753","\uE754","\uE755","\uE756","\uE757"
	);

	// intialize emoji characters variables
	numBasicEmojis = 176;
	numExtendedEmojis = 76;
	numEmojis = numBasicEmojis + numExtendedEmojis;
	numEmojiExamples = 10;
	emojiAll = new Array(numEmojis);
	numEmojiGroups = 16;	// number of emoji group (included "All")

	// set Emoji character codes
	var n = 0;

	// for Basic Emoji characters
	for(var code = 63647; n < 94; n++) {
		emojiAll[n] = code ++;
	}
	for(var code = 63808; n < 104; n++) {
		emojiAll[n] = code ++;
	}
	for(var code = 63858; n < 117; n++) {
		emojiAll[n] = code ++;
	}
	for(var code = 63872; n < 134; n++) {
		emojiAll[n] = code ++;
	}
	emojiAll[n] = 63920; // #134
	n ++;
	for(var code = 63889; n < 166; n++) {
		emojiAll[n] = code ++;
	}
	for(var code = 63824; n < 169; n++) {
		emojiAll[n] = code ++;
	}
	for(var code = 63829; n < 172; n++) {
		emojiAll[n] = code ++;
	}
	for(var code = 63835; n < numBasicEmojis; n++) {
		emojiAll[n] = code ++;
	}

	// for Extended Emoji characters
	for(var code = 63921; n < numEmojis; n++) {
		emojiAll[n] = code ++;
	}

	// Weather group #1
	emojiGroup1 = new Array(
		63647,	// Fine
		63648,	// Cloudy
		63649,	// Rain
		63650,	// Snow
		63651,	// Thunder
		63652,	// Typhoon
		63653,	// Fog
		63654,	// Drizzle
		63808,	// New moon
		63809,	// Waning moon
		63810,	// Half moon
		63811,	// Crescent moon
		63812	// Full moon
	);

	// Constellations group #2
	emojiGroup2 = new Array(
		63655,	// Aries
		63656,	// Taurus
		63657,	// Gemini
		63658,	// Cancer
		63659,	// Leo
		63660,	// Virgo
		63661,	// Libra
		63662,	// Scorpio
		63663,	// Sagittarius
		63664,	// Capricorn
		63665,	// Aquarius
		63666	// Pisces
	);

	// Transports group #3
	emojiGroup3 = new Array(
		63676,	// Train
		63677,	// Subway
		63678,	// Bullet train
		63679,	// Car (sedan)
		63680,	// Car (RV)
		63681,	// Bus
		63682,	// Ship
		63683,	// Airplane
		63938	// Bicycle
	);

	// Buildings and Shops group #4
	emojiGroup4 = new Array(
		63684,	// House
		63685,	// Building
		63686,	// Post office
		63687,	// Hospital
		63688,	// Bank
		63689,	// ATM
		63690,	// Hotel
		63691,	// Convenience store
		63692,	// Gas station
		63693,	// Parking
		63694,	// Traffic signal
		63695,	// Toilet
		63696,	// Restaurant
		63697,	// Cafe
		63698,	// Bar
		63699,	// Beer
		63700,	// Fast food
		63701,	// Boutique
		63702,	// Hairdresser
		63740,	// Wheelchair
		63971	// School
	);

	// Foods group #5
	emojiGroup5 = new Array(
		63696,	// Restaurant
		63697,	// Cafe
		63698,	// Bar
		63699,	// Beer
		63700,	// Fast food
		63939,	// Teacup
		63975,	// Cherry
		63977,	// Banana
		63978,	// Apple
		63982,	// Rice ball
		63983,	// Shortcake
		63984,	// Sake bottle with cup
		63985,	// China bowl
		63986,	// Bread
		63995	// Wine glass
	);

	// Entertainments group #6
	emojiGroup6 = new Array(
		63695,	// Toilet
		63703,	// Karaoke
		63704,	// Movie
		63706,	// Amusement park
		63707,	// Music
		63708,	// Art
		63709,	// Drama
		63710,	// Event
		63711,	// Ticket
		63712,	// Smoking
		63713,	// Nonsmoking
		63718,	// Present
		63719,	// Birthday
		63740,	// Wheelchair
		63815,	// Resort
		63816,	// Christmas
		63824,	// Clapboard
		63825,	// Pouch
		63826,	// Pen
		63829,	// Silhouette
		63830,	// Chair
		63831,	// Night
		63835,	// Soon
		63836,	// On
		63837,	// End
		63838,	// Clock
		63965,	// Prohibition
		63966,	// Vacancy
		63968,	// No vacancy
		63972,	// Wave
		63973	// Mt. Fuji
	);

	// Sports group #7
	emojiGroup7 = new Array(
		63667,	// Sports
		63668,	// Baseball
		63669,	// Golf
		63670,	// Tennis
		63671,	// Soccer
		63672,	// Ski
		63673,	// Basketball
		63674,	// Motor sports
		63927,	// Snow board
		63960	// Runner
	);

	// Accessories group #8
	emojiGroup8 = new Array(
		63675,	// Pager
		63714,	// Camera
		63715,	// Bag
		63716,	// Book
		63717,	// Ribbon
		63718,	// Present
		63720,	// Phone
		63721,	// Mobile phone
		63722,	// Memo
		63723,	// TV
		63724,	// Game
		63725,	// CD
		63738,	// Shoe
		63739,	// Eyeglasses
		63825,	// Pouch
		63826,	// Pen
		63923,	// T-shirt
		63924,	// Purse
		63925,	// Make up
		63926,	// Jeans
		63928,	// Chapel
		63929,	// Door
		63930,	// Dollar bag
		63931,	// Personal computer
		63933,	// Adjustable spanner
		63934,	// Pencil
		63935,	// Crown
		63936,	// Ring
		63937,	// Hourglass
		63940,	// Watch
		63957	// Clip
	);

	// Arrows & Symbols group #9
	emojiGroup9 = new Array(
		63705,	// Diagonally upward toward right
		63726,	// Heart
		63727,	// Spade
		63728,	// Diamond
		63729,	// Club
		63735,	// Diagonally downward toward right
		63736,	// Diagonally upward toward left
		63817,	// Diagonally downward toward left
		63958,	// Copyright
		63959,	// Trademark
		63961,	// Secret
		63962,	// Recycling
		63963,	// Registered trademark
		63964,	// Danger and warning
		63965,	// Prohibition
		63966,	// Vacancy
		63967,	// Pass
		63968,	// No vacancy
		63969,	// Right and left arrow
		63970	// Up and down arrow
	);

	// Numbers group #10
	emojiGroup10 = new Array(
		63879,	// 1
		63880,	// 2
		63881,	// 3
		63882,	// 4
		63883,	// 5
		63884,	// 6
		63885,	// 7
		63886,	// 8
		63887,	// 9
		63888	// 0
	);

	// Animals and Flowers group #11
	emojiGroup11 = new Array(
		63813,	// Dog
		63814,	// Cat
		63953,	// Cat 2
		63974,	// Clover
		63976,	// Tulip
		63979,	// Sprout
		63980,	// Maple leaf
		63981,	// Cherry blossoms
		63987,	// Snail
		63988,	// Chick
		63989,	// Penguin
		63990,	// Fish
		63993,	// Horse
		63994	// Pig
	);

	// Emotions group #12
	emojiGroup12 = new Array(
		63889,	// Black heart
		63890,	// Fluttering heart
		63891,	// Heartbreak
		63892,	// Hearts
		63893,	// Happy face
		63894,	// Angry face
		63895,	// Disappointed face
		63896,	// Sad face
		63897,	// Dizzy
		63898,	// Good (upward arrow)
		63899,	// Cheerful
		63900,	// Comfort (thermal spring)
		63901,	// Cute
		63902,	// Kiss
		63903,	// Shining new
		63904,	// Good idea
		63905,	// Angry
		63906,	// Punch
		63907,	// Bomb
		63908,	// Mood
		63909,	// Bad (downward arrow)
		63910,	// Sleepy (sleep)
		63911,	// Exclamation mark
		63912,	// Exclamation & question marks
		63913,	// Two exclamation marks
		63914,	// Bump (collision)
		63915,	// Sweat
		63916,	// Cold sweat
		63917,	// Dash (running dash)
		63918,	// Macron 1
		63919,	// Macron 2
		63941,	// Serious face 
		63942,	// Relieved face 
		63943,	// Cold sweat
		63944,	// Cold sweat 2
		63945,	// Sulky face
		63946,	// Vacant face
		63947,	// Blind with love
		63948,	// Thumb up
		63949,	// Nyah
		63950,	// Wink
		63951,	// Smiling face
		63952,	// Patient face
		63953,	// Cat 2
		63954,	// Crying face
		63955,	// Tearful face
		63991,	// Delicious
		63992,	// Laughing face
		63996	// Disheartened face
	);

	// Mobile Services group #13
	emojiGroup13 = new Array(
		63675,	// Pager
		63720,	// Phone
		63721,	// Mobile phone
		63858,	// Phone to
		63859,	// Mail to
		63860,	// Fax to
		63861,	// i-mode
		63862,	// i-mode with frame
		63863,	// Mail
		63864,	// Provided by DoCoMo
		63865,	// DoCoMo point
		63866,	// Fee charging
		63867,	// Free of charge
		63868,	// ID
		63869,	// Password
		63870,	// Continuing
		63872,	// Clear
		63873,	// Search
		63874,	// New
		63875,	// Location information
		63876,	// Free dial
		63877,	// Sharp dial
		63878,	// MopaQ
		63920,	// Accept
		63921,	// i-appli
		63922,	// i-appli with frame
		63956	// NG
	);

	// Basic Emojis group #14
	emojiGroup14 = new Array(numBasicEmojis);
	for(var i = 0; i < numBasicEmojis; i ++) {
		emojiGroup14[i] = emojiAll[i];
	}

	// Extended Emojis group #15
	emojiGroup15 = new Array(numExtendedEmojis);
	for(var i = 0; i < numExtendedEmojis; i ++) {
		emojiGroup15[i] = emojiAll[numBasicEmojis + i];
	}

	// Replace the Shift-JIS decimal code in all emoji arrays to index.
	for(var groupIndex = 1; groupIndex < numEmojiGroups; groupIndex ++) {
		var emojiGroup = groupIndex2group(groupIndex);
		if(emojiGroup != null) {
			for(var i = 0; i < emojiGroup.length; i ++) {
				var code = emojiGroup[i];
				emojiGroup[i] = code2index(code);
			}
		}
	}

	// set default input method and emoji appearance.
	// set whether use Emoji GIF images.
	// default setting is using images because font installation is not sure.
	loadConfigFile();

}

//----------------------------------------------------
// startModule - called after the module is initialized
// 
// Description:
//   Use this when you want to do something after 
//   initializeModule at startup time.

function startModule() 
{

	// Add a menu item into Special menu for calling i-mode Emoji Setting
	var menuSpecial = menus["special"];
	if(menuSpecial != null) {
		menuSpecial.addItem("", "-");
		menuSpecial.addItem("menuEmojiSettings", 
			module.localize("$$$/extendscript/iModeEmoji/commons/iModeEmojiSettings=i-mode Emoji Settings") + "...");
		menuSpecial.items["menuEmojiSettings"].dynamic = true;
	}

	// initialize global variables
	emojiGroupIndex = 0;		// All Emoji characters
	emojiIndex = 0;				// "Fine"
//	emojiWidth = 18;
//	emojiHeight = 18;
	emojiObjectWidth = 12;
	emojiObjectHeight = 12;
	emojiCellWidth = 18;
	emojiCellHeight = 18;
	onWindows = -1;
	lastUrlEncode = true;
	moduleFolderUrl = module.folder.url;

	// initialize image objects
	allEmojis = null;
	emojiImages = new Array(numEmojis);
	emojiExampleImages = new Array(numEmojiExamples);
	emojiButtonNormal = null;
	emojiButtonUp = null;
	emojiButtonDown = null;

	// for inspector
	// initialize emoji list box
	listItemWidth = -1;
	listItemHeight = -1;
	listItemVMargin = 2; // top:2 + bottom:2
	listItemHMargin = 5; // left:5 + right:5
	offsetToString = 5;
	numListItems = -1;
	stringHeight = -1;

	// for palette
	numCellColumns = 
		Math.floor(emojiPalette.customEmojisPal.width / emojiCellWidth);
	numCellLines = 
		Math.floor(emojiPalette.customEmojisPal.height / emojiCellHeight);
	lastGroupPos = -1;
	emojiSettingsState = 0;

	// Initialization for Emoji palette
	initializeEmojiPalette();

	// for dialog
	// Add a popup menu item for Emoji font if the platform is Windows
	if(isEnabledEmojiFont()) {
		emojiSettingsDialog.popupEmojiAppearance.addItem(
			module.localize("$$$/extendscript/iModeEmoji/emojiAppearances/EmojiFont=Use i-mode Emoji Font"));
	}

	// Register initialization function to onShow event of Emoji settings
	// dialog. In is called whenever Emoji settings dialog become visible.
	emojiSettingsDialog.addEventListener('onShow', initializeEmojiSettings);
}

//---------------------------------------------------------
// inspectTranslation -  inspect the translated tag
//
// Description:
//   Use it to fill in the controls of the inspector with
//   current values.

function inspectTranslation(inspector, source) 
{

	// if name of emoji tag has been manually changed, check to make sure 
	// it is a valid name. 
	// if it is valid, set the translator and inspector accordingly.
	// if it is not valid, set the translator to the current inspector 
	// settings.

	var pattern1 = /[\uE63E-\uE757]/;
	var pattern2 = /&#636[4-9]\d;|&#63[7-8]\d\d;|&#639[0-1]\d;|&#63920;/;
	var pattern3 = /&#x[Ee]63[EFef];|&#x[Ee]6[4-9A-Fa-f][0-9A-Fa-f];|&#x[Ee]7[0-5][0-9A-Fa-f];/;

	var index = -1;
	var tempInputType = "UCS2HexCode";

	// check for character range
	var match = source.match(pattern1);
	if(match != null) {
		index = char2index(match[0]);
		tempInputType = "SJISBinary";
	}
	else {
		// check for entity
		match = source.match(pattern2);
		if(match != null) {
			var code = match[0].substr(2, 5);
			index = code2index(code);
			tempInputType = "SJISDecCode";
		}
		else {
			match = source.match(pattern3);
			if(match != null) {
				var code = match[0].substr(3, 4);
				index = unicode2index(code);
				tempInputType = "UCS2HexCode";
			}
		}
	}

	// make sure it exists
	if(index >= 0) {
		// select current emoji symbol in emoji custom list box
		selectEmojiListItem(inspector.customEmojis, emojiIndex, index);

		emojiIndex = index;
		inputType = tempInputType;

		// set current input method
		if(inputType == "SJISDecCode") {
			inspector.popupInputType.selection = 0;
		}
		else if(inputType == "SJISBinary") {
			inspector.popupInputType.selection = 1;
		}
		else { // inputType == "UCS2HexCode"
			inspector.popupInputType.selection = 2;
		}
		drawEmojiName(inspector.staticEmojiCurrent, inputType, emojiIndex);
	}
	else {
		Window.alert(source + module.localize(
			"$$$/extendscript/iModeEmoji/messages/InvalidEmojiError= is not a valid emoji. Please use i-mode Emoji inspector."));
	}
}

//---------------------------------------------------------
// menuSignal - called when the user chooses a menu item.
//
// Description: Use it to respond to the user's choice of menu item.

function menuSignal(menuItem) 
{

	switch(menuItem.name) {

		case "menuEmojiSettings":
			if(!emojiSettingsDialog.visible) {
				if(emojiSettingsDialog.runModal() == 1) {
					var result = isChangedEmojiSettings();
					if(result > 0) {
						updateEmojiSettings(result);
					}
				}
			}
			break;
	}
}

//---------------------------------------------------------
// controlSignal -  called when the state of a control has changed
//
// Description:
//   Use to extract the state of the control, and react to the state
//   change.
//

function controlSignal(control) 
{

	switch(control.name) {

	// for emoji inspector
		case "popupInputType":
			var selection = control.selection.index;
			if(selection == 0) {
				inputType = "SJISDecCode";
			}
			else if(selection == 1) {
				inputType = "SJISBinary";
			}
			else { // selection == 2
				inputType = "UCS2HexCode";
			}
			setEmojiEntity(emojiIndex);
			break;

		case "scrollEmojis":
			emojiInspector.customEmojis.refresh();
			break;

	// for emoji palette
		case "popupInputTypePal":
			var selection = control.selection.index;
			if(selection == 0) {
				inputTypePal = "SJISDecCode";
			}
			else if(selection == 1) {
				inputTypePal = "SJISBinary";
			}
			else { // selection == 2
				inputTypePal = "UCS2HexCode";
			}
			break;

		case "popupEmojiGroupsPal":
			var selection = control.selection.index;
			if(selection != emojiGroupIndex) {
				emojiGroupIndex = selection;
				emojiPalette.customEmojisPal.refresh();
				lastGroupPos = -1;
			}
			break;

	// for emoji setting dialog
		case "popupDefaultInputType":
			if(!(emojiSettingsState & 1)) {
				var selection = control.selection.index;
				if(selection == 0 && defaultInputType != "SJISDecCode") {
					Window.alert(module.localize("$$$/extendscript/iModeEmoji/messages/UseSJISDecCodeWarning=Shift-JIS decimal code supports only Basic pictograms. Expansion pictograms are applied automatically to Unicode hexadecimal code."));
					emojiSettingsState |= 1;
				}
			}
			drawEmojiNameForSettings();
			break;

		case "popupEmojiAppearance":
			var selection = control.selection.index;
			if(selection == 2 && emojiAppearance != "EmojiFont") {
				if(!(emojiSettingsState & 2)) {
					if(!Window.confirm(module.localize("$$$/extendscript/iModeEmoji/messages/UseEmojiFontConfirmation=To display i-mode compatible pictograms by using Emoji font, you need to install a Emoji font for NTT DoCoMo i-mode cellular phones which has been released by third parties in your system. Have you already installed the Emoji font?"))) {

						if(emojiAppearance == "MonoImages") {
							control.selection = 0;
						}
						else if(emojiAppearance == "ColorImages") {
							control.selection = 1;
						}
						emojiSettingsState |= 2;
					}
				}
			}
			emojiSettingsDialog.customEmojiFirst.refresh();
			emojiSettingsDialog.customEmojiSecond.refresh();
			emojiSettingsDialog.customEmojiThird.refresh();
			break;
	}
}

//---------------------------------------------------------
// drawControl - called when a custom control should be redrawn
//
// Description:
//   Use the draw object to create a custom visual representation
//   of the control.

function drawControl(control, draw) 
{

	switch(control.name) {

		case "customEmojis":
			drawEmojiListBox(control, draw);
			break;

		case "customEmojisPal":
			drawEmojiTable(control, draw);
			break;

		case "customEmojiFirst":
			drawEmojiButtonForSettings(draw, 0);
			break;

		case "customEmojiSecond":
			drawEmojiButtonForSettings(draw, 2);
			break;

		case "customEmojiThird":
			drawEmojiButtonForSettings(draw, 4);
			break;
	}
}

//---------------------------------------------------------
// mouseControl - called to respond to a mouse event over a control
//
// Parameters:
//   x and y are the position of the mouse pointer relative to the upper 
//   left corner of the control.
//   mode is one of the following values:
// 		0 - the left button has been pressed
// 		1 - the mouse has been moved with the left button pressed
// 		2 - the mouse button has been released
//
// Note: If this function is not defined, controlSignal is called
//   when the mouse button is released over a custom control.

function mouseControl(control, x, y, state) 
{

	if(control.name == "customEmojis") {
		mouseControlForEmojiListBox(control, x, y, state);
	}
	else if(control.name == "customEmojisPal") {
		mouseControlForEmojiTable(control, x, y, state);
	}
}

//---------------------------------------------------------
// translate -  implement the document translation
//
// Description:
//   Called when the translator detects a match
//   with its defined file types and one of its regular
//   expressions.

function translate(documentURL, siteURL, source)
{
	// &63647 through &63920 : &# representation doesn't work bug 479393
	// and a character range : two subsequent chars not in a new document!
	var pattern1 = /[\uE63E-\uE757]/g;
	var pattern2 = /&#636[4-9]\d;|&#63[7-8]\d\d;|&#639[0-1]\d;|&#63920;/g;
	var pattern3 = /&#x[Ee]63[EFef];|&#x[Ee]6[4-9A-Fa-f][0-9A-Fa-f];|&#x[Ee]7[0-5][0-9A-Fa-f];/g;

	var translation = "";

	// check for Shift-JIS binary range
	if(isValidEncodingForSJISBinary()) {
		while(true) {
			var match = pattern1.exec(source);
			if(match == null) {
				break;
			}
			var offset = match.index;
			match = match[0];

			// create translation string for unicode range
			// i.e., just display the character
			translation = createTranslationForSJISBinary(match);
			if(translation != null) {
				app.translator.translateSnippet(offset, match.length, 
					translation);
			}
		}
	}

	// check for decimal Shift-JIS tag range
	while(true) {
		var match = pattern2.exec(source);
		if(match == null) {
			break;
		}
		var offset = match.index;
		match = match[0];

		// create translation string for &#12345;
		// strip &# and ;
		translation = createTranslationForSJISDecCode(match);
		if(translation != null) {
			app.translator.translateSnippet(offset, match.length, translation);
		}
	}

	// check for hexadecimal Unicode tag range
	while(true) {
		var match = pattern3.exec(source);
		if(match == null) {
			break;
		}
		var offset = match.index;
		match = match[0];

		// create translation string for &#x1234;
		// strip &#x and ;
		translation = createTranslationForUCS2HexCode(match);
		if(translation != null) {
			app.translator.translateSnippet(offset, match.length, translation);
		}
	}
}

//---------------------------------------------------------
// dragControl - called when any changes for dragging object occurs
//
// Parameters:
//   JSXDragDropEvent dragEvent;
//

function dragControl(dragEvent)
{

	var handled = false;

	switch(dragEvent.state) {

		// dropped
		//
		case "drop":
			if(dragEvent.content.match("<emoji>") != null) {
				dragEvent.content = index2entity(0, defaultInputType);
			}
			handled = true;
			break;
	}

	dragEvent.handle = handled;
}

//--------------------------------------------------------------------
// add your own functions here
//--------------------------------------------------------------------

//
// set font and the font size for drawing Emoji custom listbox
//
function setFontForListItemText(draw)
{
	draw.textFont("ApplicationFont"); // does not work
//	draw.textFont("MS UI Gothic");
	draw.textSize(9);
}

//
// getListItemHeight
//
function getListItemHeight(control, draw)
{
	if(draw) {
		setFontForListItemText(draw);
		stringHeight = draw.stringHeight("Ay");
		var height;
		if(stringHeight <= emojiCellHeight) {
			height = emojiCellHeight + listItemVMargin * 2;
		}
		else {
			height = stringHeight + listItemVMargin * 2;
		}
	}

	return height;
}

//
// getListItemWidth
//
function getListItemWidth(control, draw)
{
	return (control.width - 2);
}

//
// initializeEmojiListBox
//
function initializeEmojiListBox(control, draw)
{
	// a custom control to display a emoji list.
	var control = emojiInspector.customEmojis;
	listItemWidth = getListItemWidth(control, draw);
	listItemHeight = getListItemHeight(control, draw);

	numListItems = Math.floor(control.height / listItemHeight);
	var modHeight = Math.round(control.height % listItemHeight);

	// scroll bar for the custom control
	control = emojiInspector.scrollEmojis;
	control.minvalue = 0;
	control.maxvalue = numEmojis - numListItems;
	control.stepdelta = 1;
	control.jumpdelta = numListItems;
	control.line = control.stepdelta;
	control.page = control.jumpdelta;
}

//
// drawEmojiListItem
//
function drawEmojiListItem(draw, itemPos, index, highlight)
{
	var x = 0;
	var y = itemPos * listItemHeight;
	var foreColor;
	var backColor;

	if(highlight) {
		foreColor = "#316AC5";
		backColor = "white";
	}
	else {
		foreColor = "white";
		backColor = "black";
	}

	// draw item background by using highlight color.
	draw.setColor(foreColor);
	draw.fillRect(x, y, listItemWidth, listItemHeight);

	x += listItemHMargin;
	drawEmojiButton(draw, index, useColorEmojis, "buttonUp", 
		x, y + listItemVMargin);

	draw.setColor(backColor);
	x += emojiCellWidth + offsetToString;
	y += (listItemHeight - stringHeight + 1) >> 1;
	draw.moveTo(x, y);
	var name = module.localize(index2name(index));
	setFontForListItemText(draw);
	draw.drawString(name);
}

//
// drawEmojiListBox
//
function drawEmojiListBox(control, draw)
{
	if(listItemHeight < 0) {
		initializeEmojiListBox(control, draw);
	}

	draw.setColor("white");
	draw.fillRect(0, 0, control.width, control.height);

	var offset = Math.floor(emojiInspector.scrollEmojis.value);
	listItemWidth = getListItemWidth(control, draw);
	for(i = 0; i < numListItems; i ++, offset ++) {
		if(offset == emojiIndex) {
			drawEmojiListItem(draw, i, offset, true);
		}
		else {
			drawEmojiListItem(draw, i, offset, false);
		}
	}
}

//
// isValidEmojiListItem
//
function isValidEmojiListItem(control, x, y)
{
	var itemPos = Math.floor(y / listItemHeight);
	if(itemPos < numListItems) {
		return itemPos;
	}
	return -1;
}

//
// selectEmojiListItem
//
function selectEmojiListItem(control, prevIndex, index)
{
	var startIndex = Math.floor(emojiInspector.scrollEmojis.value);
	var endIndex = startIndex + numListItems - 1;
	if(index >= startIndex && index <= endIndex) {
		if(prevIndex != index) {
			var draw = control.beginDraw();
			if(draw) {
//				listItemWidth = getListItemWidth(control, draw);
				if(prevIndex >= startIndex && prevIndex <= endIndex) {
					drawEmojiListItem(draw, (prevIndex - startIndex), 
						prevIndex, false);
				}
				drawEmojiListItem(draw, (index - startIndex), index, true);
			}
			control.endDraw();
		}
	}
	else {
		var maxValue = emojiInspector.scrollEmojis.maxvalue;
		if(index > maxValue) {
			emojiInspector.scrollEmojis.value = maxValue;
		}
		else {
			emojiInspector.scrollEmojis.value = index;
		}
	}
}

//
// getButtonImage
//
function getButtonImage(state)
{
	var buttonImage;
	if(state == "buttonUp") {
		if(emojiButtonUp == null) {
			emojiButtonUp = createPicture(module.folder.url + "images/" + 
					"buttonUp.gif");
		}
		buttonImage = emojiButtonUp;
	}
	else if(state == "buttonDown") {
		if(emojiButtonDown == null) {
			emojiButtonDown = createPicture(module.folder.url + "images/" + 
					"buttonDown.gif");
		}
		buttonImage = emojiButtonDown;
	}
	else { // state == "buttonNormal"
		if(emojiButtonNormal == null) {
			emojiButtonNormal = createPicture(module.folder.url + "images/" + 
					"buttonNormal.gif");
		}
		buttonImage = emojiButtonNormal;
	}

	return buttonImage;
}

//
// drawBlankButton
//
function drawBlankButton(draw, state, x, y)
{
	var buttonImage = getButtonImage(state);
	if(buttonImage != null) {
//		buttonImage.width = emojiCellWidth;
//		buttonImage.height = emojiCellHeight;
		buttonImage.draw(x, y);
	}
}

//
// drawEmojiButton
//
function drawEmojiButton(draw, index, color, state, x, y)
{
	drawBlankButton(draw, state, x, y);

	var image = index2image(index, color);
	if(image != null) {
//		image.width = emojiObjectWidth;
//		image.height = emojiObjectHeight;
		var dx = (emojiCellWidth - image.width + 1) >> 1;
		var dy = (emojiCellHeight - image.height + 1) >> 1;

		if(state == "buttonDown") {
			dx ++;
			dy ++;
		}
		image.draw(x + dx, y + dy);
	}
}

//
// drawEmojiButtonByGroupPos
//
function drawEmojiButtonByGroupPos(draw, groupPos, color, state)
{
	var xCell = Math.round(groupPos % numCellColumns);
	var yCell = Math.floor(groupPos / numCellColumns);

	var emojiGroup = groupIndex2group(emojiGroupIndex);
	if(emojiGroup != null) {
		var emojiRefIndex = groupPos2index(emojiGroup, groupPos);
		drawEmojiButton(draw, emojiRefIndex, color,
			state, xCell * emojiCellWidth, yCell * emojiCellHeight)
	}
}

//
// selectEmojiButton
//
function selectEmojiButton(control, lastGroupPos, groupPos)
{
	var draw = control.beginDraw();
	if(draw) {
		if(lastGroupPos >= 0 && groupPos != lastGroupPos) {
			drawEmojiButtonByGroupPos(draw, lastGroupPos, useColorEmojis, 
				"buttonNormal");
		}
		drawEmojiButtonByGroupPos(draw, groupPos, useColorEmojis, 
			"buttonDown");
	}
	control.endDraw();
}

//
// blurEmojiButton
//
function blurEmojiButton(control, groupPos)
{
	var draw = control.beginDraw();
	if(draw) {
		drawEmojiButtonByGroupPos(draw, groupPos, useColorEmojis, 
			"buttonNormal");
	}
	control.endDraw();
}

//
// focusEmojiButton
//
function focusEmojiButton(control, lastGroupPos, groupPos)
{
	var draw = control.beginDraw();
	if(draw) {
		if(lastGroupPos >= 0 && groupPos != lastGroupPos) {
			drawEmojiButtonByGroupPos(draw, lastGroupPos, useColorEmojis, 
				"buttonNormal");
		}
		drawEmojiButtonByGroupPos(draw, groupPos, useColorEmojis, 
			"buttonUp");
	}
	control.endDraw();
}

//
// isValidEmojiCellPos
//
function isValidEmojiCellPos(control, x, y)
{

	var emojiGroup = groupIndex2group(emojiGroupIndex);
	var numEmojisInGroup = emojiGroup.length - 1;
	var modColumns = Math.round(numEmojisInGroup % numCellColumns);
	var numLines = Math.floor(numEmojisInGroup / numCellColumns);

	var xCell = Math.floor(x / emojiCellWidth);
	var yCell = Math.floor(y / emojiCellHeight);

	if(!(yCell == numLines && xCell > modColumns) && !(yCell > numLines)) {
		return(yCell * numCellColumns + xCell);
	}
	return -1;
}

//
// drawEmojiButtonForSettings
//
function drawEmojiButtonForSettings(draw, index)
{
	drawBlankButton(draw, "buttonUp", 0, 0);

	var color;
	var imageid;

	// If the selection is "Color", draw controls by using color images
	var selection = emojiSettingsDialog.popupEmojiAppearance.selection.index;
	if(selection < 0) {
		selection = (emojiAppearance == "ColorImages")? 1 : 0;
	}
	if(selection == 1) {
		color = true;
		imageid = index + (numEmojiExamples >> 1);
	}
	else {
		color = false;
		imageid = index;
	}

	if(imageid < numEmojiExamples && !emojiExampleImages[imageid]) {
		emojiExampleImages[imageid] = 
			createPicture(index2imagepath(index, color));
	}

	var image = emojiExampleImages[imageid];
	if(image != null) {
//		image.width = emojiObjectWidth;
//		image.height = emojiObjectHeight;
		var dx = (emojiCellWidth - image.width + 1) >> 1;
		var dy = (emojiCellHeight - image.height + 1) >> 1;
		image.draw(dx, dy);
	}
}

//
// getAllEmojisImage
//
function getAllEmojisImage()
{
	// If the selection is "Color", draw controls by using color images
	if(emojiAppearance == "ColorImages") {
		return createPicture(module.folder.url + "images/" + 
					"all_emojis_color.gif");
	}
	else {
		return createPicture(module.folder.url + "images/" + 
					"all_emojis_bw.gif");
	}
}

//
// draw whole emoji table
//
function drawEmojiTable(control, draw)
{
	draw.setColor("white");
	draw.fillRect(0, 0, control.width, control.height);

	if(emojiGroupIndex == 0) {
		if(allEmojis == null) {
			allEmojis = getAllEmojisImage();
		}
		allEmojis.draw(0, 0);
	}
	else {
		var emojiGroup = groupIndex2group(emojiGroupIndex);
		if(emojiGroup != null) {
			for(var i = 0; i < emojiGroup.length; i ++) {

				var x = Math.round(i % numCellColumns);
				var y = Math.floor(i / numCellColumns);
				var emojiRefIndex = groupPos2index(emojiGroup, i);
				drawEmojiButton(draw, emojiRefIndex, useColorEmojis,
					"buttonNormal", x * emojiCellWidth, y * emojiCellHeight)
			}
		}
	}
}

//
// mouseControlForEmojiListBox
//
function mouseControlForEmojiListBox(control, x, y, state) 
{
	switch(state) {
		case 0:
			var itemPos = isValidEmojiListItem(control, x, y);
			if(itemPos >= 0) {
				var startIndex = Math.floor(emojiInspector.scrollEmojis.value);
				var index = startIndex + itemPos;
				if(emojiIndex != index) {
					selectEmojiListItem(control, emojiIndex, index);
					emojiIndex = index;
					drawEmojiName(emojiInspector.staticEmojiCurrent, inputType,
						emojiIndex);
					setEmojiEntity(emojiIndex);
				}
			}
			break;
	}
}

//
// mouseControlForEmojiTable
//
function mouseControlForEmojiTable(control, x, y, state) 
{

	switch(state) {

		case 0:
			var groupPos = isValidEmojiCellPos(control, x, y);
			if(groupPos >= 0) {
				var emojiGroup = groupIndex2group(emojiGroupIndex);
				var emojiRefIndex = groupPos2index(emojiGroup, groupPos);

				selectEmojiButton(control, lastGroupPos, groupPos);
				lastGroupPos = groupPos;

				if(control.awaitDrag()) {
					var dragEvent = new JSXDragDropEvent;
					dragEvent.flaver = "html";
					dragEvent.encoding = "shift_jis";
					dragEvent.content = index2entity(emojiRefIndex, 
						inputTypePal);
					var image = index2image(emojiRefIndex, useColorEmojis);
					var didDrop = control.dispatchEvent(dragEvent, image);
				}
				else if(document != null && document.view == "layout") {
					if(document.selection.element != null) {
						var textArea = document.selection.element.textArea;
						if(textArea != null) {
							textArea.insertHTML(index2entity(emojiRefIndex, 
								inputTypePal));
							if(!textArea.selectionLength) {
								textArea.selectionBegin ++;
							}
						}
					}
				}
			}
			break;

		case 2:
			if(lastGroupPos >= 0) {
				blurEmojiButton(control, lastGroupPos);
				emojiPalette.staticEmojiCurrentPal.value = "";
				lastGroupPos = -1;
			}
			break;

		case 3:
			var groupPos = isValidEmojiCellPos(control, x, y);
			if(groupPos >= 0) {
				focusEmojiButton(control, lastGroupPos, groupPos);
				lastGroupPos = groupPos;

				var emojiGroup = groupIndex2group(emojiGroupIndex);
				drawEmojiName(emojiPalette.staticEmojiCurrentPal, 
					inputTypePal, groupPos2index(emojiGroup, groupPos));
			}
			else {
				if(lastGroupPos >= 0) {
					blurEmojiButton(control, lastGroupPos);
					emojiPalette.staticEmojiCurrentPal.value = "";
					lastGroupPos = -1;
				}
			}
			break;
	}
}

//
// get a group array from group index
//
function groupIndex2group(groupIndex)
{
	if(groupIndex == 0) {
		return(emojiAll);
	}
	else if(groupIndex < numEmojiGroups) {
		return(eval("emojiGroup" + groupIndex));
	}
	return null;
}

//
// get array position in the group from emoji index
//
function index2groupPos(group, index)
{
	if(group == emojiAll) {
		return index;
	}
	else {
		for(var i = 0; i < group.length; i ++) {
			if(group[i] == index) {
				return i;
			}
		}
		return -1;
	}
}

//
// get emoji index from array position in the group
//
function groupPos2index(group, groupPos)
{
	if(groupPos < group.length) {
		if(group == emojiAll) {
			return groupPos;
		}
		return group[groupPos];
	}
	return -1;
}

//
// set emoji name in the inspector
//
function setEmojiName(control, draw, index) 
{
	var entity = index2tag(index);
	var name = module.localize(index2name(index));
	if(isOnWindows()) {
		if(name.indexOf("&", 0) != -1) {
			var str = name.split("&");
			if(str[0] || str[1]) {
				name = str[0] + "&&" + str[1];
			}
		}
		name += " : &" + entity;
	}
	else {
		name += " : " + entity;
	}
	emojiInspector.staticEmojiCurrent.value = name;
}

//
// set emoji entity
//
function setEmojiEntity(index)
{
	var entity = index2entity(index, inputType);
	if(entity != null) {
		app.translator.rewriteSnippet(entity, 
			module.localize("$$$/extendscript/iModeEmoji/commons/ChangeEmoji=Change i-mode Emoji"));
	}
}

// pass in name to see if it's valid
// returns index #
// else returns -1
function name2index(name) 
{
	for(var i = 0; i < emojiNames.length; i ++) {
		if(emojiNames[i].toLowerCase() == name.toLowerCase()) {
			return i;
		}
	}
	return -1;
}

// pass in index to see if it's valid
// returns Emoji name
// else returns null
function index2name(index) 
{
	if(emojiNames[index]) {
		return emojiNames[index];
	}
	return null;
}

// pass in index to see if it's valid
// returns Emoji character
// else returns null
function index2char(index) 
{
	if(emojiChars[index]) {
		return unescape(emojiChars[index]);
	}
	return null;
}

// pass in Emoji character to see if it's valid
// returns index 
// else returns -1
function char2index(character)
{
	for(var i = 0; i < emojiChars.length; i ++) {
		if(unescape(emojiChars[i]) == character) {
			return i;
		}
	}
	return -1;
}

// pass in name
// return emoji character
// else return null
function name2char(name) 
{
	var index = name2index(name);
	if(index >= 0) {
		return index2char(index);
	}
	return null;
}

//
// index2imagepathEx
//
function index2imagepathEx(index, color, forTranslator)
{
	index ++;
	var imageid = String(index);
	var padding = "000"
	var filename = padding.substr(0, 3 - imageid.length) + imageid;
	if(color) {
		filename = filename + "c";
	}
	if(forTranslator) {
		return getModuleFolderUrl(document) + "images/" + filename + ".gif";
	}
	else {
		return module.folder.url + "images/" + filename + ".gif";
	}
}

//
// index2imagepath
//
function index2imagepath(index, color)
{
	return index2imagepathEx(index, color, false);
}

// pass in index
// return emoji image name
// else return null
function index2image(index, color)
{
	if(!emojiImages[index]) {	// Check for global value
		emojiImages[index] = createPicture(index2imagepath(index, color));
	}
	return emojiImages[index];
}

// pass in name
// return e image
// else return null
function name2image(name) 
{
	var index = name2index(name);
	if(index >= 0) {
		return(index2image(index, false));
	}
	return null;
}

// pass in index to see if it's valid
// returns Emoji decimal tag
// else returns null
function index2tag(index) 
{
	return index2tagSJIS(index);
}

//
// index2tagSJIS
//
function index2tagSJIS(index) 
{
	var code = emojiAll[index];
	if(code) {
		return("&#" + code + ";");
	}
	return null;
}

// pass in index to see if it's valid
// returns Emoji hexadecimal UCS2 tag
// else returns null
function index2tagUCS2(index) 
{
	var code = escape(emojiChars[index]);
	code = code.substr(2, 4);
	if(code) {
		return("&#x" + code + ";");
	}
	return null;
}

//
// index2binary
//
function index2binary(index) 
{
	var code = emojiAll[index];
	if(code) {
		var entity = (code.toString(16)).toUpperCase();
		entity += "h (" + module.localize("$$$/extendscript/iModeEmoji/commons/Binary=Binary") + ")";
		return entity;
	}
	return null;
}

// pass in index #
// returns entity html
// else returns null
function index2entity(index, inputtype)
{
	if(inputtype == "SJISBinary" && isValidEncodingForSJISBinary()) {
		return index2char(index);
	}
	else if(inputtype == "SJISDecCode" && index < numBasicEmojis) {
		return index2tagSJIS(index);
	}
	else { // inputtype == "UCS2HexCode"
		return index2tagUCS2(index);
	}
	return null;
}

// pass in index to see if it's valid
// returns Emoji decimal code
// else returns -1
function index2code(index)
{
	if(index >= 0) {
		return emojiAll[index];
	}
	return -1;
}

// pass in Emoji decimal code to see if it's valid
// returns index
// else returns -1
function code2index(code)
{
	for(var i = 0; i < emojiAll.length; i ++) {
		if(emojiAll[i] == code) {
			return i;
		}
	}
	return -1;
}

// pass in Emoji hexadecimal code to see if it's valid
// returns index
// else returns -1
function unicode2index(code)
{
	code = unescape("%u" + code);
	for(var i = 0; i < emojiChars.length; i ++) {
		if(emojiChars[i] == code) {
			return i;
		}
	}
	return -1;
}

//
// check whether current system is Windows platform
//
function isOnWindows()
{
	if(onWindows < 0) {
		if(app.osVersion.indexOf("Windows") >= 0) {
			onWindows = true;
		}
		else {
			onWindows = false;
		}
	}
	return onWindows;
}

//
// check whether we can use emoji gaiji font
//
function isEnabledEmojiFont()
{
	// "Use Emoji GIF images" menu is valid only on Windows.
	return isOnWindows();
}

//
// check whether the document has appropriate encoding or not
//
function isValidEncodingForSJISBinary()
{
	var pattern = /shift[-_]jis|x-sjis/i;

	if(document != null) {
		var encoding = document.encoding;
		if(encoding.match(pattern) != null) {
			return true;
		}
	}
	return false;
}

//
// create translation string for substitution of entity
//
function createTranslation(index)
{
	var translation = "";

	if(!useEmojiFont) {
		// make a path to the emoji image even if image object is null
		var srcAttr = index2imagepathEx(index, useColorEmojis, true);
		translation = "<img src=\"" + srcAttr + "\" height=\"" +
			emojiObjectHeight + "\" width=\"" + emojiObjectWidth + "\">";
	}
	else {
		var emojiChar = index2char(index);
		if(emojiChar != null) {
			translation = "<font face=\"" + module.localize("$$$/extendscript/iModeEmoji/commons/FontName=MS Gothic") + "\">" + emojiChar + "</font>";
		}
	}
	return translation;
}

//
// create translation Shift-JIS binary for substitution of entity
//
function createTranslationForSJISBinary(match)
{
	// create translation string for unicode range
	// i.e., just display the character
	var character = match;
	return createTranslation(char2index(character));
}

//
// create translation Shift-JIS decimal string for substitution of entity
//
function createTranslationForSJISDecCode(match)
{
	// create translation string for &#12345;
	// strip &# and ;
	var entity = match.substr(2, 5);
	return createTranslation(code2index(entity));
}

//
// create translation Unicode hexadecimal string for substitution of entity
//
function createTranslationForUCS2HexCode(match)
{
	// create translation string for &#x1234;
	// strip &#x and ;
	var entity = match.substr(3, 4);
	return createTranslation(unicode2index(entity));
}

//
// set emoji name in the inspector
//
function drawEmojiName(control, inputtype, index)
{
	var name = module.localize(index2name(index));
	if(isOnWindows()) {
		if(name.indexOf("&", 0) != -1) {
			var str = name.split("&");
			if(str[0] || str[1]) {
				name = str[0] + "&&" + str[1];
			}
		}
	}

	var entity;
	if(inputtype == "SJISBinary" && isValidEncodingForSJISBinary()) {
		entity = index2binary(index);
	}
	else if(inputtype == "SJISDecCode" && index < numBasicEmojis) {
		entity = index2tagSJIS(index);
		if(isOnWindows()) {
			entity = "&" + entity;
		}
	}
	else { // inputtype == "UCS2HexCode"
		entity = index2tagUCS2(index);
		if(isOnWindows()) {
			entity = "&" + entity;
		}
	}
	control.value = name + " : " + entity;
}

//
// drawEmojiNameForSettings
//
function drawEmojiNameForSettings()
{
	var selection = emojiSettingsDialog.popupDefaultInputType.selection.index;
	var control = emojiSettingsDialog.staticInputTypeExample;
	if(selection == 0) {
		drawEmojiName(control, "SJISDecCode", 0);
	}
	else if(selection == 1) {
		drawEmojiName(control, "SJISBinary", 0);
	}
	else { // selection == 2
		drawEmojiName(control, "UCS2HexCode", 0);
	}

	return true;
}

//
// initializeEmojiSettings
//
function initializeEmojiSettings(eventObject)
{

	if(defaultInputType == "SJISDecCode") {
		emojiSettingsDialog.popupDefaultInputType.selection = 0;
	}
	else if(defaultInputType == "SJISBinary") {
		emojiSettingsDialog.popupDefaultInputType.selection = 1;
	}
	else { // defaultInputType == "UCS2HexCode"
		emojiSettingsDialog.popupDefaultInputType.selection = 2;
	}

	if(emojiAppearance == "MonoImages") {
		emojiSettingsDialog.popupEmojiAppearance.selection = 0;
	}
	else if(emojiAppearance == "ColorImages") {
		emojiSettingsDialog.popupEmojiAppearance.selection = 1;
	}
	else { // emojiAppearance == "EmojiFont"
		emojiSettingsDialog.popupEmojiAppearance.selection = 2;
	}

	emojiSettingsDialog.customEmojiFirst.refresh();
	emojiSettingsDialog.customEmojiSecond.refresh();
	emojiSettingsDialog.customEmojiThird.refresh();

	drawEmojiNameForSettings();

	return true;
}

//
// isChangedEmojiSettings
//
function isChangedEmojiSettings()
{

	var prevDefaultInputType = defaultInputType;
	var selection = emojiSettingsDialog.popupDefaultInputType.selection.index;
	if(selection == 0) {
		defaultInputType = "SJISDecCode";
	}
	else if(selection == 1) {
		defaultInputType = "SJISBinary";
	}
	else { // selection == 2
		defaultInputType = "UCS2HexCode";
	}
	inputTypePal = defaultInputType;

	useColorEmojis = false;
	useEmojiFont = false;
	var prevEmojiAppearance = emojiAppearance;
	selection = emojiSettingsDialog.popupEmojiAppearance.selection.index;
	if(selection == 0) {
		emojiAppearance = "MonoImages";
	}
	else if(selection == 1) {
		emojiAppearance = "ColorImages";
		useColorEmojis = true;
	}
	else { // selection == 2
		emojiAppearance = "EmojiFont";
		useEmojiFont = true;
	}

	var result = 0;
	if(defaultInputType != prevDefaultInputType) {
		result |= 1;
	}
	if(emojiAppearance != prevEmojiAppearance) {
		result |= 2;
	}
	return result;
}

//
// updateEmojiSettings
//
function updateEmojiSettings(result)
{

	// Save extension setting information to a file
	if(result) {
		saveConfigFile();
	}

	// default input method was changed.
	if(result & 1) {
		if(inputTypePal == "SJISDecCode") {
			emojiPalette.popupInputTypePal.selection = 0;
		}
		else if(inputTypePal == "SJISBinary") {
			emojiPalette.popupInputTypePal.selection = 1;
		}
		else { // inputTypePal == "UCS2HexCode"
			emojiPalette.popupInputTypePal.selection = 2;
		}
	}

	// emoji appearance was changed.
	if(result & 2) {
		if(allEmojis) {
			disposePicture(allEmojis);
			allEmojis = null;
		}
		for(var i = 0; i < emojiImages.length; i ++) {
			if(emojiImages[i]) {
				// Do not dispose some images for sharing with Setting dialog.
				if(i > 4) {
					disposePicture(emojiImages[i]);
				}
				emojiImages[i] = null;
			}
		}

		if(emojiInspector.visible) {
			emojiInspector.customEmojis.refresh();
		}
		if(emojiPalette.visible) {
			emojiPalette.customEmojisPal.refresh();
			lastGroupPos = -1;
		}

		if(document != null) {
			document.reparse();
		}
	}
}

//
// read emoji setting information from a configuration file
//
function loadConfigFile()
{
	// set current input type as the initialize setting
	defaultInputType = "UCS2HexCode";
	emojiAppearance = "MonoImages";
	useColorEmojis = false;
	useEmojiFont = false;

	// read defaultInputType setting
	if(prefs.iModeEmoji_defaultInputType != undefined) {

		var defaultInputTypePref = prefs.iModeEmoji_defaultInputType;
		if(defaultInputTypePref == "SJISDecCode" ||
			defaultInputTypePref == "SJISBinary") {

			// set defaultInputType as the suitable value
			defaultInputType = defaultInputTypePref;
		}
	}
	// set current input type as the initialize setting
	inputType = inputTypePal = defaultInputType;

	// read emojiAppearance setting
	if(prefs.iModeEmoji_emojiAppearance != undefined) {

		var emojiAppearancePref = prefs.iModeEmoji_emojiAppearance;
		if(emojiAppearancePref == "ColorImages") {

			// set emojiAppearance as the suitable value
			emojiAppearance = emojiAppearancePref;
			useColorEmojis = true;
		}
		else if(emojiAppearancePref == "EmojiFont" && isEnabledEmojiFont()) {

			// set emojiAppearance as the suitable value
			emojiAppearance = emojiAppearancePref;
			useEmojiFont = true;
		}
	}

	return true;
}

//
// write emoji setting information to a configuration file
//
function saveConfigFile()
{
	// write defaultInputType and emojiAppearance settings
	prefs.iModeEmoji_defaultInputType = defaultInputType;
	prefs.iModeEmoji_emojiAppearance = emojiAppearance;
	prefs.flush();

	return true;
}

//
// initializeEmojiPalette
//
function initializeEmojiPalette(eventObject)
{
	if(inputTypePal == "SJISDecCode") {
		emojiPalette.popupInputTypePal.selection = 0;
	}
	else if(inputTypePal == "SJISBinary") {
		emojiPalette.popupInputTypePal.selection = 1;
	}
	else { // inputTypePal == "UCS2HexCode"
		emojiPalette.popupInputTypePal.selection = 2;
	}
	emojiPalette.popupEmojiGroupsPal.selection = emojiGroupIndex;
}

//
// getUrlHandling
//
function getUrlHandling(doc)
{
	if(doc.type != "site") {
		var siteDoc = doc.ref.siteDoc;
		if(siteDoc != null) {
			return siteDoc.website.settings.urlHandling;
		}
	}
	return settings.urlHandling;
}

//
// get the module folder path for translater object
//
function getModuleFolderUrl(doc)
{
	var urlHandling = getUrlHandling(doc);
	var urlEncode = (urlHandling.hexEncode || urlHandling.utf8Encode)? 
			true : false;

	if(urlEncode != lastUrlEncode) {
		if(urlEncode) {
			moduleFolderUrl = module.folder.url;
		}
		else {
			moduleFolderUrl = decodeURI(module.folder.url);
		}
		lastUrlEncode = urlEncode;
	}

	return(moduleFolderUrl);
}

//-->
</script>
		<hr />
		<p><b>User Interface Tags:</b></p>
		<p>These tags are commented out to avoid affecting the user interface.</p>
		<p><b>Image</b> Define images here. These are referenced by the picture attribute of the jsxpaletteentry and jsxpalettegroup tags.</p>
		<img src="images/imode.gif" name="paletteGroupIcon" />
		<img src="images/emoji_l.gif" name="emojiPaletteIcon_l" />
		<img src="images/emoji_h.gif" name="emojiPaletteIcon_h" /> 
		<p><b>Custom Tags</b> Define custom tags attributes in the jsxelement tag.</p>
		<p><b>Translator Tag</b></p>
		<jsxtranslator blend="no" classid="emoji" direction="twoway">
			<param name="extension" value="html" />
			<param name="extension" value="htm" />
			<param name="expression" value="&#636[4-9]\d;|&#63[7-8]\d\d;|&#639[0-1]\d;|&#63920;" />
			<param name="expression" value="&#x[Ee]63[EFef];|&#x[Ee]6[4-9A-Fa-f][0-9A-Fa-f];|&#x[Ee]7[0-5][0-9A-Fa-f];" />
			<param name="expression" value="[\uE63E-\uE757]" />
		</jsxtranslator>
		<p><b>Palette Group</b> Define a new tab for the Object Palette, or add to an existing tab.</p>
		<jsxpalettegroup display="$$$/extendscript/iModeEmoji/objectPalette/GroupName=Basic" name="Basic" order="3000" picture="paletteGroupIcon" taborder="3000">
			<jsxpaletteentry classid="emoji" display="$$$/extendscript/iModeEmoji/commons/Name=i-mode Emoji" encoding="shift_jis" picture="emojiPaletteIcon_l" hilitepicture="emojiPaletteIcon_h">
				<emoji></emoji>
			</jsxpaletteentry>
		</jsxpalettegroup>
		<p><b>Inspectors</b> Define Inspectors for custom tags</p>
		<jsxinspector classid="emoji" height="380" minwidth="250" minheight="380" name="emojiInspector" title="$$$/extendscript/iModeEmoji/commons/Name=i-mode Emoji" width="250">
			<jsxcontrol halign="scale" height="312" name="frame" posx="6" posy="31" type="frame" value="" width="235"></jsxcontrol>
			<jsxcontrol halign="left" height="19" name="static" posx="8" posy="10" type="static" value="$$$/extendscript/iModeEmoji/emojiInspector/Method=Method" width="50"></jsxcontrol>
			<jsxcontrol halign="scale" height="19" name="popupInputType" posx="62" posy="7" type="popup" value="$$$/extendscript/iModeEmoji/methods/popupInputType=Shift-JIS Decimal Code,Shift-JIS Binary,Unicode Hexadecimal Code" width="175"></jsxcontrol>
			<jsxcontrol halign="scale" height="308" name="customEmojis" posx="8" posy="33" type="custom" width="212"></jsxcontrol>
			<jsxcontrol halign="right" height="308" name="scrollEmojis" posx="220" posy="33" type="scrollbar" width="19">
				<jsxparam name="min" value="0" /><jsxparam name="max" value="251" /><jsxparam name="line" value="1" /><jsxparam name="page" value="10" />
			</jsxcontrol>
			 
			<jsxcontrol halign="scale" height="19" name="staticEmojiCurrent" posx="8" posy="348" type="static" value="" width="230"></jsxcontrol>
			<jsxlayoutline direction="false" x="61" y="5" length="30" />
		</jsxinspector>
		<p><b>Dialogs</b> Dialog Definitions.</p>
		<jsxdialog height="140" name="emojiSettingsDialog" title="$$$/extendscript/iModeEmoji/emojiSettingsDialog/Title=i-mode Emoji Settings" width="445">
			<jsxcontrol height="16" name="static" posx="15" posy="20" type="static" value="$$$/extendscript/iModeEmoji/emojiSettingsDialog/DefaultMethod=Default Method" width="105"></jsxcontrol>
			<jsxcontrol height="19" name="popupDefaultInputType" posx="125" posy="15" type="popup" value="$$$/extendscript/iModeEmoji/methods/popupDefaultInputType=Shift-JIS Decimal Code,Shift-JIS Binary,Unicode Hexadecimal Code" width="205"></jsxcontrol>
			<jsxcontrol height="15" name="static" posx="15" posy="45" type="static" value="$$$/extendscript/iModeEmoji/emojiSettingsDialog/EmojiAppearance=Emoji Appearance" width="105"></jsxcontrol>
			<jsxcontrol height="19" name="popupEmojiAppearance" posx="125" posy="40" type="popup" value="$$$/extendscript/iModeEmoji/emojiAppearances/popupEmojiAppearance=Monochrome,Color" width="205"></jsxcontrol>
			<jsxcontrol height="21" name="dialogok" posx="350" posy="12" type="button" value="$$$/extendscript/iModeEmoji/commons/OK=OK" width="80"></jsxcontrol>
			<jsxcontrol height="21" name="dialogcancel" posx="350" posy="41" type="button" value="$$$/extendscript/iModeEmoji/commons/Cancel=Cancel" width="80"></jsxcontrol>
			<jsxcontrol height="15" name="staticInputTypeExample" posx="70" posy="95" type="static" value="" width="125"></jsxcontrol>
			<jsxcontrol height="18" name="customEmojiFirst" posx="200" posy="90" type="custom" width="18"></jsxcontrol>
			<jsxcontrol height="18" name="customEmojiSecond" posx="225" posy="90" type="custom" width="18"></jsxcontrol>
			<jsxcontrol height="18" name="customEmojiThird" posx="250" posy="90" type="custom" width="18"></jsxcontrol>
			<jsxcontrol height="50" name="frame" posx="15" posy="75" type="frame" value="" width="315"></jsxcontrol>
		</jsxdialog>
		<p><b>Palettes</b> Define Palettes.</p>
		<jsxpalette height="415" name="emojiPalette" order="9200" title="$$$/extendscript/iModeEmoji/commons/Name=i-mode Emoji" width="270" minwidth="270" minheight="415">
			<jsxcontrol halign="left" height="19" name="static" posx="8" posy="10" type="static" value="$$$/extendscript/iModeEmoji/emojiPalette/Method=Method" width="50"></jsxcontrol>
			<jsxcontrol halign="scale" height="19" name="popupInputTypePal" posx="62" posy="7" type="popup" value="$$$/extendscript/iModeEmoji/methods/popupInputTypePal=Shift-JIS Decimal Code,Shift-JIS Binary,Unicode Hexadecimal Code" width="175"></jsxcontrol>
			<jsxcontrol halign="left" height="19" name="static" posx="8" posy="34" type="static" value="$$$/extendscript/iModeEmoji/emojiPalette/Category=Category" width="50"></jsxcontrol>
			<jsxcontrol halign="scale" height="19" name="popupEmojiGroupsPal" posx="62" posy="30" type="popup" value="$$$/extendscript/iModeEmoji/categories/Category=All Pictograms,Weather,Constellations,Transports,Building and Shops,Foods,Entertainments,Sports,Accessories,Arrows and Symbols,Numbers,Animals and Flowers,Emotions,Mobile Services,Basic Pictograms,Expansion Pictograms" width="175"></jsxcontrol>
			<jsxcontrol height="324" name="customEmojisPal" posx="8" posy="57" type="custom" width="252"></jsxcontrol>
			<jsxcontrol halign="scale" height="19" name="staticEmojiCurrentPal" posx="8" posy="390" type="static" value="" width="230"></jsxcontrol>
			<jsxlayoutline direction="false" x="61" y="5" length="50" />
			<jsxcontrol height="328" name="frame" posx="6" posy="55" type="frame" value="" width="256"></jsxcontrol>
		</jsxpalette>

		<p></p>
	</body>

</html>