<?php
/**
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Myron Turner <turnermm02@shaw.ca>
 */
 
// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();

class helper_plugin_ckgedit extends DokuWiki_Plugin {
 

 
  function getMethods(){
    $result = array();
    $result[] = array(
      'name'   => 'registerOnLoad',
      'desc'   => 'register some javascript to the window.onload js event',
      'params' => array('js' => 'string'),
      'return' => array('html' => 'string'),
    );
    return $result;
  }

  /**
   * Convert string configuration value into an array
  */
  function get_conf_array($val) {
     $str = $this->getConf($val);
     $str = preg_replace('/\s+/',"",$str);
     return explode(',', $str);
  }
  
  function get_ckgedit_ImageAllowedExtensions() {
    $uploadImageTypes = ARRAY();
    foreach (getMimeTypes() as $ext=>$mtype) {
        if(preg_match("/image/", $mtype)) {
           $uploadImageTypes[] = $ext;
      }     
    }
     return '.(' . implode('|',$uploadImageTypes) .')$';
  }
  
  function is_outOfScope(&$which="") {
      if(isset($_REQUEST['target']) && $_REQUEST['target'] == 'plugin_data') return true; 
      return false;
  }
  
  function has_plugin($plugin) {    
      $plugins_list = plugin_list();               
      return in_array($plugin, $plugins_list);
  }
  
     /** 
    * function dw_edit_displayed
    * @author  Myron Turner
    * determines whether or not to show  or hide the
    *  'DW Edit' button
   */

   function dw_edit_displayed() 
   { 
        global $INFO;

        $dw_edit_display = @$this->getConf('dw_edit_display');
        if(!isset($dw_edit_display))return "";  //version 0. 
        if($dw_edit_display != 'all') {
            $admin_exclusion = false;
            if($dw_edit_display == 'admin' && ($INFO['isadmin'] || $INFO['ismanager']) ) {    
                    $admin_exclusion = true;
            }
            if($dw_edit_display == 'none' || $admin_exclusion === false) {
              return ' style="display:none" ';
            }
           return "";
        }
        return "";
      
   }

