/**
 *
 */
(function( jQuery ){
	jQuery.fn.bbarea = function(_options) {
		var options = jQuery.extend({
			b_bold: true,
			b_italic: true,
			b_underline: true,
			b_link: true,
			b_image: true,
			b_youtube: true,
			b_quote: true,
			b_ol: true,
			b_ul: true,
			b_big: true,
			b_small: true,
			b_hr: true,
			b_code: true,
			b_php: true,
			button_image: true,
			image_url: '/img/bbimage/'
		},_options);
		var bbareas = [];
		return this.each(function(){
			var $this = jQuery(this);
			 bbareas.push(new BBArea($this,options));
		});
	};
})( jQuery );

BBArea = function(textarea,params){
	this.params = jQuery.extend({
		b_bold: true,
		b_italic: true,
		b_underline: true,
		b_link: true,
		b_image: true,
		b_youtube: true,
		b_quote: true,
		b_ol: true,
		b_ul: true,
		b_big: true,
		b_small: true,
		b_hr: true,
		b_code: true,
		b_php: true,
		button_image: true,
		image_url: '/img/bbimage/'
	},params);
	this.area = textarea;
	this.buttons = {};
	this.buttonsFrame = null;
	this.buttonNames = {
		bold: 'полужирный',
		italic: 'курсив',
		underline: 'подчеркнутый',
		link: 'ссылка',
		image: 'картинка',
		youtube: 'видео с YouTube',
		quote: 'цитата',
		ol: 'нумерованный список',
		ul: 'маркированный список',
		big: 'увеличить размер шрифта',
		small: 'уменьшить размер шрифта',
		hr: 'горизонтальная черта',
		code: 'вставить код',
		php: 'вставить код на php'
	};
	
	this.init = function (){
		this.buttonsFrame = jQuery('<div></div>');
		this.buttonsFrame.addClass('bbarea-buttonbar');

		var buttonsList = ['bold','italic','underline','link','image','youtube','quote','ol','ul','big','small','hr','code','php']

		var $this = this;
		for(index=0;index<buttonsList.length;index++){
			var _button = buttonsList[index];
			if (this.params['b_'+_button])
			{
				var _$_ = '<a href="#'+_button+'" title="'+(this.buttonNames[_button])+'">'+(this.params.button_image?'<img src="'+this.params.image_url+'bb-'+_button+'.gif" alt="'+(_button)+'" />':+_button)+'</a>';
				this.buttons[_button] = jQuery(_$_);
				this.buttonsFrame.append(this.buttons[_button]);
				this.buttons[_button].click(function(el)
				{
					var action = jQuery(el.currentTarget).attr('href').substr(1);
					//alert(action);
					//console.debug($this)
					$this.handle(action);
					return false;
				});
			}

		}
		jQuery(this.area).wrap('<div class="bbcode_container"></div>');
		jQuery(this.area).before(this.buttonsFrame);
	};

	this.handle = function(action)
	{
		var name2tag = {
			bold:'b',
			italic:'i',
			underline:'u'
		}
		var start = '';
		var content = '';
		var end = '';
		var tag = action;
		switch (action) {
			default:
				return;
			case 'bold':
			case 'italic':
			case 'underline':
			case 'big':
			case 'small':
			case 'code':
			case 'php':
			case 'quote':
				// просто обертка
				if (name2tag[action]!=undefined){
					tag = name2tag[action];
				}
				this.insert('['+tag+']', '[/'+tag+']');
				break;
			case 'hr':
				// одиночный тег
				this.insert('', '['+tag+']');
				break;
			case 'ol':
			case 'ul':
				// списки
				var selected = this.getSelectionText();
				start = '['+tag+']';
				end = '\n[/'+tag+']';
				if (selected.length==0){
					content = '\n[li]item[/li]\n[li]item[/li]';
				} else {
					var lines = selected.split('\n');
					content='';
					for (var index=0;index<lines.length;index++){
						if (lines[index].length==0){continue;}
						content += '\n[li]'+lines[index]+'[/li]';
					}
					if (content.length==0){
						content = '\n[li]item[/li]\n[li]item[/li]';
					}
				}
				this.insert(start,end,content);
				break;
			case 'link':
				// ссыль
				var selected = this.getSelectionText();
				if (selected.length==0){
					var url = prompt("Введите адрес","http://");
					if (!url){return false;}
					var caption = prompt("Введите текст ссылки","");
					if (!caption){return false;}
					start = '[url=' + url + ']';
					content = caption;
					end='[/url]';
					this.insert(start,end,content);
				} else {
					var url = prompt("Введите адрес","http://");
					if (!url){return false;}
					start = '[url=' + url + ']';
					content = selected;
					end='[/url]';
					this.insert(start,end,content);
				}
				break;
			case 'image':
				// картинко
				var selected = this.getSelectionText();
				if (selected.length==0){
					var url = prompt("Введите адрес картинки","http://");
					if (!url){return false;}
					start = '[img]';
					content = url;
					end='[/img]';
					this.insert(start,end,content);
				} else {
					start = '[img]';
					end='[/img]';
					this.insert(start,end);
				}
				break;
			case 'youtube':
				var selected = this.getSelectionText();
				if (selected.length==0){
					var embed = prompt("Введите адрес видео или код вставки","");
				} else {
					var embed = selected;
				}
				if (!embed){return false;}
				if (embed.match(/^<iframe/)) {
//<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/qjx-wNkoqQ8" frameborder="0" allowfullscreen></iframe>
					var code = embed.match(/src=\"http:\/\/.+\/embed\/([^\"\/\']+)\"/);
				} else if (embed.match(/^<object/)) {
//<object width="480" height="390"><param name="movie" value="http://www.youtube.com/v/l9KnNvJadl0?fs=1&amp;hl=ru_RU"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/l9KnNvJadl0?fs=1&amp;hl=ru_RU" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="390"></embed></object>
					var code = embed.match(/value=\"http\:\/\/www.youtube.com\/v\/([^\?]+)\?/);					
				} else if (embed.match(/^http/)){
					var code = embed.match(/[\?\&]v\=([^&]+)/);
					// 2011-06-24 $sav
					// короткая ссылка
					if (!code) code = embed.match(/http\:\/\/youtu.be\/(.*$)/);
//http://www.youtube.com/watch?v=qjx-wNkoqQ8
//http://youtu.be/dD4p8wMBt_o
//http://www.youtube.com/watch?v=dD4p8wMBt_o&feature=youtu.be
				} else {
					code = null;
				}
				if (code==null){
					if (selected.length==0){
						alert('Некорректная ссылка или код');
						return false;
					} else {
						start = '[youtube]';
						end='[/youtube]';
						this.insert(start, end);
						return true;
					}
				}
				//console.debug(code);
				start = '[youtube]';
				content = code[1];
				end='[/youtube]';
				this.insert(start, end, content);
				break;
		}
	};

	this.getSelectionText = function(){
		e = this.area.get(0);
		if (document.selection) {
			jQuery(e).focus();
			var sel = document.selection.createRange();
			return sel.text;
		} else if (e.selectionStart || e.selectionStart == '0') {
			jQuery(e).focus();
			var startPos = e.selectionStart;
			var endPos = e.selectionEnd;
			return e.value.substring(startPos, endPos);
		}
		return '';
	}

	this.insert = function (start, end, contents)
	{
		e = this.area.get(0);
		if (document.selection) {
			jQuery(e).focus();
			var sel = document.selection.createRange();
			if (contents==undefined){
				contents = sel.text;
			}
			sel.text = start + contents + end;
		} else if (e.selectionStart || e.selectionStart == '0') {
			jQuery(e).focus();
			var startPos = e.selectionStart;
			var endPos = e.selectionEnd;
			if (contents==undefined){
				contents = e.value.substring(startPos, endPos);
			}

			e.value = e.value.substring(0, startPos) +
				start + contents + end +
				e.value.substring(endPos, e.value.length);

				var curspos = endPos+start.length+end.length;
				if(e.setSelectionRange)
				{
					e.setSelectionRange(curspos,curspos);
				} else if (e.createTextRange) {
					var range = e.createTextRange();
					range.collapse(true);
					range.moveEnd('character', curspos);
					range.moveStart('character', curspos);
					range.select();
				}
		} else {
			jQuery(e).val(jQuery(e).val()+start + end);
		}
	}
	
	this.init();
}
