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.