Index: admin/comments.php
===================================================================
--- admin/comments.php	(revision 523)
+++ admin/comments.php	(revision 756)
@@ -14,4 +14,18 @@
 
 dcPage::check('usage,contentadmin');
+
+class authorFilter extends textFilter {
+	public function header() {
+		return 
+			dcPage::jqueryUI().
+			dcPage::jsLoad('js/author_filter.js')
+			;
+	}
+	public function applyFilter($params) {
+		$val = preg_split("/[\s,]+/",$this->values[0]);
+		$params[$this->request_param]=$val;
+	}
+}
+
 
 # Creating filter combo boxes
@@ -54,6 +68,6 @@
 $filterSet = new dcFilterSet('comments','comments.php');
 
-$authorFilter = new textFilter(
-		'author',__('Author'), __('Author'),'q_author',20,255);
+$authorFilter = new authorFilter(
+		'author',__('Author'), __('Author'),'comment_author',20,255);
 $filterSet
 	->addFilter(new comboFilter(
@@ -67,5 +81,5 @@
 $core->callBehavior('adminCommentsFilters',$filterSet);
 
-$filterSet->setFormValues($_GET);
+$filterSet->setup($_GET,$_POST);
 if (isset($_GET['author'])) {
 	$authorFilter->add();
@@ -91,9 +105,9 @@
 	$core->error->add($e->getMessage());
 }
-$filterSet->setColumnsForm($comment_list->getColumnsForm());
+$filterSet->setExtraData($comment_list->getColumnsForm());
 
 /* DISPLAY
 -------------------------------------------------------- */
-$starting_script = dcPage::jsLoad('js/_comments.js').$filterSet->header();;
+$starting_script = dcPage::jsLoad('js/_comments.js').$filterSet->header();
 
 # --BEHAVIOR-- adminCommentsHeaders
Index: admin/posts.php
===================================================================
--- admin/posts.php	(revision 755)
+++ admin/posts.php	(revision 756)
@@ -138,5 +138,5 @@
 	->addFilter(new comboFilter(
 		'users',__('Author'), __('Author'), 'user_id', $users_combo))
-	->addFilter(new comboFilter(
+	->addFilter(new categoryFilter(
 		'category',__('Category'), __('Category'), 'cat_id', $categories_combo))
 	->addFilter(new comboFilter(
@@ -147,5 +147,7 @@
 		'lang',__('Lang'), __('Lang'), 'post_lang', $lang_combo))
 	->addFilter(new monthComboFilter(
-		'month',__('Month'),__('Month'), 'post_month', $dt_m_combo,array('singleval' => 1)));
+		'month',__('Month'),__('Month'), 'post_month', $dt_m_combo,array('singleval' => 1)))
+	->addFilter(new textFilter(
+		'search',__('Contains'),__('The entry contains'), 'search',20,255));
 
 $core->callBehavior('adminPostsFilters',$filterSet);
@@ -165,4 +167,5 @@
 	} else {
 		$page_title = __('Entries');
+		$filters_info = '';
 	}
 	$post_list->setItems($posts,$counter->f(0));
Index: admin/services.php
===================================================================
--- admin/services.php	(revision 0)
+++ admin/services.php	(revision 756)
@@ -25,4 +25,5 @@
 $core->rest->addFunction('delMeta',array('dcRestMethods','delMeta'));
 $core->rest->addFunction('setPostMeta',array('dcRestMethods','setPostMeta'));
+$core->rest->addFunction('searchCommentAuthor',array('dcRestMethods','searchCommentAuthor'));
 $core->rest->addFunction('searchMeta',array('dcRestMethods','searchMeta'));
 
@@ -393,4 +394,29 @@
 		return $rsp;
 	}
+
+	public static function searchCommentAuthor($core,$get)
+	{
+		$q = !empty($get['q']) ? strtoupper($get['q']) : null;
+		
+		$strReq = 'SELECT DISTINCT C.comment_author '.
+			'FROM '.$core->prefix.'comment C '.
+			'INNER JOIN '.$core->prefix.'post P on C.post_id = P.post_id '.
+			'WHERE P.blog_id = \''.$core->blog->id.'\' '.
+			'AND UPPER(comment_author) like \'%'.$core->con->escape($q).'%\''
+			;
+		//echo $strReq;
+		$rs = $core->con->select($strReq);
+		$rsp = new xmlTag();
+		
+		while ($rs->fetch())
+		{
+			$author = new xmlTag('author');
+			$author->name=$rs->comment_author;
+			$rsp->insertNode($author);
+		}
+		
+		return $rsp;
+	}
+
 }
 ?>
