<?php
/**
 * EAjaxUpload class file.
 * This extension is a wrapper of http://valums.com/ajax-upload/
 *
 * @author Vladimir Papaev <kosenka@gmail.com>
 * @version 0.1
 * @license http://www.opensource.org/licenses/bsd-license.php
 */

/**
How to use:

view:
$this->widget('ext.EAjaxUpload.EAjaxUpload',
	array(
		'id'=>'uploadFile',
		'config'=>array(
		'action'=>'/controller/upload',
		'allowedExtensions'=>array("jpg"),//array("jpg","jpeg","gif","exe","mov" and etc...
		'sizeLimit'=>10*1024*1024,// maximum file size in bytes
		'minSizeLimit'=>10*1024*1024,// minimum file size in bytes
		//'onComplete'=>"js:function(id, fileName, responseJSON){ alert(fileName); }",
		//'messages'=>array(
		//                  'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.",
		//                  'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.",
		//                  'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.",
		//                  'emptyError'=>"{file} is empty, please select files again without it.",
		//                  'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled."
		//                 ),
		//'showMessage'=>"js:function(message){ alert(message); }"
		)
));

controller:

public function actionUpload()
{
	Yii::import("ext.EAjaxUpload.qqFileUploader");

	$folder='upload/';// folder for uploaded files
	$allowedExtensions = array("jpg"),//array("jpg","jpeg","gif","exe","mov" and etc...
	$sizeLimit = 10 * 1024 * 1024;// maximum file size in bytes
	$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
	$result = $uploader->handleUpload($folder);
	$result=htmlspecialchars(json_encode($result), ENT_NOQUOTES);
	echo $result;// it's array
}

 */
class EAjaxUpload extends CWidget {
	public $id = "fileUploader";
	public $postParams = array();
	public $config = array();
	public $css = null;

    public $label;

	public function run(){
		if(empty($this->config['action'])) {
			throw new CException('EAjaxUpload: param "action" cannot be empty.');
		}

		if(empty($this->config['allowedExtensions'])) {
			throw new CException('EAjaxUpload: param "allowedExtensions" cannot be empty.');
		}

		if(empty($this->config['sizeLimit'])) {
			throw new CException('EAjaxUpload: param "sizeLimit" cannot be empty.');
		}

        if(!$this->label){
            $this->label = tc('Upload files');
        }

		unset($this->config['element']);

		echo '<div id="' . $this->id . '"><noscript><p>Please enable JavaScript to use file uploader.</p></noscript></div>';
		$assets = dirname(__FILE__) . '/assets';
		$baseUrl = Yii::app()->assetManager->publish($assets);

		Yii::app()->clientScript->registerScriptFile($baseUrl . '/fileuploader.js', CClientScript::POS_BEGIN);

		$this->css = (!empty($this->css)) ? $this->css : $baseUrl . '/fileuploader.css';
		Yii::app()->clientScript->registerCssFile($this->css);

		$postParams = array('PHPSESSID' => session_id(), 'YII_CSRF_TOKEN' => Yii::app()->request->csrfToken);
		if(isset($this->postParams)) {
			$postParams = array_merge($postParams, $this->postParams);
		}

		$config = array(
			'element' => 'js:document.getElementById("' . $this->id . '")',
			'debug' => false,
			'multiple' => false,
			'template' => '
				<div class="qq-uploader">
					<div class="qq-upload-drop-area">
						<span>'.tc('Drop files here to upload').'</span>
					</div>
					<div class="qq-upload-button">'.$this->label.'</div>
					<ul class="qq-upload-list"></ul>
				</div>',
			'fileTemplate' => '<li><span class="qq-upload-file"></span><span class="qq-upload-spinner"></span><span class="qq-upload-size"></span>
				<a class="qq-upload-cancel" href="#">'.tc('Cancel').'</a><span class="qq-upload-failed-text">'.tc('Error. Repeat attempt later').'</span></li>',
		);
		$config = array_merge($config, $this->config);
		$config['params'] = $postParams;
		$config = CJavaScript::encode($config);
		Yii::app()->getClientScript()->registerScript("FileUploader_" . $this->id, "var FileUploader_" . $this->id . " = new qq.FileUploader($config); ", CClientScript::POS_LOAD);
	}


}