/*================================================================================================================*/

var IE4, IE5, IE6, MAC;
if (navigator.appVersion.charAt(22) == "6") {
  IE6 = true;
}
if (navigator.appVersion.charAt(22) == "5") {
  IE5 = true;
}
if (navigator.appVersion.charAt(22) == "4") {
  IE4 = true;
}
if (navigator.userAgent.substring(35,38) == "Mac"){
  MAC = true;
}
  
/*
 * =============================
 * 0バイト文字を挿入する
 * 半角英数の連続のデザイン崩れ対応
 * @access	public
 * @return	string
 * @author	yoshiki
 * =============================
 */
$(document).ready(function(){
	wordBreakRun() ;
});


/*================================================================================================================*/

function windowClose(redirect_url) {
	if (redirect_url != ''){
		window.close() ;
		location.replace(redirect_url) ;
	}
}

function isIE6(){
	if(jQuery.browser.msie === true && jQuery.browser.version.substr(0, 1) == "6"){
		return true ;
	}
	return false ;
}

function wordBreakRun(target){
	if(isIE6()){
		return false ;
	}
	var node = target || ".word-break" ;
	$(node).each(function(){
		var tmp = $(this).html();
		var ret_tmp = changingLineControl(tmp) ;
		$(this).empty().html(ret_tmp) ;
	})
}

function reloadDisable(e){
		switch (e.keyCode){
			case 116: // F5キー（更新）
			case 82: // Ctrl + Rキー　
				e.keyCode = 0;
				return false;
			break;
		}
}


/*
 * JSONレスポンスからサーバの時刻を取得する。
 */ 
function getTime(json) { 
  var year = json.year; 
  var month = json.month; 
  var day = json.day; 
  var hour = json.hour; 
  var minute = json.minute; 
  var second = json.second; 
 
  return year + "年" + month + "月" + day + "日 " 
       + hour + "時" + minute + "分" + second + "秒"; 
} 


function nl2br(str){
	if(str && str.length > 0){
		str = str.replace(/\r\n/g, "<br />") ;
		str = str.replace(/(\n|\r)/g, "<br />") ;
	}
	return str ;
}


function changingLineControl(str){
	if(isIE6()){
		return str ;
	}

	var ret_string = "" ;
	var tag_in_flag = false ;
	var refer_string_flag = false ;

	for (var i=0; i<str.length; i++){
		var data = str.charAt(i) ;
		if (data == "<") {
			tag_in_flag = true ;
		}
		
		if (tag_in_flag) {
			if (data == ">") {
				tag_in_flag = false ;
			}
		}
		
		if (data == "&") {
			refer_string_flag = true ;
		}
		
		if (refer_string_flag) {
			if (data == ";") {
				refer_string_flag = false ;
			}
		}
		
		if (ret_string.length != 0 && !tag_in_flag && !refer_string_flag){
			ret_string += data + "\u200B" ;
		}
		else{
			ret_string += data ;
		}
	}
	return ret_string ;
}


function showTips(id){
  var style=document.getElementById?
              document.getElementById(id).style:(
                document.all?document.all(id).style:(
                  document.layers?document.layers[id]:null
	            )
              );
  if(style) style.visibility='inherit';
}

function hideTips(id){
  var style=document.getElementById?
              document.getElementById(id).style:(
                document.all?document.all(id).style:(
                  document.layers?document.layers[id]:null
                )
              );
  if(style) style.visibility='hidden';
}


function setMenuAccountPnt(pnt){
	if(pnt.length > 0){
		$("#menuAccountPnt").text(pnt) ;
	}
}


function getParmObj(url, type, data, success, error, complete, before, async){
	if(async == undefined){
		async = true ;
	}

	return { 
						 "url": url
						,"type": type
						,"data": data
						,"dataType": "json"
						,"success": success
						,"error": error
						,"complete": complete
						,"beforeSend" : before
						,"async" : async
					}
}


/*
 * ブラウザ判定
 */
