<?php

/**
 * Genera una porzione di codice html a partire da una stringa nei seguenti formati:
 * campo <input> generico:
 * {[ "type": "text", "required": 1, "class": "", "value": "$idintervento$", "extra": "" ]}
 *
 * campo di testo normale e non modificabile
 * {[ "type": "span", "value": "$testo$" ]}
 *
 * <select>
 * {[ "type": "select", "required": 1, "class": "", "values": "query='SELECT id, descrizione FROM co_contratti WHERE idanagrafica=$idanagrafica$"', "value": "$idcontratto$", "extra": "" ]}
 *
 * Il parametro $records contiene il risultato della query di selezione record per fare i vari replace delle variabili racchiuse tra $$ nel template
 */
function build_html_element($str) {
	global $dbo;
	global $docroot;
	global $records;
	global $modules_info;
	global $id_record;

	preg_match('"value(.+?)\] \}"', $str, $script_value);
	if(count($script_value) != 0) {
		$script_value = $script_value[0];
		$str = str_replace($script_value, 'value": "', $str);
	}
	else unset($script_value);

	$str = str_replace("{[", "{", $str);
	$str = str_replace("]}", "}", $str);

	$json = json_decode($str, true);

	// Conversione variabili con campi di database
	foreach ($json as $name => $value) {
		if ($value == "") unset($json[$name]);
		// Sostituzione delle variabili $nome$ col relativo valore da database
		else if (preg_match_all('/\$([a-z0-9\_]+)\$/i', $json[$name], $m)) {
			for($i = 0; $i < sizeof($m[0]); $i ++) {
				$json[$name] = str_replace($m[0][$i], $records[0][$m[1][$i]], $json[$name]);
			}
		}
	}
	
	$attributi = array();
	array_push($attributi, "class");

	$valori = array();
	$valori["class"] = array();
	array_push($valori["class"], "form-control");

	if(isset($json["class"]) && $json["class"] != ""){
		$classes = explode(" ", $json["class"]);
		foreach ($classes as $class) {
			if ($class != "") array_push($valori["class"], $class);
		}
	}

	// Attributi particolari
	if (isset($json['disabled']) && $json['disabled'] == 1) array_push($attributi, "disabled");
	if (isset($json['readonly']) && $json['readonly'] == 1) array_push($attributi, "readonly");
	if (isset($json['required']) && $json['required'] == 1) array_push($attributi, "required");
	if (isset($json['maxlength']) && $json['maxlength'] != '') {
		array_push($attributi, "maxlength");
		$valori["maxlength"] = $json['maxlength'];
	}

	$value = (isset($json['value'])) ? $json['value'] : "";
	$element_id = (isset($json['id']) && $json['id'] != '') ? $json['id'] : str_replace(array("[","]"), "", $json['name']);

	// Rimuove caratteri indesiderati relativi al nome
	array_push($attributi, 'id');
	$valori["id"] = $element_id;
	array_push($attributi, 'name');
	$valori["name"] = $json['name'];

	// Label
	if (in_array("required", $attributi)) $json['label'] .= "*";

	$html = '
	<div class="form-group">';
	
	if (! isset($json['no-label']) || $json['no-label'] == 0){
		$html .= '
		<label for="' . $element_id . '">';
		if(isset($json['help']) && $json['help'] != "") $html .= '<span class="tip" title="'.$json['help'].'">';
		$html .=  $json['label'];
		if(isset($json['help']) && $json['help'] != "") $html .= '</span>';
		$html .= '</label>';
	}

	if (isset($json['icon-before']) || isset($json['icon-after'])) $html .= '
		<div class="input-group">';

	if (isset($json['icon-before'])) $html .= '
			<span class="input-group-addon">' . $json['icon-before'] . '</span>';

	switch ($json['type']) {
		case 'text' :
		case 'date' :
		case 'password' :
			if ($json['type'] == 'date') {
				array_push($attributi, "data-inputmask");
				$valori["data-inputmask"] = "'alias': 'dd/mm/yyyy'";
				array_push($valori["class"], "datepicker");

				if ($value == "0000-00-00 00:00:00" || $value == "0000-00-00") $value = "";
				else $value = date("d/m/Y", strtotime($value));

				if ($value == "01/01/1970") $value = "";
			}

			$tipo = ($json['type'] == 'password') ? $json['type'] : $tipo = 'text';
			array_push($attributi, 'type');
			$valori["type"] = $tipo;

			$html .= '
			<input |attr|>';
			break;

		case 'select' :
			$values = isset($json['values']) ? $json['values'] : "";

			if (isset($json['multiple']) && $json['multiple'] == 1) array_push($attributi, "multiple");

			if (isset($json['ajax-source']) && $json['ajax-source'] != "") {
				array_push($valori["class"], "superselectajax");
				array_push($attributi, "data-source");
				$valori["data-source"] = $json['ajax-source'];
			}
			else
				array_push($valori["class"], "superselect");

			$placeholder = isset($json['placeholder']) ? $json['placeholder'] : "- Seleziona un'opzione -";
			if (strpos($value, "Seleziona") !== false) {
				$placeholder = $value;
				$value = "";
			}

			$html .= '
			<select |attr|>';

			if (isset($json['ajax-source']) && $json['ajax-source'] != "" && $value != "") {
				$id_elemento = $value;
				$op = $json['ajax-source'];

				ob_start();
				include ($docroot . "/ajax_select2.php");
				$text = ob_get_clean();

				//Per debug, abilitare
				//echo $text;
				
				$array = json_decode($text);

				unset($id_elemento);
				unset($op);

				foreach ($array as $el) {
					$el = ( array ) $el;
					if (isset($el['children'])) {
						foreach ($el['children'] as $child) {
							$child = ( array ) $child;

							$sub_attr = array();
							if (in_array($child['id'], explode(',', $value)) || ($child['id'] == $value)) array_push($sub_attr, 'selected="true"');
							if ($child['_bgcolor_'] != '') array_push($sub_attr, 'style="background:' . $child['_bgcolor_'] . '; color:' . color_inverse($child['_bgcolor_']) . ';"');

							// Leggo ulteriori campi oltre a id e descrizione per inserirli nell'option nella forma "data-nomecampo1", "data-nomecampo2", ecc
							foreach ($child as $k => $v) {
								if ($k != 'id' && $k != 'text') array_push($sub_attr, 'data-' . $k . '="' . $v . '"');
							}

							$html .= '
				<option value="' . $child['id'] . '" ' . implode(" ", $sub_attr) . '>' . $child['text'] . '</option>';
						}
					}
					else {

						$sub_attr = array();
						if (in_array($el['id'], explode(',', $value)) || ($el['id'] == $value)) array_push($sub_attr, 'selected="true"');
						if ($el['_bgcolor_'] != '') array_push($sub_attr, 'style="background:' . $el['_bgcolor_'] . '; color:' . color_inverse($el['_bgcolor_']) . ';"');

						// Leggo ulteriori campi oltre a id e descrizione per inserirli nell'option nella forma "data-nomecampo1", "data-nomecampo2", ecc
						foreach ($el as $k => $v) {
							if ($k != 'id' && $k != 'text') array_push($sub_attr, 'data-' . $k . '="' . $v . '"');
						}

						$html .= '
				<option value="' . $el['id'] . '" ' . implode(" ", $sub_attr) . '>' . $el['text'] . '</option>';
					}
				}
			}
			// Generazione <select> da query
			else if (preg_match_all("/^query=(.+?)$/", $values, $m)) {
				$q = $m[1][0];
				$q = str_replace("<?php echo ", "\".", $q);
				$q = str_replace("; ?>", ".\"", $q);
				$q = str_replace("?>", ".\"", $q);
				eval("\$query = \"" . $q . "\";");
				$rs = $dbo->fetchArray($query);

				if (!isset($json['multiple']) || ! $json['multiple']) {
					$html .= '
				<option></option>';
				}

				// se non presente, carica eventuale valore predefinito
				if (($value == "0" || $value == "") && isset($json['valore_predefinito']) && $json['valore_predefinito'] != "") $value = get_var($json['valore_predefinito']);

				$prev = "";
				for($i = 0; $i < sizeof($rs); $i ++) {
					if (isset($rs[$i]["optgroup"])) {
						if ($prev != $rs[$i]["optgroup"]) {
							$html .= '
				<optgroup label="' . $rs[$i]["optgroup"] . '"></optgroup>';
							$prev = $rs[$i]["optgroup"];
						}
						$rs[$i]['descrizione'] = "&nbsp;&nbsp;&nbsp;" . $rs[$i]['descrizione'];
					}
					$sub_attr = array();
					if (in_array($rs[$i]['id'], explode(',', $value)) || ($rs[$i]['id'] == $value)) array_push($sub_attr, 'selected="true"');
					if (isset($rs[$i]['_bgcolor_']) && $rs[$i]['_bgcolor_'] != '') array_push($sub_attr, 'style="background:' . $rs[$i]['_bgcolor_'] . '; color:' . color_inverse($rs[$i]['_bgcolor_']) . ';"');

					// Leggo ulteriori campi oltre a id e descrizione per inserirli nell'option nella forma "data-nomecampo1", "data-nomecampo2", ecc
					foreach ($rs[$i] as $k => $v) {
						if ($k != 'id' && $k != 'descrizione' && $k != 'optgroup') array_push($sub_attr, 'data-' . $k . '="' . $v . '"');
					}

					$html .= '
				<option value="' . $rs[$i]['id'] . '" ' . implode(" ", $sub_attr) . '>' . $rs[$i]['descrizione'] . '</option>';
				}
			}

			// Generazione <select> da JSON
			// esempio creazione select con opzioni: Maschio, Femmina, Unisex
			// {[ "type": "select", "label": "Sesso", "name": "sesso", "required": 0, "class": "", "values": "list=\"\": \"\", \"M\": \"Maschio\", \"F\": \"Femmina\", \"U\": \"Unisex\"", "value": "$sesso$", "extra": "" ]}
			else if (preg_match_all("/^list=(.+?)$/", $values, $m)) {
				$data = json_decode("{" . $m[1][0] . "}");
				foreach ($data as $id => $etichetta) {
					$sub_attr = array();
					if ($id == $value) array_push($sub_attr, 'selected="true"');
					$html .= '
				<option value="' . $id . '" ' . implode(" ", $sub_attr) . '>' . $etichetta . '</option>';
				}
			}

			array_push($attributi, "data-placeholder");
			$valori["data-placeholder"] = $placeholder;

			$html .= '
			</select>';

			if (in_array("disabled", $attributi) || in_array("readonly", $attributi)) $html .= '
			<script>$("#' . $element_id . '").prop("disabled", true);</script>';

			if (in_array("readonly", $attributi)) {
				$html .= '
				<select class="hide" name="' . $json['name'] . '"';
				if (in_array("multiple", $attributi)) $html .= ' multiple';
				$html .= '>';

				$val = explode(",", $value);
				foreach ($val as $v) {
					$html .= '
				<option value="' . $v . '" selected="true"></option>';
				}

				$html .= '
			</select>';
			}

			break;

		case 'textarea' :
			$html .= '
			<textarea |attr|>' . $value . '</textarea>';
			unset($value);
			break;

		case 'checkbox' :
			if ($value == 1) {
				array_push($attributi, "checked");
				$valori["checked"] = "true";
				$value = "on";
			}

			if (in_array("readonly", $attributi)) array_push($attributi, "disabled");

			array_push($attributi, 'type');
			$valori["type"] = "checkbox";

			$placeholder = (isset($json["placeholder"])) ? $json["placeholder"] : $json["label"];

			$html .= '
			<div class="input-group">
				<span class="input-group-addon">
					<input |attr|>';
			if (in_array("readonly", $attributi)) $html .= '
					<input type="hidden" name="' . $json['name'] . '" value="' . $value . '">';
			$html .= '
				</span>
				<input type="text" class="form-control" placeholder="' . $placeholder . '" disabled>
			</div>';

			unset($valori["class"][0]);
			unset($value);

			break;

		case 'image' :
			unset($valori["class"][0]);
			// Form upload
			if ($value == '') {
				array_push($attributi, 'type');
				$valori["type"] = "file";
				$html .= '
			<input |attr|>';
			}
			// Visualizzazione immagine e spunta per cancellazione
			else {
				array_push($valori["class"], "img-thumbnail");
				array_push($valori["class"], "img-responsive");
				$html .= '
			<img src="' . $json['value'] . '" class="' . implode(" ", $valori["class"]) . '" id="img_' . $element_id . '" ' . $attr . ' ' . $json['extra'] . '><br>
			<label>
				<input type="checkbox" onclick="if( $(this).is(\':checked\') ){ $(\'#' . $element_id . '\').val(\'deleteme\'); }else{ $(\'#' . $element_id . '\').val( $(\'#prev_' . $element_id . '\').val() ); }">
				' . _("Elimina") . '
			</label>
			<input type="hidden" name="' . $json['name'] . '" value="' . $json['value'] . '" id="' . $element_id . '">
			<input type="hidden" name="prev_' . $json['name'] . '" value="' . $json['value'] . '" id="prev_' . $element_id . '">';
			}

			unset($value);

			break;

		default :
			$html .= "	<span |attr|>" . $value . "</span>\n";
			break;
	}

	if (isset($json['icon-after'])) {
		$html .= '
		<span class="input-group-addon';
		if (strpos("<button", $json['icon-after']) == 0) $html .= ' no-padding';
		$html .= '">' . $json['icon-after'] . '</span>';
	}

	if (isset($json['icon-before']) || isset($json['icon-after'])) {
		$html .= '
		</div>';
	}

	$html .= '
	</div>';

	if(isset($script_value) && $script_value != ""){
		$html .= '
	<script>
		$("#'.$element_id.'").val("'.addslashes($script_value).'");
	</script>';
	}

	if (isset($json['extra'])) array_push($attributi, trim($json['extra']));

	if (isset($value)) {
		array_push($attributi, 'value');
		$valori["value"] = $value;
	}

	$result = array();
	foreach ($attributi as $attributo) {
		$valore = $attributo;
		if (isset($valori[$attributo]) && $valori[$attributo] != "") {
			if (is_array($valori[$attributo])) $valore .= '="' . implode(" ", $valori[$attributo]) . '"';
			else $valore .= '="' . $valori[$attributo] . '"';
		}
		array_push($result, $valore);
	}

	$html = str_replace("|attr|", implode(" ", $result), $html);

	return $html;
}
?>