(function(jQuery) {	
	
	jQuery.fn.commentsSmilies = function(textarea,index, toClose){					
		if ( jQuery.isFunction(this.each) ) {												
			return this.each(function() {
				var self = this;							
				if (jQuery(this).data('commentsSmilies.instance') == undefined ) {
					jQuery(this).data('commentsSmilies.instance', new jQuery.fn.commentsSmilies());										
					jQuery(this).data('commentsSmilies.instance').initialize(self,textarea,index,toClose);										
				}													
			});			
		}			
	}
	
	jQuery.extend(jQuery.fn.commentsSmilies.prototype, {			
		
		smiles : {
			smile:{
				icons:{
					' :D ':'/images/smilies/icon_biggrin.gif',
					' :) ':'/images/smilies/icon_smile.gif',
					' :( ':'/images/smilies/icon_sad.gif',
					' :o ':'/images/smilies/icon_surprised.gif',
					' :nomoney: ':'/images/smilies/nomoney.gif',
					' :? ':'/images/smilies/icon_confused.gif',
					' 8) ':'/images/smilies/icon_cool.gif',
					' :lol: ':'/images/smilies/icon_lol.gif',
					' :x ':'/images/smilies/icon_mad.gif',
					' :p ':'/images/smilies/icon_razz.gif',
					' :oops: ':'/images/smilies/icon_redface.gif',
					' :cry ':'/images/smilies/icon_cry.gif',
					' :evil: ':'/images/smilies/icon_evil.gif',
					' :rool: ':'/images/smilies/icon_rolleyes.gif',
					' ;) ':'/images/smilies/icon_wink.gif',
					' :!: ':'/images/smilies/icon_exclaim.gif',
					' :?: ':'/images/smilies/icon_question.gif',
					' :idea: ':'/images/smilies/icon_idea.gif',
					' :money: ':'/images/smilies/money.GIF',
					' :liux: ':'/images/smilies/liux.GIF'	
				},
				wrapper:5
			},
			
			cards:{
				icons:{
					' :2d ': '/images/smilies/2d.gif',
					' :3d ': '/images/smilies/3d.gif',
					' :4d ': '/images/smilies/4d.gif',
					' :5d ': '/images/smilies/5d.gif',
					' :6d ': '/images/smilies/6d.gif',
					' :7d ': '/images/smilies/7d.gif',
					' :8d ': '/images/smilies/8d.gif',
					' :9d ': '/images/smilies/9d.gif',
					' :10d ': '/images/smilies/10d.gif',
					' :Jd ': '/images/smilies/jd.gif',
					' :Qd ': '/images/smilies/qd.gif',
					' :Kd ': '/images/smilies/kd.gif',
					' :Ad ': '/images/smilies/ad.gif',
					
					' :2c ': '/images/smilies/2c.gif',
					' :3c ': '/images/smilies/3c.gif',
					' :4c ': '/images/smilies/4c.gif',
					' :5c ': '/images/smilies/5c.gif',
					' :6c ': '/images/smilies/6c.gif',
					' :7c ': '/images/smilies/7c.gif',
					' :8c ': '/images/smilies/8c.gif',
					' :9c ': '/images/smilies/9c.gif',
					' :10c ': '/images/smilies/10c.gif',
					' :Jc ': '/images/smilies/jc.gif',
					' :Qc ': '/images/smilies/qc.gif',
					' :Kc ': '/images/smilies/kc.gif',
					' :Ac ': '/images/smilies/ac.gif',
					
					' :2s ': '/images/smilies/2s.gif',
					' :3s ': '/images/smilies/3s.gif',
					' :4s ': '/images/smilies/4s.gif',
					' :5s ': '/images/smilies/5s.gif',
					' :6s ': '/images/smilies/6s.gif',
					' :7s ': '/images/smilies/7s.gif',
					' :8s ': '/images/smilies/8s.gif',
					' :9s ': '/images/smilies/9s.gif',
					' :10s ': '/images/smilies/10s.gif',
					' :Js ': '/images/smilies/js.gif',
					' :Qs ': '/images/smilies/qs.gif',
					' :Ks ': '/images/smilies/ks.gif',
					' :As ': '/images/smilies/as.gif',
					
					' :2h ': '/images/smilies/2h.gif',
					' :3h ': '/images/smilies/3h.gif',
					' :4h ': '/images/smilies/4h.gif',
					' :5h ': '/images/smilies/5h.gif',
					' :6h ': '/images/smilies/6h.gif',
					' :7h ': '/images/smilies/7h.gif',
					' :8h ': '/images/smilies/8h.gif',
					' :9h ': '/images/smilies/9h.gif',
					' :10h ': '/images/smilies/10h.gif',
					' :Jh ': '/images/smilies/jh.gif',
					' :Qh ': '/images/smilies/qh.gif',
					' :Kh ': '/images/smilies/kh.gif',
					' :Ah ': '/images/smilies/ah.gif',
					
					' :diamond: ':'/images/smilies/d.gif',
					' :club: ':'/images/smilies/c.gif',
					' :spade: ':'/images/smilies/s.gif',
					' :heart: ':'/images/smilies/h.gif'		
				},
				wrapper:13
			}			
		},
		
		isVisible: false,
		index: 0,
		button: null,		
		blockId:null,
		textarea:null,
		canHide:false,
		baseHeight:null,
		toCloseTriggerOpen:null,				
		thread:null,
		isCreated:false,
		
		initialize:function(button,textarea,index, toClose){									
			if(jQuery(button).size() > 0 && jQuery(textarea).size() > 0 && this.smiles[index]){				
				this.index = index;
				this.button = button;
				this.toCloseTriggerOpen = toClose;
				this.textarea = textarea;				
				if (jQuery.browser.msie){
					jQuery(this.textarea)[0].focus();
					this.baseHeight = document.selection.createRange().duplicate().boundingHeight;		
				}				
				this.blockId = 'commentsSmilies_'+jQuery(this.button).attr('id')+'_'+this.index;
				this.createSmilePane();											
			}
		},
		
		createSmilePane:function(){
			var divObj = '<div id="'+this.blockId+'" class="commentPaneClass" style="display:none;"><div class="commentPaneClassContent">';				
			var wrapper = this.smiles[this.index]['wrapper'];
			var index = 0;
			jQuery.each(this.smiles[this.index]['icons'],(function(key, img){
				if(index > 0 && (index % wrapper == 0)) divObj+='<br>';										
				divObj+='<div class="smile"><a href="#" onclick="jQuery(\'#'+jQuery(this.button).attr('id')+'\').data(\'commentsSmilies.instance\').asyncPutSmile(\''+key+'\'); return false;"><img border="0" src="'+img+'"></a></div>';					
				index++;
			}).bind(this));
			divObj+='</div></div>';	
			jQuery('body').prepend(divObj);			
			jQuery(this.button).mouseover((function(){								
				var block = jQuery('#'+this.blockId);														
				if(!this.isVisible){
					jQuery(this.toCloseTriggerOpen).data('commentsSmilies.instance').hide();
					block.show();					
					var blockOffset = {left:0, top:0};
					var buttonOffset = jQuery(this.button).offset();
					blockOffset.top = buttonOffset.top+jQuery(this.button).height()+2;
					blockOffset.left = buttonOffset.left+jQuery(this.button).width()-block.width();
					block.css({left:blockOffset.left,top:blockOffset.top});																
					this.setupCloseEvent();					
				} 
				return false;	
			}).bind(this)).mouseout((function(){
				this.canHide = true;
				this.threadRun(1000);					
				return false;
			}).bind(this));
			jQuery('#'+this.blockId).bind('mouseout',(this._eMouseOut).bind(this)).bind('mouseover',(this._eMouseOver).bind(this));	
		},
		
		asyncPutSmile:function(text){						
			var textarea = jQuery(this.textarea)[0];						
			if (!isNaN(textarea.selectionStart)){
				var sel_start = textarea.selectionStart;
				var sel_end = textarea.selectionEnd;
				mozWrap(textarea, text, '')
				textarea.selectionStart = sel_start + text.length;
				textarea.selectionEnd = sel_end + text.length;
			}else if (textarea.createTextRange && textarea.caretPos){
				if (this.baseHeight != textarea.caretPos.boundingHeight) 
				{
					textarea.focus();
					if (textarea.createTextRange) textarea.caretPos = document.selection.createRange().duplicate();	
				}
				var caret_pos = textarea.caretPos;
				caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
			}else{
				textarea.value = textarea.value + text;
			}
			this.hide();	
		},
		
		setupCloseEvent:function(){			
			this.canHide = false;	
			this.isVisible = true;
			this.runThreadIndex++;
			this.currentThreadIndex = this.runThreadIndex;			
		},
				
		_eMouseOver:function(){
			this.canHide = false;			
		},		
		
		_eMouseOut:function(){					
			this.canHide = true;
			this.threadRun(200);
		},
		
		threadRun:function(timeout){
			if(this.thread != null) clearTimeout(this.thread);
			this.thread = setTimeout((function(){ if(this.canHide) this.hide();}).bind(this),timeout);					
		},
						
		hide:function(){
			jQuery('#'+this.blockId).hide();
			this.isVisible = false;			
		}		
	});		
})(jQuery);

/**
* From http://www.massless.org/mozedit/
*/
function mozWrap(txtarea, open, close)
{
	var selLength = txtarea.textLength;
	var selStart = txtarea.selectionStart;
	var selEnd = txtarea.selectionEnd;
	var scrollTop = txtarea.scrollTop;
	if (selEnd == 1 || selEnd == 2) selEnd = selLength;	
	var s1 = (txtarea.value).substring(0,selStart);
	var s2 = (txtarea.value).substring(selStart, selEnd)
	var s3 = (txtarea.value).substring(selEnd, selLength);
	txtarea.value = s1 + open + s2 + close + s3;
	txtarea.selectionStart = selEnd + open.length + close.length;
	txtarea.selectionEnd = txtarea.selectionStart;
	txtarea.focus();
	txtarea.scrollTop = scrollTop;
	return;
}

