var browser = navigator.userAgent.toLowerCase();
var isEditable = document.getElementById && document.designMode && !isSafari && !isKonqueror;
var isIE = ((browser.indexOf( "msie" ) != -1) && (browser.indexOf( "opera" ) == -1) && (browser.indexOf( "webtv" ) == -1));
var isGecko = (browser.indexOf( "gecko" ) != -1);
var isSafari = (browser.indexOf( "safari" ) != -1);
var isKonqueror = (browser.indexOf( "konqueror" ) != -1);

/**
 * Classe principal do editor
 * 
 * @param {String} id 			Id do textarea que ira virar o editor
 * @param {Object} attributes	parametros de configuracao
 */
Preceptor.widget.Editor = function( id , attributes )
{
	this.width    = attributes.width       || "550px";
	this.height   = attributes.height      || "350px";
	var className = attributes.className   || "pre_editor";
	
	this.toolbar   = attributes.toolbar    || "main";
	this.id        = id;
	
	var div = document.createElement( "DIV" );
	div.id = "pre_editor" + this.id;
	div.style.width 	= this.width;
	div.style.height 	= this.height;
	div.className = className;

	$( id ).parentNode.insertBefore( div , $( id ) );
	$( id ).style.display = 'none';
	
	this.init();
}

Preceptor.widget.Editor.prototype = {
	
	init: function(){
		this._createIframe();
		this._createToolbar();
		this._initEvents();
	},
	
	_initEvents: function(){
		YAHOO.util.Event.on( this._getDoc() , "keyup" , this.cleanHTML , this , true );
		YAHOO.util.Event.on( this._getDoc() , "mouseup" , this.setElement , this , true );
	},
	
	_initIframe: function(){
		var css = document.getElementsByTagName( "LINK" );
		var mainContent = '<html><head>';
		var html = $( this.id ).value;
			    
	    for( var i = 0; i < css.length; i++ )
	    {
	    	if( css[i].rel == "stylesheet" && css[i].type == "text/css" )
	    		mainContent += '<link rel="stylesheet" type="text/css" href="' + css[i].href + '">';
	    }
	    
	    html = this.cleanHTML( html );
	    mainContent += '</head><body style="background: none">' + html + '</body></html>' ;
		
	    this._getDoc().designMode = "On";
	    this._getDoc().open();
	    this._getDoc().write( mainContent );
	    this._getDoc().close();
	    this._getWindow().focus();
	},
	
	_createIframe: function(){
		var iframe = document.createElement("IFRAME");
		iframe.id = "pre_editor_iframe" + this.id;
		iframe.border = '0';
		iframe.frameBorder = '0';
		iframe.marginWidth =  '0';
		iframe.marginHeight = '0';
		iframe.leftMargin = '0';
		iframe.topMargin = '0';
		iframe.allowTransparency = 'true';
		iframe.width = this.width;
		iframe.height = this.height;
        
        $( "pre_editor" + this.id ).appendChild( iframe );
        
        //YAHOO.util.Event.on( "pre_editor_iframe" + this.id , "mouse" , function(){ alert("sodreeeeeee") } )
		this._initIframe();
	},
	
	_createToolbar: function(){
		new Preceptor.widget.Editor.Toolbar( this , { toolbar: this.toolbar } );
	},
	
	_getDoc: function(){
		return $( "pre_editor_iframe" + this.id ).contentWindow.document;
	},
	
	_getWindow: function(){
		return $( "pre_editor_iframe" + this.id ).contentWindow;
	},

	_getSelection: function()
	{
        var sel = null;
		
        if ( this._getDoc() && this._getWindow() ) 
        {
            if ( this._getDoc().selection ) 
                sel = this._getDoc().selection;
            else 
                sel = this._getWindow().getSelection();
        }
        
        return sel;
    },

    _getRange: function() 
    {
        var sel = this._getSelection();
		
		if( sel == null )
			return null;

        if ( isIE ) {
            try {
                return sel.createRange();
            } catch (e) {
                return null;
            }
        }

        if (sel.rangeCount > 0) {
            return sel.getRangeAt(0);
        }
        return null;

    },
    
    _hasSelection: function() {
        var sel = this._getSelection();
        var range = this._getRange();
        var hasSel = false;

        if (!sel || !range) {
            return hasSel;
        }

        //Internet Explorer
        if ( isIE ) {
            if (range.text) {
                hasSel = true;
            }
            if (range.html) {
                hasSel = true;
            }
        } else {
            if (sel && (sel.toString() !== '') && (sel !== undefined)) {
                hasSel = true;
            }
        }
        return hasSel;
    },

	_getSelectElement: function(){
		
		var doc = this._getDoc(),
        range = null,
        sel = null,
        elm = null;
		
        if ( isIE ) {
            this.currentEvent = this._getWindow().event; //Event utility assumes window.event, so we need to reset it to this._getWindow().event;
            range = this._getRange();
            
            if (range) {
                elm = range.item ? range.item(0) : range.parentElement();
                if (elm == doc.body) {
                    elm = null;
                }
            }
            if ((this.currentEvent !== null) && (this.currentEvent.keyCode === 0)) {
                elm = YAHOO.util.Event.getTarget(this.currentEvent);
            }
        } else {
            sel = this._getSelection();
            range = this._getRange();
			
            if (!sel || !range) {
                return null;
            }
            if (!this._hasSelection()) {
                if (sel.anchorNode && (sel.anchorNode.nodeType == 3)) {
                    if (sel.anchorNode.parentNode) { //next check parentNode
                        elm = sel.anchorNode.parentNode;
                    }
                    if (sel.anchorNode.nextSibling != sel.focusNode.nextSibling) {
                        elm = sel.anchorNode.nextSibling;
                    }
                }

                if (!elm) {
                    elm = range.commonAncestorContainer;
                    if (!range.collapsed) {
                        if (range.startContainer == range.endContainer) {
                            if (range.startOffset - range.endOffset < 2) {
                                if (range.startContainer.hasChildNodes()) {
                                    elm = range.startContainer.childNodes[range.startOffset];
                                }
                            }
                        }
                    }
                }
            }
        }
       	
        if (this.currentEvent !== null) {
            try {
                switch (this.currentEvent.type) {
                    case 'click':
                    case 'mousedown':
                    case 'mouseup':
                        elm = YAHOO.util.Event.getTarget(this.currentEvent);
                        break;
                    default:
                        //Do nothing
                        break;
                }
            } catch (e) {
            }
        } else if ( ( this.currentElement && this.currentElement[0] ) && ( !isIE ) ) {
            elm = this.currentElement[0];
        }
        
        if (!elm || !elm.tagName) {
            elm = doc.body;
        }
        
        if (elm && !elm.parentNode) { //Not in document
            elm = doc.body;
        }
        
        if (elm === undefined) {
            elm = null;
        }
        
        return elm;
	},
	
	getEditorHTML: function() {
        return this._getDoc().body.innerHTML;
    },
    
    cleanHTML: function( html ) 
    {
        //Make some backups...
	    html = html.replace(/<div><br><\/div>/gi, '<YUI_BR>');
	    html = html.replace(/<p>(&nbsp;|&#160;)<\/p>/g, '<YUI_BR>');            
	    html = html.replace(/<p><br>&nbsp;<\/p>/gi, '<YUI_BR>');
	    html = html.replace(/<p>&nbsp;<\/p>/gi, '<YUI_BR>');
	    html = html.replace(/<br class="khtml-block-placeholder">/gi, '<YUI_BR>');
	    html = html.replace(/<br>/gi, '<YUI_BR>');
	    html = html.replace(/<br\/>/gi, '<YUI_BR>');
	    html = html.replace(/<img([^>]*)>/gi, '<YUI_IMG$1>');
	    html = html.replace(/<ul([^>]*)>/gi, '<YUI_UL$1>');
	    html = html.replace(/<\/ul>/gi, '<\/YUI_UL>');

        //Convert b and i tags to strong and em tags
	    html = html.replace(/<i([^>]*)>/gi, '<em$1>');
	    html = html.replace(/<\/i>/gi, '</em>');
	    html = html.replace(/<b([^>]*)>/gi, '<strong$1>');
	    html = html.replace(/<\/b>/gi, '</strong>');

	    html = html.replace(/<font/gi, '<font');
	    html = html.replace(/<\/font>/gi, '</font>');
	    html = html.replace(/<span/gi, '<span');
	    html = html.replace(/<\/span>/gi, '</span>');
	    html = html.replace(/<u/gi, '<u');
	    html = html.replace(/\/u>/gi, '/u>');

	    html = html.replace(/<ol([^>]*)>/gi, '<ol$1>');
	    html = html.replace(/\/ol>/gi, '/ol>');
	    html = html.replace(/<li/gi, '<li');
	    html = html.replace(/\/li>/gi, '/li>');

        //Handle the sudo A tags
        html = html.replace(new RegExp('<span ([^>]*) tag="a" ([^>]*)>([^>]*)<\/span>', 'gi'), '<a $1 $2>$3</a>');

        //yui-tag-a yui-tag yui-non yui-img
	    html = html.replace(/yui-tag-a/gi, '');
	    html = html.replace(/yui-tag-span/gi, '');
	    html = html.replace(/yui-tag/gi, '');
	    html = html.replace(/yui-non/gi, '');
	    html = html.replace(/yui-img/gi, '');
	    html = html.replace(/ tag="span"/gi, '');
	    html = html.replace(/ class=""/gi, '');
	    html = html.replace(/ class=" "/gi, '');
	    html = html.replace(/ class="  "/gi, '');
	    html = html.replace(/ target=""/gi, '');
	    html = html.replace(/ title=""/gi, '');

        //Other string cleanup
	    html = html.replace(/<br><li/gi, '<li');
        
        //Replace our backups with the real thing
	    html = html.replace(/<YUI_BR>/g, '<br>');
	    html = html.replace(/<YUI_IMG([^>]*)>/g, '<img$1>');
	    html = html.replace(/<YUI_UL([^>]*)>/g, '<ul$1>');
	    html = html.replace(/<\/YUI_UL>/g, '<\/ul>');
		html = html.replace(/%u201C/g, '"');
		html = html.replace(/%u201D/g, '"');
		
        return html;
    },
    
    setElement: function()
	{
		this.element = this._getSelectElement();
	},
	
	getElement: function()
	{
		return this.element;
	},
	
    update: function()
	{
		var textarea = $( this.id );
	  	textarea.value = this._getDoc().body.innerHTML;
	},
    
    refresh: function()
	{
		var textarea = $( this.id );
	  	this._getDoc().body.innerHTML = textarea.value;
	}
}

/**
 * Classe de criacao da toolbar do editor
 * @param {Object} objeto Preceptor.widget.Editor que o toolbar vai usar
 */
Preceptor.widget.Editor.Toolbar = function( editor , attributes )
{
	/**
	 * Preceptor.widget.Editor 
	 */
	var editor = editor;
	
	var object , sel , rng;
	
	/* Tipos de configuracao de barra disponiveis */
	var simple 	 = [ "bold" , "italic" , "underline" , "createlink" , "text" ];
	var main 	 = [ "bold" , "italic" , "underline" , "createlink" , "justifyleft" , "justifycenter" , "justifyright" , "justifyfull" ];
	var advanced = [ "bold" , "italic" , "underline" , "createlink" , "text" , "bgcolor" , "justifyleft" , "justifycenter" , "justifyright" , "justifyfull" , "unorderedlist" , "orderedlist" , "alignobject" , "uploadimage" , "openInsertHTML" , "insertfile" , "inserttable" ];
	var titles	 = [ "Negrito" , "Itálico" , "Sublinhado" , "Link" , "Propriedades do texto" , "Cor de fundo" , "Alinhar à esquerda" , "Alinhar ao centro" , "Alinhar à direita" , "Alinhar justificado" , "Listagem" , "^Listagem numérica" , "Alinhamento" , "Galeria de imagens" , "Inserir embed" , "Inserir arquivo" , "Inserir tabela" ];

	
	var bold 			= function(){ _execCommand( "bold" ) }
	var italic 			= function(){ _execCommand( "italic" ) }
	var underline 		= function(){ _execCommand( "underline" ) }
	var justifyleft 	= function(){ _execCommand( "justifyleft" ) }
	var justifycenter 	= function(){ _execCommand( "justifycenter" ) }
	var justifyright 	= function(){ _execCommand( "justifyright" ) }
	var justifyfull 	= function(){ _execCommand( "justifyfull" ) }
	var unorderedlist 	= function(){ _execCommand( "InsertUnorderedList" ) }
	var orderedlist 	= function(){ _execCommand( "InsertOrderedList" ) }
	
	var createlink = function( ev )
	{
		var link = "http://";
		var a = editor.getElement();
		if( a.href ) link = a.href;
		
		var url = prompt( "Endereço: " , link );
   		
   		if ( ( url != null ) && ( url != "" ) ) 
   		{
      		_execCommand( "createlink" , false , url );
      		a = editor.getElement();
      		if ( confirm( "Deseja que este link abra em nova janela:" ) )
      			a.target = "_blank";
   		}
   		else
   			_execCommand( "Unlink" );
   			
		//object = editor._getSelectElement();
		//if( object.tagName != "BODY" )
		//{
		//	$( 'editor_createlink_input' + editor.id ).value = editor._getSelectElement().href || 'http://';
		//	if ( editor._getSelectElement().target )
		//		$( 'editor_createlink_check' + editor.id ).checked = true;
		//	else
		//		$( 'editor_createlink_check' + editor.id ).checked = false;
		//}
		
		//$( "pre_editor_createlink" + editor.id ).style.left = YAHOO.util.Dom.getX( YAHOO.util.Event.getTarget( ev ) ) + "px";
		//$( "pre_editor_createlink" + editor.id ).style.top  = YAHOO.util.Dom.getY( YAHOO.util.Event.getTarget( ev ) ) + 20 + "px";
	
		//Preceptor.util.Toggle.showHidden( "pre_editor_createlink" + editor.id )
	}
	
	var text = function( ev )
	{
		$( "pre_editor_textAttributes" + editor.id ).style.left = YAHOO.util.Dom.getX( YAHOO.util.Event.getTarget( ev ) ) + "px";
		$( "pre_editor_textAttributes" + editor.id ).style.top  = YAHOO.util.Dom.getY( YAHOO.util.Event.getTarget( ev ) ) + 20 + "px";
		Preceptor.util.Toggle.showHidden("pre_editor_textAttributes" + editor.id);
	}
	
	var color = function( ev )
	{
		$( "pre_editor_color" + editor.id ).style.left = YAHOO.util.Dom.getX( YAHOO.util.Event.getTarget( ev ) ) - 200 + "px";
		$( "pre_editor_color" + editor.id ).style.top  = YAHOO.util.Dom.getY( YAHOO.util.Event.getTarget( ev ) ) + 30 + "px";
		Preceptor.util.Toggle.showHidden("pre_editor_color" + editor.id);
	}
	
	var bgcolor = function( ev )
	{
		Preceptor.widget.Editor.object = editor._getSelectElement();
		$( "pre_editor_bgcolor" + editor.id ).style.left =  YAHOO.util.Dom.getX( YAHOO.util.Event.getTarget( ev ) ) + "px";
		$( "pre_editor_bgcolor" + editor.id ).style.top  =  YAHOO.util.Dom.getY( YAHOO.util.Event.getTarget( ev ) ) + 20 + "px";
		Preceptor.util.Toggle.showHidden( "pre_editor_bgcolor" + editor.id )
	}
	
	var alignobject = function( ev )
	{
		object = editor._getSelectElement();
		
		if( object.tagName != "BODY" )
		{
			$( 'editor_align_border' + editor.id ).value = parseInt( object.style.borderWidth ) || 0;
			$( 'editor_align_margin' + editor.id ).value = parseInt( object.style.margin ) || 0;
			$( 'editor_align_align' + editor.id ).value = YAHOO.util.Dom.getStyle( object , "float" ) || "left";
		}
		
		$( "pre_editor_alignobject" + editor.id ).style.left = YAHOO.util.Dom.getX( YAHOO.util.Event.getTarget( ev ) ) + "px";
		$( "pre_editor_alignobject" + editor.id ).style.top  = YAHOO.util.Dom.getY( YAHOO.util.Event.getTarget( ev ) ) + 20 + "px";
	
		Preceptor.util.Toggle.showHidden( "pre_editor_alignobject" + editor.id )	
	}
	
	var uploadimage = function( ev )
	{	
		var div = Preceptor.widget.use.box(true , '/image/keep' , 'select' );
		div.style.border = 'solid 1px black';
		
		new Preceptor.util.AjaxUpdate( 'lightbox' , URL + "/image" );
		window.location = '#lightbox';
		
	};
	
	var inserttable = function( ev , rows , cols )
	{
		if( rows && cols )
		{
			var table = document.createElement("TABLE");
			var div = document.createElement("DIV");
			
			table.cellPadding = "5";
			table.style.width = "100%";
			table.border = "1";
			
			var tbody = document.createElement("TBODY");
			for ( i = 0; i < rows; i++ )
			{
				var tr = document.createElement("TR");
				for ( j = 0; j < cols; j++ )
				{
					var td = document.createElement("TD");
					td.innerHTML = "&nbsp;&nbsp;";
					tr.appendChild( td );
				}
				tbody.appendChild( tr );
			}
			
			table.appendChild( tbody );
			div.appendChild( table );
			editor._getDoc().body.innerHTML += div.innerHTML;
		}
		
		$( "pre_editor_table" + editor.id ).style.left = YAHOO.util.Dom.getX( YAHOO.util.Event.getTarget( ev ) ) + "px";
		$( "pre_editor_table" + editor.id ).style.top  = YAHOO.util.Dom.getY( YAHOO.util.Event.getTarget( ev ) ) + 20 + "px";
	
		Preceptor.util.Toggle.showHidden( "pre_editor_table" + editor.id )
	};
	
	var insertfile = function( ev )
	{
		var div = Preceptor.widget.use.box(true , '/file/keep' , 'filter' );
		div.style.border = ' solid 1px black';
		
		new Preceptor.util.AjaxUpdate( 'lightbox' , URL + "/file" );
		window.location = '#lightbox';
	};
	
	var openInsertHTML = function( ev )
	{
		sel = editor._getSelection();
		rng = editor._getRange();
		
		$( "editor_main_html" + editor.id ).style.left = YAHOO.util.Dom.getX( YAHOO.util.Event.getTarget( ev ) ) + "px";;
		$( "editor_main_html" + editor.id ).style.top  = YAHOO.util.Dom.getY( YAHOO.util.Event.getTarget( ev ) ) + 20 + "px";
		
		Preceptor.util.Toggle.showHidden( "editor_main_html" + editor.id )
	}
	
	this._createButton = function( command , className , title )
	{
		var button = document.createElement("A");
		var toolbar = $( 'pre_editor_toolbar' + editor.id );
		
		button.className = "pre_editor_button " + className;
		button.href      = "#" + command;
		button.title	 = title;
			
		YAHOO.util.Event.on( button , 'click' , eval( command ) );
		toolbar.appendChild( button );
	}
	
	
	var _execCommand = function( command , flag , option )
	{
		var flag = flag || false;
		var option = option || "";

		try 
		{
			editor._getWindow().focus();
			editor._getDoc().execCommand( command , flag , option );
			editor._getWindow().focus();
			
		}catch(e){ alert( e.message ) }
	}
	
	var setColor = function( ev )
	{
		var el = YAHOO.util.Event.getTarget( ev );
		Preceptor.util.Toggle.showHidden( "pre_editor_color" + editor.id );
		Preceptor.util.Toggle.showHidden( "pre_editor_textAttributes" + editor.id );
		_execCommand( "ForeColor" , false , el.title );
	}
	
	var setFontName = function( value )
	{
		Preceptor.util.Toggle.showHidden( "pre_editor_textAttributes" + editor.id );
		_execCommand( "FontName" , false , value);
	}
	
	var setFontSize = function( value )
	{
		Preceptor.util.Toggle.showHidden( "pre_editor_textAttributes" + editor.id );
		_execCommand( "FontSize" , false , value );
	}
	
	var setBgColor = function( ev )
	{
		var el = YAHOO.util.Event.getTarget( ev );
		
		if( Preceptor.widget.Editor.object.tagName == "TABLE" )
			Preceptor.widget.Editor.object.style.backgroundColor = el.title;		
		else
			_execCommand( (isIE)?("backcolor"):("hilitecolor") , false , el.title );
			
		Preceptor.util.Toggle.showHidden("pre_editor_bgcolor" + editor.id)
	}
	
	this._createTableColor = function(  command , func )
	{
		var divColor = document.createElement("DIV");
		divColor.id = "pre_editor_" + command + editor.id ;
		divColor.style.display = "none";
		divColor.className	   = 'pre_editor_color_table';

		var table = document.createElement("TABLE");
		table.cellPadding = "0";
		table.cellSpacing = "1";
		
		var tbody = document.createElement("TBODY");
		var wC = new Array("00","66","CC","FF")  //color table
		for ( i = 0; i < wC.length; i++ )
		{
			var tr = document.createElement("TR");
			for ( j = 0; j < wC.length; j++ )
			{
				for ( k = 0; k < wC.length; k++ )
				{
					var clr  = wC[i] + wC[j] + wC[k];
					var td   = document.createElement("TD");
					var link = document.createElement("A");

					link.title = "#" + clr;
					link.href = "#this";
					link.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;";
					YAHOO.util.Event.on( link , 'click' , eval( func ) );

					td.style.backgroundColor = '#' + clr;
					td.style.fontSize = "11px";
					td.appendChild( link );
					tr.appendChild( td );
				}
			}
			tbody.appendChild( tr );
 		}
 		table.appendChild( tbody );
		divColor.appendChild(table);
		$( "pre_editor" + editor.id ).appendChild( divColor );
	}

	this._createAlign = function()
	{
		var editorObject           = document.createElement( "DIV" );
		editorObject.id            = "pre_editor_alignobject" + editor.id;
		editorObject.style.padding = '5px';
		editorObject.style.width   = '195px';
		editorObject.style.display = 'none';
		editorObject.className	   = 'pre_editor_alignobject_table';

		var editorObjectLabel = document.createElement('SPAN');
		editorObjectLabel.innerHTML   = "<b>Borda: </b>";
		
		var editorObjectInput = document.createElement('INPUT');
		editorObjectInput.id = 'editor_align_border' + editor.id;
		editorObjectInput.value = "0";
		editorObjectInput.style.width = "30px";

		var editorObjectLabel1 = document.createElement('SPAN');
		editorObjectLabel1.innerHTML = "&nbsp;<b>Margem: </b>";

		var editorObjectInput1 = document.createElement('INPUT');
		editorObjectInput1.id = 'editor_align_margin' + editor.id;
		editorObjectInput1.value = "0";
		editorObjectInput1.style.width   = "30px";

		editorObject.appendChild( editorObjectLabel );
		editorObject.appendChild( editorObjectInput );
		editorObject.appendChild( editorObjectLabel1 );
		editorObject.appendChild( editorObjectInput1 );	
		editorObject.appendChild( document.createElement("BR") );
		
		var aligns = ['left','center','right'];
		var alignButton = [];
		
		for( var i=0; i < aligns.length; i++ )
		{
			alignButton.push( document.createElement('A') );
			alignButton[i].href  = "#this";
			alignButton[i].title = aligns[i];
			alignButton[i].className = "pre_editor_align pre_editor_align_" + aligns[i];
			YAHOO.util.Event.on( alignButton[i] , 'click' , function(){
				$( 'editor_align_align' + editor.id ).value = this.title;	
			});
			editorObject.appendChild( alignButton[i] );
		}
		
		var editorObjecthidden = document.createElement('INPUT');
		editorObjecthidden.type  = "hidden";
		editorObjecthidden.id  = 'editor_align_align' + editor.id;
		
		var editorObjectsubmit = document.createElement('INPUT');
		editorObjectsubmit.type  = "button";
		editorObjectsubmit.value = "Ok";
		YAHOO.util.Event.on( editorObjectsubmit , 'click' , insertAlign );

		editorObject.appendChild( editorObjectsubmit );
		editorObject.appendChild( editorObjecthidden );

		$( "pre_editor" + editor.id ).appendChild( editorObject );

	}
	
	this._createLinkDiv = function()
	{
		var editorLink           = document.createElement( "DIV" );
		editorLink.id            = "pre_editor_createlink" + editor.id;
		editorLink.style.padding = '5px';
		editorLink.style.width   = '233px';
		editorLink.style.display = 'none';
		editorLink.className	 = 'pre_editor_createlink_table';

		var editorLinkControll   = document.createElement( "DIV" );
		editorLinkControll.style.marginBottom = "7px";
		
		var editorLinkLabel = document.createElement('SPAN');
		editorLinkLabel.innerHTML   = "<b>Endereço: </b>";
	
		var editorLinkInput = document.createElement('INPUT');
		editorLinkInput.id = 'editor_createlink_input' + editor.id;
		editorLinkInput.value = "http://";
		editorLinkInput.style.width = "160px";
		
		var editorLinkCheck = document.createElement('INPUT');
		editorLinkCheck.id = 'editor_createlink_check' + editor.id;
		editorLinkCheck.type = "checkbox";
		
		var editorLinkLabelCheck = document.createElement('SPAN');
		editorLinkLabelCheck.innerHTML   = " <b>Abrir em nova janela: </b>";
		
		editorLink.appendChild( editorLinkControll );
		editorLinkControll.appendChild( editorLinkLabel );
		editorLinkControll.appendChild( editorLinkInput );
		editorLink.appendChild( editorLinkCheck );
		editorLink.appendChild( editorLinkLabelCheck );
		
		editorLink.appendChild( document.createElement("BR") );
		editorLink.appendChild( document.createElement("BR") );
		
		var editorObjecthidden = document.createElement('INPUT');
		editorObjecthidden.type  = "hidden";
		editorObjecthidden.id  = 'editor_link_link' + editor.id;
		
		var editorObjectsubmit = document.createElement('INPUT');
		editorObjectsubmit.type  = "button";
		editorObjectsubmit.value = "Ok";
		
		YAHOO.util.Event.on( editorObjectsubmit , 'click' , insertLink )
			
		editorLink.appendChild( editorObjectsubmit );
		
		$( "pre_editor" + editor.id ).appendChild( editorLink );
	}
	
	this._createTable = function()
	{
		var div = document.createElement("DIV");
		div.id = "pre_editor_table" + editor.id ;
		div.style.display = "none";
		div.className	  = 'pre_editor_table';
		
		var table = document.createElement("TABLE");
		table.cellPadding = "5";
		table.cellSpacing = "5";
		table.border = "1";
		
		var tbody = document.createElement("TBODY");
		for ( i = 0; i < 4; i++ )
		{
			var tr = document.createElement("TR");
			for ( j = 0; j < 4; j++ )
			{
				var td   = document.createElement("TD");
				var link = document.createElement("A");

				link.title = (i+1) + " linha(s) " + (j+1) + " coluna(s)";
				link.href = "#this";
				link.innerHTML = (i+1) + "-" + (j+1);
				link.className = "pre_editor_table_link";
				
				YAHOO.util.Event.on( link , 'click' , clickTable( i , j ) );
					
				td.appendChild( link );
				tr.appendChild( td );
			}
			tbody.appendChild( tr );
		}
		
		table.appendChild( tbody );
		div.appendChild( table );
		
		$( "pre_editor" + editor.id ).appendChild( div );
	}
	
	this._createTextAttributes = function()
	{
		var div = document.createElement("DIV");
		var link = document.createElement("A");
		
		div.style.display = "none";
		div.id = "pre_editor_textAttributes" + editor.id;
		div.className = "pre_editor_textAttributes";
		
		var fontNames = ["Arial","Arial Narrow","Comic Sans MS","Courier","Georgia","Impact","Tahoma","Times New Roman","Verdana"];
		var fontSizes = [1,2,3,4,5,6,7];
		
		var selectFontName = createSelect( fontNames , setFontName );
		var selectFontSize = createSelect( fontSizes , setFontSize );
		
		link.title = "Escolha a cor";
		link.href = "#this";
		link.innerHTML = "Cor";
		
		YAHOO.util.Event.on( link , 'click' , color );
		
		div.appendChild( selectFontName );
		div.appendChild( document.createElement("BR") );
		div.appendChild( selectFontSize );
		div.appendChild( link );
		
		$( "pre_editor" + editor.id ).appendChild( div );
	}
	
	var createSelect = function( data , func )
	{
		var select = document.createElement("SELECT");
		
		for ( i = 0; i < data.length; i++ )
		{
			var option = document.createElement("OPTION");
			option.value = data[i];
			option.innerHTML = data[i]; 
			select.appendChild( option );
		}
		
		YAHOO.util.Event.on( select , "change" , function(){ func( this.value ) } );
		return select;
	}
	
	var clickTable = function( rows , cols )
	{
		return function( ev ){ inserttable( ev , ++rows , ++cols ) }
	}

	var insertAlign = function()
	{
		var border = $( "editor_align_border" + editor.id ).value;
		var margin = $( "editor_align_margin" + editor.id ).value;
		var align  = $( "editor_align_align"  + editor.id ).value;
	       
		object.style.border = border + "px solid black";
		object.style.margin = margin + "px";
		YAHOO.util.Dom.setStyle( object , "float" , align );
		
		Preceptor.util.Toggle.showHidden("pre_editor_alignobject" + editor.id);
	}
	
	var insertLink = function()
	{
		var link  = $( "editor_createlink_input" + editor.id ).value;
		var check = $( "editor_createlink_check" + editor.id ).checked;
	   		
   		if ( ! $( "editor_createlink_input" + editor.id ).value )
   		{
   			link = editor.getElement();
   			_execCommand( "Unlink" );
   		}
   		else
   		{
   			_execCommand( "createlink" , false , $( "editor_createlink_input" + editor.id ).value );
   			link = editor.getElement();
   			link.id = 'link' + editor.id;
   		}	
   		if ( check )
   			link.target = "_blank";	
   			
   		Preceptor.util.Toggle.showHidden("pre_editor_createlink" + editor.id);
	}
	
	var insertHTML = function( html )
	{
		var objectFragment 	  = '(?:<object.*?>)';
		var objectFragmentEnd = '(?:<\/object>)';
		var paramFragment  = '(?:<param.*?>)((\n|\r|.)*?)(?:<\/param>)';
		
		var html = $( "editor_html" + editor.id ).value;
		$( "editor_html" + editor.id ).value = "";
		
		html = html.replace( new RegExp( paramFragment, 'img'), '' );
		html = html.replace( new RegExp( objectFragment, 'img'), '' );
		html = html.replace( new RegExp( objectFragmentEnd, 'img'), '' );
		
		try {
			editor._getDoc().execCommand( "inserthtml" , false , html + sel );
		}
		catch ( e )
		{
			if ( editor._getDoc().selection )
			{
				rng.select(); //else IE gets lost
				html = html + rng.htmlText;
				try {
					editor._getDoc().selection.createRange().pasteHTML( html );
				}
				catch ( e ){}
			}
		}
		Preceptor.util.Toggle.showHidden("editor_main_html" + editor.id)
	}
	
	this._createInsertHTML = function(){
		var div         = document.createElement( "DIV" );
		var textarea 	= document.createElement('TEXTAREA');
		var input 		= document.createElement('INPUT');
		
		textarea.id 	= 'editor_html' + editor.id;
		textarea.style.width   = "200px";
		textarea.style.height  = "50px";

		input.type  = "button";
		input.value = "Inserir";
		YAHOO.util.Event.on( input , 'click' , insertHTML );

		div.id 			 = 'editor_main_html' + editor.id;
		div.className	 = 'pre_editor_inserthtml_table';
		div.style.display = 'none';
		
		div.appendChild( textarea );
		div.appendChild( document.createElement('BR') );
		div.appendChild( input );
		
		$( "pre_editor" + editor.id ).appendChild( div );
	}
	
	var div = document.createElement( "DIV" );
	div.id = "pre_editor_toolbar" + editor.id;
	div.className = "pre_editor_toolbar";
	
	var top = isIE?237:44;
	var left = isIE?15:5;
	
	div.style.top = $( "pre_editor" + editor.id ).offsetTop + top + "px";
	div.style.left = $( "pre_editor" + editor.id ).offsetWidth + left + $( "pre_editor" + editor.id ).offsetLeft + "px";
	
	var handle = document.createElement( "DIV" );
	handle.id = "pre_editor_toolbar_handle" + editor.id;
	handle.className = "pre_editor_toolbar_handle";

	div.appendChild( handle );
	
	$( "pre_editor" + editor.id ).appendChild( div );
	
	dd = new YAHOO.util.DD( 'pre_editor_toolbar' + editor.id );
	dd.setHandleElId( 'pre_editor_toolbar_handle' + editor.id );
		
	this.init( eval( attributes.toolbar ) , titles );
}

Preceptor.widget.Editor.Toolbar.prototype = {
	
	init: function( toolbar , titles ){

		this._createTableColor( "color" , "setColor" );
		this._createTableColor( "bgcolor" ,"setBgColor" );
		this._createAlign();
		this._createLinkDiv();
		this._createTable();
		this._createTextAttributes();
 		this._createInsertHTML();
			
		for( var i = 0; i < toolbar.length; i++ )
			this._createButton( toolbar[i] , "pre_editor_" + toolbar[i] , titles[i] );
	}
}

Preceptor.widget.Editor.object = {};

