PageRenderTime 48ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/quicky/classes/plugins/block.joincalculator.php

https://bitbucket.org/seyar/parshin.local
PHP | 64 lines | 64 code | 0 blank | 0 comment | 12 complexity | caf1fa2961a439e128b44f4d9266eb83 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1
  1. <?php
  2. class Quicky_joincalculator
  3. {
  4. public function _joincalc_callback($m)
  5. {
  6. if (isset($this->_tmp[$m[0]])) {return 'document.getElementById(\''.$this->_tmp[$m[0]].'\').value';}
  7. else {return $m[0];}
  8. }
  9. }
  10. function quicky_block_joincalculator($params,$content,$compiler)
  11. {
  12. static $obj = NULL;
  13. if ($obj === NULL) {$obj = new Quicky_joincalculator;}
  14. $params = $compiler->_parse_params($params);
  15. if (!isset($params['name'])) {return $compiler->_syntax_error('Missing parameter \'name\' in joincalculator tag.');}
  16. if (!isset($params['fields'])) {return $compiler->_syntax_error('Missing parameter \'fields\' in joincalculator tag.');}
  17. $params['name'] = strpos($params['name'],'$') !== FALSE?'<?php echo '.$params['name'].'; ?>':$compiler->_dequote($params['name']);
  18. $params['fields'] = explode(',',$compiler->_dequote($params['fields']));
  19. $fields = array();
  20. $return = '<script type="text/javascript">
  21. function calculator_'.$params['name'].'(field)
  22. {
  23. ';
  24. foreach ($params['fields'] as $k => $v)
  25. {
  26. if (preg_match('~(.*?)\s+as\s+(.*)~i',$v,$q))
  27. {
  28. if (isset($fields[$q[2]])) {return $compiler->_syntax_error('Field name \''.$q[2].'\' alredy in use ');}
  29. $fields[$q[2]] = $q[1];
  30. $fields[$q[1]] = $q[1];
  31. }
  32. else {$fields[$v] = $v;}
  33. }
  34. $f = '';
  35. foreach ($fields as $k => $v) {$f .= '|'.preg_quote($k,'~');}
  36. if ($f === '') {return $compiler->_syntax_error('No fields');}
  37. $obj->_tmp = $fields;
  38. preg_match_all('~\s*(.*?)\s*=\s*(.*?)(?:[\r\n]+|$)~m',$content,$m,PREG_SET_ORDER);
  39. foreach ($m as $v)
  40. {
  41. $name = $v[1];
  42. $expr = $v[2];
  43. $left = preg_replace_callback($a = '~([\'"]).*?\1'.$f.'~',array($obj,'_joincalc_callback'),$name);
  44. $right = preg_replace_callback('~([\'"]).*?\1'.$f.'~',array($obj,'_joincalc_callback'),$expr);
  45. $return .= 'if (field != \''.$name.'\') '.$left.' = '.$right.';
  46. ';
  47. }
  48. $obj->_tmp = array();
  49. $return .= '}';
  50. foreach ($fields as $k => $v)
  51. {
  52. if ($k != $v) {continue;}
  53. $return .= '
  54. document.getElementById(\''.$v.'\').onchange = function() {setTimeout(function() {calculator_'.$params['name'].'("'.$v.'");},50);}';
  55. if (isset($params['onkeydown']))
  56. {
  57. $return .= '
  58. document.getElementById(\''.$v.'\').onkeydown = function() {setTimeout(function() {calculator_'.$params['name'].'("'.$v.'");},50);}';
  59. }
  60. }
  61. $return .= '
  62. </script>';
  63. return $return;
  64. }