<?php

/*
 * Dynamic Dependent Select Box using Jquery and Ajax
 * Created by Victor Golovko for the fans of Grocerycrud library.
 * SITE: http://svc.by
 * SKYPE: ipgolovko
 * E-MAIL: siptik@mail.ru
 */

class gc_dependent_select
{

    var $ci;
    var $grocery_crud_obj;
    var $fields;
    var $state;
    var $config;
    var $segment_name = 'get_items';
    var $id;
    var $field_name;
    var $data;

    function __construct(& $crud_obj = null, $fields = null, $config = null)
    {
	if (!isset($crud_obj) or !isset($fields) or !isset($config))
	    return false;
	$this->ci = & get_instance();
	$this->grocery_crud_obj = $crud_obj;
	$this->fields = $fields;
	$this->config = $config;
	if (!empty($fields))
	{
	    foreach ($fields as $k => $v)
	    {
		if (!empty($v['relate']))
		{
		    $this->grocery_crud_obj->callback_edit_field($k, array($this, 'callback_edit'));
		    $this->grocery_crud_obj->callback_add_field($k, array($this, 'callback_add'));
		}
	    }
	}
	$segs = $this->ci->uri->segment_array();
	if (in_array($this->segment_name, $segs))
	{
	    $this->field_name = $segs[(array_search($this->segment_name, $segs) + 1)];
	    $this->id = $segs[(array_search($this->segment_name, $segs) + 2)];
	    if (empty($this->id) || empty($this->field_name))
	    {
		echo 'Your data is damaged';
	    }
	    else
	    {
		$this->get_json();
		exit;
	    }
	}

	if (in_array("edit", $segs))
	{
	    if (!empty($segs[(array_search("edit", $segs) + 1)]))
	    {
		$this->id = $segs[(array_search("edit", $segs) + 1)];

		$this->data = $this->ci->db->get_where($this->config['main_table'], array($this->config['main_table_primary'] => $this->id))->row_array();
	    }
	}
    }

    function callback_edit($value, $primary_key, $field_info)
    {
	$i       = 0;
	$f_array = array();
	$parent = array();
	foreach ($this->fields as $k => $v)
	{
	    $v['field'] = $k;
	    $f_array[]  = $v;
	    if ($field_info->name == $k)
	    {
		$parent = $f_array[($i - 1)];
		break;
	    }
	    $i++;
	}
	$where  = array($this->fields[$field_info->name]['relate'] => $this->data[$parent['field']]);
	$result				    = $this->ci->db->get_where($field_info->extras[1], $where)->result_array();

	$html = '<select name="' . $field_info->name . '" class="chosen-select" data-placeholder="' . $this->fields[$field_info->name]['data-placeholder'] . '" style="width: 300px; display: none;">';
	if (!empty($result))
	{
	    foreach ($result as $item)
	    {
		$html.='<option value="' . $item[$this->fields[$field_info->name]['id_field']] . '"';
		if ($item[$this->fields[$field_info->name]['id_field']] == $value)
		{
		    $html.='selected="selected"';
		}
		$html.='>' . $item[$this->fields[$field_info->name]['title']] . '</option>';
	    }
	}

	$html.= '</select>';
	return $html;
    }

    function callback_add($value, $primary_key, $field_info)
    {
	$html = '<select name="' . $field_info->name . '" class="chosen-select" data-placeholder="' . $this->fields[$field_info->name]['data-placeholder'] . '" style="width: 300px; display: none;">';
	$html.= '</select>';
	return $html;
    }

    function get_js()
    {
	$js = '<script type="text/javascript">';
	$js.= '$(document).ready(function() {';

	$count = count($this->fields);
	$i     = 0;
	foreach ($this->fields as $k => $v)
	{
	    $js.= 'var ' . $k . ' = $(\'select[name="' . $k . '"]\');';
	    if (!empty($this->config['ajax_loader']))
	    {
		if ($i != $count - 1)
		{
		    $js.= '$(\'#' . $k . '_input_box\').append(\'<img src="' . $this->config['ajax_loader'] . '" border="0" id="' . $k . '_ajax_loader" class="dd_ajax_loader" style="display: none;">\');';
		}
	    }
	    if ($i > 0 && $this->grocery_crud_obj->getState() == 'add')
	    {
		$js.= '$(\'#' . $k . '_input_box\').hide();';
		$js.= $k . '.children().remove().end();';
	    }
	    $i++;
	};

	foreach ($this->fields as $a => $b)
	{
	    $field_data = array();
	    $field_data	  = $b;
	    $field_data['field'] = $a;
	    $dd_dropdowns[]      = $field_data;
	}
	for ($i		   = 1; $i <= sizeof($dd_dropdowns) - 1; $i++)
	{
	    $js.=$dd_dropdowns[$i - 1]['field'] . '.change(function() {';
	    $js.= 'var select_value = this.value;';

	    if (!empty($this->config['ajax_loader']))
	    {
		$js.= '$(\'#' . $dd_dropdowns[$i - 1]['field'] . '_ajax_loader\').show();';
	    }
	    $js.= $dd_dropdowns[$i]['field'] . '.find(\'option\').remove();';
	    $js.= 'var myOptions = "";';
	    $js.= '$.getJSON(\'' . $this->config['url'] . $this->segment_name . '/' . $dd_dropdowns[$i]['field'] . '/' . '\'+select_value, function(data) {';
	    $js.= $dd_dropdowns[$i]['field'] . '.append(\'<option value=""></option>\');';
	    $js.= '$.each(data, function(key, val) {';
	    $js.= $dd_dropdowns[$i]['field'] . '.append(';
	    $js.= '$(\'<option></option>\').val(val.value).html(val.property)';
	    $js.= ');';
	    $js.= '});';
	    $js.= '$(\'#' . $dd_dropdowns[$i]['field'] . '_input_box\').show();';
	    for ($x = $i + 1; $x <= sizeof($dd_dropdowns) - 1; $x++)
	    {
		$js.= '$(\'#' . $dd_dropdowns[$x]['field'] . '_input_box\').hide();';
	    };
	    $js.= $dd_dropdowns[$i - 1]['field'] . '.each(function(){';
	    $js.= '$(this).trigger("liszt:updated");';
	    $js.= '});';
	    $js.= $dd_dropdowns[$i]['field'] . '.each(function(){';
	    $js.= '$(this).trigger("liszt:updated");';
	    $js.= '});';
	    if (!empty($this->config['ajax_loader']))
	    {
		$js.= '$(\'#' . $dd_dropdowns[$i - 1]['field'] . '_ajax_loader\').hide();';
	    }
	    $js.= '});';
	    $js.= '});';
	};

	$js.='});';
	$js.='</script>';
	return $js;
    }

    public function get_json()
    {
	if (empty($this->fields[$this->field_name]))
	    die();
	$this->ci->db->select("*")
		->from($this->fields[$this->field_name]['table_name'])
		->where($this->fields[$this->field_name]['relate'], $this->id);
	$db = $this->ci->db->get();

	$array = array();
	foreach ($db->result_array() as $row):
	    $array[] = array("value"    => $row[$this->fields[$this->field_name]['id_field']], "property" => $row[$this->fields[$this->field_name]['title']]);
	endforeach;

	echo json_encode($array);
	exit;
    }

    function render()
    {
	$js     = $this->get_js();
	$output = $this->grocery_crud_obj->render();
	$output->output.= $js;
	return $output;
    }
    
    

}

?>