function checkBrowser(){
	var ret = false ;
	if(navigator.userAgent.indexOf("Win") != -1 ){
		// Windows系OSでのみ実行されるスクリプト
		if(jQuery.browser.msie === true){
			// IE
			var version = jQuery.browser.version.substr(0, 1) ;
			if(version == "7" || version == "8"){
				ret =  true ;
			}
		}
		else if(jQuery.browser.mozilla && navigator.userAgent.toLowerCase().indexOf("firefox") != -1){
			// firefox
			myAgent = navigator.userAgent;
			myTop = myAgent.indexOf("Firefox/",0);
			if(myTop != -1){
				myLast = myAgent.indexOf(".",myTop);
		        myVer = myAgent.substring(myTop+8,myLast); // NNのバージョン切り取り	
				
				if(Number(myVer) >= 3){
					ret =  true ;
				}
			}
			
		}
		else if(jQuery.browser.safari === true){
			//safari
		}
	}
	else if(navigator.userAgent.indexOf("Mac") != -1){
		if(jQuery.browser.safari === true){
			//safari
			var version = jQuery.browser.version.split(".") ;
			if(Number(version[0]) >= 523){
				ret =  true ;
			}
		}
		// MacOSでのみ実行されるスクリプト
	}
	else if(navigator.userAgent.indexOf("Win") == -1 && navigator.userAgent.indexOf("Mac") == -1){
	   // その他のOSで実行されるスクリプト
	}
	return ret ;
}

function setAttention(){
	ret = checkBrowser();
	
	attention_text  =  '<p><a href="/page/faq_default/#que32"><span style="font-weight:bold;color:#000066">お客さまがご利用のブラウザは、本サービスの推奨環境でない可能性がございます。<br />';
	attention_text += 'その場合、一部ご利用いただけない機能がございますので、バージョンアップ等をお勧めします。<br />';
	attention_text += '詳しくは、コチラをクリックしてFAQをご確認ください。</span></a></p>';


	if(ret == false){
		$('#ba').html(attention_text);
	}
	
}

/*
 * =============================
 * location設定用
 * @access	public
 * @return	string
 * @author	yamazaki
 * =============================
 */
function jumpPg(url){
	window.location.href = url;
}

/*
 * =============================
 * スコープwrrap
 * @access	public
 * @return	string
 * @author	yoshiki
 * =============================
 */
jQuery.scope = function(target,func){ return function(){ return func.apply(target,arguments);}};


/*================================================================================================================*/


/*
 * =============================
 * 一覧系プロトタイプ
 * @access	public
 * @return	string
 * @author	yoshiki
 * 
 * 独自処理は継承したサブクラスでオーバーライドしてください。
 * 
 * =============================
 */
