Author: ornicar2
Date: 2010-02-11 14:24:24 +0100 (Thu, 11 Feb 2010)
New Revision: 27890

Added:
   plugins/dmTagPlugin/config/dm/assets.yml
   plugins/dmTagPlugin/lib/validator/
   plugins/dmTagPlugin/lib/validator/sfValidatorDmTagsAutocomplete.php
   plugins/dmTagPlugin/lib/widget/
   plugins/dmTagPlugin/lib/widget/sfWidgetFormDmTagsAsString.php
   plugins/dmTagPlugin/web/
   plugins/dmTagPlugin/web/css/
   plugins/dmTagPlugin/web/css/fcbkcomplete.css
   plugins/dmTagPlugin/web/images/
   plugins/dmTagPlugin/web/images/close.gif
   plugins/dmTagPlugin/web/js/
   plugins/dmTagPlugin/web/js/jquery.fcbkcomplete.js
   plugins/dmTagPlugin/web/js/jquery.fcbkcomplete.min.js
   plugins/dmTagPlugin/web/js/launcher.js
Modified:
   plugins/dmTagPlugin/lib/model/doctrine/PluginDmTagTable.class.php
   plugins/dmTagPlugin/modules/dmTagAdmin/actions/actions.class.php
Log:
[Diem][dmTagPlugin]
- added an admin autocompleter

Added: plugins/dmTagPlugin/config/dm/assets.yml
===================================================================
--- plugins/dmTagPlugin/config/dm/assets.yml                            (rev 0)
+++ plugins/dmTagPlugin/config/dm/assets.yml    2010-02-11 13:24:24 UTC (rev 
27890)
@@ -0,0 +1,12 @@
+js:
+
+  dmTagPlugin:
+
+    fcbkcomplete:     jquery.fcbkcomplete.min
+    launcher:         launcher
+
+css:
+  
+  dmTagPlugin:
+
+    fcbkcomplete:     fcbkcomplete
\ No newline at end of file

