Editor = window.Editor || {};
Editor.userAgent = navigator.userAgent.toLowerCase();
Editor.is_opera = Editor.userAgent.indexOf('opera') != -1 && opera.version();
Editor.is_moz = (navigator.product == 'Gecko') && Editor.userAgent.substr(Editor.userAgent.indexOf('firefox') + 8, 3);
Editor.is_ie = (Editor.userAgent.indexOf('msie') != -1 && !Editor.is_opera) && Editor.userAgent.substr(Editor.userAgent.indexOf('msie') + 5, 3);
Editor.initialized=false;
//box->iframe
//win->iframe.contentWindow;
//doc->iframe.contentWindow.document;
Editor.editwin=Editor.editbox=Editor.editdoc=Editor.editcss=Editor.textobj=null;
Editor.csspath =new Array('/plugin/editor/Editor.css');
Editor.statck=new Array();
Editor.smiles={};
var smiledefault = {};
smiledefault.name='默认表情';
smiledefault.path='http://'+document.domain+'/plugin/editor/smiles/default/';
smiledefault.smiles={
'1':'00001.gif','2':'00002.gif','3':'00003.gif','4':'00004.gif','5':'00005.gif','6':'00006.gif','7':'00007.gif','8':'00008.gif','9':'00009.gif','10':'00010.gif',
'11':'00011.gif','12':'00012.gif','13':'00013.gif','14':'00014.gif','15':'00015.gif','16':'00016.gif','17':'00017.gif','18':'00018.gif','19':'00019.gif','20':'00020.gif',
'21':'00021.gif','22':'00022.gif','23':'00023.gif','24':'00024.gif','25':'00025.gif','26':'00026.gif','27':'00027.gif','28':'00028.gif','29':'00029.gif','30':'00030.gif',
'31':'00031.gif','32':'00032.gif','33':'00033.gif','34':'00034.gif','35':'00035.gif','36':'00036.gif','37':'00037.gif','38':'00038.gif','39':'00039.gif','40':'00040.gif'
};
Editor.smiles[0]=smiledefault;
//var smileother = {};
//smileother.name='其他';
//smileother.path='./smiles/default/';
//smileother.smiles={'11':'00011.gif','12':'00012.gif','13':'00013.gif','14':'00014.gif','15':'00015.gif','16':'00016.gif','17':'00017.gif','18':'00018.gif','19':'00019.gif','20':'00020.gif'};
//Editor.smiles[1]=smileother;
Editor.id='editor';
Editor.$=function(obj){if(typeof obj =='string')return document.getElementById(obj);else return obj;}
Editor.loadimg=function()
{
    
    this.statck['imgcache']=new Array();
     if(!Editor.is_ie)return;
     for(key in this.smiles)
     {
        var smilesObj = this.smiles[key];
        var data = smilesObj.smiles;
        for(id in data)
        {
            if(typeof this.statck['imgcache'][id]=='undefined')
            {   
                this.statck['imgcache'][id] = new Image(); 
                this.statck['imgcache'][id].src = smilesObj.path+data[id];
            }
        }
     }   
}
Editor.init=function()
{
	if(Editor.initialized)return;
	this.textobj = this.$(this.id+'_textarea');
	numargs   =   arguments.length;
	if(this.$(this.id + '_iframe')) {
			this.editbox = this.$(this.id + '_iframe');
			
	} else {
			var iframe = document.createElement('iframe');
			this.editbox = this.textobj.parentNode.appendChild(iframe);
			this.editbox.id = this.id + '_iframe';
			
		}
    this.loadimg();
	this.setEditorStyle();
	if(numargs>1){this.editbox.width = arguments[0];this.editbox.height = arguments[1];}
	this.editwin = this.editbox.contentWindow;
	this.editdoc = this.editwin.document;
	this.editdoc.designMode = 'on';
	this.editdoc.open('text/html', 'replace');
	this.editdoc.close();
	this.editdoc.body.contentEditable = true;
	Editor.initialized=true;
	this.editdoc.body.id='iframe_Body';
	this.editdoc.body.style.border = "0";
	this.editdoc.body.style.margin = "0";
    this.editdoc.body.style.backgroundColor="#FFF";
		if(this.is_moz || this.is_opera) {
			this.editwin.addEventListener('focus', function(e) {this.hasfocus = true;}, true);
			this.editwin.addEventListener('blur', function(e) {this.hasfocus = false;}, true);
			this.editwin.addEventListener('click', function(e) {Editor.hideSimleMenu();}, true);
			document.addEventListener('click', function(e) {var e = arguments[0] || window.Event;var srcElement = e.srcElement || e.target;if(!srcElement.id || srcElement.id.indexOf(Editor.id+'_cmd')!==0)Editor.hideSimleMenu();}, true);
		} else {
			this.editdoc.attachEvent("onclick",function(e){Editor.hideSimleMenu();});
			document.attachEvent("onclick",function(e){
			if(!e.srcElement.id || e.srcElement.id.indexOf(Editor.id+'_cmd')!==0)Editor.hideSimleMenu();
			});
		}
}
Editor.setEditorStyle =function()
{
	if(this.editcss == null) {
	var ln= this.csspath.length;
		for(var i=0;i<ln;i++)
		{
			this.editcss = document.createElement('link');
			this.editcss.type = 'text/css';
			this.editcss.rel = 'stylesheet';
			this.editcss.href = this.csspath[i];
			var headNode = document.getElementsByTagName("head")[0];//alert(this.editcss.href);
			headNode.appendChild(this.editcss);
		}
	}
}
Editor.popSimleMenu = function()
{
	var simlemenu = this.$(this.id+'_menu_smile');
	if(simlemenu ==null)
	{
		var div = document.createElement('div');
		div = document.body.appendChild(div);
		div.id = this.id+'_menu_smile';
		this.showSimleMenu();
		div.innerHTML = this.smiles2HTML(arguments[0]);
		
	}
	else 
	{
		
		if(simlemenu.style.display == 'none')
		{	
			var div = Editor.$(this.id+'_menu_smile');
			simlemenu.style.display = 'inline';
			var typeid = arguments[0]?arguments[0]:this.statck['smile_typeid'];
			if(arguments[0] && arguments[0] != this.statck['smile_typeid'])div.innerHTML = this.smiles2HTML(typeid);
		}
		else this.hideSimleMenu();
	}
}
Editor.showSimleMenu = function()
{
	var typeid = arguments[0]?arguments[0]:0;
	var div = Editor.$(this.id+'_menu_smile');
	this.statck['smile_typeid']=typeid;
	div.innerHTML = this.smiles2HTML(typeid);
	
	var simlemenu = this.$(this.id+'_menu_smile');if(!simlemenu)return;
	var obj = this.$(this.id+'_cmd_smile');if(!obj)return;
	var offset = this.fetchOffset(obj);
	simlemenu.style.left=offset.left+'px';
	simlemenu.style.top=offset.top+obj.offsetHeight+'px';
	simlemenu.style.position = 'absolute';
	simlemenu.style.display = 'inline';
}
Editor.fetchOffset=function(obj) {
	var left_offset = obj.offsetLeft;
	var top_offset = obj.offsetTop;
	while((obj = obj.offsetParent) != null) {
		left_offset += obj.offsetLeft;
		top_offset += obj.offsetTop;
	}
	return { 'left' : left_offset, 'top' : top_offset };
}
Editor.hideSimleMenu = function()
{var simlemenu = this.$(this.id+'_menu_smile');if(simlemenu)simlemenu.style.display='none';}
Editor.smiles2HTML =function ()
{
	var typeid = arguments[0]?arguments[0]:0;
	var htmlstr='<h4><span>';
	for(x in this.smiles)
	{
		htmlstr+='<a href="javascript:void(0);" onclick="Editor.showSimleMenu('+x+')">'+this.smiles[x].name+'</a>'
	}
	htmlstr += '</span></h4><table cellspacing="0" summary="smilies" id="table_smiles"><tbody>';
	
	var smilesObj = this.smiles[typeid];
	var data = smilesObj.smiles;
	var i=0;
     
	for(x in data)
	{
        if(i==0 || i%10==0)htmlstr += '<tr height="26">';
		htmlstr +='<td onclick="Editor.insertSmiley('+x+');Editor.hideSimleMenu();" id="smilie_'+x+'_parent">';
		htmlstr +='<img height="20" width="20"   id="smilie_'+x+'" src="'+smilesObj.path+data[x]+'"/></td>';
		if(i>0 && i%10==9)htmlstr += '</tr>';
		i++;
	}
	htmlstr += '</tbody></table>';
	return htmlstr;
}
Editor.insertSmiley=function()
{
	var smile_id = arguments[0]
	if(!smile_id)return;
	//var src = this.$('smilie_' + smile_id).src;
    var smilesObj = this.smiles[this.statck['smile_typeid']];
	var src = smilesObj.path+smilesObj.smiles[smile_id];
	if(this.is_moz) {
			
			if(this.isUndefined(selection)) {
				var selection = this.getSel();
				if(selection === false) {
					selection = '';
				} else {
				selection += '';
				}
			}
			var opentag = '[img]';
			var closetag = '[/img]';
			var text = opentag + src + closetag;
			this.editdoc.execCommand('InsertImage', false, src);return;
			this.insertText(text, this.strlen(opentag), this.strlen(closetag), false);
			/*
			var smilies = editdoc.body.getElementsByTagName('img');
			for(var i = 0; i < smilies.length; i++) {
				if(smilies[i].src == src && smilies[i].getAttribute('smilieid') < 1) {
					smilies[i].setAttribute('smilieid', smilieid);
					smilies[i].setAttribute('border', "0");
				}
			}
			*/
		} else {
			this.insertText('<img src="' + src + '" border="0"  alt="" />', false);
		}
}
Editor.insertText=function(text, movestart, moveend, select, sel, selection)
{
			this.checkFocus();
			if(!this.isUndefined(this.editdoc.selection) && this.editdoc.selection.type != 'Text' && this.editdoc.selection.type != 'None') {
				movestart = false;
				this.editdoc.selection.clear();
			}
			if(selection && selection.indexOf('IMG') == 1)
			{
				this.editdoc.selection.clear();
				sel = this.editdoc.selection.createRange();
			}
			if(this.isUndefined(sel)) {
				sel = this.editdoc.selection.createRange();
				
			}
			sel.pasteHTML(text);
			if(text.indexOf('\n') == -1) {
				if(!this.isUndefined(movestart)) {
					sel.moveStart('character', -this.strlen(text) + movestart);
					sel.moveEnd('character', -this.moveend);
				} else if(movestart != false) {
					sel.moveStart('character', -this.strlen(text));
				}
				if(!this.isUndefined(select) && select) {
					sel.select();
				}
			}
}
Editor.isUndefined=function(variable) {
	return typeof variable == 'undefined' ? true : false;
}
Editor.checkFocus = function () {
	if(!this.editwin.hasfocus) {
		this.editwin.focus();
	}
}
Editor.strlen=function (str) {
	return (this.is_ie && str.indexOf('\n') != -1) ? str.replace(/\r?\n/g, '_').length : str.length;
}
Editor.getSel=function(){
		if(this.is_moz || this.is_opera) {
			selection = this.editwin.getSelection();
			this.checkFocus();
			range = selection ? selection.getRangeAt(0) : this.editdoc.createRange();
			return this.readNodes(range.cloneContents(), false);
		} else {
			var range = this.editdoc.selection.createRange();
			if(range.htmlText && range.text) {
				return range.htmlText;
			} else {
				var htmltext = '';
				for(var i = 0; i < range.length; i++) {
					htmltext += range.item(i).outerHTML;
				}
				return htmltext;
			}
		}
}
Editor.readNodes=function(root, toptag) {
	var html = "";
	var moz_check = /_moz/i;
	switch(root.nodeType) {
		case Node.ELEMENT_NODE:
		case Node.DOCUMENT_FRAGMENT_NODE:
			var closed;
			if(toptag) {
				closed = !root.hasChildNodes();
				html = '<' + root.tagName.toLowerCase();
				var attr = root.attributes;
				for(var i = 0; i < attr.length; ++i) {
					var a = attr.item(i);
					if(!a.specified || a.name.match(moz_check) || a.value.match(moz_check)) {
						continue;
					}
					html += " " + a.name.toLowerCase() + '="' + a.value + '"';
				}
				html += closed ? " />" : ">";
			}
			for(var i = root.firstChild; i; i = i.nextSibling) {
				html += this.readNodes(i, true);
			}
			if(toptag && !closed) {
				html += "</" + root.tagName.toLowerCase() + ">";
			}
			break;

		case Node.TEXT_NODE:
			if(!this.isUndefined)html = htmlspecialchars(root.data);
			break;
	}
	return html;
}
Editor.getContent =function()
{
    this.textobj.value = this.editdoc.body.innerHTML;
}
Editor.setIframeValue =function(str)
{
     this.editdoc.body.innerHTML = str;
}

