<?php
/**
* @package Helix3 Framework
* @author JoomShaper http://www.joomshaper.com
* @copyright Copyright (c) 2010 - 2015 JoomShaper
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or Later
*/  

//no direct accees
defined ('_JEXEC') or die ('resticted aceess');

jimport('joomla.plugin.plugin');
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
jimport('joomla.registry.registry');
jimport('joomla.image.image');

require_once __DIR__ . '/classes/image.php';

class plgAjaxHelix3 extends JPlugin
{

    function onAjaxHelix3()
    {
        $input = JFactory::getApplication()->input;
        $action = $input->post->get('action', '', 'STRING');

        if($action=='upload_image') {
            $this->upload_image();
            return;
        } else if($action=='remove_image') {
            $this->remove_image();
            return;
        }

        if ($_POST['data']) {
            $data = json_decode(json_encode($_POST['data']), true);;
            $action = $data['action'];
            $layoutName = '';

            if (isset($data['layoutName'])) {
                $layoutName = $data['layoutName'];
            }

            $template  = self::getTemplate()->template;
            $layoutPath = JPATH_SITE.'/templates/'.$template.'/layout/';

            $filepath = $layoutPath.$layoutName;

            $report = array();
            $report['action'] = 'none';
            $report['status'] = 'false';

            switch ($action) {
                case 'remove':
                        if (file_exists($filepath)) {
                            unlink($filepath);
                            $report['action'] = 'remove';
                            $report['status'] = 'true';
                        }
                        $report['layout'] = JFolder::files($layoutPath, '.json');
                    break;

                case 'save':
                        if ($layoutName) {
                            $layoutName = strtolower(str_replace(' ','-',$layoutName));
                        }
                        $content = $data['content'];

                        if ($content && $layoutName) {
                            $file = fopen($layoutPath.$layoutName.'.json', 'wb');
                            fwrite($file, $content);
                            fclose($file);
                        }
                        $report['layout'] = JFolder::files($layoutPath, '.json');
                    break;

                case 'load':
                        if (file_exists($filepath)) {
                            $content = file_get_contents($filepath);
                        }

                        if (isset($content) && $content) {
                            echo $layoutHtml = self::loadNewLayout(json_decode($content));
                        }
                        die();
                    break;

                case 'resetLayout':
                    if($layoutName){
                        echo self::resetMenuLayout($layoutName);
                    }
                    die();
                    break;

                    // Upload Image
                case 'upload_image':
                    echo "Joomla";
                    die();
                    break;    

                default:
                    break;

                case 'voting':
                    
                    if (JSession::checkToken()) {
                        return json_encode($report);
                    }

                    $rate = -1;
                    $pk = 0;

                    if (isset($data['user_rating'])) {
                        $rate = (int)$data['user_rating'];
                    }

                    if (isset($data['id'])) {
                        $id = str_replace('post_vote_','',$data['id']);
                        $pk = (int)$id;
                    }

                    if ($rate >= 1 && $rate <= 5 && $id > 0)
                    {
                        $userIP = $_SERVER['REMOTE_ADDR'];

                        $db    = JFactory::getDbo();
                        $query = $db->getQuery(true);

                        $query->select('*')
                        ->from($db->quoteName('#__content_rating'))
                        ->where($db->quoteName('content_id') . ' = ' . (int) $pk);

                        $db->setQuery($query);

                        try
                        {
                            $rating = $db->loadObject();
                        }
                        catch (RuntimeException $e)
                        {
                            return json_encode($report);
                        }

                        if (!$rating)
                        {
                            $query = $db->getQuery(true);

                            $query->insert($db->quoteName('#__content_rating'))
                            ->columns(array($db->quoteName('content_id'), $db->quoteName('lastip'), $db->quoteName('rating_sum'), $db->quoteName('rating_count')))
                            ->values((int) $pk . ', ' . $db->quote($userIP) . ',' . (int) $rate . ', 1');

                            $db->setQuery($query);

                            try
                            {
                                $db->execute();

                                $data = self::getItemRating($pk);
                                $rating = $data->rating;

                                $report['action'] = $rating;
                                $report['status'] = 'true';

                                return json_encode($report);
                            }
                            catch (RuntimeException $e)
                            {
                                return json_encode($report);;
                            }
                        }
                        else
                        {
                            if ($userIP != ($rating->lastip))
                            {
                                $query = $db->getQuery(true);

                                $query->update($db->quoteName('#__content_rating'))
                                ->set($db->quoteName('rating_count') . ' = rating_count + 1')
                                ->set($db->quoteName('rating_sum') . ' = rating_sum + ' . (int) $rate)
                                ->set($db->quoteName('lastip') . ' = ' . $db->quote($userIP))
                                ->where($db->quoteName('content_id') . ' = ' . (int) $pk);

                                $db->setQuery($query);

                                try
                                {
                                    $db->execute();

                                    $data = self::getItemRating($pk);
                                    $rating = $data->rating;

                                    $report['action'] = $rating;
                                    $report['status'] = 'true';

                                    return json_encode($report);
                                }
                                catch (RuntimeException $e)
                                {
                                    return json_encode($report);
                                }
                            }
                            else
                            {

                                $report['status'] = 'invalid';
                                return json_encode($report);
                            }
                        }
                    }
                    $report['action'] = 'failed';
                    $report['status'] = 'false';
                    return json_encode($report);
                    break;

                //Font variant
                case 'fontVariants':

                    $template_path = JPATH_SITE . '/templates/' . self::getTemplate()->template . '/webfonts/webfonts.json';
                    $plugin_path   = JPATH_PLUGINS . '/system/helix3/assets/webfonts/webfonts.json';
                    
                    if(JFile::exists( $template_path )) {
                        $json = JFile::read( $template_path );
                    } else {
                        $json = JFile::read( $plugin_path );
                    }
                    
                    $webfonts   = json_decode($json);
                    $items      = $webfonts->items;
                    
                    $output = array(); 
                    $fontVariants = '';
                    $fontSubsets = '';
                    foreach ($items as $item) {
                        if($item->family==$layoutName) {

                            //Variants
                            foreach ($item->variants as $variant) {
                                $fontVariants .= '<option value="'. $variant .'">' . $variant . '</option>'; 
                            }

                            //Subsets
                            foreach ($item->subsets as $subset) {
                                $fontSubsets .= '<option value="'. $subset .'">' . $subset . '</option>'; 
                            }
                        }
                    }

                    $output['variants'] = $fontVariants;
                    $output['subsets']  = $fontSubsets;

                    return json_encode($output);

                    break;

                //Font variant
                case 'updateFonts':

                    jimport( 'joomla.filesystem.folder' );
                    jimport('joomla.http.http');

                    $template_path = JPATH_SITE . '/templates/' . self::getTemplate()->template . '/webfonts';
                    
                    if(!JFolder::exists( $template_path )) {
                       JFolder::create( $template_path, 0755 );
                    }

                    $url  = 'https://www.googleapis.com/webfonts/v1/webfonts?key=AIzaSyBVybAjpiMHzNyEm3ncA_RZ4WETKsLElDg';
                    $http = new JHttp();
                    $str  = $http->get($url);

                    if ( JFile::write( $template_path . '/webfonts.json', $str->body )) {
                        echo "<p class='font-update-success'>Google Webfonts list successfully updated! Please refresh your browser.</p>";
                    } else {
                        echo "<p class='font-update-failed'>Google Webfonts update failed. Please make sure that your template folder is writable.</p>";
                    }

                    die();

                    break;

                //Template setting import
                case 'import':

                    $template_id = filter_var( $data['template_id'], FILTER_VALIDATE_INT );
                    
                    if ( !$template_id ) {
                        die();
                        break;
                    }

                    $settings   = $data['settings'];

                    $db = JFactory::getDbo();

                    $query = $db->getQuery(true);

                    $fields = array(
                        $db->quoteName( 'params' ) . ' = ' . $db->quote( $settings )
                    );

                    $conditions = array(
                        $db->quoteName( 'id' ) . ' = '. $db->quote( $template_id ), 
                        $db->quoteName('client_id') . ' = 0'
                    );
                     
                    $query->update($db->quoteName('#__template_styles'))->set($fields)->where($conditions);
                     
                    $db->setQuery($query);
                     
                    $db->execute();
                    
                    die();
                    break;
                    
            }

            return json_encode($report);
        }
        
    }

