<?php
/**
* TJavascript class file. Javascript utilties, converts basic PHP types into
* appropriate javascript types.
*
* Example:
* <code>
* $options['onLoading'] = "doit";
* $options['onComplete'] = "more";
* $js = new TJavascriptSerializer($options);
* echo $js->toMap();
* //expects the following javascript code
* // {'onLoading':'doit','onComplete':'more'}
* </code>
*
* For higher complexity data structures use TJSON to serialize and unserialize.
*
* Namespace: System.Web.UI
*
* @author Wei Zhuo<weizhuo[at]gmail[dot]com>
* @version $Revision: 1.3 $ $Date: 2005/11/10 23:43:26 $
* @package System.Web.UI
*/
class TJavaScript
{
public static function renderScriptFiles($files)
{
$str='';
foreach($files as $file)
$str.='<script type="text/javascript" src="'.THttpUtility::htmlEncode($file)."\"></script>\n";
return $str;
}
public static function renderScriptFile($file)
{
return '<script type="text/javascript" src="'.THttpUtility::htmlEncode($file)."\"></script>\n";
}
public static function renderScriptBlocks($scripts)
{
if(count($scripts))
return "<script type=\"text/javascript\">\n/*<![CDATA[*/\n".implode("\n",$scripts)."\n/*]]>*/\n</script>\n";
else
return '';
}
public static function renderScriptBlock($script)
{
return "<script type=\"text/javascript\">\n/*<![CDATA[*/\n{$script}\n/*]]>*/\n</script>\n";
}
public static function renderArrayDeclarations($arrays)
{
if(count($arrays))
{
$str="<script type=\"text/javascript\">\n/*<![CDATA[*/\n";
foreach($arrays as $name=>$array)
$str.="var $name=new Array(".implode(',',$array).");\n";
$str.="\n/*]]>*/\n</script>\n";
return $str;
}
else
return '';
}
public static function renderArrayDeclaration($array)
{
$str="<script type=\"text/javascript\">\n/*<![CDATA[*/\n";
$str.="var $name=new Array(".implode(',',$array).");\n";
$str.="\n/*]]>*/\n</script>\n";
return $str;
}
public static function quoteJavaScriptString($js,$forUrl=false)
{
if($forUrl)
return strtr($js,array('%'=>'%25',"\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));
else
return strtr($js,array("\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));
}
public static function trimJavaScriptString($js)
{
if($js!=='' && $js!==null)
{
$js=trim($js);
if(($pos=strpos($js,'javascript:'))===0)
$js=substr($js,11);
$js=rtrim($js,';').';';
}
return $js;
}
public static function encode($value,$toMap=true)
{
if(is_string($value))
{
if(($n=strlen($value))>2)
{
$first=$value[0];
$last=$value[$n-1];
if(($first==='[' && $last===']') || ($first==='{' && $last==='}'))
return $value;
}
return "'".self::quoteJavaScriptString($value)."'";
}
else if(is_bool($value))
return $value?'true':'false';
else if(is_array($value))
{
$results=array();
if($toMap)
{
foreach($value as $k=>$v)
$results[]="'{$k}':".self::encode($v,$toMap);
return '{'.implode(',',$results).'}';
}
else
{
foreach($value as $k=>$v)
$results[]=self::encode($v,$toMap);
return '['.implode(',',$results).']';
}
}
else if(is_integer($value))
return "$value";
else if(is_float($value))
{
if($value===-INF)
return 'Number.NEGATIVE_INFINITY';
else if($value===INF)
return 'Number.POSITIVE_INFINITY';
else
return "$value";
}
else if(is_object($value))
return self::encode(get_object_vars($this->data),$toMap);
else if($value===null)
return 'null';
else
return '';
}
public static function encodeJSON($value)
{
Prado::using('System.Web.Javascripts.TJSON');
return TJSON::encode($value);
}
public static function decodeJSON($value)
{
Prado::using('System.Web.Javascripts.TJSON');
return TJSON::decode($value);
}
}
?>