Index: inc/admin/class.dc.filter.php
===================================================================
--- inc/admin/class.dc.filter.php	(revision 755)
+++ inc/admin/class.dc.filter.php	(revision 756)
@@ -41,4 +41,5 @@
 		$this->action = $action;
 		$this->extra_data = '';
+		$this->filtered = false;
 	}
 	
@@ -62,8 +63,8 @@
 		$ser = array();
 		$ws = $GLOBALS['core']->auth->user_prefs->addWorkspace('filters');
-		foreach($this->lfilters as $filter) {
-			$ser[$filter->id]=$filter->serialize();
-		}
-		$ws->put($this->name,serialize($ser),'string');
+		$data = array();
+		$data= $this->getFiltersAsParams($this->efilters);
+		$ws->put($this->name,serialize($data->getArrayCopy()),'string');
+		return $data;
 	}
 	
@@ -73,9 +74,9 @@
 	protected function loadFilters() {
 		$ws = $GLOBALS['core']->auth->user_prefs->addWorkspace('filters');
-		
-		$settings = !is_null($ws->{$this->name}) ? unserialize($ws->{$this->name}) : array();
-		foreach($settings as $k => $v) {
-			$this->lfilters[$k]->unserialize($v);
-		}
+		$data = (!is_null($ws->{$this->name})) ? unserialize($ws->{$this->name}) : array();
+		if (is_array($data))
+			return $data;
+		else
+			return array();
 	}
 	
@@ -152,5 +153,4 @@
 					if (isset($post['add_filter']) 
 						&& isset($this->efilters[$post['add_filter']])) {
-						echo 'addadd';
 					$this->efilters[$post['add_filter']]->add();
 					}
@@ -162,5 +162,6 @@
 					}
 				} elseif ($action=="apply") {
-					http::redirect($this->action.'?'.http_build_query($this->getFiltersAsParams($this->efilters),'','&'));
+					$data = $this->saveFilters();
+					http::redirect($this->action.'?'.http_build_query($data,'','&'));
 					exit;
 				}
@@ -175,4 +176,8 @@
 			$this->hideform=false;
 		} else {
+			// Use case (2)
+			if (count($get)==0) {
+				$get = $this->loadFilters();
+			}
 			$this->initializeFromData($this->efilters, $get);
 			$this->initializeFromData($this->lfilters, $get);
@@ -192,10 +197,9 @@
 			$formclass='';
 		}
+		
 		$ret .= '<p><img alt="" src="images/minus.png" /> '.
 			'<a href="#" id="toggle-filters">'.
 			__('Toggle filters and display options').
-			'</a></p>';
-		
-		$ret .=
+			'</a></p>'.
 			'<div class="two-cols">'.
 			'<form id="filters" action="'.$this->action.'" method="post"'.$formclass.'>'.
@@ -217,8 +221,4 @@
 		}
 		$ret .= '</tbody></table>'.
-			'<p class="clear"><input class="delete" type="submit" value="'.__('Delete all filters').'" name="'.
-			$this->form_prefix.'clear_filters" />'.
-			'&nbsp;<input  type="submit" value="'.__('Reset').'" name="'.
-			$this->form_prefix.'reset" /></p>'.
 			'<h3 class="margintop">'.__('Add a filter').'</h3>'.
 			'<p id="available_filters">'.
@@ -226,4 +226,8 @@
 			'<input type="submit" value=" + " title="'.__('Add this filter').'" name="'.$this->form_prefix.'add" />'.
 			'</p>'.
+			'<p class="clear"><input class="delete" type="submit" value="'.__('Delete all filters').'" name="'.
+			$this->form_prefix.'clear_filters" />'.
+			'&nbsp;<input  type="submit" value="'.__('Reset').'" name="'.
+			$this->form_prefix.'reset" /></p>'.
 			'</div>';
 		if ($this->extra_data != '') {
@@ -261,9 +265,9 @@
 	}
 	
