var activeWin = 'Editor';

function init_editor() {
	if (isMSIE) {
		var app = document.getElementById("application");
		app.style.width = 671+'px';
	}

	//var override = readCookie('cmd_override');
	//if (override) 
	//	document.tfeEditor.cmd_override.value = override;
	//else 
		document.tfeEditor.cmd.value = "note";

	override_cmd(document.tfeEditor.cmd_override);
	//if (!override) 
		update_cmd_status("note");

	init_colorpicker();
	set_active('Editor');
}

function override_cmd(override) {
	if (override.value != "") {
	    	document.tfeEditor.cmd.style.backgroundColor = '#CCCCCC';
		document.tfeEditor.cmd.value = "";
	}
	else {
		document.tfeEditor.cmd.style.backgroundColor = '#FFFFFF';
	}
	//createCookie('cmd_override',override.value,1);
	update_cmd_status(override.value);
}

function update_cmd_status(cmd) {
	if (!cmd) {
		document.tfeEditor.cmd.value = "note";
		cmd = "note";
	}
	document.getElementById("CmdStatus").innerHTML = cmd;
}

function clear_override(cmd) {
	if (document.tfeEditor.cmd_override.value) {
		document.tfeEditor.cmd_override.value = "";
		override_cmd(document.tfeEditor.cmd_override);
	}
	update_cmd_status(cmd.value);
}

function set_active(winName)
{
	if (winName != activeWin) {
		var aWin = document.getElementById(activeWin + 'Window');
		var aTab = document.getElementById(activeWin + 'Tab');
		var nWin = document.getElementById(winName + 'Window');
		var nTab = document.getElementById(winName + 'Tab');

		aWin.style.display = 'none';
		nWin.style.display = 'block';
		
		aTab.className = '';
		nTab.className = 'current';

		activeWin = winName;
		createCode();
	}
	
	if (winName == 'Editor') {
		document.getElementById(winName + 'Text').focus();
		set_lastpos();
	}
}

function show_help() {
	var winLeft = (screen.width - 600) / 2;
	var winTop  = (screen.height - 500) / 2;
	var helpWin = window.open("help.html","HELP","scrollbars=1,statusbar=1,resizable=1,width=600,height=500,left=" + winLeft + ",top=" + winTop);
    helpWin.focus();
}

function set_lastpos() {
	if ( isMSIE && document.tfeEditor.EditorText.createTextRange ) {
		document.tfeEditor.EditorText.caretPos = document.selection.createRange().duplicate();
		lastpos = document.tfeEditor.EditorText.caretPos;
	}
}

function insert_text(text){
	if (isMSIE) {
		if (!lastpos.text.length) {
			lastpos.text = text;
		}
		else {
			lastpos.text = text + lastpos.text;
		}
	}
	else {
		var input = document.tfeEditor.EditorText;
	    var selectionStart = input.selectionStart;
	    var selectionEnd = input.selectionEnd;
		
		if(input.setSelectionRange && selectionStart != selectionEnd) {
			var selection = input.value.substring(selectionStart, selectionEnd);
			insert_text_mozilla(document.tfeEditor.EditorText,text + selection);
		}
		else
			insert_text_mozilla(document.tfeEditor.EditorText,text);
	}
}


function insert_color(text){
	if (isMSIE) {
		if (!lastpos.text.length)
			lastpos.text = text;
		else {
			var selection = lastpos.text.replace(/@[rbwcgmynRBWCGMY]/g,"");
			if (text != '@n') selection = text + selection + '@n';
			lastpos.text = selection;
		}
	}
	else {
		var input = document.tfeEditor.EditorText;
	    var selectionStart = input.selectionStart;
	    var selectionEnd = input.selectionEnd;
		
		if (input.setSelectionRange && selectionStart != selectionEnd) {
			var selection = input.value.substring(selectionStart, selectionEnd);
			selection = selection.replace(/@[rbwcgmynRBWCGMY]/g,"");
			if (text != '@n') selection = text + selection + '@n';
			insert_text_mozilla(input,selection);
		}
		else
			insert_text_mozilla(input,text);
	}
}

function insert_text_mozilla (input, replaceString) {
	if (input.setSelectionRange) {
		var selectionStart = input.selectionStart;
		var selectionEnd = input.selectionEnd;
		input.value = input.value.substring(0, selectionStart) + replaceString + input.value.substring(selectionEnd);
		input.setSelectionRange(selectionStart + replaceString.length,selectionStart + replaceString.length);
	}
}

function selectCode() {
     document.tfeEditor.CodeText.select();
}

function copy_clip(codetext) {
	if (window.clipboardData)
    {
		window.clipboardData.setData("Text", codetext);
		alert('Successfully copied editor code to the clipboard.');
    }
	else if (window.netscape) 
	{
    	try {
        	netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
			gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
  			gClipboardHelper.copyString(codetext);
			alert('Successfully copied editor code to the clipboard.');
        }
        catch (e)
        {
    		set_active('Code');
        	document.getElementById('copy_message').style.display = 'block';
    		setTimeout("selectCode()",150);
        };
   		return true;
    }
	return false;
}

