﻿/*
MIT License

 Web:Web and Character http://d.hatena.ne.jp/project_the_tower2/"
 Mail:george.nagaoka@gmail.com
*/

function init(){
	$("edit").contentEditable = "true";
	if(Prototype.Browser.Opera){
		$("edit").onkeypress = keyEventSwitchingFunc;
	}else{
		Event.observe($("edit"),"keypress",keyEventSwitchingFunc,false);
		if(Prototype.Browser.IE || Prototype.Browser.WebKit)　Event.observe($("edit"),"keydown",keyDownFunc,false);
	}
	sel1 = new Selection();
	range1 = new Range();
	$("edit").contentEditable = "true";

	if( Prototype.Browser.IE ){
		$("edit").innerHTML = "<p></p>";
	}else if(Prototype.Browser.WebKit || Prototype.Browser.Opera){
		$("edit").innerHTML = "";
	}else if(Prototype.Browser.Gecko){
		$("edit").innerHTML = "<br>";

	}
	transserverClass = socialIMERequestMyServer;
	$("edit").focus();
}

var sel1= null;
var range1=null;
var aspan = null;
var bspan =null;
var caretOffset =0;
var finalcursorspan =null;
var transserverClass = socialIMERequestMyServer;
//var transserverClass=yahooRequestProxyDrk7jp;
var char;
var colorObjNumber =0;
var onIME = true;

function keyDownFunc(event){
	if(!onIME) return;
	var k=event.keyCode;
	if((k<=40 && k>=37)|| k==8 )keyEventSwitchingFunc(event);
}

function keyEventSwitchingFunc(event){
	if(!onIME) return;
	var code =  event.charCode || event.keyCode;
	if (event.which == null){
		if(code ==8 || code == 40 || code == 37 || code==39 || code==38 || code ==13 || code ==32){
		    char ="specialkey";
		}else{
		    char= String.fromCharCode(code);// IE
		}
	}else if (event.which > 0){
		if(code ==8 || code == 40 || code == 37 || code==39 || code==38 || code ==13 || code ==32){
		    char ="specialkey";
		}else{
		    char= String.fromCharCode(event.which);// All others
		}
	}else{
	     // special key
		//alert("Not implemented : Special key");
		char ="specialkey";
	}

	switch(phase){
	   case "insert":oInsert.start(event,code,char);break;
	   case "hiraganaInput": oHiraganaInput.start(event,code);break;
	   case "plainControl" :
			if(event.shiftKey){
				if(!shiftflag){
					oShiftedControl.init();
					shiftflag = true;
				}
				oShiftedControl.start(event,code);break;
			}else{
				if(shiftflag){
					oShiftedControl.finish();
					shiftflag=false;
				}
				oPlainControl.start(event,code);break;
			}
	   case "suggest" :oSuggest.start(event,code);break;
	}
}

function atachCaretPos(elm,offset){
	if(Prototype.Browser.Gecko){ //FireFox
		elm.focus();
		var sel= window.getSelection();
		var range = sel.getRangeAt(0);
		range.setStart(elm.firstChild,offset);
		range.setEnd(elm.firstChild,offset);
	}else if(Prototype.Browser.IE){ //IE
		  sel1 = new Selection();
		  elm.focus();
		  range1.setStart(elm.firstChild, offset);
		  range1.setEnd(elm.firstChild,offset);
		  sel1.addRange(range1);
	}else if(Prototype.Browser.WebKit){
		  sel1.removeAllRanges();
		  range1.setStart(elm.firstChild, offset);
		  range1.setEnd(elm.firstChild,offset);
		  sel1.addRange(range1);
	}else if(Prototype.Browser.Opera){
		  sel1 = new Selection();
		  elm.focus();
		  range1.setStart(elm.firstChild, offset);
		  range1.setEnd(elm.firstChild,offset);
		  sel1.addRange(range1);
	}
}

function atachCaretPosA(node,offset){
	if(Prototype.Browser.Gecko){ //FireFox
		var sel= window.getSelection();
		var range = sel.getRangeAt(0);
		range.setStart(node,offset);
		range.setEnd(node,offset);
	}else if(Prototype.Browser.IE){ //IE
		  sel1 = new Selection();
/*
		  range1.setStart(node, offset);
		  range1.setEnd(node,offset);
		  sel1.addRange(range1);
*/

	}else if(Prototype.Browser.WebKit){
		  sel1.removeAllRanges();
		  range1.setStart(node, offset);
		  range1.setEnd(node,offset);
		  sel1.addRange(range1);
	}else if(Prototype.Browser.Opera){
		  sel1 = new Selection();
		  range1.setStart(node, offset);
		  range1.setEnd(node,offset);
		  sel1.addRange(range1);
	}
}

function constructHTML(){
	if(Prototype.Browser.IE){

		var html = "<span id='marker'></span>";
		var t = $("edit").innerHTML;

		var range = document.selection.createRange(); 
		range.pasteHTML(html);

		$("marker").appendChild(mainspan);

	}else if(Prototype.Browser.Gecko || Prototype.Browser.Opera || Prototype.Browser.WebKit){
	  // iframeのdocumentとwindowを取得
	  var html = mainspan;
	  var fragment = document.createDocumentFragment();
	  var div = document.createElement("span");
	  div.appendChild(html);

	  // div配下のNodeをfragmentに移動
	  while (div.firstChild) {
	    fragment.appendChild(div.firstChild);
	  }

	  var selection = window.getSelection();

	  range = selection.getRangeAt(0);

	  // 選択範囲の削除
	  range.deleteContents();

	  var container = range.startContainer;
	  var offset = range.startOffset;

	  switch (container.nodeType) {
	  case 1:
	    // Element node
	    container.insertBefore(fragment,
	                           container.childNodes[offset]);
	    break;
	  case 3:
	    // Text node
	    var node = container.splitText(offset);
	    node.parentNode.insertBefore(fragment, node);
	    break;
	  }

	}
}

function cancelEvent(event){
    if (event.preventDefault) {
      event.preventDefault();
    } else {
      event.returnValue = false;
    }
}

function finalText(event,flag){
	var s;
	if(!flag) cancelEvent(event);

	if(Prototype.Browser.IE){
		 s =  mainspan.innerText ;
		var r = document.createTextNode(s);
		mainspan.parentNode.parentNode.replaceChild(r,$('marker'));
		atachCaretPosA(r,s.length);
		phase = "insert";
		myDesign = new designText();
		oShiftedControl.init();
	}else{
		 s = mainspan.textContent ;
		var r = document.createTextNode(s);
		mainspan.parentNode.replaceChild(r,mainspan);
		atachCaretPosA(r,s.length);
		phase = "insert";
		myDesign = new designText();
		oShiftedControl.init();
	}
}