-	protected function displayFilters($filters) {
-		$ret = '<ul>';
-		foreach ($filters as $f) {
+	public function getFiltersText() {
+		$ret = '<p>'.__('Currently applied filters :').'</p><ul>';
+		foreach ($this->lfilters as $f) {
 			if ($f->isEnabled())
-			$ret .= '<li>'.$f->getAsText().'</li>'."\n";
+				$ret .= '<li>'.$f->getAsText().'</li>'."\n";
 		}
 		$ret .= '</ul>';
@@ -276,5 +280,9 @@
 	*/
 	public function header() {
-		return dcPage::jsLoad('js/filters.js');
+		$ret = dcPage::jsLoad('js/filters.js');
+		foreach($this->efilters as $f) {
+			$ret .= $f->header();
+		}
+		return $ret;
 	}
 	
@@ -295,12 +303,11 @@
 	*/
 	public function applyFilters($params) {
-		$filtered = false;
 		foreach ($this->lfilters as $filter) {
 			if ($filter->isEnabled()) {
 				$filter->applyFilter($params);
-				$filtered = true;
+				$this->filtered = true;
 			}
 		}
-		return $filtered;
+		return $this->filtered;
 	}
 	
@@ -488,4 +495,8 @@
 	}
 
+	public function header() {
+		return '';
+	}
+	
 	public abstract function getAsText();
 
@@ -602,8 +613,23 @@
 	
 	public function getAsText() {
-		return sprintf("%s %s %s",$this->desc,$this->verb,join(',',$this->values));
+		$arr=array();
+		foreach ($this->values as $value) {
+			$arr[]=array_search($value,$this->options);
+		}
+		return sprintf("%s %s %s",$this->desc,$this->verb,join(',',$arr));
 	}
 }
 
+
+class categoryFilter extends comboFilter {
+	public function getAsText() {
+		$arr=array();
+		foreach ($this->values as $value) {
+			$cat=array_search($value,$this->options);
+			$arr[]=preg_replace("#^.* ([^ ]+) .*$#",'$1',$cat);
+		}
+		return sprintf("%s %s %s",$this->desc,$this->verb,join(',',$arr));
+	}
+}
 /**
 @ingroup DC_CORE
@@ -632,5 +658,5 @@
 
 	public function getFormFields($pos=0) {
-		return '<td><span class="'.$labelclass.'">'.$this->desc.'</span></td><td>'.
+		return '<td colspan="2">'.$this->desc.'</td><td>'.
 			form::combo($this->getFieldId($pos),$this->options,$this->values[$pos],
 				'','',false,'title="'.__('Choose an option').'"').'</td>';
@@ -668,6 +694,7 @@
 
 	public function getFormFields($pos=0) {
-		return '<span class="'.$labelclass.'">'.$this->desc.'</span>'.
-			form::field($this->getFieldId($pos),$this->size,$this->max,html::escapeHTML($this->values[0]));
+		return '<td colspan="2">'.$this->desc.'</td><td>'.
+			form::field($this->getFieldId($pos),$this->size,$this->max,html::escapeHTML($this->values[0])).
+			'</td>';
 	}
 	
Index: inc/admin/lib.dc.page.php
===================================================================
--- inc/admin/lib.dc.page.php	(revision 224)
+++ inc/admin/lib.dc.page.php	(revision 756)
@@ -501,4 +501,11 @@
 	}
 	
+	public static function jqueryUI()
+	{
+		return
+		'<link rel="stylesheet" type="text/css" href="style/jquery-ui-1.8.16.custom.css" />'."\n".
+		self::jsLoad('js/jquery/jquery-ui-1.8.16.custom.min.js');
+	}
+
 	public static function jsColorPicker()
 	{
Index: inc/core/class.dc.blog.php
===================================================================
--- inc/core/class.dc.blog.php	(revision 506)
+++ inc/core/class.dc.blog.php	(revision 756)
@@ -1831,4 +1831,7 @@
 			$strReq .= "AND LOWER(comment_author) LIKE '".$q_author."' ";
 		}
+		if (isset($params['comment_author'])) {
+			$strReq .= "AND comment_author ".$this->con->in($params['comment_author']).' ';
+		}
 		
 		if (!empty($params['search']))
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 522)
+++ inc/prepend.php	(revision 756)
@@ -75,4 +75,6 @@
 $__autoload['dcFilterSet']			= dirname(__FILE__).'/admin/class.dc.filter.php';
 $__autoload['dcFilter']				= dirname(__FILE__).'/admin/class.dc.filter.php';
+$__autoload['textFilter']				= dirname(__FILE__).'/admin/class.dc.filter.php';
+$__autoload['comboFilter']				= dirname(__FILE__).'/admin/class.dc.filter.php';
 
 $__autoload['dcTemplate']			= dirname(__FILE__).'/public/class.dc.template.php';
Index: plugins/tags/_admin.php
===================================================================
--- plugins/tags/_admin.php	(revision 217)
+++ plugins/tags/_admin.php	(revision 756)
@@ -108,5 +108,5 @@
 		
 		return 
-		'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.min.js"></script>'.
+		dcPage::jqueryUI().
 		'<script type="text/javascript" src="index.php?pf=tags/js/post.js"></script>'.
 		'<script type="text/javascript">'."\n".
@@ -137,6 +137,4 @@
 		
 		return 
-		'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.min.js"></script>'.
-		'<script type="text/javascript" src="index.php?pf=tags/js/posts_actions.js"></script>'.
 		'<script type="text/javascript">'."\n".
 		"//<![CDATA[\n".
@@ -153,4 +151,6 @@
 		"\n//]]>\n".
 		"</script>\n".
+		'<script type="text/javascript" src="index.php?pf=tags/js/posts_actions.js"></script>'.
+		dcPage::jqueryUI().
 		'<link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />';
 	}
Index: lugins/tags/js/jquery.autocomplete.min.js
===================================================================
--- plugins/tags/js/jquery.autocomplete.min.js	(revision 0)
+++ 	(revision )
@@ -1,13 +1,0 @@
-/*
- * jQuery Autocomplete plugin 1.1
- *
- * Copyright (c) 2009 Jörn Zaefferer
- *
- * Dual licensed under the MIT and GPL licenses:
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- *
- * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
- */;(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&&currentValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
-if(data[q]){return data[q];}else
-if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery);
Index: plugins/tags/js/post.js
===================================================================
--- plugins/tags/js/post.js	(revision 0)
+++ plugins/tags/js/post.js	(revision 756)
@@ -1,3 +1,9 @@
 $(function() {
+	function split( val ) {
+		return val.split( /,\s*/ );
+	}
+	function extractLast(term) {
+		return split(term).pop();
+	}
 	$('#edit-entry').onetabload(function() {
 		var tags_edit = $('#tags-edit');
@@ -18,42 +24,69 @@
 		}
 		
-		$('#post_meta_input').autocomplete(mEdit.service_uri, {
-			extraParams: {
-				'f': 'searchMeta',
-				'metaType': 'tag'
-			},
-			delay: 1000,
-			multiple: true,
-			matchSubset: false,
-			matchContains: true,
-			parse: function(xml) { 
-				var results = [];
-				$(xml).find('meta').each(function(){
-					results[results.length] = {
-						data: {
-							"id": $(this).text(),
-							"count": $(this).attr("count"),
-							"percent":  $(this).attr("roundpercent")
-						},
-						result: $(this).text()
-					}; 
-				});
-				return results;
-			},
-			formatItem: function(tag) {
-				return tag.id + ' <em>(' +
-				dotclear.msg.tags_autocomplete.
-					replace('%p',tag.percent).
-					replace('%e',tag.count + ' ' +
-						(tag.count > 1 ?
-						dotclear.msg.entries :
-						dotclear.msg.entry)
-					) +
-				')</em>';
-			},
-			formatResult: function(tag) { 
-				return tag.result; 
+		$('#post_meta_input')
+			.bind( "keydown", function( event ) {
+		if ( event.keyCode === $.ui.keyCode.TAB &&
+				$( this ).data( "autocomplete" ).menu.active ) {
+			event.preventDefault();
+		}
+	})
+	.autocomplete({
+		minLength: 2,
+		delay: 1000,
+		source: function(request,response) {
+			$.ajax({
+				url: mEdit.service_uri,
+				data: {
+					'f': 'searchMeta',
+					'metaType': 'tag',
+					'q': extractLast(request.term)
+				},
+				success:function(data) {
+					results = [];
+					$(data).find('meta').each(function(){
+						var id = $(this).text();
+						var roundpercent = $(this).attr("roundpercent");
+						var count = $(this).attr("count");
+						console.log(id);
+						console.log(roundpercent);
+						console.log(count);
+						var label = id + ' (' +
+							dotclear.msg.tags_autocomplete.
+								replace('%p',roundpercent).
+								replace('%e',count + ' ' +
+								((count > 1) ?
+									dotclear.msg.entries :
+									dotclear.msg.entry
+								)) + ')';
+							console.log(label);
+						results.push({label:label,value:id});
+					});
+					response(results);
+				}
+			});
+		},
+		search: function() {
+			var term = extractLast( this.value );
+			if ( term.length < 2 ) {
+				return false;
 			}
-		});
+		},
+		focus: function() {
+			// prevent value inserted on focus
+			return false;
+		},
+		select: function( event, ui ) {
+			var terms = split( this.value );
+			// remove the current input
+			terms.pop();
+			// add the selected item
+			terms.push( ui.item.value );
+			// add placeholder to get the comma-and-space at the end
+			terms.push( "" );
+			this.value = terms.join( ", " );
+			return false;
+		}		
+	});
+
 	});
 });
Index: plugins/tags/js/posts_actions.js
===================================================================
--- plugins/tags/js/posts_actions.js	(revision 0)
+++ plugins/tags/js/posts_actions.js	(revision 756)
@@ -1,3 +1,9 @@
 $(function() {
+	function split( val ) {
+		return val.split( /,\s*/ );
+	}
+	function extractLast(term) {
+		return split(term).pop();
+	}
 	var tag_field = $('#new_tags');
 	
@@ -19,41 +25,67 @@
 	});
 	
-	$('#post_meta_input').autocomplete(mEdit.service_uri, {
-		extraParams: {
-			'f': 'searchMeta',
-			'metaType': 'tag'
+	$('#post_meta_input')
+	.bind( "keydown", function( event ) {
+		if ( event.keyCode === $.ui.keyCode.TAB &&
+				$( this ).data( "autocomplete" ).menu.active ) {
+			event.preventDefault();
+		}
+	})
+	.autocomplete({
+		minLength: 2,
+		delay: 1000,
+		source: function(request,response) {
+			$.ajax({
+				url: mEdit.service_uri,
+				data: {
+					'f': 'searchMeta',
+					'metaType': 'tag',
+					'q': extractLast(request.term)
+				},
+				success:function(data) {
+					results = [];
+					$(data).find('meta').each(function(){
+						var id = $(this).text();
+						var roundpercent = $(this).attr("roundpercent");
+						var count = $(this).attr("count");
+						console.log(id);
+						console.log(roundpercent);
+						console.log(count);
+						var label = id + ' (' +
+							dotclear.msg.tags_autocomplete.
+								replace('%p',roundpercent).
+								replace('%e',count + ' ' +
+								((count > 1) ?
+									dotclear.msg.entries :
+									dotclear.msg.entry
+								)) + ')';
+							console.log(label);
+						results.push({label:label,value:id});
+					});
+					response(results);
+				}
+			});
 		},
-		delay: 1000,
-		multiple: true,
-		matchSubset: false,
-		matchContains: true,
-		parse: function(xml) { 
-			var results = [];
-			$(xml).find('meta').each(function(){
-				results[results.length] = {
-					data: {
-						"id": $(this).text(),
-						"count": $(this).attr("count"),
-						"percent":  $(this).attr("roundpercent")
-					},
-					result: $(this).text()
-				}; 
-			});
-			return results;
+		search: function() {
+			var term = extractLast( this.value );
+			if ( term.length < 2 ) {
+				return false;
+			}
 		},
-		formatItem: function(tag) {
-			return tag.id + ' <em>(' +
-			dotclear.msg.tags_autocomplete.
-				replace('%p',tag.percent).
-				replace('%e',tag.count + ' ' +
-					(tag.count > 1 ?
-					dotclear.msg.entries :
-					dotclear.msg.entry)
-				) +
-			')</em>';
+		focus: function() {
+			// prevent value inserted on focus
+			return false;
 		},
-		formatResult: function(tag) { 
-			return tag.result; 
-		}
+		select: function( event, ui ) {
+			var terms = split( this.value );
+			// remove the current input
+			terms.pop();
+			// add the selected item
+			terms.push( ui.item.value );
+			// add placeholder to get the comma-and-space at the end
+			terms.push( "" );
+			this.value = terms.join( ", " );
+			return false;
+		}		
 	});
 });