function copy_message_keyPress (e) {
  	if (!isMSIE && e.ctrlKey && e.which == 99)
		document.getElementById('copy_message').style.display = 'none';
    return true;
}

function createCode()
{
	// Define Local Vars
	var cmd     = document.tfeEditor.cmd.value;
	var text    = document.tfeEditor.EditorText.value;
	var lines   = text.split(/\n/);
	var wrapped = new Array();
	var linenum = 1;
	var code    = "";

	if (document.tfeEditor.cmd_override.value != "")
    	cmd = document.tfeEditor.cmd_override.value;    
        
    if (!cmd)
    	cmd = document.tfeEditor.cmd[0].value;
            
	createPreview();

	// Handle Wrapping
	for (var i=0; i< lines.length; i++)
	{
		var tline = new Array();
		if (lines[i].length > 80 ) {
            tline = wrap_line(lines[i], true);
            lines = insertIntoArray(lines,i,true,tline);
		}
	}
	
	if (lines.join("\n") != "" && lines.join("\n") != null)	{
		// Create code from text
		for (var i=0;i<lines.length;i++) {
			if (lines[i] != null && lines[i] != '' && lines[i] != '\r' && !lines[i].match(/^\s+$/))	
				code += cmd + ' ' + linenum + ' ' + lines[i] + '\n';
			else 
				code += cmd + ' ' + (linenum-1) + ' ' + lines[i] + '\n';
			linenum += 2;
		}
	}
	
	linenum / 2 == Math.floor(linenum / 2) ? linenum-- : linenum-=2;

	var head = '';

	if (linenum > 0) {
		if (linenum > 100) head = cmd + ' 1-' + linenum + ' delete\n'; 
		else head = cmd + ' 1-100 delete\n';
	}
	
	code = code.replace(/\~([^\r\n])/g, "~~$1");
	
	// Update code field, set focus to it and select all
	document.tfeEditor.CodeText.value = head + code;
}

