(function( $ ){
	
	var smiles;
	
	var methods = {
		init: function( settings ) {
			// init
			if(!settings||!settings.markupSet){return;}
			//console.trace();
			settings.markupSet.push({
				separator: '-',
			});
			settings.markupSet.push({
				name: "QipSmiles!",
				className: "editor-qipsmiles",
				beforeInsert: function(action){
					$(action.textarea).qipsmiles('toggle');
				}
			});
			// /init
		},
		
		show: function( ) {
			// show
			return this.each(function(){
				methods.getList.apply(this).removeClass('qipsmiles-hide');
			});
			// /show
		},
		
		hide: function( ) {
			// hide
			return this.each(function(){
				methods.getList.apply(this).addClass('qipsmiles-hide');
			});
			// /hide
		},
		
		toggle: function( ) {
			// toggle
			return this.each(function(){
				var list = methods.getList.apply(this);
				if(list.hasClass('qipsmiles-hide')){
					list.removeClass('qipsmiles-hide');
				}else{
					list.addClass('qipsmiles-hide');
				}
			});
			// /toggle
		},
		
		getList: function(){
			// getList
			var textarea = $(this);
			var tid = textarea.attr('id');
			var lid = 'qipsmiles_list_'+tid;
			var list = $('#qipsmiles_list_'+tid);
			if(list.size()){
				return list;
			}
			list = $('<div class="qipsmiles-list qipsmiles-hide"/>')
				.text('Loading...')
				.attr('id', lid)
				.insertBefore(textarea)
			;
			var listWrap = $('<div/>').width(textarea.outerWidth()).insertBefore(textarea);
			
			jQuery(window).resize(function(){
				listWrap.width(textarea.outerWidth());
			});
			
			if(!smiles){
				jQuery.getJSON(DIR_WEB_ROOT+'/qipsmiles/list/', {security_ls_key: LIVESTREET_SECURITY_KEY}, function(data, textStatus){
					if(data){
						smiles = data.aSmiles;
						methods.fillSmiles.apply(textarea, [list]);
					};
				});
			}
			
			return list.appendTo(listWrap);
			// /getList
		},
		
		fillSmiles: function(list){
			// fillSmiles
			var textarea = $(this);
			list.empty();
			$.each(smiles, function(index, smile){
				var image = $('<img src="'+smile.src+'" align="middle"/>');
				var button = $('<a href="#" class="qipsmiles-insert-button"/>')
				.attr({'title': smile.list.join(', ')})
				.data({'qipsmiles-smile': smile.list[0], 'qipsmiles-textarea': textarea.attr('id')}).click(function(e){
					e.preventDefault();
					//$('#'+$(this).data('qipsmiles-textarea'))
					$.markItUp({
						replaceWith: $(this).data('qipsmiles-smile'),
						target: '#'+$(this).data('qipsmiles-textarea')
					});
				});
				button.append(image);
				list.append(button);
			});
			// fillSmiles
		}
		
	};

	$.fn.qipsmiles = function( method ) {
		
		// Method calling logic
		if ( method === 'methods' ){
			return methods;
		} else if ( methods[method] ) {
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
		} else if ( typeof method === 'object' || ! method ) {
			return methods.init.apply( this, arguments );
		} else {
			$.error( 'Method ' +	method + ' does not exist on jQuery.qipsmiles' );
		}		
	
	};
	
	$.qipsmilesInject = function(){
		// debug
		//$.functionInject([jQuery.fn,'markItUp'], 'console.log("markItUp resulting settings:",settings);');
		
		
		if(typeof jQuery.fn.markItUp == 'function'){
			$.functionInject([jQuery.fn,'markItUp'], function(settings, extraSettings){
				this.qipsmiles(settings||{markupSet:[]});
			});
		}
		
		$.functionInject([ls,'ajax'], function(url,params,callback,more){
			if(/\/ajax\/preview\/text/.test(url)){
				params.qipsmiles_disable = $('#qipsmiles_disable:checked').size() ? 1 : 0;
			}
		});
		
	};
	
})( jQuery );


// inject initialization of qipsmiles to markItUp fn
jQuery(function(){
	jQuery.qipsmilesInject();
});

