49function ajax_autocompleter($selected, $htmlname, $url, $urloption =
'', $minLength = 2, $autoselect = 0, $ajaxoptions = array(), $moreparams =
'')
51 if (empty($minLength)) {
55 $dataforrenderITem =
'ui-autocomplete';
56 $dataforitem =
'ui-autocomplete-item';
58 if (defined(
'JS_QUERY_AUTOCOMPLETE_RENDERITEM')) {
59 $dataforrenderITem = constant(
'JS_QUERY_AUTOCOMPLETE_RENDERITEM');
61 if (defined(
'JS_QUERY_AUTOCOMPLETE_ITEM')) {
62 $dataforitem = constant(
'JS_QUERY_AUTOCOMPLETE_ITEM');
65 $htmlnamejquery = str_replace(
'.',
'\\\\.', $htmlname);
69 $script =
'<input type="hidden" name="'.$htmlname.
'" id="'.$htmlname.
'" value="'.$selected.
'" '.($moreparams ? $moreparams :
'').
' />';
71 $script .=
'<!-- Javascript code for autocomplete of field '.$htmlname.
' -->'.
"\n";
72 $script .=
'<script>'.
"\n";
73 $script .=
'$(document).ready(function() {
74 var autoselect = '.((int) $autoselect).
';
75 var options = '.json_encode($ajaxoptions).
'; /* Option of actions to do after keyup, or after select */
77 /* Remove selected id as soon as we type or delete a char (it means old selection is wrong). Use keyup/down instead of change to avoid losing the product id. This is needed only for select of predefined product */
78 $("input#search_'.$htmlnamejquery.
'").keydown(function(e) {
79 if (e.keyCode != 9) /* If not "Tab" key */
81 if (e.keyCode == 13) { return false; } /* disable "ENTER" key useful for barcode readers */
82 console.log("Clear id previously selected for field '.$htmlname.
'");
83 $("#'.$htmlnamejquery.
'").val("");
87 // Check options for secondary actions when keyup
88 $("input#search_'.$htmlnamejquery.
'").keyup(function() {
89 if ($(this).val().length == 0)
91 $("#search_'.$htmlnamejquery.
'").val("");
92 $("#'.$htmlnamejquery.
'").val("").trigger("change");
93 if (options.option_disabled) {
94 $("#" + options.option_disabled).removeAttr("disabled");
96 if (options.disabled) {
97 $.each(options.disabled, function(key, value) {
98 $("#" + value).removeAttr("disabled");
101 if (options.update) {
102 $.each(options.update, function(key, value) {
103 $("#" + key).val("").trigger("change");
107 $.each(options.show, function(key, value) {
108 $("#" + value).hide().trigger("hide");
111 if (options.update_textarea) {
112 $.each(options.update_textarea, function(key, value) {
113 if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") {
114 CKEDITOR.instances[key].setData("");
116 $("#" + key).html("");
123 // Activate the autocomplete to execute the GET
124 $("input#search_'.$htmlnamejquery.
'").autocomplete({
125 source: function( request, response ) {
126 $.get("'.$url.($urloption ?
'?'.$urloption :
'').
'", { "'.str_replace(
'.',
'_', $htmlname).
'": request.term }, function(data){
129 response($.map( data, function(item) {
130 console.log("Received answer from ajax GET, we populate array to return to the jquery autocomplete");
131 if (autoselect == 1 && data.length == 1) {
132 $("#search_'.$htmlnamejquery.
'").val(item.value);
136 // When product has only one price by qty and 1 result, must set data attributes before triggering change
137 $("#'.$htmlname.
'").attr("data-pbq", item.pbq);
138 $("#'.$htmlname.
'").attr("data-pbqup", item.price_ht);
139 $("#'.$htmlname.
'").attr("data-pbqbase", item.pricebasetype);
140 $("#'.$htmlname.
'").attr("data-pbqqty", item.qty);
141 $("#'.$htmlname.
'").attr("data-pbqpercent", item.discount);
145 $("#'.$htmlnamejquery.
'").val(item.key).trigger("change");
148 if (item.labelhtml != null) {
149 label = item.labelhtml.toString();
150 } else if (item.label != null) {
151 label = item.label.toString();
154 if (options.update) {
155 $.each(options.update, function(key, value) {
156 update[key] = item[value];
160 if (options.update_textarea) {
161 $.each(options.update_textarea, function(key, value) {
162 textarea[key] = item[value];
166 return { label: label,
169 disabled: item.disabled,
175 discount: item.discount,
176 pricebasetype: item.pricebasetype,
177 price_ht: item.price_ht,
178 price_ttc: item.price_ttc,
179 price_unit_ht: item.price_unit_ht,
180 price_unit_ht_locale: item.price_unit_ht_locale,
181 multicurrency_code: item.multicurrency_code,
182 multicurrency_unitprice: item.multicurrency_unitprice,
183 description : item.description,
184 ref_customer: item.ref_customer,
186 default_vat_code: item.default_vat_code,
187 supplier_ref: item.supplier_ref
191 console.error("Error: Ajax url '.$url.($urloption ?
'?'.$urloption :
'').
' has returned an empty page. Should be an empty json array.");
196 minLength: '.((
int) $minLength).
',
197 select: function( event, ui ) { // Function ran once a new value has been selected into the javascript combo
198 console.log("We will trigger change on input '.$htmlname.
' because of the select definition of autocomplete code for input#search_'.$htmlname.
'");
199 console.log("Selected id = "+ui.item.id+" - If this value is null, it means you select a record with key that is null so selection is not effective");
201 console.log("Before, we propagate some properties, retrieved by the ajax of the get, into the data-xxx properties of the component #'.$htmlnamejquery.
'");
202 //console.log(ui.item);
204 // For supplier price and customer when price by quantity is off
205 $("#'.$htmlnamejquery.
'").attr("data-up", ui.item.price_ht);
206 $("#'.$htmlnamejquery.
'").attr("data-up-locale", ui.item.price_unit_ht_locale);
207 $("#'.$htmlnamejquery.
'").attr("data-base", ui.item.pricebasetype);
208 $("#'.$htmlnamejquery.
'").attr("data-qty", ui.item.qty);
209 $("#'.$htmlnamejquery.
'").attr("data-discount", ui.item.discount);
210 $("#'.$htmlnamejquery.
'").attr("data-description", ui.item.description);
211 $("#'.$htmlnamejquery.
'").attr("data-ref-customer", ui.item.ref_customer);
212 $("#'.$htmlnamejquery.
'").attr("data-tvatx", ui.item.tva_tx);
213 $("#'.$htmlnamejquery.
'").attr("data-default-vat-code", ui.item.default_vat_code);
214 $("#'.$htmlnamejquery.
'").attr("data-supplier-ref", ui.item.supplier_ref); // supplier_ref of price
216 // For multi-currency values
217 $("#'.$htmlnamejquery.
'").attr("data-multicurrency-code", ui.item.multicurrency_code);
218 $("#'.$htmlnamejquery.
'").attr("data-multicurrency-unitprice", ui.item.multicurrency_unitprice);
222 // For customer price when PRODUIT_CUSTOMER_PRICES_BY_QTY is on
223 console.log("PRODUIT_CUSTOMER_PRICES_BY_QTY is on, so we propagate also prices by quantity into data-pbqxxx properties");
224 $("#'.$htmlnamejquery.
'").attr("data-pbq", ui.item.pbq);
225 $("#'.$htmlnamejquery.
'").attr("data-pbqup", ui.item.price_ht);
226 $("#'.$htmlnamejquery.
'").attr("data-pbqbase", ui.item.pricebasetype);
227 $("#'.$htmlnamejquery.
'").attr("data-pbqqty", ui.item.qty);
228 $("#'.$htmlnamejquery.
'").attr("data-pbqpercent", ui.item.discount);
232 // A new value has been selected, we trigger the handlers on #htmlnamejquery
233 console.log("Now, we trigger changes on #'.$htmlnamejquery.
'");
234 $("#'.$htmlnamejquery.
'").val(ui.item.id).trigger("change"); // Select new value
236 // Complementary actions
238 // Disable an element
239 if (options.option_disabled) {
240 console.log("Make action option_disabled on #"+options.option_disabled+" with disabled="+ui.item.disabled)
241 if (ui.item.disabled) {
242 $("#" + options.option_disabled).prop("disabled", true);
244 $.jnotify(options.error, "error", true); // Output with jnotify the error message
246 if (options.warning) {
247 $.jnotify(options.warning, "warning", false); // Output with jnotify the warning message
250 $("#" + options.option_disabled).removeAttr("disabled");
254 if (options.disabled) {
255 console.log("Make action \'disabled\' on each "+options.option_disabled)
256 $.each(options.disabled, function(key, value) {
257 $("#" + value).prop("disabled", true);
261 console.log("Make action \'show\' on each "+options.show)
262 $.each(options.show, function(key, value) {
263 $("#" + value).show().trigger("show");
268 if (ui.item.update) {
269 console.log("Make action \'update\' on each ui.item.update (if there is)")
270 // loop on each "update" fields
271 $.each(ui.item.update, function(key, value) {
272 console.log("Set value "+value+" into #"+key);
273 $("#" + key).val(value).trigger("change");
276 if (ui.item.textarea) {
277 console.log("Make action \'textarea\' on each ui.item.textarea (if there is)")
278 $.each(ui.item.textarea, function(key, value) {
279 if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") {
280 CKEDITOR.instances[key].setData(value);
281 CKEDITOR.instances[key].focus();
283 $("#" + key).html(value);
284 $("#" + key).focus();
288 console.log("ajax_autocompleter new value selected, we trigger change also on original component so on field #search_'.$htmlname.
'");
290 $("#search_'.$htmlnamejquery.
'").trigger("change"); // We have changed value of the combo select, we must be sure to trigger all js hook binded on this event. This is required to trigger other javascript change method binded on original field by other code.
294 const widgetData = $("input#search_'.$htmlnamejquery.
'").data("'.$dataforrenderITem.
'");
296 widgetData._renderItem = function( ul, item ) {
298 .data( "'.$dataforitem.
'", item ) // jQuery UI > 1.10.0
299 .append( \'<a><span class="tag">\' + item.label + "</span></a>" )
305 $script .=
'</script>';
475function ajax_combobox($htmlname, $events = array(), $minLengthToAutocomplete = 0, $forcefocus = 0, $widthTypeOfAutocomplete =
'resolve', $idforemptyvalue =
'-1', $morecss =
'')
480 if (!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone' &&
getDolGlobalString(
'MAIN_DISALLOW_SELECT2_WITH_SMARTPHONE')) {
487 if (empty(
$conf->use_javascript_ajax)) {
490 if (!
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') && !defined(
'REQUIRE_JQUERY_MULTISELECT')) {
497 if (empty($minLengthToAutocomplete)) {
498 $minLengthToAutocomplete = 0;
501 $moreselect2theme = ($morecss ?
dol_escape_js(
' '.$morecss) :
'');
502 $moreselect2theme = preg_replace(
'/widthcentpercentminus[^\s]*/',
'', $moreselect2theme);
504 $tmpplugin =
'select2';
505 $msg =
"\n".
'<!-- JS CODE TO ENABLE '.$tmpplugin.
' for id = '.$htmlname.
' -->
507 $(document).ready(function () {
508 $(\''.(
dol_escape_js(preg_match(
'/^\./', $htmlname) ? $htmlname :
'#'.$htmlname)).
'\').
'.$tmpplugin.'({
510 if (preg_match(
'/onrightofpage/', $morecss)) {
511 $msg .=
' dropdownAutoWidth: true, dropdownParent: $(\'#'.$htmlname.
'\').parent(),
'."\n";
513 $msg .= ' width: \
''.dol_escape_js($widthTypeOfAutocomplete).
'\',
514 minimumInputLength:
'.((int) $minLengthToAutocomplete).',
515 language: (typeof select2arrayoflanguage === \
'undefined\') ? \'en\' : select2arrayoflanguage,
516 matcher: function (params, data) {
517 if ($.trim(params.term) === "") {
520 keywords = (params.term).split(" ");
521 for (var i = 0; i < keywords.length; i++) {
522 if (((data.text).toUpperCase()).indexOf((keywords[i]).toUpperCase()) == -1) {
528 theme: \'default'.dol_escape_js($moreselect2theme).
'\',
529 containerCssClass: \
':all:\', /* Line to add class of origin SELECT propagated to the new <span class="select2-selection...> tag */
530 selectionCssClass: \':all:\', /* Line to add class of origin SELECT propagated to the new <span class="select2-selection...> tag */
531 dropdownCssClass: \'ui-dialog\',
532 templateResult: function (data, container) { /* Format visible output into combo list */
533 /* Code to add class of origin OPTION propagated to the new select2 <li> tag */
534 if (data.element) { $(container).addClass($(data.element).attr("class")); }
535 //console.log("data html is "+$(data.element).attr("data-html"));
536 if (data.id == \''.(dol_escape_js($idforemptyvalue)).
'\' && $(data.element).attr(
"data-html") == undefined) {
539 if ($(data.element).attr("data-html") != undefined) {
540 /* If property html set, we decode html entities and use this. */
541 /* Note that HTML content must have been sanitized from js with dol_escape_htmltag(xxx, 0, 0, \'\', 0, 1) when building the select option. */
542 if (typeof htmlEntityDecodeJs === "function") {
543 return htmlEntityDecodeJs($(data.element).attr("data-html"));
548 templateSelection: function (selection) { /* Format visible output of selected value */
549 if (selection.id == \''.(dol_escape_js($idforemptyvalue)).
'\')
return \
'<span class="placeholder">\'+selection.text+\'</span>\';
550 return selection.text;
552 escapeMarkup: function(markup) {
557 $msg .=
'.select2(\'focus\')';
562 $msg .=
"</script>\n";
663function ajax_constantonoff($code, $input = array(), $entity =
null, $revertonoff = 0, $strict = 0, $forcereload = 0, $marginleftonlyshort = 2, $forcenoajax = 0, $setzeroinsteadofdel = 0, $suffix =
'', $mode =
'', $morecss =
'inline-block', $userconst = 0, $showwarning =
'')
665 global
$conf, $langs, $user, $db;
667 $entity = ((isset($entity) && is_numeric($entity) && $entity >= 0) ? $entity :
$conf->entity);
668 if (!isset($input)) {
672 if (empty(
$conf->use_javascript_ajax) || $forcenoajax) {
674 $out =
'<a '.($morecss ?
'class="'.$morecss.
'" ' :
'').
'href="'.$_SERVER[
'PHP_SELF'].
'?action=set_'.$code.
'&token='.
newToken().
'&entity='.$entity.($mode ?
'&mode='.$mode :
'').($forcereload ?
'&dol_resetcache=1' :
'').
'">'.
img_picto($langs->trans(
"Disabled"),
'off').
'</a>';
676 $out =
'<a '.($morecss ?
'class="'.$morecss.
'" ' :
'').
' href="'.$_SERVER[
'PHP_SELF'].
'?action=del_'.$code.
'&token='.
newToken().
'&entity='.$entity.($mode ?
'&mode='.$mode :
'').($forcereload ?
'&dol_resetcache=1' :
'').
'">'.
img_picto($langs->trans(
"Enabled"),
'on').
'</a>';
680 if (is_object($userconst)) {
681 $userconstid = $userconst->id;
682 } elseif (is_numeric($userconst) && $userconst > 0) {
683 $userconstid = $userconst;
684 $userconst =
new User($db);
685 $userconst->fetch($userconstid);
688 $out =
"\n<!-- Ajax code to switch constant ".$code.
" -->".
'
690 $(document).ready(function() {
691 var input = '.json_encode($input).
';
692 var url = \''.DOL_URL_ROOT.
'/core/ajax/constantonoff.php\';
694 var entity = \
''.dol_escape_js((
string) $entity).
'\';
695 var strict = \
''.dol_escape_js((
string) $strict).
'\';
696 var userid = \
''.dol_escape_js((
string) $user->id).
'\';
697 var userconst =
'.((int) $userconstid).';
698 var yesButton = \
''.dol_escape_js($langs->transnoentities(
"Yes")).
'\';
699 var noButton = \
''.dol_escape_js($langs->transnoentities(
"No")).
'\';
700 var token = \
''.currentToken().
'\';
701 var warning = \
''.dol_escape_js($showwarning).
'\';
704 $(
"#set_" + code).click(
function() {
709 if (input.alert && input.alert.set) {
710 if (input.alert.set.yesButton) yesButton = input.alert.set.yesButton;
711 if (input.alert.set.noButton) noButton = input.alert.set.noButton;
712 confirmConstantAction(
"set", url, code, input, input.alert.set, entity, yesButton, noButton, strict, userid, token);
714 setConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, 1, userconst);
719 $(
"#del_" + code).click(
function() {
720 if (input.alert && input.alert.del) {
721 if (input.alert.del.yesButton) yesButton = input.alert.del.yesButton;
722 if (input.alert.del.noButton) noButton = input.alert.del.noButton;
723 confirmConstantAction(
"del", url, code, input, input.alert.del, entity, yesButton, noButton, strict, userid, token);
725 if (empty($setzeroinsteadofdel)) {
726 $out .= ' delConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, userconst);
';
728 $out .= ' setConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, 0, userconst);
';
735 if (!empty($userconst) && $userconst instanceof User) {
736 $value = getDolUserString($code, '', $userconst);
738 $value = getDolGlobalString($code);
740 $out .= '<div
id=
"confirm_'.$code.'" title=
"" style=
"display: none;"></div>
';
741 $out .= '<span
id=
"set_'.$code.'" class=
"valignmiddle inline-block linkobject '.($value ? 'hideobject' : '').($morecss ? ' '.$morecss : '').'">
'.($revertonoff ? img_picto($langs->trans("Enabled"), 'switch_on
', '', 0, 0, 0, '', '', $marginleftonlyshort) : img_picto($langs->trans("Disabled"), 'switch_off
', '', 0, 0, 0, '', '', $marginleftonlyshort)).'</span>
';
742 $out .= '<span
id=
"del_'.$code.'" class=
"valignmiddle inline-block linkobject '.($value ? '' : 'hideobject').($morecss ? ' '.$morecss : '').'">
'.($revertonoff ? img_picto($langs->trans("Disabled"), 'switch_off
'.$suffix, '', 0, 0, 0, '', '', $marginleftonlyshort) : img_picto($langs->trans("Enabled"), 'switch_on
'.$suffix, '', 0, 0, 0, '', '', $marginleftonlyshort)).'</span>
';
766function ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input = array(), $morecss = '
', $htmlname = '', $forcenojs = 0, $moreparam = '')
768 global $conf, $langs;
770 if (empty($htmlname)) {
776 if (!empty($conf->use_javascript_ajax) && empty($forcenojs)) {
779 var input =
'.json_encode($input).';
782 $(
"#set_'.$htmlname.'_'.$object->id.'").click(
function() {
783 console.log(
"Click managed by ajax_object_onoff");
784 $.get(
"'.DOL_URL_ROOT.'/core/ajax/objectonoff.php", {
786 field: \''.dol_escape_js($field).
'\',
789 id: \
''.((int)
$object->id).
'\',
790 token: \
''.currentToken().
'\'
793 $(
"#set_'.$htmlname.'_'.$object->id.'").hide();
794 $(
"#del_'.$htmlname.'_'.$object->id.'").show();
796 if (input.disabled && input.disabled.length > 0) {
797 $.each(input.disabled,
function(key,value) {
798 $(
"#" + value).removeAttr(
"disabled");
799 if ($(
"#" + value).hasClass(
"butActionRefused") == true) {
800 $(
"#" + value).removeClass(
"butActionRefused");
801 $(
"#" + value).addClass(
"butAction");
805 }
else if (input.showhide && input.showhide.length > 0) {
806 $.each(input.showhide,
function(key,value) {
807 $(
"#" + value).show();
814 $(
"#del_'.$htmlname.'_'.$object->id.'").click(
function() {
815 console.log(
"Click managed by ajax_object_onoff");
816 $.get(
"'.DOL_URL_ROOT.'/core/ajax/objectonoff.php", {
818 field: \''.dol_escape_js($field).
'\',
821 id: \''.((int)
$object->id).
'\',
825 $("#del_'.$htmlname.
'_'.
$object->id.
'").hide();
826 $("#set_'.$htmlname.
'_'.
$object->id.
'").show();
827 // Disable another element
828 if (input.disabled && input.disabled.length > 0) {
829 $.each(input.disabled, function(key,value) {
830 $("#" + value).prop("disabled", true);
831 if ($("#" + value).hasClass("butAction") == true) {
832 $("#" + value).removeClass("butAction");
833 $("#" + value).addClass("butActionRefused");
836 // Hide another element
837 } else if (input.showhide && input.showhide.length > 0) {
838 $.each(input.showhide, function(key,value) {
839 $("#" + value).hide();
848 $switchon =
'switch_on';
849 $switchoff =
'switch_off';
852 $tmparray = explode(
':', $text_on);
853 if (!empty($tmparray[1])) {
854 $text_on = $tmparray[0];
855 $switchon = $tmparray[1];
856 if (!empty($tmparray[2])) {
857 $cssswitchon = $tmparray[2];
860 $tmparray = explode(
':', $text_off);
861 if (!empty($tmparray[1])) {
862 $text_off = $tmparray[0];
863 $switchoff = $tmparray[1];
864 if (!empty($tmparray[2])) {
865 $cssswitchoff = $tmparray[2];
869 if (empty(
$conf->use_javascript_ajax) || $forcenojs) {
870 $out .=
'<a id="set_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'hideobject' :
'').($morecss ?
' '.$morecss :
'').
'" href="'.DOL_URL_ROOT.
'/core/ajax/objectonoff.php?action=set&token='.
newToken().
'&id='.((int)
$object->id).
'&element='.urlencode(
$object->element).
'&field='.urlencode($field).
'&value=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.($moreparam ?
'&'.$moreparam :
'')).
'">'.
img_picto($langs->trans($text_off), $switchoff,
'', 0, 0, 0,
'', $cssswitchoff).
'</a>';
871 $out .=
'<a id="del_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'' :
'hideobject').($morecss ?
' '.$morecss :
'').
'" href="'.DOL_URL_ROOT.
'/core/ajax/objectonoff.php?action=set&token='.
newToken().
'&id='.((int)
$object->id).
'&element='.urlencode(
$object->element).
'&field='.urlencode($field).
'&value=0&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.($moreparam ?
'&'.$moreparam :
'')).
'">'.
img_picto($langs->trans($text_on), $switchon,
'', 0, 0, 0,
'', $cssswitchon).
'</a>';
873 $out .=
'<span id="set_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'hideobject' :
'').($morecss ?
' '.$morecss :
'').
'">'.
img_picto($langs->trans($text_off), $switchoff,
'', 0, 0, 0,
'', $cssswitchoff).
'</span>';
874 $out .=
'<span id="del_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'' :
'hideobject').($morecss ?
' '.$morecss :
'').
'">'.
img_picto($langs->trans($text_on), $switchon,
'', 0, 0, 0,
'', $cssswitchon).
'</span>';
ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLength=2, $autoselect=0, $ajaxoptions=array(), $moreparams='')
Generic function that return javascript to add to transform a common input text or select field into ...
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
ajax_multiautocompleter($htmlname, $fields, $url, $option='', $minLength=2, $autoselect=0)
Generic function that return javascript to add to a page to transform a common input text field into ...
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)