<?php

/**
 * Created by PhpStorm.
 * User: csibi
 * Date: 2014.10.23.
 * Time: 16:23
 */
$context = $runner->context;
$tree = \runner::stack('tree');
$branch = \Routerunner\Helper::tree_route($tree, $context['route']);
$accept = array();
if ($branch = \Routerunner\Helper::tree_route($tree, $context['route'])) {
    $accept = $branch;
}
$runner->context['accept'] = $accept;
if ($runner->model) {
    $runner->model->accept = $accept;
}
$debug = 1;
         unset($override["reference"]);
         $reference = $reference["reference"];
     } else {
         $reference = \bootstrap::get("reference");
     }
 }
 $label = "new element";
 $context = array("direct" => $reference, "silent" => true);
 $model = \model::load($context);
 if (is_array($model)) {
     $model = array_shift($model);
 }
 if ($model) {
     $label = $model->label;
 }
 $branch = \Routerunner\Helper::tree_route($tree, $route, $model);
 $container = array('traverse' => $route, 'selector' => '.rr-content-container', 'child_selector' => '.rr-model', 'reference' => $reference, 'parent' => $reference, 'prev' => '0', 'label' => $label, 'accept' => array());
 if (isset($branch["children"])) {
     unset($branch["children"]["submenu"]);
     foreach ($branch["children"] as $type => $model_data) {
         if (isset($model_data["blank"])) {
             $container["accept"][$type] = $model_data["blank"];
         } else {
             $container["accept"][$type] = array("label" => "new " . $type);
         }
     }
 }
 if ($override) {
     $container = array_merge($container, $override);
 }
 $return[] = $container;
 private function backend_wrapper($html = '', $type = 'model', $context = false)
 {
     if ($context) {
         $backend_type_context = $context;
     } elseif (is_callable($this->backend_context[$type])) {
         $backend_type_context = $this->backend_context[$type]($this);
     } else {
         $backend_type_context = $this->backend_context[$type];
     }
     if (!($tree = \runner::config("tree"))) {
         $scaffold = $this->scaffold_root;
         $tree = @(include $scaffold . '/model/tree.php');
     }
     if ($type == 'container') {
         // get parent model
         $parent = 0;
         if (isset($backend_type_context['parent'])) {
             $parent = $backend_type_context['parent'];
         }
         if (!$parent && $this->model && $this->model->reference && ($parents = \Routerunner\Bootstrap::parent($this->model->reference))) {
             $array_pop = array_pop($parents);
             $parent = $array_pop['reference'];
         }
         if (!$parent && isset($backend_type_context['traverse']) && is_array($traverse = $backend_type_context['traverse'])) {
             if (count($traverse) && ($lvl = array_pop($traverse)) && ($parent_table_id = \bootstrap::get($lvl))) {
                 if (is_array($parent_table_id)) {
                     $tmp_parent_table_id = false;
                     foreach ($parent_table_id["parents"] as $tmp_parent) {
                         if ($tmp_parent["model_class"] == $lvl) {
                             $tmp_parent_table_id = $tmp_parent["reference"];
                         }
                     }
                     if ($tmp_parent_table_id) {
                         $parent_table_id = $tmp_parent_table_id;
                     }
                 }
                 $SQL = 'SELECT reference FROM {PREFIX}models WHERE model_class = :class AND table_id = :table_id';
                 if ($result = \db::query($SQL, array(':class' => $lvl, ':table_id' => $parent_table_id))) {
                     $parent = $result[0]['reference'];
                 }
             }
         }
         // get acceptable models
         $accept = array();
         if (isset($backend_type_context['accept'])) {
             $accept = $backend_type_context['accept'];
         } elseif (isset($backend_type_context['traverse']) && ($branch = \Routerunner\Helper::tree_route($tree, $backend_type_context['traverse'], $this->model))) {
             foreach ($branch['children'] as $child_class => $child_params) {
                 if (isset($child_params['blank'])) {
                     $blank[] = $child_class;
                     $accept[$child_class] = $child_params['blank'];
                 }
             }
         }
         $backend_type_context['parent'] = $parent;
         $backend_type_context['blank'] = $accept;
         if (!isset($backend_type_context['wrapper'])) {
             $backend_type_context['wrapper'] = array('class' => '');
         } elseif (!isset($backend_type_context['wrapper']['class'])) {
             $backend_type_context['wrapper']['class'] = '';
         }
         $classes = explode(' ', $backend_type_context['wrapper']['class']);
         $classes = array_merge($classes, array_keys($accept));
         $backend_type_context['wrapper']['class'] .= implode(' ', $classes);
     }
     $dom = false;
     if ($html) {
         if (isset($backend_type_context['template']['opening'])) {
             $dom = \phpQuery::newDocument($backend_type_context['template']['opening'] . $html . $backend_type_context['template']['closing']);
             if (!$dom) {
                 $dom = \phpQuery::newDocumentHTML($html);
             }
         } elseif (isset($backend_type_context['wrapper']['element'])) {
             $dom = \phpQuery::newDocumentHTML($html, $charset = 'utf-8');
             $dom = $this->dom_wrapper($dom, $backend_type_context['wrapper']['element'], null);
         } else {
             $dom = \phpQuery::newDocumentHTML($html);
         }
     } elseif (isset($backend_type_context['wrapper']['element'])) {
         $html = '<' . $backend_type_context['wrapper']['element'] . '></' . $backend_type_context['wrapper']['element'] . '>';
         $dom = \phpQuery::newDocumentHTML($html);
     } elseif (isset($backend_type_context['template']['opening'])) {
         $html = $backend_type_context['template']['opening'] . $backend_type_context['template']['closing'];
         $dom = \phpQuery::newDocumentHTML($html);
     }
     $root_nodes = array();
     if ($dom && isset($backend_type_context['selector'])) {
         $root_nodes = pq($backend_type_context['selector'] . ":not(.routerunner-" . $type . ")");
     } elseif ($dom) {
         $root_nodes = $dom->children(":not(.routerunner-" . $type . ")");
     }
     $model = false;
     if ($type == 'model' && isset($this->model)) {
         $model = $this->model;
     } elseif ($type == 'container' && isset($backend_type_context['blank'])) {
         $model = new \stdClass();
         $model->reference = 0;
         foreach ($backend_type_context['blank'] as $blank_field => $blank_value) {
             $model->{$blank_field} = $blank_value;
         }
     }
     foreach ($root_nodes as $index => $node) {
         if (!in_array(strtolower($node->tagName), array("html", "head", "body", "script", "style"))) {
             if (!$this->unique) {
                 $this->unique = uniqid();
             }
             $backend_class = 'routerunner-backend routerunner-inline routerunner-' . $type . ' routerunner-' . $type . '-wrapper ';
             if (isset($backend_type_context['wrapper']['class'])) {
                 $backend_class .= $backend_type_context['wrapper']['class'] . ' ';
             }
             $pqnode = pq($node);
             $backend_context = $backend_type_context;
             unset($backend_context['wrapper']['element'], $backend_context['wrapper']['class'], $backend_context['wrapper']['attr'], $backend_context['template']['opening'], $backend_context['template']['closing']);
             $pqnode->removeAttr('data-routerunner-id');
             $pqnode->removeAttr('data-route');
             $pqnode->removeAttr('data-table_id');
             if ($model) {
                 foreach ($model as $data => $value) {
                     $pqnode->removeAttr('data-' . $data);
                 }
             }
             if (isset($backend_type_context['wrapper']['attr']) && is_array($backend_type_context['wrapper']['attr'])) {
                 foreach (array_keys($backend_type_context['wrapper']['attr']) as $attr) {
                     $pqnode->removeAttr($attr);
                 }
             }
             if (isset($backend_context) && is_array($backend_context)) {
                 foreach (array_keys($backend_context) as $data) {
                     $pqnode->removeAttr('data-' . $data);
                 }
             }
             // modify model tag
             if ($type == 'model' && $model) {
                 $this->backend_id[$index] = 'ref' . $model->reference . '_' . $this->unique;
                 $model->backend_ref = $this->backend_id[$index];
                 $pqnode->attr('data-routerunner-id', $this->backend_id[$index]);
                 $pqnode->attr('data-route', $this->router->runner->path . $this->router->runner->route);
                 $pqnode->attr('data-url', $model->url());
                 if ($model) {
                     foreach ($model as $data => $value) {
                         if (is_array($value)) {
                             $value = json_encode($value, JSON_HEX_APOS);
                         } else {
                             $value = htmlentities(addslashes(preg_replace('/\\n|\\r/m', '', $value)));
                         }
                         $pqnode->attr('data-' . $data, $value);
                     }
                 }
             } elseif ($type == 'container') {
                 $this->backend_id[$index] = 'route_' . trim(str_replace('/', '_', $this->path . $this->route), '_') . '_' . $this->unique;
                 $pqnode->attr('data-routerunner-id', $this->backend_id[$index]);
                 $pqnode->attr('data-route', $this->router->runner->path . $this->router->runner->route);
                 if ($model) {
                     foreach ($model as $attr => $value) {
                         $traverse_child = isset($backend_type_context['traverse']) ? $backend_type_context['traverse'] : array();
                         $traverse_child[] = $attr;
                         if ($branch = \Routerunner\Helper::tree_route($tree, $traverse_child)) {
                             foreach ($branch as $branch_attr => $branch_value) {
                                 if (substr($branch_attr, 0, 4) == 'btn-' || $branch_attr == 'icon') {
                                     $value[$branch_attr] = $branch_value;
                                 }
                             }
                         }
                         if (is_array($value)) {
                             $value = json_encode($value, JSON_HEX_APOS);
                         } else {
                             $value = htmlentities(addslashes(preg_replace('/\\n|\\r/m', '', $value)));
                         }
                         $pqnode->attr('data-' . str_replace("/", "-", $attr), $value);
                     }
                 }
             }
             if (isset($backend_type_context['wrapper']['attr']) && is_array($backend_type_context['wrapper']['attr'])) {
                 foreach ($backend_type_context['wrapper']['attr'] as $attr => $value) {
                     $pqnode->attr($attr, $value);
                 }
             }
             $backend_classes = explode(' ', $backend_class);
             foreach ($backend_classes as $class) {
                 if (!$pqnode->hasClass($class)) {
                     $pqnode->addClass($class);
                 }
             }
             if (isset($backend_context) && is_array($backend_context)) {
                 foreach ($backend_context as $data => $value) {
                     if (is_array($value)) {
                         $value = json_encode($value, JSON_HEX_APOS);
                     } else {
                         $value = htmlentities(addslashes(preg_replace('/\\n|\\r/m', '', $value)));
                     }
                     $pqnode->attr('data-' . $data, $value);
                 }
             }
         }
     }
     $return = "";
     if ($dom) {
         $return = $dom->htmlOuter();
     }
     return $return;
 }
}
$tree = \runner::stack('tree');
$route = false;
if ($branch = \Routerunner\Helper::tree_route($tree, $context['route'])) {
    if (isset($branch['children']['#' . $context['reference']])) {
        $route = '#' . $context['reference'];
    } elseif (isset($branch['children'][$context['model_class'] . '/' . $context['table_id']])) {
        $route = $context['model_class'] . '/' . $context['table_id'];
    } elseif (isset($branch['children'][$context['model_class']])) {
        $route = $context['model_class'];
    }
}
$traverse = \runner::stack('traverse');
if ($route) {
    $context['route'][] = $route;
    if ($node = \Routerunner\Helper::tree_route($tree, $context['route'])) {
        $parsed = \Routerunner\Helper::parse_array($node, $model, array("children"));
        $jstree = array('type' => $context['model_class']);
        if ($new_model) {
            $jstree['icon'] = 'fa fa-folder icon-state-warning';
        } elseif (isset($parsed['icon'])) {
            $jstree['icon'] = $parsed['icon'];
        }
        if (isset($traverse['current']['reference']) && $traverse['current']['reference'] == $context['reference']) {
            $jstree['selected'] = true;
        }
        $classes = array();
        // todo: or children in memory
        if ($children = \Routerunner\Bootstrap::children($context['reference'])) {
            $classes[] = $context["open"] ? 'jstree-open' : 'jstree-closed';
        }