<?php
/**
 * Třída pro správu JavaScript. kódu
 * @author milda
 * @copyright Milan Lempera  2009
 *
 */

class Jscript {

/**
 * JS kód, který se bez dalších úprav vloží do HTML kódu souboru
 * @var array
 */
  private $scripts = array();

/**
 * JS soubory, které se mají vložit <script src="...">
 * @var array
 */
  private $files = array();

/**
 * JS funkce,které se vloží přímo do HTML kódu souboru
 * @var array
 */
  private $function = array();
  
/**
 * jQuery funkce,které se vloží přímo do HTML kódu souboru
 * @var array
 */
  private $jQfunction = array();

/**
 * Přidání JavaScriptu
 * @param $script
 */
   function addScript($script, $toJQfunction = '') {

    if (!empty($toJQfunction)) {

      if (isset($this->jQfunction[$toJQfunction])) {
        $this->jQfunction[$toJQfunction]['content'] .= NEWLINE.$script.NEWLINE;
      }
      else {
        die(__CLASS__.'->'.__METHOD__.': Funkce '.$toJQfunction.' neexistuje');
      }

    }
    else {
      $this->scripts[] = $script;
    }

  }

/**
 * Přidání souboru do HTML stránky (<script src="...">)
 * @param $file
 * @param $exists_check
 * @param $abs_path
 * @return  - /False
 */
  function addFile($file, $exists_check = false, $abspath = false) {

    if ($exists_check) {
      if (!file_exists(URL.JS_PATH.DIRSEP.$file)) {
        die(__CLASS__.'->'.__METHOD__.': soubor '.$file.' neexistuje!');
      }
      
    }

    if ($abspath) {
      $this->files[] = $file;
    }
    else {
      $this->files[] = URL.JS_PATH.DIRSEP.$file;
    }

  }

/**
 * Přidání JS funkce do HTML
 * @param $name
 * @param $script
 * @param $replace
 */
  public function addFunction($name, $param, $content, $replace = false) {

    $function = array();
    $function['name']    = $name;
    $function['param']   = $param;
    $function['content'] = $content;

    if (isset($this->function[$name]) AND !$replace ) {
      die(__CLASS__.'->'.__METHOD__.': Funkce '.$name.' již existuje');
    }
    else {
      $this->function[$name] = $function;
    }

  }
  
  public function addJqFunction($id, $fce_name, $content = ' ', $var = '', $is_fce = false, $brackets = false, $replace = false, $to_function = '') {

    $function = array();
    $function['id']       = $id;
    $function['name']     = $fce_name;
    $function['content']  = $content;
    $function['var']      = $var;
    $function['is_fce']   = $is_fce;
    $function['brackets'] = $brackets;

    if (!empty($to_function)) {

       if (isset($this->jQfunction[$to_function])) {
        $this->jQfunction['tmpl_fce'] = $function;
        $this->jQfunction[$to_function]['content'] .= NEWLINE.$this->parseJQFunction('tmpl_fce').NEWLINE;
        unset($this->jQfunction['tmpl_fce']);
       }
      else {
        die(__CLASS__.'->'.__METHOD__.': Funkce '.$to_function.' neexistuje');
      }

    }
    else {

      if (isset($this->jQfunction[$id.'_'.$fce_name]) AND !$replace ) {
        die(__CLASS__.'->'.__METHOD__.': Funkce '.$id.' - '.$name.' již existuje');
      }
      else {
        $this->jQfunction[$id.'_'.$fce_name] = $function;
      }

    }

  }

  private function parseJQFunction($key = '') {

    $fce_array = array();
    $parse_array = array();

    if (!empty($key)) {
      $parse_array[] = $this->jQfunction[$key];
    }
    else {
      $parse_array = $this->jQfunction;
    }

    foreach($parse_array as $fce) {

      if (!empty($fce['var'])) {
        $js = 'var '.$fce['var'].' = ';
      }
      else {
        $js = '';
      }

      if ($fce['is_fce']) {
        $js .= '$('.$fce['id'].').'.$fce['name'].'(function() {'.NEWLINE;
        $js .= $fce['content'].NEWLINE;
        $js .= '});'.NEWLINE;
      }
      else {
        if ($fce['brackets']) {
          $js .= '$('.$fce['id'].').'.$fce['name'].'( {'.NEWLINE;
          $js .= $fce['content'].NEWLINE;
          $js .= '});'.NEWLINE;
        }
        elseif ($fce['content']) {
          $js .= '$('.$fce['id'].').'.$fce['name'].'(';
          $js .= $fce['content'].NEWLINE;
          $js .= ');'.NEWLINE;
        }
        else {
          $js .= '$('.$fce['id'].').'.$fce['name'].'(';
          $js .= $fce['content'];
          $js .= ');'.NEWLINE;
        }
      }
      $fce_array[] = $js;
    }

    return implode(' ',$fce_array);

  }

  public function parseFunction() {

    $fce_array = array();

    foreach($this->function as $fce) {

      $js = 'function '.$fce['name'].'('.$fce['param'].'){';
      $js .= $fce['content'];
      $js .= '};';

      $fce_array[] = $js;
    }

    return implode(' ',$fce_array);

  }

  private function parseScript() {

    return implode('', $this->scripts);

  }

  public function parse() {

    $ret = '<script type="text/javascript">';
    $ret .= $this->parseJQFunction().NEWLINE;
    $ret .= $this->parseFunction().NEWLINE;
    $ret .= $this->parseScript().NEWLINE;
    $ret .= '</script>';

    $registry = Registry::getInstance();
    return $ret;
    
  }

  public function JSFile() {

    return $this->files;

  }
  
  

}
?>