    static public function getItemRating($pk = 0){
        $db    = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select('ROUND(rating_sum / rating_count, 0) AS rating, rating_count')
        ->from($db->quoteName('#__content_rating'))
        ->where($db->quoteName('content_id') . ' = ' . (int) $pk);

        $db->setQuery($query);
        $data = $db->loadObject();

        return $data;
    }

    static public function resetMenuLayout($current_menu_id = 0){

        if (!$current_menu_id) {
            return;           
        }

        $items  = self::menuItems();
        $item   = array();
        
        if (isset($items[$current_menu_id]) && !empty($items[$current_menu_id])) {
            $item = $items[$current_menu_id];
        }

        $menuItems = new JMenuSite;

        $no_child = true;
        $count = 0;
        $x_key = 0;
        $y_key = 0;
        $check_child = 0;
        $item_array = array();

        foreach ($item as $key => $id){
            $status = 0;
            if (isset($items[$id]) && is_array($items[$id])){
                $no_child = false;
                $count = $count + 1;
                $check_child = $check_child+1;
                $status = 1;
            }

            if ($check_child === 2){
                $y_key = 0;
                $x_key = $x_key + 1;
                $check_child = 1;
            }

            $item_array[$x_key][$y_key] = array($id,$status);
            $y_key = $y_key + 1;
        }

        if ($no_child === true){
            $count = 1;
        }

        if($count > 4 && $count != 6){
            $count = 4;
        }

        ob_start();

        if($no_child === true)
        {
            echo '<div class="menu-section">';
            echo '<span class="row-move"><i class="fa fa-bars"></i></span>';
            echo '<div class="spmenu sp-row">';
            echo '<div class="column sp-col-md-12" data-column="12">';
            echo '<div class="column-items-wrap">';
            if (!empty($item)) {
                echo '<h4 style="display:none" data-current_child="'.$current_menu_id.'" >'.$menuItems->getItem($current_menu_id)->title.'</h4>';
                echo '<ul class="child-menu-items">';

                foreach ($item as $key => $id)
                {
                    echo '<li>'.$menuItems->getItem($id)->title.'</li>';
                }
                echo '</ul>';
            }
            echo '<div class="modules-container">';
            echo '</div>';
            echo '</div>';
            echo '</div>';
            echo '</div>';
            echo '</div>';
        }
        else
        {
            echo '<div class="menu-section">';
            echo '<span class="row-move"><i class="fa fa-bars"></i></span>';
            echo '<div class="spmenu sp-row">';

            $columnNumber = 12 / $count;
            foreach ($item_array as $key => $item_array)
            {
                echo '<div class="column sp-col-md-'.$columnNumber.'" data-column="'.$columnNumber.'">';
                echo '<div class="column-items-wrap">';

                foreach ($item_array as $key => $item)
                {
                    $id = $item[0];
                    echo '<h4 data-current_child="'.$id.'" >'.$menuItems->getItem($id)->title.'</h4>';
                    if ($item[1])
                    {
                        echo '<ul class="child-menu-items">';
                        echo self::create_menu($id);
                        echo '</ul>';
                    }
                }
                echo '<div class="modules-container"></div>';
                echo '</div>';
                echo '</div>';
            }
            echo '</div>';
            echo '</div>';
        }

        $output = ob_get_contents();
        ob_clean();

        return $output;
    }

