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;
 }