<?php

session_start();

include_once("../conf/config.inc.php");
include_once(DATEIPFAD . 'includes/functions.global.inc.php');

function return_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    switch($last) {
        // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }

    return $val;
}

/**
 * Handle file uploads via XMLHttpRequest
 */
class qqUploadedFileXhr {
    /**
     * Save the file to the specified path
     * @return boolean TRUE on success
     */
    function save($path) {
        $input = fopen("php://input", "r");
        $temp = tmpfile();
        $realSize = stream_copy_to_stream($input, $temp);
        fclose($input);

        if ($realSize != $this->getSize()){
            return false;
        }

        $target = fopen($path, "w");
        fseek($temp, 0, SEEK_SET);
        stream_copy_to_stream($temp, $target);
        fclose($target);

        return true;
    }
    function getName() {
        return $_GET['qqfile'];
    }
    function getSize() {
        if (isset($_SERVER["CONTENT_LENGTH"])){
            return (int)$_SERVER["CONTENT_LENGTH"];
        } else {
            throw new Exception('Getting content length is not supported.');
        }
    }
}

/**
 * Handle file uploads via regular form post (uses the $_FILES array)
 */
class qqUploadedFileForm {
    /**
     * Save the file to the specified path
     * @return boolean TRUE on success
     */
    function save($path) {
        if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){
            return false;
        }
        chmod($path, 0644);
        return true;
    }
    function getName() {
        return $_FILES['qqfile']['name'];
    }
    function getSize() {
        return $_FILES['qqfile']['size'];
    }
}

class qqFileUploader {
    private $allowedExtensions = array();
    private $sizeLimit = 8388608;
    private $file;

    function __construct(array $allowedExtensions = array(), $sizeLimit = 8388608, array $forbiddenExtensions = array()){
        $allowedExtensions = array_map("strtolower", $allowedExtensions);

        $this->allowedExtensions = $allowedExtensions;
        $this->sizeLimit = $sizeLimit;
        $this->forbiddenExtensions = array_map("strtolower", $forbiddenExtensions);

        $this->checkServerSettings();

        if (isset($_GET['qqfile'])) {
            $this->file = new qqUploadedFileXhr();
        } elseif (isset($_FILES['qqfile'])) {
            $this->file = new qqUploadedFileForm();
        } else {
            $this->file = false;
        }
    }

    private function checkServerSettings(){
        $postSize = $this->toBytes(ini_get('post_max_size'));
        $uploadSize = $this->toBytes(ini_get('upload_max_filesize'));

        if ($postSize < $this->sizeLimit || $uploadSize < $this->sizeLimit){
            $size = max(1, $this->sizeLimit / 1024 / 1024) . 'M';
            die("{'error':'increase post_max_size and upload_max_filesize to $size'}");
        }
    }

    private function toBytes($str){
        $val = trim($str);
        $last = strtolower($str[strlen($str)-1]);
        switch($last) {
            case 'g': $val *= 1024;
            case 'm': $val *= 1024;
            case 'k': $val *= 1024;
        }
        return $val;
    }

    /**
     * Returns array('success'=>true) or array('error'=>'error message')
     */
    function handleUpload($uploadDirectory, $replaceOldFile = FALSE){
        if (!is_writable($uploadDirectory)){
            return array('error' => "Server error. Upload directory isn't writable.");
        }

        if (!$this->file){
            return array('error' => 'No files were uploaded.');
        }

        $size = $this->file->getSize();

        if ($size == 0) {
            return array('error' => 'File is empty');
        }

        if ($size > $this->sizeLimit) {
            return array('error' => 'File is too large');
        }

        $pathinfo = pathinfo($this->file->getName());
        //$filename = $pathinfo['filename'];
        //$filename = md5(uniqid());

        $ext = strtolower($pathinfo['extension']);

        $filename = 'uploadmotiv_' . $_REQUEST['session_id'] . '_' . $_REQUEST['shirtseite'];

        // Präfix für die Session setzen
        if ($_SESSION["myshirtid"]) {
            $SessionPraefix = "myshirt_";
        } else {
            $SessionPraefix = "normal_";
        }

        $_SESSION[$SessionPraefix . "motivupload_ext_" . $_REQUEST['shirtseite']] = $ext;

        if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){
            $these = implode(', ', $this->allowedExtensions);
            return array('error' => 'File has an invalid extension, it should be one of '. $these . '.');
        }

        if($this->forbiddenExtensions && in_array(strtolower($ext), $this->forbiddenExtensions)){
            return array('error' => 'This File extension is forbidden for security reasons.');
        }

        if($replaceOldFile){
            unlink_wc($uploadDirectory, $filename . '.*');
        } else {
            /// don't overwrite previous files that were uploaded
            while (file_exists($uploadDirectory . $filename . '.' . $ext)) {
                $filename .= rand(10, 99);
            }
        }

        if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){
            if($this->CreateThumbPNG($uploadDirectory . $filename . '.' . $ext, DATEIPFAD . 'images/konfigurator/' . $filename)) {
                return array('success'=>true);
            } else {
                return array('error' => 'Could not create Thumbnail, Memory Limit of the Server was exceeded. ' . return_bytes(ini_get('memory_limit')));
            }
        } else {
            return array('error'=> 'Could not save uploaded file.' .
                'The upload was cancelled, or server error encountered');
        }

    }

    function CreateThumbPNG($fileNameAndPath, $outputPathAndFileNameWOExt) {
        $Width = 135;
        $Height = 200;

        $ImageSizeArray = getimagesize($fileNameAndPath);

        if ($ImageSizeArray[0] / $ImageSizeArray[1] > $Width / $Height) {

            $NewImageWidth = $Width;
            $NewImageHeight = $ImageSizeArray[1] * ($Width / $ImageSizeArray[0]);

        } else {

            $NewImageWidth = $ImageSizeArray[0] * ($Height / $ImageSizeArray[1]);
            $NewImageHeight = $Height;
        }

        $NewImageRef = imagecreatetruecolor($NewImageWidth, $NewImageHeight);
        if($ImageSizeArray[2] == IMAGETYPE_JPEG){
            $NewImage = imagecreatefromjpeg($fileNameAndPath);
        } else if($ImageSizeArray[2] == IMAGETYPE_GIF){
            $NewImage = imagecreatefromgif($fileNameAndPath);
        } else if($ImageSizeArray[2] == IMAGETYPE_PNG) {
            $NewImage = imagecreatefrompng($fileNameAndPath);
        }
        imagecopyresampled($NewImageRef, $NewImage, 0, 0, 0, 0, $NewImageWidth, $NewImageHeight, $ImageSizeArray[0], $ImageSizeArray[1]);

        imagepng($NewImageRef, $outputPathAndFileNameWOExt . '.png');

        return true;
    }
}

// list of valid extensions, ex. array("jpeg", "xml", "bmp")

// max file size in bytes
//$sizeLimit = 30 * 1024 * 1024;

//    $allowedExtensions = array('jpg');
    if(!file_exists(DATEIPFAD . 'admin/data/konfigurator')) {
        mkdir(DATEIPFAD . 'admin/data/konfigurator', 0777, true);
    }

    $uploader = new qqFileUploader(array('jpg', 'png', 'gif'), 8388608, array('php', 'html'));
    $result = $uploader->handleUpload(DATEIPFAD . 'admin/data/konfigurator/', true);

// to pass data through iframe you will need to encode all html tags
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES);
