<?php
ini_set('max_execution_time',0);
ini_set('display_errors',0);
#ini_set('memory_limit','5120M');
ini_set('max_input_vars','5000000');
ini_set('max_input_time','0');
ini_set('max_execution_time','0');
ini_set('display_errors', 1);

// karena PHP4 ndak support JSON
require_once 'main/lib/JSON.php';

// Future-friendly json_encode
if (!function_exists('json_encode')) {

    function json_encode($data) {
        $json = new Services_JSON();
        return( $json->encode($data) );
    }

}

// Future-friendly json_decode
if (!function_exists('json_decode')) {

    function json_decode($data, $condition = true) {
        $json = new Services_JSON();
        //return( $json->decode($data) );
        $ret = $json->decode($data);
        if ($condition) {
            return ObjToArr($ret);
        } else {
            return $ret;
        }
    }

}

function ObjToArr($data) {
    if (is_object($data)) $data = get_object_vars($data);
    return is_array($data) ? array_map(__FUNCTION__, $data) : $data;
}

   //Load Configuration
	require_once 'config/configuration.class.php';
	$cfg = new Configuration();

   $cfg->Load('base.conf.php');

	//Load Library Class
	require_once $cfg->GetValue('app_lib') . 'adodb/adodb.inc.php';

   //Load Application Class
	require_once $cfg->GetValue('app_service') . 'server/base_server.service.class.php';
   require_once $cfg->GetValue('app_data') . 'database_connected.class.php';

	//$server->register("Dispatch");
   //$HTTP_RAW_POST_DATA = "";

   function Dispatch(/*$serviceParams, $dataParams*/) {
      global $cfg;
      $data_post = file_get_contents("php://input");//print_r($data_post);die;
      $data_post = json_decode($data_post, true);
      //echo(count($dataParams));die;
      //print_r($data_post);die;
      /*
         $serviceParams contains array for request handler
         pModule : Nama Module
         pSub : Sub Module. Ex : di Module Manajemen User, ada Sub Modul Kategori User
         pAct: Prefix Sub Module. Ex : View, Add, Edit, atau lainnya..
      */
      header('Cache-Control: no-cache, must-revalidate');
      header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
/*
      $serviceParams = $_REQUEST['serviceParams'];
      $dataParams = $_REQUEST['dataParams'];
*/
      $serviceParams = $data_post[0]['service'];
      $dataParams = $data_post[0]['data'];

      if(!empty($serviceParams)){
         foreach($serviceParams as $key => $value) {
            $$key = $value;
         }
      }
      $valid = false;//echo $pAct;die;o

      /* auth begin*/
      //authentification data
      $authData = $data_post[0]['authData'];
      $_act = isset($pAct) ? $pAct : (isset($_REQUEST['pAct']) ? $_REQUEST['pAct'] : '');
      $arrAtctionOpen = array('checkSiaLogin');
      $loginModule = $cfg->GetServiceBusinessHandler('apps_login', 'apps_login');
      if (file_exists($loginModule) && !in_array($_act, $arrAtctionOpen)){
         require_once $loginModule;
         
         if (isset($_REQUEST['siaUsername'])){
            $username = $_REQUEST['siaUsername'];
            $password = $_REQUEST['siaPassword'];
         }else
         if (isset($authData['username'])){
            $username = $authData['username'];
            $password = $authData['password'];
         }else{
            $username = '';
            $password = '';
         }
         $dataLogin = array($username, $password);
         $apps_login = new Apps_login($cfg, $dataLogin);
         $isSiaLogedIn = $apps_login->checkSiaLogin();
         if (!$isSiaLogedIn){
            $server_fault = 'You need authentification to Get SIA data';
            return json_encode($server_fault);
         }
      }else
      if (!in_array($_act, $arrAtctionOpen)){
         $server_fault = "Login Module isn't found";
         return json_encode($server_fault);
      }
      /* auth end */

      if (!empty($pModule) && !empty($pAct) && !empty($pSub)) {
         $fileStatus = $cfg->GetServiceBusinessHandler($pModule, $pSub);
         $valid = true;
      } else {
         $fileStatus = false;
         $valid = false;
      }
      if (false !== $valid){
         if (false == $fileStatus) {
            // return no handler message
            $server_fault = 'No file handler found for this request';
            return json_encode($server_fault);
         } else {
            //dirty hack :: use ob_start() for avoiding nusoap resulting response is not type of xml
            ob_start();
            require_once $fileStatus;

            $className = str_replace(' ', '', ucwords($pSub));
            $functionName = ucfirst($pAct);

            $classHandler = new $className($cfg, $dataParams);
               // check if connection has failed to inisiate ??
            if($classHandler->GetProperty("IsError")) {
               ob_end_clean();
               $server_fault = $classHandler->GetProperty("ErrorMessage");
               $classHandler->DestroyObject();
               return json_encode($server_fault);
            }
            else {
               // check is there any method with $functionName belong to classhandler declared ???
               if(method_exists($classHandler, $functionName)) {
                  $result = $classHandler->$functionName();
                  ob_end_clean();

                  // echo data as soapval if not false
                  if(false !== $result) {
                     $return_value = $result;
                     //$classHandler->DestroyObject();
                     return json_encode($return_value);
                  }
                  else {
                     $server_fault = $classHandler->GetProperty("ErrorMessage");
                     $classHandler->DestroyObject();
                     return json_encode($server_fault);
                  }
               }
               else {
                  ob_end_clean();
                  $server_fault = 'No method declared named '.$functionName.' on class '.$className;
                  $classHandler->DestroyObject();
                  return json_encode($server_fault);
               }
            }
         }
      } else {
         // return no handler message
         $server_fault = 'Incorrect service request params, operation not succeed';
         return json_encode($server_fault);
      }
   }

   //comment this line for debugging purpose

  //$server->service(trim($HTTP_RAW_POST_DATA));
   echo Dispatch();
   /**
   //uncomment this part for debugging purpose
   echo '<pre>';
   //$reqServiceParams = array('pModule' => 'dosen', 'pSub' => 'dosen', 'pAct' => 'GetNilaiMahasiswaForKelas');
   //$reqServiceData = array('160000261');
   //$result = Dispatch($reqServiceParams, $reqServiceData);
   $result = Dispatch();
   print_r($result);
   echo '</pre>';/**/
?>