    static public function create_menu($current_menu_id)
    {
        $items = self::menuItems();
        $menus = new JMenuSite;

        if (isset($items[$current_menu_id]))
        {
            $item = $items[$current_menu_id];
            foreach ($item as $key => $item_id)
            {
                echo '<li>';
                echo $menus->getItem($item_id)->title;
                echo '</li>';
            }
        }    
    }

    static public function menuItems()
    {
        $menus = new JMenuSite;
        $menus = $menus->getMenu();
        $new = array();
        foreach ($menus as $item) {
            $new[$item->parent_id][] = $item->id;
        }
        return $new;
    }

    static public function loadNewLayout($layout_data = null){

        $lang = JFactory::getLanguage();
        $lang->load('tpl_' . self::getTemplate()->template, JPATH_SITE, $lang->getName(), true);

        ob_start();
        
        $colGrid = array(
            '12'        => '12',
            '66'        => '6,6',
            '444'       => '4,4,4',
            '3333'      => '3,3,3,3',
            '48'        => '4,8',
            '39'        => '3,9',
            '363'       => '3,6,3',
            '264'       => '2,6,4',
            '210'       => '2,10',
            '57'        => '5,7',
            '237'       => '2,3,7',
            '255'       => '2,5,5',
            '282'       => '2,8,2',
            '2442'      => '2,4,4,2',
        );

        if ($layout_data) {
        foreach ($layout_data as $row) {
            $rowSettings = self::getSettings($row->settings);
            $name = JText::_('HELIX_SECTION_TITLE');

            if (isset($row->settings->name)) {
                $name = $row->settings->name;
            }
        ?>
        <div class="layoutbuilder-section" <?php echo $rowSettings; ?>>
           <div class="settings-section clearfix">
             <div class="settings-left pull-left">
                <a class="row-move" href="#"><i class="fa fa-arrows"></i></a>
                <strong class="section-title"><?php echo $name; ?></strong>
            </div>
            <div class="settings-right pull-right">
                <ul class="button-group">
                    <li>
                        <a class="btn btn-small add-columns" href="#"><i class="fa fa-columns"></i> <?php echo JText::_('HELIX_ADD_COLUMNS'); ?></a>
                        <ul class="column-list">
                            <?php
                            $_active = '';
                            foreach ($colGrid as $key => $grid){ 
                                if($key == $row->layout){
                                    $_active = 'active';
                                }
                                echo '<li><a href="#" class="column-layout column-layout-' .$key. ' '.$_active.'" data-layout="'.$grid.'"></a></li>';
                                $_active ='';
                            } ?>
                            <?php
                                $active = '';
                                $customLayout = '';
                                if (!isset($colGrid[$row->layout])) {
                                    $active = 'active';
                                    $split = str_split($row->layout);
                                    $customLayout = implode(',',$split);
                                }
                            ?>
                            <li><a href="#" class="hasTooltip column-layout-custom column-layout custom <?php echo $active; ?>" data-layout="<?php echo $customLayout; ?>" data-type='custom' data-original-title="<strong>Custom Layout</strong>"></a></li>
                        </ul>
                    </li>
                    <li><a class="btn btn-small add-row" href="#"><i class="fa fa-bars"></i> <?php echo JText::_('HELIX_ADD_ROW'); ?></a></li>
                    <li><a class="btn btn-small row-ops-set" href="#"><i class="fa fa-gears"></i> <?php echo JText::_('HELIX_SETTINGS'); ?></a></li>
                    <li><a class="btn btn-danger btn-small remove-row" href="#"><i class="fa fa-times"></i> <?php echo JText::_('HELIX_REMOVE'); ?></a></li>
                </ul>
            </div>
            </div>
            <div class="row ui-sortable">
            <?php foreach ($row->attr as $column) { $colSettings = self::getSettings($column->settings); ?>
                <div class="<?php echo $column->className; ?>" <?php echo $colSettings; ?>>
                    <div class="column">
                        <?php if (isset($column->settings->column_type) && $column->settings->column_type) {
                           echo '<h6 class="col-title pull-left">Component</h6>';
                        }else{
                            if (!isset($column->settings->name)) {
                                $column->settings->name = 'none';
                            }
                            echo '<h6 class="col-title pull-left">'.$column->settings->name.'</h6>';
                        }
                        ?>
                        <a class="col-ops-set pull-right" href="#" ><i class="fa fa-gears"></i></a>
                    </div>
                </div>
            <?php } ?>
            </div>
        </div>
        <?php
            }
        }
        $items = ob_get_contents();
        ob_end_clean();

        return $items;

    }

