

	var SyntaxHelperBar = Class.create();

	SyntaxHelperBar.prototype = {
		initialize: function() {
			this.registerTags();
			this.lastTextarea = '';
			new PeriodicalExecuter(this.repositionBar.bindAsEventListener(this), 1);
		},

		registerTags: function() {
			this.tags = new Object();

			this.tags.strong       = {'tagStart': '*','tagEnd': '*', 'autoClose': true};
			this.tags.emphasis     = {'tagStart': '_','tagEnd': '_', 'autoClose': true};
			this.tags.link         = {'tagStart': '"','tagEnd': '":http://', 'tagSolo': '"":http://'};
			this.tags.mailLink     = {'tagStart': '"','tagEnd': '":mailto:', 'tagSolo': '"":mailto:'};
			this.tags.linkInternal = {'tagStart': '"":[','tagEnd': ']', 'autoClose': true};
			this.tags.file         = {'tagStart': '(','tagEnd': ')', 'autoClose':true};
			this.tags.snippet      = {'tagStart': '[[','tagEnd': ']]', 'autoClose':true};
			this.tags.input        = {'tagStart': '[input]', 'tagEnd': '', 'autoClose': true, 'tagSolo': ''};
			this.tags.radio        = {'tagStart': '[radio]', 'tagEnd': '', 'autoClose': true, 'tagSolo': ''};
			this.tags.checkbox     = {'tagStart': '[checkbox]', 'tagEnd': '', 'autoClose': true, 'tagSolo': ''};
			this.tags.submit       = {'tagStart': '[submit]', 'tagEnd': '', 'autoClose': true, 'tagSolo': ''};
			this.tags.select       = {'tagStart': '[select]:"Option 1, Option2, Option 3"', 'tagEnd': '', 'autoClose': true, 'tagSolo': ''};

			if(Prototype.Browser.IE)
			{
				this.tags.bulletedList = {'tagStart': '* ','tagEnd': '\n', 'tagSolo': '* '};
				this.tags.orderedList  = {'tagStart': '# ','tagEnd': '\n', 'tagSolo': '# '};
				this.tags.h1 = {'tagStart': 'h1. ', 'tagEnd': '\n\n', 'autoClose': true, 'tagSolo': 'h1. '};
				this.tags.h2 = {'tagStart': 'h2. ', 'tagEnd': '\n\n', 'autoClose': true, 'tagSolo': 'h2. '};
				this.tags.h3 = {'tagStart': 'h3. ', 'tagEnd': '\n\n', 'autoClose': true, 'tagSolo': 'h3. '};
				this.tags.h4 = {'tagStart': 'h4. ', 'tagEnd': '\n\n', 'autoClose': true, 'tagSolo': 'h4. '};
				this.tags.h5 = {'tagStart': 'h5. ', 'tagEnd': '\n\n', 'autoClose': true, 'tagSolo': 'h5. '};
				this.tags.h6 = {'tagStart': 'h6. ', 'tagEnd': '\n\n', 'autoClose': true, 'tagSolo': 'h6. '};
			}
			else
			{
				this.tags.bulletedList = {'tagStart': '* ','tagEnd': '\n'};
				this.tags.orderedList  = {'tagStart': '# ','tagEnd': '\n'};
				this.tags.h1 = {'tagStart': '\nh1. ', 'tagEnd': '\n\n', 'autoClose': true};
				this.tags.h2 = {'tagStart': '\nh2. ', 'tagEnd': '\n\n', 'autoClose': true};
				this.tags.h3 = {'tagStart': '\nh3. ', 'tagEnd': '\n\n', 'autoClose': true};
				this.tags.h4 = {'tagStart': '\nh4. ', 'tagEnd': '\n\n', 'autoClose': true};
				this.tags.h5 = {'tagStart': '\nh5. ', 'tagEnd': '\n\n', 'autoClose': true};
				this.tags.h6 = {'tagStart': '\nh6. ', 'tagEnd': '\n\n', 'autoClose': true};
			}
		},
		
		showBar: function(textareaElement) {
			if((this.lastTextarea != $(textareaElement).id) || !$('syntaxHelperBar').visible())
			{
				if(typeof(this.lastTopPosition) != 'undefined') { this.lastTopPosition = 120;}
				this.lastTextarea = $(textareaElement).id;
				var self = this;
				if($('syntaxHelperBar').visible())
					Effect.SlideUp('syntaxHelperBar',{duration:0.1, queue: 'end', afterFinish:function(){
						Effect.SlideDown('syntaxHelperBar',{duration:0.3, queue: 'end'});
						self.positionBar();
					}});
				else
				{
					Effect.SlideDown('syntaxHelperBar',{duration:0.3,queue: 'end'});
					this.positionBar();
				}


				if(!$('syntaxHelperBarPane-main').visible())
				{
					$$('.syntaxHelperBarPane').invoke('hide');
					Effect.SlideDown($('syntaxHelperBarPane-main'),{duration:0.2});
				}
			}
			
		},
		
		positionBar: function() {
			var textareaElement = this.lastTextarea;
			$('syntaxHelperBar').style.left = ($(textareaElement).positionedOffset().left-$('syntaxHelperBar').getWidth()) + 'px';
			$('syntaxHelperBar').style.top  = ($(textareaElement).positionedOffset().top+60) + 'px';
		},
		
		repositionBar: function() {
			// return;
			var textareaElement = this.lastTextarea;
			

			if($('syntaxHelperBar') && $('syntaxHelperBar').visible() && $(textareaElement))
			{
				var leftPosition = $(textareaElement).positionedOffset().left-$('syntaxHelperBar').getWidth();
				$('syntaxHelperBar').style.left = leftPosition + 'px';

				// var topPosition = $(textareaElement).cumulativeScrollOffset().top;
				var topPosition = $$('body')[0].cumulativeScrollOffset().top;

				if(topPosition < 120)
					topPosition = 120;

				// var newPositionRatio = topPosition/this.lastTopPosition;
				// if((newPositionRatio <= 0.8) || (newPositionRatio >= 1.2))
				// {
					new Effect.Move('syntaxHelperBar', {y:topPosition, x:leftPosition, mode:'absolute',duration:0.2, queue: 'end'});
					this.lastTopPosition = topPosition;
				// }
				
				if(typeof(this.lastTopPosition) == 'undefined')
					this.lastTopPosition = topPosition;
			}
		},
		
		showPane: function(el, newPaneName) {
			if(!$('syntaxHelperBarPane-'+newPaneName))
				return false;
			else
			{
				Effect.SlideUp($(el).up('div.syntaxHelperBarPane'),{duration:0.2});
				Effect.SlideDown($('syntaxHelperBarPane-'+newPaneName),{duration:0.2});
			}
		},

		IELength: function(str) {
			var r = 0;
			for (i=0;i<str.length;i++) 
			{
				if(str.charAt(i) != '\n')
					r++;
			}
			return r;
		},

		insert: function(which, i, innerContent) {
			if(!which)
				myField = $(this.lastTextarea);
			else if(typeof(which) == 'string' || (which.tagName && which.tagName == 'TEXTAREA'))
				myField = $(which);
			else
			{
				myField = $(which).up('div').next('textarea');
			}

			if(typeof(innerContent) == 'undefined') innerContent = '';
			
			innerContent = innerContent.replace(/''/g,'"');
			// console.log(innerContent);
			
			//IE support
			if (document.selection) {
				myField.focus();
			    sel = document.selection.createRange();

				if (sel.text.length > 0) {
					if(i == 'linkInternal')
					{
						// alert('linkInternal');
						var tagStart = '"' + sel.text + '":[' + innerContent;
						// cursorPos += tagStart.length - (myField.value.substring(startPos, endPos).length-1);
					}
					else if(i == 'file' || i =='snippet')
					{
						if(i == 'file')
							var tagStart = '(' + innerContent;
						else
							var tagStart = '[[' + innerContent;
						cursorPos += tagStart.length - (myField.value.substring(startPos, endPos).length-1);
					}
					else
					{
						var tagStart = this.tags[i].tagStart + sel.text;
					}
					// sel.text = tagStart + sel.text + this.tags[i].tagEnd;
					sel.text = tagStart + this.tags[i].tagEnd;
					
				}
				else {
					// var tagToUse = (this.tags[i].tagSolo) ? this.tags[i].tagSolo : this.tags[i].tagStart;
					// if(this.tags[i].autoClose) tagToUse += this.tags[i].tagEnd;
									
					var tagToUse = (this.tags[i].tagSolo) ? this.tags[i].tagSolo : this.tags[i].tagStart;
					tagToUse += innerContent;
					if(this.tags[i].autoClose) tagToUse += this.tags[i].tagEnd;
					
					sel.text = tagToUse;

					var stored_range = sel.duplicate();
					stored_range.moveToElementText( myField );
					stored_range.setEndPoint( 'EndToEnd', sel );

					if(i == 'linkInternal')
						var originalPosition = this.IELength(stored_range.text) - tagToUse.length + 1;
					else if(this.tags[i].autoClose && !this.tags[i].tagEnd.empty() && i != 'file' && i != 'snippet')
						var originalPosition = this.IELength(stored_range.text) - this.tags[i].tagStart.length;
					else
						var originalPosition = this.IELength(stored_range.text);

					var textRange = myField.createTextRange(); 
					textRange.collapse(true);//go to beginning of range 
					textRange.moveEnd('character', originalPosition); 
					textRange.moveStart('character', originalPosition); 
					textRange.select();
				}
				myField.focus();
			}
			//MOZILLA/NETSCAPE support
			else if (myField.selectionStart || myField.selectionStart == '0') 
			{
				var startPos = myField.selectionStart;
				var endPos = myField.selectionEnd;
				var cursorPos = endPos;
				var scrollTop = myField.scrollTop;
				if (startPos != endPos) 
				{
					if(i == 'linkInternal')
					{
						var tagStart = '"' + myField.value.substring(startPos, endPos) + '":[' + innerContent;
						cursorPos += tagStart.length - (myField.value.substring(startPos, endPos).length-1);
					}
					else if(i == 'file' || i == 'snippet')
					{
						// var tagStart = '(' + innerContent;
						if(i == 'file')
							var tagStart = '(' + innerContent;
						else
							var tagStart = '[[' + innerContent;
						cursorPos += tagStart.length - (myField.value.substring(startPos, endPos).length-1);
					}
					else
					{
						var tagStart = this.tags[i].tagStart + myField.value.substring(startPos, endPos);
						cursorPos += this.tags[i].tagStart.length + this.tags[i].tagEnd.length;
					}
					
					myField.value = myField.value.substring(0, startPos)
					              + tagStart
					              + this.tags[i].tagEnd
					              + myField.value.substring(endPos, myField.value.length);
					
				}
				else 
				{
					var tagToUse = (this.tags[i].tagSolo) ? this.tags[i].tagSolo : this.tags[i].tagStart;
					tagToUse += innerContent;
					if(this.tags[i].autoClose) tagToUse += this.tags[i].tagEnd;

					myField.value = myField.value.substring(0, startPos) 
					              + tagToUse
					              + myField.value.substring(endPos, myField.value.length);
					
					if(i == 'linkInternal')
						cursorPos = startPos + 1;
					else if(i == 'file' || i == 'snippet')
						cursorPos += this.tags[i].tagStart.length + innerContent.length + this.tags[i].tagEnd.length;
					else
						cursorPos = startPos + this.tags[i].tagStart.length;
				}
				myField.focus();
				myField.selectionStart = cursorPos;
				myField.selectionEnd = cursorPos;
				myField.scrollTop = scrollTop;
			}
			else
			{
				// console.log('say what?');
			}
			// else {
			// 	if (this.tags[i].tagEnd == '') {
			// 		myField.value += this.tags[i].tagStart;
			// 		edAddTag(which, i);
			// 	}
			// 	else {
			// 		myField.value += this.tags[i].tagEnd;
			// 		edRemoveTag(which, i);
			// 	}
			// 	myField.focus();
			// }
		}
	};

	var syntaxHelperBar = new SyntaxHelperBar();

