50function ajax_autocompleter($selected, $htmlname, $url, $urloption =
'', $minLength = 2, $autoselect = 0, $ajaxoptions = array(), $moreparams =
'')
52 if (empty($minLength)) {
56 $dataforrenderITem =
'ui-autocomplete';
57 $dataforitem =
'ui-autocomplete-item';
59 if (defined(
'JS_QUERY_AUTOCOMPLETE_RENDERITEM')) {
60 $dataforrenderITem = constant(
'JS_QUERY_AUTOCOMPLETE_RENDERITEM');
62 if (defined(
'JS_QUERY_AUTOCOMPLETE_ITEM')) {
63 $dataforitem = constant(
'JS_QUERY_AUTOCOMPLETE_ITEM');
66 $htmlnamejquery = str_replace(
'.',
'\\\\.', $htmlname);
70 $script =
'<input type="hidden" name="'.$htmlname.
'" id="'.$htmlname.
'" value="'.$selected.
'" '.($moreparams ? $moreparams :
'').
' />';
72 $script .=
'<!-- Javascript code for autocomplete of field '.$htmlname.
' -->'.
"\n";
73 $script .=
'<script>'.
"\n";
74 $script .=
'$(document).ready(function() {
75 var autoselect = '.((int) $autoselect).
';
76 var options = '.json_encode($ajaxoptions).
'; /* Option of actions to do after keyup, or after select */
78 /* 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 */
79 $("input#search_'.$htmlnamejquery.
'").keydown(function(e) {
80 if (e.keyCode != 9) /* If not "Tab" key */
82 if (e.keyCode == 13) { return false; } /* disable "ENTER" key useful for barcode readers */
83 console.log("Clear id previously selected for field '.$htmlname.
'");
84 $("#'.$htmlnamejquery.
'").val("");
88 // Check options for secondary actions when keyup
89 $("input#search_'.$htmlnamejquery.
'").keyup(function() {
90 if ($(this).val().length == 0)
92 $("#search_'.$htmlnamejquery.
'").val("");
93 $("#'.$htmlnamejquery.
'").val("").trigger("change");
94 if (options.option_disabled) {
95 $("#" + options.option_disabled).removeAttr("disabled");
97 if (options.disabled) {
98 $.each(options.disabled, function(key, value) {
99 $("#" + value).removeAttr("disabled");
102 if (options.update) {
103 $.each(options.update, function(key, value) {
104 $("#" + key).val("").trigger("change");
108 $.each(options.show, function(key, value) {
109 $("#" + value).hide().trigger("hide");
112 if (options.update_textarea) {
113 $.each(options.update_textarea, function(key, value) {
114 if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") {
115 CKEDITOR.instances[key].setData("");
117 $("#" + key).html("");
124 // Activate the autocomplete to execute the GET
125 $("input#search_'.$htmlnamejquery.
'").autocomplete({
126 source: function( request, response ) {
127 $.get("'.$url.($urloption ?
'?'.$urloption :
'').
'", { "'.str_replace(
'.',
'_', $htmlname).
'": request.term }, function(data){
130 response($.map( data, function(item) {
131 console.log("Received answer from ajax GET, we populate array to return to the jquery autocomplete");
132 if (autoselect == 1 && data.length == 1) {
133 $("#search_'.$htmlnamejquery.
'").val(item.value);
137 // When product has only one price by qty and 1 result, must set data attributes before triggering change
138 $("#'.$htmlname.
'").attr("data-pbq", item.pbq);
139 $("#'.$htmlname.
'").attr("data-pbqup", item.price_ht);
140 $("#'.$htmlname.
'").attr("data-pbqbase", item.pricebasetype);
141 $("#'.$htmlname.
'").attr("data-pbqqty", item.qty);
142 $("#'.$htmlname.
'").attr("data-pbqpercent", item.discount);
146 $("#'.$htmlnamejquery.
'").val(item.key).trigger("change");
149 if (item.labelhtml != null) {
150 label = item.labelhtml.toString();
151 } else if (item.label != null) {
152 label = item.label.toString();
155 if (options.update) {
156 $.each(options.update, function(key, value) {
157 update[key] = item[value];
161 if (options.update_textarea) {
162 $.each(options.update_textarea, function(key, value) {
163 textarea[key] = item[value];
167 return { label: label,
170 disabled: item.disabled,
176 discount: item.discount,
177 pricebasetype: item.pricebasetype,
178 price_ht: item.price_ht,
179 price_ttc: item.price_ttc,
180 price_unit_ht: item.price_unit_ht,
181 price_unit_ht_locale: item.price_unit_ht_locale,
182 multicurrency_code: item.multicurrency_code,
183 multicurrency_unitprice: item.multicurrency_unitprice,
184 description : item.description,
185 ref_customer: item.ref_customer,
187 default_vat_code: item.default_vat_code,
188 supplier_ref: item.supplier_ref
192 console.error("Error: Ajax url '.$url.($urloption ?
'?'.$urloption :
'').
' has returned an empty page. Should be an empty json array.");
197 minLength: '.((
int) $minLength).
',
198 select: function( event, ui ) { // Function ran once a new value has been selected into the javascript combo
199 console.log("We will trigger change on input '.$htmlname.
' because of the select definition of autocomplete code for input#search_'.$htmlname.
'");
200 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");
202 console.log("Before, we propagate some properties, retrieved by the ajax of the get, into the data-xxx properties of the component #'.$htmlnamejquery.
'");
203 //console.log(ui.item);
205 // For supplier price and customer when price by quantity is off
206 $("#'.$htmlnamejquery.
'").attr("data-up", ui.item.price_ht);
207 $("#'.$htmlnamejquery.
'").attr("data-up-locale", ui.item.price_unit_ht_locale);
208 $("#'.$htmlnamejquery.
'").attr("data-base", ui.item.pricebasetype);
209 $("#'.$htmlnamejquery.
'").attr("data-qty", ui.item.qty);
210 $("#'.$htmlnamejquery.
'").attr("data-discount", ui.item.discount);
211 $("#'.$htmlnamejquery.
'").attr("data-description", ui.item.description);
212 $("#'.$htmlnamejquery.
'").attr("data-ref-customer", ui.item.ref_customer);
213 $("#'.$htmlnamejquery.
'").attr("data-tvatx", ui.item.tva_tx);
214 $("#'.$htmlnamejquery.
'").attr("data-default-vat-code", ui.item.default_vat_code);
215 $("#'.$htmlnamejquery.
'").attr("data-supplier-ref", ui.item.supplier_ref); // supplier_ref of price
217 // For multi-currency values
218 $("#'.$htmlnamejquery.
'").attr("data-multicurrency-code", ui.item.multicurrency_code);
219 $("#'.$htmlnamejquery.
'").attr("data-multicurrency-unitprice", ui.item.multicurrency_unitprice);
223 // For customer price when PRODUIT_CUSTOMER_PRICES_BY_QTY is on
224 console.log("PRODUIT_CUSTOMER_PRICES_BY_QTY is on, so we propagate also prices by quantity into data-pbqxxx properties");
225 $("#'.$htmlnamejquery.
'").attr("data-pbq", ui.item.pbq);
226 $("#'.$htmlnamejquery.
'").attr("data-pbqup", ui.item.price_ht);
227 $("#'.$htmlnamejquery.
'").attr("data-pbqbase", ui.item.pricebasetype);
228 $("#'.$htmlnamejquery.
'").attr("data-pbqqty", ui.item.qty);
229 $("#'.$htmlnamejquery.
'").attr("data-pbqpercent", ui.item.discount);
233 // A new value has been selected, we trigger the handlers on #htmlnamejquery
234 console.log("Now, we trigger changes on #'.$htmlnamejquery.
'");
235 $("#'.$htmlnamejquery.
'").val(ui.item.id).trigger("change"); // Select new value
237 // Complementary actions
239 // Disable an element
240 if (options.option_disabled) {
241 console.log("Make action option_disabled on #"+options.option_disabled+" with disabled="+ui.item.disabled)
242 if (ui.item.disabled) {
243 $("#" + options.option_disabled).prop("disabled", true);
245 $.jnotify(options.error, "error", true); // Output with jnotify the error message
247 if (options.warning) {
248 $.jnotify(options.warning, "warning", false); // Output with jnotify the warning message
251 $("#" + options.option_disabled).removeAttr("disabled");
255 if (options.disabled) {
256 console.log("Make action \'disabled\' on each "+options.option_disabled)
257 $.each(options.disabled, function(key, value) {
258 $("#" + value).prop("disabled", true);
262 console.log("Make action \'show\' on each "+options.show)
263 $.each(options.show, function(key, value) {
264 $("#" + value).show().trigger("show");
269 if (ui.item.update) {
270 console.log("Make action \'update\' on each ui.item.update (if there is)")
271 // loop on each "update" fields
272 $.each(ui.item.update, function(key, value) {
273 console.log("Set value "+value+" into #"+key);
274 $("#" + key).val(value).trigger("change");
277 if (ui.item.textarea) {
278 console.log("Make action \'textarea\' on each ui.item.textarea (if there is)")
279 $.each(ui.item.textarea, function(key, value) {
280 if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") {
281 CKEDITOR.instances[key].setData(value);
282 CKEDITOR.instances[key].focus();
284 $("#" + key).html(value);
285 $("#" + key).focus();
289 console.log("ajax_autocompleter new value selected, we trigger change also on original component so on field #search_'.$htmlname.
'");
291 $("#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.
295 const widgetData = $("input#search_'.$htmlnamejquery.
'").data("'.$dataforrenderITem.
'");
297 widgetData._renderItem = function( ul, item ) {
299 .data( "'.$dataforitem.
'", item ) // jQuery UI > 1.10.0
300 .append( \'<a><span class="tag">\' + item.label + "</span></a>" )
306 $script .=
'</script>';
476function ajax_combobox($htmlname, $events = array(), $minLengthToAutocomplete = 0, $forcefocus = 0, $widthTypeOfAutocomplete =
'resolve', $idforemptyvalue =
'-1', $morecss =
'')
481 if (!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone' &&
getDolGlobalString(
'MAIN_DISALLOW_SELECT2_WITH_SMARTPHONE')) {
488 if (empty(
$conf->use_javascript_ajax)) {
491 if (!
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') && !defined(
'REQUIRE_JQUERY_MULTISELECT')) {
498 if (empty($minLengthToAutocomplete)) {
499 $minLengthToAutocomplete = 0;
502 $moreselect2theme = ($morecss ?
dol_escape_js(
' '.$morecss) :
'');
503 $moreselect2theme = preg_replace(
'/widthcentpercentminus[^\s]*/',
'', $moreselect2theme);
505 $tmpplugin =
'select2';
506 $componentname = (preg_match(
'/^\./', $htmlname) ? $htmlname :
'#'.$htmlname);
508 $msg .=
'<!-- JS CODE TO ENABLE '.$tmpplugin.
' for id = '.$htmlname.
' -->'.
"\n";
509 $msg .=
"<script>\n";
510 $msg .=
'$(document).ready(function () {
511 $(\''.dol_escape_js($componentname).
'\').
'.$tmpplugin.'({
';
512 // when $morecss contains 'onrightofpage
', the select2 component must also be inside a parent with class="parentonrightofpage"
513 if (preg_match('/onrightofpage/
', $morecss)) { // In this cas, htmlname must be an ID not a class.
514 $msg .= ' dropdownAutoWidth:
true,
';
515 $msg .= ' dropdownParent: $(\
'#'.$htmlname.
'\').parent(),
';
519 width: \''.dol_escape_js($widthTypeOfAutocomplete).
'\',
520 minimumInputLength:
'.((int) $minLengthToAutocomplete).',
521 language: (typeof select2arrayoflanguage === \
'undefined\') ? \'en\' : select2arrayoflanguage,
522 matcher: function (params, data) {
523 if ($.trim(params.term) === "") { return data; }';
526 var term = params.term.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase()
527 var searchText = data.element ? $(data.element).attr("data-search") : undefined;
528 var text = (searchText !== undefined ? searchText : (data.text || "")).normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase() || "";';
531 var term = params.term.toLowerCase();
532 var searchText = data.element ? $(data.element).attr("data-search") : undefined;
533 var text = (searchText !== undefined ? searchText : (data.text || "")).toLowerCase();';
536 var keywords = term.split(" ");
537 for (var i = 0; i < keywords.length; i++) {
538 if (text.indexOf(keywords[i]) === -1) {
544 theme: \'default'.dol_escape_js($moreselect2theme).
'\',
545 containerCssClass: \
':all:\', /* Line to add class of origin SELECT propagated to the new <span class="select2-selection...> tag */
546 selectionCssClass: \':all:\', /* Line to add class of origin SELECT propagated to the new <span class="select2-selection...> tag */
547 dropdownCssClass: \'ui-dialog\',
548 templateResult: function (data, container) { /* Format visible output into combo list */
549 /* Code to add class of origin OPTION propagated to the new select2 <li> tag */
550 if (data.element) { $(container).addClass($(data.element).attr("class")); }
551 /* console.log("data html is "+$(data.element).attr("data-html")); */
552 if (data.id == \''.(dol_escape_js($idforemptyvalue)).
'\' && $(data.element).attr(
"data-html") == undefined) {
555 if ($(data.element).attr("data-html") != undefined) {
556 /* If property html set, we decode html entities and use this. */
557 /* Note that HTML content must have been sanitized against js injection with dol_escape_htmltag(xxx, 0, 0, \'\', 0, 1) when building the select option. */
558 if (typeof htmlEntityDecodeJs === "function") {
559 return htmlEntityDecodeJs($(data.element).attr("data-html"));
564 templateSelection: function (selection) { /* Format visible output of selected value */
565 if (selection.id == \''.(dol_escape_js($idforemptyvalue)).
'\')
return \
'<span class="placeholder">\'+selection.text+\'</span>\';
566 if (selection.element && $(selection.element).attr("data-select-html") != undefined) {
567 if (typeof htmlEntityDecodeJs === "function") {
568 return htmlEntityDecodeJs($(selection.element).attr("data-select-html"));
571 return selection.text;
573 escapeMarkup: function(markup) {
578 $msg .=
'.select2(\'focus\')';
583 $msg .=
"</script>\n";
685function 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 =
'', $disabled = 0)
689 $entity = ((isset($entity) && is_numeric($entity) && $entity >= 0) ? $entity :
$conf->entity);
690 if (!isset($input)) {
696 if (empty(
$conf->use_javascript_ajax) || $forcenoajax) {
698 $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>';
700 $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>';
704 if (is_object($userconst)) {
705 $userconstid = $userconst->id;
706 } elseif (is_numeric($userconst) && $userconst > 0) {
707 $userconstid = $userconst;
709 $userconst->fetch($userconstid);
713 $morecss .=
' disabled opacitymedium';
715 $out =
"\n<!-- Ajax code to switch constant ".$code.
" -->".
'
717 $(document).ready(function() {
718 var input = '.json_encode($input).
';
719 var url = \''.DOL_URL_ROOT.
'/core/ajax/constantonoff.php\';
721 var entity = \
''.dol_escape_js((
string) $entity).
'\';
722 var strict = \
''.dol_escape_js((
string) $strict).
'\';
723 var userid = \
''.dol_escape_js((
string) $user->id).
'\';
724 var userconst =
'.((int) $userconstid).';
725 var yesButton = \
''.dol_escape_js($langs->transnoentities(
"Yes")).
'\';
726 var noButton = \
''.dol_escape_js($langs->transnoentities(
"No")).
'\';
727 var token = \
''.currentToken().
'\';
728 var warning = \
''.dol_escape_js($showwarning).
'\';
731 $(
"#set_" + code).click(
function() {
736 if (input.alert && input.alert.set) {
737 if (input.alert.set.yesButton) yesButton = input.alert.set.yesButton;
738 if (input.alert.set.noButton) noButton = input.alert.set.noButton;
739 confirmConstantAction(
"set", url, code, input, input.alert.set, entity, yesButton, noButton, strict, userid, token);
741 setConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, 1, userconst);
746 $(
"#del_" + code).click(
function() {
747 if (input.alert && input.alert.del) {
748 if (input.alert.del.yesButton) yesButton = input.alert.del.yesButton;
749 if (input.alert.del.noButton) noButton = input.alert.del.noButton;
750 confirmConstantAction(
"del", url, code, input, input.alert.del, entity, yesButton, noButton, strict, userid, token);
752 if (empty($setzeroinsteadofdel)) {
753 $out .= ' delConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, userconst);
';
755 $out .= ' setConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, 0, userconst);
';
763 if (!empty($userconst) && $userconst instanceof User) {
764 $value = getDolUserString($code, '', $userconst);
766 $value = getDolGlobalString($code);
769 if (is_array($suffix)) {
770 $suffixon = $suffix['ifon
'];
771 $suffixoff = $suffix['ifoff
'];
772 } else { // old mode deprecated
773 $suffixon = (string) $suffix;
777 $out .= '<div
id=
"confirm_'.$code.'" title=
"" style=
"display: none;"></div>
';
778 $out .= '<span
id=
"set_'.$code.'" class=
"valignmiddle inline-block linkobject '.($value ? 'hideobject' : '').($morecss ? ' '.$morecss : '').'">
'.($revertonoff ? img_picto($langs->trans("Enabled"), 'switch_on
'.$suffixoff, '', 0, 0, 0, '', '', $marginleftonlyshort) : img_picto($langs->trans("Disabled"), 'switch_off
'.$suffixoff, '', 0, 0, 0, '', '', $marginleftonlyshort)).'</span>
';
779 $out .= '<span
id=
"del_'.$code.'" class=
"valignmiddle inline-block linkobject '.($value ? '' : 'hideobject').($morecss ? ' '.$morecss : '').'">
'.($revertonoff ? img_picto($langs->trans("Disabled"), 'switch_off
'.$suffixon, '', 0, 0, 0, '', '', $marginleftonlyshort) : img_picto($langs->trans("Enabled"), 'switch_on
'.$suffixon, '', 0, 0, 0, '', '', $marginleftonlyshort)).'</span>
';
804function ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input = array(), $morecss = '
', $htmlname = '', $forcenojs = 0, $moreparam = '', $readonly = 0)
806 global $conf, $langs;
808 if (empty($htmlname)) {
814 if (!empty($conf->use_javascript_ajax) && empty($forcenojs) && empty($readonly)) {
817 var input =
'.json_encode($input).';
820 $(
"#set_'.$htmlname.'_'.$object->id.'").click(
function() {
821 console.log(
"Click managed by ajax_object_onoff");
822 $.get(
"'.DOL_URL_ROOT.'/core/ajax/objectonoff.php", {
824 field: \''.dol_escape_js($field).
'\',
827 id: \
''.((int)
$object->id).
'\',
828 token: \
''.currentToken().
'\'
832 var data = JSON.parse(response);
835 console.log(response);
838 $(
"#set_'.$htmlname.'_'.$object->id.'").hide();
839 $(
"#del_'.$htmlname.'_'.$object->id.'").show();
841 if (input.disabled && input.disabled.length > 0) {
842 $.each(input.disabled,
function(key,value) {
843 $(
"#" + value).removeAttr(
"disabled");
844 if ($(
"#" + value).hasClass(
"butActionRefused") == true) {
845 $(
"#" + value).removeClass(
"butActionRefused");
846 $(
"#" + value).addClass(
"butAction");
850 }
else if (input.showhide && input.showhide.length > 0) {
851 $.each(input.showhide,
function(key,value) {
852 $(
"#" + value).show();
858 console.warn(response.responseText);
859 Dolibarr.tools.setEventMessage(response.responseText,
"errors");
865 $(
"#del_'.$htmlname.'_'.$object->id.'").click(
function() {
866 console.log(
"Click managed by ajax_object_onoff");
867 $.get(
"'.DOL_URL_ROOT.'/core/ajax/objectonoff.php", {
869 field: \''.dol_escape_js($field).
'\',
872 id: \''.((int)
$object->id).
'\',
877 var data = JSON.parse(response);
880 console.log(response);
883 $("#del_'.$htmlname.
'_'.
$object->id.
'").hide();
884 $("#set_'.$htmlname.
'_'.
$object->id.
'").show();
885 // Disable another element
886 if (input.disabled && input.disabled.length > 0) {
887 $.each(input.disabled, function(key,value) {
888 $("#" + value).prop("disabled", true);
889 if ($("#" + value).hasClass("butAction") == true) {
890 $("#" + value).removeClass("butAction");
891 $("#" + value).addClass("butActionRefused");
894 // Hide another element
895 } else if (input.showhide && input.showhide.length > 0) {
896 $.each(input.showhide, function(key,value) {
897 $("#" + value).hide();
902 //alert(response.responseText);
903 console.warn(response.responseText);
904 Dolibarr.tools.setEventMessage(response.responseText, "errors");
912 $switchon =
'switch_on';
913 $switchoff =
'switch_off';
916 $tmparray = explode(
':', $text_on);
917 if (!empty($tmparray[1])) {
918 $text_on = $tmparray[0];
919 $switchon = $tmparray[1];
920 if (!empty($tmparray[2])) {
921 $cssswitchon = $tmparray[2];
924 $tmparray = explode(
':', $text_off);
925 if (!empty($tmparray[1])) {
926 $text_off = $tmparray[0];
927 $switchoff = $tmparray[1];
928 if (!empty($tmparray[2])) {
929 $cssswitchoff = $tmparray[2];
933 if (empty(
$conf->use_javascript_ajax) || $forcenojs) {
934 $url = 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 :
''));
938 $out .=
'<a id="set_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'hideobject' :
'').($morecss ?
' '.$morecss :
'').
'" href="'.$url.
'">'.
img_picto($langs->trans($text_off), $switchoff,
'', 0, 0, 0,
'', $cssswitchoff).
'</a>';
939 $url = 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 :
''));
943 $out .=
'<a id="del_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'' :
'hideobject').($morecss ?
' '.$morecss :
'').
'" href="'.$url.
'">'.
img_picto($langs->trans($text_on), $switchon,
'', 0, 0, 0,
'', $cssswitchon).
'</a>';
945 $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>';
946 $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)