function loadListPrototypeClass(){
		
	/*
	 * 一覧表示に使用するDOMオブジェクト
	 * $(this.model)みたいな使い方
	 */ 
	this.model = "" ;

	/*
	 * クローンノードに付与する属性
	 * クローン作成したものを作成するために定義
	 */ 
	this.copyNode = {
		 key : "app_copy"
		,value : "on"
	};

	/*
	 * loaddingノード
	 * beforeSend completeで使用
	 */ 
	this.beforeNode = {
		 key : "app_loading"
		,value : "load"
	};

	/*
	 * Ajax通信設定
	 * 
	 */ 
	this.ajax = {
		 url : ""
		,type : "POST"
		,data : ""
	};

	this.async = true ;
	
	/*
	 * ページ送り設定
	 * 全項目複数設定可
	 * $(***)形式で使用される
	 * 
	 * block : ページ送り部分全体を覆うブロック
	 * next : 次のページに進むリンクのを指定
	 * prev : 前のページに進むリンクのを指定
	 * page : 現在のページ数表示領域
	 * maxPage : 最大ページ数表示領域
	 * allRow : 最大件数数表示領域
	 * from : 表示中の開始件数表示領域
	 * to : 表示中の終了件数表示領域
	 */ 
	this.pageAction = {
		block : {
		},
		next : {
		},
		prev : {
		},
		page : {
		},
		maxPage : {
		},
		allRow : {
		},
		from : {
		},
		to : {
		}
	};

	/*
	 * ページ情報
	 * 受け取ったJsonデータに含まれるページ情報を保持
	 */ 
	this.pageInfo = {
		 page : 1
		,maxPage : 1
		,allRow : 1
		,from : 1
		,to : 1
	};
	
	/*
	 * 初期化処理
	 */ 
	this.init = function(){
		this.run() ; 
	};
	
	/*
	 * 実行
	 */ 
	this.run = function(){
		new $.ajax(this.getParmObj()); 
	};
	
	/*
	 * 指定ページに遷移
	 */ 
	this.move = function(page){
		var page = page ;
		var data = this.ajax.data ;

		if(page > this.pageInfo.maxPage){
			return ;
		}

		addParm = "" ;
		addParm += (data.length > 0)?"&":"";
		addParm += "page=" +  page ;
		this.ajax.data += addParm ;
		this.run(this.model) ;
		this.ajax.data = data ;
	};

	/*
	 * 前のページに遷移
	 */ 
	this.prev = function(){
		var page = --this.pageInfo.page ;
		var data = this.ajax.data ;

		if(page < 1){
			return ;
		}

		addParm = "" ;
		addParm += (data.length > 0)?"&":"";
		addParm += "page=" +  page ;
		this.ajax.data += addParm ;
		this.pageInfo.page = page ;
		this.run(this.model) ;
		this.ajax.data = data ;
	};

	/*
	 * 次のページに戻る
	 */ 
	this.next = function(){
		var page = ++this.pageInfo.page ;
		var data = this.ajax.data ;

		if(page > this.pageInfo.maxPage){
			return ;
		}

		addParm = "" ;
		addParm += (data.length > 0)?"&":"";
		addParm += "page=" +  page ;
		this.ajax.data += addParm ;
		this.pageInfo.page = page ;
		this.run(this.model) ;
		this.ajax.data = data ;
	};

	/*
	 * データ取得パラメータ
	 */ 
	this.getParmObj = function(){
		var ajax = this.ajax ;
		return getParmObj(
												  ajax.url
												, ajax.type
												, ajax.data
												, $.scope(this, this.handleSuccess)
												, $.scope(this, this.handleError)
												, $.scope(this, this.handleComplete)
												, $.scope(this, this.handleBefore)
												, this.async
											) ;
	};
	
	/*
	 * ページアクション初期化
	 */ 
	this.pageAcctionInit = function(){
		//ブロックを非表示に
		jQuery.each(this.pageAction.block, $.scope(this, function(i,v){$(v).hide() ;}));
		
		//イベント解除
		jQuery.each(this.pageAction.next, $.scope(this, function(i,v){$(v).unbind("click").hide() ;}));
		jQuery.each(this.pageAction.prev, $.scope(this, function(i,v){$(v).unbind("click").hide() ;}));
	};

	/*
	 * ページアクションセット
	 */ 
	this.pageAcctionSet = function(){
		//Number型に
		jQuery.each(this.pageInfo, $.scope(this, function(i,v){this.pageInfo[i] = Number(v) ;}));

		//onclickアクション設定
		if(this.pageInfo.page < this.pageInfo.maxPage){
			jQuery.each(this.pageAction.next, $.scope(this, function(i,v){$(v).bind("click", $.scope(this, this.next)).show() ;}));
		}
		if(this.pageInfo.page > 1){
			jQuery.each(this.pageAction.prev, $.scope(this, function(i,v){$(v).bind("click", $.scope(this, this.prev)).show() ;}));
		}
		
		//ページ情報の表示
		jQuery.each(this.pageAction.page, $.scope(this, function(i,v){$(v).text(this.pageInfo.page).show() ;}));
		jQuery.each(this.pageAction.maxPage, $.scope(this, function(i,v){$(v).text(this.pageInfo.maxPage).show() ;}));
		jQuery.each(this.pageAction.allRow, $.scope(this, function(i,v){$(v).text(this.pageInfo.allRow).show() ;}));
		jQuery.each(this.pageAction.from, $.scope(this, function(i,v){$(v).text(this.pageInfo.from).show() ;}));
		jQuery.each(this.pageAction.to, $.scope(this, function(i,v){$(v).text(this.pageInfo.to).show() ;}));
		
		//最後にページ情報ブロック表示
		if(this.pageInfo.allRow > 0){
			jQuery.each(this.pageAction.block, $.scope(this, function(i,v){$(v).show() ;}));
		}
	};
	
	/*
	 * 通信前の処理
	 */ 
	this.handleBefore = function(XMLHttpRequest){
		var time = new Date().getTime() ;
		XMLHttpRequest.setRequestHeader("FSNS_AjaxHeader", time) ;
	 	$(this.model).parent().append("<span "+this.beforeNode.key+"="+this.beforeNode.value+">Loading....</span>") ;
	}

	/*
	 * 通信成功後の処理
	 */ 
	this.handleSuccess = function(){
		// NON //
	} ;

	/*
	 * エラーの処理
	 */ 
	this.handleError = function(XMLHttpRequest, statusText, errorThrown){
		switch(XMLHttpRequest.status){
			case 450 :
				window.location.href = "/login/" ;
				return false;
				break ;
		}
		
		//↓↓仮↓↓//
		switch(statusText){
			case "success" :
	      // リクエスト成功
				break ;
			case "error" :
	      // リクエスト失敗
	      if(XMLHttpRequest.status != 0){
					alert('リクエスト失敗しました。\n');
	      }
				break ;
			case "notmodified" :
	      // 更新されていない
				break ;
			case "timeout" :
	      // タイムアウト
				alert('タイムアウトしました。\n');
				break ;
			case "parsererror" :
	      // データパースエラー
				alert('パースエラー\n');
				break ;
		}
	} ;

	/*
	 * 後処理
	 */ 
	this.handleComplete = function(){
		//前処理で作製された兄弟ノード削除
		$(this.model + " ~ [" + this.beforeNode.key + "=" + this.beforeNode.value +"]").remove() ;
	} ;
}


