static function create_theme($task)
 {
     try {
         $mode = $task->get("mode", "init");
         $start = microtime(true);
         $theme_name = $task->get("theme_name");
         $is_admin = $task->get("is_admin", false);
         $theme_path = THEMEPATH . "{$theme_name}/";
         $parameters = Cache::instance()->get("create_theme_cache:{$task->id}");
         if ($parameters) {
             $parameters = unserialize($parameters);
         }
         $completed = $task->get("completed", 0);
         switch ($mode) {
             case "init":
                 $task->log(t("Starting theme '%theme' creation", array("theme" => $task->get("display_name"))));
                 $task->set("mode", "create_directory");
                 $parameters = themeroller::get_theme_parameters($task->get("original_name"), $task->get("path"), $is_admin);
                 $task->set("total_activites", 7 + 3 + count($parameters["standard_css"]) + count($parameters["views"]) + count($parameters["js"]) + count($parameters["masks"]) + count($parameters["icons"]) + count($parameters["css_files"]) + count($parameters["gifs"]) + count($parameters["images"]));
                 // number of image files to copy
                 $task->status = t("Starting up");
                 break;
             case "create_directory":
                 $completed = $task->get("completed");
                 foreach (array("", "css", "css/themeroller", "css/themeroller/images", "images", "js", "views") as $dir) {
                     $path = "{$theme_path}{$dir}";
                     $completed++;
                     if (!file_exists($path)) {
                         mkdir($path);
                         chmod($path, 0755);
                         $task->log(t("Created directory: %path", array("path" => $path)));
                     }
                 }
                 $task->status = t("Directories created");
                 $task->set("mode", "copy_views");
                 break;
             case "copy_views":
                 $task->status = t("Copying views");
                 while (!empty($parameters["views"]) && microtime(true) - $start < 1.5) {
                     $view = array_shift($parameters["views"]);
                     $target = "{$theme_path}views/" . basename($view);
                     if (!file_exists($target)) {
                         copy($view, $target);
                         $task->log(t("Copied view: %path", array("path" => basename($view))));
                     }
                     $completed++;
                 }
                 if (empty($parameters["views"])) {
                     $task->status = t("Views copied");
                     $task->set("mode", "copy_themeroller_images");
                 }
                 break;
             case "copy_themeroller_images":
                 $task->status = t("Copying themeroller images");
                 while (!empty($parameters["images"]) && microtime(true) - $start < 1.5) {
                     $image = array_shift($parameters["images"]);
                     $target = "{$theme_path}css/themeroller/images/" . basename($image);
                     if (!file_exists($target)) {
                         copy($image, $target);
                         $task->log(t("Copied themeroller image: %path", array("path" => basename($image))));
                     }
                     $completed++;
                 }
                 if (empty($parameters["views"])) {
                     $task->status = t("Themeroller images copied");
                     $task->set("mode", "copy_gif_images");
                 }
                 break;
             case "copy_gif_images":
                 $task->status = t("Copying gif images");
                 while (!empty($parameters["gifs"]) && microtime(true) - $start < 1.5) {
                     $gif = array_shift($parameters["gifs"]);
                     $target = "{$theme_path}images/" . basename($gif);
                     if (!file_exists($target)) {
                         copy($gif, $target);
                         $task->log(t("Copied gif image: %path", array("path" => basename($gif))));
                     }
                     $completed++;
                 }
                 if (empty($parameters["gifs"])) {
                     $task->status = t("Gif images copied");
                     $task->set("mode", "copy_css");
                 }
                 break;
             case "copy_css":
                 $task->status = t("Copying themeroller css");
                 $target = "{$theme_path}css/themeroller/ui.base.css";
                 copy($parameters["css_files"][0], $target);
                 $completed++;
                 $task->log(t("Copied themeroller css: themeroller/ui.base.css"));
                 $task->status = t("Themeroller css copied");
                 $task->set("mode", "generate_images");
                 break;
             case "generate_images":
                 $task->status = t("Generating gallery images");
                 $target_dir = "{$theme_path}images/";
                 $colors = $task->get("colors");
                 $image_color = $parameters["colors"]["iconColorContent"];
                 while (!empty($parameters["masks"]) && microtime(true) - $start < 1.5) {
                     $mask = array_shift($parameters["masks"]);
                     $basename = basename($mask);
                     if (preg_match("/(.*)_mask(\\[(\\w*)\\])?(\\.png)\$/", $basename, $matches)) {
                         $basename = "{$matches[1]}{$matches[4]}";
                         $image_color = empty($matches[3]) ? $parameters["colors"]["iconColorContent"] : $parameters["colors"][$matches[3]];
                     } else {
                         $image_color = $parameters["colors"]["iconColorContent"];
                     }
                     $image_file = "{$target_dir}{$basename}";
                     themeroller::generate_image($mask, $image_file, $image_color);
                     $completed++;
                     $task->log(t("Generated image: %path", array("path" => $image_file)));
                 }
                 if (empty($parameters["masks"])) {
                     $task->set("mode", "generate_icons");
                     $task->status = t("Gallery images generated");
                 }
                 break;
             case "generate_icons":
                 $task->status = t("Generating icons");
                 $target_dir = "{$theme_path}css/themeroller/images/";
                 $mask_file = $parameters["icon_mask"];
                 while (!empty($parameters["icons"]) && microtime(true) - $start < 1.5) {
                     $color = array_shift($parameters["icons"]);
                     $icon_file = $target_dir . str_replace("mask", $color, basename($mask_file));
                     themeroller::generate_image($mask_file, $icon_file, $color);
                     $completed++;
                     $task->log(t("Generated themeroller icon: %path", array("path" => $icon_file)));
                 }
                 if (empty($parameters["icons"])) {
                     $task->set("mode", "copy_standard_css");
                     $task->status = t("Icons generated");
                 }
                 break;
             case "copy_standard_css":
                 $task->status = t("Copying standard css");
                 while (!empty($parameters["standard_css"]) && microtime(true) - $start < 1.5) {
                     $css = array_shift($parameters["standard_css"]);
                     $target = "{$theme_path}css/" . basename($css);
                     if (!file_exists($target)) {
                         copy($css, $target);
                         $task->log(t("Copied css file: %path", array("path" => basename($target))));
                     }
                     $completed++;
                 }
                 if (empty($parameters["standard_css"])) {
                     $task->status = t("Standard css copied");
                     $task->set("mode", "copy_javascript");
                 }
                 break;
             case "copy_javascript":
                 $task->status = t("Copying javascript");
                 while (!empty($parameters["js"]) && microtime(true) - $start < 1.5) {
                     $js = array_shift($parameters["js"]);
                     $target = "{$theme_path}js/" . str_replace(array("admin_", "site_"), "", basename($js));
                     if (!file_exists($target)) {
                         copy($js, $target);
                         $task->log(t("Copied js file: %path", array("path" => basename($target))));
                     }
                     $completed++;
                 }
                 if (empty($parameters["js"])) {
                     $task->status = t("Javascript copied");
                     $task->set("mode", "generate_screen_css");
                 }
                 break;
             case "generate_screen_css":
                 $file = "{$theme_path}/css/screen.css";
                 foreach (array("screen", "screen-rtl") as $file) {
                     $css_file = "{$theme_path}/css/{$file}.css";
                     $v = new View(($is_admin ? "admin" : "site") . "_{$file}.css");
                     $v->display_name = $task->get("display_name");
                     foreach ($parameters["colors"] as $color => $value) {
                         $v->{$color} = $value;
                     }
                     ob_start();
                     print $v->render();
                     file_put_contents($css_file, ob_get_contents());
                     ob_end_clean();
                 }
                 $completed++;
                 $task->log(t("Generated screen css: %path", array("path" => $file)));
                 $task->status = t("Screen css generated");
                 $task->set("mode", "generate_thumbnail");
                 break;
             case "generate_thumbnail":
                 themeroller::generate_thumbnail($parameters["thumbnail"], $parameters["thumbnail_parts"], "{$theme_path}thumbnail.png");
                 $task->status = t("Thumbnail generated");
                 $task->set("mode", "generate_theme_info");
                 $completed++;
                 $task->log(t("Generated theme thumbnail: %path", array("path" => "{$theme_path}thumbnail.png")));
                 break;
             case "generate_theme_info":
                 $file = "{$theme_path}/theme.info";
                 $v = new View("theme.info");
                 $v->display_name = $task->get("display_name");
                 $v->description = $task->get("description");
                 $v->user_name = $task->get("user_name");
                 $v->author_url = $task->get("author_url");
                 $v->info_url = $task->get("info_url");
                 $v->discuss_url = $task->get("discuss_url");
                 $v->is_admin = $is_admin;
                 $v->definition = json_encode($parameters["colors"]);
                 ob_start();
                 print $v->render();
                 file_put_contents($file, ob_get_contents());
                 ob_end_clean();
                 $completed++;
                 $task->log(t("Generated theme info: %path", array("path" => "{$theme_path}theme.info")));
                 $task->status = t("Theme info generated");
                 $task->set("mode", "done");
                 break;
             case "done":
                 themeroller::recursive_directory_delete($task->get("path"));
                 $display_name = $task->get("display_name");
                 $task->done = true;
                 $task->state = "success";
                 $task->percent_complete = 100;
                 $completed = $task->get("total_activites");
                 Cache::instance()->delete("create_theme_cache:{$task->id}");
                 $message = t("Successfully generated: %name", array("name" => $display_name));
                 message::info($message);
                 $task->log($message);
                 $task->status = t("'%name' generated", array("name" => $display_name));
         }
         $task->set("completed", $completed);
         if (!$task->done) {
             Cache::instance()->set("create_theme_cache:{$task->id}", serialize($parameters));
             $task->percent_complete = $completed / $task->get("total_activites") * 100;
         }
     } catch (Exception $e) {
         Kohana_Log::add("error", (string) $e);
         $task->done = true;
         $task->state = "error";
         $task->status = $e->getMessage();
         $task->log((string) $e);
     }
 }
 public function _unload_zip(Validation $post, $field)
 {
     $zipfile = $post["zip_file"]["tmp_name"];
     if (false !== ($extract_path = themeroller::extract_zip_file($zipfile))) {
         $theme_name = themeroller::get_theme_name($extract_path);
         if (!empty($theme_name)) {
             Session::instance()->set("themeroller_name", $theme_name);
         } else {
             Kohana_Log::add("error", "zip file: css directory not found");
             $post->add_error($field, "invalid zipfile");
         }
     } else {
         Kohana_Log::add("error", "zip file: open failed");
         $post->add_error($field, "invalid zipfile");
     }
     if (file_exists($zipfile)) {
         unlink($zipfile);
     }
 }