    static public function getSettings($config = null){
        $data = '';
        if (count($config)) {
            foreach ($config as $key => $value) {
                $data .= ' data-'.$key.'="'.$value.'"';
            }
        }
        return $data;
    }

    //Get template name
    private static function getTemplate() {

        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $query->select($db->quoteName(array('template', 'params')));
        $query->from($db->quoteName('#__template_styles'));
        $query->where($db->quoteName('client_id') . ' = '. $db->quote(0));
        $query->where($db->quoteName('home') . ' = '. $db->quote(1));
        $db->setQuery($query);

        return $db->loadObject();
    }

    // Upload File
    private function upload_image() {
        $input = JFactory::getApplication()->input;
        $image = $input->files->get('image');
        $imageonly = $input->post->get('imageonly', false, 'BOOLEAN');

        $tplRegistry = new JRegistry();
        $tplParams = $tplRegistry->loadString(self::getTemplate()->params);

        $report = array();

        // User is not authorised
        if (!JFactory::getUser()->authorise('core.create', 'com_media'))
        {
            $report['status'] = false;
            $report['output'] = JText::_('You are not authorised to upload file.');
            echo json_encode($report);
            die;
        }
        
        if(count($image)) {

            if ($image['error'] == UPLOAD_ERR_OK) {

                $error = false;

                $params = JComponentHelper::getParams('com_media');

                // Total length of post back data in bytes.
                $contentLength = (int) $_SERVER['CONTENT_LENGTH'];

                // Instantiate the media helper
                $mediaHelper = new JHelperMedia;

                // Maximum allowed size of post back data in MB.
                $postMaxSize = $mediaHelper->toBytes(ini_get('post_max_size'));

                // Maximum allowed size of script execution in MB.
                $memoryLimit = $mediaHelper->toBytes(ini_get('memory_limit'));

                // Check for the total size of post back data.
                if (($postMaxSize > 0 && $contentLength > $postMaxSize) || ($memoryLimit != -1 && $contentLength > $memoryLimit)) {
                    $report['status'] = false;
                    $report['output'] = JText::_('Total size of upload exceeds the limit.');
                    $error = true;
                    echo json_encode($report);
                    die;
                }

                $uploadMaxSize = $params->get('upload_maxsize', 0) * 1024 * 1024;
                $uploadMaxFileSize = $mediaHelper->toBytes(ini_get('upload_max_filesize'));

                if (($image['error'] == 1) || ($uploadMaxSize > 0 && $image['size'] > $uploadMaxSize) || ($uploadMaxFileSize > 0 && $image['size'] > $uploadMaxFileSize))
                {
                    $report['status'] = false;
                    $report['output'] = JText::_('This file is too large to upload.');
                    $error = true;
                }
                
                // Upload if no error found
                if(!$error) {
                    // Organised folder structure
                    $date = JFactory::getDate();
                    $folder = JHtml::_('date', $date, 'Y') . '/' . JHtml::_('date', $date, 'm') . '/' . JHtml::_('date', $date, 'd');

                    if(!file_exists( JPATH_ROOT . '/images/' . $folder )) {
                        JFolder::create(JPATH_ROOT . '/images/' . $folder, 0755);
                    }

                    $name = $image['name'];
                    $path = $image['tmp_name'];

                    // Do no override existing file
                    $file = pathinfo($name);
                    $i = 0;
                    do {
                        $base_name  = $file['filename'] . ($i ? "$i" : "");
                        $ext        = $file['extension'];
                        $image_name = $base_name . "." . $ext;
                        $i++;
                        $dest = JPATH_ROOT . '/images/' . $folder . '/' . $image_name;
                        $src = 'images/' . $folder . '/'  . $image_name;
                        $data_src = 'images/' . $folder . '/'  . $image_name;
                    } while(file_exists($dest));
                    // End Do not override

                    if(JFile::upload($path, $dest)) {

                        $sizes = array();

                        if($tplParams->get('image_small', 0)) {
                           $sizes['small'] = strtolower($tplParams->get('image_small_size', '100X100'));
                        }

                        if($tplParams->get('image_thumbnail', 1)) {
                           $sizes['thumbnail'] = strtolower($tplParams->get('image_thumbnail_size', '200X200'));
                        }

                        if($tplParams->get('image_medium', 0)) {
                           $sizes['medium'] = strtolower($tplParams->get('image_medium_size', '300X300'));
                        }

                        if($tplParams->get('image_large', 0)) {
                           $sizes['large']  = strtolower($tplParams->get('image_large_size', '600X600'));
                        }

                        if(count($sizes)) {
                            $image = new Helix3Image($dest);
                            $image->createThumbs($sizes, 5);
                        }

                        if(file_exists(JPATH_ROOT . '/images/' . $folder . '/' . $base_name . '_thumbnail.' . $ext)) {
                            $src = 'images/' . $folder . '/'  . $base_name . '_thumbnail.' . $ext;
                        }

                        $report['status'] = true;

                        if($imageonly) {
                            $report['output'] = '<img src="'. JURI::root(true) . '/' . $src . '" data-src="'. $data_src .'" alt="">';
                        } else {
                            $report['output'] = '<li data-src="'. $data_src .'"><a href="#" class="btn btn-mini btn-danger btn-remove-image">Delete</a><img src="'. JURI::root(true) . '/' . $src . '" alt=""></li>';
                        }
                    }
                }
            }
        } else {
            $report['status'] = false;
            $report['output'] = JText::_('Upload Failed!');
        }

        echo json_encode($report);

        die;
    }