/*================================================================================================================*/


/*
 * =============================
 * 入力処理系プロトタイプ
 * @access	public
 * @return	string
 * @author	yoshiki
 * 
 * 独自処理は継承したサブクラスでオーバーライドしてください。
 * 
 * model => formのID
 * 
 * error => レスポンスのstatus.detail表示領域
 * 
 * afterSuccess => status.code 200(成功時)の処理
 *                 initとかreloadする。
 * 
 * action => submit サブミットボタン
 *           cansel 戻るボタン
 * 
 * formDef => フォーム定義
 * //サンプル//
 *	"whiteboard_comment" : {error : "#whiteboard_comment_error", type : "text"}
 * ,"whiteboard_decoration" : {error : "#whiteboard_decoration_error", type : "select"}
 * ,"whiteboard_reg_notice" : {error : "#whiteboard_reg_notice_error", type : "checkbox"}
 * ,"FormSession" : {type : "hidden", multi : false}
 * 
 * ajax => 通信パラメータ
 * 
 *  
 * =============================
 */
 
function loadingBar(){
		$("#TB_overlay").bgiframe();
		$("#TB_overlay").css('z-index','1000');
		$("body").append("<div id='TB_load'><img src='"+imgLoader.src+"' /></div>");//add loader to the page
		$('#TB_load').show();//show loader
		TB_loadH = (document.documentElement.clientHeight/2);
		$('#TB_load').css('top',TB_loadH+'px');
		$("#TB_load").css('z-index','1100');
}
function inputPrototypeClass(){
	this.model = "#myForm" ;
	this.error = "#myFormError" ;
	this.afterSuccess = function(){} ;
	
	this.opitonContentH;
	this.opitonContentHnew;
	this.opitonContentHadd = 0;
	
	this.action = {
		 submit : "#submit"
		,cancel : "#cancel"
	}
	
	this.extendThickbox = true ;

	this.formDef = {
	};
	
	this.responseData = {
	};
	
	this.ajax = {
		 url : ""
		,type : "POST"
		,data : ""
	};

	this.async = false

	this.init = function(){
		$(this.action.submit).bind("click", $.scope(this, this.submit)) ;
		$(this.action.cancel).bind("click", $.scope(this, this.cancel)) ;
		//テキストでエンターキーは無効にする
		$(this.model + " :text").bind("keydown", $.scope(this, function(e){if(e.keyCode == 13){return false;}})) ;
		$(this.model + " :checkbox").bind("keydown", $.scope(this, function(e){if(e.keyCode == 13){return false;}})) ;
		$(this.model + " :radio").bind("keydown", $.scope(this, function(e){if(e.keyCode == 13){return false;}})) ;
	};
	
	
	/*
	 * submit処理
	 */ 
	this.submit = function(){
		loadingBar();
		
		$(this.action.submit).unbind("click") ;
		loadingID = setTimeout($.scope(this, function(){
		$(this.error).empty() ;
		jQuery.each(this.formDef, function(i, v){
			if(v.error && $(v.error).get(0) != undefined){
				$(v.error).empty() ;
			}
		}) ;

		//エラーメッセージの表示領域を戻す
		if(this.extendThickbox === true && $("#TB_ajaxContent")[0]){
			$("#TB_ajaxContent")[0].style.height = ajaxContentH + "px" ;
		}
		
		var url = this.ajax.url ;
		var type = this.ajax.type ;
		var data = this.ajax.data ;
		
		var formStr = $(this.model).serialize();
		data += (data.length > 0)?"&":"";
		data += formStr ;
		new $.ajax(getParmObj(url, type, data, $.scope(this, this.handleSuccess), $.scope(this, this.handleError), $.scope(this, this.handleComplete), $.scope(this, this.handleBefore), this.async)) ;
		}),100)
	};
	/*
	 * キャンセル処理
	 */ 
	this.cancel = function(){
		if("clickTimer" in window){
			clickTimer=null ;
		}
		tb_remove();
	};

	/*
	 * 通信前の処理
	 */ 
	this.handleBefore = function(XMLHttpRequest){
		var time = new Date().getTime() ;
		XMLHttpRequest.setRequestHeader("FSNS_AjaxHeader", time) ;
	}

	/*
	 * 通信成功後の処理
	 */ 
	this.handleSuccess = function(data) {
    var json = data;
		var data = "" ;
		
		var ajaxContentH_tmp = this.opitonContentH || ajaxContentH || 0 ;

		$(this.error).empty() ;

		this.responseData = json ;

		if(json.status.code != 200){
			//エラー表示
			$(this.error).html(nl2br(json.status.detail+"<br />")) ;
			ajaxContentH_tmp += 20 ; 

			jQuery.each(this.formDef, function(i, v){
				if(v.error && $(v.error).get(0) != undefined){
					var errorMs = json.errorSeparate[i] || "" ;
					errorMs += (errorMs.length > 0)?"<br />":"";
					$(v.error).empty().html(errorMs) ;
					
					ajaxContentH_tmp += (errorMs.length > 0)?20:0 ; 
				}
			}) ;
			
			//エラーメッセージの表示領域分伸ばす
			if(this.extendThickbox === true && $("#TB_ajaxContent")[0]){
				$("#TB_ajaxContent")[0].style.height = ajaxContentH_tmp + "px" ;
			}
			this.opitonContentHadd = ajaxContentH_tmp - this.opitonContentH;
			this.opitonContentHnew = Number($("#TB_ajaxContent")[0].style.height.replace("px",""));
			
			$(this.action.submit).bind("click", $.scope(this, this.submit)) ;
			
			$("#TB_load").remove();
			$("#TB_overlay").css('z-index','100');
		}
		else{
			//ポップアップ閉じる
			this.cancel() ;
			setMenuAccountPnt(json.account.account_pnt) ;
			//ここでinitとかreload
			if(this.afterSuccess){
				this.afterSuccess();
			}
		}
	} ;

	/*
	 * エラーの処理
	 */ 
	this.handleError = function(XMLHttpRequest, statusText, errorThrown){
		switch(XMLHttpRequest.status){
			case 450 :
				window.location.href = "/login/" ;
				return false;
				break ;
		}
		
		//↓↓仮↓↓//
		switch(statusText){
			case "success" :
	      // リクエスト成功
				break ;
			case "error" :
	      // リクエスト失敗
	      if(XMLHttpRequest.status != 0){
					alert('リクエスト失敗しました。\n');
	      }
				break ;
			case "notmodified" :
	      // 更新されていない
				break ;
			case "timeout" :
	      // タイムアウト
				alert('タイムアウトしました。\n');
				break ;
			case "parsererror" :
	      // データパースエラー
				alert('パースエラー\n');
				break ;
		}
	} ;

	/*
	 * 後処理
	 */ 
	this.handleComplete = function(){
		// NON //
	} ;
}


