<?php
// ensure this file is being included by a parent file
if( !defined( '_JEXEC' ) && !defined( '_VALID_MOS' ) ) die( 'Restricted access' );
/**
 * @version $Id: edit.php 242 2015-08-19 06:29:26Z soeren $
 * @package eXtplorer
 * @copyright soeren 2007-2015
 * @author The eXtplorer project (http://extplorer.net)
 * @author The	The QuiX project (http://quixplorer.sourceforge.net)
 * 
 * @license
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 * 
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 * 
 * Alternatively, the contents of this file may be used under the terms
 * of the GNU General Public License Version 2 or later (the "GPL"), in
 * which case the provisions of the GPL are applicable instead of
 * those above. If you wish to allow use of your version of this file only
 * under the terms of the GPL and not to allow others to use
 * your version of this file under the MPL, indicate your decision by
 * deleting  the provisions above and replace  them with the notice and
 * other provisions required by the GPL.  If you do not delete
 * the provisions above, a recipient may use your version of this file
 * under either the MPL or the GPL."
 * 
 */

/**
 * File-Edit Functions
 */
class ext_Edit extends ext_Action {
	var	$lang_tbl = Array(
		'czech' => 'cs',
		'german' => 'de',
		'danish' => 'dk',
		'english' => 'en',
		'esperanto' => 'eo',
		'spanish' => 'es',
		'french' => 'fr',
		'croatian' => 'hr',
		'italian' => 'it',
		'japanese' => 'ja',
		'macedonian' => 'mk',
		'dutch' => 'nl',
		'polish' => 'pl',
		'portuguese' => 'pt',
		'russian' => 'ru',
		'slovenian' => 'sk'
	);

