| 
<?PHPuse \Jackbooted\Html\Tag;
 use \Jackbooted\Forms\Request;
 use \Jackbooted\Html\JS;
 
 #####################################
 # PHPLiveX Library                  #
 # (C) Copyright 2006 Arda Beyazoglu #
 # Version: 2.5.1                    #
 # Home Page: www.phplivex.com       #
 # Contact: [email protected]  #
 # License: LGPL                     #
 # Release Date: 27.09.2008          #
 #####################################
 
 class PHPLiveX {
 private static $ignoredMethods = array ( '__construct', '__destruct' );
 
 public static function create ( ) {
 return new PHPLiveX ( );
 }
 /**
 * response Charset Encoding
 *
 * @var String
 */
 public $encoding = "UTF-8";
 
 /**
 * Array of ajaxified functions
 *
 * @var Array
 */
 private $functions = array();
 
 /**
 * Array of ajaxified object methods
 *
 * @var Array
 */
 private $objectMethods = array();
 
 /**
 * Indicates whether execute method was called before
 *
 * @var Boolean
 */
 private $executed = false;
 
 /**
 * Indicates whether run method was called before
 *
 * @var Boolean
 */
 private $ran = false;
 
 /**
 * Prepares specified functions for ajax requests
 *
 * @param Array $functions: array of function names to ajaxify
 */
 public function ajaxifyFunctions ( $functions=array() ) {
 if ( ! is_array ( $functions ) ) $functions= array ( $functions );
 
 foreach ( $functions as $val ){
 $val = stripslashes ( trim ( $val ) );
 if ( function_exists ( $val ) ) {
 if ( ! in_array ( $val, $this->functions ) ) $this->functions[] = $val;
 }
 else {
 echo JS::showError ( $val . 'function does not exist!' );
 }
 }
 
 reset ( $this->functions );
 $this->execute();
 return $this;
 }
 
 /**
 * Prepares specified class methods for ajax requests
 *
 * @param Array $functions: array of objects to Ajaxify. The format is
 * array ( 'objectName1' => array ( 'ref' => object1Reference, 'methods' => array ( 'methodName1' .. 'N' ) ), // Selected Methods
 *         'objectName2' => array ( 'ref' => object2Reference ) // All methods
 *         ...
 *
 */
 public function ajaxifyObjects ( $objectList = array() ){
 foreach ( $objectList as $objectName => $objectInfo ){
 
 if ( ! isset ( $objectInfo['ref'] ) ) $objectInfo['ref'] = $objectName;
 
 // What is the name of this class
 $objectInfo['className'] = ( is_string ( $objectInfo['ref'] ) ) ? $objectInfo['ref'] : get_class ( $objectInfo['ref'] );
 
 // Save the method proxys
 if ( ! isset ( $objectInfo['methods'] ) ) $objectInfo['methods'] = get_class_methods  ( $objectInfo['className'] );
 else if ( ! is_array( $objectInfo['methods'] ) ) $objectInfo['methods'] = array ( $objectInfo['methods'] );
 
 // Set up property proxies
 $objectInfo['properties'] = get_class_vars ( $objectInfo['className'] );
 
 // Save this for later
 $this->objectMethods[$objectName]  = $objectInfo;
 }
 $this->execute();
 return $this;
 }
 
 public static function decode($string, $encoding){
 return iconv ( "UTF-8", $encoding . "//IGNORE", urldecode ( $string ) );
 }
 
 /**
 * Calls the function specified by the incoming ajax request
 *
 */
 public function execute(){
 if ( $this->executed ) return;
 
 $this->executed = true;
 if ( ( $function = Request::get ( 'plxf' ) ) == '' ) return;
 
 $args = Request::get ( 'plxa', array () );
 
 if ( function_exists ( "json_decode" ) ){
 foreach ( $args as &$val ){
 if ( preg_match('/<plxobj[^>]*>(.|\n|\t|\r)*?<\/plxobj>/', $val, $matches ) ){
 $val = json_decode ( substr ( $matches[0], 8, -9 ) );
 }
 }
 }
 
 $response = '';
 $parts = explode ( "::",  $function );
 switch ( count ( $parts ) ) {
 // Function Call
 case 1:
 $response = call_user_func_array ( $function, $args );
 break;
 
 // Object Call
 case 2:
 if ( isset ( $this->objectMethods[$parts[0]] ) ) {
 $objectInfo = $this->objectMethods[$parts[0]];
 $response = call_user_func_array ( array ( $objectInfo['ref'], $parts[1] ), $args );
 }
 else {
 $response = call_user_func_array ( array ( $parts[0], $parts[1] ), $args );
 }
 break;
 
 default:
 $response = '';
 break;
 }
 
 if ( is_bool ( $response ) ) {
 $response = (int)$response;
 }
 else if ( function_exists ( "json_encode" ) &&  ( is_array ( $response ) || is_object ( $response ) ) ) {
 $response = json_encode($response);
 }
 
 echo  Tag::hTag ( 'phplivex' ), $response, Tag::_hTag ( 'phplivex' );
 exit();
 }
 
 /**
 * Creates the javascript reflections of the ajaxified php functions
 *
 * @param String $function
 * @return String JS code
 */
 private function createFunction($function){
 return "function " . $function . "(){ return new PHPLiveX().Callback('" . $function . "', " . $function . ".arguments); }\n";
 }
 
 /**
 * Creates the javascript reflections of the ajaxified php objects
 *
 * @return String JS code
 */
 private function createClass( $objectName, $objectInfo ){
 $methods    = $objectInfo['methods'];
 $properties = $objectInfo['properties'];
 $elements   = array ();
 
 foreach ( $properties as $property => $value ) {
 if ( is_string ( $value ) ) $value = "'$value'";
 else if ( is_array ( $value ) ||
 is_object ( $value ) && function_exists ( "json_encode" ) ) $value = json_encode ( $value );
 if ( !isset( $value ) || $value == false ) $value = "null";
 
 $elements[] = "'{$property}': {$value}";
 }
 
 foreach ( $methods as $method ) {
 if ( in_array ( $method, self::$ignoredMethods ) ) continue;
 
 $elements[] = "'{$method}': function(){ return new PHPLiveX().Callback({'obj': '{$objectName}', 'method': '{$method}'}, {$objectName}.{$method}.arguments); }";
 }
 
 return "var {$objectName} = {\n" .
 join(",\n", $elements ) . "\n" .
 "};\n";
 }
 
 /**
 * Organizes the created javascript code for the page
 *
 * @param Boolean $includeJS: False to create js class here and True to include the js class file
 */
 public function run ( $echoJS=true ){
 if ( $this->ran ) return;
 $this->ran = true;
 
 $js = '';
 foreach ( $this->functions as $function ) {
 $js .= $this->createFunction ( $function );
 }
 
 foreach ( $this->objectMethods as $objectName => $objectInfo ) {
 $js .= $this->createClass ( $objectName, $objectInfo );
 }
 
 if ( $echoJS ) echo JS::javaScript ( $js );
 else return $js;
 }
 }
 
 |