  function registerOnLoad($js){
  global $ID;
  global $lang;
  global $skip_styling;
  global $JSINFO;

  $ckgedit_conf_direction = $this->getConf('direction');
   if($ckgedit_conf_direction == "dokuwiki") {
       $ckgedit_lang_direction = $lang['direction'];
   }    
  else {
      $ckgedit_lang_direction = $ckgedit_conf_direction;
  }   
  $ImageUploadAllowedExtensions = $this->get_ckgedit_ImageAllowedExtensions() ;
  $media_tmp_ns = preg_match('/:/',$ID) ? preg_replace('/:\w+$/',"",$ID,1) : "";    
  $locktimer_msg = "Your lock for editing this page is about to expire in a minute.\\n"                  
                . "You can reset the timer by clicking the Back-up button.";

    $meta_fn = metaFN($ID,'.ckgedit');
    $meta_id = 'meta/' . str_replace(':','/',$ID) . '.ckgedit';

  global $INFO; 
  global $conf;
  global $USERINFO;
  $_OS = strtolower(PHP_OS);
  $cname = getCacheName($INFO['client'].$ID,'.draft');
  $useheading = $conf['useheading'];

  if($useheading && $useheading != 'navigation') {
       $useheading = 'y';
  }
  else $useheading = 'n';
  //msg('uh='.$useheading);
  $open_upload = $this->getConf('open_upload');
  $editor_backup = $this->getConf('editor_bak');
  $create_folder = $this->getConf('create_folder');
  $interface_lang = $this->getConf('other_lang');
  $scayt_lang = $this->getConf('scayt_lang');
  list($name,$scayt_lang) = explode('/', $scayt_lang);
  
  $scayt_auto = $this->getConf('scayt_auto');
 $color_opts = $this->getConf('color_options');
 $font_opts = $this->getConf('font_options');
  $toolbar_opts = $this->getConf('alt_toolbar');
 $mfiles =   $this->getConf('mfiles');
 $extra_plugins = $this->getConf('extra_plugins');
  $ckg_gui = $this->getConf('gui');
  if(!isset($INFO['userinfo']) && !$open_upload) {
    $user_type = 'visitor';
  }
  else {
   $user_type = 'user';
  }
  $save_dir = DOKU_BASE . ltrim($conf['savedir'],'/.\/');
  $fbsz_increment = isset($_COOKIE['fbsz']) && $_COOKIE['fbsz'] ? $_COOKIE['fbsz'] : '0';
  $use_pastebase64 = (isset($_COOKIE['ckgEdPaste']) && $_COOKIE['ckgEdPaste'] == 'on' )  ? 'on' : 'off';
  // if no ACL is used always return upload rights
  if($conf['useacl']) {
     $client = $_SERVER['REMOTE_USER']; 
  }
  else $client = "";
  $user_name = $USERINFO['name'];
  $user_email = $USERINFO['mail'];
  
  $fnencode = isset($conf['fnencode']) ? $conf['fnencode'] : 'url';  
  $user_groups = $USERINFO['grps'];
  if(!$user_groups) $user_groups = array();
  if (@in_array("guest", $user_groups)) {
     $create_folder = 'n';
	 $user_type = 'visitor';
  }
  $user_groups = str_replace('"','\"',implode(";;",$user_groups));

  if($INFO['isadmin'] || $INFO['ismanager']) {    
     $client = "";
  }
 
  $ver_anteater = mktime(0,0,0,11,7,2010); 
  $dwiki_version=mktime(0,0,0,01,01,2008);

  if(isset($conf['fnencode'])) {
      $ver_anteater = mktime(0,0,0,11,7,2010); 
      $dwiki_version=mktime(0,0,0,11,7,2010); 
  }
  else if(function_exists('getVersionData')) {
      $verdata= getVersionData();
      if(isset($verdata) && preg_match('/(\d+)-(\d+)-(\d+)/',$verdata['date'],$ver_date)) {
          if($ver_date[1] >= 2005 && ($ver_date[3] > 0 && $ver_date[3] < 31) && ($ver_date[2] > 0 && $ver_date[2] <= 12)) { 
                                          // month        day               year
          $dwiki_version=@mktime(0,  0,  0, $ver_date[2],$ver_date[3], $ver_date[1]); 
          if(!$dwiki_version) $dwiki_version = mktime(0,0,0,01,01,2008);         
          $ver_anteater = mktime(0,0,0,11,7,2010); 
      }
    }
  }

$ckg_brokenimg = $this->getLang('broken_image');
 $default_fb = $this->getConf('default_fb');
 if($default_fb == 'none') {
     $client = "";
 }

 $doku_base = DOKU_BASE; 

    return <<<end_of_string


<script type='text/javascript'>
 //<![CDATA[

if(window.dw_locktimer) {
   var locktimer = dw_locktimer;
} 
var FCKRecovery = "";
var oldonload = window.onload;
var ourLockTimerINI = false;

var ckgedit_onload = function() { $js };
window.onload =  ckgedit_onload;

  function getCurrentWikiNS() {
        var DWikiMediaManagerCommand_ns = '$media_tmp_ns';
        return DWikiMediaManagerCommand_ns;
  }
 
 var ourFCKEditorNode = null;

function revert_to_prev() {
  if(!(GetE('saved_wiki_html').innerHTML.length)) {
            if(!confirm(backup_empty)) {
                           return;
            }
  }
  CKEDITOR.instances.wiki__text.setData( GetE('saved_wiki_html').innerHTML);
   window.dwfckTextChanged = true;
}


function draft_delete() {

        var debug = false;
        var params = "draft_id=$cname";
        jQuery.ajax({
           url: DOKU_BASE + 'lib/plugins/ckgedit/scripts/draft_delete.php',
           data: params,    
           type: 'POST',
           dataType: 'html',         
           success: function(data){                 
               if(debug) {            
                  alert(data);
               }
              
    }
    });

    window.textChanged = false;
}

var DWFCK_EditorWinObj;
function FCKEditorWindowObj(w) { 
  DWFCK_EditorWinObj = w;
}

function ckgedit_isRTL() { 
var direction = "$ckgedit_lang_direction";

return direction == 'rtl';
  
}

function remove_styling() {
//'TextColor,BGColor, FontAssist,Font,FontSize';
var opts = "";
var color_opts = parseInt( "$color_opts");
var font_opts =  parseInt("$font_opts");
var skip_styling=parseInt("$skip_styling");
if(color_opts) {
  opts ='TextColor,BGColor,FontAssist';
}
else if(!skip_styling) {
     opts = 'FontAssist';
}
if(font_opts) {
  if(color_opts || !skip_styling) opts+=',';
  opts +='Font,FontSize';
}
if("$toolbar_opts") {
  if(opts) opts+=',';
  opts+="$toolbar_opts";
}

return opts;

}

function  extra_plugins(config) {  
    if("$use_pastebase64" == 'on')  config.addPaste();    
    return "$extra_plugins";
}

function ckgedit_language_chk(config) { 
    if("$scayt_auto" == 'on') {
        config.scayt_autoStartup = true;         
    }
    else config.scayt_autoStartup = false;
    if("$scayt_auto" == 'disable') {
        config.scayt__disable = true;
    }   
    config.scayt_sLang="$scayt_lang";  
   var lang = "$interface_lang"; 
   if(lang ==  'default') return; ;
   config.language = lang;
}

function getCKEditorGUI() {
    return "$ckg_gui";
}
var oDokuWiki_FCKEditorInstance;
function FCKeditor_OnComplete( editorInstance )
{

  oDokuWiki_FCKEditorInstance = editorInstance;
  editorInstance.on( 'key', handlekeypress, editorInstance );

  CKEDITOR.instances.wiki__text.on('change', function(event) {
        window.dwfckTextChanged = true;
        window.textChanged = true;
  });

  editorInstance.on("focus", function(e) {
          window.dwfckTextChanged = true;
    });
 
   var broken_image ='http://' +  location.host +  DOKU_BASE +  '/lib/plugins/ckgedit/fckeditor/userfiles/blink.jpg?nolink&33x34';
   editorInstance.on("paste", function(e) {      
   //   https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript       
        var formatBytes = function(bytes,decimals) {
             if(bytes == 0) return '0 Bytes';
             var k = 1024,
             dm = decimals <= 0 ? 0 : decimals || 2,
             sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
             i = Math.floor(Math.log(bytes) / Math.log(k));
             return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
        }
         var len =  e.data.dataValue.length;
         var len = e.data.dataValue.length - 'data:image/png;base64,'.length;
         var size =   formatBytes(len,1);     
          var broken_msg = ckg_RawImgMsg();
          broken_msg += " " + size;
         if(e.data.dataValue.match(/data:image\/\w+;base64/) &&  len > 2500000) {
             alert(broken_msg);
             e.data.dataValue = '<img src ='+ broken_image + '/>';       
        }
    });

  oDokuWiki_FCKEditorInstance.dwiki_user = "$user_type";   
  oDokuWiki_FCKEditorInstance.dwiki_client = "$client";    
  oDokuWiki_FCKEditorInstance.dwiki_usergroups = "$user_groups";  
  oDokuWiki_FCKEditorInstance.dwiki_doku_base = "$doku_base";  
  oDokuWiki_FCKEditorInstance.dwiki_create_folder = "$create_folder"; 
  oDokuWiki_FCKEditorInstance.dwiki_fnencode = "$fnencode"; 
  oDokuWiki_FCKEditorInstance.dwiki_version = $dwiki_version; 
  oDokuWiki_FCKEditorInstance.dwiki_anteater = $ver_anteater; 
  oDokuWiki_FCKEditorInstance.isLocalDwikiBrowser = false;
  oDokuWiki_FCKEditorInstance.isUrlExtern = false; 
  oDokuWiki_FCKEditorInstance.isDwikiMediaFile = false; 
  oDokuWiki_FCKEditorInstance.imageUploadAllowedExtensions="$ImageUploadAllowedExtensions";
  oDokuWiki_FCKEditorInstance.fckgUserName = "$user_name";
  oDokuWiki_FCKEditorInstance.fckgUserMail="$user_email"; 
  oDokuWiki_FCKEditorInstance.useheading = "$useheading"; 
  oDokuWiki_FCKEditorInstance.mfiles = parseInt("$mfiles");
  oDokuWiki_FCKEditorInstance.fbsz_increment=parseInt("$fbsz_increment");

}


 window.DWikifnEncode = "$fnencode";

 //]]>
 
</script>
end_of_string;
  }
}
?>