/*================================================================================================================*/


/*
 * =============================
 * 絵文字初期処理
 * @access	public
 * @return	string
 * @author	yoshiki
 * =============================
 */ 
function emojiInputInit(){
	var tempFunc = function(){} ;
	tempFunc.prototype = new emojiInputPrototypeClass ;
	emojiInputConst = new tempFunc ;
	emojiInputConst.init() ;
}


/*
 * =============================
 * 絵文字パレット
 * 入力補助を行うinput, textareaはidを指定し、"em_"+idを絵文字popupボタンのidに指定する。
 * class名は、emoji_entry
 * emoji_default_pc.htmlのincludeをすること。
 * 例:
 *   <input id="aaa" type="text" /><img src="xxx.gif" class="emoji_entry" id="em_aaa" />
 *   <textarea id="bbb" rows="2" cols="20"></textarea><img src="xxx.gif" class="emoji_entry" id="em_bbb" />
 * 
 * @access	public
 * @return	string
 * @author	yoshiki
 * =============================
 */ 
function emojiInputPrototypeClass(){

  this.isIE = (navigator.appName.toLowerCase().indexOf('internet explorer')+1?1:0);
  this.emojiEntryId = '';
  this.emojiEntryObj = null ;
	
	this.init = function(){
		this.setupCss() ;
	  $("img.emoji_entry").bind("click", $.scope(this, function(e){
	  	//挿入するエリア
	    this.emojiEntryId = e.target.id.replace("em_", "");
	    this.emojiEntryElement = document.getElementById(this.emojiEntryId) ;

			$("#"+this.emojiEntryId).focus();
//			$("#"+this.emojiEntryId).blur($.scope(this, function(e){$(".emoji_palette").hide("normal");})) ;

			var position = $("#"+e.target.id).position() ;
	    $("div.emoji_palette").bgiframe().css("top", position.top).css("left", position.left + 50).show("normal");
	  }));

	  $(".emoji_palette_close").bind("click", $.scope(this, function(){
	    $(".emoji_palette").hide("normal");
	  }));

	 $("div.emoji_palette td[class!='null_emoji']").bind("mousedown", $.scope(this, function(e){
			//クリックする箇所によりtargetにimgタグが返ることがあるのでwrapする
			if(e.target.id.length > 0){
		  	var selectEmojiId = e.target.id ;
			}
			else if($(e.target).parent("td").attr("id").length > 0){
		  	var selectEmojiId = $(e.target).parent("td").attr("id") ;
			}
			else{
				return ;
			}
			//フィールドの属性により処理分岐
			if($("textarea#"+this.emojiEntryId).get().length == 1){
				this.insertBoxAtCursor(this.emojiEntryElement, "[em-d:" + selectEmojiId.replace("em_", "") + "]");
			}
			else if($("#"+this.emojiEntryId+":text").get().length == 1){
				this.insertAtCursor(this.emojiEntryElement, "[em-d:" + selectEmojiId.replace("em_", "") + "]");
			}
			else{
				return ;
			}
			$("#"+this.emojiEntryId).focus();
			$(".emoji_palette").hide("normal");
	  }));

	  $("div.emoji_palette td").hover(
	    function(){
	      if (this.id) $(this).css("border","2px #F20000 solid");
	    },
	    function(){
	      if (this.id) $(this).css("border","none");
	    }
	  );
	}


  this.getTextRange = function(myField){
    var pos = new Object();
    // IE support
    if (this.isIE) {
      myField.focus();
      var range = document.selection.createRange();
      var b = range.parentElement();
      var clone = b.createTextRange();
      clone.setEndPoint( 'EndToStart', range );
      pos.start = clone.text.length;
    }
    // MOZILLA/NETSCAPE support
    else if(window.getSelection()) {
      pos.start = myField.selectionStart;
    }
    // other(error対応)
    else {
      pos.start = myField.value.length;
    }
    return pos;
  }

  this.getAreaRange = function(myField) {
    var pos = new Object();
    // IE support
    if (this.isIE) {
      myField.focus();
      var range = document.selection.createRange();
      var clone = range.duplicate();
      clone.moveToElementText(myField);
      clone.setEndPoint( 'EndToEnd', range );
      pos.start = clone.text.length - range.text.length;
    }
    // MOZILLA/NETSCAPE support
    else if(window.getSelection()) {
      pos.start = myField.selectionStart;
    }
    // other(error対応)
    else {
      pos.start = myField.value.length;
    }
    return pos;
  }

  this.insertAtCursor = function(myField, myValue) {
    var pos = this.getTextRange(myField);
    var val = myField.value;
    var beforeNode = val.substring(0, pos.start);
    var afterNode = val.substring(pos.start, val.length);
    myField.value = beforeNode + myValue + afterNode;
  }

  this.insertBoxAtCursor = function(myField, myValue) {
    var pos = this.getAreaRange(myField);
    var val = myField.value;
    var beforeNode = val.substring(0, pos.start);
    var afterNode = val.substring(pos.start, val.length);
    myField.value = beforeNode + myValue + afterNode;
  }
  
  this.setupCss = function(){
		$("div.emoji_palette")
			.css("position", "absolute")
			.css("top", "100px")
			.css("left", "100px")
			.css("border", "1px solid #FC6")
			.css("z-index", "5")
			.css("width", "295px")
			.css("background-color","#FFF")
			.css("background-repeat","no-repeat") ;
			
			
		$("div.emoji_palette_title")
			.css("background-color", "#FC6")
			.css("color", "#FFF")
			.css("height", "1.5em")
			.css("cursor", "crosshair") ;
			
		if (this.isIE) {
		$("div.emoji_palette_title").css("width", "300px");
		}
		
		$("div.emoji_palette_title_left")
			.css("float", "left")
			.css("text-align", "left")
			.css("padding-left", "4px") ;
		
		$("div.emoji_palette_title_right")
			.css("margin-left", "100px")
			.css("text-align", "right")
			.css("padding-right", "10px") ;
		
		$("span.emoji_palette_close")
			.css("color", "#FFF")
			.css("text-size", "80%")
			.css("text-decoration", "none")
			.css("cursor", "pointer") ;
		
		$("div.emoji_palette table")
			.css("border-collapse", "collapse")
			.css("margin", "2px 4px") ;
		
		$("div.emoji_palette td")
			.css("width", "18px")
			.css("height", "18px")
			.css("margin", "1px")
			.css("cursor", "pointer") ;
		
		$("div.emoji_palette .null_emoji")
			.css("background-color", "#FFF")
			.css("width", "14px")
			.css("height", "14px")
			.css("margin", "1px")
			.css("cursor", "default") ;
		
		$("img.emoji_entry")
			.css("border", "1px solid #FFF")
			.css("cursor", "pointer")
			.hover(
				function(){
					$(this)
						.css("border", "1px solid #FC6")
						.css("cursor", "pointer") ;
				},
				function(){
					$(this)
						.css("border", "1px solid #FFF")
						.css("cursor", "pointer") ;
				});
		
		$("img.emoji_entry_box")
			.css("border", "1px solid #FFF")
			.css("cursor", "pointer")
			.hover(
				function(){
					$(this)
						.css("border", "1px solid #FC6")
						.css("cursor", "pointer") ;
				},
				function(){
					$(this)
						.css("border", "1px solid #FFF")
						.css("cursor", "pointer") ;
				});
  }
}