$(function()
{
	var table = [{conv:[{f:"Qwerty"},{f:"__qwe",t:"qwe"}],text:"上段左から順に <kbd>Q</kbd><kbd>W</kbd><kbd>E</kbd><kbd>R</kbd><kbd>T</kbd><kbd>Y</kbd> と並ぶキーボード配列。<br />言語により若干の差はあれど基本的には世界標準配列である。<br />要は普通のキーボードの英数字の並び。<br />日本語入力に使う場合にはローマ字入力配列として使う。",subject:"Qwerty（クワーティ）配列"},{conv:[{f:"JIS かな"},{f:"JIS 配列"},{f:"jis-kana"},{f:"X6002"}],text:"JIS X 6002 に基づいているかな配列。<br />普通の日本語キーボードならほぼ間違いなくこの配列でかなが印字されている。標準のかな打ちの配列。<br />単にかな打ち、かな入力と言った場合もこの配列を指している場合が多い。",subject:"JISかな"},{conv:[{f:"新 JIS"},{f:"X6004"}],text:"JIS 配列で指摘された問題点を改善し、それに置き換わる標準を目指す配列として考案され、 JIS X 6004 として規格化されたかな配列。<br />JIS 配列と異なりホームポジション周り 3 段のみを使う。<br />普及しなかったために規格は現在では廃止されているが、後の TRON、__花、__月などの新配列の誕生につながっている。"},{conv:[{f:"__月",t:"月"},{f:"月配列"}],text:"花配列の影響もあり、新 JIS を中指プレフィクスシフト化して生まれたかな配列。<br />出現頻度の高いかなは 1 打で、低いかなは 2 打で打つように設計されている。最上段を除く 33 キーにのみマップしているため JIS かなと比較すると打鍵数は増えるが、ローマ字入力よりは省打鍵であり、かつ JIS かなよりはるかに打鍵しやすくなっている。<br />また有志の手により開発されたものなので、私家版がいくつも存在する。",subject:"月配列"},{conv:[{f:"__花",t:"花"},{f:"花配列"}],text:"新 JIS に影響を受け 33 キーを採用、中指プレフィクスシフトを使うかな配列。<br />機械的な点数計算により配列が決定されている。しかし機械的に求めたがゆえに実際に使ってみると下段の使用率が高め、打ちにくい連続打鍵も意外と多い、などの欠点もみられる。",subject:"花配列"},{conv:[{f:"NICOLA"}],text:"親指シフトに対し上位互換性をもつかな配列。現在では単に「親指シフト」といってこの配列を差すこともある（厳密には違う）。<br />実は日本で 3 番目に普及している配列らしい。<br />本来は専用キーボード（親指シフトキーボード）を使う配列だが、ソフトウェアシミュレーションにより普通のキーボード上でも使うことができる。",subject:"NICOLA/日本語入力コンソーシアム配列"},{conv:[{f:"TRON"}],text:"親指 2 シフトを採用したかな配列。<br />BTRONプロジェクトの中で教育用として発表された。<br />専用キーボードが必要で、完全なソフトウェアシミュレーションは現状できないはず。",subject:"TRON配列"},{conv:[{f:"親指シフト"}],text:"親指部分に独自のシフトキーを設け、通常キーとの組み合わせで単打鍵にかな一文字が対応するようにした富士通開発の配列、およびその発想を軸とした入力・配列一般。<br />かな配列系だが一癖あるので「親指シフト系配列」としてまとめられることもある。<br />ワープロ時代に OASYS シリーズに採用され普及した。配列としては上位互換として NICOLA があり、その愛用者は今でも割といる印象。"},{conv:[{f:"DvorakJP"}],text:"ローマ字入力用に Dvorak 配列を拡張したキーボード配列。<br />カ行を全て C 打ちできるほか、拗音拡張により <kbd>H</kbd> と <kbd>N</kbd> が <kbd>Y</kbd> キーの代替として使える。また二重母音・撥音拡張を設け、省打鍵入力化も図られている。"},{conv:[{f:"Dvorak"},{f:"__dvo",t:"dvo"}],text:"dvorak 博士が開発した英文の高速打鍵に特化したキーボード配列。<br />左手ホームポジション左から順に <kbd>A</kbd><kbd>O</kbd><kbd>E</kbd><kbd>U</kbd><kbd>I</kbd> と母音が並ぶのが特徴。<br />日本語を打つためにローマ字入力配列として使うのには、左手への負担が大きくあまり適さない。<br />……という気がする。",subject:"Dvorak（ドヴォラック）配列"},{conv:[{f:"AZIK"}],text:"Qwerty 配列に拡張を施し、日本語のローマ字入力時に快適になるようにしたキーボード配列。",subject:"AZIK配列"},{conv:[{f:"__ACT",t:"ACT"},{f:"ACT 配列"}],text:"Dvorak 配列を元に AZIK 風の拡張を施し、日本語入力に特化させたキーボード配列。<br />ローマ字と無関係な文字が出力される拡張も入っているとはいえ、基本的にはローマ字入力配列である。<br />細かい拡張まで含めるとかなり仕様が肥大化しており、タイパーが高速打鍵のために使いこなすのは難しい。<br />……という個人的な印象がある。",subject:"ACT配列"},{conv:[{f:"__sky",t:"sky"},{f:"SKY 配列"}],text:"日本語入力用のローマ字入力キーボード配列。<br />（アルファベットが揃っていないのでかな配列だ、という意見も）<br />基本セットではローマ字入力に必要なアルファベット群だけを備えるためキー数が少ない。<br />省打鍵入力・左右交互打鍵入力なども設計思想に入っているが、基本セットのみでは「ヴ」が打てないなど欠点もあるため、いくつもの拡張配列（SKY++,SKY#, 宙配列等）が考案された。",subject:"SKY配列"},{conv:[{f:"__oea",t:"oea"},{f:"OEA 配列"}],text:"日本語入力用のローマ字入力キーボード配列。<br />ホームポジション左手小指から <kbd>O</kbd><kbd>E</kbd><kbd>A</kbd><kbd>I</kbd><kbd>U</kbd> と並ぶ母音集中配置は Dvorak に倣っているが、こちらは日本語のローマ字入力を意識したキー配置になっている。",subject:"OEA配列"},{conv:[{f:"かな配列"}],text:"アルファベットをローマ字変換のルールでひらがなにするのではなく、単打鍵あるいは一連の打鍵が、ローマ字のルールに依らずひらがなとして入力されるタイプのキーボード配列をまとめた言い方。"},{conv:[{f:"ローマ字入力キーボード配列"},{f:"ローマ字入力配列"},{f:"ローマ字配列"}],text:"ラテン文字を各キーに割り当てるタイプのキーボード配列をまとめた言い方。<br />日本語入力においてはローマ字変換のルールに依ってひらがなを入力する（ローマ字入力）ことになるため、こう呼ばれる。",subject:"ローマ字配列"},{conv:[{f:"キーボード配列"},{f:"配列"}],text:"キーボード上のキーの並び。タイピング的文脈においては単に配列と言えばこの意。<br />日本でスタンダードとなっているのは Qwerty と JIS かな。",subject:"キーボード配列"},{conv:[{f:"拗音"}],text:"「しゃ」「にょ」など主に「ゃ」「ゅ」「ょ」を含むような 1 音節。"},{conv:[{f:"撥音"}],text:"「ん」のこと。"},{conv:[{f:"半濁音"}],text:"半濁点「゜」がつくひらがな。<br />パ行だけともいう。"},{conv:[{f:"濁音"}],text:"濁点「゛」がつくひらがな。"},{conv:[{f:"促音"}],text:"「っ」のこと。"},{conv:[{f:"清音"}],text:"濁音でも半濁音でもないひらがな。<br />厳密にはそのひらがなに濁音がつけられるひらがなのみしか清音とは呼ばないようだが、入力方式として興味があるのは濁点、半濁点のありなしだけなので、便宜のために割り切ってしまう。"},{conv:[{f:"省打鍵入力"},{f:"省打鍵"}],text:"キーボード配列において、頻度の高い文字列に対し短い打鍵を割り当て、文章を入力するのに最低限必要な打鍵数を短くすること、およびそれを利用した入力。"},{conv:[{f:"プレフィクスシフト"},{f:"前置シフト"}],text:"通常のシフト方式とは異なり、シフトとなるキーを押した後、離しても次の打鍵にシフトがかかる方式。"},{conv:[{f:"キーボード"}],text:"数十個以上もの鍵盤が並ぶ 20 世紀的入力インタフェース。<br />タイパーにとっては、テニスプレイヤーのラケット、陸上競技者のシューズ、レーサーにとってのマシンにあたる品。<br />友であり相棒であり恋人であり、集中しているときには自分の体と一心同体にすらなる宝物。"},{conv:[{f:"かな打ち"},{f:"かな入力"}],text:"一般にかな配列を利用したタイピング、入力のこと。<br />……のはずだが、99% のかな入力は標準である JIS かなで行われるため、JIS かなを利用したタイピングや入力の意味で使われていることも多い。"},{conv:[{f:"ローマ字打ち"},{f:"ローマ字入力"}],text:"アルファベットが入力できる配列を用いて、決まったローマ字変換ルールにしたがって打鍵することで日本語の読みを入力する入力および方式。<br />……のはずだが、慣用的にデファクトスタンダードである Qwerty での入力・打鍵の意味で使われていることも多い。"},{conv:[{f:"TypeWell"},{f:"タイプウェル"},{f:"__TW",t:"TW"}],text:"タイピング練習ソフトウェア。フリーソフト。<br />様々な種目があり、詳細な打鍵記録を取ることができる。<br />公式ページでのランキングは歴代の記録が保存され続けるため非常にレベルが高く、タイパーのスキルの目安としてこの TypeWell でのレベルが使われることが少なくない。<br />競技種目としてはひたすら速度重視。",subject:"TypeWell/TW"},{conv:[{f:"TWJR"}],text:"タイピング練習ソフトウェアタイプウェルシリーズのひとつ．<br />ローマ字打ちで日本語を打つ．R は「ローマ字」の意．",subject:"タイプウェル国語 R"},{conv:[{f:"TWJK"}],text:"タイピング練習ソフトウェアタイプウェルシリーズのひとつ．<br />JIS かな打ちで日本語を打つ．K は「かな」の意．",subject:"タイプウェル国語 K"},{conv:[{f:"TWEW"}],text:"タイピング練習ソフトウェアタイプウェルシリーズのひとつ．<br />英単語を打つ．EW は「English Word」の意．",subject:"タイプウェル英単語"},{conv:[{f:"TWOR"}],text:"タイピング練習ソフトウェアタイプウェルシリーズのひとつ．<br />でたらめな英数字・記号を打つ．OR は「ORiginal」の意．",subject:"タイプウェルオリジナル"},{conv:[{f:"WeatherTyping"},{f:"ウェザータイピング"},{f:"__WT",t:"WT"}],text:"タイピング練習ソフトウェア。フリーソフト。<br />ワードサーバからのワード生成、ネット対戦などの機能を備え、そのロビーには高速タイパー達が常駐することで有名であった。<br />昨今では一時期よりは下火になっているが、依然としてメジャーな練習環境。<br />スコア算出にあたっては最初の一打を入力するまでの時間が考慮されないので、溜め打ちの練習環境として最適。<br />競技種目としては最高速、やり込み、正確性がバランスよく試される。",subject:"WeatherTyping/ウェザタイ"},{conv:[{f:"美佳タイプ"},{f:"MIKATYPE"}],text:"フリーのタイピング練習ソフトウェア。<br />MS-DOS 時代から存在する年代物。しかしそのワードや基本に忠実な作りには定評があり、今でも練習に使う人は多い。<br />Dvorak 配列練習用などの様々な派生バージョンがある。",subject:"美佳のタイプトレーナ"},{conv:[{f:"打鍵トレーナ"},{f:"打トレ"}],text:"JavaScript で作られ（サーバサイドは Perl CGI）ブラウザ上で動作するタイピング練習ソフトウェア/ゲーム。<br />フリーで配布されており誰でも設置できるので、タイパーの個人ページでよく見かける。ワードが自由に設定できることを利用し趣向を凝らした優良なものが今でも多く残っている。<br />デフォルト設定ではランキングがひと月ごとにリセットされるため、毎月「打トレ巡り」をするタイパーがいる。",subject:"打鍵トレーナー"},{conv:[{f:"__TOD",t:"TOD"}],text:"SEGA が開発・発売している市販のタイピング練習ソフトウェア。アーケード版も存在した。<br />恐らく唯一のタイパーでも使えるほど内容が充実している市販のタイピングゲーム。<br />2003, 2004, ゾンビパニックなどのバージョン違いのほかに、新作の TOD2 も発売されている。",subject:"タイピング・オブ・ザ・デッド"},{conv:[{f:"e-typing"},{f:"エタイ"}],text:"無料で使える web 上のタイピング練習サービス。<br />タイピングゲーム部は Flash で実装されており、入力は快適。毎週開催される腕試しランキングは知名度があり参加者数が多いため、タイパーが名を上げるために上位ランクインを狙っている。<br />競技種目としてはレイテンシ、初速、正確性を重視。"},{conv:[{f:"歌謡"}],text:"ハンゲーム内のオンラインタイピングゲーム。<br />歌を BGM に歌詞を打つ。複数人での協力プレイやハンゲームならではのアバターやユーザ間コミュニケーションが売り。<br />競技種目としてはワードが定型文のみなのでひたすらやり込み重視。",subject:"歌謡タイピング劇場"},{conv:[{f:"上級タイパー"},{f:"高速タイパー"},{f:"光速タイパー"},{f:"トップレベルタイパー"}],text:"タイパーの中でも特に高記録を持っている人を指す。<br />基準はあいまいで、それぞれがどの程度すごいかも文脈による。"},{conv:[{f:"中堅タイパー"},{f:"中堅"}],text:"タイパーの中で、中堅クラスにあたる速さを持つタイパーのこと。<br />普通の感覚からすれば信じられないほど速い速度で打てるとはいえ、タイパーの中ではまだまだだ、という意味で使うことが多い。<br />定義の例としては TypeWell 各種目総合レベルで XE～XS あたりだとか。かなり広い。",subject:"中堅タイパー"},{conv:[{f:"トゥルータイパー"}],text:"TypeWellFan による公式称号。<br />TWJR または TWJK の基本常用語で XF 以上、TWEW の基本英単語で XF 以上、TWOR のすべキーで XF 以上、の全てを達成することが条件。<br />オールラウンダーとスペシャリストの中間目標として意識されている気がする。"},{conv:[{f:"オールラウンダー"},{f:"All Genius"}],text:"TypeWellFan による公式称号。<br />TWJR, TWJK, TWEW, TWOR の全ての総合レベルが SS 以上であることが条件。<br />万能タイパーを目指すならその足がかりにちょうどいい目標。<br />上位称号として All Machine がある。"},{conv:[{f:"All Machine"}],text:"TypeWellFan による公式称号。<br />TWJR, TWJK, TWEW, TWOR の全ての総合レベルが XA 以上であることが条件。<br />上位殿堂を除けば TW 公式の称号の中では Z タイパーをおさえて最高難度だと思われる。<br />2009/01/01 現在 37 人しかいない。"},{conv:[{f:"スペシャリスト"}],text:"TWJR, TWJK, TWEW, TWOR のいずれかで総合レベルが XA-XX に乗っていることが条件。<br />TypeWellFan による公式称号だがあまり使われているのを見ない。<br />上位称号は Z タイパー。"},{conv:[{f:"Z タイパー"}],text:"TypeWellFan による公式称号。<br />TWJR, TWJK, TWEW, TWOR のいずれかで総合レベルが Z 台であることが条件。<br />ここまで来ればさすがに脱中堅宣言すればいい気がする。"},{conv:[{f:"タイパー"},{f:"Typer"}],text:"タイピングをする人。<br />実務的に必要な以上の速度でタイピングをすることに目覚め、趣味として自覚的にタイピングを練習している人々、とうちでは定義している。<br />タイピストと対比してタイパーを定義する場合、速度を基準にして定義する場合、などなど、語のニュアンスに差がある場合がある。"},{conv:[{f:"レイテンシ"},{f:"latency"}],text:"英単語「潜伏、待ち時間」。<br />入力するべき文字列（ワード）を認識した瞬間から初打までの時間。<br />IT 用語からの転用だが今のところ俺用語。"},{conv:[{f:"初速"}],text:"入力するべき文字列（ワード）を認識した瞬間から打鍵が安定するまでの間の平均打鍵速度。<br />巷ではレイテンシの意味で使われることが多いが、「初打までの時間は『時間』であって『速さ』ではないだろ」という個人的なこだわりにより使い分けている。"},{conv:[{f:"kpm"}],text:"Keystrokes Per Minute。<br />(spm : Strokes Per Minute とも）<br />打鍵速度の表現に使う単位。<br />1 分間に何打鍵するスピードであるかを表す。個人的なこだわりにより wpm と使い分けている。"},{conv:[{f:"rkpm"}],text:"打鍵数にも時間にも初打分を含めない、「打っている最中」の KPM。<br />r は running のつもりだけど英語的に正しい表現なのかは知らない。"},{conv:[{f:"wpm"}],text:"Words Per Minute。<br />打鍵速度の表現に使う単位。<br />英語圏では word は当然単語一語を指すので、1 分間に何英単語を打つスピードであるのかを表す。<br />英語の平均単語長は 5 周辺らしく、5 倍すればおおよその kpm に換算できる。<br />日本タイピング文化圏においては、 kpm の意味で使われていることがほとんど。<br />だが、明らかに誤用だと思うので個人的に kpm と書くことを推奨したい。"},{conv:[{f:"タイピングゲーム"},{f:"タイピング練習ソフトウェア"}],text:"キーを文字列入力のために打つという行動が、そのままゲーム性に結びつくような要素を持ったゲーム一般。<br />市販のグラフィックが豪華なゲームからタイパー御用達のストイックに記録を追い求めるゲームまで、色々ある。",subject:"タイピングゲーム"},{conv:[{f:"タッチタイプ"},{f:"タッチタイピング"},{f:"ブラインドタッチ"}],text:"キーボードを見ないでタイピングをすること、またそのスキル。<br />「ブラインドタッチ」は和製英語な上にブラインドが差別くさいとかなんとかで、「タッチタイピング」が推奨されているらしい。",subject:"タッチタイピング,ブラインドタッチ"},{conv:[{f:"乱打"}],text:"タイピングゲームにおいてミスタイプが多く生じるのを承知の上で、ひたすら打鍵回数重視で打つスタイル。<br />対義語は正確性重視。<br />ミス入力文字を無視してくれるタイピングゲームならでは可能な技だが、かみ合った時のトプスピはすごい。<br />とはいえ、乱打でしか打てないタイパーは記録が安定せず、また正確性を重視する競技で苦戦を強いられることになるため、最近はもてはやされない感じである。"},{conv:[{f:"正確性重視"}],text:"ミスタイプをなるべく抑え、無駄を省いて速度を求めるスタイル。<br />対義語は乱打。<br />普段からミスを抑えるという心がけは精神的に負担だが、ミスタイプをしている時間を全て正しい入力に充てることができる、ミスタイプに厳しい実入力でもためらわず打鍵できるようになるなど、身につける価値も大きい。"},{conv:[{f:"最適化"}],text:"1. 高速化等を目的として、ホームポジション的な本来推奨されている運指法をあえて破った形の打鍵をすること、およびその方法（運指最適化）。<br />2. 高速化等を目的として、例えばローマ字入力における「じ」= ZI, JI のように、対象文字列に対し複数の入力方法がある場合に、その選択のレベルでより打ちやすい方を選択すること、およびその方法（入力最適化）。"},{conv:[{f:"誤打鍵"},{f:"誤打"},{f:"ミスタイプ"},{f:"タイプミス"}],text:"誤ったキーを叩いてしまうこと。<br />実入力であれば <kbd>Backspace</kbd> 等で訂正するが、タイピングゲームにおいては誤ったその瞬間にミス数としてなんらかの形で計上され、誤った入力文字は無視されることが多い。"},{conv:[{f:"最高速"},{f:"トップスピード"},{f:"Top Speed"},{f:"トプスピ"}],text:"瞬間的な kpm の最大値。<br />時間に対しキーストロークは離散的なので、タイピングゲーム側の実装としては、一定回数打鍵するのにかかった時間でその打鍵数を割ることによって求めていることが多い。<br />算出に使う打鍵回数が小さいほど高い値が出やすいため、異なるソフトウェア間で値をそのまま比較はできない。",subject:"TopSpeed"},{conv:[{f:"最低速"},{f:"ワーストスピード"},{f:"Worst Speed"},{f:"ワースピ"}],text:"瞬間的な kpm の最小値。<br />時間に対しキーストロークは離散的なので、タイピングゲーム側の実装としては、一定回数打鍵するのにかかった時間でその打鍵数を割ることによって求めていることが多い。<br />ワースピ算出に使う打鍵回数が小さいほど小さい値が出やすいため、異なるソフトウェア間で値をそのまま比較はできない。",subject:"WorstSpeed"},{conv:[{f:"C 打ち"}],text:"ローマ字入力において「か」「く」「こ」を入力する場合に <kbd>K</kbd> ではなく <kbd>C</kbd> を使う入力最適化の一種。<br />この変換定義は標準仕様 (JIS X 4063) に含まれないが、MS-IME などの IM では標準で実装されており、それに倣いタイピングゲームでも対応していることがある。<br />Qwerty/Dvorak ともに <kbd>K</kbd> と <kbd>C</kbd> は右手側と左手側に分かれているので使い分ける意味が大きい。<br />多分、俺用語。"},{conv:[{f:"水増し打ち"},{f:"水増し打鍵"}],text:"打鍵数がそのまま得点につながるようなゲーム (e-typing が代表) において、冗長な打鍵を利用して打鍵数を増加させ、レイテンシによるロスを補い、得点を上げるスキルおよび行為のこと。<br />「いっしょう」→ <kbd>Y</kbd><kbd>I</kbd><kbd>L</kbd><kbd>T</kbd><kbd>U</kbd><kbd>S</kbd><kbd>H</kbd><kbd>I</kbd><kbd>X</kbd><kbd>Y</kbd><kbd>O</kbd><kbd>W</kbd><kbd>H</kbd><kbd>U</kbd><br />など。"},{conv:[{f:"溜め打ち"}],text:"初速・レイテンシを無視し、十分に時間をかけて文字列を読んでから一気に打鍵する行為のこと。<br />この場合の打鍵速度は，文字列の認識・運指の想起にかかる時間を考慮しない、純粋な指の運動能力の指標とすることができる（ただし入力文字列が長くなるとノイズが増える）。<br />この打ち方で競えるタイピング競技の代表に WeatherTyping がある。"},{conv:[{f:"アルファベット"},{f:"ラテン文字"}],text:"慣用的に A-Z の意味で使っている。"},{conv:[{f:"キーストローク"},{f:"KeyStroke"},{f:"打鍵"}],text:"キーを一度叩くこと。一打。<br />kpm などを定義するときに出てくるが無次元、単位なしのただの数。"}];
	
	function check(src, p)
	{
		var beforeGt = src.lastIndexOf(">", p);
		var beforeLt = src.lastIndexOf("<", p);
		var afterGt = src.indexOf(">", p);
		var afterLt = src.indexOf("<", p);
		
		if(beforeLt > beforeGt && afterGt < afterLt){
			return false;
		}else{
			var before = src.substr(beforeLt + 1,  17);
			var after;
			
			if(before == 'span class="appp"'){
				return false;
			}else if((after = src.substr(afterLt + 1, 3)) == '/p>' || after == '/dd'){
				return true;
			}else{
				before = before.substr(0, 2);
				return (before != 'a ' && after != '/a>' &&
						 before != 'h2' && after != '/h2' &&
						 before != 'h3' && after != '/h3' &&
						 before != 'h4' && after != '/h4' &&
						 before != 'h5' && after != '/h5' &&
						 before != 'st' && after != '/st');
			}
		}
	}
	
	function cmpHead(a, b)
	{
			return a.head - b.head;
	}
	
	function cmpTail(a, b)
	{
		return a.tail - b.tail;
	}
	
	function multiReplace(src)
	{
		var srcl = src.toLowerCase();
		var a1 = new Array();
		var a2 = new Array();
		var tlen = table.length;
		
		for(var i = 0; i < tlen; i++){
			var word, wordto, wordlen, p, node, defFix, j;
			
			var list = table[i].conv;
			var listlen = list.length;
			var repeat = false;
			for(j = 0; j < listlen; j++){
				if(!repeat){
					node = list[j];
					word = node.f.toLowerCase();
					wordto = node.t;
					wordlen = word.length;
				}else{
					node = {};
					word = word.replace(/ /g, "");
					wordlen = word.length;
				}
				p = srcl.lastIndexOf(word);
				
				while(p >= 0){
					if(check(srcl, p)){
						defFix = 0;
						if(wordto){
							if(srcl.charAt(p + wordlen) == "=" && p == srcl.indexOf(word + "=" + wordto.toLowerCase(), p)){
								defFix = wordto.length + 1;
							}
						}else{
							node.t = src.substr(p, wordlen);
						}
						a1.push({conv: node, head: p, tail: p + wordlen, id: i, fix: defFix});
					}
					if(--p < 0){
						break;
					}else{
						p = srcl.lastIndexOf(word, p);
					}
				}
				if(word.indexOf(" ") >= 0){
					repeat = true;
					--j;
				}else{
					repeat = false;
				}
			}
		}
		
		a1.sort(cmpHead);
		a2 = Array.apply(null, a1).sort(cmpTail);
		
		var ret = new Array();
		var i, a, ahead, a1i, alen, b, bhead = src.length, btail = 0;
		
		while(alen = a2.length){
			i = alen - 1;
			a = a1[i];
			if(alen == 1 || (a == a2[i] && a.head >= a2[i - 1].tail)){
				// clear
				b = a;
			}else{
				// batting
				if(a != a2[i]){
					a = a2[i];
				}else{
					a = a2[--i];
				}
				
				while(--i >= 0 && a.head < a2[i].tail){
					if(a2[i].head < a.head){
						a = a2[i];
					}
				}
				var len, max = 0;
				ahead = a.head;
				for(i = alen - 1; i >= 0 && ahead <= (a1i = a1[i]).head; i--){
					len = a1i.tail - a1i.head;
					if(max < len){
						b = a1i;
						max = len;
					}else if(max == len && a1i.head < b.head){
						b = a1i;
					}
				}
			}
			
			// replace b
			btail = b.tail;
			var suffix = src.substring(btail + b.fix, bhead);
			bhead = b.head;
			var repto = '<span class="appp" name="' + b.id.toString() + '">' + b.conv.t + '</span>';
			ret.push(suffix, repto);
			
			for(i = alen - 1; i >= 0 && (a = a2[i]).tail > bhead; i--){
				a2.pop();
				for(var j = i; a != a1[j]; j--){}
				a1.splice(j, 1);
			}
		}
		
		if(b){
			return src.substring(0, bhead) + ret.reverse().join('');
		}else{
			return src;
		}
	}
	
	var ta = $("#kizi textarea");
	var taSrc = ta.text();
	ta.text('');
	
	//var startTime = (new Date()).getTime();
	//for(var c = 0; c < 30; c++){
	var kizi = $("#kizi");
	var src = multiReplace(kizi.html());
	//}
	// alert(((new Date()).getTime() - startTime) / 30 + "ms");
	
	kizi.html(src);
	var fadeTime = 200;
	if($.browser.msie){
		fadeTime = 0;
	}
	$("#kizi textarea").text(taSrc);
	$("#kizi span.appp").tooltip({
		bodyHandler: function() {
			var t = table[$(this).attr('name')];
			var subj = t.subject;
			if(!subj){
				var src = "";
				var list = t.conv;
				if(!t.conv.length){
					list = [list];
				}
				for(var i = 0; i < list.length; i++){
					src = src + list[i].f;
					if(i < list.length - 1){
						src = src + ", ";
					}
				}
				subj = src;
			}
			var ppp = '<h3>' + subj + '</h3><p>' + t.text;
			if(t.extra){
				ppp += "<br />" + t.extra;
			}
			ppp += "</p>";
			
			return multiReplace(ppp);
		},
		showURL: false,
		delay: 0,
		fade: fadeTime,
		top: 13,
		left: 13
	});
});