'README',
            'extension' => 'md',
            'codemirror' => array(
                'smartIndent' => false,
                'readOnly' => false,
            ),
        );
        $types['arduino'] = array(
            'label' => 'Source Arduino',
            'extension' => 'ino',
            'codemirror' => array(
                'mode' => 'clike',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['clike'] = array(
            'label' => 'Source C++/C',
            'extension' => 'cpp',
            'codemirror' => array(
                'mode' => 'clike',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['shell'] = array(
            'label' => 'Shell',
            'extension' => 'sh',
            'codemirror' => array(
                'mode' => 'shell',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['php'] = array(
            'label' => 'Source PHP',
            'extension' => 'php',
            'codemirror' => array(
                'mode' => 'php',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['python'] = array(
            'label' => 'Source Python',
            'extension' => 'py',
            'codemirror' => array(
                'mode' => 'python',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['c'] = array(
            'label' => 'Source C++',
            'extension' => 'cpp',
            'codemirror' => array(
                'mode' => 'clike',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['java'] = array(
            'label' => 'Source JAVA',
            'extension' => 'java',
            'codemirror' => array(
                'mode' => 'java',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['css'] = array(
            'label' => 'Feuille CSS',
            'extension' => 'css',
            'codemirror' => array(
                'mode' => 'css',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['javascript'] = array(
            'label' => 'Source Javascript',
            'extension' => 'js',
            'codemirror' => array(
                'mode' => 'javascript',
                'theme' => 'monokai',
                'lineNumbers' => true,
                'readOnly' => false,
            ),
        );
        $types['image'] = array(
            'label' => 'Image',
            'upload' => array(
                'url' => 'action.php?action=upload_resource',
                'element' => '#resource p img:eq(0)',
                'callback' => '$(\'#resource img:eq(0)\').attr(\'src\',r.url);',
            ),
        );
        $types['files'] = array(
            'label' => 'Set de fichiers',
            'upload' => array(
                'url' => 'action.php?action=upload_resource_file',
                'element' => '#dropZoneFiles',
                'callback' => 'search_file();',
            ),
            'extension' => 'zip',
        );
        $types['part'] = array(
            'label' => 'Set de composants',
            'extension' => 'part',
        );
        return $types;
    }
    public static function fromFileImport($file, $sketch, $type)
    {
        $resource = new Resource();
        $resource->sketch = $sketch->id;
        $stream = file_get_contents($file['tmp_name']);
        $resource->label = $file['name'];
        $resource->type = $type;
        switch ($resource->type) {
            case 'arduino':
            case 'php':
            case 'shell':
            case 'python':
            case 'c':
            case 'css':
            case 'javascript':
            case 'java':
            case 'readme':
                $resource->content = file_get_contents($file['tmp_name']);
                $enc = mb_detect_encoding($resource->content, 'UTF-8, ISO-8859-1, GBK');
                if ($enc != 'UTF-8') {
                    $resource->content = iconv($enc, 'utf-8', $resource->content);
                }
                $resource->save();
            break;
            case 'files':
                $resource->save();
                $path = SKETCH_PATH.'/'.$resource->id;
                if (!file_exists($path)) {
                    mkdir($path);
                }
                $zip = new ZipArchive();
                $res = $zip->open($file['tmp_name']);
                if ($res === true) {
                    $zip->extractTo($path);
                    $zip->close();
                }
            break;
            case 'image':
                $resource->save();
                $name = $resource->id.'.'.$ext;
                file_put_contents(SKETCH_PATH.$name, $stream);
                $resource->content = $name;
                $resource->save();
            break;
            default:
            break;
        }
    }
    public static function fromImport($res, $sketch)
    {
        global $myUser;
        $resource = new Resource();
        $resource->fromArray($res);
        $resource->id = null;
        $resource->sketch = $sketch->id;
        $stream = '';
        switch ($resource->type) {
            case 'image':
                $stream = base64_decode($resource->content);
                $resource->content = '';
            break;
            case 'part':
                $parts = $resource->content;
                $resource->content = '';
            break;
            case 'files':
                $files = $resource->content;
                $resource->content = '';
            break;
            default:
            break;
        }
        if (is_string($resource->content)) {
            $resource->content = htmlspecialchars_decode($resource->content);
        }
        $resource->save();
        switch ($resource->type) {
            case 'image':
                $resource->content = $resource->id.'.png';
                file_put_contents(SKETCH_PATH.$resource->content, $stream);
                $resource->save();
            break;
            case 'part':
                foreach ($parts as $p):
                    $part = new Part();
                    $part->fromArray($p['part']);
                    $part->id = null;
                    $stream = base64_decode($part->image);
                    $part->owner = $myUser->id;
                    $part->save();
                    $name = $part->id.'.png';
                    file_put_contents(PART_PATH.$name, $stream);
                    $part->image = $name;
                    $part->save();
                    $resourcePart = new ResourcePart();
                    $resourcePart->fromArray($p['resourcePart']);
                    $resourcePart->id = null;
                    $resourcePart->part = $part->id;
                    $resourcePart->resource = $resource->id;
                    $resourcePart->save();
                endforeach;
                $resource->content = '';
                $resource->save();
            break;
            case 'files':
                $folder = SKETCH_PATH.'/'.$resource->id;
                if (!file_exists($folder)) {
                    mkdir($folder);
                }
                foreach ($files as $file):
                    $stream = base64_decode($file['stream']);
                    file_put_contents($folder.'/'.$file['label'], $stream);
                endforeach;
                $resource->content = '';
                $resource->save();
            break;
            default:
            break;
        }
    }
    public static function toExport($resource)
    {
        $resource = $resource->toArray();
        switch ($resource['type']) {
            case 'image':
                $resource['content'] = base64_encode(file_get_contents(SKETCH_PATH.$resource['content']));
            break;
            case 'part':
                $resource['content'] = array();
                foreach (ResourcePart::loadAll(array('resource' => $resource['id'])) as $resourcePart):
                    $part = $resourcePart->part_object;
                    $part = $part->toArray();
                    $resourcePart = $resourcePart->toArray();
                    if ($part['image'] != '') {
                        $part['image'] = base64_encode(file_get_contents(PART_PATH.$part['image']));
                    }
                    $resource['content'][] = array('resourcePart' => $resourcePart, 'part' => $part);
                endforeach;
            break;
            case 'files':
                $resource['content'] = array();
                $folder = SKETCH_PATH.'/'.$resource['id'];
                foreach (glob($folder.'/*') as $file):
                    $resource['content'][] = array('label' => basename($file), 'stream' => base64_encode(file_get_contents($file)));
                endforeach;
            break;
            default:
                $resource['content'] = htmlspecialchars(SKETCH_PATH.$resource['content']);
            break;
        }
        return $resource;
    }
    public static function toHtml($resource, $sketch)
    {
        global $myUser;
        $response = array();
        $response = $resource->toArray();
        $type = self::get($resource->type);
        switch ($resource->type) {
                case 'image':
                        $image = $response['content'] == '' ? 'img/default_image.png' : 'action.php?action=get_resource_image&id='.$response['id'];
                        $response['content'] = '
';
                    if ($myUser->id == $sketch->owner) {
                        $response['upload'] = $type['upload'];
                    }
                break;
                case 'files':
                    if ($myUser->id == $sketch->owner) {
                        $response['upload'] = $type['upload'];
                        $response['content'] = '
 Faites glisser vos fichiers ici
';
                    }
                    $response['callback'] = 'init_file();';
                    $response['content'] .= '
						
							| Fichiers disponibles  Télécharger | ';
                    $response['content'] .= ' | ';
                    $response['content'] .= '
';
                    $response['content'] .= '
							|  {{label}} | ';
                        $response['content'] .= '';
                        if ($myUser->id == $sketch->owner) {
                            $response['content'] .= '  ';
                        }
                        $response['content'] .= ' | ';
                    $response['content'] .= '
';
                    $response['content'] .= '
';
                break;
                case 'part':
                    $response['callback'] = 'init_part();';
                    $response['content'] = '';
                break;
            }
            //for sources
            if (isset($type['codemirror'])) {
                $response['content'] = '';
                $response['code'] = $type['codemirror'];
                if ($myUser->id != $sketch->owner) {
                    $response['code']['readOnly'] = true;
                }
            }
        return $response;
    }
    public static function toFileStream($resource)
    {
        $type = self::get($resource->type);
        $file = (object) array('name' => slugify($resource->label), 'content' => '');
        if (isset($type['extension'])) {
            $file->name .= '.'.$type['extension'];
        }
        switch ($resource->type) {
            case 'part':
                $file->content = '> '.strtoupper($resource->label).PHP_EOL;
                $file->content .= str_repeat('=', strlen($resource->label) + 2).PHP_EOL;
                foreach (ResourcePart::loadAll(array('resource' => $resource->id)) as $resourcePart):
                    $part = $resourcePart->part_object;
                    $file->content .= $part->label."\t";
                    if (isset($part->link) && !empty($part->link)) {
                        $file->content .= $part->link."\t";
                    }
                    if (isset($part->price) && !empty($part->price)) {
                        $file->content .= $part->price.'€';
                    }
                    $file->content .= PHP_EOL;
                endforeach;
            break;
            case 'files':
                global $myUser;
                $path = SKETCH_PATH.'/'.$resource->id;
                $filename = $resource->label.'-'.time().'.zip';
                $filepath = sys_get_temp_dir().DIRECTORY_SEPARATOR.$filename;
                $zip = new ZipArchive();
                if (file_exists($filepath)) {
                    unlink($filepath);
                }
                $res = $zip->open($filepath, ZipArchive::CREATE);
                if ($res === true) {
                    foreach (glob($path.'/*') as $f) {
                        $zip->addFile($f, basename($f));
                    }
                    $zip->close();
                }
                $file->name = slugify($resource->label).'.zip';
                $file->content = file_get_contents($filepath);
            break;
            case 'image':
                $ext = getExt($resource->content);
                $file->name = slugify($resource->label).'.'.$ext;
                if (file_exists(SKETCH_PATH.$resource->content)) {
                    $file->content = file_get_contents(SKETCH_PATH.$resource->content);
                }
            break;
            default:
                $file->content = html_entity_decode($resource->content);
            break;
        }
        return $file;
    }
}