<?php
 
/**
 
 * jAPIBaseClass   Base class that extends all classes from which we want to get reflections
 
 *
 
 * @author Vladica Savic
 
 *
 
 */
 
class jAPIBaseClass {
 
    /**
 
     * @return string   Get reflections from specific class name
 
     */
 
    private function GetReflection($className) {
 
        $methods = array();
 
        $reflection = new ReflectionClass( $className );
 
        $scriptLocation = str_replace("\\","/","http://".$_SERVER["HTTP_HOST"]."/".substr($reflection->getFileName(),strlen($_SERVER["DOCUMENT_ROOT"])));
 
 
        foreach( $reflection->getMethods() as $method )
 
            if ( $method->isPublic() && ( $method->getDeclaringClass()->name == $className ) )
 
                $methods[] = array( 'ClassName'=>$className, 'MethodName' => $method->getName(), 'MethodParams' => $method->getNumberOfRequiredParameters(),'ScriptLocation'=>$scriptLocation );
 
        return json_encode( $methods );
 
    }
 
 
    /**
 
     * @return mixed   Result of the action
 
     */
 
    private function jAPICallFunction($className, $methodName) {
 
 
        $reflectedData = json_decode($this->GetReflection($className));
 
        $class                         =$reflectedData[0]->ClassName;
 
        $method                        =$reflectedData[0]->MethodName;
 
        $numberOfRequiredParameters    =$reflectedData[0]->MethodParams;
 
        $scriptLocation                =$reflectedData[0]->ScriptLocation;
 
 
        $jAPIHelper = new jAPIHelper();
 
        $params = array();
 
        for($counter = 1; $counter <= $numberOfRequiredParameters; $counter++) {
 
            $params[] = $_POST['Arg'.$jAPIHelper->SpellNumber($counter)];
 
        }
 
 
        //Finaly, here we are calling
 
        return call_user_func_array(array($className, $methodName),$params);
 
    }
 
 
    /**
 
     * jAPIJS Class Constructor
 
     */
 
    function __construct($classNames) {
 
        if($_SERVER['REQUEST_METHOD'] == 'POST') {
 
            $requestParams = array();
 
            foreach ($_POST as $key => $value) {
 
                if ($key != "action" && $value != "jAPIRequest") {
 
                    $requestParams[$key] = "$value";
 
                }
 
            }
 
            return $this->jAPICallFunction($_POST["jAPIMethodClassName"],$_POST["jAPIMethodName"]);
 
        }else {
 
            foreach(explode(',',$classNames) as $class) {
 
                $reflectedClassData = json_decode($this->GetReflection($class));
 
                new jAPIJS($reflectedClassData);
 
            }
 
        }
 
    }
 
}
 
 
/**
 
 * jAPIJS Class
 
 *
 
 * @author Vladica Savic
 
 *
 
 */
 
class jAPIJS {
 
    /**
 
     * @var string   jAPI JavaScript Template name
 
     */
 
    public $templateFile = "js/jAPI-Template.js";
 
 
    /**
 
     * @var string   Class name
 
     */
 
    public $class;
 
 
    /**
 
     * @var string   Method name
 
     */
 
    public $method;
 
 
    /**
 
     * @var int   Number of method arguments
 
     */
 
    public $methodArguments;
 
 
    /**
 
     * @return string   ParsedJavascript template
 
     */
 
    private function GetJavascript($reflectedClassData) {
 
        $jAPIModel = null;
 
 
        $jAPIHelper = new jAPIHelper();
 
        $jAPIModel = $reflectedClassData[0]->ClassName.'={';
 
 
        foreach($reflectedClassData as $reflectedData) {
 
            $methodArguments = null;
 
            $params = null;
 
            for($counter = 1; $counter <= $reflectedData->MethodParams; $counter++) {
 
                $methodArguments .= '+"&Arg'.$jAPIHelper->SpellNumber($counter).'="+Arg'.$jAPIHelper->SpellNumber($counter);
 
                $params .= 'Arg'.$jAPIHelper->SpellNumber($counter).',';
 
            }
 
 
            $translator = array('[%methodName%]' => $reflectedData->MethodName,
 
                    '[%scriptURL%]' => $reflectedData->ScriptLocation,
 
                    '[%params%]' => substr($params,0,(strlen($params)-1)),
 
                    '[%postData%]'=>'"action=jAPIRequest&jAPIMethodClassName='.$reflectedData->ClassName.'&jAPIMethodName='.$reflectedData->MethodName.'"'.$methodArguments.';');
 
 
            $jsMethodModel = '[%methodName%]:function([%params%]){ var serverMethodParams = [%postData%] return jAPIRemote("[%scriptURL%]",serverMethodParams); },';
 
            $jAPIModel .= strtr($jsMethodModel, $translator);
 
        }
 
 
        $jAPIModel = rtrim($jAPIModel,',');
 
        $jAPIModel.='};';
 
 
        echo $jAPIModel;
 
    }
 
 
    /**
 
     * jAPIJS Class Constructor
 
     */
 
    function __construct($reflectedClassData) {
 
        $this->GetJavascript($reflectedClassData);
 
    }
 
}
 
 
/**
 
 * jAPIHelper Class
 
 *
 
 * @author Vladica Savic
 
 *
 
 */
 
class jAPIHelper {
 
    /**
 
     * @return string   Convert number into word
 
     */
 
    public function SpellNumber($number) {
 
        if (($number < 0) || ($number > 999999999)) {
 
            throw new Exception("Number is out of range");
 
        }
 
 
        $Gn = floor($number / 1000000);  /* Millions (giga) */
 
        $number -= $Gn * 1000000;
 
        $kn = floor($number / 1000);     /* Thousands (kilo) */
 
        $number -= $kn * 1000;
 
        $Hn = floor($number / 100);      /* Hundreds (hecto) */
 
        $number -= $Hn * 100;
 
        $Dn = floor($number / 10);       /* Tens (deca) */
 
        $n = $number % 10;               /* Ones */
 
 
        $res = "";
 
 
        if ($Gn) {
 
            $res .= convert_number($Gn) . " Million";
 
        }
 
 
        if ($kn) {
 
            $res .= (empty($res) ? "" : " ") .
 
                    convert_number($kn) . " Thousand";
 
        }
 
 
        if ($Hn) {
 
            $res .= (empty($res) ? "" : " ") .
 
                    convert_number($Hn) . " Hundred";
 
        }
 
 
        $ones = array("", "One", "Two", "Three", "Four", "Five", "Six",
 
                "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen",
 
                "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eightteen",
 
                "Nineteen");
 
        $tens = array("", "", "Twenty", "Thirty", "Fourty", "Fifty", "Sixty",
 
                "Seventy", "Eigthy", "Ninety");
 
 
        if ($Dn || $n) {
 
            if (!empty($res)) {
 
                $res .= " and ";
 
            }
 
 
            if ($Dn < 2) {
 
                $res .= $ones[$Dn * 10 + $n];
 
            }
 
            else {
 
                $res .= $tens[$Dn];
 
 
                if ($n) {
 
                    $res .= "-" . $ones[$n];
 
                }
 
            }
 
        }
 
 
        if (empty($res)) {
 
            $res = "zero";
 
        }
 
 
        return $res;
 
    }
 
}
 
?>
 
 
 |