<?php
/**
 * com_offlajn_installer - Offlajn Installer
 *
 * @author    Balint Polgarfi
 * @copyright 2012-2019 Offlajn.com
 * @license   https://gnu.org/licenses/gpl-2.0.html
 * @link      https://offlajn.com
 */

defined('_JEXEC') or die('Restricted access');

jimport('joomla.installer.helper');
jimport('joomla.filesystem.folder');

if(!function_exists('deleteExtFolder')){

  function deleteExtFolder() {
    $pkg_path = JPATH_ADMINISTRATOR.'/components/com_offlajn_installer/extensions';
    if (file_exists($pkg_path)) JFolder::delete($pkg_path);
    if (!version_compare(JVERSION,'1.6.0','lt')) {
      $db = JFactory::getDBO();
      $db->setQuery("DELETE FROM #__menu WHERE title='com_offlajn_installer'");
      $db->query();
    }
  }

  function com_install(){
    register_shutdown_function("deleteExtFolder");
    $installer = new Installer();
    $installer->install();
    return true;
  }

  function com_uninstall(){
    $installer = new Installer();
    $installer->uninstall();
    return true;
  }

  class Installer extends JObject {

    var $name = 'Offlajn Installer';
    var $com = 'com_offlajn_installer';

    function install() {
      $db = JFactory::getDBO();
      $pkg_path = JPATH_ADMINISTRATOR.'/components/'.$this->com.'/extensions/';

      $suc = glob($pkg_path . '*/installmsg/successful.html');
      $suc = isset($suc[0]) ? file_get_contents($suc[0]) : '';
      $unsuc = glob($pkg_path . '*/installmsg/unsuccessful.html');
      $unsuc = isset($unsuc[0]) ? file_get_contents($unsuc[0]) : '';

      $extensions = array_merge(JFolder::folders($pkg_path,'^(?!com_)\w+$'),JFolder::folders($pkg_path,'^com_\w+$'));
      $v3 = version_compare(JVERSION,'3.0.0','ge');
      if ($v3) {
        foreach($extensions as $pkg) {
          $f = $pkg_path.'/'.$pkg;
          $xmlfiles = JFolder::files($f, '.xml$', 1, true);
          foreach($xmlfiles AS $xmlf){
            $file = file_get_contents($xmlf);
            file_put_contents($xmlf, preg_replace("/<\/install/","</extension",preg_replace("/<install/","<extension",$file)));
          }
        }
      }
      $error = array();
      ob_start();
      foreach($extensions as $pkg) {
        if ($pkg == 'plg_sticky_toolbar' && !$v3) continue;
        $installer = new JInstaller();
        $installer->setOverwrite(true);
        try {
          $success = $installer->install($pkg_path.'/'.$pkg);
        } catch (Exception $ex) {}
        if ($success) {
          $ext = explode('_', $pkg, 2);
          if ($ext[0] == 'plg') {
            $db->setQuery("UPDATE `#__extensions` SET enabled = 1 WHERE element = '{$ext[1]}' AND type = 'plugin' LIMIT 1");
            $db->query();
          }
          $msgcolor = "#E0FFE0";
          $msgtext  = "$pkg successfully installed.";
        } else {
          $msgcolor = "#FFD0D0";
          $msgtext  = "ERROR: Could not install the $pkg. Please contact us on our support page: http://offlajn.com/support.html";
          $error[] = "Could not install $pkg";
        } ?>
        <table bgcolor="<?php echo $msgcolor; ?>" width ="100%">
          <tr style="height:30px">
            <td><font size="2"><b><?php echo $msgtext; ?></b></font></td>
          </tr>
        </table><?php
        if ($success && file_exists("$pkg_path/$pkg/install.php")) {
          require_once "$pkg_path/$pkg/install.php";
          $com = new $pkg();
          $com->install();
        }
      }
      $table = ob_get_contents();
      ob_end_clean();
      if (count($error)) {
        if ($unsuc) {
          echo $unsuc;
          foreach ($error as $e) { echo $e.'<br/>'; }
          echo '</div>';
        } else echo $table;
      } else echo $suc ? $suc : $table;

      if (version_compare(JVERSION,'1.6.0','lt')) {
        $db->setQuery("UPDATE #__plugins SET published=1 WHERE (element = 'offlajnparams' OR element = 'dojoloader') AND folder='system'");
      } else {
        $db->setQuery("UPDATE #__extensions SET enabled=1 WHERE (element = 'offlajnparams' OR element = 'dojoloader') AND folder='system'");
      }
      $db->query();
    }

    function uninstall() {
    }

  }

  class com_offlajn_installerInstallerScript
  {
    function install($parent) {
      com_install();
    }

    function uninstall($parent) {
      com_uninstall();
    }

    function update($parent) {
      com_install();
    }
  }
}