function createPreview() {
	var text = document.tfeEditor.EditorText.value;
	text = text.replace(/</g,"&lt;");

	var lines   = text.split(/\n/);
	var wrapped = new Array();

	// Handle Wrapping
	for (var i=0; i< lines.length; i++)
	{
		var tline = new Array();
		if (lines[i].length > 80) {
			tline = wrap_line(lines[i],false);
			lines = insertIntoArray(lines,i,true,tline);
			//i=-1;
		}
	}
	
	text = lines.join("\n");


	// Find color codes
	text = text.replace(/\r?\n/g,"|%n%|");
	while ( text.match(/@n/) ) {
		text = text.replace(/@n(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="normal">$1</span>$2');
	}
	while ( text.match(/@r/) ) {
		text = text.replace(/@r(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="dark-red">$1</span>$2');
	}
	while ( text.match(/@R/) ) {
		text = text.replace(/@R(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="bright-red">$1</span>$2');
	}
	while ( text.match(/@b/) ) {
		text = text.replace(/@b(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="dark-blue">$1</span>$2');
	}
	while ( text.match(/@B/) ) {
		text = text.replace(/@B(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="blue">$1</span>$2');
	}
	while ( text.match(/@w/) ) {
		text = text.replace(/@w(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="white">$1</span>$2');
	}
	while ( text.match(/@W/) ) {
		text = text.replace(/@W(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="bright-white">$1</span>$2');
	}
	while ( text.match(/@c/) ) {
		text = text.replace(/@c(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="dark-cyan">$1</span>$2');
	}
	while ( text.match(/@C/) ) {
		text = text.replace(/@C(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="bright-cyan">$1</span>$2');
	}
	while ( text.match(/@g/) ) {
		text = text.replace(/@g(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="dark-green">$1</span>$2');
	}
	while ( text.match(/@G/) ) {
		text = text.replace(/@G(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="bright-green">$1</span>$2');
	}
	while ( text.match(/@m/) ) {
		text = text.replace(/@m(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="purple">$1</span>$2');
	}
	while ( text.match(/@M/) ) {
		text = text.replace(/@M(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="pink">$1</span>$2');
	}
	while ( text.match(/@y/) ) {
		text = text.replace(/@y(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="dark-yellow">$1</span>$2');
	}
	while ( text.match(/@Y/) ) {
		text = text.replace(/@Y(.*)?(@[rbwcgmynRBWCGMY]|$)/g,'<span class="yellow">$1</span>$2');
	}
	text = text.replace(/@@/g,"@");
	text = text.replace(/\|%n%\|/g,"\n");
	
	document.getElementById('PreviewContent').innerHTML = '<pre>' + text + '</pre>';
	update_normals();
}

function update_normals() {
	// Fix "normal" tags
	var fg = readCookie('fg');
	var content = document.getElementById('PreviewContent');
	var spans = content.getElementsByTagName('SPAN');

	for (var i=0; i<spans.length; i++) {
		if (spans[i].className == "normal") {
			spans[i].style.color = fg;
		}
	}
}

function insertIntoArray(srcArr, insLoc, repl, insObj) {
  var top = (repl) ? srcArr.slice(0, insLoc) : srcArr.slice(0, insLoc+1);
  var end = (repl) ? srcArr.slice(insLoc+1) : srcArr.slice(insLoc+2);
  return top.concat(insObj, end);
}

function wrap_line(line)
{
	var wrapped = new Array();
	var done = false;
    	
	while (!done) {
		var still_big = false;
		var left;
		var right;
        
        // Handle Color Codes and at (@) symbols
		var color_codes = 0;
        var at_signs    = 0;
        var top         = 79;
        
		if (line.match(/@[rbwcgmynRBWCGMY]/))
			color_codes = line.match(/@([rbwcgmynRBWCGMY])/).length * 2;
		
		if (line.match(/@@/))
			at_signs = line.match(/(@@)/).length;

		top += color_codes + (at_signs*2);
        
        if (line.length - (color_codes + at_signs) >= 80)
		{
    		// Find break in line
    		for (var j=top; j>0; j--) {
				var results;
    			if (results = line.charAt(j).match(/([\s\-,\.])/)) {
    				left    = line.substring(0,j);
    				right   = line.substring(j+1,line.length);
    				if (results.length && results[0].match(/[\-,\.]/))
    					left += results[0];
    				break;
    			}
    		}
    
    		if (left && right) {
            	wrapped[wrapped.length] = left;
    			if (left.length != top+1)
    				wrapped[wrapped.length-1] += '\r';
                else if (left.charAt(left.length-1).match(/[\.,]/))
                    right = right.replace(/^\s+/,"");
    			
    			if (right.length > 80) {
    				still_big = true;
    				line = right;
    			}
    			else
    				wrapped[wrapped.length] = right;
    			
    			if (!still_big)
    				done = true;
    		}
    		else
    			done = true;
        }
        else {
        	wrapped[wrapped.length] = line;
        	done = true;
        }
	}
	
	return wrapped;
}

function cleanupText()
{
	// Define Local Vars
	var text   = document.tfeEditor.EditorText.value;
	var cmd    = document.tfeEditor.cmd.value;
	var lines  = text.split(/\n/);
	var clean  = "";
	
    if (document.tfeEditor.cmd_override.value != "")
    	cmd = document.tfeEditor.cmd_override.value;
        
    if (!cmd)
    	cmd = document.tfeEditor.cmd[0].value;
                
	// Cleanup Text
	for (var i=0;i<lines.length;i++) 
		clean += lines[i].replace(/^(-- MORE -- <[^>]+>\s)?\[\s*\d+\]  /,'') + '\n'
	clean = clean.replace(/\n$/,'');

	// Update text field
	document.tfeEditor.EditorText.value = clean;
}

function myKeyDown(e,input) 
{
    var keycode = (!isMSIE) ? e.which : e.keyCode;
	var text = '  ';

	if (keycode == 9)
	{
        if (isMSIE) {
    		if (input.createTextRange)
        		input.caretPos = document.selection.createRange().duplicate();
		 
        	if (input.caretPos) {
				var lines = input.caretPos.text.split(/\r?\n/);
				for( var i=0; i<lines.length; i++ ) {
					if(!e.shiftKey)
						lines[i] = text + lines[i];
					else
						lines[i] = lines[i].replace(text,"");
				}
				
				var ilines = input.value.split(/\r?\n/);
				//DO THIS LATER
				
				//BUGGY
				if (lines.length == 1 && input.caretPos.text.length) lines[lines.length-1] += "\n";
        		input.caretPos.text = lines.join("\n");
       		}
        	else
        		input.value  = text;
		}
        else {
			var selectionStart = input.selectionStart;
			var selectionEnd = input.selectionEnd;

			// Hack to keep Mozilla from executing default tab action
			input.cancelKeyPress = true;			
			
			if(input.setSelectionRange && selectionStart != selectionEnd) {
				var selection = input.value.substring(selectionStart, selectionEnd);
				var lines = selection.split(/\r?\n/);
				for( var i=0; i<lines.length; i++ ) {
					if(!e.shiftKey)
						lines[i] = text + lines[i];
					else
						lines[i] = lines[i].replace(text,"");
				}
				selection = lines.join("\n");
				insert_text_mozilla(input, selection);
				input.setSelectionRange(selectionStart, selection.length); 
			}
			else {
				insert_text_mozilla(input, text);
			}
        } 
		return false;
	}
}

function myKeyPress (e,input) {
	// Hack to keep Mozilla from executing default key action
	if (input.cancelKeyPress) {
		input.cancelKeyPress = false;
		return false;
	}
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

