<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 

/**
 * Utilitaires d'insertion de scripts côté client (JQuery)
 * @author jc
 * version 1.0.0.4
 */
class My_Javascript extends CI_Javascript {
	
	/**
	 * Ajoute les balises de Script avant et après le code si nécessaire
	 */
	private function addScript($code){
		return preg_filter("/(\<script[^>]*?\>)?(.*)(\<\/script\>)?/si", "<script>$2 </script>\n", $code,1);
	}
	
	public function addParam($parameter,$params){
		$params=preg_filter("/[\{]?([^\\}]*)[\}]?/si", "$1", $params,1);
		$values=explode(",", $params);
		$values[]=$parameter;
		return "{".implode(",", $values)."}";
	}
	/**
	 * Associe une fonction à l'évènement d'un élément DOM
	 */
	public function bindToElement($element,$event,$function){
		return $this::addScript("$('".$element."').bind('".$event."',".$function.");");
	}
	
	/**
	 * Exécute le script passé en paramètre
	 * @param String $script
	 * @return mixed
	 */
	public function execute($script){
		return $this->addScript($script);
	}

	public function _get($url,$params="{}",$responseElement="",$function=NULL,$attr="id"){
		$function=isset($function)?$function:"";
		$retour="url='".$url."';\n";
		if($attr=="value")
			$retour.="url=url+'/'+$(this).val();\n";
		else
			$retour.="url=url+'/'+$(this).attr('".$attr."');\n";
		$retour.="$.get(url,".$params.").done(function( data ) {\n";
		if($responseElement!=="")
			$retour.="\t$('".$responseElement."').html( data );\n";
		$retour.="\t".$function."\n
		});\n";
		return $retour;
	}
	/**
	 * Effectue un GET en ajax
	 * @param string $url Adresse de la requête
	 * @param string $params Paramètres passés au format JSON
	 * @param string $responseElement id de l'élément HTML affichant la réponse
	 * @param string $function fonction appelée éventuellement après réception
	 */
	public function get($url,$params="{}",$responseElement="",$function=NULL,$attr="id"){
		return $this->addScript($this->_get($url,$params,$responseElement,$function));
	}
	
	public function _post($url,$params="{}",$responseElement="",$function=NULL,$attr="id"){
		$function=isset($function)?$function:"";
		$retour="url='".$url."';\n";
		if($attr=="value")
			$retour.="url=url+'/'+$(this).val();\n";
		else
			$retour.="url=url+'/'+$(this).attr('".$attr."');\n";
		$retour.="$.post(url,".$params.").done(function( data ) {\n";
		if($responseElement!=="")
			$retour.="\t$('".$responseElement."').html( data );\n";
		$retour.="\t".$function."\n
		});\n";
		
		return $retour;
	}
	
	/**
	 * Effectue un POST en ajax
	 * @param string $url Adresse de la requête
	 * @param string $params Paramètres passés au format JSON
	 * @param string $responseElement id de l'élément HTML affichant la réponse
	 * @param string $function fonction appelée éventuellement après réception
	 */
	public function post($url,$params="{}",$responseElement="",$function=NULL,$attr="id"){
				return $this->addScript($this->_post($url,$params,$responseElement,$function));
		
	}
	
	public function _postForm($url,$form,$responseElement,$validation=false,$function=NULL,$attr="id"){
		$function=isset($function)?$function:"";
		$retour="url='".$url."';\n";
		if($attr=="value")
			$retour.="url=url+'/'+$(this).val();\n";
		else
			$retour.="url=url+'/'+$(this).attr('".$attr."');\n";
		$retour.="$.post(url,$(".$form.").serialize()).done(function( data ) {\n";
		if($responseElement!=="")
			$retour.="\t$('".$responseElement."').html( data );\n";
		$retour.="\t".$function."\n
		});\n";
		if($validation){
			$retour="$('#".$form."').validate({submitHandler: function(form) {
			".$retour."
			}});\n";
			$retour.="$('#".$form."').submit();\n";
		}
		return $retour;
	}
	
	/**
	 * Effectue un POST d'un formulaire en ajax
	 * @param string $url Adresse de la requête
	 * @param string $form id du formulaire à poster
	 * @param string $responseElement id de l'élément HTML affichant la réponse
	 * @param string $function fonction appelée éventuellement après réception
	 */
	public function postForm($url,$form,$responseElement,$validation=false,$function=NULL,$attr="id"){
		return $this->addScript($this->_postForm($url, $form, $responseElement,$validation,$function,$attr));
	}
	

	public function _setVal($element,$value,$function=""){
		return "$('".$element."').val(".$value.");\n".$function;
	}
	
	/**
	 * Affecte une valeur à un élément HTML
	 * @param string $element
	 * @param string $value
	 */
	public function setVal($element,$value,$function=""){
		return $this->addScript($this->_setVal($element, $value,$function));
	}
	
	public function _setHtml($element,$html="",$function=""){
		return "$('".$element."').html('".$html."');\n".$function;
	}
	
	/**
	 * Affecte du html à un élément
	 * @param string $element
	 * @param string $html
	 */
	public function setHtml($element,$html="",$function=""){
		return $this->addScript($this->_setHtml($element, $html,$function));
	}
	
	public function _setAttr($element,$attr,$value="",$function=""){
		return "$('".$element."').attr('".$attr."',".$value.");\n".$function;
	}
	
	/**
	 * Modifie l'attribut $attr d'un élément html
	 * @param string $element
	 * @param string $attr attribut à modifier
	 * @param string $value nouvelle valeur
	 */
	public function setAttr($element,$attr,$value="",$function=""){
		return $this->addScript($this->_setAttr($element, $attr, $value,$function));
	}
	
	/**
	 * Appelle la méthode JQuery $someThing sur $element avec passage éventuel du paramètre $param
	 * @param string $element
	 * @param string $someThing
	 * @param string $param
	 * @return mixed
	 */	
	public function _doSomethingOn($element,$someThing,$param="",$function=""){
		return "$('".$element."').".$someThing."(".$param.");\n".$function;
	}
	
	/**
	 * Appelle la méthode JQuery $someThing sur $element avec passage éventuel du paramètre $param
	 * @param string $element
	 * @param string $someThing
	 * @param string $param
	 * @return mixed
	 */
	public function doSomethingOn($element,$someThing,$param="",$function=""){
		return $this->addScript($this->_doSomethingOn($element, $someThing,$param,$function));
	}
	
	/**
	 * Effectue un get vers $url sur l'évènement $event de $element en passant les paramètres $params
	 * puis affiche le résultat dans $responseElement
	 * @param string $element
	 * @param string $event
	 * @param string $url
	 * @param string $params
	 * @param string $responseElement
	 * @param string $function
	 */
	 public function getAndBindTo($element,$event,$url,$params="{}",$responseElement="",$function=NULL,$attr="id"){
		return $this->bindToElement($element, $event,"function(event){". $this->_get($url, $params,$responseElement,$function,$attr)."}");
	}
	
	/**
	 * Effectue un post vers $url sur l'évènement $event de $element en passant les paramètres $params
	 * puis affiche le résultat dans $responseElement
	 * @param string $element
	 * @param string $event
	 * @param string $url
	 * @param string $params
	 * @param string $responseElement
	 * @param string $function
	 */
	public function postAndBindTo($element,$event,$url,$params="{}",$responseElement="",$function=NULL,$attr="id"){
		return $this->bindToElement($element, $event,"function(event){". $this->_post($url,$params,$responseElement,$function,$attr)."}");
	}
	
	/**
	 * Effectue un post vers $url sur l'évènement $event de $element en passant les paramètres du formulaire $form
	 * puis affiche le résultat dans $responseElement
	 * @param string $element
	 * @param string $event
	 * @param string $url
	 * @param string $form
	 * @param string $responseElement
	 * @param string $function
	 */
	public function postFormAndBindTo($element,$event,$url,$form,$responseElement="",$validation=false,$function=NULL,$attr="id"){
		return $this->bindToElement($element, $event,"function(event){". $this->_postForm($url,$form,$responseElement,$validation,$function,$attr)."}");
	}
	
	/**
	 * Modifie la valeur de $elementToModify et lui affecte $valeur sur l'évènement $event de $element
	 * @param string $element
	 * @param string $event
	 * @param string $elementToModify
	 * @param string $value
	 * @return mixed
	 */
	public function setAndBindTo($element,$event,$elementToModify,$value="",$function=""){
		return $this->bindToElement($element, $event,"function(event){". $this->_setVal($elementToModify, $value,$function)."}");
	}
	
	/**
	 * Modifie la valeur de $elementToModify et lui affecte $valeur sur l'évènement $event de $element
	 * @param string $element
	 * @param string $event
	 * @param string $elementToModify
	 * @param string $value
	 * @return mixed
	 */
	public function setHtmlAndBindTo($element,$event,$elementToModify,$value="",$function=""){
		return $this->bindToElement($element, $event,"function(event){". $this->_setHtml($elementToModify, $value,$function)."}");
	}
	
	/**
	 * 
	 * @param string $element
	 * @param string $event
	 * @param string $element
	 * @param string $someThing
	 * @param string $param
	 */
	public function doSomeThingAndBindTo($element,$event,$elementToModify,$someThing,$param="",$function=""){
		return $this->bindToElement($element, $event,"function(event){". $this->_doSomethingOn($elementToModify, $someThing,$param,$function)."}");
	}
	
	public function setChecked($elementPrefix,$values){
		$retour="";
		if(is_array($values)){
			foreach ($values as $value){
				$retour.="$('#".$elementPrefix.$value."').attr('checked', true);\n";
			}
		}else 
			$retour="$('#".$elementPrefix."').attr('checked', ".StrUtils::getBooleanStr($values).");\n";
		return $this->addScript($retour);
	}
}