    // Delete File
    private function remove_image() {
        $report = array();

        if (!JFactory::getUser()->authorise('core.delete', 'com_media'))
        {
            $report['status'] = false;
            $report['output'] = JText::_('You are not authorised to delete file.');
            echo json_encode($report);
            die;
        }

        $input = JFactory::getApplication()->input;
        $src = $input->post->get('src', '', 'STRING');

        $path = JPATH_ROOT . '/' . $src;

        if(file_exists($path)) {

            if(JFile::delete($path)) {

                $basename = basename($src);
                $small = JPATH_ROOT . '/' . dirname($src) . '/' . JFile::stripExt($basename) . '_small.' . JFile::getExt($basename);
                $thumbnail = JPATH_ROOT . '/' . dirname($src) . '/' . JFile::stripExt($basename) . '_thumbnail.' . JFile::getExt($basename);
                $medium = JPATH_ROOT . '/' . dirname($src) . '/' . JFile::stripExt($basename) . '_medium.' . JFile::getExt($basename);
                $large = JPATH_ROOT . '/' . dirname($src) . '/' . JFile::stripExt($basename) . '_large.' . JFile::getExt($basename);

                if(file_exists($small)) {
                    JFile::delete($small);
                }

                if(file_exists($thumbnail)) {
                    JFile::delete($thumbnail);
                }

                if(file_exists($medium)) {
                    JFile::delete($medium);
                }

                if(file_exists($large)) {
                    JFile::delete($large);
                }

                $report['status'] = true;
            } else {
                $report['status'] = false;
                $report['output'] = JText::_('Delete failed');
            }
        } else {
            $report['status'] = true;
        }

        echo json_encode($report);

        die;
    }

}