Modified: plugins/dmTagPlugin/lib/model/doctrine/PluginDmTagTable.class.php
===================================================================
--- plugins/dmTagPlugin/lib/model/doctrine/PluginDmTagTable.class.php   
2010-02-11 13:22:56 UTC (rev 27889)
+++ plugins/dmTagPlugin/lib/model/doctrine/PluginDmTagTable.class.php   
2010-02-11 13:24:24 UTC (rev 27890)
@@ -3,31 +3,16 @@
  */
 class PluginDmTagTable extends myDoctrineTable
 {
-  protected
-  $taggableModelsLoaded;
 
-  public function loadTaggableModels()
+  public function getTagNames()
   {
-    if($this->taggableModelsLoaded)
-    {
-      return;
-    }
-
-    foreach(dmProject::getAllModels() as $model)
-    {
-      if(!class_exists($model, false))
-      {
-        dmDb::table($model);
-      }
-    }
-
-    $this->taggableModelsLoaded = true;
+    return $this->createQuery('t')
+    ->select('t.name')
+    ->fetchFlat();
   }
 
   public function getPopularTagsQuery($relations = null, $limit = null, 
dmDoctrineQuery $q = null)
   {
-    $this->loadTaggableModels();
-    
     if (empty($relations))
     {
       $relations = array_keys($this->getRelationHolder()->getAssociations());

Added: plugins/dmTagPlugin/lib/validator/sfValidatorDmTagsAutocomplete.php
===================================================================
--- plugins/dmTagPlugin/lib/validator/sfValidatorDmTagsAutocomplete.php         
                (rev 0)
+++ plugins/dmTagPlugin/lib/validator/sfValidatorDmTagsAutocomplete.php 
2010-02-11 13:24:24 UTC (rev 27890)
@@ -0,0 +1,40 @@
+<?php
+
+class sfValidatorDmTagsAutocomplete extends sfValidatorBase
+{
+  protected function configure($options = array(), $messages = array())
+  {
+    $this->addOption('min');
+    $this->addOption('max');
+
+    $this->addMessage('min', 'At least %min% tags must be selected (%count% 
tags selected).');
+    $this->addMessage('max', 'At most %max% tags must be selected (%count% 
tags selected).');
+  }
+
+  /**
+   * @see sfValidatorBase
+   */
+  protected function doClean($value)
+  {
+    if (!is_array($value))
+    {
+      $value = array($value);
+    }
+
+    $value = array_unique(array_filter(array_map('trim', $value)));
+
+    $count = count($value);
+
+    if ($this->hasOption('min') && $count < $this->getOption('min'))
+    {
+      throw new sfValidatorError($this, 'min', array('count' => $count, 'min' 
=> $this->getOption('min')));
+    }
+
+    if ($this->hasOption('max') && $count > $this->getOption('max'))
+    {
+      throw new sfValidatorError($this, 'max', array('count' => $count, 'max' 
=> $this->getOption('max')));
+    }
+
+    return $value;
+  }
+}
\ No newline at end of file

Added: plugins/dmTagPlugin/lib/widget/sfWidgetFormDmTagsAsString.php
===================================================================
--- plugins/dmTagPlugin/lib/widget/sfWidgetFormDmTagsAsString.php               
                (rev 0)
+++ plugins/dmTagPlugin/lib/widget/sfWidgetFormDmTagsAsString.php       
2010-02-11 13:24:24 UTC (rev 27890)
@@ -0,0 +1,40 @@
+<?php
+
+class sfWidgetFormDmTagsAutocomplete extends sfWidgetFormSelect
+{
+  
+  protected function configure($options = array(), $attributes = array())
+  {
+    parent::configure($options, $attributes);
+
+    $this->setOption('multiple', true);
+  }
+
+  protected function getOptionsForSelect($value, $choices)
+  {
+    $choices = dmArray::valueToKey($choices);
+    $value = $choices;
+
+    $html = parent::getOptionsForSelect($choices, $choices);
+
+    // fcbkcomplete wants a class selected
+    $html = str_replace('selected="selected"', 'class="selected"', $html);
+
+    return $html;
+  }
+
+  public function getJavascripts()
+  {
+    return array_merge(parent::getJavaScripts(), array(
+      'dmTagPlugin.fcbkcomplete',
+      'dmTagPlugin.launcher'
+    ));
+  }
+
+  public function getStylesheets()
+  {
+    return array_merge(parent::getStylesheets(), array(
+      'dmTagPlugin.fcbkcomplete' => array()
+    ));
+  }
+}
\ No newline at end of file

Modified: plugins/dmTagPlugin/modules/dmTagAdmin/actions/actions.class.php
===================================================================
--- plugins/dmTagPlugin/modules/dmTagAdmin/actions/actions.class.php    
2010-02-11 13:22:56 UTC (rev 27889)
+++ plugins/dmTagPlugin/modules/dmTagAdmin/actions/actions.class.php    
2010-02-11 13:24:24 UTC (rev 27890)
@@ -13,4 +13,14 @@
  */
 class dmTagAdminActions extends autoDmTagAdminActions
 {
+
+  public function executeGetTagsForAutocomplete(sfWebRequest $request)
+  {
+    $tags = dmDb::query('DmTag t')
+    ->select('t.name as value, t.name as caption')
+    ->fetchArray();
+
+    return $this->renderJson($tags);
+  }
+
 }

Added: plugins/dmTagPlugin/web/css/fcbkcomplete.css
===================================================================
--- plugins/dmTagPlugin/web/css/fcbkcomplete.css                                
(rev 0)
+++ plugins/dmTagPlugin/web/css/fcbkcomplete.css        2010-02-11 13:24:24 UTC 
(rev 27890)
@@ -0,0 +1,34 @@
+/* TextboxList sample CSS */
+div.sf_widget_form_dm_tags_autocomplete ul.holder { margin: 0; border: 1px 
solid #D3D3D3; overflow: hidden; height: auto !important; height: 1%; padding: 
4px 5px 0; }
+div.sf_widget_form_dm_tags_autocomplete ul.holder li { float: left; 
list-style-type: none; margin: 0 5px 4px 0; white-space:nowrap;}
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-box, ul.holder 
li.bit-input input { font: 11px "Lucida Grande", "Verdana"; }
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-box { 
-moz-border-radius: 4px; -webkit-border-radius: 4px; border: 1px solid #CAD8F3; 
background: #DEE7F8; padding: 1px 5px 2px; }
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-box-focus { 
border-color: #598BEC; background: #598BEC; color: #fff; }
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-input input { width: 
auto; overflow:visible; margin: 0; border: 0px; outline: 0; padding: 3px 0px 
2px; } /* no left/right padding here please */
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-input 
input.smallinput { width: 20px; }
+
+/* Facebook CSS */
+
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-box { padding-right: 
15px; position: relative; z-index:1000;}
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-hover { background: 
#BBCEF1; border: 1px solid #6D95E0; }
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-box-focus { 
border-color: #598BEC; background: #598BEC; color: #fff; }
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-box a.closebutton { 
position: absolute; right: 4px; top: 5px; display: block; width: 7px; height: 
7px; font-size: 1px; background: url(../images/close.gif); }
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-box 
a.closebutton:hover { background-position: 7px; }
+div.sf_widget_form_dm_tags_autocomplete ul.holder li.bit-box-focus 
a.closebutton, ul.holder li.bit-box-focus a.closebutton:hover { 
background-position: bottom; }
+
+/* Autocompleter */
+
+div.sf_widget_form_dm_tags_autocomplete .facebook-auto { display: none; 
position: absolute; width: 512px; background: #eee; }
+div.sf_widget_form_dm_tags_autocomplete .facebook-auto .default { padding: 5px 
7px; border: 1px solid #ccc; border-width: 0 1px 1px;font-family:"Lucida 
Grande","Verdana"; font-size:11px; }
+div.sf_widget_form_dm_tags_autocomplete .facebook-auto ul { display: none; 
margin: 0; padding: 0; overflow: auto; position:absolute; z-index:9999}
+div.sf_widget_form_dm_tags_autocomplete .facebook-auto ul li { padding: 5px 
12px; z-index: 1000; cursor: pointer; margin: 0; list-style-type: none; border: 
1px solid #ccc; border-width: 0 1px 1px; font: 11px "Lucida Grande", "Verdana"; 
background-color: #eee }
+div.sf_widget_form_dm_tags_autocomplete .facebook-auto ul li em { font-weight: 
bold; font-style: normal; background: #ccc; }
+div.sf_widget_form_dm_tags_autocomplete .facebook-auto ul li.auto-focus { 
background: #4173CC; color: #fff; }
+div.sf_widget_form_dm_tags_autocomplete .facebook-auto ul li.auto-focus em { 
background: none; }
+div.sf_widget_form_dm_tags_autocomplete .deleted { background-color:#4173CC 
!important; color:#ffffff !important;}
+div.sf_widget_form_dm_tags_autocomplete .hidden { display:none;}
+
+/* Admin style */
+div.sf_widget_form_dm_tags_autocomplete div.content {
+  margin-left: 20%;
+}
\ No newline at end of file

Added: plugins/dmTagPlugin/web/images/close.gif
===================================================================
(Binary files differ)


Property changes on: plugins/dmTagPlugin/web/images/close.gif
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: plugins/dmTagPlugin/web/js/jquery.fcbkcomplete.js
===================================================================
--- plugins/dmTagPlugin/web/js/jquery.fcbkcomplete.js                           
(rev 0)
+++ plugins/dmTagPlugin/web/js/jquery.fcbkcomplete.js   2010-02-11 13:24:24 UTC 
(rev 27890)
@@ -0,0 +1,662 @@
+/*
+ FCBKcomplete 2.6.1
+ - Jquery version required: 1.2.x, 1.3.x
+ 
+ Changelog:
+ 
+ - 2.00        new version of fcbkcomplete
+ 
+ - 2.01 fixed bugs & added features
+               fixed filter bug for preadded items
+               focus on the input after selecting tag
+               the element removed pressing backspace when the element is 
selected
+               input tag in the control has a border in IE7
+               added iterate over each match and apply the plugin separately
+               set focus on the input after selecting tag
+ 
+ - 2.02 fixed fist element selected bug
+               fixed defaultfilter error bug
+ 
+ - 2.5         removed selected="selected" attribute due ie bug
+               element search algorithm changed
+               better performance fix added
+               fixed many small bugs
+               onselect event added
+               onremove event added
+               
+ - 2.6         ie6/7 support fix added
+               added new public method addItem due request
+               added new options "firstselected" that you can set true/false 
to select first element on dropdown list
+               autoexpand input element added
+               removeItem bug fixed
+               and many more bug fixed
+
+ - 2.6.1
+               fixed public method to use it 
$("elem").trigger("addItem",[{"title": "test", "value": "test"}]);
+ */
+
+/* Coded by: emposha <[email protected]> */
+/* Copyright: Emposha.com <http://www.emposha.com/> - Distributed under MIT - 
Keep this message! */
+/*
+ * json_url         - url to fetch json object
+ * cache                       - use cache
+ * height           - maximum number of element shown before scroll will apear
+ * newel            - show typed text like a element
+ * firstselected       - automaticly select first element from dropdown
+ * filter_case      - case sensitive filter
+ * filter_selected  - filter selected items from list
+ * complete_text    - text for complete page
+ * maxshownitems       - maximum numbers that will be shown at dropdown list 
(less better performance)
+ * onselect                    - fire event on item select
+ * onremove                    - fire event on item remove
+ */
+ 
+jQuery(
+    function ($) 
+    {
+           $.fn.fcbkcomplete = function (opt) 
+           {
+               return this.each(function()
+                       {
+                       function init()
+                       {
+                          createFCBK();       
+                      preSet();
+                      addInput(0); 
+                       }
+                       
+                       function createFCBK()
+                       {           
+                          element.hide();
+                          element.attr("multiple","multiple");
+                          if (element.attr("name").indexOf("[]") == -1)
+                          {
+                                  
element.attr("name",element.attr("name")+"[]");
+                          }
+                          
+                          holder = $(document.createElement("ul"));
+                      holder.attr("class", "holder");
+                      element.after(holder);
+                      
+                      complete = $(document.createElement("div"));
+                      complete.addClass("facebook-auto");
+                      complete.append('<div class="default">'+ 
options.complete_text +"</div>");
+                      
+                                  if (browser_msie)
+                      {
+                           complete.append('<iframe class="ie6fix" 
scrolling="no" frameborder="0"></iframe>');
+                           browser_msie_frame = complete.children('.ie6fix');  
                                        
+                      }
+                                  
+                      feed = $(document.createElement("ul"));
+                      feed.attr("id", elemid + "_feed");
+                      
+                      complete.prepend(feed);
+                      holder.after(complete);
+                                  feed.css("width",complete.width());
+                       }
+                       
+                       function preSet()
+                       {                                                       
                        
+                           element.children("option").each( 
+                               function(i,option) 
+                               {                                               
                                            
+                                                       option = $(option);     
                                                                                
        
+                                   if (option.hasClass("selected"))
+                                   {                                           
                                                                                
                                                                                
                                        
+                                       addItem (option.text(), option.val(), 
true);
+                                                               
option.attr("selected","selected");
+                                   } 
+                                                       else
+                                                       {
+                                                               
option.removeAttr("selected");  
+                                                       }
+
+                                                       cache.push({
+                                                               caption: 
option.text(),
+                                                               value: 
option.val()
+                                                       });
+                                                       search_string += "" + 
(cache.length - 1) + ":" + option.text() + ";";                
+                               }
+                           );
+                       }
+                               
+                               //public method to add new item
+                               $(this).bind("addItem", function(event, data)
+                               {                                       
+                                       addItem(data.title, data.value);
+                               });
+                       
+                       function addItem (title, value, preadded)
+                       {                               
+                       var li = document.createElement("li");
+                       var txt = document.createTextNode(title);
+                       var aclose = document.createElement("a");       
+                       
+                       $(li).attr({"class": "bit-box","rel": value});
+                       $(li).prepend(txt);        
+                       $(aclose).attr({"class": "closebutton","href": "#"});
+                       
+                       li.appendChild(aclose);
+                       holder.append(li);
+                       
+                       $(aclose).click(
+                           function(){
+                               $(this).parent("li").fadeOut("fast", 
+                                   function(){
+                                                                       
removeItem($(this));                                    
+                                   }
+                               );
+                               return false;
+                           }
+                       );
+                       
+                       if (!preadded) 
+                       {                                               
+                           $("#"+elemid + "_annoninput").remove();
+                                               var _item;
+                           addInput(1);                        
+                           if (element.children("option[value=" + value + 
"]").length)
+                           {   
+                                                       _item = 
element.children("option[value=" + value + "]");            
+                               _item.get(0).setAttribute("selected", 
"selected");
+                                                       if 
(!_item.hasClass("selected")) 
+                                                       {
+                                                               
_item.addClass("selected");
+                                                       }
+                           }
+                           else
+                           {
+                               var _item = $(document.createElement("option"));
+                               _item.attr("value", 
value).get(0).setAttribute("selected", "selected");
+                                                       _item.attr("value", 
value).addClass("selected");
+                               _item.text(title);              
+                               element.append(_item);
+                           }
+                                               if (options.onselect.length)
+                                               {
+                                                       
funCall(options.onselect,_item)
+                                               }       
+                       }                                            
+                       
holder.children("li.bit-box.deleted").removeClass("deleted");
+                       feed.hide();
+                                       
browser_msie?browser_msie_frame.hide():'';
+                   }
+                       
+                               function removeItem(item)
+                               {                                       
+                                       if (options.onremove.length)
+                                       {
+                                           var _item = 
element.children("option[value=" + item.attr("rel") + "]");
+                                               funCall(options.onremove,_item)
+                                       }
+                                       element.children("option[value=" + 
item.attr("rel") + "]").removeAttr("selected");
+                                       element.children("option[value=" + 
item.attr("rel") + "]").removeClass("selected");
+                    item.remove();                                     
+                                       deleting = 0;                           
        
+                               }
+                               
+                       function addInput(focusme)
+                       {
+                           var li = $(document.createElement("li"));
+                       var input = $(document.createElement("input"));
+                       
+                       li.attr({"class": "bit-input","id": elemid + 
"_annoninput"});        
+                       input.attr({"type": "text","class": "maininput","size": 
"1"});        
+                       holder.append(li.append(input));
+                       
+                       input.focus(
+                           function()
+                           {
+                               complete.fadeIn("fast");
+                           }
+                       );
+                       
+                       input.blur(
+                           function()
+                           {
+                               complete.fadeOut("fast");
+                           }
+                       );
+                       
+                       holder.click(
+                           function()
+                           {
+                               input.focus();
+                                           if (feed.length && 
input.val().length) 
+                                           {
+                                                   feed.show();
+                                           }
+                                           else 
+                                           {                           
+                                                   feed.hide();
+                                                               
browser_msie?browser_msie_frame.hide():'';
+                                                   
complete.children(".default").show();
+                                           }
+                           }
+                       );
+                       
+                                       input.keypress(
+                           function(event)
+                           {                                                   
+                               if (event.keyCode == 13)
+                                                       {
+                                                           return false;
+                                                       }
+                                                       //auto expand input     
                                                
+                                                       
input.attr("size",input.val().length + 1);                                      
                
+                           }
+                       );
+                                       
+                                       input.keydown(
+                           function(event)
+                           {                                                   
+                                                       //prevent to enter some 
bad chars when input is empty
+                                                       if(event.keyCode == 191)
+                                                       {                       
                                        
+                                                               
event.preventDefault();
+                                                               return false;
+                                                       }                       
                                        
+                           }
+                       );
+                                       
+                       input.keyup(
+                           function(event)
+                           {
+                                                       var etext = 
xssPrevent(input.val());
+                                                                               
                                
+                                                       if (event.keyCode == 8 
&& etext.length == 0)
+                                                       {                       
+                                                               feed.hide();
+                                                               
browser_msie?browser_msie_frame.hide():'';                              
+                                                               if 
(holder.children("li.bit-box.deleted").length == 0) 
+                                                               {
+                                                                       
holder.children("li.bit-box:last").addClass("deleted");
+                                                                       return 
false;
+                                                               }
+                                                               else 
+                                                               {
+                                                                       if 
(deleting)
+                                                                   {
+                                                                       return;
+                                                                   }
+                                                                       
deleting = 1;
+                                                                       
holder.children("li.bit-box.deleted").fadeOut("fast", function()
+                                                                       {
+                                                                               
removeItem($(this));
+                                                                               
return false;
+                                                                       });
+                                                               }
+                                                       }
+                                                       
+                               if (event.keyCode != 40 && event.keyCode != 38 
&& etext.length != 0) 
+                               {
+                                   counter = 0;                                
                                                                    
+                                                               
+                                   if (options.json_url) 
+                                   {
+                                       if (options.cache && json_cache) 
+                                       {
+                                           addMembers(etext);
+                                           bindEvents();
+                                       }
+                                       else 
+                                       {
+                                           $.getJSON(options.json_url + 
"?tag=" + etext, null, 
+                                               function(data)
+                                               {
+                                                   addMembers(etext, data);
+                                                   json_cache = true;
+                                                   bindEvents();
+                                               }
+                                           );
+                                       }
+                                   }
+                                   else 
+                                   {
+                                                                       
addMembers(etext);
+                                       bindEvents();
+                                   }
+                                   complete.children(".default").hide();
+                                                               feed.show();
+                               }
+                           }
+                       );
+                                       if (focusme)
+                                       {
+                                               setTimeout(function(){
+                                                       input.focus();
+                                                       
complete.children(".default").show();
+                                               },1);
+                                       }                                       
            
+                       }
+                       
+                               function addMembers(etext, data)
+                               {
+                                       feed.html('');
+                                       
+                                       if (!options.cache) 
+                                       {
+                                               cache = new Array();
+                                               search_string = "";
+                                       }
+                                       
+                                       addTextItem(etext);
+                                       
+                                       if (data != null && data.length)
+                                       {
+                                               $.each(data, 
+                               function(i, val)
+                               {
+                                                               cache.push (
+                                                                       {
+                                                                               
caption: val.caption,
+                                                                               
value: val.value
+                                                                       }
+                                                               );
+                                                               search_string 
+= "" + (cache.length - 1) + ":" + val.caption + ";";
+                                                       }
+                                               );      
+                                       }
+                                       
+                                       var maximum = 
options.maxshownitems<cache.length?options.maxshownitems:cache.length;
+                                       var filter = "i";
+                                       if (options.filter_case)
+                                       {
+                                               filter = ""; 
+                                       }
+                                       
+                                       var myregexp, match;
+                                       try {
+                                               myregexp = 
eval('/(?:^|;)\\s*(\\d+)\\s*:[^;]*?' + etext + '[^;]*/g' + filter);
+                                               match = 
myregexp.exec(search_string);
+                                       } catch(ex){};
+                                                                               
+                                       var content = '';
+                                       while (match != null && maximum > 0) 
+                                       {
+                                               var id = match[1];              
                                
+                                               var object = cache[id]; 
+                                               if (options.filter_selected && 
element.children("option[value=" + object.value + "]").hasClass("selected")) 
+                                               {
+                                                       //nothing here...
+                                               }
+                                               else 
+                                               {
+                                                       content += '<li rel="' 
+ object.value + '">' + itemIllumination(object.caption, etext) + '</li>';
+                                                       counter++;
+                                                       maximum--;
+                                               }                               
                
+                                               match = 
myregexp.exec(search_string);
+                                       }
+                                       feed.append(content);
+                                       
+                                       if (options.firstselected)
+                                       {
+                                           focuson = 
feed.children("li:visible:first");
+                                           focuson.addClass("auto-focus");
+                                       }
+                                       
+                                       if (counter > options.height) 
+                       {
+                           feed.css({"height": (options.height * 24) + 
"px","overflow": "auto"});
+                                               if (browser_msie)
+                           {
+                               browser_msie_frame.css({"height": 
(options.height * 24) + "px", "width": feed.width() + "px"}).show();
+                           }
+                       }
+                       else 
+                       {
+                           feed.css("height", "auto");
+                                               if (browser_msie)
+                           {
+                               browser_msie_frame.css({"height": feed.height() 
+ "px", "width": feed.width() + "px"}).show();
+                           }
+                       }                               
+                               }
+                               
+                               function itemIllumination(text, etext)
+                               {
+                                       if (options.filter_case) 
+                    {     
+                                               try {
+                                                       eval("var text = 
text.replace(/(.*)(" + etext + ")(.*)/gi,'$1<em>$2</em>$3');");
+                                               } catch(ex){};
+                    }
+                    else 
+                    {    
+                                               try {
+                                                       eval("var text = 
text.replace(/(.*)(" + etext.toLowerCase() + ")(.*)/gi,'$1<em>$2</em>$3');");
+                                               }catch(ex){};
+                    }                                  
+                                       return text;
+                               }
+                       
+                       function bindFeedEvent() 
+                       {               
+                               feed.children("li").mouseover(
+                                   function()
+                                   {
+                                           
feed.children("li").removeClass("auto-focus");
+                               $(this).addClass("auto-focus");
+                               focuson = $(this);
+                           }
+                       );
+                               
+                               feed.children("li").mouseout(
+                                   function()
+                                   {
+                               $(this).removeClass("auto-focus");
+                               focuson = null;
+                           }
+                       );
+                       }
+                       
+                       function removeFeedEvent() 
+                       {               
+                               feed.children("li").unbind("mouseover");        
+                               feed.children("li").unbind("mouseout");
+                               feed.mousemove(
+                                   function () 
+                                   {
+                                           bindFeedEvent();
+                                           feed.unbind("mousemove");
+                                   }
+                               );      
+                       }
+                       
+                       function bindEvents()
+                       {
+                           var maininput = $("#"+elemid + 
"_annoninput").children(".maininput");                               
+                       bindFeedEvent();        
+                       feed.children("li").unbind("mousedown");        
+                       feed.children("li").mousedown( 
+                           function()
+                           {
+                               var option = $(this);
+                               addItem(option.text(),option.attr("rel"));
+                               feed.hide();
+                                                       
browser_msie?browser_msie_frame.hide():'';
+                               complete.hide();
+                           }
+                       );
+                       
+                       maininput.unbind("keydown");
+                       maininput.keydown(
+                           function(event)
+                           {           
+                                                       if(event.keyCode == 191)
+                                                       {                       
                                        
+                                                               
event.preventDefault();
+                                                               return false;
+                                                       }
+                                                                               
                
+                                                       if (event.keyCode != 8) 
+                                                       {
+                                                               
holder.children("li.bit-box.deleted").removeClass("deleted");
+                                                       }
+                                                       
+                               if (event.keyCode == 13 && checkFocusOn()) 
+                               {
+                                   var option = focuson;
+                                   addItem(option.text(), option.attr("rel"));
+                                   complete.hide();
+                                   event.preventDefault();
+                                                               focuson = null;
+                                                               return false;
+                               }
+                                                       
+                                                       if (event.keyCode == 13 
&& !checkFocusOn()) 
+                               {
+                                                               if 
(options.newel) 
+                                                               {
+                                                                       var 
value = xssPrevent($(this).val());
+                                                                       
addItem(value, value);
+                                                                       
complete.hide();
+                                                                       
event.preventDefault();
+                                                                       focuson 
= null;
+                                                               }
+                                                               return false;   
                                                
+                               }
+                               
+                               if (event.keyCode == 40) 
+                               {               
+                                                   removeFeedEvent();
+                                   if (focuson == null || focuson.length == 0) 
+                                   {
+                                       focuson = 
feed.children("li:visible:first");
+                                                           
feed.get(0).scrollTop = 0;
+                                   }
+                                   else 
+                                   {
+                                       focuson.removeClass("auto-focus");
+                                       focuson = 
focuson.nextAll("li:visible:first");
+                                                           var prev = 
parseInt(focuson.prevAll("li:visible").length,10);
+                                                           var next = 
parseInt(focuson.nextAll("li:visible").length,10);
+                                                           if ((prev > 
Math.round(options.height /2) || next <= Math.round(options.height /2)) && 
typeof(focuson.get(0)) != "undefined") 
+                                                           {
+                                                                   
feed.get(0).scrollTop = parseInt(focuson.get(0).scrollHeight,10) * (prev - 
Math.round(options.height /2));
+                                                           }
+                                   }
+                                                   
feed.children("li").removeClass("auto-focus");
+                                   focuson.addClass("auto-focus");
+                               }
+                               if (event.keyCode == 38) 
+                               {
+                                                   removeFeedEvent();
+                                   if (focuson == null || focuson.length == 0) 
+                                   {
+                                       focuson = 
feed.children("li:visible:last");
+                                                           
feed.get(0).scrollTop = parseInt(focuson.get(0).scrollHeight,10) * 
(parseInt(feed.children("li:visible").length,10) - Math.round(options.height 
/2));
+                                   }
+                                   else 
+                                   {
+                                       focuson.removeClass("auto-focus");
+                                       focuson = 
focuson.prevAll("li:visible:first");
+                                                           var prev = 
parseInt(focuson.prevAll("li:visible").length,10);
+                                                           var next = 
parseInt(focuson.nextAll("li:visible").length,10);
+                                                           if ((next > 
Math.round(options.height /2) || prev <= Math.round(options.height /2)) && 
typeof(focuson.get(0)) != "undefined") 
+                                                           {
+                                                                   
feed.get(0).scrollTop = parseInt(focuson.get(0).scrollHeight,10) * (prev - 
Math.round(options.height /2));
+                                                           }
+                                   }
+                                                   
feed.children("li").removeClass("auto-focus");
+                                   focuson.addClass("auto-focus");
+                               }                                               
                                                        
+                           }
+                       );
+                       }
+                       
+                       function addTextItem(value)
+                       {                                       
+                       if (options.newel) 
+                       {
+                           feed.children("li[fckb=1]").remove();
+                           if (value.length == 0)
+                           {
+                               return;
+                           }
+                           var li = $(document.createElement("li"));
+                           li.attr({"rel": value,"fckb": "1"}).html(value);
+                           feed.prepend(li);
+                                       counter++;
+                       } else 
+                                       {
+                                               return;
+                                       }
+                   }
+                       
+                               function funCall(func,item)
+                               {       
+                                       var _object = "";                       
+                                       for(i=0;i < 
item.get(0).attributes.length;i++)
+                                       {       
+                                               if 
(item.get(0).attributes[i].nodeValue != null) 
+                                               {
+                                                       _object += "\"_" + 
item.get(0).attributes[i].nodeName + "\": \"" + 
item.get(0).attributes[i].nodeValue + "\",";
+                                               }
+                                       }
+                                       _object = "{"+ _object + " notinuse: 
0}";
+                                       try {
+                                               eval(func + "(" + _object + 
")");
+                                       }catch(ex){};
+                               }
+                               
+                               function checkFocusOn()
+                       {
+                           if (focuson == null)
+                           {
+                               return false;
+                           }
+                           if (focuson.length == 0)
+                           {
+                               return false;
+                           }
+                           return true;
+                       }
+                               
+                               function xssPrevent(string)
+                {                                      
+                    string = 
string.replace(/[\"\'][\s]*javascript:(.*)[\"\']/g, "\"\"");
+                    string = string.replace(/script(.*)/g, "");    
+                    string = string.replace(/eval\((.*)\)/g, "");
+                    string = 
string.replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '');
+                    return string;
+                }
+                               
+                       var options = $.extend({
+                                       json_url: null,
+                                       cache: false,
+                                       height: "10",
+                                       newel: false,
+                                               firstselected: false,
+                                       filter_case: false,
+                                       filter_hide: false,
+                                       complete_text: "Start to type...",
+                                               maxshownitems:  30,
+                                               onselect: "",
+                                               onremove: ""
+                               }, opt);
+                       
+                       //system variables
+                       var holder              = null;
+                       var feed                = null;
+                       var complete            = null;
+                       var counter             = 0;
+                       var cache               = new Array();
+                               var json_cache          = false;
+                               var search_string       = "";
+                       var focuson             = null;
+                       var deleting            = 0;
+                               var browser_msie        = "\v"=="v";
+                               var browser_msie_frame;
+                               
+                       var element = $(this);
+                       var elemid = element.attr("id");
+                       init();
+
+                       return this;
+                       });
+           };
+    }
+);
\ No newline at end of file

Added: plugins/dmTagPlugin/web/js/jquery.fcbkcomplete.min.js
===================================================================
--- plugins/dmTagPlugin/web/js/jquery.fcbkcomplete.min.js                       
        (rev 0)
+++ plugins/dmTagPlugin/web/js/jquery.fcbkcomplete.min.js       2010-02-11 
13:24:24 UTC (rev 27890)
@@ -0,0 +1,53 @@
+/*
+ FCBKcomplete 2.6.1
+ - Jquery version required: 1.2.x, 1.3.x
+ 
+ Changelog:
+ 
+ - 2.00        new version of fcbkcomplete
+ 
+ - 2.01 fixed bugs & added features
+               fixed filter bug for preadded items
+               focus on the input after selecting tag
+               the element removed pressing backspace when the element is 
selected
+               input tag in the control has a border in IE7
+               added iterate over each match and apply the plugin separately
+               set focus on the input after selecting tag
+ 
+ - 2.02 fixed fist element selected bug
+               fixed defaultfilter error bug
+ 
+ - 2.5         removed selected="selected" attribute due ie bug
+               element search algorithm changed
+               better performance fix added
+               fixed many small bugs
+               onselect event added
+               onremove event added
+               
+ - 2.6         ie6/7 support fix added
+               added new public method addItem due request
+               added new options "firstselected" that you can set true/false 
to select first element on dropdown list
+               autoexpand input element added
+               removeItem bug fixed
+               and many more bug fixed
+
+ - 2.6.1
+               fixed public method to use it 
$("elem").trigger("addItem",[{"title": "test", "value": "test"}]);
+ */
+
+/* Coded by: emposha <[email protected]> */
+/* Copyright: Emposha.com <http://www.emposha.com/> - Distributed under MIT - 
Keep this message! */
+/*
+ * json_url         - url to fetch json object
+ * cache                       - use cache
+ * height           - maximum number of element shown before scroll will apear
+ * newel            - show typed text like a element
+ * firstselected       - automaticly select first element from dropdown
+ * filter_case      - case sensitive filter
+ * filter_selected  - filter selected items from list
+ * complete_text    - text for complete page
+ * maxshownitems       - maximum numbers that will be shown at dropdown list 
(less better performance)
+ * onselect                    - fire event on item select
+ * onremove                    - fire event on item remove
+ */
+jQuery(function($){$.fn.fcbkcomplete=function(opt){return 
this.each(function(){function init(){createFCBK();preSet();addInput(0)}function 
createFCBK(){element.hide();element.attr("multiple","multiple");if(element.attr("name").indexOf("[]")==-1){element.attr("name",element.attr("name")+"[]")}holder=$(document.createElement("ul"));holder.attr("class","holder");element.after(holder);complete=$(document.createElement("div"));complete.addClass("facebook-auto");complete.append('<div
 
class="default">'+options.complete_text+"</div>");if(browser_msie){complete.append('<iframe
 class="ie6fix" scrolling="no" 
frameborder="0"></iframe>');browser_msie_frame=complete.children('.ie6fix')}feed=$(document.createElement("ul"));feed.attr("id",elemid+"_feed");complete.prepend(feed);holder.after(complete);feed.css("width",complete.width())}function
 
preSet(){element.children("option").each(function(i,option){option=$(option);if(option.hasClass("selected")){addItem(option.text(),option.val(),true);option.attr("selected","selected")}else{option.removeAttr("selected")}cache.push({caption:option.text(),value:option.val()});search_string+=""+(cache.length-1)+":"+option.text()+";"})}$(this).bind("addItem",function(event,data){addItem(data.title,data.value)});function
 addItem(title,value,preadded){var li=document.createElement("li");var 
txt=document.createTextNode(title);var 
aclose=document.createElement("a");$(li).attr({"class":"bit-box","rel":value});$(li).prepend(txt);$(aclose).attr({"class":"closebutton","href":"#"});li.appendChild(aclose);holder.append(li);$(aclose).click(function(){$(this).parent("li").fadeOut("fast",function(){removeItem($(this))});return
 false});if(!preadded){$("#"+elemid+"_annoninput").remove();var 
_item;addInput(1);if(element.children("option[value="+value+"]").length){_item=element.children("option[value="+value+"]");_item.get(0).setAttribute("selected","selected");if(!_item.hasClass("selected")){_item.addClass("selected")}}else{var
 
_item=$(document.createElement("option"));_item.attr("value",value).get(0).setAttribute("selected","selected");_item.attr("value",value).addClass("selected");_item.text(title);element.append(_item)}if(options.onselect.length){funCall(options.onselect,_item)}}holder.children("li.bit-box.deleted").removeClass("deleted");feed.hide();browser_msie?browser_msie_frame.hide():''}function
 removeItem(item){if(options.onremove.length){var 
_item=element.children("option[value="+item.attr("rel")+"]");funCall(options.onremove,_item)}element.children("option[value="+item.attr("rel")+"]").removeAttr("selected");element.children("option[value="+item.attr("rel")+"]").removeClass("selected");item.remove();deleting=0}function
 addInput(focusme){var li=$(document.createElement("li"));var 
input=$(document.createElement("input"));li.attr({"class":"bit-input","id":elemid+"_annoninput"});input.attr({"type":"text","class":"maininput","size":"1"});holder.append(li.append(input));input.focus(function(){complete.fadeIn("fast")});input.blur(function(){complete.fadeOut("fast")});holder.click(function(){input.focus();if(feed.length&&input.val().length){feed.show()}else{feed.hide();browser_msie?browser_msie_frame.hide():'';complete.children(".default").show()}});input.keypress(function(event){if(event.keyCode==13){return
 
false}input.attr("size",input.val().length+1)});input.keydown(function(event){if(event.keyCode==191){event.preventDefault();return
 false}});input.keyup(function(event){var 
etext=xssPrevent(input.val());if(event.keyCode==8&&etext.length==0){feed.hide();browser_msie?browser_msie_frame.hide():'';if(holder.children("li.bit-box.deleted").length==0){holder.children("li.bit-box:last").addClass("deleted");return
 
false}else{if(deleting){return}deleting=1;holder.children("li.bit-box.deleted").fadeOut("fast",function(){removeItem($(this));return
 
false})}}if(event.keyCode!=40&&event.keyCode!=38&&etext.length!=0){counter=0;if(options.json_url){if(options.cache&&json_cache){addMembers(etext);bindEvents()}else{$.getJSON(options.json_url+"?tag="+etext,null,function(data){addMembers(etext,data);json_cache=true;bindEvents()})}}else{addMembers(etext);bindEvents()}complete.children(".default").hide();feed.show()}});if(focusme){setTimeout(function(){input.focus();complete.children(".default").show()},1)}}function
 addMembers(etext,data){feed.html('');if(!options.cache){cache=new 
Array();search_string=""}addTextItem(etext);if(data!=null&&data.length){$.each(data,function(i,val){cache.push({caption:val.caption,value:val.value});search_string+=""+(cache.length-1)+":"+val.caption+";"})}var
 
maximum=options.maxshownitems<cache.length?options.maxshownitems:cache.length;var
 filter="i";if(options.filter_case){filter=""}var 
myregexp,match;try{myregexp=eval('/(?:^|;)\\s*(\\d+)\\s*:[^;]*?'+etext+'[^;]*/g'+filter);match=myregexp.exec(search_string)}catch(ex){};var
 content='';while(match!=null&&maximum>0){var id=match[1];var 
object=cache[id];if(options.filter_selected&&element.children("option[value="+object.value+"]").hasClass("selected")){}else{content+='<li
 
rel="'+object.value+'">'+itemIllumination(object.caption,etext)+'</li>';counter++;maximum--}match=myregexp.exec(search_string)}feed.append(content);if(options.firstselected){focuson=feed.children("li:visible:first");focuson.addClass("auto-focus")}if(counter>options.height){feed.css({"height":(options.height*24)+"px","overflow":"auto"});if(browser_msie){browser_msie_frame.css({"height":(options.height*24)+"px","width":feed.width()+"px"}).show()}}else{feed.css("height","auto");if(browser_msie){browser_msie_frame.css({"height":feed.height()+"px","width":feed.width()+"px"}).show()}}}function
 itemIllumination(text,etext){if(options.filter_case){try{eval("var text = 
text.replace(/(.*)("+etext+")(.*)/gi,'$1<em>$2</em>$3');")}catch(ex){}}else{try{eval("var
 text = 
text.replace(/(.*)("+etext.toLowerCase()+")(.*)/gi,'$1<em>$2</em>$3');")}catch(ex){}}return
 text}function 
bindFeedEvent(){feed.children("li").mouseover(function(){feed.children("li").removeClass("auto-focus");$(this).addClass("auto-focus");focuson=$(this)});feed.children("li").mouseout(function(){$(this).removeClass("auto-focus");focuson=null})}function
 
removeFeedEvent(){feed.children("li").unbind("mouseover");feed.children("li").unbind("mouseout");feed.mousemove(function(){bindFeedEvent();feed.unbind("mousemove")})}function
 bindEvents(){var 
maininput=$("#"+elemid+"_annoninput").children(".maininput");bindFeedEvent();feed.children("li").unbind("mousedown");feed.children("li").mousedown(function(){var
 
option=$(this);addItem(option.text(),option.attr("rel"));feed.hide();browser_msie?browser_msie_frame.hide():'';complete.hide()});maininput.unbind("keydown");maininput.keydown(function(event){if(event.keyCode==191){event.preventDefault();return
 
false}if(event.keyCode!=8){holder.children("li.bit-box.deleted").removeClass("deleted")}if(event.keyCode==13&&checkFocusOn()){var
 
option=focuson;addItem(option.text(),option.attr("rel"));complete.hide();event.preventDefault();focuson=null;return
 false}if(event.keyCode==13&&!checkFocusOn()){if(options.newel){var 
value=xssPrevent($(this).val());addItem(value,value);complete.hide();event.preventDefault();focuson=null}return
 
false}if(event.keyCode==40){removeFeedEvent();if(focuson==null||focuson.length==0){focuson=feed.children("li:visible:first");feed.get(0).scrollTop=0}else{focuson.removeClass("auto-focus");focuson=focuson.nextAll("li:visible:first");var
 prev=parseInt(focuson.prevAll("li:visible").length,10);var 
next=parseInt(focuson.nextAll("li:visible").length,10);if((prev>Math.round(options.height/2)||next<=Math.round(options.height/2))&&typeof(focuson.get(0))!="undefined"){feed.get(0).scrollTop=parseInt(focuson.get(0).scrollHeight,10)*(prev-Math.round(options.height/2))}}feed.children("li").removeClass("auto-focus");focuson.addClass("auto-focus")}if(event.keyCode==38){removeFeedEvent();if(focuson==null||focuson.length==0){focuson=feed.children("li:visible:last");feed.get(0).scrollTop=parseInt(focuson.get(0).scrollHeight,10)*(parseInt(feed.children("li:visible").length,10)-Math.round(options.height/2))}else{focuson.removeClass("auto-focus");focuson=focuson.prevAll("li:visible:first");var
 prev=parseInt(focuson.prevAll("li:visible").length,10);var 
next=parseInt(focuson.nextAll("li:visible").length,10);if((next>Math.round(options.height/2)||prev<=Math.round(options.height/2))&&typeof(focuson.get(0))!="undefined"){feed.get(0).scrollTop=parseInt(focuson.get(0).scrollHeight,10)*(prev-Math.round(options.height/2))}}feed.children("li").removeClass("auto-focus");focuson.addClass("auto-focus")}})}function
 
addTextItem(value){if(options.newel){feed.children("li[fckb=1]").remove();if(value.length==0){return}var
 
li=$(document.createElement("li"));li.attr({"rel":value,"fckb":"1"}).html(value);feed.prepend(li);counter++}else{return}}function
 funCall(func,item){var 
_object="";for(i=0;i<item.get(0).attributes.length;i++){if(item.get(0).attributes[i].nodeValue!=null){_object+="\"_"+item.get(0).attributes[i].nodeName+"\":
 \""+item.get(0).attributes[i].nodeValue+"\","}}_object="{"+_object+" notinuse: 
0}";try{eval(func+"("+_object+")")}catch(ex){}}function 
checkFocusOn(){if(focuson==null){return false}if(focuson.length==0){return 
false}return true}function 
xssPrevent(string){string=string.replace(/[\"\'][\s]*javascript:(.*)[\"\']/g,"\"\"");string=string.replace(/script(.*)/g,"");string=string.replace(/eval\((.*)\)/g,"");string=string.replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','');return
 string}var 
options=$.extend({json_url:null,cache:false,height:"10",newel:false,firstselected:false,filter_case:false,filter_hide:false,complete_text:"Start
 to type...",maxshownitems:30,onselect:"",onremove:""},opt);var holder=null;var 
feed=null;var complete=null;var counter=0;var cache=new Array();var 
json_cache=false;var search_string="";var focuson=null;var deleting=0;var 
browser_msie="\v"=="v";var browser_msie_frame;var element=$(this);var 
elemid=element.attr("id");init();return this})}});
\ No newline at end of file

Added: plugins/dmTagPlugin/web/js/launcher.js
===================================================================
--- plugins/dmTagPlugin/web/js/launcher.js                              (rev 0)
+++ plugins/dmTagPlugin/web/js/launcher.js      2010-02-11 13:24:24 UTC (rev 
27890)
@@ -0,0 +1,14 @@
+(function($)
+{
+  $(function() {
+    // admin
+    $('#dm_admin_content div.sf_widget_form_dm_tags_autocomplete 
select').fcbkcomplete({
+      json_url: $.dm.ctrl.getHref('+/dmTagAdmin/getTagsForAutocomplete'),
+      cache: true,
+      filter_case: true,
+      filter_hide: true,
+      newel: true
+    });
+  });
+  
+})(jQuery);
\ No newline at end of file

-- 
You received this message because you are subscribed to the Google Groups 
"symfony SVN" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/symfony-svn?hl=en.

Reply via email to