	function execAction($dir, $item) {		// edit file
		global $mainframe, $mosConfig_live_site;

		if(($GLOBALS["permissions"]&01)!=01) {
			ext_Result::sendResult('edit', false, ext_Lang::err('accessfunc' ));
		}
		$fname = ext_TextEncoding::fromUTF8(get_abs_item($dir, $item));

		if(!get_is_file($fname))  {
			ext_Result::sendResult('edit', false, ext_TextEncoding::toUTF8($item).": ".ext_Lang::err('fileexist' ));
		}
		if(!get_show_item($dir, $item)) {
			ext_Result::sendResult('edit', false, $item.": ".ext_Lang::err('accessfile' ));
		}

        // CSRF Security Check
        if( !ext_checkToken($GLOBALS['__POST']["token"]) ) {
            ext_Result::sendResult('tokencheck', false, 'Request failed: Security Token not valid.');
        }
		if(isset($GLOBALS['__POST']["dosave"]) && $GLOBALS['__POST']["dosave"]=="yes") {
			// Save / Save As
			$item=basename(stripslashes($GLOBALS['__POST']["fname"]));
			$fname2=ext_TextEncoding::fromUTF8(get_abs_item($dir, $item));

			if(!isset($item) || $item=="") {
				ext_Result::sendResult('edit', false, ext_Lang::err('miscnoname' ));
			}
			if($fname!=$fname2 && @$GLOBALS['ext_File']->file_exists($fname2)) {
				ext_Result::sendResult('edit', false, $item.": ".ext_Lang::err('itemdoesexist' ));
			}

			$this->savefile($fname2);
			$fname=$fname2;

			ext_Result::sendResult('edit', true, ext_Lang::msg('savefile').': '.$item );

		}
		if(isset($GLOBALS['__POST']["doreopen"]) && $GLOBALS['__POST']["doreopen"]=="yes") {
			// File Reopen
			$extra = Array();
			$content = $GLOBALS['ext_File']->file_get_contents( $fname );
			if( get_magic_quotes_runtime()) {
				$content = stripslashes( $content );
			}

			$langs = $GLOBALS["language"];
			if ($langs == "japanese"){
				$_encoding = $GLOBALS['__POST']["file_encoding"];
				if ($content){
					$content = mb_convert_encoding($content, "UTF-8", $_encoding);
				}
				$extra["file_encoding"] = $_encoding;
			}

			$extra["content"] = $content;

			ext_Result::sendResult('edit', true, ext_Lang::msg('reopenfile').': '.$item, $extra);

		}

		// header
		$s_item=get_rel_item($dir,$item);	if(strlen($s_item)>50) $s_item="...".substr($s_item,-47);
		$id_hash = substr('f'.md5($s_item),0, 10);
		$s_info = pathinfo( $s_item );
		$s_extension = str_replace('.', '', $s_info['extension'] );
		switch (strtolower($s_extension)) {
			case 'txt':
				$cp_lang = 'basic'; break;
			case 'cs':
				$cp_lang = 'csharp'; break;
			case 'css':
				$cp_lang = 'css'; break;
			case 'html':
			case 'htm':
			case 'xhtml':
				$cp_lang = 'html'; break;
			case 'java':
				$cp_lang = 'java'; break;
			case 'js':
				$cp_lang = 'js'; break;
			case 'pl': 
				$cp_lang = 'perl'; break;
			case 'py': 
				$cp_lang = 'python'; break;
			case 'ruby': 
				$cp_lang = 'ruby'; break;
			case 'sql':
				$cp_lang = 'sql'; break;
			case 'vb':
			case 'vbs':
				$cp_lang = 'vb'; break;
			case 'php':
				$cp_lang = 'php'; break;				
			case 'xml':
				$cp_lang = 'xml'; break;
			default: 
				$cp_lang = '';
		}
	$content = $GLOBALS['ext_File']->file_get_contents( $fname );
	if( get_magic_quotes_runtime()) {
		$content = stripslashes( $content );
	}
	$cw = 250;
	$langs = $GLOBALS["language"];
	if ($langs == "japanese"){
		$cw = 200;
		if ($content){
			$_encoding = strtoupper(mb_detect_encoding($content, Array("ASCII", "ISO-2022-JP", "UTF-8", "EUCJP-WIN", "SJIS-WIN"), true));
			$content = mb_convert_encoding($content, "UTF-8", $_encoding);
			if ($_encoding == "SJIS-WIN"){
				$_encoding_label = "SJIS";
			} elseif ($_encoding == "EUCJP-WIN"){
				$_encoding_label = "EUC-JP";
			} elseif ($_encoding == "ISO-2022-JP"){
				$_encoding_label = "JIS";
			} elseif ($_encoding == "ASCII"){
				$_encoding_label = "UTF-8";
			} else {
				$_encoding_label = $_encoding;
			}
		} else {
			$_encoding_label = "UTF-8";
		}
	}
	?>
{
	"xtype": "form",
	"id": "<?php echo $id_hash ?>",
	"labelWidth": "300",
	"autoScroll": "true", 
	"url":"<?php echo basename( $GLOBALS['script_name']) ?>",
	"title": "<?php echo strlen($s_item) > 50 ? substr( htmlentities($s_item,ENT_QUOTES), strlen($s_item)-30, 30 ) : htmlentities($s_item,ENT_QUOTES); ?>",
	"frame": "true",
	"closable": "true",
	"tbar": [{
 		"text": "<?php echo ext_Lang::msg('btnsave', true ) ?>", 
		"handler": function() {
			statusBarMessage( '<?php echo ext_Lang::msg('save_processing', true ) ?>', true );
			form = Ext.getCmp("<?php echo $id_hash ?>").getForm();
			form.submit({
				waitMsg: 'Saving the File, please wait...',
				reset: false,
				success: function(form, action) {
					datastore.reload();
					statusBarMessage( action.result.message, false, true );
				},
				failure: function(form, action) {
					statusBarMessage( action.result.error, false, false );
					Ext.Msg.alert('<?php echo ext_Lang::err('error', true) ?>!', action.result.error);
				},
				scope: form,
				// add some vars to the request, similar to hidden fields
				params: {option: 'com_extplorer', 
						action: 'edit', 
						code: editAreaLoader.getValue("ext_codefield<?php echo $id_hash ?>"),
						dir: '<?php echo stripslashes($dir) ?>', 
						item: '<?php echo stripslashes($item) ?>', 
						dosave: 'yes',
                        token: "<?php echo ext_getToken() ?>"
				}
			});
		},
        "cls":"x-btn-text-icon",
        "icon": "<?php echo _EXT_URL ?>/images/_save.png"
    },{
		"text": "<?php echo ext_Lang::msg('btnreopen', true ) ?>", 
		"handler": function() { 
			statusBarMessage( '<?php echo ext_Lang::msg('reopen_processing', true ) ?>', true );
			form = Ext.getCmp("<?php echo $id_hash ?>").getForm();
			form.submit({
				waitMsg: 'Processing Data, please wait...',
				reset: false,
				success: function(form, action) {
					statusBarMessage( action.result.message, false, true );
					editAreaLoader.setValue("ext_codefield<?php echo $id_hash ?>", action.result.content);
				},
				failure: function(form, action) {
					statusBarMessage( action.result.error, false, false );
					Ext.Msg.alert('<?php echo ext_Lang::err('error', true) ?>!', action.result.error);
				},
				scope: form,
				// add some vars to the request, similar to hidden fields
				params: {
					option: 'com_extplorer', 
					action: 'edit', 
					dir: '<?php echo stripslashes($dir) ?>', 
					item: '<?php echo stripslashes($item) ?>', 
					doreopen: 'yes',
                    token: "<?php echo ext_getToken() ?>"
				}
			});
		},	
        "cls":"x-btn-text-icon",
        "icon": "<?php echo _EXT_URL ?>/images/_reload.png"
    },
    {
    	"text": "<?php echo ext_Lang::msg('btncancel', true ) ?>", 
		"handler": function() { 
			Ext.getCmp("mainpanel").remove( Ext.getCmp("mainpanel").getActiveTab() );
		},
        "cls":"x-btn-text-icon",
        "icon": "<?php echo _EXT_URL ?>/images/_cancel.png"
	}],	
	"items": [{
		"xtype": "displayfield",
		"value": "<?php echo $GLOBALS["messages"]["actedit"].': '.htmlentities($s_item,ENT_QUOTES) ?>"
		},
		{
		"xtype": "textarea",
		"hideLabel": true,
		"name": "thecode",
		"id": "ext_codefield<?php echo $id_hash ?>",
		"fieldClass": "x-form-field",
		"value": "<?php echo str_replace(Array("\r", "\n"), Array( '\r', '\n') , addslashes($content)) ?>",
		"width": "100%",
		"height": 500,
		"plugins": new Ext.ux.plugins.EditAreaEditor({
			"id" : "ext_codefield<?php echo $id_hash ?>",	
			"syntax": "<?php echo $cp_lang ?>",
			"start_highlight": true,
			"display": "later",
			"toolbar": "search, go_to_line, |, undo, redo, |, select_font,|, change_smooth_selection, highlight, reset_highlight, |, help" 
			<?php if (array_key_exists($langs, $this->lang_tbl)){?>
				,"language": "<?php echo $this->lang_tbl[$langs] ?>"
				<?php 
				} ?>
		})
	},
	{
		
			"width": "<?php echo $cw ?>", 
			"xtype": "textfield",
			"fieldLabel": "<?php echo ext_Lang::msg('copyfile', true ) ?>",
			"name": "fname",
			"value": "<?php echo addslashes($item) ?>",
			"clear": "true"
			}
<?php if ($langs == "japanese"){ ?>
			,{
			 "width": "<?php echo $cw ?>",  
			 "style":"margin-left:10px", 
			 "clear":"true",
			"xtype": "combo",
			"fieldLabel": "<?php echo ext_Lang::msg('fileencoding', true ) ?>",
			"name": "file_encoding",
			"store": [
						["UTF-8", "UTF-8"],
						["SJIS-WIN", "SJIS"],
						["EUCJP-WIN", "EUC-JP"],
						["ISO-2022-JP","JIS"]
					],
			"value" : "<?php echo $_encoding_label ?>",
			"typeAhead": "true",
			"mode": "local",
			"triggerAction": "all",
			"editable": "false",
			"forceSelection": "true"
			}
	
<?php } ?>
		]

}
	
<?php

	}
	function savefile($file_name) {			// save edited file
		if( get_magic_quotes_gpc() ) {
			$code = stripslashes($GLOBALS['__POST']["code"]);
		}
		else {
			$code = $GLOBALS['__POST']["code"];
		}
		$langs = $GLOBALS["language"];
		if ($langs == "japanese"){
			$_encoding = $GLOBALS['__POST']["file_encoding"];
			if ($_encoding != "UTF-8"){
				$code = mb_convert_encoding($code, $_encoding, "UTF-8");
			}
		}

		$res = $GLOBALS['ext_File']->file_put_contents( $file_name, $code );

		if( $res==false || PEAR::isError( $res )) {
			$err = basename($file_name).": ".ext_Lang::err('savefile' );
			if( PEAR::isError( $res ) ) {
				$err .= $res->getMessage();
			}
			ext_Result::sendResult( 'edit', false, $err );
		}

	}
}
//------------------------------------------------------------------------------
?>
