/**
  * Creates complete archive.
  *
  * @param	string	$directory
  * @param	string	$filename
  */
 public function createArchive($directory, $filename, $removeAfter)
 {
     $buildDirectory = '';
     $directories = array('acptemplates', 'files', 'pip', 'templates');
     $directory = FileUtil::addTrailingSlash($this->source->sourceDirectory . $directory);
     $location = '';
     // skip if no directory was given
     if (!is_dir($directory)) {
         throw new SystemException('Given directory "' . $directory . '" is not valid.');
     }
     $buildDirectory = FileUtil::addTrailingSlash($this->source->buildDirectory);
     $location = $buildDirectory . $filename;
     $package = new TarWriter($location, true);
     // read correct directory for languages
     $languagesInRoot = true;
     $languagesExist = false;
     if (file_exists($directory . self::LANGUAGE_DIR) && is_dir($directory . self::LANGUAGE_DIR)) {
         $languagesExist = true;
         $xml = new XML($directory . 'package.xml');
         $nodes = $xml->getChildren();
         foreach ($nodes as $node) {
             if ($node->getName() != 'instructions') {
                 continue;
             }
             $subNodes = $xml->getChildren($node);
             foreach ($subNodes as $subNode) {
                 if ($subNode->getName() != 'languages') {
                     continue;
                 }
                 if (substr($xml->getCDATA($subNode), 0, strlen(self::LANGUAGE_DIR) + 1) == self::LANGUAGE_DIR . '/') {
                     $languagesInRoot = false;
                 }
             }
         }
     }
     // if files should be in root skip languages directory and copy language files into root
     if ($languagesExist && $languagesInRoot) {
         $this->excludeFiles[] = self::LANGUAGE_DIR;
         $files = DirectoryUtil::getInstance($directory . self::LANGUAGE_DIR . '/', false)->getFilesObj(SORT_DESC);
         foreach ($files as $filename => $obj) {
             if ($filename == '.svn') {
                 continue;
             }
             # $obj->isDir()) continue;
             copy($directory . self::LANGUAGE_DIR . '/' . $filename, $directory . $filename);
             // register them for removing
             PackageHelper::registerTemporaryFile($directory . $filename);
         }
     }
     // try to open directory
     $dir = DirectoryUtil::getInstance($directory, false);
     foreach ($dir->getFiles() as $filename) {
         // skip files
         if (in_array($filename, $this->excludeFiles)) {
             continue;
         }
         if ($this->ignoreDotFiles && substr($filename, 0, 1) == '.' && !in_array($filename, $this->allowedDotFiles)) {
             continue;
         }
         /* easteregg
         				if ($filename == 'package.xml') {
         					copy($directory.$filename, $directory.$filename.'.bak');
         					$new = file_get_contents($directory.$filename);
         					$new = str_replace('</packageinformation>', '<!--meta name="generator" content="PackageBuilder'.(SHOW_VERSION_NUMBER ? ' v'.PACKAGE_VERSION : '').'"--></packageinformation>', $new);
         					file_put_contents($directory.$filename, $new);
         				}
         			*/
         // handle files
         if (!is_dir($directory . $filename)) {
             // add file
             $package->add($directory . $filename, '', $directory);
             /* easteregg
             				if ($filename == 'package.xml') {
             					unlink($directory.$filename);
             					rename($directory.$filename.'.bak', $directory.$filename);
             				}
             			*/
             continue;
         }
         // skip directories
         if (in_array($filename, $directories)) {
             // create tarball from special directories
             $archive = new TarWriter($buildDirectory . $filename . '.tar', false);
             $this->addFilesRecursive($archive, $directory, $filename, $filename . '/');
             $archive->create();
             // add previously created tarball
             $package->add($buildDirectory . $filename . '.tar', '', $buildDirectory);
         } else {
             // add sourceDirectory
             $this->addFilesRecursive($package, $directory, $filename);
         }
     }
     // create complete package
     $package->create();
     // cleanup, remove previous created tarballs
     DirectoryUtil::destroy($this->source->buildDirectory);
     $dir = DirectoryUtil::getInstance($this->source->buildDirectory);
     $dir->removePattern('/.*\\.tar$/');
     if ($removeAfter) {
         PackageHelper::registerTemporaryFile($location);
     }
     return $location;
 }