Browse Source

[svn r17507] previous commit plugin unchanged for later better identify the changes

Juan Carlos Raña 16 năm trước cách đây
mục cha
commit
625271d4f7
100 tập tin đã thay đổi với 14774 bổ sung0 xóa
  1. 54 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/_ajax_get_details_listing.php
  2. 37 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/_ajax_get_thumbnail_listing.php
  3. 15 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/_ajax_load_folders.php
  4. 74 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_create_folder.php
  5. 77 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_delete_file.php
  6. 32 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_download.php
  7. 116 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_editor_reset.php
  8. 34 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_file_copy.php
  9. 33 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_file_cut.php
  10. 138 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_file_paste.php
  11. 86 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_file_upload.php
  12. 137 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_get_file_listing.php
  13. 13 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_get_folder_listing.php
  14. 208 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_image_editor.php
  15. 194 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_image_save.php
  16. 33 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_image_thumbnail.php
  17. 94 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_image_undo.php
  18. 57 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_login.php
  19. 58 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_preview.php
  20. 57 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_save_as_form.php
  21. 79 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_save_name.php
  22. 88 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_save_text.php
  23. 166 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_text_editor.php
  24. 687 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajaxfilemanager.php
  25. 0 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/debug.html
  26. 48 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.auth.php
  27. 436 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.file.php
  28. 155 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.history.php
  29. 789 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.image.php
  30. 373 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.manager.php
  31. 584 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.pagination.php
  32. 184 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.search.php
  33. 229 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.session.php
  34. 93 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.sessionaction.php
  35. 589 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.upload.php
  36. 131 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/config.base.php
  37. 107 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/config.php
  38. 131 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/config.tinymce.php
  39. 8 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/data.php
  40. 1225 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/function.base.php
  41. 1842 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxfilemanager.js
  42. 1 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxfilemanager_c.js
  43. 225 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxfileupload.js
  44. 873 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaximageeditor.js
  45. 1 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaximageeditor_c.js
  46. 91 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxtexteditor.js
  47. 1 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxtexteditor_c.js
  48. 5 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/calendar.js
  49. 0 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/contextmenu.js
  50. 352 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/edit_area.css
  51. 0 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/edit_area_full.js
  52. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/close.gif
  53. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/fullscreen.gif
  54. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/go_to_line.gif
  55. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/help.gif
  56. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/highlight.gif
  57. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/load.gif
  58. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/move.gif
  59. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/newdocument.gif
  60. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/opacity.png
  61. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/processing.gif
  62. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/redo.gif
  63. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/reset_highlight.gif
  64. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/save.gif
  65. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/save_as.gif
  66. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/search.gif
  67. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/smooth_selection.gif
  68. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/spacer.gif
  69. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/statusbar_resize.gif
  70. BIN
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/undo.gif
  71. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/de.js
  72. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/dk.js
  73. 46 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/en.js
  74. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/fr.js
  75. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/hr.js
  76. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/it.js
  77. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/ja.js
  78. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/nl.js
  79. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/pl.js
  80. 45 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/pt.js
  81. 46 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/zh_cn.js
  82. 69 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/basic.js
  83. 44 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/brainfuck.js
  84. 62 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/c.js
  85. 65 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/cpp.js
  86. 84 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/css.js
  87. 50 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/html.js
  88. 60 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/js.js
  89. 82 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/pas.js
  90. 75 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/php.js
  91. 144 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/python.js
  92. 52 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/vb.js
  93. 56 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/xml.js
  94. 27 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/for_fckeditor.js
  95. 16 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/for_form.js
  96. 5 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/for_stand_alone.js
  97. 248 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/for_tinymce.js
  98. 807 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/form.js
  99. 764 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/interface.js
  100. 527 0
      main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/iresizable.js

+ 54 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/_ajax_get_details_listing.php

@@ -0,0 +1,54 @@
+<div id="content">
+<table class="tableList" id="tableList" cellpadding="0" cellspacing="0" border="0">
+					<thead>
+						<tr>
+							<th width="5"><a href="#" class="check_all" id="tickAll" title="<?php echo TIP_SELECT_ALL; ?>" onclick="checkAll(this);">&nbsp;</a></th>
+							<th width="10" class="fileColumns">&nbsp;</th>
+							<th class="docName"><?php echo LBL_NAME; ?></th>
+							<th  width="70" class="fileColumns"><?php echo LBL_SIZE; ?></th>
+							<th class="fileColumns"><?php echo LBL_MODIFIED; ?></th>
+						</tr>
+					</thead>
+					<tbody id="fileList">
+						<?php
+							$count = 1;
+							$css = "";
+							//list all documents (files and folders) under this current folder, 
+							//<?php echo appendQueryString(appendQueryString(CONFIG_URL_FILEnIMAGE_MANAGER, "path=" . $file['path']), makeQueryString(array('path'))); 
+							foreach($fileList as $file)
+							{
+								$css = ($css == "" || $css == "even"?"odd":"even");
+								$strDisabled = ($file['is_writable']?"":" disabled");
+								$strClass = ($file['is_writable']?"left":" leftDisabled");
+								if($file['type'] == 'file')
+								{
+
+								?>
+								<tr class="<?php echo $css; ?>" id="row<?php echo $count; ?>"  >
+									<td align="center" id="tdz<?php echo $count; ?>"><span id="flag<?php echo $count; ?>" class="<?php echo $file['flag']; ?>">&nbsp;</span><input type="checkbox"  name="check[]" id="cb<?php echo $count; ?>" value="<?php echo $file['path']; ?>" <?php echo $strDisabled; ?> />
+										</td>
+									<td align="center" class="fileColumns" id="tdst<?php echo $count; ?>">&nbsp;<a id="a<?php echo $count; ?>" href="<?php echo $file['path']; ?>" target="_blank"><span class="<?php echo $file['cssClass']; ?>">&nbsp;</span></a></td>
+									<td class="<?php echo $strClass; ?> docName"  id="tdnd<?php echo $count; ?>"><?php echo $file['name']; ?></td>
+									<td class="docInfo" id="tdrd<?php echo $count; ?>"><?php echo transformFileSize($file['size']); ?></td>
+									<td class="docInfo" id="tdth<?php echo $count; ?>"><?php echo @date(DATE_TIME_FORMAT,$file['mtime']); ?></td>
+								</tr>
+								<?php
+								}else
+								{
+									?>
+									<tr class="<?php echo $css; ?>" id="row<?php echo $count; ?>" >
+										<td align="center" id="tdz<?php echo $count; ?>"><span id="flag<?php echo $count; ?>" class="<?php echo $file['flag']; ?>">&nbsp;</span><input type="checkbox" name="check[]" id="cb<?php echo $count; ?>" value="<?php echo $file['path']; ?>" <?php echo $strDisabled; ?>/>
+										</td>
+										<td  lign="center" class="fileColumns" id="tdst<?php echo $count; ?>">&nbsp;<a id="a<?php echo $count; ?>" href="<?php echo $file['path']; ?>" <?php echo $file['cssClass'] == 'filePicture'?'rel="ajaxPhotos"':''; ?>  ><span class="<?php echo ($file['file']||$file['subdir']?$file['cssClass']:"folderEmpty"); ?>">&nbsp;</span></a></td>
+										<td class="<?php echo $strClass; ?> docName" id="tdnd<?php echo $count; ?>"><?php echo $file['name']; ?></td>
+										<td class="docInfo" id="tdrd<?php echo $count; ?>">&nbsp;</td>
+										<td class="docInfo" id="tdth<?php echo $count; ?>"><?php echo @date(DATE_TIME_FORMAT,$file['mtime']); ?></td>
+									</tr>
+									<?php
+								}
+								$count++;
+							}
+						?>	
+					</tbody>
+				</table>
+</div>

+ 37 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/_ajax_get_thumbnail_listing.php

@@ -0,0 +1,37 @@
+<div id="content">
+<?php 
+
+		$count = 1;
+		$thumbnailBaseUrl = appendQueryString(CONFIG_URL_IMG_THUMBNAIL, makeQueryString(array('path')));
+		foreach($fileList as $file)
+		
+		{
+			?>
+			<dl class="thumbnailListing" id="dl<?php echo $count; ?>">
+				<dt id="dt<?php echo $count; ?>" class="<?php echo ($file['type'] == 'folder' && empty($file['file']) && empty($file['subdir'])?'folderEmpty':$file['cssClass']); ?>" class="<?php echo $file['cssClass']; ?>">
+				<?php
+					switch($file['cssClass'])
+					{
+						case 'filePicture':
+								echo '<a id="thumbUrl' . $count . '" rel="thumbPhotos" href="' . $file['path'] . '">';
+								echo '<img src="' . appendQueryString($thumbnailBaseUrl, 'path=' . $file['path']) . '" id="thumbImg' . $count . '"></a>' . "\n";
+								break;
+						case 'fileFlash':
+						case 'fileVideo':
+						case 'fileMusic':
+							break;
+						default:
+							echo '&nbsp;';
+					}
+				?>
+				
+				</dt>
+				<dd id="dd<?php echo $count; ?>" class="thumbnailListing_info"><span id="flag<?php echo $count; ?>" class="<?php echo $file['flag']; ?>">&nbsp;</span><input id="cb<?php echo $count; ?>" type="checkbox" name="check[]" <?php echo ($file['is_writable']?'':'disabled'); ?> class="radio" value="<?php echo $file['path']; ?>" />
+				<a <?php echo ($file['cssClass']== 'filePicture'?'rel="orgImg"':''); ?> href="<?php echo $file['path']; ?>" title="<?php echo $file['name']; ?>" id="a<?php echo $count; ?>"><?php echo shortenFileName($file['name']); ?></a></dd>
+				
+			</dl>
+			<?php
+			$count++;
+		}
+?>
+</div>

+ 15 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/_ajax_load_folders.php

@@ -0,0 +1,15 @@
+<?php
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+?>
+<select class="input inputSearch" name="search_folder" id="search_folder">
+	<?php 
+	
+					foreach(getFolderListing(CONFIG_SYS_ROOT_PATH) as $k=>$v)
+					{
+						?>
+      <option value="<?php echo $v; ?>" ><?php echo shortenFileName($k, 30); ?></option>
+      <?php 
+					}
+		
+				?>            	
+</select>

+ 74 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_create_folder.php

@@ -0,0 +1,74 @@
+<?php
+	/**
+	 * create a folder
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");	
+	@ob_start();
+	displayArray($_POST);
+	writeInfo(@ob_get_clean());	
+	echo "{";
+	$error = "";
+	$info = "";	
+/*	$_POST['new_folder'] = substr(md5(time()), 1, 5);
+	$_POST['currentFolderPath'] = "../../uploaded/";*/
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_NEWFOLDER)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(empty($_POST['new_folder']))
+	{
+		$error  =  ERR_FOLDER_NAME_EMPTY;
+	}elseif(!preg_match("/^[a-zA-Z0-9_\- ]+$/", $_POST['new_folder']))
+	{
+		$error  =  ERR_FOLDER_FORMAT;
+	}else if(empty($_POST['currentFolderPath']) || !isUnderRoot($_POST['currentFolderPath']))
+	{
+		$error = ERR_FOLDER_PATH_NOT_ALLOWED;
+	}
+	elseif(file_exists(addTrailingSlash($_POST['currentFolderPath']) . $_POST['new_folder']))
+	{
+		$error = ERR_FOLDER_EXISTS;
+	}else
+	{
+	include_once(CLASS_FILE);
+		$file = new file();
+		if($file->mkdir(addTrailingSlash($_POST['currentFolderPath']) . $_POST['new_folder'], 0775))
+		{
+					include_once(CLASS_MANAGER);
+					$manager = new manager(addTrailingSlash($_POST['currentFolderPath']) . $_POST['new_folder'], false);
+					$pathInfo = $manager->getFolderInfo(addTrailingSlash($_POST['currentFolderPath']) . $_POST['new_folder']);
+					foreach($pathInfo as $k=>$v)
+					{				
+						switch ($k)
+						{
+
+
+							case "ctime";								
+							case "mtime":
+							case "atime":
+								$v = date(DATE_TIME_FORMAT, $v);
+								break;
+							case 'name':
+								$info .= sprintf(", %s:'%s'", 'short_name', shortenFileName($v));
+								break;
+							case 'cssClass':
+								$v = 'folderEmpty';
+								break;
+						}							
+						$info .= sprintf(", %s:'%s'", $k, $v);
+					}
+		}else 
+		{
+			$error = ERR_FOLDER_CREATION_FAILED;
+		}
+		//$error = "For security reason, folder creation function has been disabled.";
+	}
+	echo "error:'" . $error . "'";
+	echo $info;
+	echo "}";
+?>

+ 77 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_delete_file.php

@@ -0,0 +1,77 @@
+<?php
+	/**
+	 * delete selected files
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	$error = "";
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_DELETE)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(!empty($_GET['delete']))
+	{//delete the selected file from context menu
+		if(!file_exists($_GET['delete']))
+		{
+			$error = ERR_FILE_NOT_AVAILABLE;
+		}
+		elseif(!isUnderRoot($_GET['delete']))
+		{
+			$error = ERR_FOLDER_PATH_NOT_ALLOWED;
+		}else
+		{
+				include_once(CLASS_FILE);
+				$file = new file();
+				if(is_dir($_GET['delete'])
+					 &&  isValidPattern(CONFIG_SYS_INC_DIR_PATTERN, getBaseName($_GET['delete'])) 
+					 && !isInvalidPattern(CONFIG_SYS_EXC_DIR_PATTERN, getBaseName($_GET['delete'])))
+					{
+						$file->delete(addTrailingSlash(backslashToSlash($_GET['delete'])));
+					}elseif(is_file($_GET['delete']) 
+					&& isValidPattern(CONFIG_SYS_INC_FILE_PATTERN, getBaseName($_GET['delete']))
+					&& !isInvalidPattern(CONFIG_SYS_EXC_FILE_PATTERN, getBaseName($_GET['delete']))
+					)
+					{
+						$file->delete(($_GET['delete']));
+					}			
+		}
+	}else 
+	{
+		if(!isset($_POST['selectedDoc']) || !is_array($_POST['selectedDoc']) || sizeof($_POST['selectedDoc']) < 1)
+		{
+			$error = ERR_NOT_FILE_SELECTED;
+		}
+		else 
+		{
+
+			include_once(CLASS_FILE);
+			$file = new file();
+			
+			foreach($_POST['selectedDoc'] as $doc)
+			{
+				if(file_exists($doc) && isUnderRoot($doc))
+				{
+					if(is_dir($doc)
+					 &&  isValidPattern(CONFIG_SYS_INC_DIR_PATTERN, $doc) 
+					 && !isInvalidPattern(CONFIG_SYS_EXC_DIR_PATTERN, $doc))
+					{
+						$file->delete(addTrailingSlash(backslashToSlash($doc)));
+					}elseif(is_file($doc) 
+					&& isValidPattern(CONFIG_SYS_INC_FILE_PATTERN, $doc)
+					&& !isInvalidPattern(CONFIG_SYS_EXC_FILE_PATTERN, $doc)
+					)
+					{
+						$file->delete($doc);
+					}					
+				}
+
+				
+			}
+		}		
+	}
+
+	echo "{error:'" . $error . "'}";
+?>

+ 32 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_download.php

@@ -0,0 +1,32 @@
+<?php
+	/**
+	 * delete selected files
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	if(!empty($_GET['path']) && file_exists($_GET['path']) && is_file($_GET['path']) && isUnderRoot($_GET['path']))
+	{
+			
+			$path = $_GET['path'];
+			//check if the file size
+			$fileSize = @filesize($path);
+			
+			if($fileSize > getMemoryLimit())
+			{//larger then the php memory limit, redirect to the file
+				
+				header('Location: ' . $path);
+				exit;				 
+			}else 
+			{//open it up and send out with php 
+				downloadFile($path);	
+				 			
+			}
+	}else 
+	{
+		die(ERR_DOWNLOAD_FILE_NOT_FOUND);
+	}
+?>

+ 116 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_editor_reset.php

@@ -0,0 +1,116 @@
+<?php
+	/**
+	 * reset the image
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");	
+	if(!isset($_POST['path']))
+	{
+		$_POST['path'] = "uploaded/Winter.jpg" .  "?" . makeQueryString(array('path'));
+		//for crop
+		$_POST['mode'] = "crop";
+		$_POST['x'] = 100;
+		$_POST['y'] = 100;
+		$imageInfo = @GetImageSize($_POST['path']);
+		$_POST['width'] = $imageInfo[0];
+		$_POST['height'] = $imageInfo[1];
+		
+	}
+	initSessionHistory($_POST['path']);
+	
+	echo "{";
+	$error = "";
+	$info = "";
+	
+	if(empty($_POST['path']))
+	{
+		$error  =  IMG_SAVE_EMPTY_PATH;
+	}elseif(!file_exists($_POST['path']))
+	{
+		$error  =  IMG_SAVE_NOT_EXISTS;
+	}else if(!isUnderRoot($_POST['path']))
+	{
+		$error = IMG_SAVE_PATH_DISALLOWED;
+	}
+	else
+	{
+		if(!empty($_POST['mode']))
+		{
+			
+			include_once(CLASS_IMAGE);
+			$image = new Image();
+			$image->loadImage($_POST['path']);
+			
+			switch($_POST['mode'])
+			{
+				case "resize":					
+					if(!$image->resize($_POST['width'], $_POST['height'], (!empty($_POST['constraint'])?true:false)))
+					{
+						$error = IMG_SAVE_RESIZE_FAILED;
+					}					
+					break;
+				case "crop":
+					if(!$image->cropToDimensions($_POST['x'], $_POST['y'], intval($_POST['x']) + intval($_POST['width']), intval($_POST['y']) + intval($_POST['height'])))
+					{
+						$error = IMG_SAVE_CROP_FAILED;
+					}
+					
+					break;
+				case "flip":
+					if(!$image->flip($_POST['flip_angle']))
+					{
+						$error = IMG_SAVE_FLIP_FAILED;
+					}
+					break;
+				case "rotate":
+					if(!$image->rotate(intval($_POST['angle'])))
+					{
+						$error = IMG_SAVE_ROTATE_FAILED;
+					}
+					break;
+				default:
+					$error = IMG_SAVE_UNKNOWN_MODE;
+			}
+			if(empty($error))
+			{
+				
+				$sessionNewPath = $session->getSessionDir() . uniqid(md5(time())) . "." . getFileExt($_POST['path']);
+				if(!@copy($_POST['path'], $sessionNewPath))
+				{
+					$error = IMG_SAVE_BACKUP_FAILED;
+				}else 
+				{
+					addSessionHistory($_POST['path'], $sessionNewPath);
+					if($image->saveImage($_POST['path']))
+					{						
+						$imageInfo = $image->getFinalImageInfo();	
+						$info .= ",width:" . $imageInfo['width'] . "\n";
+						$info .= ",height:" . $imageInfo['height'] . "\n";
+						$info .= ",size:'" . transformFileSize($imageInfo['size']) . "'\n";
+					}else 
+					{
+						$error = IMG_SAVE_FAILED;
+					}			
+				}				
+			}else 
+			{
+				//$image->DestroyImages();
+			}
+		}else 
+		{
+			$error = IMG_SAVE_UNKNOWN_MODE;
+		}
+	}
+	
+	echo "error:'" . $error . "'\n";
+	if(isset($image) && is_object($image))
+	{
+		$image->DestroyImages();
+	}
+	echo $info;
+	echo ",history:" . sizeof($_SESSION[$_POST['path']]) . "\n";
+	echo "}";
+?>

+ 34 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_file_copy.php

@@ -0,0 +1,34 @@
+<?php
+	/**
+	 * copy file
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	$error = "";
+	$info = '';
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_COPY)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(!isset($_POST['selectedDoc']) || !is_array($_POST['selectedDoc']) || sizeof($_POST['selectedDoc']) < 1)
+	{
+		$error = ERR_NOT_DOC_SELECTED_FOR_COPY;
+	}
+	elseif(empty($_POST['currentFolderPath']) || !isUnderRoot($_POST['currentFolderPath']))
+	{
+		$error = ERR_FOLDER_PATH_NOT_ALLOWED;
+	}else 
+	{		
+		require_once(CLASS_SESSION_ACTION);
+		$sessionAction = new SessionAction();
+		$sessionAction->setAction($_POST['action_value']);
+		$sessionAction->setFolder($_POST['currentFolderPath']);
+		$sessionAction->set($_POST['selectedDoc']);
+		$info = ',num:' . sizeof($_POST['selectedDoc']);
+	}
+	echo "{error:'" . $error .  "'\n" . $info . "}";
+?>

+ 33 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_file_cut.php

@@ -0,0 +1,33 @@
+<?php
+	/**
+	 * cut file
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	$error = "";
+	$info = '';
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_CUT)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(!isset($_POST['selectedDoc']) || !is_array($_POST['selectedDoc']) || sizeof($_POST['selectedDoc']) < 1)
+	{
+		$error = ERR_NOT_DOC_SELECTED_FOR_CUT;
+	}
+	elseif(empty($_POST['currentFolderPath']) || !isUnderRoot($_POST['currentFolderPath']))
+	{
+		$error = ERR_FOLDER_PATH_NOT_ALLOWED;
+	}else 
+	{		
+		require_once(CLASS_SESSION_ACTION);
+		$sessionAction = new SessionAction();
+		$sessionAction->setAction($_POST['action_value']);
+		$sessionAction->setFolder($_POST['currentFolderPath']);
+		$sessionAction->set($_POST['selectedDoc']);
+		$info = ',num:' . sizeof($_POST['selectedDoc']);
+	}
+	echo "{error:'" . $error .  "'\n" . $info . "}";
+?>

+ 138 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_file_paste.php

@@ -0,0 +1,138 @@
+<?
+		include_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");		
+		$error = '';
+		$fileMoved = array();
+		$unmovedDocDueToSamePath = array();
+	if(CONFIG_SYS_VIEW_ONLY || (!CONFIG_OPTIONS_CUT && !CONFIG_OPTIONS_COPY))
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(empty($_GET['current_folder_path']))
+		{
+			$error = ERR_NOT_DEST_FOLDER_SPECIFIED;
+		}elseif(!file_exists($_GET['current_folder_path']) || !is_dir($_GET['current_folder_path']))
+		{
+			$error = ERR_DEST_FOLDER_NOT_FOUND;
+		}elseif(!isUnderRoot($_GET['current_folder_path']))
+		{
+			$error = ERR_DEST_FOLDER_NOT_ALLOWED;
+		}else 
+		{
+			
+			include_once(CLASS_MANAGER);
+			include_once(CLASS_SESSION_ACTION);
+			$sessionAction = new SessionAction();
+			include_once(DIR_AJAX_INC . "class.manager.php");	
+			$manager = new manager();
+			$manager->setSessionAction($sessionAction);
+			$selectedDocuments = $sessionAction->get();
+			
+			$destFolderPath = addTrailingSlash(backslashToSlash($_GET['current_folder_path']));
+			
+			
+			if(sizeof($selectedDocuments))
+			{
+				//get all files within the destination folder
+				$allDocs = array();
+				if(($fh = @opendir($_GET['current_folder_path'])))
+				{
+					while(($file = readdir($fh)) && $file != '.' && $file != '..')
+					{
+						$allDocs[] = getRealPath($destFolderPath . $file);
+					}
+				}
+
+				include_once(CLASS_FILE);
+				$file = new file();
+				//check if all files are allowed to cut or copy
+
+				foreach($selectedDocuments as $doc)
+				{
+					if(file_exists($doc) && isUnderRoot($doc) )
+					{
+						
+						if( array_search(getRealPath($doc), $allDocs) === false || CONFIG_OVERWRITTEN)
+						{
+							if(CONFIG_OVERWRITTEN)
+							{
+								$file->delete($doc);
+							}
+							if($file->copyTo($doc, $_GET['current_folder_path']))
+							{
+								
+								$finalPath = $destFolderPath . basename($doc);
+								$objFile = new file($finalPath);
+								$tem = $objFile->getFileInfo();
+								$obj = new manager($finalPath, false);			
+													
+								$fileType = $obj->getFileType($finalPath, (is_dir($finalPath)?true:false));
+								
+								foreach($fileType as $k=>$v)
+								{
+									$tem[$k] = $v;
+								}
+								
+/*								foreach ($folderInfo as $k=>$v)
+								{
+									$tem['i_' . $k] = $v;
+								}
+								if($folderInfo['type'] == 'folder' && empty($folderInfo['subdir']) &&  empty($folderInfo['file']))
+								{
+									$tem['cssClass'] = 'folderEmpty';
+								}*/
+								
+								$tem['final_path'] = $finalPath;
+								$tem['path'] = backslashToSlash($finalPath);		
+								$tem['type'] = (is_dir($finalPath)?'folder':'file');
+								$tem['size'] = @transformFileSize($tem['size']);
+								$tem['ctime'] = date(DATE_TIME_FORMAT, $tem['ctime']);
+								$tem['mtime'] = date(DATE_TIME_FORMAT, $tem['mtime']);
+								$tem['flag'] = 'noFlag';
+								$tem['url'] = getFileUrl($doc);
+		
+								$manager = null;
+								if($sessionAction->getAction() == "cut")
+								{
+									$file->delete($doc);
+								}
+								$fileMoved[sizeof($fileMoved)] = $tem;
+								$tem = null;
+							}							
+						}else 
+						{
+							$unmovedDocDueToSamePath[] = $doc;
+						}
+							
+					}
+				}
+
+				$sessionAction->set(array());
+			}
+			if(sizeof($unmovedDocDueToSamePath) == sizeof($selectedDocuments))
+			{
+				$error = ERR_DEST_FOLDER_NOT_ALLOWED;
+			}elseif(sizeof($unmovedDocDueToSamePath)) 
+			{
+				foreach($unmovedDocDueToSamePath as $v)
+				{
+					$error .=  sprintf(ERR_UNABLE_TO_MOVE_TO_SAME_DEST, $v) . "\r\n";
+				}
+			}
+		}
+		
+		echo "{'error':'" . $error . "', 'unmoved_files':" . sizeof($unmovedDocDueToSamePath) . ", 'files':{";
+		foreach($fileMoved as  $i=>$file)
+		{
+			
+			echo ($i>0?', ':' ') . $i . ": { ";
+			$j = 0;
+			foreach($file as $k=>$v)
+			{
+				echo ($j++ > 0? ", ":'') . "'" . $k . "':'" . $v . "'"; 
+				
+			}
+			echo "} ";
+		}
+		echo "} }";
+	
+?>

+ 86 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_file_upload.php

@@ -0,0 +1,86 @@
+<?php
+	/**
+	 * processing the uploaded files
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */	
+	sleep(3);
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	echo "{";
+	$error = "";
+	$info = "";
+	
+	include_once(CLASS_UPLOAD);
+	$upload = new Upload();
+								
+	$upload->setInvalidFileExt(explode(",", CONFIG_UPLOAD_INVALID_EXTS));
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_UPLOAD)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(empty($_GET['folder']) || !isUnderRoot($_GET['folder']))
+	{
+		$error = ERR_FOLDER_PATH_NOT_ALLOWED;
+	}else	if(!$upload->isFileUploaded('file'))
+	{
+		$error = ERR_FILE_NOT_UPLOADED;
+	}else if(!$upload->moveUploadedFile($_GET['folder']))
+	{
+		$error = ERR_FILE_MOVE_FAILED;
+	}	
+	elseif(!$upload->isPermittedFileExt(explode(",", CONFIG_UPLOAD_VALID_EXTS)))
+	{		
+		$error = ERR_FILE_TYPE_NOT_ALLOWED;
+	}elseif(defined('CONFIG_UPLOAD_MAXSIZE') && CONFIG_UPLOAD_MAXSIZE && $upload->isSizeTooBig(CONFIG_UPLOAD_MAXSIZE))
+	{		
+		 $error = sprintf(ERROR_FILE_TOO_BID, transformFileSize(CONFIG_UPLOAD_MAXSIZE));
+	}else
+	{
+							include_once(CLASS_FILE);
+							$path = $upload->getFilePath();
+							$obj = new file($path);
+							$tem = $obj->getFileInfo();							
+							if(sizeof($tem))
+							{	
+								include_once(CLASS_MANAGER);
+							
+								$manager = new manager($upload->getFilePath(), false);			
+															
+								$fileType = $manager->getFileType($upload->getFileName());
+
+								foreach($fileType as $k=>$v)
+								{
+									$tem[$k] = $v;
+								}
+								
+								$tem['path'] = backslashToSlash($path);		
+								$tem['type'] = "file";
+								$tem['size'] = transformFileSize($tem['size']);
+								$tem['ctime'] = date(DATE_TIME_FORMAT, $tem['ctime']);
+								$tem['mtime'] = date(DATE_TIME_FORMAT, $tem['mtime']);
+								$tem['short_name'] = shortenFileName($tem['name']);						
+								$tem['flag'] = 'noFlag';
+								$obj->close();
+								foreach($tem as $k=>$v)
+								{
+										$info .= sprintf(", %s:'%s'", $k, $v);									
+								}
+
+								$info .= sprintf(", url:'%s'",  getFileUrl($path));
+								$info .= sprintf(", tipedit:'%s'",  TIP_DOC_RENAME);		
+
+																				
+							}else 
+							{
+								$error = ERR_FILE_NOT_AVAILABLE;
+							}
+
+
+	}
+	echo "error:'" . $error . "'";
+	echo $info;
+	echo "}";
+	
+?>

+ 137 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_get_file_listing.php

@@ -0,0 +1,137 @@
+<?php 
+
+		/**
+	 * the php script used to get the list of file or folders under a specific folder
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+
+	if(!isset($manager))
+	{
+		/**
+		 *  this is part of  script for processing file paste 
+		 */
+		//$_GET = $_POST;
+		include_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+		include_once(CLASS_PAGINATION);
+		$pagination = new pagination(false);
+		if(!empty($_GET['search']))
+		{
+			include_once(CLASS_SEARCH);
+			
+			$search  = new Search($_GET['search_folder']);
+			$search->addSearchKeyword('recursive', @$_GET['search_recursively']);
+			$search->addSearchKeyword('mtime_from', @$_GET['search_mtime_from']);
+			$search->addSearchKeyword('mtime_to', @$_GET['search_mtime_to']);
+			$search->addSearchKeyword('size_from', @$_GET['search_size_from']);
+			$search->addSearchKeyword('size_to', @$_GET['search_size_to']);
+			$search->addSearchKeyword('recursive', @$_GET['search_recursively']);
+			$search->addSearchKeyword('name', @$_GET['search_name']);
+			$search->doSearch();
+			$fileList = $search->getFoundFiles();
+			$folderInfo = $search->getRootFolderInfo();			
+			
+		}else 
+		{
+			include_once(CLASS_MANAGER);
+			include_once(CLASS_SESSION_ACTION);
+			$sessionAction = new SessionAction();
+			include_once(DIR_AJAX_INC . "class.manager.php");
+		
+			$manager = new manager();
+			$manager->setSessionAction($sessionAction);
+		
+			$fileList = $manager->getFileList();
+			$folderInfo = $manager->getFolderInfo();	
+						
+		}
+		$pagination->setUrl(CONFIG_URL_FILEnIMAGE_MANAGER);	
+
+	}else 
+	{
+		include_once(CLASS_PAGINATION);
+		$pagination = new pagination(false);			
+	}
+
+		
+		$pagination->setTotal(sizeof($fileList));
+		$pagination->setFirstText(PAGINATION_FIRST);
+		$pagination->setPreviousText(PAGINATION_PREVIOUS);
+		$pagination->setNextText(PAGINATION_NEXT);
+		$pagination->setLastText(PAGINATION_LAST);
+		$pagination->setLimit(!empty($_GET['limit'])?intval($_GET['limit']):CONFIG_DEFAULT_PAGINATION_LIMIT);
+		echo $pagination->getPaginationHTML();
+		echo "<script type=\"text/javascript\">\n";
+		
+        echo "parentFolder = {path:'" . getParentFolderPath($folderInfo['path']). "'};\n"; 
+		echo 'currentFolder ={'; 
+		$count =1;
+		foreach($folderInfo as $k=>$v)
+		{
+			echo ($count++ == 1?'':',') . "'" . $k . "':'" . ($k=='ctime'|| $k=='mtime'?date(DATE_TIME_FORMAT, $v):$v)  . "'";
+
+		}
+		echo "};\n";
+		$fileList = array_slice($fileList, $pagination->getPageOffset(), $pagination->getLimit());
+		echo 'numRows = ' . sizeof($fileList) . ";\n";
+		echo "files = {\n";
+		$count = 1;
+		
+		
+		foreach($fileList as $file)
+		{
+			echo (($count > 1)?",":'').$count++ . ":{";
+			$j = 1;
+			foreach($file as $k=>$v)
+			{
+				
+				if($k  == 'ctime' || $k == 'mtime')
+				{
+					$v = @date(DATE_TIME_FORMAT, $v);
+				}	
+				if($k == 'size')
+				{
+					$v = transformFileSize($v);
+				}
+				echo (($j++ > 1)?",":'') . "'" . $k . "':'" . $v . "'";
+			}
+			echo (($j++ > 1)?",":'') . "'url':'" . getFileUrl($file['path']) . "'";
+			echo "}\n";				
+		}
+		echo  "};</script>\n";
+	if(!empty($_GET['view']))
+	{
+		switch($_GET['view'])
+		{
+			case 'detail':
+			case 'thumbnail':
+			case 'text':	
+				$view = $_GET['view'];
+				break;
+			default:
+				$view = CONFIG_DEFAULT_VIEW;
+		}
+	}else 
+	{
+		$view = CONFIG_DEFAULT_VIEW;
+	}	
+	switch($view)
+	{
+		case 'text':
+			//list file name only
+			include_once(DIR_AJAX_ROOT . '_ajax_get_text_listing.php');
+			break;
+		case 'thumbnail':
+			//list file with thumbnail
+			include_once(DIR_AJAX_ROOT . '_ajax_get_thumbnail_listing.php');
+			break;
+		case 'detail':
+		default:
+			include_once(DIR_AJAX_ROOT . '_ajax_get_details_listing.php');
+	}
+
+	
+
+?>

+ 13 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_get_folder_listing.php

@@ -0,0 +1,13 @@
+<?php
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	echo '{';
+	$count = 1;
+	foreach(getFolderListing(CONFIG_SYS_ROOT_PATH) as $k=>$v)
+	{
+		
+
+		echo (($count > 1)?', ':''). "'" . $v . "':'" . $k . "'"; 
+		$count++;
+	}
+	echo "}";
+?>

+ 208 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_image_editor.php

@@ -0,0 +1,208 @@
+<?php
+		/**
+	 * Ajax image editor platform
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_EDITABLE)
+	{
+		die(SYS_DISABLED);
+	}
+		$session->gc();
+		$_GET['path'] = empty($_GET['path'])?CONFIG_SYS_ROOT_PATH . "ajax_image_editor_demo.jpg":$_GET['path'];
+		if(!empty($_GET['path']) && file_exists($_GET['path']) && is_file($_GET['path']) && isUnderRoot($_GET['path']))
+		{
+				$path = $_GET['path'];
+		}else 
+		{
+			die(IMG_GEN_IMG_NOT_EXISTS);
+		}
+		require_once(CLASS_HISTORY);
+		$history = new History($path, $session);
+		if(CONFIG_SYS_DEMO_ENABLE)
+		{
+			$sessionImageInfo = $history->getLastestRestorable();
+			$originalSessionImageInfo = $history->getOriginalImage();
+			if(sizeof($originalSessionImageInfo))
+			{
+				$path = backslashToSlash($session->getSessionDir() . $originalSessionImageInfo['info']['name']);
+			}
+		}
+		require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "class.image.php");
+		$image = new Image();
+		
+		$imageInfo = $image->getImageInfo($path);
+
+	?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="author" content="Logan Cai" />
+<meta name="website" content="http://www.phpletter.com" />
+<script type="text/javascript" src="jscripts/ajaximageeditor_c.js"></script>
+<!--
+<script type="text/javascript" src="jscripts/jquery.js"></script>
+<script type="text/javascript" src="jscripts/form.js"></script>
+<script type="text/javascript" src="jscripts/select.js"></script>
+<script type="text/javascript" src="jscripts/jqModal.js"></script>
+<script type="text/javascript" src="jscripts/rotate.js"></script>
+<script type="text/javascript" src="jscripts/interface.js"></script>
+
+-->
+<script type="text/javascript" src="jscripts/ajaximageeditor.js"></script>
+
+
+
+
+
+
+<script type="text/javascript">
+	var imageHistory = false;
+	var currentFolder =  '<?php echo removeTrailingSlash(backslashToSlash(dirname($path))); ?>';
+	var warningLostChanges = '<?php echo IMG_WARNING_LOST_CHANAGES; ?>';
+	var warningReset = '<?php echo IMG_WARNING_REST; ?>';
+	var warningResetEmpty = '<?php echo IMG_WARNING_EMPTY_RESET; ?>';
+	var warningEditorClose = '<?php echo IMG_WARING_WIN_CLOSE; ?>';
+	var warningUndoImage = '<?php echo IMG_WARNING_UNDO; ?>';
+	var warningFlipHorizotal = '<?php echo IMG_WARING_FLIP_H; ?>';
+	var warningFlipVertical = '<?php echo IMG_WARING_FLIP_V; ?>';
+	var numSessionHistory = <?php echo $history->getNumRestorable(); ?>;
+	var noChangeMadeBeforeSave = '<?php echo IMG_WARNING_NO_CHANGE_BEFORE_SAVE; ?>';
+	var warningInvalidNewName = '<?php echo IMG_SAVE_AS_ERR_NAME_INVALID; ?>';
+	var wordCloseWindow = '<?php echo LBL_ACTION_CLOSE; ?>';
+	var warningNoFolderSelected = '<?php echo IMG_SAVE_AS_NOT_FOLDER_SELECTED; ?>';
+	var urlGetFolderList = '<?php echo appendQueryString(CONFIG_URL_GET_FOLDER_LIST, makeQueryString(array('path'))); ?>';
+	$(document).ready(
+		function()
+		{
+			$('#windowSaveAs').jqm();
+			$('#image_mode').val('');
+			$('#angle').val(0);
+			$(getImageElement()).clone().appendTo("#hiddenImage");
+			changeMode();
+			initDisabledButtons(true);
+		}
+	);
+	
+</script>
+<link href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/ajaximageeditor.css" type="text/css" rel="stylesheet" />
+<link href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/jqModal.css" type="text/css" rel="stylesheet" />
+<title>Ajax Image Editor</title>
+</head>
+<body>
+<?php
+	//displayArray($_SESSION);
+	 
+?>
+<div id="controls">
+	<fieldset id="modes">
+		<legend>Modes</legend>
+		<form name="formAction" id="formAction" method="post" action="<?php echo appendQueryString(CONFIG_URL_IMAGE_UNDO, makeQueryString(array('path'))); ?>">
+			<input type="hidden" name="file_path" id="file_path" value="<?php echo $_GET['path']; ?>" />
+			
+			<p><label><?php echo IMG_MODE_RESIZE; ?></label> <input type="radio" name="mode" value="resize" class="input" checked="checked"  onclick="return changeMode();"/>
+			<label><?php echo IMG_MODE_CROP; ?></label> <input type="radio" name="mode" value="crop" class="input" onclick="return changeMode();" />
+			<label><?php echo IMG_MODE_ROTATE; ?></label> <input type="radio" name="mode" value="rotate" class="input" onclick="return changeMode();" />
+			<label><?php echo IMG_MODE_FLIP; ?></label> <input type="radio" name="mode" value="flip" class="input" onclick="return changeMode();" />
+			<label><?php echo IMG_CHECKBOX_CONSTRAINT; ?></label> <input type="checkbox" name="constraint" id="constraint" value="1" class="input" onclick="return toggleConstraint();" />
+			<!--			<label>Watermark:</label> <input type="radio" name="mode" value="watermark" class="input" onclick="return false;" />-->
+			
+			<button id="actionRotateLeft" class="disabledButton" onclick="return leftRotate();" disabled><?php echo IMG_BTN_ROTATE_LEFT; ?></button>
+			<button id="actionRotateRight" class="disabledButton" onclick="return rightRotate();" disabled><?php echo IMG_BTN_ROTATE_RIGHT; ?></button>
+			<button id="actionFlipH" class="disabledButton" onclick="return flipHorizontal();" disabled><?php echo IMG_BTN_FLIP_H; ?></button>
+			<button id="actionFlipV" class="disabledButton" onclick="return flipVertical();" disabled><?php echo IMG_BTN_FLIP_V; ?></button>			
+			<button id="actionReset" class="button" onclick="return resetEditor();"><?php echo IMG_BTN_RESET; ?></button>
+			<button id="actionUndo" class="button" onclick="return undoImage();"><?php echo IMG_BTN_UNDO; ?></button>
+			<button id="actionSave" class="button" onclick="return saveImage();"><?php echo IMG_BTN_SAVE; ?></button>
+      <button id="actionSaveAs" class="button" onclick="return saveAsImagePre();"><?php echo IMG_BTN_SAVE_AS; ?></button>
+			<button id="actionClose" class="button" onclick="return editorClose();"><?php echo IMG_BTN_CLOSE; ?></button></p>
+		</form>
+	</fieldset>
+	<fieldset id="imageInfo">
+		<legend id="imageInfoLegend"><?php echo IMG_INFO; ?></legend>
+		<form name="formImageInfo" action="<?php echo appendQueryString(CONFIG_URL_IMAGE_SAVE, makeQueryString(array('path'))); ?>" method="post" id="formImageInfo">
+			<p><input type="hidden" name="mode" id="image_mode" value="" />
+      <input type="hidden" name="new_name" id="hidden_new_name" value="" />
+      <input type="hidden" name="save_to" id="hidden_save_to" value="" />
+			<input type="hidden" name="path" id="path" value="<?php echo $_GET['path']; ?>"  />
+			<input type="hidden" name="flip_angle" id="flip_angle" value="" />
+			<label><?php echo IMG_LBL_WIDTH; ?></label> <input type="text" name="width" id="width" value="" class="input imageInput"  />
+			<label><?php echo IMG_LBL_HEIGHT; ?></label> <input type="text" name="height" id="height" value="" class="input imageInput" />
+			<label><?php echo IMG_LBL_X; ?></label> <input type="text" name="x" id="x" value="" class="input imageInput"/>
+			<label><?php echo IMG_LBL_Y; ?></label> <input type="text" name="y" id="y" value="" class="input imageInput"/>
+<!--			<b>Percentage:</b> <input type="text" name="percentage" id="percentage" value="" class="input imageInput"/>-->
+			<label><?php echo IMG_LBL_RATIO; ?></label> <input type="text" name="ratio" id="ratio" value="" class="input imageInput"/>
+			<label><?php echo IMG_LBL_ANGLE; ?></label> <input type="text" name="angle" id="angle" value="" class="input imageInput" />
+			
+			</p>
+		</form>
+	</fieldset>
+</div>
+<div id="imageArea">
+    <div id="imageContainer">
+    	<img src="<?php echo $path; ?>" name="<?php echo basename($path); ?>" width="<?php echo $imageInfo['width']; ?>" height="<?php echo $imageInfo['height']; ?>" />
+    </div>
+    <div id="resizeMe">
+    	<div id="resizeSE"></div>
+    	<div id="resizeE"></div>
+    	<div id="resizeNE"></div>
+    	<div id="resizeN"></div>
+    	<div id="resizeNW"></div>
+    	<div id="resizeW"></div>
+    	<div id="resizeSW"></div>
+    	<div id="resizeS"></div>
+		<img id="loading" style="display:none;" src="theme/<?php echo CONFIG_THEME_NAME; ?>/images/ajaxLoading.gif" />
+    </div>
+</div>
+    <div id="hiddenImage">
+    </div>
+		<div id="windowSaveAs" class="jqmWindow" style="display:none">
+    	<a href="#" class="jqmClose" id="windowSaveClose"><?php echo LBL_ACTION_CLOSE; ?></a>
+      <form id="formSaveAs" name="formSaveAs" action="" method="post">
+    	<table class="tableForm" cellpadding="0" cellspacing="0">
+      	<thead>
+        	<tr>
+          	<th colspan="2"><?php echo IMG_LBL_SAVE_AS; ?></th>
+          </tr>
+        </thead>
+        <tbody>
+        	<tr>
+          	<th>
+            	<label><?php echo IMG_LBL_NEW_NAME; ?></label>
+            </th>
+            <td>
+            	<input type="text" id="new_name" class="input" name="new_name" value="" />&nbsp;.<?php echo getFileExt($path); ?>
+            </td>
+          </tr>
+          <tr>
+          	<th>
+            	<label><?php echo IMG_LBL_SAVE_TO; ?></label>
+            </th>
+            <td>
+            	<select class="input" name="save_to" id="save_to"></select>
+            </td>
+          </tr>
+          <tr>
+          	<th>&nbsp;
+            </th>
+            <td>
+            <span class="comments">*</span>
+            <?php echo IMG_NEW_NAME_COMMENTS; ?>
+            </td>
+          </tr>
+        </tbody>
+        <tfoot>
+        	<tr>
+        	<th>&nbsp;</th>
+          <td><input type="button" class="button" value="<?php echo IMG_BTN_SAVE_AS; ?>" onclick="return saveAsImage();" /></td>
+          </tr>
+        </tfoot>
+      </table>
+      </form>
+    </div>
+</body>
+</html>

+ 194 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_image_save.php

@@ -0,0 +1,194 @@
+<?php
+	/**
+	 * image save function
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");	
+	
+
+	$error = "";
+	$info = "";
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_EDITABLE)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(empty($_POST['path']))
+	{
+		$error  =  IMG_SAVE_EMPTY_PATH;
+	}elseif(!file_exists($_POST['path']))
+	{		
+		$error  =  IMG_SAVE_NOT_EXISTS;
+	}elseif(!isUnderRoot($_POST['path']))
+	{
+		$error = IMG_SAVE_PATH_DISALLOWED;
+	}elseif(($sessionDir = $session->getSessionDir()) == '')
+	{
+		$error = SESSION_PERSONAL_DIR_NOT_FOUND;
+	}
+	else
+	{	
+		require_once(CLASS_HISTORY);
+		$history = new History($_POST['path'], $session);
+		if(!empty($_POST['mode']))
+		{
+			//get the original image which is the lastest session image if any when the system is in demo
+			$lastestSessionImageInfo = $history->getLastestRestorable();
+			if(sizeof($lastestSessionImageInfo) && CONFIG_SYS_DEMO_ENABLE)
+			{				
+				$originalSessionImageInfo = $history->getOriginalImage();
+				if(sizeof($originalSessionImageInfo))
+				{					
+					$originalImage = $sessionDir . $originalSessionImageInfo['info']['name'];
+				}				
+			}
+			if(empty($originalImage))
+			{
+				$originalImage = $_POST['path'];
+			}
+			
+			include_once(CLASS_IMAGE);
+			$image = new Image();
+			if($image->loadImage($originalImage))
+			{				
+				
+				switch($_POST['mode'])
+				{
+					case "resize":					
+						if(!$image->resize($_POST['width'], $_POST['height'], (!empty($_POST['constraint'])?true:false)))
+						{
+							$error = IMG_SAVE_RESIZE_FAILED;
+						}					
+						break;
+					case "crop":	
+						if(!$image->crop($_POST['x'], $_POST['y'], $_POST['width'], $_POST['height']))
+						{
+							$error = IMG_SAVE_CROP_FAILED;
+						}
+						break;
+					case "flip":
+						if(!$image->flip($_POST['flip_angle']))
+						{
+							$error = IMG_SAVE_FLIP_FAILED;
+						}
+						break;
+					case "rotate":
+						
+						if(!$image->rotate(intval($_POST['angle'])))
+						{
+							$error = IMG_SAVE_ROTATE_FAILED;
+						}
+						
+						break;
+					default:
+						$error = IMG_SAVE_UNKNOWN_MODE;
+				}
+				
+				
+				if(empty($error))
+				{					
+					$sessionNewPath = $sessionDir  . uniqid(md5(time())) . "." . getFileExt($_POST['path']);					
+					if(!@copy($originalImage, $sessionNewPath))
+					{//keep a copy under the session folder
+						$error = IMG_SAVE_BACKUP_FAILED;						
+					}else 
+					{
+						
+						$isSaveAsRequest = (!empty($_POST['new_name']) && !empty($_POST['save_to'])?true:false);
+						//save the modified image
+						$sessionImageInfo = array('name'=>basename($sessionNewPath), 'restorable'=>1);
+						$history->add($sessionImageInfo);
+						if(CONFIG_SYS_DEMO_ENABLE)
+						{//demo only
+							if(isset($originalSessionImageInfo) && sizeof($originalSessionImageInfo))
+							{
+								$imagePath = $sessionDir . $originalSessionImageInfo['info']['name'];
+							}else 
+							{	
+								$imagePath = $sessionDir  . uniqid(md5(time())) . "." . getFileExt($_POST['path']);
+							}
+						}else 
+						{	
+							if($isSaveAsRequest)
+							{//save as request
+								//check save to folder if exists
+								$imagePath = addTrailingSlash(backslashToSlash($_POST['save_to'])) . $_POST['new_name'] . "." . getFileExt($_POST['path']); 
+								if(!file_exists($_POST['save_to']) || !is_dir($_POST['save_to']))
+								{
+									$error = IMG_SAVE_AS_FOLDER_NOT_FOUND;
+								}elseif(file_exists($imagePath)) 
+								{
+									$error = IMG_SAVE_AS_NEW_IMAGE_EXISTS;
+								}elseif(!preg_match("/^[a-zA-Z0-9_\- ]+$/", $_POST['new_name']))
+								{
+									$error = IMG_SAVE_AS_ERR_NAME_INVALID;
+								}
+								
+							}else 
+							{//save request
+								$imagePath = $originalImage;	
+							}
+												
+						}
+
+						if($image->saveImage($imagePath))
+						{		
+									
+							if(CONFIG_SYS_DEMO_ENABLE)
+							{
+								if(!isset($originalSessionImageInfo) || !sizeof($originalSessionImageInfo))
+								{//keep this original image information on session for future reference if demo only	
+									$originalSessionImageInfo = array('name'=>basename($imagePath), 'restorable'=>0, 'is_original'=>1);
+									$history->add($originalSessionImageInfo);
+								}
+							}
+							$imageInfo = $image->getFinalImageInfo();								
+						}else 
+						{
+							$error = IMG_SAVE_FAILED;
+							
+						}							
+						if(isset($imageInfo))
+						{
+								$info .= ",width:" . $imageInfo['width'] . "";
+								$info .= ",height:" . $imageInfo['height'] . "";
+								$info .= ",size:'" . transformFileSize($imageInfo['size']) . "'";
+								if($isSaveAsRequest)
+								{
+									$info .= ",save_as:'1'";
+								}else 
+								{
+									$info .= ",save_as:'0'";
+								}
+								$info .= ",folder_path:'" . dirname($imagePath) . "'";
+								$info .= ",path:'" . backslashToSlash($imagePath) . "'";	
+													
+						}				
+			
+					}				
+								
+				}			
+			}else 
+			{
+				$error = IMG_SAVE_IMG_OPEN_FAILED;
+			}		
+
+		}else 
+		{
+			$error = IMG_SAVE_UNKNOWN_MODE;
+		}
+	}
+	echo "{";	
+	echo "error:'" . $error . "'";
+	if(isset($image) && is_object($image))
+	{
+		$image->DestroyImages();
+	}
+	echo $info;
+	echo ",history:" . (isset($history) && is_object($history)?($history->getNumRestorable()):0)  . "";
+	echo "}";
+	
+	
+?>

+ 33 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_image_thumbnail.php

@@ -0,0 +1,33 @@
+<?php
+	/**
+	 * ajax preview
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+	include_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");	
+	if(!empty($_GET['path']) && file_exists($_GET['path']) && is_file($_GET['path']))
+	{
+		include_once(CLASS_IMAGE);
+		$image = new Image(true);
+		if($image->loadImage($_GET['path']))
+		{
+			if($image->resize(CONFIG_IMG_THUMBNAIL_MAX_X, CONFIG_IMG_THUMBNAIL_MAX_Y, true, true))
+			{
+				$image->showImage();
+			}else 
+			{
+				echo PREVIEW_NOT_PREVIEW . ".";	
+			}
+		}else 
+		{
+			echo PREVIEW_NOT_PREVIEW . "..";			
+		}
+
+			
+	}else 
+	{
+		echo PREVIEW_NOT_PREVIEW . "...";
+	}
+

+ 94 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_image_undo.php

@@ -0,0 +1,94 @@
+<?php
+	/**
+	 * ajax image undo function
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");	
+	require_once(CLASS_HISTORY);
+	$history = new History($_POST['file_path'], $session);
+	$lastestSessionImageInfo = $history->getLastestRestorable();
+	echo "{";
+	$error = "";
+	$info = "";
+	if(CONFIG_SYS_VIEW_ONLY)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(empty($_POST['file_path']))
+	{
+		$error  =  IMG_SAVE_EMPTY_PATH;
+	}elseif(!file_exists($_POST['file_path']))
+	{
+		$error  =  IMG_SAVE_NOT_EXISTS;
+	}elseif(!isUnderRoot($_POST['file_path']))
+	{
+		$error = IMG_SAVE_PATH_DISALLOWED;
+	}else if(!sizeof($lastestSessionImageInfo))
+	{
+		$error = IMG_UNDO_NO_HISTORY_AVAIALBE;
+	}
+	else
+	{		
+			//get the original image which is the lastest session image if any when the system is in demo
+			$sessionImage = $session->getSessionDir() . $lastestSessionImageInfo['name'];
+			$originalSessionImageInfo = $history->getOriginalImage();
+			if(CONFIG_SYS_DEMO_ENABLE && sizeof($originalSessionImageInfo))
+			{
+				$originalImage = $session->getSessionDir() . $originalSessionImageInfo['info']['name'];				
+			}else 
+			{
+				$originalImage = $_POST['file_path'];
+			}		
+			 
+				include_once(CLASS_IMAGE);
+				$image = new Image();
+				if($image->loadImage($sessionImage))
+				{
+					$imageInfo = $image->getOriginalImageInfo();
+					if(!@copy($sessionImage, $originalImage))
+					{
+						$error = IMG_UNDO_COPY_FAILED;
+					}else 
+					{
+						
+						//remove the session image
+						if(@unlink($sessionImage))
+						{
+							$history->restore();
+						}
+						//only one left, remove the session original if demo
+						
+						if($history->getNumRestorable() == 0 && CONFIG_SYS_DEMO_ENABLE && sizeof($originalSessionImageInfo))
+						{
+							@unlink($session->getSessionDir() . $originalSessionImageInfo['info']['name']);	
+							$originalImage = $_POST['file_path'];
+						}
+					}
+					$imagePath = $originalImage;
+					
+				}else 
+				{
+					$error = IMG_SAVE_IMG_OPEN_FAILED;
+				}
+					if(isset($imageInfo))
+					{
+							$info .= ",width:" . $imageInfo['width'] . "\n";
+							$info .= ",height:" . $imageInfo['height'] . "\n";
+							$info .= ",size:'" . transformFileSize($imageInfo['size']) . "'\n";
+							$info .= ",path:'" . backslashToSlash($imagePath) . "'\n";						
+					}	
+
+	}
+	
+	echo "error:'" . $error . "'\n";
+	if(isset($image) && is_object($image))
+	{
+		$image->DestroyImages();
+	}
+	echo $info;
+	echo ",history:" . ($history->getNumRestorable()) . "\n";
+	echo "}";
+?>

+ 57 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_login.php

@@ -0,0 +1,57 @@
+<?php
+	/**
+	 * access control login form
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+if(isset($_POST['username']))
+{
+	if($auth->login())
+	{
+		header('Location: ' . appendQueryString(CONFIG_URL_HOME, makeQueryString()));
+		exit;		
+	}
+}
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<link type="text/css" href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/login.css" rel="stylesheet" />
+<title><?php echo LOGIN_PAGE_TITLE; ?></title>
+</head>
+<body>
+<div id="container">
+    <div id="content">
+			<form name="frmLogin" method="post" action="">
+			    <table class="adminLoginTable" cellpadding="0" cellspacing="0">
+			        <thead>
+			            <tr>
+			                <th colspan="2"><?php echo LOGIN_FORM_TITLE; ?></th>
+			            </tr>
+			        </thead>
+			        <tbody>
+			            <tr>
+			                <th class="padTop"><label><?php echo LOGIN_USERNAME; ?> </label></th>
+			                <td class="padTop"><input type="text" value="" class="input" name="username" id="username" /></td>
+			            </tr>
+			            <tr>
+			                <th><label><?php echo LOGIN_PASSWORD; ?> </label></th>
+			                <td><input type="password" value="" class="input" name="password" id="password" /></td>
+			            </tr>
+			        </tbody>
+			        <tfoot>
+			            <tr>
+			            	<td>&nbsp;</td>
+			              <td><input type="submit" class="button" value="Login" /></td>
+			            </tr>			        
+			        </tfoot>
+			    </table>
+			</form>
+    </div>
+</div>
+</body>
+</html>

+ 58 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_preview.php

@@ -0,0 +1,58 @@
+<?php
+	/**
+	 * ajax preview
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+	include_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");	
+	echo getRealPath($_GET['path']);
+	if(!empty($_GET['path']) && file_exists($_GET['path']) && is_file($_GET['path']))
+	{
+		
+		include_once(CLASS_MANAGER);
+		$manager = new manager($_GET['path'], false);
+		$fileTypes = $manager->getFileType(basename($_GET['path']));
+		if($fileTypes['preview'])
+		{
+			switch($fileTypes['fileType'])
+			{
+				case "image":
+					$imageInfo = @getimagesize($_GET['path']);
+					if(!empty($imageInfo[0]) && !empty($imageInfo[1]))
+					{
+						$thumInfo = getThumbWidthHeight($imageInfo[0], $imageInfo[1], 400, 135);
+						printf("<img src=\"%s\" width=\"%s\" height=\"%s\" />", getFileUrl($_GET['path']), $thumInfo['width'], $thumInfo['height']);
+													
+					}else 
+					{
+						echo PREVIEW_IMAGE_LOAD_FAILED;
+					}
+
+					break;
+				case "txt":
+					if(($fp = @fopen($_GET['path'], 'r')))
+					{
+						echo @fread($fp, @filesize($_GET['path']));
+						@fclose($fp);
+					}else 
+					{
+						echo PREVIEW_OPEN_FAILED . ".";
+					}
+					break;
+					
+				case "video":
+					break;
+			}
+		}else 
+		{
+			echo PREVIEW_NOT_PREVIEW . "..";
+		}		
+			
+	}else 
+	{
+		echo PREVIEW_NOT_PREVIEW . "...";
+	}
+
+?>

+ 57 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_save_as_form.php

@@ -0,0 +1,57 @@
+<?php 
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Untitled Document</title>
+</head>
+
+<body>
+    	<a href="#" class="jqmClose" id="windowSaveClose"><?php echo IMG_BTN_CANCEL; ?></a>
+      <form id="formSaveAs" name="formSaveAs" action="" method="post">
+    	<table class="tableForm" cellpadding="0" cellspacing="0">
+      	<thead>
+        	<tr>
+          	<th colspan="2"><?php echo IMG_LBL_SAVE_AS; ?></th>
+          </tr>
+        </thead>
+        <tbody>
+        	<tr>
+          	<th>
+            	<label><?php echo IMG_LBL_NEW_NAME; ?></label>
+            </th>
+            <td>
+            	<input type="text" id="new_name" class="input" name="new_name" value="" />
+            </td>
+          </tr>
+          <tr>
+          	<th>
+            	<label><?php echo IMG_LBL_SAVE_TO; ?></label>
+            </th>
+            <td>
+            	<select class="input" name="save_to">
+              	
+              </select>
+            </td>
+          </tr>
+          <tr>
+          	<th>&nbsp;
+            </th>
+            <td>
+            <span class="comments">*</span>
+            <?php echo IMG_NEW_NAME_COMMENTS; ?>
+            </td>
+          </tr>
+        </tbody>
+        <tfoot>
+        	<tr>
+        	<th>&nbsp;</th>
+          <td><input type="button" class="button" value="<?php echo IMG_BTN_SAVE_AS; ?>" onclick="return saveAsImage();" /></td>
+          </tr>
+        </tfoot>
+      </table>
+</body>
+</html>

+ 79 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_save_name.php

@@ -0,0 +1,79 @@
+<?php
+	/**
+	 * ajax save name
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	$error = '';
+	$fileInfo = array();
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_RENAME)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(empty($_POST['name']))
+	{
+		$error = ERR_RENAME_EMPTY;
+	}elseif(!preg_match("/^[a-zA-Z0-9 _\-.]+$/", $_POST['name']))
+	{
+		$error = ERR_RENAME_FORMAT;
+	}elseif(empty($_POST['original_path']) || !file_exists($_POST['original_path']))
+	{
+		$error = ERR_RENAME_FILE_NOT_EXISTS;
+	}elseif(substr(slashToBackslash(removeTrailingSlash($_POST['original_path'])), strrpos(slashToBackslash(removeTrailingSlash($_POST['original_path'])), "/") + 1) == $_POST['name'])
+	{
+		$error = ERR_NO_CHANGES_MADE;
+	}elseif(file_exists(addTrailingSlash(getParentPath($_POST['original_path'])) . $_POST['name']))
+	{
+		$error = ERR_RENAME_EXISTS;
+	}elseif(is_file($_POST['original_path']) && !isValidExt($_POST['name'], explode(",", CONFIG_UPLOAD_VALID_EXTS), explode(",", CONFIG_UPLOAD_INVALID_EXTS)))
+	{
+		$error = ERR_RENAME_FILE_TYPE_NOT_PERMITED;
+	}elseif(!rename(removeTrailingSlash($_POST['original_path']), addTrailingSlash(getParentPath($_POST['original_path'])) . $_POST['name']))
+	{
+		$error = ERR_RENAME_FAILED;
+	}else 
+	{
+		//update record of session if image exists in session for cut or copy
+		include_once(CLASS_SESSION_ACTION);
+		$sessionAction = new SessionAction();		
+		$selectedDocuments = $sessionAction->get();
+		if(removeTrailingSlash($sessionAction->getFolder()) == getParentPath($_POST['original_path']) && sizeof($selectedDocuments))
+		{
+			if(($key = array_search(basename($_POST['original_path']), $selectedDocuments)) !== false)
+			{
+				$selectedDocuments[$key] = $_POST['name'];
+				$sessionAction->set($selectedDocuments);
+				
+			}
+			
+		}elseif(removeTrailingSlash($sessionAction->getFolder()) == removeTrailingSlash($_POST['original_path']))
+		{
+			$sessionAction->setFolder($_POST['original_path']);
+		}	
+		$path = addTrailingSlash(getParentPath($_POST['original_path'])) . $_POST['name'];
+		if(is_file($path))
+		{
+			include_once(CLASS_FILE);
+			$file = new file($path);
+			$fileInfo = $file->getFileInfo();
+		}else
+		{
+			include_once(CLASS_MANAGER);
+			$manager = new manager($path, false);
+			$fileInfo = $manager->getFolderInfo();
+		}
+	}
+	
+	echo "{";
+	echo "error:'" . $error . "' ";
+	foreach ($fileInfo as $k=>$v)
+	{
+		echo "," . $k . ":'" . $v . "' ";
+	}
+	echo "}";
+	
+	
+?>

+ 88 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_save_text.php

@@ -0,0 +1,88 @@
+<?php
+	/**
+	 * ajax save name
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	$error = '';
+	$path = addTrailingSlash(backslashToSlash($_POST['folder'])) . $_POST['name'];
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_EDITABLE)
+	{
+		$error = SYS_DISABLED;
+	}
+	elseif(isset($_POST['save_as_request']))
+	{		
+		if(!preg_match('/^[a-zA-Z0-9_\-.]+$/', $_POST['name']))
+		{
+			$error = TXT_SAVE_AS_ERR_NAME_INVALID;
+		}elseif(array_search(strtolower(getFileExt($_POST['name'])), getValidTextEditorExts()) === false)
+		{
+			$error = TXT_DISALLOWED_EXT;
+		}elseif(!isUnderRoot($_POST['folder']))
+		{
+			$error = ERR_FOLDER_PATH_NOT_ALLOWED;
+		}
+		else
+		{
+			
+			if(!empty($_POST['save_as_request']))
+			{//save as request
+				if(file_exists($path))
+				{
+					$error = TXT_FILE_EXIST;
+				}else 
+				{
+					if(($fp = @fopen($path, 'w+')) !== false)
+					{
+						if(@fwrite($fp, $_POST['text']))
+						{
+							@fclose($fp);
+						}else 
+						{
+							$error = TXT_CONTENT_WRITE_FAILED;
+						}
+					}else 
+					{
+						$error = TXT_CREATE_FAILED;
+					}					
+				}
+
+				
+			}else 
+			{
+				if(!file_exists($path))
+				{
+					$error = TXT_FILE_NOT_EXIST;
+				}else 
+				{
+					if(($fp = @fopen($path, 'w')) !== false)
+					{
+						if(@fwrite($fp, $_POST['text']))
+						{
+							@fclose($fp);
+						}else 
+						{
+							$error = TXT_CONTENT_UPDATE_FAILED;
+						}
+					}else 
+					{
+						$error = TXT_FILE_OPEN_FAILED;
+					}						
+				}
+			}
+			
+		}
+
+	}else 
+	{
+		$error = TXT_UNKNOWN_REQUEST;
+	}
+		echo "{";
+		echo "error:'" . $error . "',\n";
+		echo  "path:'" . $path . "'";
+		echo "}";
+	
+?>

+ 166 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajax_text_editor.php

@@ -0,0 +1,166 @@
+<?php
+		/**
+	 * Ajax image editor platform
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	if(CONFIG_SYS_VIEW_ONLY || !CONFIG_OPTIONS_EDITABLE)
+	{
+		die(SYS_DISABLED);
+	}	
+		$session->gc();
+		$_GET['path'] = empty($_GET['path'])?CONFIG_SYS_ROOT_PATH . "ajax_image_editor_demo.jpg":$_GET['path'];
+		if(!empty($_GET['path']) && file_exists($_GET['path']) && is_file($_GET['path']) && isUnderRoot($_GET['path']))
+		{
+				$path = $_GET['path'];
+		}else 
+		{
+			die(TXT_FILE_NOT_FOUND);
+		}
+		if(file_exists(DIR_AJAX_EDIT_AREA . "reg_syntax" . DIRECTORY_SEPARATOR . getFileExt($path) . ".js"))
+		{
+			$syntax = getFileExt($path);			
+		}else 
+		{
+			switch (getFileExt($path))
+			{
+				case 'htm':
+					$syntax = 'html';
+					break;
+				default:
+					$syntax = 'basic';
+			}
+		}
+		if(array_search(getFileExt($path), getValidTextEditorExts())=== false)
+		{
+			die(TXT_DISALLOWED_EXT);	
+		}
+	?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="author" content="Logan Cai" />
+<meta name="website" content="http://www.phpletter.com" />
+<script type="text/javascript" src="jscripts/ajaxtexteditor_c.js"></script>
+<!--<script type="text/javascript" src="jscripts/jquery.js"></script>
+<script type="text/javascript" src="jscripts/form.js"></script>
+<script type="text/javascript" src="jscripts/select.js"></script>
+<script type="text/javascript" src="jscripts/jqModal.js"></script>
+<script type="text/javascript" src="jscripts/ajaxtexteditor.js"></script>
+-->
+<script type="text/javascript" src="jscripts/edit_area/edit_area_full.js"></script>
+<script type="text/javascript">
+				var warningExtNotSelected = '<?php echo TXT_EXT_NOT_SELECTED; ?>';
+				var urlGetFolderList = '<?php echo appendQueryString(CONFIG_URL_GET_FOLDER_LIST, makeQueryString(array('path'))); ?>';
+				var warningInvalidName = '<?php echo TXT_SAVE_AS_ERR_NAME_INVALID; ?>';
+				var waringFolderNotSelected = '<?php echo TXT_DEST_FOLDER_NOT_SELECTED; ?>';
+				var currentFolder = '<?php echo dirname($path); ?>';
+				var currentName = '<?php echo basename($path); ?>';
+
+		jQuery(document).ready(
+		function()
+		{
+				editAreaLoader.init({				
+				id: "content"	// id of the textarea to transform		
+				,start_highlight: false	// if start with highlight
+				,allow_resize: "both"
+				,gecko_spellcheck:true
+				,allow_toggle: true
+				,toolbar:"search, go_to_line, fullscreen, |, undo, redo, |, select_font,|, highlight, reset_highlight, |, save, save_as"
+				,save_callback:"save"
+				,save_as_callback:"save_as"
+				,language: "<?php echo (file_exists(DIR_AJAX_EDIT_AREA . 'langs' . DIRECTORY_SEPARATOR .CONFIG_LANG_INDEX . ".js")?CONFIG_LANG_INDEX:'en'); ?>"
+				,syntax: "<?php echo $syntax; ?>"	
+			});				
+				jQuery('#windowSaveAs').jqm();		
+				jQuery('#windowProcessing').jqm({modal:true});				
+		}
+	);		
+
+		
+
+			
+</script>
+
+<link href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/ajaxtexteditor.css" type="text/css" rel="stylesheet" />
+<link href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/jqModal.css" type="text/css" rel="stylesheet" />
+<title>Ajax Text Editor</title>
+</head>
+<body>
+
+<div id="pageBody">
+	<textarea name="content" id="content" style="height:500px; width: 97%;"><?php echo getFileContent($path); ?></textarea>
+</div>
+<div id="windowProcessing" class="jqmWindow" style="display:none">
+	<form name="frmProcessing" id="frmProcessing" method="POST" action="<?php echo appendQueryString(CONFIG_URL_SAVE_TEXT, makeQueryString(array('path')));?>">
+		<input type="hidden" name="folder" id="folder" value="<?php echo dirname($path); ?>" />
+		<input type="hidden" name="name" id="name" value="<?php echo basename($path); ?>" />	
+		<input type="hidden" name="save_as_request" id="save_as_request" value="0" />
+		<div style="display:none"><textarea name="text" id="text"></textarea></div> 
+	</form> 
+	<a href="#" class="jqmClose" id="windowSaveClose"><?php echo IMG_BTN_CANCEL; ?></a>
+	<p><img src="theme/<?php echo CONFIG_THEME_NAME; ?>/images/loading.gif" /></p>
+</div>
+<div id="windowSaveAs" class="jqmWindow" style="display:none">
+    	<a href="#" class="jqmClose" id="windowSaveClose"><?php echo IMG_BTN_CANCEL; ?></a>
+      <form id="formSaveAs" name="formSaveAs" action="" method="post">
+    	<table class="tableForm" cellpadding="0" cellspacing="0">
+      	<thead>
+        	<tr>
+          	<th colspan="2"><?php echo IMG_LBL_SAVE_AS; ?></th>
+          </tr>
+        </thead>
+        <tbody>
+        	<tr>
+          	<th>
+            	<label><?php echo IMG_LBL_NEW_NAME; ?></label>
+            </th>
+            <td>
+            	<input type="text" id="new_name" class="input" name="new_name" value="" />
+              &nbsp;.&nbsp;<select id="ext" name="ext">
+              <?php
+								foreach(getValidTextEditorExts() as $v)
+								{
+									?>
+									<option value="<?php echo $v; ?>" <?php echo (strtolower($v) == strtolower(getFileExt($path))?'selected':''); ?>><?php echo $v; ?></option>
+									<?php
+								}
+							?>
+              </select>
+            </td>
+          </tr>
+          <tr>
+          	<th>
+            	<label><?php echo IMG_LBL_SAVE_TO; ?></label>
+            </th>
+            <td>
+            	<select class="input" name="save_to" id="save_to">
+              	
+              </select>
+            </td>
+          </tr>
+          <tr>
+          	<th>&nbsp;
+            </th>
+            <td>
+            <span class="comments">*</span>
+            <?php echo IMG_NEW_NAME_COMMENTS; ?>
+            </td>
+          </tr>
+        </tbody>
+        <tfoot>
+        	<tr>
+        	<th>&nbsp;</th>
+          <td><input type="button" class="button" value="<?php echo IMG_BTN_SAVE_AS; ?>" onclick="return do_save_as();" /></td>
+          </tr>
+        </tfoot>
+      </table>
+      </form>
+    </div>
+
+</body></html>
+

+ 687 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/ajaxfilemanager.php

@@ -0,0 +1,687 @@
+<?php
+	/**
+	 * file manager platform
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "inc" . DIRECTORY_SEPARATOR . "config.php");
+	$session->gc();
+	require_once(CLASS_SESSION_ACTION);
+	$sessionAction = new SessionAction();	
+	if(CONFIG_LOAD_DOC_LATTER)
+	{
+		$fileList = array();
+		$folderInfo = array('path'=>getCurrentFolderPath());
+	}else 
+	{
+		require_once(CLASS_MANAGER);
+
+	
+		$manager = new manager();
+		$manager->setSessionAction($sessionAction);
+		$fileList = $manager->getFileList();
+		$folderInfo = $manager->getFolderInfo();		
+	}
+	if(CONFIG_SYS_THUMBNAIL_VIEW_ENABLE)
+	{
+	$views = array(
+		'detail'=>LBL_BTN_VIEW_DETAILS,
+		'thumbnail'=>LBL_BTN_VIEW_THUMBNAIL,
+	);		
+	}else 
+	{
+	$views = array(
+		'detail'=>LBL_BTN_VIEW_DETAILS,
+	);		
+	}
+
+	if(!empty($_GET['view']))
+	{
+		switch($_GET['view'])
+		{
+			case 'detail':
+			case 'thumbnail':
+				$view = $_GET['view'];
+				break;
+			default:
+				$view = CONFIG_DEFAULT_VIEW;
+		}
+	}else 
+	{
+		$view = CONFIG_DEFAULT_VIEW;
+	}
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" debug="true">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Ajax File Manager</title>
+<script type="text/javascript" src="jscripts/ajaxfilemanager_c.js"></script>
+<!--<script type="text/javascript" src="jscripts/jquery.js"></script>
+<script type="text/javascript" src="jscripts/form.js"></script>
+<script type="text/javascript" src="jscripts/select.js"></script>
+<script type="text/javascript" src="jscripts/thickbox.js"></script>
+<script type="text/javascript" src="jscripts/calendar.js"></script>
+<script type="text/javascript" src="jscripts/contextmenu.js"></script>
+<script type="text/javascript" src="jscripts/media.js"></script>
+<script type="text/javascript" src="jscripts/ajaxfileupload.js"></script>
+<script type="text/javascript" src="jscripts/ajaxfilemanager.js"></script>-->
+<script type="text/javascript">
+	var globalSettings = {'upload_init':false};
+	var queryString = '<?php echo makeQueryString(array('path')); ?>';
+	var paths = {'root':'<?php echo addTrailingSlash(backslashToSlash(CONFIG_SYS_ROOT_PATH)); ?>', 'root_title':'<?php echo LBL_FOLDER_ROOT; ?>'};
+	var parentFolder = {};
+	var urls = {
+			'upload':'<?php echo CONFIG_URL_UPLOAD; ?>',
+			'preview':'<?php echo CONFIG_URL_PREVIEW; ?>',
+			'cut':'<?php echo CONFIG_URL_CUT; ?>',
+			'copy':'<?php echo CONFIG_URL_COPY; ?>',
+			'paste':'<?php echo CONFIG_URL_FILE_PASTE; ?>',
+			'delete':'<?php echo CONFIG_URL_DELETE; ?>',
+			'rename':'<?php echo CONFIG_URL_SAVE_NAME; ?>',
+			'thumbnail':'<?php echo CONFIG_URL_IMG_THUMBNAIL;  ?>',
+			'create_folder':'<?php echo CONFIG_URL_CREATE_FOLDER; ?>',
+			'text_editor':'<?php echo  CONFIG_URL_TEXT_EDITOR; ?>',
+			'image_editor':'<?php echo  CONFIG_URL_IMAGE_EDITOR; ?>',
+			'download':'<?php echo CONFIG_URL_DOWNLOAD; ?>',
+			'present':'<?php echo getCurrentUrl(); ?>',
+			'home':'<?php echo CONFIG_URL_HOME; ?>',
+			'view':'<?php echo CONFIG_URL_LIST_LISTING; ?>'			
+		};
+	var permits = {'del':<?php echo (CONFIG_OPTIONS_DELETE?1:0); ?>, 'cut':<?php echo (CONFIG_OPTIONS_CUT?'1':'0'); ?>, 'copy':<?php echo (CONFIG_OPTIONS_COPY?1:0); ?>, 'newfolder':<?php echo (CONFIG_OPTIONS_NEWFOLDER?1:0); ?>, 'rename':<?php echo (CONFIG_OPTIONS_RENAME?1:0); ?>, 'upload':<?php echo (CONFIG_OPTIONS_UPLOAD?1:0); ?>, 'edit':<?php echo (CONFIG_OPTIONS_EDITABLE?1:0); ?>, 'view_only':<?php echo (CONFIG_SYS_VIEW_ONLY?1:0); ?>};
+	var currentFolder = {};
+	var warningDelete = '<?php echo WARNING_DELETE; ?>';
+	var newFile = {'num':1, 'label':'<?php echo FILE_LABEL_SELECT; ?>', 'upload':'<?php echo FILE_LBL_UPLOAD; ?>'};
+	var counts = {'new_file':1};
+	var thickbox = {'width':'<?php echo CONFIG_THICKBOX_MAX_WIDTH; ?>', 
+									'height':'<?php echo CONFIG_THICKBOX_MAX_HEIGHT; ?>',
+									'next':'<?php echo THICKBOX_NEXT; ?>',
+									'previous':'<?php echo THICKBOX_PREVIOUS; ?>',
+									'close':'<?php echo THICKBOX_CLOSE; ?>' 
+		
+	};
+	
+	var tb_pathToImage = "theme/<?php echo CONFIG_THEME_NAME; ?>/images/loadingAnimation.gif";
+	var msgInvalidFolderName = '<?php echo ERR_FOLDER_FORMAT; ?>';
+	var msgInvalidFileName = '<?php echo ERR_FILE_NAME_FORMAT; ?>';
+	var msgInvalidExt = '<?php echo ERR_FILE_TYPE_NOT_ALLOWED; ?>';
+	var msgNotPreview = '<?php echo PREVIEW_NOT_PREVIEW; ?>';
+
+	var warningCutPaste = '<?php echo WARNING_CUT_PASTE; ?>';
+	var warningCopyPaste = '<?php echo WARNING_COPY_PASTE; ?>';
+	var warningDel = '<?php echo WARNING_DELETE; ?>';
+	var warningNotDocSelected = '<?php echo ERR_NOT_DOC_SELECTED; ?>';
+	var noFileSelected = '<?php echo ERR_NOT_FILE_SELECTED; ?>';
+    var unselectAllText = '<?php echo TIP_UNSELECT_ALL; ?>';
+    var selectAllText = '<?php echo TIP_SELECT_ALL; ?>';
+	var action = '<?php echo $sessionAction->getAction(); ?>';
+	var numFiles = <?php echo $sessionAction->count(); ?>;
+	var warningCloseWindow = '<?php echo WARING_WINDOW_CLOSE; ?>';
+	var numRows = 0; 
+
+	var wordCloseWindow = '<?php echo LBL_ACTION_CLOSE; ?>';
+	var wordPreviewClick = '<?php echo LBL_CLICK_PREVIEW; ?>';
+
+	var searchRequired = false;
+	var supporedPreviewExts = '<?php echo CONFIG_VIEWABLE_VALID_EXTS; ?>'; 
+	var supportedUploadExts = '<?php echo CONFIG_UPLOAD_VALID_EXTS; ?>'
+	var elementId = <?php  echo (!empty($_GET['elementId'])?"'" . $_GET['elementId'] . "'":'null'); ?>;
+	var files = {};
+$(document).ready(
+	function()
+	{
+		jQuery(document).bind('keypress', function(event) {
+			var code=event.charCode || event.keyCode;
+			if(code && code == 13) {// if enter is pressed
+	  			event.preventDefault(); //prevent browser from following the actual href
+			};
+		});		
+		if(typeof(cancelSelectFile) != 'undefined')
+		{
+			$('#linkClose').show();
+		}
+		$('input[@name=view]').each(
+			function()
+			{
+
+				if(this.value == '<?php echo $view; ?>')
+				{
+					this.checked = true;
+				}else
+				{
+					this.checked = false;
+				}
+			}
+		);
+		
+		popUpCal.clearText = '<?php echo CALENDAR_CLEAR; ?>';
+		popUpCal.closeText = '<?php echo CALENDAR_CLOSE; ?>';
+		popUpCal.prevText = '<?php echo CALENDAR_PREVIOUS; ?>';
+		popUpCal.nextText = '<?php echo CALENDAR_NEXT; ?>';
+		popUpCal.currentText = '<?php echo CALENDAR_CURRENT; ?>';
+		popUpCal.buttonImageOnly = true;
+		popUpCal.dayNames = new Array('<?php echo CALENDAR_SUN; ?>','<?php echo CALENDAR_MON; ?>','<?php echo CALENDAR_TUE; ?>','<?php echo CALENDAR_WED; ?>','<?php echo CALENDAR_THU; ?>','<?php echo CALENDAR_FRI; ?>','<?php echo CALENDAR_SAT; ?>');
+		popUpCal.monthNames = new Array('<?php echo CALENDAR_JAN; ?>','<?php echo CALENDAR_FEB; ?>','<?php echo CALENDAR_MAR; ?>','<?php echo CALENDAR_APR; ?>','<?php echo CALENDAR_MAY; ?>','<?php echo CALENDAR_JUN; ?>','<?php echo CALENDAR_JUL; ?>','<?php echo CALENDAR_AUG; ?>','<?php echo CALENDAR_SEP; ?>','<?php echo CALENDAR_OCT; ?>','<?php echo CALENDAR_NOV; ?>','<?php echo CALENDAR_DEC; ?>');
+		popUpCal.dateFormat = 'YMD-';
+		$('.inputMtime').calendar({autoPopUp:'both', buttonImage:'theme/<?php echo CONFIG_THEME_NAME; ?>/images/date_picker.png'});
+		
+		
+		initAfterListingLoaded();
+		//addMoreFile();
+
+	} );
+
+	
+</script>
+<?php
+	if(file_exists(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'jscripts' . DIRECTORY_SEPARATOR . 'for_' . CONFIG_EDITOR_NAME . ".js")
+	{
+	?>
+	<script type="text/javascript" src="jscripts/<?php echo 'for_' . CONFIG_EDITOR_NAME . '.js'; ?>"></script>
+	<?php
+	}
+?>
+<link rel="stylesheet" type="text/css" href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/<?php echo CONFIG_EDITOR_NAME; ?>.css" />
+<link rel="stylesheet" type="text/css" href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/jquery-calendar.css" />
+<link rel="stylesheet" href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/thickbox.css" type="text/css" media="screen" />
+<!--[if IE 6]>
+<link href="theme/<?php echo CONFIG_THEME_NAME; ?>/css/ie6.css" type="text/css" rel="Stylesheet" media="screen">
+<![endif]-->
+</head>
+<body style="background-color:#E8E8E8;">
+	<div id="wrapper">
+  	<div id="header">
+  		<dl id="currentFolderInfo">
+  			<dt><?php echo LBL_CURRENT_FOLDER_PATH; ?></dt>
+  			<dd id="currentFolderPath"><?php echo $folderInfo['path']; ?></dd>
+  		</dl>
+    	<div id="viewList">
+    		
+    	
+    			<label><?php echo LBL_BTN_VIEW_OPTIONS; ?></label>
+					<?php 
+						foreach($views as $k=>$v)
+						{
+							?>
+							<input type="radio" name="view"  class="radio" onclick="changeView(this);" value="<?php echo $k; ?>" <?php echo ($k==$view?'checked':''); ?>> <?php echo $v; ?> &nbsp;&nbsp;
+							
+							<?php
+						}
+					?></div>
+				<ul id="actionHeader">
+					<li><a href="#" id="actionRefresh" onclick="return windowRefresh();"><span><?php echo LBL_ACTION_REFRESH; ?></span></a></li>
+					<li><a href="#" id="actionSelectAll" class="check_all" onclick="return checkAll(this);"><span><?php echo LBL_ACTION_SELECT_ALL; ?></span></a></li>
+					<?php 
+						if(CONFIG_OPTIONS_DELETE)
+						{
+							?>
+							<li><a href="#" id="actionDelete" onclick="return deleteDocuments();"><span><?php echo LBL_ACTION_DELETE; ?></span></a></li>
+							<?php
+						}
+					?>
+					<?php 
+						if(CONFIG_OPTIONS_CUT)
+						{
+							?>
+							<li><a href="#" id="actionCut" onclick="return cutDocuments('<?php echo ERR_NOT_DOC_SELECTED_FOR_CUT; ?>');"><span><?php echo LBL_ACTION_CUT; ?></span></a></li>			
+							<?php
+						}
+					?>
+					<?php 
+						if(CONFIG_OPTIONS_COPY)
+						{
+							?>
+							<li><a href="#" id="actionCopy" onclick="return copyDocuments('<?php echo ERR_NOT_DOC_SELECTED_FOR_COPY; ?>');"><span><?php echo LBL_ACTION_COPY; ?></span></a></li>
+							<?php
+						}
+					?>
+					<?php 
+						if(CONFIG_OPTIONS_CUT || CONFIG_OPTIONS_COPY)
+						{
+							?>
+							<li><a href="#" id="actionPaste" onclick="return pasteDocuments('<?php echo ERR_NOT_DOC_SELECTED_FOR_PASTE; ?>');"><span><?php echo LBL_ACTION_PASTE; ?></span></a></li>
+							<?php
+						}
+					?>															
+					
+					<?php 
+						if(CONFIG_OPTIONS_NEWFOLDER)
+						{
+							?>
+							<li><a  id="actionNewFolder" href="#" onclick="return newFolderWin(this);"><span><?php echo LBL_BTN_NEW_FOLDER; ?></span></a></li>
+							<?php
+						}
+					?>
+					<?php 
+						if(CONFIG_OPTIONS_UPLOAD)
+						{
+							?>
+							<li><a  id="actionUpload" href="#" onclick="return uploadFileWin(this);"><span><?php echo LBL_BTN_UPLOAD; ?></span></a></li>
+							<?php
+						}
+					?>
+																	
+					
+					
+					
+		
+					
+<!--					<li><a href="#" id="actionClose" onclick="closeWindow('<?php echo IMG_WARING_WIN_CLOSE; ?>');"><?php echo IMG_BTN_CLOSE; ?></a></li>-->
+					<li><a href="#" class="thickbox" id="actionInfo" onclick="return infoWin(this);"><span>Info</span></a></li>
+					<!-- thest functions will be added in the near future
+ 					<li ><a href="#" id="actionZip"><span>Zip</span></a><li>
+					<li ><a href="#" id="actionUnzip"><span>Unzip</span></a><li>-->
+				</ul>    
+<form action="" method="POST" name="formAction" id="formAction"><input type="hidden" name="currentFolderPath" id="currentFolderPathVal" value="" /><select name="selectedDoc[]" id="selectedDoc" style="display:none;" multiple="multiple"></select><input type="hidden" name="action_value" value="" id="action_value" /></form>				  
+    </div>
+    
+    <div id="body">
+         
+         
+      <div id="rightCol">
+	      	<?php
+			if(CONFIG_LOAD_DOC_LATTER )
+			{
+				$currentPath = getCurrentFolderPath();
+				?>
+				<script type="text/javascript">
+				parentFolder = {path:'<?php echo getParentFolderPath($currentPath); ?>'}; 
+				currentFolder = {'friendly_path':'<?php echo transformFilePath($currentPath); ?>'};
+					$(document).ready(
+						function()
+						{
+							var url = getUrl('view', false, false, false);
+							$('#rightCol').empty();
+							ajaxStart('#rightCol');		
+							
+							$('#rightCol').load(url, 
+										{},
+										function(){
+												ajaxStop('#rightCol img.ajaxLoadingImg');
+												urls.present = getUrl('home', true, true);
+												initAfterListingLoaded();
+											});
+						}
+					);
+				</script>
+				<?php
+			}else 
+			{
+				include_once(CONFIG_URL_LIST_LISTING);
+			}
+	      	 ?>
+      </div> 
+      
+      <div id="leftCol">
+      
+
+
+				<fieldset id="folderFieldSet" >
+					
+				<legend><?php echo LBL_FOLDER_INFO; ?></legend>
+				<table cellpadding="0" cellspacing="0" class="tableSummary" id="folderInfo">
+					<tbody>
+						<tr>
+							<th><?php echo LBL_FOLDER_PATH; ?></th>
+							<td colspan="3" id="folderPath"><?php echo transformFilePath($folderInfo['path']); ?></td>
+						</tr>
+						<tr>
+							<th><?php echo LBL_FOLDER_CREATED; ?></th>
+							<td colspan="3" id="folderCtime"><?php echo (!empty($folderInfo['ctime'])?date(DATE_TIME_FORMAT,$folderInfo['ctime']):'&nbsp;') ; ?></td>
+
+						</tr>
+						<tr>
+							<th><?php echo LBL_FOLDER_MODIFIED; ?></th>
+							<td colspan="3" id="folderMtime"><?php echo (!empty($folderInfo['mtime'])?date(DATE_TIME_FORMAT,$folderInfo['mtime']):'&nbsp;'); ?></td>
+						</tr>
+						<tr>
+							<th><?php echo LBL_FOLDER_SUDDIR; ?></th>
+							<td  colspan="3" id="folderSubdir"><?php echo (isset($folderInfo['subdir'])?$folderInfo['subdir']:"&nbsp;"); ?></td>
+
+						</tr>
+						<tr>
+							<th><?php echo LBL_FOLDER_FIELS; ?></th>
+							<td  colspan="3" id="folderFile"><?php echo (isset($folderInfo['file'])?$folderInfo['file']:'&nbsp;'); ?></td>						
+						</tr>
+						
+						<tr>
+							<th><?php echo LBL_FOLDER_WRITABLE; ?></th>
+							<td id="folderWritable"><span class="<?php echo (isset($folderInfo['is_readable'])?($folderInfo['is_readable']?'flagYes':'flagNo'):'&nbsp;'); ?>">&nbsp;</span></td>
+							<th><?php echo LBL_FOLDER_READABLE; ?></th>
+							<td  id="folderReadable"><span class="<?php echo (isset($folderInfo['is_writable'])?($folderInfo['is_writable']?'flagYes':'flagNo'):'&nbsp;'); ?>">&nbsp;</span></td>						
+						
+						</tr>
+
+
+
+					</tbody>
+				</table>
+				</fieldset>
+			<fieldset id="fileFieldSet" style="display:none" >
+				<legend><?php echo LBL_FILE_INFO; ?></legend>
+				<table cellpadding="0" cellspacing="0" class="tableSummary" id="fileInfo">
+					<tbody>
+						<tr>
+							<th><?php echo LBL_FILE_NAME; ?></th>
+							<td colspan="3" id="fileName"></td>
+						</tr>
+						<tr>
+							<th><?php echo LBL_FILE_CREATED; ?></th>
+							<td colspan="3" id="fileCtime"></td>
+
+						</tr>
+						<tr>
+							<th><?php echo LBL_FILE_MODIFIED; ?></th>
+							<td colspan="3" id="fileMtime"></td>
+						</tr>
+						<tr>
+							<th><?php echo LBL_FILE_SIZE; ?></th>
+							<td  colspan="3" id="fileSize"></td>
+
+						</tr>
+						<tr>
+							<th><?php echo LBL_FILE_TYPE; ?></th>
+							<td  colspan="3" id="fileType"></td>						
+						</tr>
+						<tr>
+							<th><?php echo LBL_FILE_WRITABLE; ?></th>
+							<td id="fileWritable"><span class="flagYes">&nbsp;</span></td>
+							<th><?php echo LBL_FILE_READABLE; ?></th>
+							<td id="fileReadable"><span class="flagNo">&nbsp;</span></td>		
+						</tr>
+
+					</tbody>
+				</table>
+		
+        <p class="searchButtons" id="returnCurrentUrl">
+  
+        	<span class="right" id="linkSelect">
+        		<input type="button" value="<?php echo MENU_SELECT; ?>"  id="selectCurrentUrl" class="button">
+        	</span>
+        	
+        </p>				
+			</fieldset>
+			
+     
+      
+      	<fieldset class="boxSearch">
+      		<legend><?php echo LBL_SEARCH; ?></legend>
+
+
+
+          <table cellpadding="0" cellspacing="0" class="tableSearch">
+          	<tbody>
+	          <tr>
+	          	<td>
+	          		<b><?php echo LBL_SEARCH_NAME; ?></b> <br />
+	            	<input type="text" class="input inputSearch" name="search_name" id="search_name" />
+	          	</td>
+	         </tr>
+	          <tr>
+	          	<td >
+	          	<b><?php echo LBL_SEARCH_FOLDER; ?></b><br />
+	          	<span id="searchFolderContainer">
+	          	<?php
+	          		if(CONFIG_LOAD_DOC_LATTER)
+	          		{
+	          			?>
+	          			<script type="text/javascript">
+	          				$(document).ready(
+	          					function()
+	          					{
+	          						ajaxStart('#searchFolderContainer');		
+	          						$('#searchFolderContainer').load('<?php echo CONFIG_URL_LOAD_FOLDERS; ?>');
+	          					}
+	          				);
+	          			</script>
+	          			<?php
+	          		}else 
+	          		{
+	          	?>
+		            <select class="input inputSearch" name="search_folder" id="search_folder">
+		            	<?php 
+		            		
+										foreach(getFolderListing(CONFIG_SYS_ROOT_PATH) as $k=>$v)
+										{
+											?>
+		                  <option value="<?php echo $v; ?>" <?php echo (removeTrailingSlash(backslashToSlash(($folderInfo['path']))) == removeTrailingSlash(backslashToSlash(($v)))?' selected="selected"':''); ?>><?php echo shortenFileName($k, 30); ?></option>
+		                  <?php 
+										}
+		            		
+									?>            	
+		            </select>
+		      <?php
+	          		}
+		      ?></span>
+	          </td>
+	         </tr>  
+        		<tr>
+        			<td>
+        		<b><?php echo LBL_SEARCH_MTIME; ?></b><br />
+        		<input type="text" class="input inputMtime" name="search_mtime_from" id="search_mtime_from" value="<?php echo (!empty($_GET['search_mtime_from'])?$_GET['search_mtime_from']:''); ?>" /> 
+        		<span class="leftToRightArrow">&nbsp;</span>
+        		<input type="text" class="input inputMtime" name="search_mtime_to" id="search_mtime_to" value="<?php echo (!empty($_GET['search_mtime_to'])?$_GET['search_mtime_to']:''); ?>" />
+        	</td></tr>
+
+			<tr>
+				<td>
+          	<b><?php echo LBL_SEARCH_RECURSIVELY; ?></b>&nbsp;&nbsp;
+          	<input type="radio" name="search_recursively" value="1" id="search_recursively_1" class="radio" <?php echo (!empty($_GET['search_recursively'])?'checked="checked"':''); ?> /> <?php echo LBL_RECURSIVELY_YES; ?>
+          	<input type="radio" name="search_recursively" value="0" id="search_recursively_0" class="radio" <?php echo (empty($_GET['search_recursively'])?'checked="checked"':''); ?> /> <?php echo LBL_RECURSIVELY_NO; ?>
+          	</td>
+          </tr>	                	
+          	</tbody>
+</table>
+
+
+
+       	
+        <p class="searchButtons">
+        	<span class="left" id="linkClose" style="display:none">
+        		<input  type="button" value="<?php echo LBL_ACTION_CLOSE; ?>" onclick="return cancelSelectFile();"  class="button">
+        	</span>
+        	<span class="right" id="linkSearch">
+        		<input type="button" value="<?php echo BTN_SEARCH; ?>" onclick="return search();" class="button">
+        	</span>
+        	
+        </p>
+        </fieldset>
+  
+      </div>
+      
+      <div class="clear"></div>
+    </div>
+		
+  
+  </div>
+  <div class="clear"></div>
+
+
+  
+  <div id="ajaxLoading" style="display:none"><img class="ajaxLoadingImg" src="theme/<?php echo CONFIG_THEME_NAME; ?>/images/ajaxLoading.gif" /></div>
+  <div id="winUpload" style="display:none">
+  	<div class="jqmContainer">
+  		<div class="jqmHeader">
+  			<a href="#" onclick="tb_remove();"><?php echo LBL_ACTION_CLOSE; ?></a>
+  		</div>
+  		<div class="jqmBody">
+		  	<form id="formUpload" name="formUpload" method="POST" enctype="multipart/form-data" action="">
+		  	<table class="tableForm" cellpadding="0" cellspacing="0">
+		  		<thead>
+		  			<tr>
+		  				<th colspan="2"><?php echo FILE_FORM_TITLE; ?><a class="action" href="#" title="<?php echo FILE_LBL_MORE;  ?>" onclick="return addMoreFile();"><span class="addMore">&nbsp;</span></a></th>
+		  			</tr>
+		  		</thead>
+		  		<tbody id="fileUploadBody">
+		  			<tr style="display:none">
+		  				<th><label><?php echo FILE_LABEL_SELECT; ?></label></th>
+		  				<td><input type="file" class="input" name="file"  /> <input type="button" class="button" value="<?php echo FILE_LBL_UPLOAD; ?>" /> <a href="#" class="action" title="Cancel" style="display:none" ><span class="cancel">&nbsp;</span></a>  <span class="uploadProcessing" style="display:none">&nbsp;<span></td>
+		  			</tr>		
+		  		</tbody>
+		  		<tfoot>
+		  			<tr>
+		  				<th>&nbsp;</th>
+		  				<td></td>
+		  			</tr>
+		  		</tfoot>
+		  	</table>
+		  	</form>  		
+  		</div>
+
+  	</div>
+  </div> 
+  <div id="winNewFolder" style="display:none">
+  	<div class="jqmContainer">
+  		<div class="jqmHeader">
+  			<a href="#" onclick="tb_remove();"><?php echo LBL_ACTION_CLOSE; ?></a>
+  		</div>
+  		<div class="jqmBody">
+	    	<form id="formNewFolder" name="formNewFolder" method="POST" action="">
+	  	<input type="hidden" name="currentFolderPath" value="" id="currentNewfolderPath" />
+	  	<table class="tableForm" cellpadding="0" cellspacing="0">
+	  		<thead>
+	  			<tr>
+	  				<th colspan="2"><?php echo FOLDER_FORM_TITLE; ?></th>
+	  			</tr>
+	  		</thead>
+	  		<tbody>
+	  			<tr>
+	  				<th><label><?php echo FOLDER_LBL_TITLE; ?></label></th>
+	  				<td><input type="text" name="new_folder" id="new_folder" value="" class="input"></td>
+	  			</tr>    		
+	
+				
+	  		</tbody>
+	  		<tfoot>
+	  			<tr>
+	  				<th>&nbsp;</th>
+	  				<td><input type="button" value="<?php echo FOLDER_LBL_CREATE; ?>" class="button" onclick="return doCreateFolder();"  /></td>
+	  			</tr>
+	  		</tfoot>
+	  	</table>	
+	  	</form>	
+  		</div>
+
+  	
+  	
+  	</div>
+  </div>   
+  <div id="winPlay" style="display:none">
+  	<div class="jqmContainer">
+  		<div class="jqmHeader">
+  			<a href="#" onclick="closeWinPlay();"><?php echo LBL_ACTION_CLOSE; ?></a>
+  		</div>
+  		<div class="jqmBody">
+  			<div id="playGround"></div>
+  		</div>
+  	</div>
+  </div>
+  <div id="winRename" style="display:none">
+  	<div class="jqmContainer">
+  		<div class="jqmHeader">
+  			<a href="#" onclick="tb_remove();"><?php echo LBL_ACTION_CLOSE; ?></a>
+  		</div>
+  		<div class="jqmBody">
+		  	<form id="formRename" name="formRename" method="POST" action="">
+		  	<input type="hidden" name="original_path" id="original_path" />
+		  	<input type="hidden" name="num" id="renameNum" value="" />
+		  	<table class="tableForm" cellpadding="0" cellspacing="0">
+		  		<thead>
+		  			<tr>
+		  				<th colspan="2"><?php echo RENAME_FORM_TITLE; ?></th>
+		  			</tr>
+		  		</thead>
+		  		<tbody>
+		  			<tr>
+		  				<th><label><?php echo RENAME_NEW_NAME; ?></label></th>
+		  				<td><input type="name" id="renameName" class="input" name="name" style="width:250px" /> 
+		          </td>
+		  			</tr>
+		  		</tbody>
+		  		<tfoot>
+		  			<tr>
+		  				<th>&nbsp;</th>
+		  				<td><input type="button" value="<?php echo RENAME_LBL_RENAME; ?>" class="button" onclick="return doRename();"  /></td>
+		  			</tr>
+		  		</tfoot>
+		  	</table>
+		  	</form>
+  		</div>  	
+
+  	</div>
+  	
+  </div>        
+  <div id="winInfo" style="display:none">
+  	<div class="jqmContainer">
+  		<div class="jqmHeader">
+  			<a href="#" onclick="tb_remove();"><?php echo LBL_ACTION_CLOSE; ?></a>
+  		</div>
+  		<div class="jqmBody">
+   	<table class="tableInfo" cellpadding="0" cellspacing="0">
+  		<tbody>
+  			<tr>
+	  			<th nowrap>
+	  				<label>Author:</label>
+	  			</th>
+	  			<td>
+	  				<a href="&#109;a&#105;l&#116;&#111;:&#99;&#97;&#105;&#108;&#111;&#110;&#103;&#113;&#117;&#110;&#64;&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;&#46;&#99;&#110;">Logan Cai</a>
+	  			</td>
+  			</tr>
+  			<tr>
+  				<th nowrap>
+  					<label>Template Designer:</label>
+  				</th>
+  				<td>
+  					<a href="&#109;a&#105;l&#116;&#111;:&#71;&#97;&#98;&#114;&#105;&#101;&#108;&#64;&#52;&#118;&#46;&#99;&#111;&#109;&#46;&#98;&#114;">Gabriel</a>
+  				</td>
+  			</tr>
+  			<tr>
+  				<th  nowrap>
+  					<label>Official Website:</label>
+  				</th>
+  				<td>
+  					<a href="http://www.phpletter.com">http://www.phpletter.com</a>
+  				</td>
+  			</tr>
+  			<tr>
+  				<th  nowrap>
+  					<label>Support Forum:</label>
+  				</th>
+  				<td>
+  					<a href="http://www.phpletter.com/forum/">http://www.phpletter.com/forum/</a>
+  				</td>
+  			</tr>
+  			<tr>
+  				<th nowrap>
+  					<label>&copy;Copyright:</label>
+  				</th>
+  				<td>
+  					All copyright declarations in the source must remain unchange. Please contact us if you need to make changes to it, in order to avoid any Legal Issues.  
+  				</td>
+  			</tr>
+  		</tbody>
+  	</table>
+  		</div>  	
+
+
+  	</div>
+  </div>
+  <div id="contextMenu" style="display:none">
+  	<ul>
+  		<li><a href="#" class="contentMenuItem" id="menuSelect"><?php echo MENU_SELECT; ?></a></li>
+  		<li><a href="#" class="contentMenuItem"  id="menuPreview"><?php echo MENU_PREVIEW; ?></a></li>
+  		<li><a href="#" class="contentMenuItem"  id="menuDownload"><?php echo MENU_DOWNLOAD; ?></a></li>
+  		<li><a href="#" class="contentMenuItem"  id="menuRename"><?php echo MENU_RENAME; ?></a></li>
+  		<li><a href="#" class="contentMenuItem"  id="menuEdit"><?php echo MENU_EDIT; ?></a></li>
+  		<li><a href="#" class="contentMenuItem"  id="menuCut"><?php echo MENU_CUT; ?></a></li>
+  		<li><a href="#" class="contentMenuItem" id="menuCopy"><?php echo MENU_COPY; ?></a></li>
+  		<li><a href="#" class="contentMenuItem"  id="menuPaste"><?php echo MENU_PASTE; ?></a></li>
+  		<li><a href="#" class="contentMenuItem"  id="menuDelete"><?php echo MENU_DELETE; ?></a></li>
+  		<li><a href="#" class="contentMenuItem"  id="menuPlay"><?php echo MENU_PLAY; ?></a></li>
+  	</ul>
+  </div>
+</body>
+</html>

+ 0 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/debug.html


+ 48 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.auth.php

@@ -0,0 +1,48 @@
+<?php 
+/**
+ * the purpose I added this class is to make the file system much flexible 
+ * for customization.
+ * Actually,  this is a kind of interface and you should modify it to fit your system
+ * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+ * @link www.phpletter.com
+ * @since 4/August/2007
+ */
+	class Auth
+	{
+		var $__loginIndexInSession = 'ajax_user';
+		function __construct()
+		{
+			
+		}
+		
+		function Auth()
+		{
+			$this->__construct();
+		}
+		/**
+		 * check if the user has logged
+		 *
+		 * @return boolean
+		 */
+		function isLoggedIn()
+		{
+			return (!empty($_SESSION[$this->__loginIndexInSession])?true:false);
+		}
+		/**
+		 * validate the username & password
+		 * @return boolean
+		 *
+		 */
+		function login()
+		{
+			if($_POST['username'] == CONFIG_LOGIN_USERNAME && $_POST['password'] == CONFIG_LOGIN_PASSWORD)
+			{
+				$_SESSION[$this->__loginIndexInSession] = true;
+				return true;
+			}else 
+			{
+				return false;
+			}
+		}
+	}
+?>

+ 436 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.file.php

@@ -0,0 +1,436 @@
+<?php
+	/**
+	 * file modification
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+	class file
+	{
+		var $fileInfo = "";
+		var $filePath = "";
+		var $fileStat = "";
+		var $mask = '0775';
+		var $debug = false;
+		var $errors = array();
+		/**
+		 * constructor
+		 *
+		 * @param string $path the path to a file or folder
+		 */
+		function __construct($path = null)
+		{
+			if(!is_null($path))
+			{
+			if(file_exists($path))
+			{
+				$this->filePath = $path;
+				if(is_file($this->filePath))
+				{
+					$this->fileStat = @stat($path);
+					$this->fileInfo['size'] = $this->fileStat[7];
+					$this->fileInfo['atime'] = $this->fileStat[8];
+					$this->fileInfo['ctime'] = $this->fileStat[10];	
+					$this->fileInfo['mtime'] = $this->fileStat[9];
+					$this->fileInfo['path'] = $path;
+					$this->fileInfo['name'] = basename($path);	
+					$this->fileInfo['is_writable'] = $this->isWritable();
+					$this->fileInfo['is_readable'] = $this->isReadable();
+				}elseif(is_dir($this->filePath))
+				{
+					$this->fileStat = @stat($path);
+					$this->fileInfo['name'] = basename($path);
+					$this->fileInfo['path'] = $path;
+					$this->fileInfo['atime'] = $this->fileStat[8];
+					$this->fileInfo['ctime'] = $this->fileStat[10];	
+					$this->fileInfo['mtime'] = $this->fileStat[9];
+					$this->fileInfo['is_writable'] = $this->isWritable();
+					$this->fileInfo['is_readable'] = $this->isReadable();					
+				}
+			}else 
+			{
+				trigger_error('No such file exists. ' . $path, E_USER_NOTICE);	
+			}				
+			}
+
+
+			
+		}
+		/**
+		 * contructor
+		 *
+		 * @param string $path
+		 */
+		function file($path=null)
+		{
+			$this->__construct($path);
+		}
+		
+		
+		/**
+		 * check if a file or folder writable
+		 *
+		 * @param file path $path
+		 * @return boolean
+		 */
+	function isWritable($path=null)
+	{
+		$path = (is_null($path)?$this->filePath:$path);		
+		if (DIRECTORY_SEPARATOR == "\\")
+		{
+			$path = slashToBackslash($path);
+			if(is_file($path))
+			{
+				$fp = @fopen($path,'ab');
+				if($fp)
+				{
+					@fclose($fp);
+					return true;
+				}
+			}elseif(is_dir($path))
+			{
+					$path = addTrailingSlash($path);
+					$tmp = uniqid(time());
+					if (@touch($path . $tmp)) 
+					{
+						@unlink($path . $tmp);
+						return true;
+					}			
+			}
+			return false;			
+		}else 
+		{
+			return @is_writable(slashToBackslash($path));
+		}
+
+	}
+	/**
+	 * Returns true if the files is readable.
+	 *
+	 * @return boolean true if the files is readable.
+	 */
+	function isReadable($path =null) 
+	{
+		$path = is_null($path)?$this->filePath:$path;
+		return @is_readable(slashToBackslash($path));
+	}		
+	/**
+	 * change the modified time
+	 *
+	 * @param string $path
+	 * @param string $time
+	 * @return boolean
+	 */
+	function setLastModified($path=null, $time) 
+	{
+		$path = is_null($path)?$this->filePath:$path;
+		$time = is_null($time)?time():$time;
+		return @touch(slashToBackslash($path), $time);
+	}
+
+		/**
+		 * create a new folder
+		 *
+		 * @path the path for the new folder
+		 * @mask
+		 * @dirOwner
+		 * @return boolean
+		 */
+		function mkdir($path = null, $mask=null, $dirOwner='') 
+		{
+			$path = is_null($path)?$this->filePath:$path;
+			if(!file_exists($path))
+			{
+				$mask = is_null($mask)?$this->mask:$mask;				
+				$status = @mkdir(slashToBackslash($path));			
+				if ($mask)
+				{
+					@chmod(slashToBackslash($path), intval($mask, 8));
+				}					
+				if($dirOwner)
+				{
+					$this->chown(slashToBackslash($path), $dirOwner);
+				}
+				return $status;				
+			}
+			return true;
+
+		}	
+	/**
+	 * change the own of a file or folder
+	 *
+	 * @param the file path $path
+	 * @param  $owner
+	 */
+	function chown($path, $owner) 
+	{
+		if(!empty($owner))
+		{
+			$owners = explode(":", $owner);
+			if(!empty($owners[0]))
+				@chown($path, $owners[0]);
+			if(!empty($owners[1]))
+				@chgrp($path, $owner[1]);
+		}
+	}	
+
+    /**
+         * Copy a file, or recursively copy a folder and its contents
+         * @author      Aidan Lister <aidan@php.net>
+         * @author      Paul Scott
+         * @version     1.0.1
+         * @param       string   $source    Source path
+         * @param       string   $dest      Destination path
+         * @return      bool     Returns TRUE on success, FALSE on failure
+         */
+    function copyTo($source, $dest)
+    {
+    	$source = removeTrailingSlash(backslashToSlash($source));
+    	$dest = removeTrailingSlash(backslashToSlash($dest));
+	 		if(!file_exists($dest) || !is_dir($dest))
+			{
+				if(!$this->mkdir($dest))
+				{
+					$this->_debug('Unable to create folder (' . $dest . ")");
+					return false;
+				}					
+			}
+					// Copy in to your self?
+				if (getAbsPath($source) ==  getAbsPath($dest))
+				{
+					$this->_debug('Unable to copy itself. source: ' . getAbsPath($source) . "; dest: " . getAbsPath($dest));
+					return false;		
+				}
+        // Simple copy for a file
+        if (is_file($source))
+        {        	
+        		$dest = addTrailingSlash($dest) . (basename($source));
+        	if(file_exists($dest))
+        	{
+        		return false;
+        	}else {
+        		
+        		return copy($source, $dest);
+        	}
+            
+            
+        }elseif(is_dir($source))
+        {
+	        // Loop through the folder
+	           if(file_exists(addTrailingSlash($dest) . basename($source)))
+	           {
+	           	return false;
+	           }else 
+	           {
+			 		if(!file_exists(addTrailingSlash($dest) . basename($source)) || !is_dir(addTrailingSlash($dest) . basename($source)))
+					{
+						if(!$this->mkdir(addTrailingSlash($dest) . basename($source)))
+						{
+							$this->_debug('Unable to create folder (' . addTrailingSlash($dest) . basename($source) . ")");
+							return false;
+						}					
+					}	        	
+		        $handle = opendir($source);
+		        while(false !== ($readdir = readdir($handle)))
+		        {
+		            if($readdir != '.' && $readdir != '..')
+		            {	  
+		            	$path = addTrailingSlash($source).'/'.$readdir;    
+		            	$this->copyTo($path, addTrailingSlash($dest) . basename($source));
+		            }
+		        }
+		         closedir($handle);
+		        return true;	           	
+	           }
+	
+        }		   
+        return false;
+    }	
+    /**
+     * get next available file name
+     *
+     * @param string $fileToMove the path of the file will be moved to
+     * @param string $destFolder the path of destination folder
+     * @return string
+     */
+    function getNextAvailableFileName($fileToMove, $destFolder)
+    {
+    	
+    	$folderPath = addslashes(backslashToSlash(getParentPath($fileToMove)));
+    	$destFolder = addslashes(backslashToSlash(getParentPath($destFolder)));
+    	$finalPath = $destFolder . basename($fileToMove);
+    	if(file_exists($fileToMove))
+    	{
+    		if(is_file())
+    		{
+    			$fileExt = getFileExt($fileToMove);
+    			$fileBaseName = basename($fileToMove, '.' . $fileExt);
+    			$count = 1;
+    			while(file_exists($destFolder . $fileBaseName . $count . "." . $fileExt))
+    			{
+    				$count++;
+    			}
+    			$filePath = $destFolder . $fileBaseName . $count . "." . $fileExt;
+    		}elseif(is_dir())
+    		{
+    			$folderName = basename($fileToMove);
+     			$count = 1;
+    			while(file_exists($destFolder . $folderName . $count))
+    			{
+    				$count++;
+    			}
+    			$filePath = $destFolder . $fileBaseName . $count;   			
+    		}
+    		
+    	}
+		return $finalPath;
+    }
+    /**
+     * get file information
+     *
+     * @return array
+     */
+    function getFileInfo()
+    {
+    	return $this->fileInfo;
+    }
+    /**
+     * close 
+     *
+     */
+    function close()
+    {
+    	$this->fileInfo = null;
+    	$this->fileStat = null;
+    }
+ 	/**
+	 * delete a file or a folder and all contents within that folder
+	 *
+	 * @param string $path
+	 * @return boolean
+	 */
+	function delete($path = null)
+	{
+		$path = is_null($path)?$this->filePath:$path;
+		if(file_exists($path))
+		{
+			if(is_file($path))
+			{
+				return @unlink($path);
+			}elseif(is_dir($path))
+			{
+				return $this->__recursive_remove_directory($path);
+			}
+			
+		}
+		return false;
+	}
+	/**
+	 * empty a folder
+	 *
+	 * @param string $path
+	 * @return boolean
+	 */
+	function emptyFolder($path)
+	{
+		$path = is_null($path)?$this->filePath:"";
+		if(file_exists($path) && is_dir($path))
+		{
+			return $this->__recursive_remove_directory($path, true);
+		}
+		return false;
+	}
+	
+	function _debug($info)
+	{
+		if($this->debug)
+		{
+			echo $info . "<br>\n";
+		}else 
+		{
+			$this->errors[] = $info;
+		}
+	}
+/**
+ * recursive_remove_directory( directory to delete, empty )
+ * expects path to directory and optional TRUE / FALSE to empty
+ * of course PHP has to have the rights to delete the directory
+ * you specify and all files and folders inside the directory
+ * 
+ * to use this function to totally remove a directory, write:
+ * recursive_remove_directory('path/to/directory/to/delete');
+ * to use this function to empty a directory, write:
+ *	recursive_remove_directory('path/to/full_directory',TRUE);
+ * @param string $directory
+ * @param boolean $empty
+ * @return boolean
+ */
+ function __recursive_remove_directory($directory, $empty=FALSE)
+ {
+     // if the path has a slash at the end we remove it here
+     if(substr($directory,-1) == '/')
+     {
+         $directory = substr($directory,0,-1);
+     }
+  
+     // if the path is not valid or is not a directory ...
+     if(!file_exists($directory) || !is_dir($directory))
+     {
+         // ... we return false and exit the function
+         return FALSE;
+  
+     // ... if the path is not readable
+     }elseif(!is_readable($directory))
+     {
+         // ... we return false and exit the function
+         return FALSE;
+  
+     // ... else if the path is readable
+     }else{
+  
+         // we open the directory
+         $handle = @opendir($directory);
+  
+         // and scan through the items inside
+         while (FALSE !== ($item = @readdir($handle)))
+         {
+             // if the filepointer is not the current directory
+             // or the parent directory
+             if($item != '.' && $item != '..')
+             {
+                 // we build the new path to delete
+                 $path = $directory.'/'.$item;
+  
+                 // if the new path is a directory
+                 if(is_dir($path))                  {
+                     // we call this function with the new path
+                     $this->__recursive_remove_directory($path);
+  
+                 // if the new path is a file
+                 }else{
+                    // we remove the file
+                    @unlink($path);
+                 }
+             }
+         }
+         // close the directory
+         @closedir($handle);
+  
+        // if the option to empty is not set to true
+         if($empty == FALSE)
+         {
+             // try to delete the now empty directory
+             if(!@rmdir($directory))
+             {
+                 // return false if not possible
+                 return FALSE;
+             }
+         }
+         // return success
+         return TRUE;
+     }
+ }   		
+	}
+
+?>

+ 155 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.history.php

@@ -0,0 +1,155 @@
+<?php
+	/**
+	 * class history
+	 * this class used to keep records of any changed to uploaded images under a session
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	class History
+	{
+		var $history = array(); //keep all changes
+		var $path = ''; //path to the iamge
+		var $session = null;
+		/**
+		 * constructor
+		 *
+		 * @param string $path the path to the image 
+		 * @param object $session an instance of session class
+		 */
+		function __construct($path, &$session)
+		{
+			$this->path = $path;
+			$this->session = &$session;
+			if(!isset($_SESSION[$this->path]))
+			{
+				$_SESSION[$this->path] = array();
+			}
+			
+		}
+		/**
+		 * constructor
+		 *
+		 * @param string $path the path to the image 
+		 * @param object $session an instance of session class
+		 */		
+		function History($path, &$session)
+		{
+			$this->__construct($path, $session);
+		}
+
+		/**
+		 * keep tracks of each changes made to an image
+		 *
+		 * @param string $key
+		 * @param string $info   array('name', 'restorable', 'is_original')
+		 */
+		function add($info)
+		{
+			$_SESSION[$this->path][] = $info;
+		}
+		/**
+		 * get the lastest changes for restore
+		 *
+		 * @return array array('name', 'restorable', 'is_original')
+		 */
+		function getNumRestorable()
+		{
+			$output = 0;
+			if(isset($_SESSION[$this->path]) && is_array($_SESSION[$this->path]))
+			{
+				foreach($_SESSION[$this->path] as $k=>$v)
+				{
+					if(!empty($v['restorable']) && empty($v['is_original']))
+					{
+						if(file_exists($this->session->getSessionDir() . $v['name']))
+						{
+							$output++;
+						}else 
+						{
+							
+						}
+						
+					}
+				}
+			}
+			return $output;
+		}
+
+		/**
+		 * get the path of image which keep the lastest changes
+		 *
+		 * @return  return empty array when failed
+		 */
+		function getLastestRestorable()
+		{
+			if(isset($_SESSION[$this->path]) && is_array($_SESSION[$this->path]) && sizeof($_SESSION[$this->path]))
+			{	
+				$sessionImages = array_reverse($_SESSION[$this->path], true);
+				$lastestKey = '';
+				foreach($sessionImages as $k=>$v)
+				{
+					if($v['restorable'] && empty($v['is_original']) && file_exists($this->session->getSessionDir() . $v['name']))
+					{
+						return $sessionImages[$k];
+					}
+				}							
+				
+			}
+			return  array();
+			
+		}
+		/**
+		 * get the original image which is kept in the session folder
+		 *
+		 * @return array
+		 */
+		function getOriginalImage()
+		{
+			$outputs = array();
+			if(isset($_SESSION[$this->path]) && is_array($_SESSION[$this->path]))
+			{
+				$sessionImages = array_reverse($_SESSION[$this->path], true);
+				foreach($sessionImages as $k=>$v)
+				{
+					if(!empty($v['is_original']))
+					{
+						if(file_exists($this->session->getSessionDir() . $v['name']))
+						{
+							return array('info'=>$_SESSION[$this->path][$k], 'key'=>$k);
+						}
+						
+					}
+				}
+			}	
+			return $outputs;
+				
+		}
+		/**
+		 * remove the lastest restorable state
+		 *
+		 * @return boolean
+		 */
+		function restore()
+		{
+			if(isset($_SESSION[$this->path]) && is_array($_SESSION[$this->path]) && sizeof($_SESSION[$this->path]))
+			{
+				$sessionImages = array_reverse($_SESSION[$this->path], true);
+				$lastestKey = '';
+				foreach($sessionImages as $k=>$v)
+				{
+					if($v['restorable'] && empty($v['is_original']))
+					{
+						unset($_SESSION[$k]);
+						return true;
+					}
+				}
+			}
+			return false;		
+		}
+
+		
+		
+	}
+?>

+ 789 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.image.php

@@ -0,0 +1,789 @@
+<?php
+	/**
+	 * this class provide functions to edit an image, e.g. resize, rotate, flip, crop
+	 * @author Logan Cai cailongqun [at] yahoo [dot] com [dot] cn
+	 * @link  www.phpletter.com
+	 * @version 0.9
+	 * @since 14/May/2007
+	 * @name Image
+	 * 
+	 */
+	
+	
+	
+	
+	class Image
+	{
+		var $_debug = false; 
+		var $_errors = array();
+		var $gdInfo = array(); //keep all information of GD extension
+		var $_imgOrig = null; //the hanlder of original image
+		var $_imgFinal = null; //the handler of final image
+		var $imageFile  = null;  
+    var $transparentColorRed = null;
+    var $transparentColorGreen = null;
+    var $transparentColorBlue = null;		 
+    var $chmod = 0755;
+    var $_imgInfoOrig = array(
+    	'name'=>'',
+    	'ext'=>'',
+    	'size'=>'',
+    	'width'=>'',
+    	'height'=>'',
+    	'type'=>'',
+    	'path'=>'',
+    );    
+    var $_imgInfoFinal = array(
+    	'name'=>'',
+    	'ext'=>'',
+    	'size'=>'',
+    	'width'=>'',
+    	'height'=>'', 
+    	'type'=>'',   
+    	'path'=>'',
+    );		
+		var $_imgQuality = 90;
+		/**
+		 * constructor
+		 *
+		 * @param boolean $debug
+		 * @return Image
+		 */
+		
+		function __construct($debug = false)
+		{
+			$this->enableDebug($debug);
+			$this->gdInfo = $this->getGDInfo();			
+		}
+		function Image($debug = false)
+		{
+			$this->__construct($debug);
+		}
+		/**
+		 * enable to debug
+		 *
+		 * @param boolean $value
+		 */
+		function enableDebug($value)
+		{
+			$this->_debug = ($value?true:false);
+		}
+		/**
+		 * check if debug enable
+		 * @return boolean
+		 */
+		function _isDebugEnable()
+		{
+			return $this->_debug;
+		}
+
+	    /**
+		 * append to errors array and shown the each error when the debug turned on  
+		 * 
+		 * @param  string $string
+		 * @return void
+     * @access private
+     * @copyright this function originally come from Andy's php 
+	 */
+    function _debug($value)
+    {
+    		$this->_errors[] = $value;
+        if ($this->_debug) 
+        {
+            echo $value . "<br />\n";
+        }
+    }		
+    /**
+     * show erros
+     *
+     */
+    function showErrors()
+    {
+    	if(sizeof($this->_errors))
+    	{
+    		foreach($this->_errors as $error)
+    		{
+    			echo $error . "<br />\n";
+    		}
+    	}
+    }
+    /**
+     * Load an image from the file system.
+     * 
+     * @param  string $filename
+     * @return bool 
+     * @access public
+     * @copyright this function originally come from Andy's php 
+     */
+    function loadImage($filename)
+    {
+        $ext  = strtolower($this->_getExtension($filename));
+        $func = 'imagecreatefrom' . ($ext == 'jpg' ? 'jpeg' : $ext);
+        if (!$this->_isSupported($filename, $ext, $func, false)) {
+            return false;
+        }
+        if($ext == "gif")
+        {
+             // the following part gets the transparency color for a gif file
+            // this code is from the PHP manual and is written by
+            // fred at webblake dot net and webmaster at webnetwizard dotco dotuk, thanks!
+            $fp = @fopen($filename, "rb");
+            $result = @fread($fp, 13);
+            $colorFlag = ord(substr($result,10,1)) >> 7;
+            $background = ord(substr($result,11));
+            if ($colorFlag) {
+                $tableSizeNeeded = ($background + 1) * 3;
+                $result = @fread($fp, $tableSizeNeeded);
+                $this->transparentColorRed = ord(substr($result, $background * 3, 1));
+                $this->transparentColorGreen = ord(substr($result, $background * 3 + 1, 1));
+                $this->transparentColorBlue = ord(substr($result, $background * 3 + 2, 1));
+            }
+            fclose($fp);
+            // -- here ends the code related to transparency handling   	
+        }
+        $this->_imgOrig = @$func($filename);
+        if ($this->_imgOrig == null) {
+            $this->_debug("The image could not be created from the '$filename' file using the '$func' function.");
+            return false;
+        }else 
+        {
+        	$this->imageFile = $filename;
+			    $this->_imgInfoOrig = array(
+			    	'name'=>basename($filename),
+			    	'ext'=>$ext,
+			    	'size'=>filesize($filename),
+			    	'path'=>$filename,
+			    );        	
+			    $imgInfo = $this->_getImageInfo($filename);
+			    if(sizeof($imgInfo))
+			    {
+			    	foreach($imgInfo as $k=>$v)
+			    	{
+			    		$this->_imgInfoOrig[$k] = $v;
+			    		$this->_imgInfoFinal[$k] = $v;
+			    	}
+			    }
+			    
+        }
+        return true;
+    }
+
+    /**
+     * Load an image from a string (eg. from a database table)
+     * 
+     * @param  string $string
+     * @return bool 
+     * @access public
+     * @copyright this function originally come from Andy's php 
+     */
+    function loadImageFromString($string)
+    {
+    		$this->imageFile = $filename;
+        $this->_imgOrig = imagecreatefromstring($string);
+        if (!$this->_imgOrig) {
+            $this->_debug('The image (supplied as a string) could not be created.');
+            return false;
+        }
+        return true;
+    }		
+    
+
+    /**
+     * Save the modified image
+     * 
+     * @param  string $filename 
+     * @param  int    $quality 
+     * @param  string $forcetype 
+     * @return bool 
+     * @access public
+     * @copyright this function originally come from Andy's php 
+     */
+    function saveImage($filename, $quality = 90, $forcetype = '')
+    {
+        if ($this->_imgFinal == null) {
+            $this->_debug('No changes intend to be made.');
+            return false;
+        }
+
+        $ext  = ($forcetype == '') ? $this->_getExtension($filename) : strtolower($forcetype);
+        $func = 'image' . ($ext == 'jpg' ? 'jpeg' : $ext);
+        if (!$this->_isSupported($filename, $ext, $func, true)) 
+        {
+            return false;
+        }
+        $saved = false;
+        switch($ext) 
+        {
+            case 'gif':
+                if ($this->gdInfo['Truecolor Support'] && imageistruecolor($this->_imgFinal)) 
+                {
+                    imagetruecolortopalette($this->_imgFinal, false, 255);
+                }
+            case 'png':
+                $saved = $func($this->_imgFinal, $filename);
+                break;
+            case 'jpg':
+                $saved = $func($this->_imgFinal, $filename, $quality);
+                break;
+        }
+
+        if ($saved === false) 
+        {
+            $this->_debug("The image could not be saved to the '$filename' file as the file type '$ext' using the '$func' function.");
+            return false;
+        }else 
+        {
+        	$this->_imgInfoFinal['size'] = @filesize($filename);
+        	@chmod($filename, intval($this->chmod, 8));
+        }
+
+        return true;
+    }    
+    /**
+     * Shows the masked image without any saving
+     * 
+     * @param  string $type 
+     * @param  int    $quality 
+     * @return bool 
+     * @access public
+     * @copyright this function originally come from Andy's php 
+     */
+    function showImage($type = '', $quality = '')
+    {
+        if ($this->_imgFinal == null) {
+            $this->_debug('There is no cropped image to show.');
+            return false;
+        }
+        $type = (!empty($type)?$type:$this->_imgInfoOrig['ext']);
+        $quality = (!empty($quality)?$quality:$this->_imgQuality);
+				
+        $type = strtolower($type);
+        $func = 'image' . ($type == 'jpg' ? 'jpeg' : $type);
+        $head = 'image/' . ($type == 'jpg' ? 'jpeg' : $type);
+        
+        if (!$this->_isSupported('[showing file]', $type, $func, false)) {
+            return false;
+        }
+
+        header("Content-type: $head");
+        switch($type) 
+        {
+            case 'gif':
+                if ($this->gdInfo['Truecolor Support'] && imageistruecolor($this->_imgFinal)) 
+                {
+                    @imagetruecolortopalette($this->_imgFinal, false, 255);
+                }
+            case 'png':
+                $func($this->_imgFinal);
+                break;
+            case 'jpg':
+                $func($this->_imgFinal, '', $quality);
+                break;
+        }
+        return true;
+    }    
+    
+    /**
+	 * Used for cropping image
+	 * 
+	 * @param  int $dst_x
+	 * @param  int $dst_y
+	 * @param  int $dst_w
+	 * @param  int $dst_h
+	 * @return bool
+     * @access public
+     * @copyright this function originally come from Andy's php 
+	 */  
+    function crop($dst_x, $dst_y, $dst_w, $dst_h)
+    {
+        if ($this->_imgOrig == null) {
+            $this->_debug('The original image has not been loaded.');
+            return false;
+        }
+        if (($dst_w <= 0) || ($dst_h <= 0)) {
+            $this->_debug('The image could not be cropped because the size given is not valid.');
+            return false;
+        }
+        if (($dst_w > imagesx($this->_imgOrig)) || ($dst_h > imagesy($this->_imgOrig))) {
+            $this->_debug('The image could not be cropped because the size given is larger than the original image.');
+            return false;
+        }
+        $this->_createFinalImageHandler($dst_w, $dst_h);
+        if ($this->gdInfo['Truecolor Support']) 
+        {
+            	if(!@imagecopyresampled($this->_imgFinal, $this->_imgOrig, 0, 0, $dst_x, $dst_y, $dst_w, $dst_h, $dst_w, $dst_h))
+            	{
+            		$this->_debug('Unable crop the image.');
+            		return false;
+            	}            
+        } else 
+        {
+          	if(!@imagecopyresized($this->_imgFinal, $this->_imgOrig, 0, 0, $dst_x, $dst_y, $dst_w, $dst_h, $dst_w, $dst_h))
+          	{
+           		$this->_debug('Unable crop the image.');
+          		return false;           		
+          	}
+            
+        }
+        $this->_imgInfoFinal['width'] = $dst_w;
+        $this->_imgInfoFinal['height'] = $dst_h;   
+        return true; 	
+    }
+  
+    
+	/**
+     * Resize the Image in the X and/or Y direction
+     * If either is 0 it will be scaled proportionally
+     *
+     * @access public
+     *
+     * @param mixed $new_x 
+     * @param mixed $new_y 
+     * @param boolean $constraint keep to resize the image proportionally
+     * @param boolean $unchangeIfsmaller keep the orignial size if the orignial smaller than the new size
+     * 
+     *
+     * @return mixed none or PEAR_error
+     */
+	function resize( $new_x, $new_y, $constraint= false, $unchangeIfsmaller=false)
+	{
+		if(!$this->_imgOrig)
+		{
+			$this->_debug('No image fould.');
+			return false;
+		}		
+		
+		$new_x = intval($new_x);
+		$new_y = intval($new_y);
+		if($new_x <=0 || $new_y <= 0)
+		{
+			$this->_debug('either of new width or height can be zeor or less.');
+		}else 
+		{
+		
+			if($constraint)
+			{
+				if($new_x < 1 && $new_y < 1)
+				{
+					$new_x = $this->_imgInfoOrig['width'];
+					$new_y = $this->_imgInfoOrig['height'];
+				}elseif($new_x < 1)
+				{
+					$new_x = floor($new_y / $this->_imgInfoOrig['height'] * $this->_imgInfoOrig['width']);
+	
+				}elseif($new_y < 1)
+				{
+					$new_y = floor($new_x / $this->_imgInfoOrig['width'] * $this->_imgInfoOrig['height']);
+				}else
+				{
+					$scale = min($new_x/$this->_imgInfoOrig['width'], $new_y/$this->_imgInfoOrig['height']) ;
+					$new_x = floor($scale*$this->_imgInfoOrig['width']);
+					$new_y = floor($scale*$this->_imgInfoOrig['height']);
+				}						
+			}
+			if($unchangeIfsmaller)
+			{
+				if($this->_imgInfoOrig['width'] < $new_x && $this->_imgInfoOrig['height'] < $new_y )
+				{
+					$new_x = $this->_imgInfoOrig['width'];
+					$new_y = $this->_imgInfoOrig['height'];
+				}
+			}
+		
+			
+			
+			if(is_null($this->_imgOrig))
+			{
+				$this->loadImage($filePath);
+			}
+			if(sizeof($this->_errors) == 0)
+			{
+				return $this->_resize($new_x, $new_y);
+			}			
+		}
+
+		return false;
+		
+	} // End resize    
+ 	/**
+     * resize the image and return the thumbnail image  details array("width"=>, "height"=>, "name")
+     *
+     * @param string $fileName 
+     * @param int $new_x the thumbnail width
+     * @param int $new_y the thumbnail height
+     * @param string $mode can be save, view and both
+     * @return unknown
+     */
+	function _resize( $new_x, $new_y) 
+	{
+		$this->_createFinalImageHandler($new_x, $new_y);
+    // hacks fot transparency of png24 files
+    if ($this->_imgInfoOrig['type'] == 'png') 
+    {    
+        @imagealphablending($this->_imgFinal, false);
+				if(function_exists('ImageCopyResampled'))
+				{
+					@ImageCopyResampled($this->_imgFinal, $this->_imgOrig, 0, 0, 0, 0, $new_x, $new_y, $this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']);
+				} else {
+					@ImageCopyResized($this->_imgFinal, $this->_imgOrig, 0, 0, 0, 0, $new_x, $new_y, $this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']);
+				} 
+        @imagesavealpha($this->_imgFinal, true);
+
+    }else 
+    {//for the rest image
+			if(function_exists('ImageCopyResampled'))
+			{
+				@ImageCopyResampled($this->_imgFinal, $this->_imgOrig, 0, 0, 0, 0, $new_x, $new_y, $this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']);
+			} else {
+				@ImageCopyResized($this->_imgFinal, $this->_imgOrig, 0, 0, 0, 0, $new_x, $new_y, $this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']);
+			}    	
+    }
+
+		
+		$this->_imgInfoFinal['width'] = $new_x;
+		$this->_imgInfoFinal['height'] = $new_y;
+		$this->_imgInfoFinal['name'] = basename($this->_imgInfoOrig['name']);
+		$this->_imgInfoFinal['path'] = $this->_imgInfoOrig['path'];		
+		if($this->_imgFinal)
+		{
+			return true;
+		}else 
+		{			
+			$this->_debug('Unable to resize the image on the fly.');
+			return false;
+							
+		}
+
+	}   
+    /**
+	 * Get the extension of a file name
+	 * 
+	 * @param  string $file
+ 	 * @return string
+     * @copyright this function originally come from Andy's php 
+	 */
+    function _getExtension($file)
+    {
+        $ext = '';
+        if (strrpos($file, '.')) {
+            $ext = strtolower(substr($file, (strrpos($file, '.') ? strrpos($file, '.') + 1 : strlen($file)), strlen($file)));
+        }
+        return $ext;
+    }
+
+	    /**
+		 * Validate whether image reading/writing routines are valid.
+		 * 
+		 * @param  string $filename
+		 * @param  string $extension
+		 * @param  string $function
+		 * @param  bool   $write
+		 * @return bool
+     * @access private
+     * @copyright this function originally come from Andy's php 
+	 */
+    function _isSupported($filename, $extension, $function, $write = false)
+    {
+
+       $giftype = ($write) ? ' Create Support' : ' Read Support';
+        $support = strtoupper($extension) . ($extension == 'gif' ? $giftype : ' Support');
+
+        if (!isset($this->gdInfo[$support]) || $this->gdInfo[$support] == false) {
+            $request = ($write) ? 'saving' : 'reading';
+            $this->_debug("Support for $request the file type '$extension' cannot be found.");
+            return false;
+        }
+        if (!function_exists($function)) {
+            $request = ($write) ? 'save' : 'read';
+            $this->_debug("The '$function' function required to $request the '$filename' file cannot be found.");
+            return false;
+        }
+
+        return true;
+    }
+    /**
+     * flip image horizotally or vertically
+     *
+     * @param string $direction
+     * @return boolean
+     */
+    function flip($direction="horizontal")
+    {
+				$this->_createFinalImageHandler($this->_imgInfoOrig['width'], $this->_imgInfoOrig['height']);
+			if($direction != "vertical")
+			{
+				$dst_x = 0;
+				$dst_y = 0;
+				$src_x = $this->_imgInfoOrig['width'] -1;
+				$src_y = 0;
+				$dst_w = $this->_imgInfoOrig['width'];
+				$dst_h = $this->_imgInfoOrig['height'];
+				$src_w = 0 - $this->_imgInfoOrig['width'];
+				$src_h = $this->_imgInfoOrig['height'];
+				
+			}else 
+			{
+				$dst_x = 0;
+				$dst_y = 0;
+				$src_x = 0;
+				$src_y = $this->_imgInfoOrig['height'] - 1;
+				$dst_w = $this->_imgInfoOrig['width'];
+				$dst_h = $this->_imgInfoOrig['height'];
+				$src_w = $this->_imgInfoOrig['width'];
+				$src_h = 0 - $this->_imgInfoOrig['height'];				
+			}			
+				if(function_exists('ImageCopyResampled')){
+					ImageCopyResampled($this->_imgFinal, $this->_imgOrig, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
+				} else {
+					ImageCopyResized($this->_imgFinal, $this->_imgOrig, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);
+				}
+				$this->_imgInfoFinal['width'] = $dst_w;
+				$this->_imgInfoFinal['height'] = $dst_h;
+				$this->_imgInfoFinal['name'] = basename($this->imageFile);
+				$this->_imgInfoFinal['path'] = $this->imageFile;		
+				if($this->_imgFinal)
+				{
+					return true;
+				}else 
+				{			
+					$this->_debug('Unable to resize the image on the fly.');	
+					return false;
+								
+				}   	
+    }
+    /**
+     * flip vertically
+     *
+     * @return boolean
+     */
+    function flipVertical()
+    {
+    	return $this->flip('vertical');
+    }
+    /**
+     * flip horizontal
+     *
+     * @return string
+     */
+    function flipHorizontal()
+    {
+    	return $this->flip('horizontal');
+    }
+
+
+    /**
+     * get the GD version information
+     *
+     * @param  bool $versionOnly
+     * @return array
+     * @access private
+     * @copyright this function originally come from Andy's php 
+     */
+    function getGDInfo($versionOnly = false)
+    {
+        $outputs = array();
+        if (function_exists('gd_info')) 
+        {
+            $outputs = gd_info();
+        } else 
+        {
+            $gd = array(
+                    'GD Version'         => '',
+                    'GIF Read Support'   => false,
+                    'GIF Create Support' => false,
+                    'JPG Support'        => false,
+                    'PNG Support'        => false,
+                    'FreeType Support'   => false,
+                    'FreeType Linkage'   => '',
+                    'T1Lib Support'      => false,
+                    'WBMP Support'       => false,
+                    'XBM Support'        => false       
+                    );
+            ob_start();
+            phpinfo();
+            $buffer = ob_get_contents();
+            ob_end_clean();
+            foreach (explode("\n", $buffer) as $line) {
+                $line = array_map('trim', (explode('|', strip_tags(str_replace('</td>', '|', $line)))));
+                if (isset($gd[$line[0]])) {
+                    if (strtolower($line[1]) == 'enabled') {
+                        $gd[$line[0]] = true;
+                    } else {
+                        $gd[$line[0]] = $line[1];
+                    }
+                }
+            }
+            $outputs = $gd;
+        }
+
+        if (isset($outputs['JIS-mapped Japanese Font Support'])) {
+            unset($outputs['JIS-mapped Japanese Font Support']);
+        }
+        if (function_exists('imagecreatefromgd')) {
+            $outputs['GD Support'] = true;
+        }
+        if (function_exists('imagecreatefromgd2')) {
+            $outputs['GD2 Support'] = true;
+        }
+        if (preg_match('/^(bundled|2)/', $outputs['GD Version'])) {
+            $outputs['Truecolor Support'] = true;
+        } else {
+            $outputs['Truecolor Support'] = false;
+        }
+        if ($outputs['GD Version'] != '') {
+            $match = array();
+            if (preg_match('/([0-9\.]+)/', $outputs['GD Version'], $match)) {
+                $foo = explode('.', $match[0]);
+                $outputs['Version'] = array('major' => isset($foo[0])?$foo[0]:'', 'minor' => isset($foo[1])?$foo[1]:'', 'patch' => isset($foo[2])?$foo:"");
+            }
+        }
+
+        return ($versionOnly) ? $outputs['Version'] : $outputs;
+    }    
+    
+    /**
+	 * Destroy the resources used by the images.
+	 * 
+	 * @param  bool $original
+	 * @return void
+     * @access public
+     * @copyright this function originally come from Andy's php 
+	 */
+    function DestroyImages($original = true)
+    {
+    		if(!is_null($this->_imgFinal))
+    		{
+    			@imagedestroy($this->_imgFinal);
+    		}        
+        $this->_imgFinal = null;
+        if ($original && !is_null($this->_imgOrig)) {
+            @imagedestroy($this->_imgOrig);
+            $this->_imgOrig = null;
+        }
+    } 
+    
+	function getImageInfo($imagePath)
+	{
+		return $this->_getImageInfo($imagePath);
+	}
+	/**
+     * get image information, e.g. width, height, type
+     * @access public
+     * @return array
+     */
+	function _getImageInfo($imagePath)
+	{
+		$outputs = array();
+		$imageInfo = @GetImageSize($imagePath);
+		if ($imageInfo && is_array($imageInfo))
+		{
+			switch($imageInfo[2]){
+				case 1:
+					$type = 'gif';
+					break;
+				case 2:
+					$type = 'jpeg';
+					break;
+				case 3:
+					$type = 'png';
+					break;
+				case 4:
+					$type = 'swf';
+					break;
+				case 5:
+					$type = 'psd';
+				case 6:
+					$type = 'bmp';
+				case 7:
+				case 8:
+					$type = 'tiff';
+				default:
+					$type = '';
+			}
+			$outputs['width'] = $imageInfo[0];
+			$outputs['height'] = $imageInfo[1];
+			$outputs['type'] = $type;
+			$outputs['ext'] = $this->_getExtension($imagePath);
+		} else {
+			$this->_debug('Unable locate the image or read images information.');
+		}
+		return $outputs;
+		
+	}
+	  function rotate($angle, $bgColor=0)
+    {
+    	$angle = intval($angle) -360;
+    		while($angle <0)
+    		{
+    			$angle += 360;
+    		}
+ 
+		
+         if($this->_imgFinal = imagerotate($this->_imgOrig, $angle))
+         {
+         	return true;
+         }else 
+         {
+         	return false;
+         }
+ 
+       
+    }
+	/**
+	 * get the original image info
+	 *
+	 * @return array
+	 */
+	function getOriginalImageInfo()
+	{
+		return $this->_imgInfoOrig;
+	}
+	/**
+	 * return the final image info
+	 *
+	 * @return array
+	 */
+	function getFinalImageInfo()
+	{
+		if($this->_imgInfoFinal['width'] == '')
+		{
+			if(is_null($this->_imgFinal))
+			{
+				$this->_imgInfoFinal = $this->_imgInfoOrig;
+			}else 
+			{
+				$this->_imgInfoFinal['width'] = @imagesx($this->_imgFinal);
+				$this->_imgInfoFinal['height'] = @imagesy($this->_imgFinal);
+			}
+		}
+		return $this->_imgInfoFinal;
+	}
+	
+    /**
+     *  create final image handler
+     *
+     *  @access private
+     *  @param $dst_w width
+     * 	@param $dst_h height
+     * 	@return boolean
+     * 	@copyright original from noname at nivelzero dot ro
+     */
+    function _createFinalImageHandler($dst_w, $dst_h)
+    {
+		 		if(function_exists('ImageCreateTrueColor'))
+		 		{
+					$this->_imgFinal = @ImageCreateTrueColor($dst_w,$dst_h);
+				} else {
+					$this->_imgFinal = @ImageCreate($dst_w,$dst_h);
+				}   
+        if (!is_null($this->transparentColorRed) && !is_null($this->transparentColorGreen) && !is_null($this->transparentColorBlue)) {
+        
+            $transparent = @imagecolorallocate($targetImageIdentifier, $this->transparentColorRed, $this->transparentColorGreen, $this->transparentColorBlue);
+            @imagefilledrectangle($this->_imgFinal, 0, 0, $dst_w, $dst_h, $transparent);
+            @imagecolortransparent($this->_imgFinal, $transparent);            
+        }
+        
+    }	
+	}
+	
+?>

+ 373 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.manager.php

@@ -0,0 +1,373 @@
+<?php
+/**
+	 * file listing
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "class.file.php");
+class manager
+{
+	var $currentFolderPath;
+	var $sessionAction = null; //object to session action
+	var $flags = array('no'=>'noFlag', 'cut'=>'cutFlag', 'copy'=>'copyFlag');
+	var $forceFolderOnTop = false; //forced to have folder shown on the top of the list
+	var $currentFolderInfo = array(
+	'name'=>'',
+	'subdir'=>0,
+	'file'=>0,
+	'ctime'=>'',
+	'mtime'=>'',
+	'is_readable'=>'',
+	'is_writable'=>'',
+	'size'=>0,
+	'path'=>'',
+	'type'=>'folder',
+	'flag'=>'noFlag',
+	'friendly_path'=>'',
+	);
+	
+	var $lastVisitedFolderPathIndex = 'ajax_last_visited_folder';
+	var $folderPathIndex = "path";
+	var $calculateSubdir = true;
+	var $fileTypes = array(
+			array(array("exe", "com"), "fileExe", SEARCH_TYPE_EXE, 0),
+			array(array("gif", "jpg", "png", "bmp", "tif"), "filePicture", SEARCH_TYPE_IMG, 1),
+			array(array("zip", "sit", "rar", "gz", "tar"), "fileZip", SEARCH_TYPE_ARCHIVE, 0),
+			array(array("htm", "html", "php", "jsp", "asp", 'js', 'css'), "fileCode", SEARCH_TYPE_HTML, 1),
+			array(array("mov", "ram", "rm", "asx", "dcr", "wmv"), "fileVideo", SEARCH_TYPE_VIDEO, 1),
+			array(array("mpg", "avi", "asf", "mpeg"), "fileVideo", SEARCH_TYPE_MOVIE, 1),
+			array(array("aif", "aiff", "wav", "mp3", "wma"), "fileMusic", SEARCH_TYPE_MUSIC, 1),
+			array(array("swf", 'flv'), "fileFlash", SEARCH_TYPE_FLASH, 1),
+			array(array("ppt"), "filePPT", SEARCH_TYPE_PPT, 0),
+			array(array("rtf"), "fileRTF", SEARCH_TYPE_DOC, 0),
+			array(array("doc"), "fileWord", SEARCH_TYPE_WORD, 0),
+			array(array("pdf"), "fileAcrobat", SEARCH_TYPE_PDF, 0),
+			array(array("xls", "csv"), "fileExcel", SEARCH_TYPE_EXCEL, 0),
+			array(array("txt"), "fileText", SEARCH_TYPE_TEXT, 1),
+			array(array("xml", "xsl", "dtd"), "fileXml", SEARCH_TYPE_XML, 1)
+	);
+	
+	/**
+		 * constructor
+		 * @path the path to a folder
+		 * @calculateSubdir force to get the subdirectories information
+		 */		
+	function __construct($path = null, $calculateSubdir=true)
+	{
+
+		$this->calculateSubdir = $calculateSubdir;
+		if(defined('CONFIG_SYS_FOLDER_SHOWN_ON_TOP'))
+		{
+			$this->forceFolderOnTop = CONFIG_SYS_FOLDER_SHOWN_ON_TOP;
+		}
+		if(!is_null($path))
+		{
+			$this->currentFolderPath = $path;
+
+		}elseif(isset($_GET[$this->folderPathIndex]) && file_exists($_GET[$this->folderPathIndex]) && !is_file($_GET[$this->folderPathIndex]) )
+		{
+			$this->currentFolderPath = $_GET[$this->folderPathIndex];
+		}
+		elseif(isset($_SESSION[$this->lastVisitedFolderPathIndex]) && file_exists($_SESSION[$this->lastVisitedFolderPathIndex]) && !is_file($_SESSION[$this->lastVisitedFolderPathIndex]))
+		{
+			$this->currentFolderPath = $_SESSION[$this->lastVisitedFolderPathIndex];
+		}else
+		{
+			$this->currentFolderPath = CONFIG_SYS_DEFAULT_PATH;
+		}
+		
+		$this->currentFolderPath = (isUnderRoot($this->currentFolderPath)?backslashToSlash((addTrailingSlash($this->currentFolderPath))):CONFIG_SYS_DEFAULT_PATH);
+		
+		if($this->calculateSubdir)
+		{// keep track of this folder path in session 
+			$_SESSION[$this->lastVisitedFolderPathIndex] = $this->currentFolderPath;
+		}
+		if(is_dir($this->currentFolderPath))
+		{
+			$file = new file($this->currentFolderPath);
+			$folderInfo = $file->getFileInfo();
+			if(sizeof($folderInfo))
+			{
+				$this->currentFolderInfo['name']=basename($this->currentFolderPath);
+				$this->currentFolderInfo['subdir']=0;
+				$this->currentFolderInfo['file']=0;
+				$this->currentFolderInfo['ctime']=$folderInfo['ctime'];
+				$this->currentFolderInfo['mtime']=$folderInfo['mtime'];
+				$this->currentFolderInfo['is_readable']=$folderInfo['is_readable'];
+				$this->currentFolderInfo['is_writable']=$folderInfo['is_writable'];	
+				$this->currentFolderInfo['path']  = $this->currentFolderPath;
+				$this->currentFolderInfo['friendly_path'] = transformFilePath($this->currentFolderPath);
+				$this->currentFolderInfo['type'] = "folder";
+				$this->currentFolderInfo['cssClass']='folder';
+				
+				//$this->currentFolderInfo['flag'] = $folderInfo['flag'];
+			}			
+		}
+		if($calculateSubdir && !file_exists($this->currentFolderPath))
+		{
+			die(ERR_FOLDER_NOT_FOUND . $this->currentFolderPath);
+		}
+
+
+	
+	}
+	
+	function setSessionAction(&$session)
+	{
+		$this->sessionAction = $session;	
+	}
+	/**
+		 * constructor
+		 */
+	function manager($path = null, $calculateSubdir=true)
+	{
+		$this->__construct($path, $calculateSubdir);
+	}
+	/**
+		 * get current folder path
+		 * @return  string
+		 */
+	function getCurrentFolderPath()
+	{
+		return $this->currentFolderPath;
+	}
+	/**
+		 * get the list of files and folders under this current fold
+		 *	@return array
+		 */
+	function getFileList()
+	{
+		$outputs = array();
+		$files = array();
+		$folders = array();
+		$tem = array();
+		$dirHandler = @opendir($this->currentFolderPath);
+		if($dirHandler)
+		{
+			while(false !== ($file = readdir($dirHandler)))
+			{
+				if($file != '.' && $file != '..')
+				{
+					$flag = $this->flags['no'];
+				
+					if($this->sessionAction->getFolder() == $this->currentFolderPath)
+					{//check if any flag associated with this folder or file
+						$folder = addTrailingSlash(backslashToSlash($this->currentFolderPath));
+						if(in_array($folder . $file, $this->sessionAction->get()))
+						{
+							if($this->sessionAction->getAction() == "copy")
+							{
+								$flag = $this->flags['copy'];
+							}else 
+							{
+								$flag = $this->flags['cut'];
+							}
+						}
+					}					
+					$path=$this->currentFolderPath.$file;
+					if(is_dir($path) && isListingDocument($path) )
+					{
+						$this->currentFolderInfo['subdir']++;
+						if(!$this->calculateSubdir)
+						{			
+						}else 
+						{
+							
+								$folder = $this->getFolderInfo($path);
+								$folder['flag'] = $flag;
+								$folders[$file] = $folder;
+								$outputs[$file] = $folders[$file];							
+						}
+
+						
+					}elseif(is_file($path) && isListingDocument($path))
+					{
+
+							$obj = new file($path);
+							$tem = $obj->getFileInfo();
+							if(sizeof($tem))
+							{
+								$fileType = $this->getFileType($file);
+								foreach($fileType as $k=>$v)
+								{
+									$tem[$k] = $v;
+								}
+								$this->currentFolderInfo['size'] += $tem['size'];
+								$this->currentFolderInfo['file']++;		
+								$tem['path'] = backslashToSlash($path);		
+								$tem['type'] = "file";
+								$tem['flag'] = $flag;
+								$files[$file] = $tem;
+								$outputs[$file] = $tem;
+								$tem = array();
+								$obj->close();
+								
+							}							
+
+				
+					}
+					
+				}
+			}
+			if($this->forceFolderOnTop)
+			{
+				uksort($folders, "strnatcasecmp");
+				uksort($files, "strnatcasecmp");
+				$outputs = array();
+				foreach($folders as $v)
+				{
+					$outputs[] = $v;
+				}
+				foreach ($files as $v)
+				{
+					$outputs[] = $v;
+				}
+			}else 
+			{
+				uksort($outputs, "strnatcasecmp");
+			}
+			
+			@closedir($dirHandler);
+		}else
+		{
+			trigger_error('Unable to locate the folder ' . $this->currentFolderPath, E_NOTICE);
+		}
+		return $outputs;
+	}
+
+
+	/**
+	 * get current or the specified dir information
+	 *
+	 * @param string $path
+	 * @return array
+	 */
+	function getFolderInfo($path=null)
+	{
+		if(is_null($path))
+		{
+			return $this->currentFolderInfo;
+		}else 
+		{
+			$obj = new manager($path, false);
+			$obj->setSessionAction($this->sessionAction);
+			$obj->getFileList();
+			return $obj->getFolderInfo();			
+		}
+
+	}
+
+		/**
+		 * return the file type of a file.
+		 *
+		 * @param string file name
+		 * @return array
+		 */
+		function getFileType($fileName, $checkIfDir = false) 
+		{
+			
+			$ext = strtolower($this->_getExtension($fileName, $checkIfDir));
+			
+			foreach ($this->fileTypes as $fileType) 
+			{
+				if(in_array($ext, $fileType[0]))
+				{
+					return array("cssClass" => $fileType[1], "fileType" => $fileType[2], "preview" => $fileType[3], 'test'=>5);
+				}
+			}
+			if(!empty($fileName))
+			{//this is folder
+				if(empty($ext))
+				{
+					if(is_dir($fileName))
+					{
+
+						return array("cssClass" => ($checkIfDir && $this->isDirEmpty($fileName)?'folderEmpty':"folder") , "fileType" => "Folder", "preview" => 0, 'test'=>1);
+					}else 
+					{
+						return array("cssClass" => "fileUnknown", "fileType" => SEARCH_TYPE_UNKNOWN, "preview" => 0, 'test'=>2);
+					}
+				}else 
+				{
+					return array("cssClass" => "fileUnknown", "fileType" => SEARCH_TYPE_UNKNOWN, "preview" => 0, 'test'=>3, 'ext'=>$ext , 'filename'=>$fileName);
+				}
+				
+			}else
+			{//this is unknown file
+				return array("cssClass" => "fileUnknown", "fileType" => SEARCH_TYPE_UNKNOWN, "preview" => 0, 'test'=>4);
+			}
+		
+		
+		}
+
+	/**
+		 * return the predefined file types
+		 *
+		 * @return arrray
+		 */
+	function getFileTypes()
+	{
+		return $this->fileTypes;
+	}
+	/**
+		 * print out the file types
+		 *
+		 */
+	function printFileTypes()
+	{
+		foreach($fileTypes as $fileType)
+		{
+			if(isset($fileType[0]) && is_array($fileType[0]))
+			{
+				foreach($fileType[0] as $type)
+				{
+					echo $type. ",";
+				}
+			}
+		}
+	}
+
+    /**
+	 * Get the extension of a file name
+	 * 
+	 * @param  string $file
+ 	 * @return string
+     * @copyright this function originally come from Andy's php 
+	 */
+    function _getExtension($file, $checkIfDir = false)
+    {
+    	if($checkIfDir && file_exists($file) && is_dir($file))
+    	{
+    		return '';
+    	}else 
+    	{
+    		return @substr(@strrchr($file, "."), 1);
+    	}
+    	
+    	
+    }	
+
+	function isDirEmpty($path)
+	{
+		$dirHandler = @opendir($path);
+		if($dirHandler)
+		{
+			while(false !== ($file = readdir($dirHandler)))
+			{
+				if($file != '.' && $file != '..')
+				{
+					@closedir($dirHandler);
+					return false;
+					
+				}
+			}
+			
+			@closedir($dirHandler);
+				
+		}	
+		return true;	
+	}
+}
+?>

+ 584 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.pagination.php

@@ -0,0 +1,584 @@
+<?php
+/**
+ * Pagination Class
+ * @author Logan Cai  (cailongqun [at] yahoo [dot] com [dot] cn)
+ * @since 27/Nov/20006
+ *
+ */
+class pagination
+{
+	var $totalItems = 0;
+	var $itemsPerPage = 30;
+	var $currentPage = 1;
+	var $friendlyUrl = false;
+	var $baseUrl = "";
+	var $pageIndex = "page";
+	var $groupLimit = 5;
+	var $excludedQueryStrings = array();
+	var $totalPages = 0;
+	var $url = "";
+	var $previousText = "Previous";
+	var $nextText = "Next";
+	var $lastText = "Last";
+	var $firstText = "First";
+	var $limitIndex ='limit';
+	var $limits = array(5, 10, 20, 30, 50, 80, 150, 999);
+
+
+	/**
+	 * Contructor
+	 *
+	 * @param boolean $friendlyUrl set the returned url
+	 * as search engine friendly or Normal Url
+	 */
+	function pagination($friendlyUrl=false)
+	{
+		$this->friendlyUrl = $friendlyUrl;
+		$this->__resetCurrentPage();
+	}
+
+	/**
+	 * set maximum number of items per page
+	 *
+	 * @param integer $value maximum number of items per page
+	 */
+	function setLimit($value)
+	{
+		$this->itemsPerPage = intval($value);
+	}
+	/**
+	 * get maximum number of items per page
+	 *
+	 * @return integer
+	 */
+	function getLimit()
+	{
+		return $this->itemsPerPage;
+	}
+
+	/**
+	 * set the total number of items
+	 *
+	 * @param integer $value the total number of items
+	 */
+	function setTotal($value)
+	{
+		$this->totalItems = intval($value);
+	}
+	/**
+	 * get the total number of items
+	 *
+	 * @return integer total number of items
+	 */
+	function getTotal()
+	{
+		return $this->totalItems;
+	}
+	/**
+	 * get total pages will be used to display all records
+	 *
+	 */
+	function getTotalPages()
+	{
+
+		$output = floor(($this->totalItems / $this->itemsPerPage ));
+		if($this->totalItems % $this->itemsPerPage)
+		{
+			$output++;
+		}
+		return $output;
+	}
+
+	/**
+	 * Set the index of URL Query String
+	 *
+	 * @param string $value e.g. page
+	 */
+	function setPageIndex($value)
+	{
+		$this->pageIndex = $value;
+		$this->__resetCurrentPage();
+	}
+
+
+	function getPageIndex()
+	{
+		return $this->pageIndex;
+	}
+	/**
+	 * initiate or reset the current page number
+	 *
+	 */
+	function __resetCurrentPage()
+	{
+		$this->currentPage = ((isset($_GET[$this->pageIndex]) && intval($_GET[$this->pageIndex]) > 0)?intval($_GET[$this->pageIndex]):1);
+	}
+
+	/**
+	 * set the base url used in the links, default is $PHP_SELF
+	 *
+	 * @param string $value the base url
+	 */
+	function setUrl($value="")
+	{
+		if(empty($value))
+		{
+			if($this->friendlyUrl)
+			{
+				$this->url = "http://" . $_SERVER['HTTP_HOST'] . "/";
+			}else
+			{
+				$this->url = $_SERVER['PHP_SELF'];
+			}
+		}else
+		{
+			$this->url = $value;
+		}
+
+	}
+
+	/**
+	 * get the base url variable
+	 *
+	 * @return string the base url
+	 */
+	function getUrl()
+	{
+
+		if(empty($this->url))
+		{
+			$this->setUrl();
+
+		}
+		return $this->url;
+	}
+
+	/**
+	 * set base url for pagination links after exculed those keys
+	 * identified on excluded query strings
+	 */
+	function __setBaseUrl()
+	{
+
+		if(empty($this->url))
+		{
+			$this->getUrl();
+		}
+
+		if($this->friendlyUrl)
+		{
+			$this->baseUrl = $this->getUrl();
+		}else
+		{
+
+			$appendingQueryStrings = array();
+			$this->excludedQueryStrings[$this->pageIndex] =$this->pageIndex;
+			foreach($_GET as $k=>$v)
+			{
+				if((array_search($k, $this->excludedQueryStrings) === false ))
+				{
+					$appendingQueryStrings[$k] = $k . "=" . $v;
+				}
+			}
+			if(sizeof($appendingQueryStrings))
+			{
+				$this->baseUrl = $this->__appendQueryString($this->url, implode("&", $appendingQueryStrings));
+			}else
+			{
+				$this->baseUrl = $this->getUrl();
+			}
+
+		}
+
+
+	}
+	/**
+	 * get base url for pagination links aftr excluded those key
+	 * identified on excluded query strings
+	 *
+	 */
+	function __getBaseUrl()
+	{
+
+		if(empty($this->baseUrl))
+		{
+
+			$this->__setBaseUrl();
+		}
+		return $this->baseUrl;
+	}
+
+
+	/**
+	 * get the first item number
+	 *
+	 * @return interger the first item number displayed within current page
+	 */
+	function getFirstItem()
+	{
+		$output = 0;
+		$temStartItemNumber = (($this->currentPage - 1) * $this->itemsPerPage + 1);
+		if($this->totalItems && $temStartItemNumber <= $this->totalItems )
+		{
+
+			$output = $temStartItemNumber;
+		}
+		return $output;
+	}
+	/**
+	 * get the last item number displayed within current page
+	 *
+	 * @return interger the last item number
+	 */
+	function getLastItem()
+	{
+		$output = 0;
+		$temEndItemNumber = (($this->currentPage) * $this->itemsPerPage);
+		if($this->totalItems)
+		{
+			if($temEndItemNumber <= $this->totalItems)
+			{
+				$output = $temEndItemNumber;
+			}else
+			{
+				$output = $this->totalItems;
+			}
+
+		}
+		return $output;
+	}
+	/**
+	 * set  page groupings limit
+	 * used for previous 1 2 3 4 5 next
+	 *
+	 * @param unknown_type $value
+	 */
+	function setGroupLimit($value)
+	{
+		$this->groupLimit = intval($value);
+	}
+	/**
+	 * get page grouping limit
+	 *
+	 * @return integer the page grouping limit
+	 */
+	function getGroupLimit()
+	{
+		return $this->groupLimit;
+	}
+	/**
+	 * get the page offset number
+	 * used for Query . e.g SELECT SQL_CALC_FOUND_ROWS *
+	 * 						FROM mytable LIMIT getPageOffset(), getItemsPerPage()
+	 *
+	 * @return iner
+	 */
+	function getPageOffset()
+	{
+		return (($this->currentPage - 1)  * $this->itemsPerPage);
+	}
+	/**
+	 * get the last url if any
+	 * @return  string the last url
+	 */
+	function getLastUrl()
+	{
+
+		$url = "";
+		$totalPages = $this->getTotalPages();
+		if($this->currentPage < $totalPages)
+		{
+			$url = $this->__getBaseUrl();
+
+			if($this->friendlyUrl)
+			{
+				$url .= $this->pageIndex . $totalPages . "/";
+			}else
+			{
+				$url = $this->__appendQueryString($url, $this->pageIndex . "=" . $totalPages);
+			}
+			$url = sprintf('<a href="%s" class="pagination_last"><span>%s</span></a>',
+			$url,
+			$this->lastText);
+		}
+		return $url;
+	}
+
+
+
+
+	/**
+	 * get the first url if any
+	 * @return string the first url
+	 */
+
+	function getFirstUrl()
+	{
+		$url = "";
+		if($this->currentPage > 1)
+		{
+			$url = $this->__getBaseUrl();
+			if($this->friendlyUrl)
+			{
+				$url .= $this->pageIndex .  "1/";
+			}else
+			{
+				$url = $this->__appendQueryString($url, $this->pageIndex . "=1");
+			}
+			$url = sprintf('<a href="%s" class="pagination_first"><span>%s</span></a>',
+			$url,
+			$this->firstText);
+
+		}
+		return $url;
+	}
+
+	/**
+	 * get the previous page url if anywhere
+	 *
+	 * @param array $excludedQueryStrings excluded the value from $_GET
+	 * @return string the previous page url
+	 */
+	function getPreviousUrl()
+	{
+		$url = "";
+		if($this->currentPage > 1 && $this->totalItems > 0 )
+		{
+			$url = $this->__getBaseUrl();
+			if($this->friendlyUrl)
+			{
+				$url .= $this->pageIndex . ($this->currentPage - 1) . "/";
+			}else
+			{
+				$url = $this->__appendQueryString($url, $this->pageIndex . "=" . ($this->currentPage -1));
+			}
+			$url = sprintf('<a href="%s" class="pagination_previous"><span>%s</span></a>',
+			$url,
+			$this->previousText);
+
+		}
+
+		return $url;
+	}
+	/**
+	 * get the next page url if anywhere
+	 *
+	 * @param array $excludedQueryStrings excluded the value from $_GET
+	 * @return string the next page url
+	 */
+	function getNextUrl()
+	{
+		$url = "";
+		if($this->totalItems > ($this->currentPage * $this->itemsPerPage))
+		{
+			$url = $this->__getBaseUrl();
+			if($this->friendlyUrl)
+			{
+				$url .= $this->pageIndex . ($this->currentPage + 1) . "/";
+			}else
+			{
+				$url = $this->__appendQueryString($url, $this->pageIndex . "=" . ($this->currentPage + 1));
+			}
+			$url = sprintf('<a href="%s" class="pagination_next"><span>%s</span></a>',
+			$url,
+			$this->nextText);
+		}
+		return $url;
+
+	}
+
+	/**
+	 * get the group page links  e.g. 1,2,3,4,5
+	 * return format
+	 * <a class="pagination_group" href='yoururl'>1</a>
+	 * <a class="pagination_group active" href='#'>2</a>
+	 * <a class="pagination_group" href='yoururl'>3</a>
+	 */
+	function getGroupUrls()
+	{
+		$output = "";
+		if($this->totalItems > 0)
+		{
+			$displayedPages = 0;
+			$url = $this->__getBaseUrl();
+			$totalPages = $this->getTotalPages();
+			// find halfway point
+			$groupLimitHalf = floor($this->groupLimit / 2);
+			// determine what item/page we start with
+			$itemStart = $this->currentPage - $groupLimitHalf;
+			$itemStart = ($itemStart > 0 && $itemStart <= $totalPages)?$itemStart:1;
+			$itemEnd = $itemStart;
+
+			while($itemEnd < ($itemStart + $this->groupLimit - 1) && $itemEnd < $totalPages)
+			{
+				$itemEnd++;
+			}
+
+
+			if($totalPages > ($itemEnd - $itemStart))
+			{
+				for($i = $itemStart; $i > 1 && ($itemEnd - $itemStart + 1) < $this->groupLimit; $i--)
+				{
+					$itemStart--;
+				}
+			}
+
+			for($item = $itemStart; $item <= $itemEnd; $item++)
+			{
+				if($item != $this->currentPage)
+				{//it is not the active link
+					if($this->friendlyUrl)
+					{
+						$temUrl = $url . $this->pageIndex . $item .   "/";
+					}else
+					{
+						$temUrl  = $this->__appendQueryString($url, $this->pageIndex . "=" . $item);
+					}
+					$output .= sprintf(' <a class="pagination_group" href="%s"><span>%d</span></a> ', $temUrl, $item);
+				}else
+				{//active link
+					$output .= sprintf(' <a class="pagination_group pagination_active" href="#"><span>%d</span></a> ', $item);
+				}
+			}
+		}
+		return $output;
+	}
+	/**
+	 * set the text of previous page link
+	 *
+	 * @param string $value
+	 */
+	function setPreviousText($value)
+	{
+		$this->previousText = $value;
+	}
+	/**
+	 * set the text of first page link
+	 *
+	 * @param string $value
+	 */
+	function setFirstText($value)
+	{
+		$this->firstText = $value;
+	}
+	/**
+	 * set the text of next page link
+	 *
+	 * @param string $value
+	 */
+
+	function setNextText($value)
+	{
+		$this->nextText = $value;
+	}
+	/**
+	 * set the text of last page link
+	 *
+	 * @param string $value
+	 */
+	function setLastText($value)
+	{
+		$this->lastText = $value;
+	}
+
+	/**
+	 * set the excluded query string from $_GET;
+	 *
+	 * @param array the lists of the query string keys
+	 */
+
+	function setExcludedQueryString($values = array())
+	{
+		$this->excludedQueryStrings = $values;
+	}
+
+	function getExcludedQueryString()
+	{
+		return $this->excludedQueryStrings;
+	}
+
+
+	/**
+	 * add extra query stiring to a url
+	 * @param string $baseUrl
+	 * @param string $extra the query string added to the base url
+	 */
+	function __appendQueryString($baseUrl, $extra)
+	{
+		$output = trim($baseUrl);
+		if(strpos($baseUrl, "?") !== false)
+		{
+			$output .= "&" . $extra;
+		}else
+		{
+			$output .= "?" . $extra;
+		}
+		return $output;
+	}
+	/**
+	 * return the html
+	 *
+	 * @param integer $type
+	 */
+	function getPaginationHTML($type=1, $cssClass="pagination")
+	{
+		$output = '';
+		$output .= "<div class=\"pagination_content\"><p class=\"$cssClass\">\n";
+		switch($type)
+		{
+			case "2":
+				$output .= "<span class=\"pagination_summany\">" . $this->getFirstItem() . " to " . $this->getLastItem() . " of " . $this->getTotal() . " results.</span> ";	
+			if($previousUrl = $this->getPreviousUrl())
+			{
+				$output .= " " . $previousUrl;
+			}
+
+			if($nextUrl = $this->getNextUrl())
+			{
+				$output .= " " . $nextUrl;
+			}							
+				break;
+			case 1:
+				//get full summary pagination
+			default:
+				$output .= "<span class=\"pagination_summany\">" . $this->getFirstItem() . "/" . $this->getLastItem() . " (" . $this->getTotal() . ")</span> ";
+			if($firstUrl = $this->getFirstUrl())
+			{
+				$output .= " " . $firstUrl;
+			}
+			if($previousUrl = $this->getPreviousUrl())
+			{
+				$output .= " " . $previousUrl;
+			}
+
+			if($groupUrls = $this->getGroupUrls())
+			{
+				$output .= " " . $groupUrls;
+			}
+			if($nextUrl = $this->getNextUrl())
+			{
+				$output .= " " . $nextUrl;
+			}
+			if($lastUrl = $this->getLastUrl())
+			{
+				$output .= " " . $lastUrl;
+			}
+			$itemPerPage = '';
+			$itemPerPage .= "<select name=\"" . $this->limitIndex . "\" id=\"limit\" class=\"input inputLimit\" onchange=\"changePaginationLimit();\">\n";
+			foreach ($this->limits as $v)
+			{
+				$itemPerPage .= "<option value=\"" . $v . "\" " . ($v==$this->itemsPerPage?'selected="selected"':'') . ">" . $v . "</option>\n";
+			}
+			$itemPerPage .= "</select>\n"; 
+			$output .= "<span class=\"pagination_items_per_page\">";
+			$output .= sprintf(PAGINATION_ITEMS_PER_PAGE, $itemPerPage);
+			$output .= "</span>";
+			$output .= "<span class=\"pagination_parent\"><a href=\"#\" onclick=\"goParentFolder();\" id=\"pagination_parent_link\" title=\"" . PAGINATION_GO_PARENT . "\">&nbsp;</a></span>";
+		}
+
+		$output .= "</p></div>";
+		return $output;
+	}
+
+}
+?>

+ 184 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.search.php

@@ -0,0 +1,184 @@
+<?php
+	include_once(CLASS_FILE);
+	require_once(CLASS_SESSION_ACTION);
+	require_once(CLASS_MANAGER);
+	class Search
+	{
+		var $rootFolder = '';
+		var $files = array();
+		var $rootFolderInfo = array();
+		var $searchkeywords = array(
+			'mtime_from'=>'',
+			'mtime_to'=>'',
+			'name'=>'',
+			'size_from'=>'',
+			'size_to'=>'',
+			'recursive'=>'0',
+			
+		);
+		var $sessionAction = null;
+		/**
+		 * constructor
+		 *
+		 * @param string $rootFolder
+		 */
+		function __construct($rootFolder)
+		{
+			$this->rootFolder = $rootFolder;
+			$this->sessionAction = new SessionAction();
+			$objRootFolder = new file($this->rootFolder);
+			$tem = $objRootFolder->getFileInfo();
+			$obj = new manager($this->rootFolder, false);			
+			$obj->setSessionAction($this->sessionAction);
+			$selectedDocuments = $this->sessionAction->get();					
+			$fileType = $obj->getFolderInfo($this->rootFolder);
+			
+			foreach($fileType as $k=>$v)
+			{
+				$tem[$k] = $v;
+			}
+			
+			$tem['path'] = backslashToSlash($this->rootFolder);		
+			$tem['type'] = (is_dir($this->rootFolder)?'folder':'file');
+			$tem['size'] = (is_dir($this->rootFolder)?'':transformFileSize(@filesize($this->rootFolder)));
+			//$tem['ctime'] = date(DATE_TIME_FORMAT, $tem['ctime']);
+			//$tem['mtime'] = date(DATE_TIME_FORMAT, $tem['mtime']);
+			$tem['flag'] = (array_search($tem['path'], $selectedDocuments) !== false?($this->sessionAction->getAction() == "copy"?'copyFlag':'cutFlag'):'noFlag');
+			$tem['url'] = getFileUrl($this->rootFolder);
+			$tem['friendly_path'] = transformFilePath($this->rootFolder);
+			$tem['file'] = 0;
+			$tem['subdir'] = 0;
+			$manager = null;
+			$this->rootFolderInfo = $tem;
+			$tem = null;			
+		}
+		
+		
+		
+		/**
+		 * constructor
+		 *
+		 * @param string $rootFolder
+		 */
+		function Search($rootFolder)
+		{
+			$this->__construct($rootFolder);
+		}
+
+		/**
+		 * change the search keyword individually
+		 *
+		 * @param string $key
+		 * @param string $value
+		 */
+		function addSearchKeyword($key, $value)
+		{
+			$this->searchkeywords[$key] = $value;
+		}
+		/**
+		 * change the search keywords 
+		 *
+		 * @param array $keywords
+		 */
+		function addSearchKeywords($keywords)
+		{
+			foreach($this->searchkeywords as $k=>$v)
+			{
+				if(array_key_exists($k, $keywords) !== false)
+				{
+					$this->searchkeywords[$k] = $keywords[$k];
+				}
+			}
+		}
+		/**
+		 * get the file according to the search keywords
+		 *
+		 */
+		function doSearch($baseFolderPath = null)
+		{
+			
+			$baseFolderPath = addTrailingSlash(backslashToSlash((is_null($baseFolderPath)?$this->rootFolder:$baseFolderPath)));
+			
+			$dirHandler = @opendir($baseFolderPath);
+			if($dirHandler)
+			{
+				while(false !== ($file = readdir($dirHandler)))
+				{
+					if($file != '.' && $file != '..')
+					{
+						$path = $baseFolderPath . $file;
+						if(is_file($path))
+						{
+							$isValid = true;
+
+							$fileTime = @filemtime($path);
+							$fileSize = @filesize($path);	
+							if($this->searchkeywords['name'] !== ''  && @eregi($this->searchkeywords['name'], $file) === false)
+							{
+								$isValid = false;
+							}
+							if($this->searchkeywords['mtime_from'] != '' && $fileTime < @strtotime($this->searchkeywords['mtime_from']))
+							{
+								$isValid = false;
+							}
+							if($this->searchkeywords['mtime_to'] != '' && $fileTime > @strtotime($this->searchkeywords['mtime_to']))
+							{
+								$isValid = false;
+							}							
+							if($this->searchkeywords['size_from'] != '' && $fileSize < @strtotime($this->searchkeywords['size_from']))
+							{
+								$isValid = false;
+							}
+							if($this->searchkeywords['size_to'] != '' && $fileSize > @strtotime($this->searchkeywords['size_to']))
+							{
+								$isValid = false;
+							}			
+							if($isValid && isListingDocument($path))
+							{
+								$finalPath = $path;
+								$objFile = new file($finalPath);
+								$tem = $objFile->getFileInfo();
+								$obj = new manager($finalPath, false);			
+								$obj->setSessionAction($this->sessionAction);
+								$selectedDocuments = $this->sessionAction->get();													
+								$fileType = $obj->getFileType($finalPath);
+								
+								foreach($fileType as $k=>$v)
+								{
+									$tem[$k] = $v;
+								}
+								
+								$tem['path'] = backslashToSlash($finalPath);		
+								$tem['type'] = (is_dir($finalPath)?'folder':'file');
+								$tem['size'] = transformFileSize($tem['size']);
+								$tem['ctime'] = date(DATE_TIME_FORMAT, $tem['ctime']);
+								$tem['mtime'] = date(DATE_TIME_FORMAT, $tem['mtime']);
+								$tem['flag'] = (array_search($tem['path'], $selectedDocuments) !== false?($this->sessionAction->getAction() == "copy"?'copyFlag':'cutFlag'):'noFlag');
+								$tem['url'] = getFileUrl($tem['path']);
+								$this->rootFolderInfo['file']++;
+								$manager = null;
+								$this->files[] = $tem;
+								$tem = null;								
+							}
+						}elseif(is_dir($path) && $this->searchkeywords['recursive'])
+						{
+							$this->Search($baseFolderPath);
+						}
+					}
+				}
+			}
+			 
+		}
+		
+		function getFoundFiles()
+		{
+			return $this->files;
+		}
+		
+		function getRootFolderInfo()
+		{
+
+			return $this->rootFolderInfo;
+		}
+	}
+?>

+ 229 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.session.php

@@ -0,0 +1,229 @@
+<?php
+
+	/**
+	 * this class provide a function like session handling engine
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "class.file.php");
+class Session 
+{
+    var $lifeTime;
+    var $fp = null;
+    var $dir = null;
+    var $mTime = null;
+    var $sessionDir = null;
+    var $sessionFile = null;
+    var $ext = '.txt';
+    var $gcCounter = 5; //call gc to delete expired session each ten request
+		var $gcCounterFileName = 'gc_counter.ajax.php';
+		var $gcCounterFile = null;
+		var $gcLogFileName = 'gc_log.ajax.php';
+		var $gcLogFile = null;
+		var $debug = true; //turn it on when you want to see gc log
+		
+		
+    /**
+     * constructor
+     *
+     */
+    function __construct()
+    {
+    	//check if the session folder read and writable
+    		$dir = new file();
+	        if(!file_exists(CONFIG_SYS_DIR_SESSION_PATH))
+	        {
+	           if(!$dir->mkdir(CONFIG_SYS_DIR_SESSION_PATH))
+	           {
+	              die('Unable to create session folder.');
+	           }
+	        }
+    		if(!$dir->isReadable(CONFIG_SYS_DIR_SESSION_PATH))
+    		{
+    			die('Permission denied: ' . CONFIG_SYS_DIR_SESSION_PATH . " is not readable.");
+    		}    		
+    		if(!$dir->isWritable(CONFIG_SYS_DIR_SESSION_PATH))
+    		{
+    			die('Permission denied: ' . CONFIG_SYS_DIR_SESSION_PATH . " is not writable.");
+    		}
+    	$this->dir = backslashToSlash(addTrailingSlash(CONFIG_SYS_DIR_SESSION_PATH));
+        $this->lifeTime = get_cfg_var("session.gc_maxlifetime");  
+        $this->gcCounterFile = $this->dir . $this->gcCounterFileName; 
+        $this->gcLogFile = $this->dir  . $this->gcLogFileName;
+       	$this->sessionDir = backslashToSlash($this->dir.session_id().DIRECTORY_SEPARATOR);
+        $this->init();    	
+    }
+     /**
+     * constructor
+     *
+     */   
+    function Session() 
+    {
+    		$this->__construct();        
+    }
+    /**
+     * session init
+     * @return boolean
+     */
+    function init() 
+    {
+
+        
+        
+    }
+    
+    function gc()
+    {
+     		//init the counter file
+        $fp = @fopen($this->gcCounterFile, 'a+');
+        if($fp)
+        {
+        	$count = intval(fgets($fp, 999999)) + 1;
+        	if($count > $this->gcCounter || rand(0, 23) == date('h'))
+        	{
+        		$this->_gc();
+        		$count = 0;
+        	}
+        	@ftruncate($fp, 0);
+        	if(!@fputs($fp, $count))
+        	{
+        		die(SESSION_COUNTER_FILE_WRITE_FAILED);
+        	}
+        	@fclose($fp);
+        }else 
+        {
+        	die(SESSION_COUNTER_FILE_CREATE_FAILED);
+        }   	
+    }
+
+    /**
+     * garbage collection function
+     *
+     */
+    function _gc() 
+    {
+			//remove expired file from session folder
+	 		$dirHandler = @opendir($this->dir);
+	 		$output = '';
+	 		$output .= "gc start at " . date('d/M/Y H:i:s') . "\n";
+	 		$fo = new file();
+			if($dirHandler)
+			{
+				while(false !== ($file = readdir($dirHandler)))
+				{
+					if($file != '.' && $file != '..' && $file != $this->gcCounterFileName && $file != $this->gcLogFileName && $file != session_id() )
+					{						
+						$path=$this->dir.$file;
+						$output .= $path ;
+						//check if this is a expired session file
+						if(filemtime($path) + $this->lifeTime < time())
+						{							
+							if($fo->delete($path))
+							{
+								$output .= ' Deleted at ' . date('d/M/Y H:i:s');
+							}else 
+							{
+								$output .= " Failed at " . date('d/M/Y H:i:s');
+							}																			
+						}
+						$output .= "\n";
+											
+					}
+				}
+				if($this->debug)
+				{
+					$this->_log($output);
+				}
+				
+				@closedir($dirHandler);
+
+			} 
+			if(CONFIG_SYS_DEMO_ENABLE)
+			{
+				//remove expired files from uploaded folder
+		 		$dirHandler = @opendir(CONFIG_SYS_ROOT_PATH);
+		 		$output = '';
+		 		$output .= "gc start at " . date('d/M/Y H:i:s') . "\n";
+		 		$fo = new file();
+				if($dirHandler)
+				{
+					while(false !== ($file = readdir($dirHandler)))
+					{
+						if($file != '.' && $file != '..')
+						{						
+							$path=CONFIG_SYS_ROOT_PATH.$file;
+							$output .= $path ;
+							//check if this is a expired session file
+							if(filemtime($path) + $this->lifeTime < time())
+							{							
+								if($fo->delete($path))
+								{
+									$output .= ' Deleted at ' . date('d/M/Y H:i:s');
+								}else 
+								{
+									$output .= " Failed at " . date('d/M/Y H:i:s');
+								}																			
+							}
+							$output .= "\n";
+												
+						}
+					}
+					if($this->debug)
+					{
+						$this->_log($output);
+					}
+					
+					@closedir($dirHandler);
+	
+				}					
+			}
+		    
+    }
+    /**
+     * log action taken by the gc
+     *
+     * @param unknown_type $msg
+     */
+    function _log($msg)
+    {
+    	$msg = "<?php die(); ?>\n" . $msg;
+    	$fp = @fopen($this->gcLogFile, 'w+');
+    	if($fp)
+    	{
+    		@ftruncate($fp, 0);
+    		!@fputs($fp, $msg);
+    		@fclose($fp);
+    	}
+    }
+    
+    /**
+     * get the current session directory
+     *
+     * @return string return empty if failed
+     */
+    function getSessionDir()
+    {
+    	if(!file_exists($this->sessionDir) && !is_dir($this->sessionDir))
+    	{
+    		$dir = new file();
+    		if(!$dir->mkdir($this->sessionDir))
+    		{
+    			return '';
+    		}
+    	}else 
+    	{
+	     	if(!@is_dir($this->sessionDir))
+	    	{
+	    		return '';
+	    	}   		
+    	}
+    	return $this->sessionDir;
+    }
+    
+
+    
+}
+?>

+ 93 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.sessionaction.php

@@ -0,0 +1,93 @@
+<?php
+/**
+	 *Session Action Class 
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/May/2007
+	 *
+	 */
+	class SessionAction
+	{
+		var $actionIndex = 'ajax_file_action';
+		var $selectedDocIndex = 'ajax_selected_doc';
+		var $fromFolderIndex = 'ajax_from_folder';
+		function __construct()
+		{
+			if(!isset($_SESSION[$this->actionIndex]))
+			{
+				$_SESSION[$this->actionIndex] = '';
+			}
+			if(!isset($_SESSION[$this->selectedDocIndex]) || !is_array($_SESSION[$this->selectedDocIndex]))
+			{
+				$_SESSION[$this->selectedDocIndex] = array();
+			}
+			if(!isset($_SESSION[$this->fromFolderIndex]))
+			{
+				$_SESSION[$this->fromFolderIndex] = '';
+			}
+		}
+		
+		function SessionAction()
+		{
+			$this->__construct();
+		}
+		/**
+		 * count the  number of selected documents
+		 *
+		 */
+		function count()
+		{
+			return (isset($_SESSION[$this->selectedDocIndex])?sizeof($_SESSION[$this->selectedDocIndex]):0);
+		}
+		/**
+		 * assign the selected documents
+		 *
+		 * @param array $selectedDocuments
+		 */
+		function set($selectedDocuments)
+		{
+			$_SESSION[$this->selectedDocIndex] = $selectedDocuments;
+
+		}
+		/**
+		 * get the selected documents
+		 * @return array
+		 */
+		function get()
+		{
+			return (isset($_SESSION[$this->selectedDocIndex])?$_SESSION[$this->selectedDocIndex]:array());
+		}
+		
+		function setAction($action)
+		{
+			$_SESSION[$this->actionIndex] = $action;			
+		}
+		/**
+		 * get the action
+		 *
+		 * @return unknown
+		 */
+		function getAction()
+		{
+			return (isset($_SESSION[$this->actionIndex])?$_SESSION[$this->actionIndex]:'');
+		}
+		/**
+		 * set the folder
+		 *
+		 * @param string $folder
+		 */
+		function setFolder($folder)
+		{
+			$_SESSION[$this->fromFolderIndex] = $folder;
+		}
+		/**
+		 * get the folder
+		 *
+		 * @return string
+		 */
+		function getFolder()
+		{
+			return (isset($_SESSION[$this->fromFolderIndex])?$_SESSION[$this->fromFolderIndex]:'');
+		}
+	}
+?>

+ 589 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/class.upload.php

@@ -0,0 +1,589 @@
+<?php
+	/**
+	 * This class provide all file upload functionalities
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+class Upload
+{
+	var $fileType = ""; //the file type
+	var $originalFileName = "";
+	var $fileName = ""; //the file final name
+	var $fileExtension = "";
+	var $img_x = 0;
+	var $img_y = 0;
+	var $img_new_x = 0;
+	var $img_new_y = 0;
+	var $imgHandler = null;
+	var $fileBaseName = ""; //file name without the file extension and .
+	var $filePath = ""; //the file path which the file uploaded to
+	var $fileSize = 0;
+	var $validImageExts = array("gif", "jpg", "png");
+	var $errors = array();
+	var $_value  = null;  //an array holding the uploaded file details
+	var $dirPath = "";
+	var $invalidFileExt = array(); //var $invalidFileExt = array('php,inc,asp,aspx');
+	var $errCode = "";
+	var $safeMode;
+	var $uploadFileMode = 0755;
+	var $errorCodes = array(
+		0=>'the file uploaded with success',
+		1=>'The uploaded file exceeds the upload_max_filesize directive in php.ini',
+		2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
+		3=>'The uploaded file was only partially uploaded',
+		4=>'No file was uploaded.',
+		6=>'Missing a temporary folder',
+		7=>'Failed to write file to disk',
+		8=>'File upload stopped by extension',
+		999=>'No error code avaiable',
+	);
+	
+
+	function Upload()
+	{
+		//doing nothing
+	}
+	
+	function isFileUploaded($indexInPost="file")
+	{
+		
+		$this->errCode = isset($_FILES[$indexInPost]['error'])?$_FILES[$indexInPost]['error']:999;
+		if((isset($_FILES[$indexInPost]['error']) && $_FILES[$indexInPost] == 0) ||
+		(!empty($_FILES[$indexInPost]['tmp_name']) && $_FILES[$indexInPost]['tmp_name'] != 'none')
+		)
+		{
+			$this->_value = $_FILES[$indexInPost];
+			$this->fileSize = @filesize($this->_value['tmp_name']);
+			$this->originalFileName = $this->_value['name'];
+			$this->fileType = $this->_value['type'];
+			
+			return true;
+		}else 
+		{
+			
+			array_push($this->errors, 'Unable to upload file');
+			return false;
+		}		
+	}
+	
+	function getErrorCodeMsg()
+	{
+		return (isset($this->errorCodes[$this->errCode])?$this->errorCodes[$this->errCode]:"");
+	}
+	/**
+	 * check if the uploaded file extension is allowed against the validFile Extension
+	 * or against the invalid extension list when the list of valid file extension is not set
+	 *
+	 * @param array $validFileExt
+	 * @return boolean
+	 */
+	function isPermittedFileExt($validFileExt = array())
+	{
+		$tem = array();
+
+		if(sizeof($validFileExt))
+		{
+			foreach($validFileExt as $k=>$v)
+			{
+				$tem[$k] = strtolower(trim($v));
+			}
+		}
+		$validFileExt = $tem;
+
+		if(sizeof($validFileExt) && sizeof($this->invalidFileExt))
+		{
+			foreach($validFileExt as  $k=>$ext)
+			{
+				if(array_search(strtolower($ext), $this->invalidFileExt) !== false)
+				{
+					unset($validFileExt[$k]);
+				}
+			}
+		}
+		
+	
+
+		
+		if(sizeof($validFileExt))
+		{
+			if(array_search(strtolower($this->getFileExt()), $validFileExt) !== false)
+			{
+				return true;
+			}
+		}elseif(array_search(strtolower($this->getFileExt()), $this->invalidFileExt) === false)
+		{
+			return true;
+		}
+
+		
+		$this->deleteUploadedFile();
+		return false;
+		
+	}
+	/**
+	 * check if the uploaded file size is too big
+	 *
+	 * @param integer $maxSize
+	 */
+	function isSizeTooBig($maxSize="")
+	{
+		if($this->fileSize > $maxSize)
+		{
+			$this->deleteUploadedFile();
+			return true;
+		}else 
+		{
+			return false;
+		}
+	}
+	/**
+	 * set the invali file extensions
+	 *
+	 * @param array $invalidFileExt
+	 */
+	function setInvalidFileExt($invalidFileExt=array())
+	{
+		$tem = array();
+		if(sizeof($invalidFileExt))
+		{
+			foreach($invalidFileExt as $k=>$v)
+			{
+				$tem[$k]= strtolower(trim($v));
+			}
+		}
+		
+		$this->invalidFileExt = $tem;
+	}
+	/**
+	 * get file type
+	 *
+	 * @return string
+	 */
+	function getFileType()
+	{
+		return $this->fileType;
+	}
+	/**
+	 * get a file extension
+	 *
+	 * @param string $fileName the path to a file or just the file name
+	 */	
+	function getFileExt()
+	{
+		//return strtolower(substr(strrchr($this->fileName, "."), 1));
+		return substr(strrchr($this->originalFileName, "."), 1);
+	}
+	/**
+		 * move the uploaded file to a specific location
+		 *
+		 * @param string $dest  the path to the directory which the uploaded file will be moved to
+		 * @param string $fileBaseName the base name which the uploaded file will be renamed to
+		 * @param unknown_type $overwrite
+		 * @return unknown
+		 */
+	function moveUploadedFile($dest, $fileBaseName = '', $overwrite=false)
+	{
+		//ensure the directory path ending with /
+		if ($dest != ''  && substr($dest, -1) != '/') {
+			$dest .= '/';
+		}
+		$this->dirPath = $dest;
+		$fileName =  basename($this->_value['name']);
+
+		$dotIndex = strrpos($fileName, '.');
+		$this->fileExtension = '';
+		if(is_int($dotIndex))
+		{
+			$this->fileExtension = substr($fileName, $dotIndex);
+			$this->fileBaseName = substr($fileName, 0, $dotIndex);
+		}
+		if(!empty($fileBaseName))
+		{
+			$this->fileBaseName = $fileBaseName;
+		}
+		$fileName = $this->fileBaseName . $this->fileExtension;
+		$filePath = $dest . $fileName;
+
+		if(!$overwrite && file_exists($filePath) && is_file($filePath))
+		{//rename
+
+			$counter = 0;
+			while(file_exists($dest.$fileName) && is_file($dest .$fileName))
+			{
+				$counter++;
+				$fileName = $this->fileBaseName.'_'.$counter.$this->fileExtension;
+			}
+			$this->fileBaseName .= "_" . $counter;
+
+		}
+
+		if (@move_uploaded_file($this->_value['tmp_name'], $dest . $fileName)) {
+			@chmod($dest . $fileName, $this->uploadFileMode);
+			$this->fileName = $fileName;
+			$this->filePath = $dest . $fileName;
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+
+	/**
+		 * check if the uploaded is permitted to upload
+		 *
+		 * @param mixed $invalidImageExts invalid image extension
+		 * @param bool $delete force to delete the uploaded file
+		 */	
+	function isImage($invalidImageExts = array(), $delete = true)
+	{
+		if(!is_array($invalidImageExts) && !empty($invalidImageExts))
+		{
+			$invalidImageExts = explode(",", $invalidImageExts);
+		}
+		foreach ($invalidImageExts as $k=>$v)
+		{
+			$invalidImageExts[$k] = strtolower(trim($v));
+		}
+		foreach ($this->validImageExts as $k=>$v)
+		{
+			$ValidImageExts[$k] = strtolower(trim($v));
+		}
+		if(sizeof($invalidImageExts))
+		{
+			foreach ($ValidImageExts as $k=>$v)
+			{
+				if(array_search(strtolower($v), $invalidImageExts) !== false)
+				{
+					unset($ValidImageExts[$k]);
+				}
+			}
+		}
+		if(array_search(strtolower($this->getFileExt()), $ValidImageExts)!==false)
+		{
+			$this->_get_image_details($this->filePath);
+			if(!empty($this->fileType))
+			{
+				return true;
+			}
+		}else
+		{
+			if($delete)
+			{
+				$this->deleteUploadedFile();
+			}
+		}
+
+		array($this->errors, "This file is not a image type file.");
+		return false;
+	}
+
+	/**
+     * Resize the Image in the X and/or Y direction
+     * If either is 0 it will be scaled proportionally
+     *
+     * @access public
+     *
+     * @param mixed $new_x 
+     * @param mixed $new_y 
+     * @param string $thumb_suffix
+     *
+     * @return mixed none or PEAR_error
+     */
+	function resize($filePath, $thumb_suffix="", $new_x = 0, $new_y = 0)
+	{
+		
+		if(empty($filePath))
+		{
+			$filePath = $this->dirPath . $this->fileBaseName . $thumb_suffix  . $this->fileExtension;
+		}
+		// 0 means keep original size
+		if ($this->img_x > $this->img_y)
+		$new_y = intval($new_y/$this->img_x*$this->img_y);
+		else if ($this->img_y > $this->img_x)
+		$new_x = intval($new_x/$this->img_y*$this->img_x);
+		// Now do the library specific resizing.
+		return $this->_resize($filePath,$new_x, $new_y);
+	} // End resize
+
+	/**
+     * resize the image and return the thumbnail image  details array("width"=>, "height"=>, "name")
+     *
+     * @param string $fileName 
+     * @param int $new_x the thumbnail width
+     * @param int $new_y the thumbnail height
+     * @return unknown
+     */
+	function _resize($fileName, $new_x, $new_y) {
+		$functionName = 'ImageCreateFrom' . $this->fileType;
+
+
+		if(function_exists($functionName))
+		{
+			$this->imgHandler = $functionName($this->filePath);
+		}else
+		{
+			array_push($this->errors, $functionName . " function is unavailable");
+			return false;
+		}
+
+		if(function_exists('ImageCreateTrueColor')){
+			$new_img =ImageCreateTrueColor($new_x,$new_y);
+		} else {
+			$new_img =ImageCreate($new_x,$new_y);
+		}
+		if(function_exists('ImageCopyResampled')){
+			ImageCopyResampled($new_img, $this->imgHandler, 0, 0, 0, 0, $new_x, $new_y, $this->img_x, $this->img_y);
+		} else {
+			ImageCopyResized($new_img, $this->imgHandler, 0, 0, 0, 0, $new_x, $new_y, $this->img_x, $this->img_y);
+		}
+		if($this->_imageSave($new_img, $fileName, 80))
+		{
+			return array("width"=>$new_x, "height"=>$new_y, "name"=>basename($fileName));
+		}else
+		{
+
+			array_push($this->errors, "Unable to resize the image");
+			return false;
+		}
+
+	}
+	/**
+		 * save the thumbnail file and destroy the opened image
+		 *
+		 * @param resource $newImageHandler
+		 * @param string $fileName
+		 * @param int $quality
+		 * @return boolean
+		 */
+	function _imageSave($newImageHandler, $fileName, $quality = 90)
+	{
+		$functionName = 'image' . $this->fileType;
+		if($functionName($newImageHandler, $fileName, $quality))
+		{
+			imagedestroy($newImageHandler);
+			return true;
+		}else
+		{
+			imagedestroy($newImageHandler);
+			array_push($this->errors, "Unable to save the thumbnail file.");
+			return false;
+		}
+
+	}
+	/**
+     *
+     * @access public
+     * @return void
+     */
+	function _get_image_details($image)
+	{
+
+		//echo $image;
+		$data = @GetImageSize($image);
+		#1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order,
+		# 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC
+		if (is_array($data)){
+			switch($data[2]){
+				case 1:
+					$type = 'gif';
+					break;
+				case 2:
+					$type = 'jpeg';
+					break;
+				case 3:
+					$type = 'png';
+					break;
+				case 4:
+					$type = 'swf';
+					break;
+				case 5:
+					$type = 'psd';
+				case 6:
+					$type = 'bmp';
+				case 7:
+				case 8:
+					$type = 'tiff';
+				default:
+					array_push($this->errors, "We do not recognize this image format");
+
+			}
+			$this->img_x = $data[0];
+			$this->img_y = $data[1];
+			$this->fileType = $type;
+
+			return true;
+		} else {
+			array_push($this->errors, "Cannot fetch image or images details.");
+			return null;
+		}
+	}
+	/**
+	 * caculate the thumbnail details from the original image file 
+	 *
+	 * @param string $originalImageName  
+	 * @param int $originaleImageWidth
+	 * @param int $originalImageHeight
+	 * @param string $thumbnailSuffix
+	 * @param int $thumbnailWidth
+	 * @param int $thumbnailHeight
+	 * @return array array("name"=>"image name", "width"=>"image width", "height"=>"image height")
+	 */
+	function getThumbInfo($originalImageName, $originaleImageWidth, $originalImageHeight, $thumbnailSuffix, $thumbnailWidth, $thumbnailHeight)
+	{
+		$outputs = array("name"=>"", "width"=>0, "height"=>0);
+		$thumbnailWidth	= intval($thumbnailWidth);
+		$thumbnailHeight = intval($thumbnailHeight);
+		if(!empty($originalImageName) && !empty($originaleImageWidth) && !empty($originalImageHeight))
+		{
+			$dotIndex = strrpos($originalImageName, '.');
+			//begin to get the thumbnail image name
+			$fileExtension = '';
+			$fileBaseName = '';
+			if(is_int($dotIndex))
+			{
+				$fileExtension = substr($originalImageName, $dotIndex);
+				$fileBaseName = substr($originalImageName, 0, $dotIndex);
+			}
+			$outputs['name'] = $fileBaseName . $thumbnailSuffix . $fileExtension;
+			//start to get the thumbnail width & height
+			if($thumbnailWidth < 1 && $thumbnailHeight < 1)
+			{
+				$thumbnailWidth =$originaleImageWidth;
+				$thumbnailHeight = $originalImageHeight;
+			}elseif($thumbnailWidth < 1)
+			{
+				$thumbnailWidth = floor($thumbnailHeight / $originalImageHeight * $originaleImageWidth);
+
+			}elseif($thumbnailHeight < 1)
+			{
+				$thumbnailHeight = floor($thumbnailWidth / $originaleImageWidth * $originalImageHeight);
+			}else
+			{
+				$scale = min($thumbnailWidth/$originaleImageWidth, $thumbnailHeight/$originalImageHeight);
+				$thumbnailWidth = floor($scale*$originaleImageWidth);
+				$thumbnailHeight = floor($scale*$originalImageHeight);
+			}
+			$outputs['width'] = $thumbnailWidth;
+			$outputs['height'] = $thumbnailHeight;
+		}
+		return $outputs;
+
+	}
+	
+
+	/**
+     * get the uploaded file
+     */
+	function deleteUploadedFile()
+	{
+		@unlink($this->filePath);
+	}
+	/**
+	 * destroy the tmp file
+	 *
+	 */
+	function finish()
+	{
+		@unlink($this->_value['tmp_name']);
+	}
+	
+	function displayError()
+	{
+		if(sizeof($this->errors))
+		{
+			echo "<pre>";
+			print_r($this->errors);
+			echo "</pre>";
+		}
+	}
+	/**
+	 * get the path which the file uploaded to
+	 *
+	 */
+	function getFilePath()
+	{
+		return $this->filePath;
+	}
+	/**
+	 * return the directory path witch the file uploaded to
+	 *
+	 * @return unknown
+	 */
+	function getDirPath()
+	{
+		return $this->dirPath;
+	}
+	
+	function getFileBaseName()
+	{
+		return $this->fileBaseName;
+	}
+	
+	function getFileName()
+	{
+		return $this->fileName;
+	}
+	/**
+	 * get image width
+	 *
+	 * @return integer
+	 */
+	function getImageWidth()
+	{
+		return $this->img_x;
+	}
+	/**
+	 * get image height
+	 *
+	 * @return integer
+	 */
+	function getImageHeight()
+	{
+		return $this->img_y;
+	}
+	/**
+	 * get uploaded file size
+	 *
+	 * @return string
+	 */
+	function getFileSize()
+	{
+		return $this->fileSize;
+	}
+	/**
+	 * delete the uploaded image file & associated thumnails
+	 *
+	 * @param string $dirPath
+	 * @param string $originalImageName
+	 * @param string $arrayThumbnailSuffix
+	 */
+	function deleteFileAndThumbs($dirPath, $originalImageName, $arrayThumbnailSuffix)
+	{
+		//ensure the directory path ending with /
+		if ($dirPath != ''  && substr($dirPath, -1) != '/') {
+			$dirPath .= '/';
+		}			
+		if(!empty($originalImageName) && file_exists($dirPath . $originalImageName) && is_file($dirPath . $originalImageName))
+		{
+			@unlink($dirPath . $originalImageName);
+			foreach($arrayThumbnailSuffix as $v)
+			{
+				$dotIndex = strrpos($originalImageName, '.');
+				//begin to get the thumbnail image name
+				$fileExtension = '';
+				$fileBaseName = '';
+				if(is_int($dotIndex))
+				{
+					$fileExtension = substr($originalImageName, $dotIndex);
+					$fileBaseName = substr($originalImageName, 0, $dotIndex);
+				}
+				@unlink($dirPath . $fileBaseName . $v . $fileExtension);			
+			}			
+		}
+	
+
+	}
+}
+?>

+ 131 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/config.base.php

@@ -0,0 +1,131 @@
+<?php
+	/**
+	 * sysem base config setting
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 1/August/2007
+	 *
+	 */
+	
+
+error_reporting(E_ALL);	
+//error_reporting(E_ALL ^ E_NOTICE);	
+	
+	
+
+	//Access Control Setting
+	/**
+	 * turn off => false
+	 * by session => true
+	 */
+	define('CONFIG_ACCESS_CONTROL_MODE', false); 	
+	define("CONFIG_LOGIN_USERNAME", 'ajax');
+	define('CONFIG_LOGIN_PASSWORD', '123456');
+	define('CONFIG_LOGIN_PAGE', 'ajax_login.php'); //the url to the login page
+	
+	//SYSTEM MODE CONFIG
+		/**
+		 * turn it on when you have this system for demo purpose
+		*  that means changes made to each image is not physically applied to it 
+		*  and all uploaded files/created folders will be removed automatically
+		*/
+	define('CONFIG_SYS_DEMO_ENABLE', false); 
+	define('CONFIG_SYS_VIEW_ONLY', false); //diabled the system, view only
+	define('CONFIG_SYS_THUMBNAIL_VIEW_ENABLE', true);//REMOVE THE thumbnail view if false
+	
+	//User Permissions
+	define('CONFIG_OPTIONS_DELETE', true);
+	define('CONFIG_OPTIONS_CUT', true);
+	define('CONFIG_OPTIONS_COPY', true);
+	define('CONFIG_OPTIONS_NEWFOLDER', true);
+	define('CONFIG_OPTIONS_RENAME', true);
+	define('CONFIG_OPTIONS_UPLOAD', true); //
+	define('CONFIG_OPTIONS_EDITABLE', true); //disable image editor and text editor
+	//FILESYSTEM CONFIG
+		/*
+		* CONFIG_SYS_DEFAULT_PATH is the default folder where the files would be uploaded to
+			and it must be a folder under the CONFIG_SYS_ROOT_PATH or the same folder
+			these two paths accept relative path only, don't use absolute path
+		*/
+		
+	define('CONFIG_SYS_DEFAULT_PATH', '../uploaded/'); //accept relative path only
+	define('CONFIG_SYS_ROOT_PATH', '../uploaded/');	//accept relative path only
+	define('CONFIG_SYS_FOLDER_SHOWN_ON_TOP', true); //show your folders on the top of list if true or order by name 
+	define("CONFIG_SYS_DIR_SESSION_PATH", 'session/');
+	define("CONFIG_SYS_PATTERN_FORMAT", 'list'); //three options: reg ,csv, list, this option define the parttern format for the following patterns
+		/**
+		 * reg => regulare expression
+		 * csv => a list of comma separated file/folder name, (exactly match the specified file/folders)
+		 * list => a list of comma spearated vague file/folder name (partially match the specified file/folders)
+		 *
+		 */
+	//more details about regular expression please visit http://nz.php.net/manual/en/function.eregi.php
+	define('CONFIG_SYS_INC_DIR_PATTERN', ''); //force listing of folders with such pattern(s). separated by , if multiple
+	define('CONFIG_SYS_EXC_DIR_PATTERN', ''); //will prevent listing of folders with such pattern(s). separated by , if multiple
+	define('CONFIG_SYS_INC_FILE_PATTERN', ''); //force listing of fiels with such pattern(s). separated by , if multiple
+	define('CONFIG_SYS_EXC_FILE_PATTERN', ''); //will prevent listing of files with such pattern(s). separated by , if multiple
+	define('CONFIG_SYS_DELETE_RECURSIVE', 1); //delete all contents within a specific folder if set to be 1
+	
+	//UPLOAD OPTIONS CONFIG
+	define('CONFIG_UPLOAD_MAXSIZE', 50 * 1024 ); //by bytes
+	//define('CONFIG_UPLOAD_MAXSIZE', 2048); //by bytes
+	//define('CONFIG_UPLOAD_VALID_EXTS', 'txt');//
+
+	define('CONFIG_EDITABLE_VALID_EXTS', 'txt,htm,html,xml,js,css'); //make you include all these extension in CONFIG_UPLOAD_VALID_EXTS if you want all valid
+	
+	define('CONFIG_OVERWRITTEN', false); //overwirte when processing paste
+	define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); // 
+	//define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,bmp,tif,zip,sit,rar,gz,tar,htm,html,mov,mpg,avi,asf,mpeg,wmv,aif,aiff,wav,mp3,swf,ppt,rtf,doc,pdf,xls,txt,xml,xsl,dtd');//
+	define("CONFIG_VIEWABLE_VALID_EXTS", 'gif,bmp,txt,jpg,png,tif,html,htm,js,css,xml,xsl,dtd,mp3,wav,wmv,wma,rm,rmvb,mov,swf');
+	//define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); // 
+	define('CONFIG_UPLOAD_INVALID_EXTS', '');
+
+	//Preview
+	define('CONFIG_IMG_THUMBNAIL_MAX_X', 100);
+	define('CONFIG_IMG_THUMBNAIL_MAX_Y', 100);
+	define('CONFIG_THICKBOX_MAX_WIDTH', 700);
+	define('CONFIG_THICKBOX_MAX_HEIGHT', 430);
+	
+	
+		/**
+		 * CONFIG_URL_PREVIEW_ROOT was replaced by CONFIG_WEBSITE_DOCUMENT_ROOT since v0.8
+		 * Normally, you don't need to bother with CONFIG_WEBSITE_DOCUMENT_ROOT
+		 * Howerver, some Web Hosts do not have standard php.ini setting 
+		 * which you will find the file manager can not locate your files correctly
+		 * if you do have such issue, please change it to fit your system.
+		 * so what should you to do get it
+		 *   1. create a php script file (let's call it document_root.php)
+		 *   2. add the following codes in in 
+		 * 			<?php
+		 * 				echo dirname(__FILE__);
+		 * 			?>
+		 *   3. upload document_root.php to you website root folder which will only be reached when you visit http://www.domain-name.com or http://localhost/ at localhost computer
+		 *   4. run it via http://www.domain-name.com/document_root.php or http://localhost/docuent_root.php if localhost computer, the url has to be exactly like that 
+		 *   5. the value shown on the screen is CONFIG_WEBSITE_DOCUMENT_ROOT should be
+		 *   6. enjoy it
+
+		        
+		 * 		
+		 */
+		
+
+	define('CONFIG_WEBSITE_DOCUMENT_ROOT', '');	
+	//theme related setting
+			/*
+			*	options avaialbe for CONFIG_EDITOR_NAME are:
+					stand_alone
+					tinymce
+					fckeditor
+			*/
+	//CONFIG_EDITOR_NAME replaced CONFIG_THEME_MODE since @version 0.8			
+	define('CONFIG_EDITOR_NAME', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['editor'])?secureFileName($_GET['editor']):'stand_alone')); 
+	define('CONFIG_THEME_NAME', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['theme'])?secureFileName($_GET['theme']):'default'));  //change the theme to your custom theme rather than default
+	define('CONFIG_DEFAULT_VIEW', (CONFIG_SYS_THUMBNAIL_VIEW_ENABLE?'detail':'detail')); //thumnail or detail
+	define('CONFIG_DEFAULT_PAGINATION_LIMIT', 10);
+	define('CONFIG_LOAD_DOC_LATTER', false); //all documents will be loaded up after the template has been loaded to the client 
+	
+	//General Option Declarations
+	//LANGAUGAE DECLARATIONNS
+	define('CONFIG_LANG_INDEX', 'language'); //the index in the session
+	define('CONFIG_LANG_DEFAULT', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['language']) && file_exists(DIR_LANG . secureFileName($_GET['language']) . '.php')?secureFileName($_GET['language']):'en')); //change it to be your language file base name, such en
+?>

+ 107 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/config.php

@@ -0,0 +1,107 @@
+<?php
+	/**
+	 * sysem  config setting
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @version 1.0
+	 * @since 22/April/2007
+	 *
+	 */
+	
+	//FILESYSTEM CONFIG	<br>
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "class.auth.php");	
+	define('CONFIG_QUERY_STRING_ENABLE', true); //Enable passed query string to setting the system configuration
+	if(!isset($_SESSION))
+	{
+		session_start();
+	}
+	if(!headers_sent())
+	{
+		header('Content-Type: text/html; charset=utf-8');
+	}
+	
+	/**
+	 * secure file name which retrieve from query string
+	 *
+	 * @param string $input
+	 * @return string
+	 */
+	function secureFileName($input)
+	{
+		return preg_replace('/[^a-zA-Z0-9\-_]/', '', $input);
+	}	
+	//Directories Declarations	
+	
+	define('DIR_AJAX_ROOT', dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR) ; // the path to ajax file manager
+	define('DIR_AJAX_INC', DIR_AJAX_ROOT . "inc" . DIRECTORY_SEPARATOR);
+	define('DIR_AJAX_CLASSES', DIR_AJAX_ROOT .  "classes" . DIRECTORY_SEPARATOR);
+	define("DIR_AJAX_LANGS", DIR_AJAX_ROOT . "langs" . DIRECTORY_SEPARATOR);
+	define('DIR_AJAX_JS', DIR_AJAX_ROOT . 'jscripts' . DIRECTORY_SEPARATOR);
+	define('DIR_AJAX_EDIT_AREA', DIR_AJAX_JS . 'edit_area' . DIRECTORY_SEPARATOR);
+	define('DIR_LANG', DIR_AJAX_ROOT . 'langs' . DIRECTORY_SEPARATOR);
+
+	
+	//Class Declarations
+	define('CLASS_FILE', DIR_AJAX_INC .'class.file.php');
+	define("CLASS_UPLOAD", DIR_AJAX_INC .  'class.upload.php');
+	define('CLASS_MANAGER', DIR_AJAX_INC . 'class.manager.php');
+	define('CLASS_IMAGE', DIR_AJAX_INC . "class.image.php");
+	define('CLASS_HISTORY', DIR_AJAX_INC . "class.history.php");
+	define('CLASS_SESSION_ACTION', DIR_AJAX_INC . "class.sessionaction.php");
+	define('CLASS_PAGINATION', DIR_AJAX_INC . 'class.pagination.php');
+	define('CLASS_SEARCH', DIR_AJAX_INC . "class.search.php");
+	//SCRIPT FILES declarations
+	define('SPT_FUNCTION_BASE', DIR_AJAX_INC . 'function.base.php');	
+	//include different config base file according to query string "config"
+	$configBaseFileName = 'config.base.php';
+	
+	if(CONFIG_QUERY_STRING_ENABLE && !empty($_GET['config']) && file_exists(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'config.' . secureFileName($_GET['config']) . ".php")
+	{
+		$configBaseFileName = 'config.' . secureFileName($_GET['config']) . ".php";
+	}
+	require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . $configBaseFileName);
+
+	
+	require_once(DIR_AJAX_LANGS . CONFIG_LANG_DEFAULT . ".php");
+	require_once(DIR_AJAX_INC . "function.base.php");	
+	
+	require_once(dirname(__FILE__) .  DIRECTORY_SEPARATOR . "class.session.php");
+	$session = new Session();
+	$auth = new Auth();
+	
+	if(CONFIG_ACCESS_CONTROL_MODE == 1)
+	{//access control enabled
+		if(!$auth->isLoggedIn() && strtolower(basename($_SERVER['PHP_SELF']) != strtolower(basename(CONFIG_LOGIN_PAGE))))
+		{//
+			header('Location: ' . appendQueryString(CONFIG_LOGIN_PAGE, makeQueryString()));
+			exit;
+		}
+	}
+	addNoCacheHeaders();
+	//URL Declartions
+	define('CONFIG_URL_IMAGE_PREVIEW', 'ajax_image_preview.php');
+	define('CONFIG_URL_CREATE_FOLDER', 'ajax_create_folder.php');
+	define('CONFIG_URL_DELETE', 'ajax_delete_file.php');
+	define('CONFIG_URL_HOME', 'ajaxfilemanager.php');
+	define("CONFIG_URL_UPLOAD", 'ajax_file_upload.php');
+	define('CONFIG_URL_PREVIEW', 'ajax_preview.php');
+	define('CONFIG_URL_SAVE_NAME', 'ajax_save_name.php');
+	define('CONFIG_URL_IMAGE_EDITOR', 'ajax_image_editor.php');
+	define('CONFIG_URL_IMAGE_SAVE', 'ajax_image_save.php');
+	define('CONFIG_URL_IMAGE_RESET', 'ajax_editor_reset.php');
+	define('CONFIG_URL_IMAGE_UNDO', 'ajax_image_undo.php');
+	define('CONFIG_URL_CUT', 'ajax_file_cut.php');
+	define('CONFIG_URL_COPY', 'ajax_file_copy.php');
+	define('CONFIG_URL_LOAD_FOLDERS', '_ajax_load_folders.php');
+	
+	define('CONFIG_URL_DOWNLOAD', 'ajax_download.php');
+	define('CONFIG_URL_TEXT_EDITOR', 'ajax_text_editor.php');
+	define('CONFIG_URL_GET_FOLDER_LIST', 'ajax_get_folder_listing.php');
+	define('CONFIG_URL_SAVE_TEXT', 'ajax_save_text.php');
+	define('CONFIG_URL_LIST_LISTING', 'ajax_get_file_listing.php');
+	define('CONFIG_URL_IMG_THUMBNAIL', 'ajax_image_thumbnail.php');
+	define('CONFIG_URL_FILEnIMAGE_MANAGER', 'ajaxfilemanager.php');
+	define('CONFIG_URL_FILE_PASTE', 'ajax_file_paste.php');
+	
+
+?>

+ 131 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/config.tinymce.php

@@ -0,0 +1,131 @@
+<?php
+	/**
+	 * sysem base config setting
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 1/August/2007
+	 *
+	 */
+	
+
+error_reporting(E_ALL);	
+//error_reporting(E_ALL ^ E_NOTICE);	
+	
+	
+
+	//Access Control Setting
+	/**
+	 * turn off => false
+	 * by session => true
+	 */
+	define('CONFIG_ACCESS_CONTROL_MODE', false); 	
+	define("CONFIG_LOGIN_USERNAME", 'ajax');
+	define('CONFIG_LOGIN_PASSWORD', '123456');
+	define('CONFIG_LOGIN_PAGE', 'ajax_login.php'); //the url to the login page
+	
+	//SYSTEM MODE CONFIG
+		/**
+		 * turn it on when you have this system for demo purpose
+		*  that means changes made to each image is not physically applied to it 
+		*  and all uploaded files/created folders will be removed automatically
+		*/
+	define('CONFIG_SYS_DEMO_ENABLE', false); 
+	define('CONFIG_SYS_VIEW_ONLY', false); //diabled the system, view only
+	define('CONFIG_SYS_THUMBNAIL_VIEW_ENABLE', true);//REMOVE THE thumbnail view if false
+	
+	//User Permissions
+	define('CONFIG_OPTIONS_DELETE', true);
+	define('CONFIG_OPTIONS_CUT', true);
+	define('CONFIG_OPTIONS_COPY', true);
+	define('CONFIG_OPTIONS_NEWFOLDER', true);
+	define('CONFIG_OPTIONS_RENAME', true);
+	define('CONFIG_OPTIONS_UPLOAD', true); //
+	define('CONFIG_OPTIONS_EDITABLE', true); //disable image editor and text editor
+	//FILESYSTEM CONFIG
+		/*
+		* CONFIG_SYS_DEFAULT_PATH is the default folder where the files would be uploaded to
+			and it must be a folder under the CONFIG_SYS_ROOT_PATH or the same folder
+			these two paths accept relative path only, don't use absolute path
+		*/
+		
+	define('CONFIG_SYS_DEFAULT_PATH', '../uploaded/'); //accept relative path only
+	define('CONFIG_SYS_ROOT_PATH', '../uploaded/');	//accept relative path only
+	define('CONFIG_SYS_FOLDER_SHOWN_ON_TOP', true); //show your folders on the top of list if true or order by name 
+	define("CONFIG_SYS_DIR_SESSION_PATH", 'session/');
+	define("CONFIG_SYS_PATTERN_FORMAT", 'list'); //three options: reg ,csv, list, this option define the parttern format for the following patterns
+		/**
+		 * reg => regulare expression
+		 * csv => a list of comma separated file/folder name, (exactly match the specified file/folders)
+		 * list => a list of comma spearated vague file/folder name (partially match the specified file/folders)
+		 *
+		 */
+	//more details about regular expression please visit http://nz.php.net/manual/en/function.eregi.php
+	define('CONFIG_SYS_INC_DIR_PATTERN', ''); //force listing of folders with such pattern(s). separated by , if multiple
+	define('CONFIG_SYS_EXC_DIR_PATTERN', ''); //will prevent listing of folders with such pattern(s). separated by , if multiple
+	define('CONFIG_SYS_INC_FILE_PATTERN', ''); //force listing of fiels with such pattern(s). separated by , if multiple
+	define('CONFIG_SYS_EXC_FILE_PATTERN', ''); //will prevent listing of files with such pattern(s). separated by , if multiple
+	define('CONFIG_SYS_DELETE_RECURSIVE', 1); //delete all contents within a specific folder if set to be 1
+	
+	//UPLOAD OPTIONS CONFIG
+	define('CONFIG_UPLOAD_MAXSIZE', 50 * 1024 ); //by bytes
+	//define('CONFIG_UPLOAD_MAXSIZE', 2048); //by bytes
+	//define('CONFIG_UPLOAD_VALID_EXTS', 'txt');//
+
+	define('CONFIG_EDITABLE_VALID_EXTS', 'txt,htm,html,xml,js,css'); //make you include all these extension in CONFIG_UPLOAD_VALID_EXTS if you want all valid
+	
+	define('CONFIG_OVERWRITTEN', false); //overwirte when processing paste
+	define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); // 
+	//define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,bmp,tif,zip,sit,rar,gz,tar,htm,html,mov,mpg,avi,asf,mpeg,wmv,aif,aiff,wav,mp3,swf,ppt,rtf,doc,pdf,xls,txt,xml,xsl,dtd');//
+	define("CONFIG_VIEWABLE_VALID_EXTS", 'gif,bmp,txt,jpg,png,tif,html,htm,js,css,xml,xsl,dtd,mp3,wav,wmv,wma,rm,rmvb,mov,swf');
+	//define('CONFIG_UPLOAD_VALID_EXTS', 'gif,jpg,png,txt'); // 
+	define('CONFIG_UPLOAD_INVALID_EXTS', '');
+
+	//Preview
+	define('CONFIG_IMG_THUMBNAIL_MAX_X', 100);
+	define('CONFIG_IMG_THUMBNAIL_MAX_Y', 100);
+	define('CONFIG_THICKBOX_MAX_WIDTH', 700);
+	define('CONFIG_THICKBOX_MAX_HEIGHT', 430);
+	
+	
+		/**
+		 * CONFIG_URL_PREVIEW_ROOT was replaced by CONFIG_WEBSITE_DOCUMENT_ROOT since v0.8
+		 * Normally, you don't need to bother with CONFIG_WEBSITE_DOCUMENT_ROOT
+		 * Howerver, some Web Hosts do not have standard php.ini setting 
+		 * which you will find the file manager can not locate your files correctly
+		 * if you do have such issue, please change it to fit your system.
+		 * so what should you to do get it
+		 *   1. create a php script file (let's call it document_root.php)
+		 *   2. add the following codes in in 
+		 * 			<?php
+		 * 				echo dirname(__FILE__);
+		 * 			?>
+		 *   3. upload document_root.php to you website root folder which will only be reached when you visit http://www.domain-name.com or http://localhost/ at localhost computer
+		 *   4. run it via http://www.domain-name.com/document_root.php or http://localhost/docuent_root.php if localhost computer, the url has to be exactly like that 
+		 *   5. the value shown on the screen is CONFIG_WEBSITE_DOCUMENT_ROOT should be
+		 *   6. enjoy it
+
+		        
+		 * 		
+		 */
+		
+
+	define('CONFIG_WEBSITE_DOCUMENT_ROOT', '');	
+	//theme related setting
+			/*
+			*	options avaialbe for CONFIG_EDITOR_NAME are:
+					stand_alone
+					tinymce
+					fckeditor
+			*/
+	//CONFIG_EDITOR_NAME replaced CONFIG_THEME_MODE since @version 0.8			
+	define('CONFIG_EDITOR_NAME', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['editor'])?secureFileName($_GET['editor']):'stand_alone')); 
+	define('CONFIG_THEME_NAME', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['theme'])?secureFileName($_GET['theme']):'default'));  //change the theme to your custom theme rather than default
+	define('CONFIG_DEFAULT_VIEW', (CONFIG_SYS_THUMBNAIL_VIEW_ENABLE?'detail':'detail')); //thumnail or detail
+	define('CONFIG_DEFAULT_PAGINATION_LIMIT', 10);
+	define('CONFIG_LOAD_DOC_LATTER', false); //all documents will be loaded up after the template has been loaded to the client 
+	
+	//General Option Declarations
+	//LANGAUGAE DECLARATIONNS
+	define('CONFIG_LANG_INDEX', 'language'); //the index in the session
+	define('CONFIG_LANG_DEFAULT', (CONFIG_QUERY_STRING_ENABLE && !empty($_GET['language']) && file_exists(DIR_LANG . secureFileName($_GET['language'] . '.php'))?secureFileName($_GET['language']):'en')); //change it to be your language file base name, such en
+?>

+ 8 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/data.php

@@ -0,0 +1,8 @@
+<pre>Array
+(
+    [currentFolderPath] => ../uploaded/3/New Folder/
+    [new_folder] => sdfds
+)
+</pre>
+
+28/Aug/2008 22:57:37

+ 1225 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/inc/function.base.php

@@ -0,0 +1,1225 @@
+<?php
+	/**
+	 * function avaialble to the file manager
+	 * @author Logan Cai (cailongqun [at] yahoo [dot] com [dot] cn)
+	 * @link www.phpletter.com
+	 * @since 22/April/2007
+	 *
+	 */
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . "config.php");
+/**
+ * force to ensure existence of stripos
+ */
+if (!function_exists("stripos")) 
+{
+  function stripos($str,$needle,$offset=0)
+  {
+      return @strpos(strtolower($str),strtolower($needle),$offset);
+  }
+}
+	/**
+	 * get the current Url but not the query string specified in $excls
+	 *
+	 * @param array $excls specify those unwanted query string
+	 * @return string
+	 */
+	function getCurrentUrl($excls=array())
+	{
+		$output = $_SERVER['PHP_SELF'];
+		$count = 1;
+		foreach($_GET as $k=>$v)
+		{
+			if(array_search($k, $excls) ===false)
+			{
+				$strAppend = "&";
+				if($count == 1)
+				{
+					$strAppend = "?";
+					$count++;
+				}
+				$output .= $strAppend . $k . "=" . $v;
+			}
+		}
+		return $output;
+	}
+
+/**
+ * print out an array
+ *
+ * @param array $array
+ */
+function displayArray($array, $comments="")
+{
+	echo "<pre>";
+	echo $comments;
+	print_r($array);
+	echo $comments;
+	echo "</pre>";
+}
+
+
+
+	/**
+	 * check if a file extension is permitted
+	 *
+	 * @param string $filePath
+	 * @param array $validExts
+	 * @param array $invalidExts
+	 * @return boolean
+	 */
+	function isValidExt($filePath, $validExts, $invalidExts=array())
+	{
+		$tem = array();
+
+		if(sizeof($validExts))
+		{
+			foreach($validExts as $k=>$v)
+			{
+				$tem[$k] = strtolower(trim($v));
+			}
+		}
+		$validExts = $tem;
+		$tem = array();
+		if(sizeof($invalidExts))
+		{
+			foreach($invalidExts as $k=>$v)
+			{
+				$tem[$k] = strtolower(trim($v));
+			}
+		}
+		$invalidExts = $tem;
+		if(sizeof($validExts) && sizeof($invalidExts))
+		{
+			foreach($validExts as  $k=>$ext)
+			{
+				if(array_search($ext, $invalidExts) !== false)
+				{
+					unset($validExts[$k]);
+				}
+			}
+		}
+		if(sizeof($validExts))
+		{
+			if(array_search(strtolower(getFileExt($filePath)), $validExts) !== false)
+			{
+				return true;
+			}else 
+			{
+				return false;
+			}
+		}elseif(array_search(strtolower(getFileExt($filePath)), $invalidExts) === false)
+		{
+			return true;
+		}else 
+		{
+			return false;
+		}
+	}
+
+
+
+
+
+/**
+ *  transform file relative path to absolute path
+ * @param  string $value the path to the file
+ * @return string 
+ */
+function relToAbs($value) 
+{
+	return backslashToSlash(preg_replace("/(\\\\)/","\\", getRealPath($value)));
+
+}
+
+	function getRelativeFileUrl($value, $relativeTo)
+	{
+		$output = '';
+		$wwwroot = removeTrailingSlash(backslashToSlash(getRootPath()));
+		$urlprefix = "";
+		$urlsuffix = "";
+		$value = backslashToSlash(getRealPath($value));
+		$pos = strpos($value, $wwwroot);
+		if ($pos !== false && $pos == 0)
+		{
+			$output  = $urlprefix . substr($value, strlen($wwwroot)) . $urlsuffix;
+		}
+	}
+/**
+ * replace slash with backslash
+ *
+ * @param string $value the path to the file
+ * @return string
+ */
+function slashToBackslash($value) {
+	return str_replace("/", DIRECTORY_SEPARATOR, $value);
+}
+
+/**
+ * replace backslash with slash
+ *
+ * @param string $value the path to the file
+ * @return string
+ */
+function backslashToSlash($value) {
+	return str_replace(DIRECTORY_SEPARATOR, "/", $value);
+}
+
+/**
+ * removes the trailing slash
+ *
+ * @param string $value
+ * @return string
+ */
+function removeTrailingSlash($value) {
+	if(preg_match('@^.+/$@i', $value))
+	{
+		$value = substr($value, 0, strlen($value)-1);
+	}
+	return $value;
+}
+
+/**
+ * append a trailing slash
+ *
+ * @param string $value 
+ * @return string
+ */
+function addTrailingSlash($value) 
+{
+	if(preg_match('@^.*[^/]{1}$@i', $value))
+	{
+		$value .= '/';
+	}
+	return $value;
+}
+
+/**
+ * transform a file path to user friendly
+ *
+ * @param string $value
+ * @return string
+ */
+function transformFilePath($value) {
+	$rootPath = addTrailingSlash(backslashToSlash(getRealPath(CONFIG_SYS_ROOT_PATH)));
+	$value = addTrailingSlash(backslashToSlash(getRealPath($value)));
+	if(!empty($rootPath) && ($i = strpos($value, $rootPath)) !== false)
+	{
+		$value = ($i == 0?substr($value, strlen($rootPath)):"/");		
+	}
+	$value = prependSlash($value);
+	return $value;
+}
+/**
+ * prepend slash 
+ *
+ * @param string $value
+ * @return string
+ */
+function prependSlash($value)
+{
+		if (($value && $value[0] != '/') || !$value )
+		{
+			$value = "/" . $value;
+		}			
+		return $value;	
+}
+
+
+	function writeInfo($data, $die = false)
+	{
+		$fp = @fopen(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'data.php', 'w+');
+		@fwrite($fp, $data);
+		@fwrite($fp, "\n\n" . date('d/M/Y H:i:s') );
+		@fclose($fp);
+		if($die)
+		{
+			die();
+		}
+		
+	}
+
+/**
+ * no cachable header
+ */
+function addNoCacheHeaders() {
+	header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+	header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
+	header("Cache-Control: no-store, no-cache, must-revalidate");
+	header("Cache-Control: post-check=0, pre-check=0", false);
+	header("Pragma: no-cache");
+}
+	/**
+	 * add extra query stiring to a url
+	 * @param string $baseUrl
+	 * @param string $extra the query string added to the base url
+	 */
+	function appendQueryString($baseUrl, $extra)
+	{
+		$output = $baseUrl;
+		if(!empty($extra))
+		{
+			if(strpos($baseUrl, "?") !== false)
+			{
+				$output .= "&" . $extra;
+			}else
+			{
+				$output .= "?" . $extra;
+			}			
+		}
+
+		return $output;
+	}
+	/**
+	 * make the query strin from $_GET, but excluding those specified by $excluded
+	 *
+	 * @param array $excluded
+	 * @return string
+	 */
+	function makeQueryString($excluded=array())
+	{
+		$output = '';
+		$count = 1;
+		foreach($_GET as $k=>$v)
+		{
+			if(array_search($k, $excluded) === false)
+			{
+				$output .= ($count>1?'&':'') . ($k . "=" . $v);
+				$count++;
+			}
+		}
+		return $output;
+	}
+	/**
+	 * get parent path from specific path
+	 *
+	 * @param string $value
+	 * @return string
+	 */
+	function getParentPath($value)
+	{
+		$value = removeTrailingSlash(backslashToSlash($value));
+		if(false !== ($index = strrpos($value, "/")) )
+		{
+			return substr($value, 0, $index);
+		}
+
+	}
+
+
+	/**
+	 * check if the file/folder is sit under the root
+	 *
+	 * @param string $value
+	 * @return  boolean
+	 */
+	function isUnderRoot($value)
+	{
+		$roorPath = strtolower(addTrailingSlash(backslashToSlash(getRealPath(CONFIG_SYS_ROOT_PATH))));
+		if(file_exists($value) && @strpos(strtolower(addTrailingSlash(backslashToSlash(getRealPath($value)))), $roorPath) === 0 )
+		{
+			return true;
+		}
+		return false;
+	}
+	/**
+	 * check if a file under the session folder
+	 *
+	 * @param string $value
+	 * @return boolean
+	 */
+	function isUnderSession($value)
+	{
+		global $session;
+		$sessionPath = strtolower(addTrailingSlash(backslashToSlash(getRealPath($session->getSessionDir()))));
+		if(file_exists($value) && @strpos(strtolower(addTrailingSlash(backslashToSlash(getRealPath($value)))), $sessionPath) === 0 )
+		{
+			return true;
+		}
+		return false;		
+	}
+	
+	
+	/**
+	 * get thumbnail width and height
+	 *
+	 * @param integer $originaleImageWidth
+	 * @param integer $originalImageHeight
+	 * @param integer $thumbnailWidth
+	 * @param integer $thumbnailHeight
+	 * @return array()
+	 */
+	function getThumbWidthHeight( $originaleImageWidth, $originalImageHeight, $thumbnailWidth, $thumbnailHeight)
+	{
+		$outputs = array( "width"=>0, "height"=>0);
+		$thumbnailWidth	= intval($thumbnailWidth);
+		$thumbnailHeight = intval($thumbnailHeight);
+		if(!empty($originaleImageWidth) && !empty($originalImageHeight))
+		{
+			//start to get the thumbnail width & height
+        	if(($thumbnailWidth < 1 && $thumbnailHeight < 1) || ($thumbnailWidth > $originaleImageWidth && $thumbnailHeight > $originalImageHeight ))
+        	{
+        		$thumbnailWidth =$originaleImageWidth;
+        		$thumbnailHeight = $originalImageHeight;
+        	}elseif($thumbnailWidth < 1)
+        	{
+        		$thumbnailWidth = floor($thumbnailHeight / $originalImageHeight * $originaleImageWidth);
+
+        	}elseif($thumbnailHeight < 1)
+        	{
+        		$thumbnailHeight = floor($thumbnailWidth / $originaleImageWidth * $originalImageHeight);
+        	}else
+        	{
+        		$scale = min($thumbnailWidth/$originaleImageWidth, $thumbnailHeight/$originalImageHeight);
+				$thumbnailWidth = floor($scale*$originaleImageWidth);
+				$thumbnailHeight = floor($scale*$originalImageHeight);
+        	}
+			$outputs['width'] = $thumbnailWidth;
+			$outputs['height'] = $thumbnailHeight;
+		}
+		return $outputs;
+
+	}
+/**
+ * turn to absolute path from relative path
+ *
+ * @param string $value
+ * @return string
+ */
+function getAbsPath($value) {
+	if (substr($value, 0, 1) == "/")
+		return slashToBackslash(DIR_AJAX_ROOT . $value);
+
+	return slashToBackslash(dirname(__FILE__) . "/" . $value);
+}
+
+	/**
+	 * get file/folder base name
+	 *
+	 * @param string $value
+	 * @return string
+	 */
+	function getBaseName($value)
+	{
+		$value = removeTrailingSlash(backslashToSlash($value));
+
+		if(false !== ($index = strrpos($value, "/")) )
+		{
+			return substr($value, $index + 1);
+		}else
+		{
+			return $value;
+		}
+	}
+
+function myRealPath($path) {
+
+		if(strpos($path, ':/') !== false)
+		{
+			return $path;
+		}
+    // check if path begins with "/" ie. is absolute
+    // if it isnt concat with script path
+    
+    if (strpos($path,"/") !== 0 ) {
+        $base=dirname($_SERVER['SCRIPT_FILENAME']);
+        $path=$base."/".$path;
+    }
+ 
+    // canonicalize
+    $path=explode('/', $path);
+    $newpath=array();
+    for ($i=0; $i<sizeof($path); $i++) {
+        if ($path[$i]==='' || $path[$i]==='.') continue;
+           if ($path[$i]==='..') {
+              array_pop($newpath);
+              continue;
+        }
+        array_push($newpath, $path[$i]);
+    }
+    $finalpath="/".implode('/', $newpath);
+
+    clearstatcache();
+    // check then return valid path or filename
+    if (file_exists($finalpath)) {
+        return ($finalpath);
+    }
+    else return FALSE;
+}
+	/**
+	 * calcuate realpath for a relative path
+	 *
+	 * @param string $value a relative path
+	 * @return string absolute path of the input
+	 */
+ function getRealPath($value)
+ {
+ 		$output = '';
+ 	 if(($path = realpath($value)) && $path != $value)
+ 	 {
+ 	 	$output = $path;
+ 	 }else 
+ 	 {
+ 	 	$output = myRealPath($value);
+ 	 }
+ 	 return $output;
+ 	
+ }
+	/**
+	 * get file url
+	 *
+	 * @param string $value
+	 * @return string
+	 */
+	function getFileUrl($value)
+	{
+		$output = '';
+		$wwwroot = removeTrailingSlash(backslashToSlash(getRootPath()));
+
+		$urlprefix = "";
+		$urlsuffix = "";
+
+	$value = backslashToSlash(getRealPath($value));
+		
+
+		$pos = stripos($value, $wwwroot);
+		if ($pos !== false && $pos == 0)
+		{
+			$output  = $urlprefix . substr($value, strlen($wwwroot)) . $urlsuffix;
+		}else 
+		{
+			$output = $value;
+		}
+		return "http://" .  addTrailingSlash(backslashToSlash($_SERVER['HTTP_HOST'])) . removeBeginingSlash(backslashToSlash($output));
+	}
+	
+/**
+ * 
+ *	transfer file size number to human friendly string
+ * @param integer $size.
+ * @return String
+ */
+function transformFileSize($size) {
+
+	if ($size > 1048576)
+	{
+		return round($size / 1048576, 1) . " MB";
+	}elseif ($size > 1024)
+	{
+		return round($size / 1024, 1) . " KB";
+	}elseif($size == '')
+	{
+		return $size;
+	}else
+	{
+		return $size . " b";
+	}	
+}
+	
+	/**
+	 * remove beginging slash
+	 *
+	 * @param string $value
+	 * @return string
+	 */
+	function removeBeginingSlash($value)
+	{
+		$value = backslashToSlash($value);
+		if(strpos($value, "/") === 0)
+		{
+			$value = substr($value, 1);
+		}
+		return $value;
+	}
+	
+/**
+ * get site root path
+ *
+ * @return String.
+ */
+function getRootPath() {
+		$output = "";
+		if (defined('CONFIG_WEBSITE_DOCUMENT_ROOT') && CONFIG_WEBSITE_DOCUMENT_ROOT)
+		{
+			return slashToBackslash(CONFIG_WEBSITE_DOCUMENT_ROOT);
+		}
+		if(isset($_SERVER['DOCUMENT_ROOT']) && ($output = relToAbs($_SERVER['DOCUMENT_ROOT'])) != '' )
+		{
+			return $output;
+		}elseif(isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["SCRIPT_FILENAME"]) && ($output = str_replace(backslashToSlash($_SERVER["SCRIPT_NAME"]), "", backslashToSlash($_SERVER["SCRIPT_FILENAME"]))) && is_dir($output))
+		{
+			return slashToBackslash($output);
+		}elseif(isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["PATH_TRANSLATED"]) && ($output = str_replace(backslashToSlash($_SERVER["SCRIPT_NAME"]), "", str_replace("//", "/", backslashToSlash($_SERVER["PATH_TRANSLATED"])))) && is_dir($output))
+		{
+			return $output;
+		}else 
+		{
+			return '';
+		}	
+
+	return null;
+}
+
+	
+	/**
+	 * add beginging slash
+	 *
+	 * @param string $value
+	 * @return string
+	 */	
+	function addBeginingSlash($value)
+	{
+		if(strpos($value, "/") !== 0 && !empty($value))
+		{
+			$value .= "/" . $value;
+		}
+		return $value;		
+	}
+
+
+	
+
+	
+	/**
+	 * get a file extension
+	 *
+	 * @param string $fileName the path to a file or just the file name
+	 */	
+	function getFileExt($filePath)
+	{
+		return @substr(@strrchr($filePath, "."), 1);
+	}
+	
+		/**
+		 * reuturn the relative path between two url
+		 *
+		 * @param string $start_dir
+		 * @param string $final_dir
+		 * @return string
+		 */
+    function getRelativePath($start_dir, $final_dir){
+      //
+      $firstPathParts = explode(DIRECTORY_SEPARATOR, $start_dir);
+      $secondPathParts = explode(DIRECTORY_SEPARATOR, $final_dir);
+      //
+      $sameCounter = 0;
+      for($i = 0; $i < min( count($firstPathParts), count($secondPathParts) ); $i++) {
+          if( strtolower($firstPathParts[$i]) !== strtolower($secondPathParts[$i]) ) {
+              break;
+          }
+          $sameCounter++;
+      }
+      if( $sameCounter == 0 ) {
+          return $final_dir;
+      }
+      //
+      $newPath = '';
+      for($i = $sameCounter; $i < count($firstPathParts); $i++) {
+          if( $i > $sameCounter ) {
+              $newPath .= DIRECTORY_SEPARATOR;
+          }
+          $newPath .= "..";
+      }
+      if( count($newPath) == 0 ) {
+          $newPath = ".";
+      }
+      for($i = $sameCounter; $i < count($secondPathParts); $i++) {
+          $newPath .= DIRECTORY_SEPARATOR;
+          $newPath .= $secondPathParts[$i];
+      }
+      //
+      return $newPath;
+  }
+  /**
+   * get the php server memory limit
+   * @return integer
+   *
+   */
+  function getMemoryLimit()
+  {
+    $output = @ini_get('memory_limit') or $output = -1 ;
+    if(intval($output) < 0)
+    {//unlimited
+    	$output = 999999999999999999;
+    }
+    elseif(strpos('g', strtolower($output)) !== false)
+    {
+    	$output = intval($output) * 1024 * 1024 * 1024;
+    }elseif(strpos('k', strtolower($output)) !== false)
+    {
+    	$output = intval($output) * 1024 ;
+    }else
+    {
+    	$output = intval($output) * 1024 * 1024;
+    }
+    
+    return $output;  	
+  }
+	/**
+	 * get file content
+	 *
+	 * @param string $path
+	 */
+  function getFileContent($path)
+  {
+  	return @file_get_contents($path);
+  	//return str_replace(array("\r", "\n", '"', "\t"), array("", "\\n", '\"', "\\t"), @file_get_contents($path));
+  }
+         /**
+          * get the list of folder under a specified folder
+          * which will be used for drop-down menu
+          * @param string $path the path of the specified folder
+          * @param array $outputs
+          * @param string $indexNumber
+          * @param string $prefixNumber the prefix before the index number
+          * @param string $prefixName the prefix before the folder name
+          * @return array
+          */
+         function getFolderListing($path,$indexNumber=null, $prefixNumber =' ', $prefixName =' - ',  $outputs=array())
+         {
+                   $path = removeTrailingSlash(backslashToSlash($path));
+                   if(is_null($indexNumber))
+                   {
+                   	$outputs[IMG_LBL_ROOT_FOLDER] = removeTrailingSlash(backslashToSlash($path));
+                   }
+                   $fh = @opendir($path);
+                   if($fh)
+                   {
+                            $count = 1;                          
+                            while($file = @readdir($fh))
+                            {
+                                     $newPath = removeTrailingSlash(backslashToSlash($path . "/" . $file));
+                                     if(isListingDocument($newPath) && $file != '.' && $file != '..' && is_dir($newPath))
+                                     {                                          
+                                               if(!empty($indexNumber))
+                                               {//this is not root folder
+                                               					
+                                                        $outputs[$prefixNumber . $indexNumber . "." . $count . $prefixName . $file] = $newPath;
+                                                        getFolderListing($newPath,  $prefixNumber . $indexNumber . "." . $count , $prefixNumber, $prefixName, $outputs);                                                 
+                                               }else 
+                                               {//this is root folder
+
+                                                        $outputs[$count . $prefixName . $file] = $newPath;
+                                                        getFolderListing($newPath, $count, $prefixNumber, $prefixName, $outputs);
+                                               }
+                                               $count++;
+                                     }                                    
+                            }
+                            @closedir($fh);
+                   }
+                   return $outputs;
+         }
+
+         
+         /**
+          * get the valid text editor extension 
+          * which is calcualte from the CONFIG_EDITABALE_VALID_EXTS 
+          * exclude those specified in CONFIG_UPLOAD_INVALID_EXTS
+          * and those are not specified in CONFIG_UPLOAD_VALID_EXTS
+          *
+          * @return array
+          */
+         function getValidTextEditorExts()
+         {
+         	$validEditorExts = explode(',', CONFIG_EDITABLE_VALID_EXTS);
+         	if(CONFIG_UPLOAD_VALID_EXTS)
+         	{//exclude those exts not shown on CONFIG_UPLOAD_VALID_EXTS
+         		$validUploadExts = explode(',', CONFIG_UPLOAD_VALID_EXTS);
+         		foreach($validEditorExts as $k=>$v)
+         		{
+         			if(array_search($v, $validUploadExts) === false)
+         			{
+         				unset($validEditorExts[$k]);
+         			}
+         		}        		
+         	}
+         	if(CONFIG_UPLOAD_INVALID_EXTS)
+         	{//exlcude those exists in CONFIG_UPLOAD_INVALID_EXTS
+         		$invalidUploadExts = explode(',', CONFIG_UPLOAD_INVALID_EXTS);
+         		foreach($validEditorExts as $k=>$v)
+         		{
+         			if(array_search($v, $invalidUploadExts) !== false)
+         			{
+         				unset($validEditorExts[$k]);
+         			}
+         		}
+         	}
+         	return $validEditorExts;        	
+         	
+         }
+    /**
+     * check if file name or folder name is valid against a regular expression 
+     *
+     * @param string $pattern regular expression, separated by , if multiple
+     * @param string $string
+     * @return booolean
+     */
+        function isValidPattern( $pattern, $string)
+        {
+            if(($pattern)=== '')
+            {
+                return true;
+            }
+            else if (strpos($pattern,",")!==false)
+            {
+                $regExps = explode(',', $pattern);
+                foreach ($regExps as $regExp => $value)
+                {
+                    if(eregi($value, $string))
+                    {
+                        return true;
+                    }
+                }               
+            }
+            else if(eregi($pattern, $string))
+            {
+                return true;
+            }
+            return false;
+           
+        }       
+
+		
+    /**
+     * check if file name or folder name is invalid against a regular expression 
+     *
+     * @param string $pattern regular expression, separated by , if multiple
+     * @param string $string
+     * @return booolean
+     */
+        function isInvalidPattern( $pattern, $string)
+        {
+            if(($pattern)=== '')
+            {
+                return false;
+            }
+            else if (strpos($pattern,",")!==false)
+            {
+                $regExps = explode(',', $pattern);
+                foreach ($regExps as $regExp => $value)
+                {
+                    if(eregi($value, $string))
+                    {
+                        return true;
+                    }
+                }               
+            }
+            else if(eregi($pattern, $string))
+            {
+                return true;
+            }
+            return false;
+           
+        }  
+   			
+
+		/**
+		 * cut the file down to fit the list page
+		 *
+		 * @param string $fileName
+		 */
+		function shortenFileName($fileName, $maxLeng=17, $indicate = '...')
+		{
+			if(strlen($fileName) > $maxLeng)
+			{
+				$fileName = substr($fileName, 0, $maxLeng - strlen($indicate)) . $indicate;
+			}
+			return $fileName;
+			
+		}
+		if (!function_exists('mime_content_type')) 
+		{
+		   function mime_content_type ( $f )
+		   {
+		       return trim ( @exec ('file -bi ' . escapeshellarg ( $f ) ) ) ;
+		   }
+		}		
+		
+         /**
+          * check if such document is allowed to shown on the list
+          *
+          * @param string $path the path to the document
+          * @return boolean
+          */
+         function isListingDocument($path)
+         {
+         	$file = basename($path);
+         	if(CONFIG_SYS_PATTERN_FORMAT == 'list')
+         	{// comma delimited vague file/folder name
+
+
+
+			    		
+      			if(is_dir($path))
+      			{
+ 				$includeDir = trimlrm(CONFIG_SYS_INC_DIR_PATTERN);
+				$excludeDir = trimlrm(CONFIG_SYS_EXC_DIR_PATTERN);     				
+				$found_includeDir = strpos($includeDir, $file);
+				$found_excludeDir = strpos($excludeDir, $file);      				
+      				if((!CONFIG_SYS_INC_DIR_PATTERN || (!($found_includeDir === FALSE))) && (!CONFIG_SYS_EXC_DIR_PATTERN || (($found_excludeDir === FALSE))))
+      				{
+      					return true;
+      				}else 
+      				{
+      					return false;
+      				}
+      			}elseif(is_file($path))
+      			{
+				$includeFile = trimlrm(CONFIG_SYS_INC_FILE_PATTERN);
+				$excludeFile = trimlrm(CONFIG_SYS_EXC_FILE_PATTERN);            				
+				$found_includeFile = strpos($includeFile, $file);
+				$found_excludeFile = strpos($excludeFile, $file);	      				
+      				if((!CONFIG_SYS_INC_FILE_PATTERN || (!($found_includeFile === FALSE))) && (!CONFIG_SYS_EXC_FILE_PATTERN ||   (($found_excludeFile === FALSE))))
+      				{
+      					return true;
+      				}else 
+      				{
+      					return false;
+      				}
+      			}
+         	}elseif(CONFIG_SYS_PATTERN_FORMAT == 'csv')
+         	{//comma delimited file/folder name
+         		
+         		if(is_dir($path))
+         		{
+         		
+	 				$includeDir = trimlrm(CONFIG_SYS_INC_DIR_PATTERN);
+					$excludeDir = trimlrm(CONFIG_SYS_EXC_DIR_PATTERN);
+					        
+					if(!empty($includeDir) && !empty($excludeDir))
+					{
+						
+						$validDir = explode(',', $includeDir);
+						
+						$invalidDir = explode(",", $excludeDir);
+
+						if(array_search(basename($path), $validDir) !== false && array_search(basename($path), $invalidDir) === false)
+						{
+							return true;
+						}else 
+						{
+							return false;
+						}
+					}elseif(!empty($includeDir))
+					{
+						$validDir = explode(',', $includeDir);
+						if(array_search(basename($path), $validDir) !== false)
+						{
+							return true;
+						}else 
+						{
+							return false;
+						}
+						
+					}elseif(!empty($excludeFile))
+					{
+						$invalidDir = explode(",", $excludeDir);
+						if(array_search(basename($path), $invalidDir) === false)
+						{
+							return true;
+						}else 
+						{
+							return false;
+						}
+					}
+					return true;
+					
+         		}elseif(is_file($path))
+         		{
+				$includeFile = trimlrm(CONFIG_SYS_INC_FILE_PATTERN);
+				$excludeFile = trimlrm(CONFIG_SYS_EXC_FILE_PATTERN);   
+				if(!empty($includeFile) && !empty($excludeFile))
+				{
+					$validFile = explode(',', $includeFile);
+					$invalidFile = explode(',', $excludeFile);
+					if(array_search(basename($path), $validFile) !== false && array_search(basename($path), $invalidFile) === false)
+					{
+						return true;
+					}else 
+					{
+						return false;
+					}
+				}elseif(!empty($includeFile))
+				{
+					$validFile = explode(',', $includeFile);
+					if(array_search(basename($path), $validFile) !== false)
+					{
+						return true;
+					}else 
+					{
+						return false;
+					}
+				}elseif(!empty($excludeFile))
+				{
+					$invalidFile = explode(',', $excludeFile);
+					if(array_search(basename($path), $invalidFile) === false)
+					{
+						return true;
+					}else 
+					{
+						return false;
+					}
+				}
+				return true;
+         		}
+         	}
+         	else 
+         	{//regular expression
+	          	if(is_dir($path) )
+	         	{
+	         		if(isValidPattern(CONFIG_SYS_INC_DIR_PATTERN, $path) && !isInvalidPattern(CONFIG_SYS_EXC_DIR_PATTERN, $path))
+	         		{
+	         			 return true;	
+	         		}else 
+	         		{
+	         			return false;
+	         		}
+	         	
+	         	}elseif(is_file($path))
+	         	{
+	         		if(isValidPattern(CONFIG_SYS_INC_FILE_PATTERN, $path) && !isInvalidPattern(CONFIG_SYS_EXC_FILE_PATTERN, $path)  )
+	         		{
+	         			return true;
+	         		}else 
+	         		{
+	         			return false;
+	         		}
+	         	}
+         	}
+         	return false;
+
+         }		
+		
+		/**
+		 * force to down the specified file
+		 *
+		 * @param string $path
+		 * 
+		 */
+		function downloadFile($path, $newFileName=null)
+		{
+				if(file_exists($path) && is_file($path))
+				{	
+					$mimeContentType = 'application/octet-stream';
+					if(function_exists('finfo_open'))
+					{
+						if(($fp = @finfo_open($path)))
+						{
+							$mimeContentType = @finfo_file($fp, basename($path));
+							@finfo_close($fp);
+						}
+						
+					}elseif(($temMimeContentType = @mime_content_type($path)) && !empty($temMimeContentType))
+					{
+						$mimeContentType = $temMimeContentType;
+					}
+					
+ 					
+					
+						
+
+			// START ANDR� SILVA DOWNLOAD CODE
+			// required for IE, otherwise Content-disposition is ignored
+			if(ini_get('zlib.output_compression'))
+			  ini_set('zlib.output_compression', 'Off');
+			header("Pragma: public"); // required
+			header("Expires: 0");
+			header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
+			header("Cache-Control: private",false); // required for certain browsers 
+			header("Content-Type: " . $mimeContentType );
+			// change, added quotes to allow spaces in filenames, by Rajkumar Singh
+			header("Content-Disposition: attachment; filename=\"".(is_null($newFileName)?basename($path):$newFileName)."\";" );
+			header("Content-Transfer-Encoding: binary");
+			header("Content-Length: ".filesize($path));
+		
+			readfile($path);
+			exit();
+			// END ANDR� SILVA DOWNLOAD CODE												
+				}
+		
+		}
+
+  /**
+   * remove all white spaces
+   *
+   * @param string $hayStack 
+   * @param string $whiteSpaceChars
+   * @return string
+   */
+  function trimlrm ($hayStack, $whiteSpaceChars="\t\n\r\0\x0B")
+  {
+  	return str_replace($whiteSpaceChars, '', trim($hayStack));
+  }		
+  
+  /**
+   * get the parent path of the specified path
+   *
+   * @param string $path
+   * @return string 
+   */
+  function getParentFolderPath($path)
+  {
+  	$realPath = addTrailingSlash(backslashToSlash(getRealPath($path)));
+  	$parentRealPath =  addTrailingSlash(backslashToSlash(dirname($realPath)));
+  	$differentPath = addTrailingSlash(substr($realPath, strlen($parentRealPath)));
+  	$parentPath = substr($path, 0, strlen(addTrailingSlash(backslashToSlash($path))) - strlen($differentPath));
+  	if(isUnderRoot($parentPath))
+  	{
+  		return $parentPath;
+  	}else 
+  	{
+  		return CONFIG_SYS_DEFAULT_PATH;
+  	}
+  }
+  
+  function getCurrentFolderPath()
+  {
+  		$folderPathIndex = 'path';
+  		$lastVisitedFolderPathIndex = 'ajax_last_visited_folder';
+		if(isset($_GET[$folderPathIndex]) && file_exists($_GET[$folderPathIndex]) && !is_file($_GET[$folderPathIndex]) )
+		{
+			$currentFolderPath = $_GET[$folderPathIndex];
+		}
+		elseif(isset($_SESSION[$lastVisitedFolderPathIndex]) && file_exists($_SESSION[$lastVisitedFolderPathIndex]) && !is_file($_SESSION[$lastVisitedFolderPathIndex]))
+		{
+			$currentFolderPath = $_SESSION[$lastVisitedFolderPathIndex];
+		}else
+		{
+			$currentFolderPath = CONFIG_SYS_DEFAULT_PATH;
+		}
+		
+		$currentFolderPath = (isUnderRoot($currentFolderPath)?backslashToSlash((addTrailingSlash($currentFolderPath))):CONFIG_SYS_DEFAULT_PATH);
+		
+		//keep track of this folder path in session 
+		$_SESSION[$lastVisitedFolderPathIndex] = $currentFolderPath;
+		
+
+		if(!file_exists($currentFolderPath))
+		{
+			die(ERR_FOLDER_NOT_FOUND . $currentFolderPath);
+		}  	
+  }
+  
+       if(!function_exists("imagerotate"))
+        {
+            function imagerotate($src_img, $angle, $bicubic=false)
+            {
+    // convert degrees to radians
+    
+    $angle =  (360 - $angle) + 180;
+    $angle = deg2rad($angle);
+   
+    $src_x = imagesx($src_img);
+    $src_y = imagesy($src_img);
+   
+    $center_x = floor($src_x/2);
+    $center_y = floor($src_y/2);
+   
+    $rotate = imagecreatetruecolor($src_x, $src_y);
+    imagealphablending($rotate, false);
+    imagesavealpha($rotate, true);
+
+    $cosangle = cos($angle);
+    $sinangle = sin($angle);
+   
+    for ($y = 0; $y < $src_y; $y++) {
+      for ($x = 0; $x < $src_x; $x++) {
+    // rotate...
+    $old_x = (($center_x-$x) * $cosangle + ($center_y-$y) * $sinangle)
+      + $center_x;
+    $old_y = (($center_y-$y) * $cosangle - ($center_x-$x) * $sinangle)
+      + $center_y;
+   
+    if ( $old_x >= 0 && $old_x < $src_x
+         && $old_y >= 0 && $old_y < $src_y ) {
+      if ($bicubic == true) {
+        $sY  = $old_y + 1;
+        $siY  = $old_y;
+        $siY2 = $old_y - 1;
+        $sX  = $old_x + 1;
+        $siX  = $old_x;
+        $siX2 = $old_x - 1;
+       
+        $c1 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX, $siY2));
+        $c2 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX, $siY));
+        $c3 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX2, $siY2));
+        $c4 = imagecolorsforindex($src_img, imagecolorat($src_img, $siX2, $siY));
+       
+        $r = ($c1['red']  + $c2['red']  + $c3['red']  + $c4['red']  ) << 14;
+        $g = ($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) << 6;
+        $b = ($c1['blue']  + $c2['blue']  + $c3['blue']  + $c4['blue'] ) >> 2;
+        $a = ($c1['alpha']  + $c2['alpha']  + $c3['alpha']  + $c4['alpha'] ) >> 2;
+        $color = imagecolorallocatealpha($src_img, $r,$g,$b,$a);
+      } else {
+        $color = imagecolorat($src_img, $old_x, $old_y);
+      }
+    } else {
+          // this line sets the background colour
+      $color = imagecolorallocatealpha($src_img, 255, 255, 255, 127);
+    }
+    imagesetpixel($rotate, $x, $y, $color);
+      }
+    }
+    return $rotate;          	
+/*                $src_x = @imagesx($src_img);
+                $src_y = @imagesy($src_img);
+                if ($angle == 180)
+                {
+                    $dest_x = $src_x;
+                    $dest_y = $src_y;
+                }
+                elseif ($src_x <= $src_y)
+                {
+                    $dest_x = $src_y;
+                    $dest_y = $src_x;
+                }
+                elseif ($src_x >= $src_y) 
+                {
+                    $dest_x = $src_y;
+                    $dest_y = $src_x;
+                }     
+		 		if(function_exists('ImageCreateTrueColor'))
+		 		{
+					$rotate = @ImageCreateTrueColor($dst_w,$dst_h);
+				} else {
+					$rotate = @ImageCreate($dst_w,$dst_h);
+				}                   
+                @imagealphablending($rotate, false);
+               
+                switch ($angle)
+                {
+                    case 270:
+                        for ($y = 0; $y < ($src_y); $y++)
+                        {
+                            for ($x = 0; $x < ($src_x); $x++)
+                            {
+                                $color = imagecolorat($src_img, $x, $y);
+                                imagesetpixel($rotate, $dest_x - $y - 1, $x, $color);
+                            }
+                        }
+                        break;
+                    case 90:
+                        for ($y = 0; $y < ($src_y); $y++)
+                        {
+                            for ($x = 0; $x < ($src_x); $x++)
+                            {
+                                $color = imagecolorat($src_img, $x, $y);
+                                imagesetpixel($rotate, $y, $dest_y - $x - 1, $color);
+                            }
+                        }
+                        break;
+                    case 180:
+                        for ($y = 0; $y < ($src_y); $y++)
+                        {
+                            for ($x = 0; $x < ($src_x); $x++)
+                            {
+                                $color = imagecolorat($src_img, $x, $y);
+                                imagesetpixel($rotate, $dest_x - $x - 1, $dest_y - $y - 1, $color);
+                            }
+                        }
+                        break;
+                    default: $rotate = $src_img;
+                };
+                return $rotate;*/
+            }
+        }  
+?>

+ 1842 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxfilemanager.js

@@ -0,0 +1,1842 @@
+/*
+/*
+	* author: Logan Cai
+	* Email: cailongqun [at] yahoo [dot] com [dot] cn
+	* Website: www.phpletter.com
+	* Created At: 21/April/2007
+	* Modified At: 1/June/2007
+*/
+// Returns true if the passed value is found in the
+// array. Returns false if it is not.
+Array.prototype.inArray = function (value,caseSensitive)
+{
+	var i;
+	for (i=0; i < this.length; i++) 
+	{
+		// use === to check for Matches. ie., identical (===),
+		if(caseSensitive){ //performs match even the string is case sensitive
+		if (this[i].toLowerCase() == value.toLowerCase()) 
+		{
+			return true;
+		}
+		}else
+		{
+			if (this[i] == value) 
+			{
+				return true;
+			}
+		}
+	}
+	return false;
+};
+ var dcTime=250;    // doubleclick time
+ var dcDelay=100;   // no clicks after doubleclick
+ var dcAt=0;        // time of doubleclick
+ var savEvent=null; // save Event for handling doClick().
+ var savEvtTime=0;  // save time of click event.
+ var savTO=null;    // handle of click setTimeOut
+ var linkElem = null;
+ 
+ 
+ function hadDoubleClick() 
+ {
+   var d = new Date();
+   var now = d.getTime();
+   if ((now - dcAt) < dcDelay) 
+   {
+     return true;
+   }
+   return false;
+ };
+
+ 
+/**
+*	enable left click to preview certain files
+*/
+function enablePreview(elem, num)
+{
+		
+		$(elem).each(
+				 function()
+				 {
+					 
+					 $(this).click(function ()
+					{
+						
+						//alert('single click');
+						var num = getNum(this.id);
+						var path = files[num].path;
+						//alert('now: ' + now + '; dcat: ' + dcAt + '; dcDelay: ' + dcDelay);
+						if (hadDoubleClick())
+						{
+							return false;
+						}else
+						{
+							linkElem = $('#a' + num).get(0);
+						}	
+						
+				       d = new Date();
+						savEvtTime = d.getTime();
+						savTO = setTimeout(function()
+						{
+						if (savEvtTime - dcAt > 0) 
+						{
+						//check if this file is previewable
+						
+						
+						var ext = getFileExtension(path);
+						var supportedExts = supporedPreviewExts.split(",");
+						var isSupportedExt = false;
+						for (i in supportedExts)
+						{
+							var typeOf = typeof(supportedExts[i]);
+							//alert(supportedExts[i]);
+							if(typeOf.toLowerCase() == 'string' && supportedExts[i].toLowerCase() == ext.toLowerCase())
+							{
+								isSupportedExt = true;
+								break;
+							}
+						
+						}
+												
+						if(isSupportedExt)
+						{
+							switch(files[num].cssClass)
+							{
+								case 'fileVideo':
+								case 'fileMusic':
+								case 'fileFlash':
+																											
+									$('#playGround').html('<a id="playGround' + num + '" href="' + files[num].path + '"><div id="player">&nbsp;this is mine</div></a> ');
+									
+									
+									$('#playGround' + num).html('');																		
+									$('#playGround' + num).media({ width: 255, height: 210,  autoplay: true  });		
+									//alert($('#playGround' + num).html());																	
+									showThickBox($('#a' + num).get(0), appendQueryString('#TB_inline', 'height=250'  + '&width=256' + '&inlineId=winPlay&modal=true'));
+						
+									break;
+								default:
+									showThickBox(linkElem, appendQueryString(path, 'KeepThis=true&TB_iframe=true&height=' + thickbox.height + '&width=' + thickbox.width));	
+									
+							}
+							
+						}
+						
+						}
+						
+						
+						return false;															
+						
+						}, dcTime);	
+																	 
+																	 return false;
+																	 
+																	 });
+					$(this).dblclick(function()
+					{
+					   var d = new Date();
+					   dcAt = d.getTime();
+					   if (savTO != null) {
+					     clearTimeout( savTO );          // Clear pending Click  
+					     savTO = null;
+					     
+					   }
+					  
+					   if(typeof(selectFile) != 'undefined')
+					   {
+					   	
+					   	 selectFile(files[num].url);
+					   }else
+							generateDownloadIframe(appendQueryString(getUrl('download'), 'path=' + files[num].path, ['path']));					   {
+					   	
+					   }
+					   						
+					}
+					);
+
+				 }
+				 );
+};
+/**
+* add over class to the specific table
+*/
+function tableRuler(element)
+{
+	
+    var rows = $(element);
+	
+    $(rows).each(function(){
+        $(this).mouseover(function(){
+            $(this).addClass('over');
+        });
+        $(this).mouseout(function(){
+            $(this).removeClass('over');
+        });
+    });
+};
+
+			
+
+
+
+
+
+function previewMedia(rowNum)
+{
+	$('#preview' +rowNum).html('');
+	$('#preview' +rowNum).media({ width: 255, height: 210,  autoplay: true  });
+	return false;
+};
+
+function getFileExtension(filename) 
+{ 
+ if( filename.length == 0 ) return ""; 
+ var dot = filename.lastIndexOf("."); 
+ if( dot == -1 ) return ""; 
+ var extension = filename.substr(dot + 1,filename.length); 
+ return extension; 
+}; 
+
+function closeWindow()
+{
+	if(window.confirm(warningCloseWindow))
+	{
+		window.close();
+	}
+	return false;
+};
+
+/**
+*	return the url with query string
+*/
+function getUrl(index,limitNeeded , viewNeeded, searchNeeded)
+{
+
+	var queryStr = '';
+	var excluded = new Array();
+	
+	if(typeof(limitNeeded) == 'boolean' && limitNeeded)
+	{
+		var limit = document.getElementById('limit');
+		var typeLimit = typeof(limit);
+		
+		if(typeLimit != 'undefined' && limit )
+		{
+			excluded[excluded.length] = 'limit';
+			queryStr += (queryStr == ''?'':'&') + 'limit=' + limit.options[limit.selectedIndex].value;				
+		}
+		
+	}
+	if(typeof(viewNeeded) == 'boolean' && viewNeeded)
+	{
+		queryStr += (queryStr == ''?'':'&') + 'view=' +  getView();
+		excluded[excluded.length] = 'view';
+		
+	}
+	
+	if(typeof(searchNeeded) == 'boolean' && searchNeeded && searchRequired)
+	{
+		var search_recursively = 0;
+		$('input[@name=search_recursively][@checked]').each(
+															function()
+															{
+																search_recursively = this.value;	
+															}
+															);		
+		var searchFolder = document.getElementById('search_folder');
+		queryStr += (queryStr == ''?'':'&') + 'search=1&search_name=' + $('#search_name').val() + '&search_recursively=' + search_recursively + '&search_mtime_from=' + $('#search_mtime_from').val() + '&search_mtime_to=' + $('#search_mtime_to').val() + '&search_folder=' +  searchFolder.options[searchFolder.selectedIndex].value;
+		excluded[excluded.length] = 'search';
+		excluded[excluded.length] = 'search_recursively';
+		excluded[excluded.length] = 'search_mtime_from';
+		excluded[excluded.length] = 'search_mtime_to';
+		excluded[excluded.length] = 'search_folder';
+		excluded[excluded.length] = 'search_name';
+		excluded[excluded.length] = 'search';
+		
+	}
+	
+	
+
+	return appendQueryString(appendQueryString(urls[index], queryString), queryStr, excluded);
+};
+/**
+*	change view
+*/
+function changeView()
+{
+
+		var url = getUrl('view', true, true);
+		$('#rightCol').empty();
+		ajaxStart('#rightCol');		
+		
+		$('#rightCol').load(url, 
+					{},
+					function(){
+							ajaxStop('#rightCol img.ajaxLoadingImg');
+							urls.present = getUrl('home', true, true);
+							initAfterListingLoaded();
+						});
+};
+
+function goParentFolder()
+{
+
+		searchRequired = false;
+		var url = appendQueryString(getUrl('view', true, true), 'path=' + parentFolder.path , ['path']);
+		$('#rightCol').empty();
+		ajaxStart('#rightCol');		
+		
+		$('#rightCol').load(url, 
+					{},
+					function(){
+							urls.present = appendQueryString(getUrl('home', true, true), 'path=' + parentFolder.path , ['path']);
+							ajaxStop('#rightCol img.ajaxLoadingImg');
+							initAfterListingLoaded();
+						});
+
+};
+
+/**
+*	append Query string to the base url
+* @param string baseUrl the base url
+* @param string the query string
+* @param array remove thost url variable from base url if any matches
+*/
+function appendQueryString(baseUrl, queryStr, excludedQueryStr)
+{
+	
+	if(typeof(excludedQueryStr) == 'object' && excludedQueryStr.length)
+	{
+		var isMatched = false;
+		var urlParts = baseUrl.split("?");
+		baseUrl = urlParts[0];
+		var count = 1;
+		if(typeof(urlParts[1]) != 'undefined' && urlParts[1] != '')
+		{//this is the query string parts
+			var queryStrParts = urlParts[1].split("&");
+			for(var i=0; i < queryStrParts.length; i++)
+			{
+				//split into query string variable name & value
+				var queryStrVariables = queryStrParts[i].split('=');
+				for(var j=0; j < excludedQueryStr.length; j++)
+				{
+					if(queryStrVariables[0] == excludedQueryStr[j])
+					{
+						isMatched = true;
+					}
+				}	
+				if(!isMatched)
+				{
+					baseUrl += ((count==1?'?':'&') + queryStrVariables[0] + '=' + queryStrVariables[1]);
+					count++;
+				}
+			}
+		}
+
+	}
+	if(queryStr != '')
+	{
+		return (baseUrl.indexOf('?')> -1?baseUrl + '&' + queryStr:baseUrl + '?' + queryStr);
+	}else
+	{
+		return baseUrl;
+	}
+	
+	
+	
+	
+};
+
+
+/**
+*	initiate when the listing page is loaded
+* add main features according to the view
+*/
+function initAfterListingLoaded()
+{
+
+	
+	parsePagination();
+
+	parseCurrentFolder();
+	var view = getView();
+	
+	setDocInfo('root');
+	
+	if(view != '')
+	{
+			
+		switch(view)
+		{
+
+				
+			case 'thumbnail':
+				//enableContextMenu('dl.thumbnailListing, dl.thumbnailListing dt, dl.thumbnailListing dd, dl.thumbnailListing a');
+				enableContextMenu('dl.thumbnailListing');
+				for(i in files)
+				{
+					if(files[i].type== 'folder')
+					{//this is foder item
+						
+						enableFolderBrowsable(i);
+					}else
+					{//this is file item
+						
+						switch(files[i].cssClass)
+						{
+							case 'filePicture':
+								//$('#a' + i).attr('rel', 'ajaxphotos');
+								//retrieveThumbnail(i);
+								
+								break;
+							case 'fileFlash':
+								break;
+							case 'fileVideo':
+								break;			
+							case 'fileMusic':
+								break;
+							default:
+							
+								
+						}
+						enablePreview('#dt' + i, i);
+						enablePreview('#thumbUrl' + i, i);
+						enablePreview('#a' + i, i);
+
+					}
+					enableShowDocInfo( i);
+					
+				}
+				break;
+			case 'detail':
+			default:
+				
+				enableContextMenu('#fileList tr');
+				for(i in files)
+				{
+					if(files[i].type== 'folder')
+					{//this is foder item
+						enableFolderBrowsable(i);
+					}else
+					{//this is file item
+						switch(files[i].cssClass)
+						{
+							case 'filePicture':
+								$('#row' + i + ' td a').attr('rel', 'ajaxphotos');
+								break;
+							case 'fileFlash':
+								break;
+							case 'fileVideo':
+								break;			
+							case 'fileMusic':
+								break;
+							default:						
+								
+						};	
+						enablePreview('#row' + i + ' td a', i);
+						
+					}	
+					enableShowDocInfo(i);				
+				}				
+				break;
+
+			
+		}
+	}	
+	
+	
+};
+
+function enableFolderBrowsable(num, debug)
+{
+	
+	switch(getView())
+	{
+		case 'thumbnail':
+			$('#dt'+ num + ' , #dd' + num + ' a').each(function()
+																						 
+				{		
+/*					if(typeof(debug) != 'undefined' && debug)
+					{
+						alert(this.tagName  + ' ' +  files[num].path);
+					}*/
+					doEnableFolderBrowsable(this, num);
+				}
+			);
+			break;
+		case 'detail':
+		default:
+		$('#row' + num + ' td[a]').each(function()
+																						 
+				{		
+					doEnableFolderBrowsable(this, num );
+				}
+			);
+			
+	}
+	
+		
+		
+	
+};
+
+function doEnableFolderBrowsable(elem, num)
+{
+									 $(elem).click(function()
+									{
+									 {
+									 	searchRequired = false;
+									 	var typeNum = typeof(num);
+									 	if(typeNum.toUpperCase() == 'STRING')
+									 	{
+									 		var fpath = (num.indexOf(urls.view) >=0?num:files[num].path);
+									 	}else
+									 	{
+									 		var fpath = files[num].path;
+									 	}								 	
+									 	
+									 	
+										 var url = appendQueryString(getUrl('view', true, true), 'path=' + fpath, ['path']);
+										 
+										 
+										 $('#rightCol').empty();	
+										 ajaxStart('#rightCol');
+										$('#rightCol').load(url, 
+													{},
+													function(){
+														    urls.present = appendQueryString(getUrl('home', true, true), 'path=' + fpath, ['path']);
+															ajaxStop('#rightCol img.ajaxLoadingImg');
+															initAfterListingLoaded();
+														});																									 
+									 };
+									 return false;	
+
+								}
+								);									 
+};
+
+/**
+* @param mixed destinationSelector where the animation image will be append to
+*	@param mixed selectorOfAnimation the jquery selector of the animation 
+*/
+function ajaxStart(destinationSelector, id, selectorOfAnimation)
+{
+	if(typeof(selectorOfAnimation) == 'undefined')
+	{//set defaullt animation
+		selectorOfAnimation = '#ajaxLoading img';
+	}
+	if(typeof(id) != 'undefined')
+	{
+		$(selectorOfAnimation).clone().attr('id', id).appendTo(destinationSelector);
+
+	}else
+	{
+		$(selectorOfAnimation).clone(true).appendTo(destinationSelector);
+		
+	}
+	
+	
+};
+/**
+* remove the ajax animation 
+*	@param mixed selectorOfAnimation the jquery selector of the animation 
+*/
+function ajaxStop(selectorOfAnimation)
+{
+	$(selectorOfAnimation).remove();
+};
+/**
+*	change pagination limit
+*/
+function changePaginationLimit(elem)
+{
+		var url = getUrl('view', true, true, true);
+		$('#rightCol').empty();
+		ajaxStart('#rightCol');				
+		$('#rightCol').load(url, 
+					{},
+					function(){
+							urls.present = appendQueryString(getUrl('home', true, true), 'path=' + parentFolder.path , ['path'])
+							ajaxStop('#rightCol img.ajaxLoadingImg');
+							initAfterListingLoaded();
+						});	
+};
+/**
+*	get a query string variable value from an url
+* @param string index
+* @param string url
+*/
+function getUrlVarValue(url, index)
+{
+	
+	if(url != '' && index != '')
+	{
+		var urlParts = url.split("?");
+		baseUrl = urlParts[0];	
+		var count = 1;
+		if(typeof(urlParts[1]) != 'undefined' && urlParts[1] != '')
+		{//this is the query string parts
+			var queryStrParts = urlParts[1].split("&");
+			for(var i=0; i < queryStrParts.length; i++)
+			{
+				//split into query string variable name & value
+				var queryStrVariables = queryStrParts[i].split('=');
+				if(queryStrVariables[0] == index)
+				{
+					return queryStrVariables[1];
+				}
+			}
+		}		
+	}
+	return '';
+
+};
+/**
+*	parse current folder
+*/
+function parseCurrentFolder()
+{
+	var folders = currentFolder.friendly_path.split('/');
+	var str = '';
+	var url = getUrl('view', true, true);
+
+	var parentPath = '';
+	for(var i = 0; i < folders.length; i++)
+	{
+		if(i == 0)
+		{
+			parentPath += paths.root;
+			str += '/<a href="' + appendQueryString(url, 'path='+ parentPath, ['path']) + '"><span class="folderRoot">' + paths.root_title + '</span></a>'
+			
+		}else
+		{
+			if(folders[i] != '')
+			{
+				
+				parentPath += folders[i] + '/';
+				str += '/<a href="' + appendQueryString(url, 'path='+ parentPath , ['path']) + '"><span class="folderSub">' + folders[i] + '</span></a>';
+			}
+		}
+	}
+	$('#currentFolderPath').empty().append(str);
+	$('#currentFolderPath a').each(
+																 function()
+																 {
+																	 doEnableFolderBrowsable(this, $(this).attr('href'));
+																 }
+																 );
+};
+/**
+*	enable pagination as ajax function call
+*/
+function parsePagination()
+{
+	$('p.pagination a[@id!=pagination_parent_link]').each(function ()
+																		 {
+																			 $(this).click(
+																										 function()
+																										 {
+																													
+
+																											var page =  getUrlVarValue($(this).attr('href'), 'page');
+																											var url = appendQueryString(getUrl('view', true, true, searchRequired),'page=' + page, ['page']);
+																											$('#rightCol').empty();
+																											ajaxStart('#rightCol');
+																											$('#rightCol').load(url, 
+																														{},
+																														function(){
+																															urls.present = appendQueryString(getUrl('home', true, true, searchRequired),'page=' + page, ['page']);
+																																ajaxStop('#rightCol img.ajaxLoadingImg');
+																																initAfterListingLoaded();
+																															});	
+																											return false;
+																										 }
+																										 
+																										 );
+																		 }
+																		 );
+};
+/**
+*	get current view
+*/
+function getView()
+{
+	var view = $('input[@name=view][@checked]').get(0);
+	if(typeof(view) != 'undefined')
+	{
+		return view.value;
+	}else
+	{
+		return '';
+	}
+};
+
+function getNum(elemId)
+{
+	
+	if(typeof(elemId) != 'undefined' && elemId != '')
+	{
+		var r = elemId.match(/[\d\.]+/g);	
+		if(typeof(r) != 'undefined' &&  r &&  typeof(r[0]) != 'undefined')
+		{
+			return r[0];
+		}		
+	}
+
+	return 0;
+};
+
+function enableContextMenu(jquerySelectors)
+{
+	
+	$(jquerySelectors).contextMenu('contextMenu', 
+																 {
+																 bindings:
+																 {
+																		'menuSelect':function(t)
+																		{
+																			var num = (getNum($(t).attr('id')));	
+																			
+																			selectFile(files[num].url);
+																		},
+																		'menuPlay':function(t)
+																		{
+																			var num = (getNum($(t).attr('id')));																			
+																			$('#playGround').html('<a id="playGround' + num + '" href="' + files[num].path + '"><div id="player">&nbsp;this is mine</div></a> ');
+																			
+																			
+																			$('#playGround' + num).html('');																		
+																			$('#playGround' + num).media({ width: 255, height: 210,  autoplay: true  });		
+																			//alert($('#playGround' + num).html());																	
+																			showThickBox($('#a' + num).get(0), appendQueryString('#TB_inline', 'height=250'  + '&width=258' + '&inlineId=winPlay&modal=true'));
+
+																			
+																			
+																		},
+																		'menuPreview':function(t)
+																		{
+																			var num = (getNum($(t).attr('id')));
+																			$('#a' + num).click();					
+																		},
+																		'menuDownload':function(t)
+																		{
+																			var num = (getNum($(t).attr('id')));		
+																			generateDownloadIframe(appendQueryString(getUrl('download', false, false), 'path=' + files[num].path, ['path']));
+																		},
+																		'menuRename':function(t)
+																		{
+																			var num = (getNum($(t).attr('id')));
+
+																			showThickBox($('#a' + num).get(0), appendQueryString('#TB_inline', 'height=100' + '&width=350' + '&inlineId=winRename&modal=true'));
+																			
+																			$('div#TB_window #renameName').val(files[num].name);
+																			$('div#TB_window #original_path').val(files[num].path);
+																			$('div#TB_window #renameNum').val(num);																			
+																		},
+																		'menuEdit':function(t)
+																		{
+																			var num = (getNum($(t).attr('id')));
+																			var url = '';
+																			switch(files[num].cssClass)
+																			{
+																				case 'filePicture':
+																					url = getUrl('image_editor');
+																					break;
+																				default:
+																					url = getUrl('text_editor');
+																					
+																			}
+																				 var param = "status=yes,menubar=no,resizable=yes,scrollbars=yes,location=no,toolbar=no";
+																				 param += ",height=" + screen.height + ",width=" + screen.width;
+																				if(typeof(window.screenX) != 'undefined')
+																				{
+																					param += ",screenX = 0,screenY=0";
+																				}else if(typeof(window.screenTop) != 'undefined' )
+																				{
+																					param += ",left = 0,top=0" ;
+																				}		 
+																				var newWindow = window.open(url + ((url.lastIndexOf("?") > - 1)?"&":"?") + "path="  + files[num].path,'', param);
+																				newWindow.focus( );																						
+	
+																				
+																		},
+
+																		'menuCut':function(t)
+																		{
+																			
+																		},
+																		'menuCopy':function(t)
+																		{
+																			
+																		},
+																		'menuPaste':function(t)
+																		{
+																			
+																		},
+																		'menuDelete':function(t)
+																		{
+																			var num = (getNum($(t).attr('id')));
+																			if(window.confirm(warningDelete))
+																			{
+																				$.getJSON(appendQueryString(getUrl('delete', false,false), 'delete=' + files[num].path, ['delete']), 
+																				function(data)
+																				{
+																					if(typeof(data.error) == 'undefined')
+																					{
+																						alert('Unexpected Error.');
+																					}
+																					else if(data.error != '')
+																					{
+																						alert(data.error);
+																					}else
+																					{//remove deleted files
+																						switch(getView())
+																						{
+																							case 'thumbnail':																													$('#dl' + num ).remove();
+																								break;
+																							case 'detail':
+																							default:
+																								$('#row' + num).remove();
+																								
+																						}
+																						files[num] = null;
+																					}
+																				}
+																				);
+																				
+																							 				
+																			}																			
+																		}
+																 },
+																 	onContextMenu:function(events)
+																	{
+																	
+																		return true;
+																	},
+																	onShowMenu:function(events, menu)
+																	{
+																		
+																		switch(getView())
+																		{
+																			case 'thumbnail':
+																				var num = getNum(events.target.id);
+																		
+																				break;
+																			case 'detail':
+																			default:
+																				switch(events.target.tagName.toLowerCase())
+																				{
+																					case 'span':
+																						
+																						if($(events.target).parent().get(0).tagName.toLowerCase()  == 'a')
+																						{
+																							
+																							var num = getNum($(events.target).parent().parent().parent().attr('id'));			
+																						}else
+																						{
+																							var num = getNum($(events.target).parent().parent().parent().parent().attr('id'));			
+																						}
+																						
+																						
+																					
+																						break;
+																					case 'td':
+																					var num = getNum($(events.target).parent().attr('id'));																				
+																						break;
+																					case 'a':
+																				    case 'input':
+																				      var num = getNum($(events.target).parent().parent().attr('id'));			
+																				      break;
+																				}
+																		}
+																		
+																		var menusToRemove = new Array;
+																		if(typeof(selectFile) == 'undefined')
+																		{
+																			menusToRemove[menusToRemove.length] = '#menuSelect';
+																		}
+																		menusToRemove[menusToRemove.length] = '#menuCut';
+																		menusToRemove[menusToRemove.length] = '#menuCopy';
+																		menusToRemove[menusToRemove.length] = '#menuPaste';
+																		switch(files[num].type)
+																		{
+																			case 'folder':
+																				if(numFiles < 1)
+																				{
+																					menusToRemove[menusToRemove.length] = '#menuPaste';
+																				}
+																				menusToRemove[menusToRemove.length] = '#menuPreview';
+																				menusToRemove[menusToRemove.length] = '#menuDownload';
+																				menusToRemove[menusToRemove.length] = '#menuEdit';		
+																				menusToRemove[menusToRemove.length] = '#menuPlay';
+																				menusToRemove[menusToRemove.length] = '#menuDownload';
+																				
+																				break;
+																			default:
+																			var isSupportedExt = false;
+																			if(permits.edit)
+																			{
+																			var ext = getFileExtension(files[num].path);
+																			var supportedExts = supporedPreviewExts.split(",");
+																			
+																			for(var i = 0; i < supportedExts.length; i++)
+																			{
+																			if(typeof(supportedExts[i]) != 'undefined' && typeof(supportedExts[i]).toLowerCase() == 'string' && supportedExts[i].toLowerCase() == ext.toLowerCase())
+																			{
+																			isSupportedExt = true;
+																			break;
+																			}
+																			}
+																				
+																			}
+																			if(!isSupportedExt || permits.view_only)
+																			{
+																				menusToRemove[menusToRemove.length] = '#menuEdit';
+																			}
+	
+																																					
+																			switch(files[num].cssClass)
+																			{
+																				case 'filePicture':
+																					menusToRemove[menusToRemove.length] = '#menuPlay';
+																					break;
+																				case 'fileCode':
+																					menusToRemove[menusToRemove.length] = '#menuPlay';
+																					break;
+																				case 'fileVideo':
+																				case 'fileFlash':
+																				case 'fileMusic':
+																				
+																					menusToRemove[menusToRemove.length] = '#menuPreview';																					menusToRemove[menusToRemove.length] = '#menuEdit';
+																					break;
+																				default:
+																					menusToRemove[menusToRemove.length] = '#menuPreview';
+																					menusToRemove[menusToRemove.length] = '#menuPlay';
+																					
+																					
+																					
+																			}
+																			menusToRemove[menusToRemove.length] = '#menuPaste';
+																		}
+																		if(!permits.edit|| permits.view_only)
+																		{
+																			menusToRemove[menusToRemove.length] = '#menuEdit';
+																		}																		
+																		if(!permits.del || permits.view_only)
+																		{
+																			menusToRemove[menusToRemove.length] = '#menuDelete';
+																		}  
+																		if(!permits.cut || permits.view_only)
+																		{
+																			menusToRemove[menusToRemove.length] = '#menuCut';
+																		} 
+																		if(!permits.copy || permits.view_only)
+																		{
+																			menusToRemove[menusToRemove.length] = '#menuCopy';
+																		} 
+																		if((!permits.cut  && !permits.copy) || permits.view_only)
+																		{
+																			menusToRemove[menusToRemove.length] = '#menuPaste';
+																		} 
+																		if(!permits.rename || permits.view_only)
+																		{
+																			menusToRemove[menusToRemove.length] = '#menuRename';
+																		} 
+																																																																						
+																		//alert(menusToRemove.join(','));
+																		var txt = '';
+																		for(var t in menu)
+																		{
+																			//txt += t + ': ' + menu[t] + '\n';
+																		}
+																		$(menu).children().children().children().each(
+																			function()
+																			{
+																				if(menusToRemove.inArray('#' + this.id))
+																				{
+																					$(this).parent().remove();
+																				}
+																				//alert(this.id);
+															
+																				
+																			}
+																		)
+																		//alert(menusToRemove.join(','));
+																		//$(menusToRemove.join(','), $(menu).children().children().children()).remove();								
+																		
+																
+																		return menu;
+																	}
+																 }
+																 );	
+};
+
+
+var fileUploadElemIds = new Array(); //keep track of the file element ids
+/**
+*	add more file type of input file for multiple uploads
+*/
+function addMoreFile()
+{
+	
+	var newFileUpload = $($('div#TB_window #fileUploadBody  tr').get(0)).clone();
+	
+	do
+	{
+		var elementId = 'upload' + generateUniqueId(10);
+	}while(fileUploadElemIds.inArray(elementId));
+	
+	fileUploadElemIds[fileUploadElemIds.length] = elementId;	
+
+	$(newFileUpload).appendTo('div#TB_window #fileUploadBody');
+	$('input[@type=file]', newFileUpload).attr('id', elementId);
+	$('span.uploadProcessing', newFileUpload).attr('id', 'ajax' + elementId);
+	$('input[@type=button]', newFileUpload).click(
+		function()
+		{
+			uploadFile(elementId);
+		}
+	);
+	$('a', newFileUpload).show().click(
+		function()
+		{
+			cancelFileUpload(elementId);
+		}
+	);
+
+
+	$(newFileUpload).show();
+	
+	return false;
+};
+/**
+*	cancel uploading file
+*   remove hidden upload frame
+*   remove hidden upload form
+*/
+function cancelFileUpload(elementId)
+{
+	$('div#TB_window #' + elementId).parent().parent().remove();
+
+	//ensure there is at least one visible upload element
+	while($('div#TB_window #fileUploadBody tr').length < 2)
+	{
+		addMoreFile();
+	}
+	return false;	
+};
+/**
+*	upload file
+*/
+function uploadFile(elementId)
+{
+
+		var ext = getFileExtension($('#' + elementId).val());
+		if(ext == '')
+		{
+			alert(noFileSelected );
+			return false;
+		}
+		var supportedExts = supportedUploadExts.split(",");
+		var isSupportedExt = false;
+		
+		for (i in supportedExts)
+		{
+			//alert(typeof(supportedExts[i]));
+			if(typeof(supportedExts[i]) == 'string')
+			{
+				isSupportedExt = true;
+				break;				
+			}
+		}	
+		
+		if(!isSupportedExt)
+		{
+			alert(msgInvalidExt);
+			return false;
+		}
+	
+		$('#ajax' + elementId).hide();
+		$('#ajax' + elementId).show();
+		$.ajaxFileUpload
+		(
+			{
+				url:appendQueryString(getUrl('upload', false, false), 'folder=' + currentFolder.path, ['folder']),
+				secureuri:false,
+				fileElementId:elementId,
+				dataType: 'json',
+				success: function (data, status)
+				{
+					
+					if(typeof(data.error) != 'undefined')
+					{
+						if(data.error != '')
+						{
+							alert(data.error);
+							$('#ajax' + elementId).hide();
+						}else
+						{
+							//remove the file type of input
+							cancelFileUpload(elementId);
+							numRows++;
+							files[numRows] = {};
+
+							for(var i in data)
+							{
+								if(i != 'error')
+								{
+									files[numRows][i] =  data[i];
+								}
+							}
+							addDocumentHtml(numRows);
+						}
+					}
+					
+				},
+				error: function (data, status, e)
+				{
+					$('#ajax' + elementId).hide();
+					alert(e);
+				}
+			}
+		)	
+	
+	return false;
+};
+/**
+*	 generate unique id
+*/
+function generateUniqueId(leng)
+{
+   var idLength = leng || 32;
+   var chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
+   var id = '';
+   for(var i = 0; i <= idLength; i++)
+   {
+      id += chars.substr( Math.floor(Math.random() * 62), 1 );
+   }
+   
+   return (id );   
+   
+};
+
+/**
+*	generate a hidden iframe and force to download the specified file 
+*/
+function generateDownloadIframe(url)
+{
+				var frameId = 'ajaxDownloadIframe';		
+				$('#' + frameId).remove();
+				if(window.ActiveXObject) {
+						var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
+						
+						
+				}
+				else {
+						var io = document.createElement('iframe');
+						io.id = frameId;
+						io.name = frameId;
+				}
+				io.style.position = 'absolute';
+				io.style.top = '-1000px';
+				io.style.left = '-1000px';
+				io.src = url; 
+				document.body.appendChild(io);		
+};
+
+
+/**
+*	show the url content in thickbox
+*/
+function showThickBox(linkElem, url)
+{
+	$(linkElem).attr('href', url);
+	var t = linkElem.title || linkElem.name || null;
+	var a = linkElem.href || linkElem.alt;
+	var g = linkElem.rel || false;
+	tb_show(t,a,g);
+	linkElem.blur();	
+	return false;
+};
+/**
+*	bring up a file upload window
+*/
+function uploadFileWin(linkElem)
+{
+	showThickBox(linkElem, appendQueryString('#TB_inline', 'height=200' + '&width=450' + '&inlineId=winUpload&modal=true'));
+	addMoreFile();
+
+};
+/**
+*	bring up a new folder window
+*/
+function newFolderWin(linkElem)
+{
+	showThickBox(linkElem, appendQueryString('#TB_inline', 'height=100'  + '&width=250' + '&inlineId=winNewFolder&modal=true'));
+	return false;
+};
+/**
+*	ajax call to create a folder
+*/
+function doCreateFolder()
+{
+	$('div#TB_window  #currentNewfolderPath').val(currentFolder.path);
+	var pattern=/^[A-Za-z0-9_ \-]+$/i;
+	
+	var folder = $('div#TB_window #new_folder');
+	//alert($('#new_folder').val());
+	if(!pattern.test($(folder).val()))
+	{
+		
+		
+		alert(msgInvalidFolderName);	
+	}else
+	{	
+			var options = 
+			{ 
+				dataType: 'json',
+				url:getUrl('create_folder'),
+				error: function (data, status, e) 
+				{
+
+					alert(e);
+				},				
+				success:   function(data) 
+				{ 
+					//remove those selected items
+					if(data.error != '')
+					{
+						alert(data.error);
+					}else
+					{
+						
+							numRows++;
+							files[numRows] = {};
+							for(var i in data)
+							{
+								if(i != 'error')
+								{
+									files[numRows][i] =  data[i];
+								}
+							}
+						addDocumentHtml(numRows);
+
+						tb_remove();
+						
+																
+
+					}
+										
+					
+
+
+				} 
+			}; 
+			$('div#TB_window  #formNewFolder').ajaxSubmit(options); 	
+						 				
+				
+	}
+	return false;	
+	
+};
+/**
+* selecte documents and fire an ajax call to delete them
+*/
+function deleteDocuments(msgNoDocSelected, msgUnableToDelete, msgWarning, elements)
+{
+	if(!window.confirm(warningDel))
+	{
+		return false;
+	}
+	switch(getView())
+	{
+		case 'thumbnail':
+			var selectedDoc = $('#rightCol dl.thumbnailListing input[@type=checkbox][@checked]');
+			break;
+		case 'detail':
+			
+		default:
+			var selectedDoc = $('#fileList input[@type=checkbox][@checked]');
+	}
+	
+	var hiddenSelectedDoc = document.getElementById('selectedDoc');
+	var selectedOptions;
+	var isSelected = false;
+	
+	//remove all options
+	$(hiddenSelectedDoc).removeOption(/./);
+	$(selectedDoc).each(function(i){
+										
+										$(hiddenSelectedDoc).addOption($(this).val(), getNum($(this).attr('id')), true);
+										isSelected = true;
+										 });		
+	if(!isSelected)
+	{
+		alert(msgNoDocSelected);
+	}
+	else
+	{//remove them via ajax call
+			var options = 
+			{ 
+				dataType: 'json',
+				url:getUrl('delete'),
+				error: function (data, status, e) 
+				{
+
+					alert(e);
+				},				
+				success:   function(data) 
+				{ 
+					if(typeof(data.error) == 'undefined')
+					{
+						alert('Unexpected error.');
+					}else if(data.error != '')
+					{
+						alert(data.error);
+					}else
+					{
+						
+						//remove all files
+						for(var i =0; i < hiddenSelectedDoc.options.length; i++)
+						{
+							switch(getView())
+							{
+								case 'thumbnail':
+									$('#dl' + hiddenSelectedDoc.options[i].text).remove();
+									break;
+								case 'detail':
+								default:
+									$('#row' + hiddenSelectedDoc.options[i].text).remove();
+							}
+						}											
+
+					}
+				} 
+			}; 
+			$('#formAction').ajaxSubmit(options); 			
+
+			
+		
+	}
+	
+	return false;	
+};
+/**
+*	renmae the specific file/folder
+*/
+function doRename()
+{
+	
+	var num = $('div#TB_window #renameNum').val();
+	if(files[num].fileType == 'folder')
+	{
+		var pattern=/^[A-Za-z0-9_ \-]+$/i;
+	}else
+	{
+		var pattern=/^[A-Za-z0-9_ \-\.]+$/i;
+	}	
+	
+	if(!pattern.test($('div#TB_window  #renameName').val()))
+	{
+		if(files[num].fileType == 'folder')
+		{
+			alert(msgInvalidFolderName);
+		}else
+		{
+			alert(msgInvalidFileName);
+		}	
+			
+	}else
+	{	
+			var options = 
+			{ 
+				dataType: 'json',
+				url:getUrl('rename'),
+				error: function (data, status, e) 
+				{
+
+					alert(e);
+				},				
+				success:   function(data) 
+				{ 
+					//remove those selected items
+					if(data.error != '')
+					{
+						alert(data.error);
+					}else
+					{
+						
+						var info = '';
+						for(var i in data)
+						{
+							if(i != 'error')
+							{
+								files[num][i] = data[i];
+							}
+							
+						}						
+						switch(getView())
+						{
+							case 'thumbnail':
+							 	$('#thumbUrl' + num).attr('href', files[num].path);
+							 	$('#thumbImg' + num).attr('src', appendQueryString(getUrl('thumbnail'), 'path=' + files[num].path, ['path']));
+							 	$('#cb' + num).val(files[num].path);
+							 	$('#a' + num).attr('href', files[num].path).text(files[num].name);
+								break;
+	
+							case 'detail':
+
+							default:
+								$('#check' + num).val(files[num].path);								
+								$('#a' + num).attr('href', files[num].path);							
+								$('#tdnd' + num).text(files[num].name);
+								$('#tdth' + num).text(files[num].name);								
+						}
+						
+						tb_remove();											
+
+					}
+				} 
+			}; 
+			$('div#TB_window #formRename').ajaxSubmit(options); 	
+						 				
+				
+	}	
+};
+/**
+* reload the whole window 
+*/
+function windowRefresh()
+{
+	document.location.href = urls.present;
+	//document.location.reload();
+};
+/**
+*	show the system information
+*/
+function infoWin(linkElem)
+{
+	
+	showThickBox(linkElem, appendQueryString('#TB_inline', 'height=180' + '&width=500'+ '&inlineId=winInfo&modal=true'));
+
+};
+/**
+*check all checkboxs and uncheck all checkbox
+*/
+function checkAll(checkbox)
+{
+
+	if($(checkbox).attr('class') == "check_all")
+	{
+		$('#tickAll, #actionSelectAll').attr('class', 'uncheck_all');
+		$('#tickAll, #actionSelectAll').attr('title', unselectAllText);
+		$('#actionSelectAll span').html(unselectAllText);
+		switch(getView())
+		{
+			case 'thumbnail':
+				$('#rightCol dl.thumbnailListing input[@type=checkbox]').each(function(i){
+														   			$(this).attr("checked", 'checked');												 
+																	 })	;
+				break;
+			case 'detail':
+			default:
+$("#fileList tr[@id^=row] input[@type=checkbox]").each(function(i){
+														   			$(this).attr("checked", 'checked');												 
+																	 })	;			
+		}
+				
+
+	}else
+	{
+		$('#tickAll, #actionSelectAll').attr('class', 'check_all');
+		$('#tickAll, #actionSelectAll').attr('title', selectAllText);		
+		$('#actionSelectAll span').html( selectAllText);	
+		switch(getView())
+		{
+			case 'thumbnail':
+				$('#rightCol dl.thumbnailListing input[@type=checkbox]').each(function(i){
+														   			$(this).removeAttr("checked");											 
+																	 })	;
+				break;
+			case 'detail':
+			default:
+$("#fileList tr[@id^=row] input[@type=checkbox]").each(function(i){
+														   			$(this).removeAttr("checked");											 
+																	 })	;			
+		}		
+	}
+
+	return false;
+		
+};		
+
+function cutDocuments(msgNoDocSelected)
+{
+	repositionDocuments(msgNoDocSelected, getUrl('cut'), 'cut');
+	return false;
+};
+
+function copyDocuments(msgNoDocSelected)
+{
+	repositionDocuments(msgNoDocSelected, getUrl('copy'), 'copy');
+	return false;
+};
+
+/**
+* selecte documents and fire an ajax call to delete them
+*/
+function repositionDocuments(msgNoDocSelected, formActionUrl, actionVal)
+{
+	switch(getView())
+	{
+		case 'thumbnail':
+			var selectedDoc = $('#rightCol dl.thumbnailListing input[@type=checkbox][@checked]');
+			break;
+		case 'detail':
+			
+		default:
+			var selectedDoc = $('#fileList input[@type=checkbox][@checked]');
+	}
+	
+	var hiddenSelectedDoc = document.getElementById('selectedDoc');
+	var selectedOptions;
+	var isSelected = false;
+	
+	//remove all options
+	$(hiddenSelectedDoc).removeOption(/./);
+	$(selectedDoc).each(function(i){
+										
+										$(hiddenSelectedDoc).addOption($(this).val(), getNum($(this).attr('id')), true);
+										isSelected = true;
+										 });		
+	if(!isSelected)
+	{
+		alert(msgNoDocSelected);
+	}
+	else
+	{
+		
+			var formAction =  document.formAction;
+			var actionElem = $('#action_value');
+			formAction.action = formActionUrl;
+
+			$('#currentFolderPathVal').val(currentFolder.path);
+			$(actionElem).val(actionVal);
+			var options = 
+			{ 
+				dataType: 'json',
+				error: function (data, status, e) 
+				{
+					alert(e);
+				},				
+				success:   function(data) 
+				{ 
+										if(typeof(data.error) == 'undefined')
+										{
+											alert('Unexpected Error');
+										}
+										else if(data.error != '')
+										{
+											alert(data.error);
+										}else
+										{			
+											//set change flags
+											numFiles = parseInt(data.num);
+											var flag = (actionVal == 'copy'?'copyFlag':'cutFlag');		
+											action = actionVal;
+											//clear all flag
+											for(var i = 1; i < numRows; i++)
+											{
+												$('#flag' + i).attr('class', 'noFlag');
+											}											
+											for(var i =0; i < hiddenSelectedDoc.options.length; i++)
+											{
+												$('#flag' + hiddenSelectedDoc.options[i].text).attr('class', flag);
+											}
+
+										}
+										
+					} 
+			}; 
+			$(formAction).ajaxSubmit(options); 	
+						 				
+
+	}
+	
+	return false;	
+};
+
+function pasteDocuments(msgNoDocSelected)
+{
+	if(numFiles)
+	{
+
+		var warningMsg = (action == 'copy'?warningCopyPaste:warningCutPaste);
+		if(window.confirm(warningMsg))
+		{
+			$.getJSON(appendQueryString(getUrl('paste'), 'current_folder_path='+ currentFolder.path, ['current_folder_path']), 
+				function(json)
+				{
+					if(typeof(json.error) == 'undefined')
+					{
+						alert('Unexpected Error.');
+					}
+					{
+						
+						if(json.error != '')
+						{
+							alert(json.error);
+						}
+						
+						
+						for(var j in json.files)
+						{
+							numRows++;
+							files[numRows] = {};
+							for(var i in json.files[j])
+							{
+								files[numRows][i] = json.files[j][i];
+							}
+							addDocumentHtml(numRows);						
+							
+						}
+						numFiles = parseInt(json.unmoved_files);
+						
+						
+						
+						
+					}
+				}
+			);
+		
+		}
+	}else
+	{
+		alert(msgNoDocSelected);
+	}
+	return false;
+	
+};
+/**
+*	add document item html to the file listing body
+*/
+function addDocumentHtml(num)
+{
+		var strDisabled = "";
+		if(!files[num].is_writable)
+		{
+			strDisabled = "disabled";
+		}	
+		switch(getView())
+		{
+			
+			case 'thumbnail':
+				$(
+				'<dl class="thumbnailListing" id="dl' + num + '" ><dt id="dt' + num + '" class="' + files[num].cssClass + '"></dt><dd id="dd' + num + '" class="thumbnailListing_info"><span id="flag' + num + '" class="' + files[num].flag + '">&nbsp;</span><input id="cb' + num + '" type="checkbox"  class="radio" ' + strDisabled +' name="check[]" class="input" value="' + files[num].path + '" /><a href="' + files[num].path + '" title="' + files[num].name + '" id="a' + num + '">' + (typeof(files[num].short_name) != 'undefined'?files[num].short_name:files[num].name) + '</a></dd></dl>').appendTo('#content');
+			
+
+				if(files[num].type== 'folder')
+				{//this is foder item
+					
+					enableFolderBrowsable(num);
+				}else
+				{//this is file item
+					
+					switch(files[num].cssClass)
+					{
+						case 'filePicture':
+							$('<a id="thumbUrl' + num + '" rel="thumbPhotos" href="' + files[num].path + '"><img src="' + appendQueryString(getUrl('thumbnail', false, false), 'path=' + files[num].path, ['path']) + '" id="thumbImg' +  num + '"></a>').appendTo('#dt' + num);
+							break;
+						case 'fileFlash':
+							break;
+						case 'fileVideo':
+							break;			
+						case 'fileMusic':
+							break;
+						default:
+						
+							
+					}
+					enablePreview('#dl' + num + ' a', [num]);					
+				
+				}	
+				enableContextMenu('#dl' + num);	
+				enableShowDocInfo( num);									
+				break;
+			case 'detail':
+			default:
+				var cssRow = (num % 2?"even":"odd");
+				$('<tr class="' + cssRow + '" id="row' + num + '"><td id="tdz' + num +'" align="center"><span id="flag' + num +'" class="' + files[num].flag +'">&nbsp;</span><input type="checkbox" class="radio" name="check[]" id="cb' + num +'" value="' + files[num].path +'" ' + strDisabled + ' /></td><td align="center" class="fileColumns"   id="tdst1">&nbsp;<a id="a' + num +'" href="' + files[num].path +'"><span class="' + files[num].cssClass + '">&nbsp;</span></a></td><td class="left docName" id="tdnd' + num +'">'  + (typeof(files[num].short_name) != 'undefined'?files[num].short_name:files[num].name) + '</td><td class="docInfo" id="tdrd' + num +'">' + files[num].size +'</td><td class="docInfo" id="tdth' + num +'">' + files[num].mtime +'</td></tr>').appendTo('#fileList');
+		
+				if(files[num].type== 'folder')
+				{//this is foder item					
+					enableFolderBrowsable(num);
+				}else
+				{//this is file item
+					
+					switch(files[num].cssClass)
+					{
+						case 'filePicture':							
+							break;
+						case 'fileFlash':
+							break;
+						case 'fileVideo':
+							break;			
+						case 'fileMusic':
+							break;
+						default:
+						
+							
+					}
+					enablePreview('#row' + num + ' td a', num);		
+								
+				}	
+				enableContextMenu('#row' + num);
+				enableShowDocInfo(num);										
+				break;								
+			
+				
+		}	
+	
+	
+	
+};
+
+function enableShowDocInfo(num)
+{
+
+	$('#cb' + num).click(
+		function()
+		{
+
+			setDocInfo('doc', num);
+		}
+	);	
+};
+/**
+*	show up the selected document information
+* @param   type root or doc
+*/
+function setDocInfo(type, num)
+{
+	
+
+	var info = {};
+	if(type == 'root')
+	{
+		info = currentFolder;
+	}else
+	{
+		info = files[num];
+	}
+	
+
+		if(info.type=="folder")
+		{
+			$('#folderPath').text(info.name);
+			$('#folderFile').text(info.file);
+			$('#folderSubdir').text(info.subdir);
+			$('#folderCtime').text(info.ctime);
+			$('#folderMtime').text(info.mtime);
+			if(info.is_readable == '1')
+			{
+				$('#folderReadable').html("<span class=\"flagYes\">&nbsp;</span>");	
+			}else
+			{
+				$('#folderReadable').html("<span class=\"flagNo\">&nbsp;</span>");
+			}
+			if(info.is_writable == '1')
+			{
+				$('#folderWritable').html("<span class=\"flagYes\">&nbsp;</span>");	
+			}else
+			{
+				$('#folderWritable').html("<span class=\"flagNo\">&nbsp;</span>");
+			}	
+			$('#folderFieldSet').css('display', '');
+			$('#fileFieldSet').css('display', 'none');
+		}else
+		{
+	
+
+			$('#fileName').text(info.name);
+			$('#fileSize').text(info.size);
+			$('#fileType').text(info.fileType);
+			$('#fileCtime').text(info.ctime);
+			$('#fileMtime').text(info.mtime);
+			if(info.is_readable == '1')
+			{
+				$('#fileReadable').html("<span class=\"flagYes\">&nbsp;</span>");	
+			}else
+			{
+				$('#fileReadable').html("<span class=\"flagNo\">&nbsp;</span>");
+			}
+			if(info.is_writable == '1')
+			{
+				$('#fileWritable').html("<span class=\"flagYes\">&nbsp;</span>");	
+			}else
+			{
+				$('#fileWritable').html("<span class=\"flagNo\">&nbsp;</span>");
+			}	
+			$('#folderFieldSet').css('display', 'none');
+			$('#fileFieldSet').css('display', '');
+		   if(typeof(selectFile) != 'undefined')
+		   {
+		   	$('#selectCurrentUrl').unbind('click').click( 
+		   		function()
+		   		{
+		   			
+		   			selectFile(info.url);
+		   		}
+		   	);
+		   	$('#returnCurrentUrl').show();
+		   	 
+		   }else
+		   {
+		   	$('#returnCurrentUrl').hide();
+		   }
+		   	
+			
+		}
+		
+
+		
+	
+	
+};
+		function search()
+		{
+			searchRequired = true;			
+			var url = getUrl('view', true, true, true);		
+
+		$('#rightCol').empty();
+		ajaxStart('#rightCol');		
+		
+		$('#rightCol').load(url, 
+					{},
+					function(){
+							ajaxStop('#rightCol img.ajaxLoadingImg');
+							initAfterListingLoaded();
+						});			
+			return false;
+		};
+		
+		function closeWinPlay()
+		{
+			tb_remove();
+			$('#playGround').empty();
+		};
+		
+		function closeWindow(msg)
+		{
+			
+			if(window.confirm(msg))
+			{
+				window.close();
+			}else
+			{
+				return false;
+			}
+
+			
+		};

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxfilemanager_c.js


+ 225 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxfileupload.js

@@ -0,0 +1,225 @@
+jQuery.extend({
+
+    createUploadIframe: function(id, uri)
+	{
+			//create frame
+            var frameId = 'jUploadFrame' + id;
+            
+            if(window.ActiveXObject) {
+                var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
+                if(typeof uri== 'boolean'){
+                    io.src = 'javascript:false';
+                }
+                else if(typeof uri== 'string'){
+                    io.src = uri;
+                }
+            }
+            else {
+                var io = document.createElement('iframe');
+                io.id = frameId;
+                io.name = frameId;
+            }
+            io.style.position = 'absolute';
+            io.style.top = '-1000px';
+            io.style.left = '-1000px';
+
+            document.body.appendChild(io);
+
+            return io;			
+    },
+    createUploadForm: function(id, fileElementId)
+	{
+		//create form	
+		var formId = 'jUploadForm' + id;
+		var fileId = 'jUploadFile' + id;
+		var form = jQuery('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');	
+		var oldElement = jQuery('#' + fileElementId);
+		var newElement = jQuery(oldElement).clone();
+		jQuery(oldElement).attr('id', fileId);
+		jQuery(oldElement).before(newElement);
+		jQuery(oldElement).appendTo(form);
+		//set attributes
+		jQuery(form).css('position', 'absolute');
+		jQuery(form).css('top', '-1200px');
+		jQuery(form).css('left', '-1200px');
+		jQuery(form).appendTo('body');		
+		return form;
+    },
+
+    ajaxFileUpload: function(s) {
+        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout		
+        s = jQuery.extend({}, jQuery.ajaxSettings, s);
+        var id = s.fileElementId;        
+		var form = jQuery.createUploadForm(id, s.fileElementId);
+		var io = jQuery.createUploadIframe(id, s.secureuri);
+		var frameId = 'jUploadFrame' + id;
+		var formId = 'jUploadForm' + id;		
+        
+        if( s.global && ! jQuery.active++ )
+		{
+			// Watch for a new set of requests
+			jQuery.event.trigger( "ajaxStart" );
+		}            
+        var requestDone = false;
+        // Create the request object
+        var xml = {};   
+        if( s.global )
+        {
+        	jQuery.event.trigger("ajaxSend", [xml, s]);
+        }            
+        
+        var uploadCallback = function(isTimeout)
+		{		
+			// Wait for a response to come back	
+			var io = document.getElementById(frameId);
+            try 
+			{				
+				if(io.contentWindow)
+				{
+					 xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
+                	 xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
+					 
+				}else if(io.contentDocument)
+				{
+					 xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;
+                	xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;
+				}						
+            }catch(e)
+			{
+				jQuery.handleError(s, xml, null, e);
+			}
+            if( xml || isTimeout == "timeout") 
+			{				
+                requestDone = true;
+                var status;
+                try {
+                    status = isTimeout != "timeout" ? "success" : "error";
+                    // Make sure that the request was successful or notmodified
+                    if( status != "error" )
+					{
+                        // process the data (runs the xml through httpData regardless of callback)
+                        var data = jQuery.uploadHttpData( xml, s.dataType );                        
+                        if( s.success )
+                        {
+							// ifa local callback was specified, fire it and pass it the data
+                        	s.success( data, status );
+                        };                 
+                        if( s.global )
+                        {
+							// Fire the global callback
+                        	jQuery.event.trigger( "ajaxSuccess", [xml, s] );
+                        };                            
+                    } else
+                    {
+                    	jQuery.handleError(s, xml, status);
+                    }
+                        
+                } catch(e) 
+				{
+                    status = "error";
+                    jQuery.handleError(s, xml, status, e);
+                };                
+                if( s.global )
+                {
+					// The request was completed
+                	jQuery.event.trigger( "ajaxComplete", [xml, s] );
+                };
+                    
+
+                // Handle the global AJAX counter
+                if(s.global && ! --jQuery.active)
+                {
+                	jQuery.event.trigger("ajaxStop");
+                };
+                if(s.complete)
+                {
+                	 s.complete(xml, status);
+                } ;                 
+
+                jQuery(io).unbind();
+
+                setTimeout(function()
+									{	try 
+										{
+											jQuery(io).remove();
+											jQuery(form).remove();	
+											
+										} catch(e) 
+										{
+											jQuery.handleError(s, xml, null, e);
+										}									
+
+									}, 100);
+
+                xml = null;
+
+            };
+        }
+        // Timeout checker
+        if( s.timeout > 0 ) 
+		{
+            setTimeout(function(){
+                
+                if( !requestDone )
+                {
+					// Check to see ifthe request is still happening
+                	uploadCallback( "timeout" );
+                }
+                
+            }, s.timeout);
+        }
+        try 
+		{
+			var form = jQuery('#' + formId);
+			jQuery(form).attr('action', s.url);
+			jQuery(form).attr('method', 'POST');
+			jQuery(form).attr('target', frameId);
+            if(form.encoding)
+			{
+                form.encoding = 'multipart/form-data';				
+            }
+            else
+			{				
+                form.enctype = 'multipart/form-data';
+            }			
+            jQuery(form).submit();
+
+        } catch(e) 
+		{			
+            jQuery.handleError(s, xml, null, e);
+        }
+        if(window.attachEvent){
+            document.getElementById(frameId).attachEvent('onload', uploadCallback);
+        }
+        else{
+            document.getElementById(frameId).addEventListener('load', uploadCallback, false);
+        } 		
+        return {abort: function () {}};	
+
+    },
+
+    uploadHttpData: function( r, type ) {
+        var data = !type;
+        data = type == "xml" || data ? r.responseXML : r.responseText;
+        // ifthe type is "script", eval it in global context
+        if( type == "script" )
+        {
+        	jQuery.globalEval( data );
+        }
+            
+        // Get the JavaScript object, ifJSON is used.
+        if( type == "json" )
+        {
+        	eval( "data = " + data );
+        }
+            
+        // evaluate scripts within html
+        if( type == "html" )
+        {
+        	jQuery("<div>").html(data).evalScripts();
+        }
+            
+        return data;
+    }
+});
+

+ 873 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaximageeditor.js

@@ -0,0 +1,873 @@
+/*
+	* author: Logan Cai
+	* Email: cailongqun [at] yahoo [dot] com [dot] cn
+	* Website: www.phpletter.com
+	* Created At: 21/April/2007
+*/
+
+	/**
+	*	get current selected mode value
+	*/
+	function getModeValue()
+	{
+		//check if an mode has been selected or selected first one be default
+		var CheckedElem = null;
+		for(var i = 0; i < document.formAction.mode.length; i++)
+		{
+			if(document.formAction.mode[i].checked || i == 0)
+			{
+				CheckedElem = document.formAction.mode[i];
+			}
+		}
+		CheckedElem.checked = true;	
+		return CheckedElem.value;
+	};
+	/**
+	*	get fired when mode changed
+	*	fire according function
+	*/
+	function changeMode(restore, force)
+	{
+		
+			var mode = getModeValue();
+			var imageMode = $('#image_mode');
+			if(mode != $(imageMode).val() || (typeof(restore) == "boolean"))
+			{
+				/**
+				* confirm it when there has been some changes before go further
+				*/
+				if(isImageHistoryExist() || typeof(force) == 'boolean')
+				{
+					if(typeof(restore) == "boolean" || typeof(force) == 'boolean' )
+					{
+						if(!restoreToOriginal(restore))
+						{
+							return false;
+							
+						}
+						clearImageHistory();
+					}
+					else if(!window.confirm(warningLostChanges))
+					{
+						cancelChangeMode();
+						return false;
+					}else
+					{
+						restoreToOriginal(false);						
+						clearImageHistory();
+					}				
+				}else if((typeof(restore) == "boolean" && restore))
+				{
+					return false;	
+				}
+				initPositionHandler();				
+				switch(mode)
+				{
+					case "resize":
+						switch($('#image_mode').val())
+						{
+							case "crop":
+								disableCrop();								
+								break;
+							case "rotate":
+								disableRotate();
+								break;
+							case "flip":
+								disableFlip();
+								break;								
+							default:
+								disableRotate();
+						}						
+						enableResize(document.formAction.constraint.checked);
+						break;
+					case "crop":						
+						switch($('#image_mode').val())
+						{
+							case "resize":
+								disableResize();								
+								break;
+							case "rotate":
+								disableRotate();
+								break;
+							case "flip":
+								disableFlip();
+								break;								
+							default:
+								disableRotate();
+						}	
+						enableCrop();
+						
+						break;
+					case "rotate":
+						switch($('#image_mode').val())
+						{
+							case "resize":
+								disableResize();								
+								break;
+							case "crop":
+								disableCrop();
+								break;
+							case "flip":
+								disableFlip();
+								break;
+							default:
+								//do nothing
+						}						
+						enableRotate();
+						break;	
+					case "flip":
+						switch($('#image_mode').val())
+						{
+							case "resize":
+								disableResize();								
+								break;
+							case "crop":
+								disableCrop();
+								break;
+							case "rotate":
+								disableRotate();
+								break;
+							default:
+								//do nothing
+						}								
+						enableFlip();
+						break;
+					default:
+						alert('Unexpected Operation!');
+						return false;			
+				}
+				$('#image_mode').val(mode);
+			}
+
+	};
+	
+	
+	function resetEditor()
+	{
+		if(isImageHistoryExist())
+		{
+			changeMode(true);
+		}else
+		{
+			alert(warningResetEmpty);
+		}
+		return false;
+		
+	};
+
+	/**
+	*	enable to crop function
+	*/
+	function enableCrop()
+	{
+		var widthField = $('#width');
+        var heightField = $('#height');
+        var topField = $('#y');
+        var leftField = $('#x');
+        var imageToResize = getImageElement();
+        var imageWidth = $(imageToResize).attr('width');
+        var imageHeight = $(imageToResize).attr('height');
+
+        var overlay = $('#resizeMe');
+        var imageContainer = $('#imageContainer');
+		var imageContainerTop = parseInt($(imageContainer).css('top').replace('px', ''));
+		var imageContainerLeft = parseInt($(imageContainer).css('left').replace('px', ''));
+        //Init Container
+        $(imageContainer).css('width', imageWidth + 'px');
+        $(imageContainer).css('height', imageHeight + 'px');
+        $(imageToResize).css('opacity', '.5');
+		
+        //Init Overlay
+        overlay.css('background-image', 'url('+ $(imageToResize).attr('src')+')');
+        overlay.css('width', imageWidth + 'px');
+        overlay.css('height', imageHeight + 'px');
+
+        //Init Form
+        widthField.val(imageWidth);
+        heightField.val(imageHeight);
+        topField.val(0);
+        leftField.val(0);		
+	    $(overlay).Resizable(
+			{
+				minWidth: 10,
+				minHeight: 10,
+				maxWidth: imageWidth,
+				maxHeight: imageHeight,
+				minTop: imageContainerTop,
+				minLeft: imageContainerLeft,
+				maxRight: (parseInt(imageWidth) + imageContainerLeft),
+				maxBottom: (parseInt(imageHeight) + imageContainerTop),
+				dragHandle: true,
+				onDrag: function(x, y)
+				{
+					this.style.backgroundPosition = '-' + (x - imageContainerLeft) + 'px -' + (y - imageContainerTop) + 'px';
+					$(topField).val(Math.round(y - imageContainerTop));
+					$(leftField).val(Math.round(x - imageContainerLeft));
+					addImageHistory();
+				},
+				handlers: {
+					se: '#resizeSE',
+					e: '#resizeE',
+					ne: '#resizeNE',
+					n: '#resizeN',
+					nw: '#resizeNW',
+					w: '#resizeW',
+					sw: '#resizeSW',
+					s: '#resizeS'
+				},
+				onResize : function(size, position) {
+					this.style.backgroundPosition = '-' + (position.left - imageContainerLeft) + 'px -' + (position.top - imageContainerTop) + 'px';
+					$(widthField).val(Math.round(size.width));
+					$(heightField).val(Math.round(size.height));
+					$(topField).val(Math.round(position.top - imageContainerTop));
+					$(leftField).val(Math.round(position.left - imageContainerLeft));
+					addImageHistory();
+					$('#ratio').val($(overlay).ResizableRatio() );	
+				}
+			}
+		);
+		enableConstraint();
+		toggleConstraint();
+		disableRotate();
+		
+	};
+	/*
+	*	disable crop function 
+	*/	
+	function disableCrop()
+	{
+		$('#resizeMe').ResizableDestroy();		
+		hideHandlers();					
+	};
+	/**
+	*	disable resize function
+	*/
+	function disableResize()
+	{
+		$('#resizeMe').ResizableDestroy();
+		
+		hideHandlers();					
+	};
+	/**
+	*	hide all handlers 
+	*/	
+	function hideHandlers()
+	{
+		$('#resizeSE').hide();
+		$('#resizeE').hide();
+		$('#resizeNE').hide();	
+		$('#resizeN').hide();
+		$('#resizeNW').hide();
+		$('#resizeW').hide();	
+		$('#resizeSW').hide();
+		$('#resizeS').hide();	
+	};
+	/**
+	*
+	*	enable to resize the image
+	*/
+	function enableResize(constraint)
+	{
+		hideHandlers();
+		var imageToResize = getImageElement();	
+		var imageContainer = $('#imageContainer');
+		var imageContainerTop = parseInt($(imageContainer).css('top').replace('px', ''));
+		var imageContainerLeft = parseInt($(imageContainer).css('left').replace('px', ''));		
+		var resizeMe = $('#resizeMe');
+		var width = $('#width');
+		var height = $('#height');
+		//ensure the container has same size with the image
+		$(imageContainer).css('width', $(imageToResize).attr('width') + 'px');
+		$(imageContainer).css('height', $(imageToResize).attr('height') + 'px');
+		$(resizeMe).css('width', $(imageToResize).attr('width') + 'px');
+		$(resizeMe).css('height', $(imageToResize).attr('height') + 'px');
+		$('#width').val($(imageToResize).attr('width'));
+		$('#height').val($(imageToResize).attr('height'));
+		$('#x').val(0);
+		$('#y').val(0);		
+		$(resizeMe).Resizable(
+			{
+				minWidth: 10,
+				minHeight: 10,
+				maxWidth: 2000,
+				maxHeight: 2000,
+				minTop: imageContainerTop,
+				minLeft: imageContainerLeft,
+				maxRight: 2000,
+				maxBottom: 2000,
+				handlers: {
+					s: '#resizeS',
+					se: '#resizeSE',
+					e: '#resizeE'
+				},
+				onResize: function(size)
+				{
+					$(imageToResize).attr('height', Math.round(size.height).toString());
+					$(imageToResize).attr('width', Math.round(size.width).toString());
+					$(width).val(Math.round(size.width));
+					$(height).val(Math.round(size.height));		
+					$(imageContainer).css('width', $(imageToResize).attr('width') + 'px');
+					$(imageContainer).css('height', $(imageToResize).attr('height') + 'px');	
+					$('#ratio').val($(resizeMe).ResizableRatio() );			
+					addImageHistory();				
+				}
+
+			}
+		);	
+		$(resizeMe).ResizeConstraint(constraint);
+		if(typeof(constraint) == 'boolean' && constraint)
+		{		
+			$('#resizeS').hide();
+			$('#resizeE').hide();			
+		}else
+		{			
+			$('#resizeS').show();
+			$('#resizeE').show();
+		}		
+		$('#resizeSE').show();
+		$('#ratio').val($(resizeMe).ResizableRatio() );	
+			
+			
+	};
+	/**
+	*	initiate the position of handler
+	*/
+	function initPositionHandler()
+	{
+		var widthField = $('#width');
+        var heightField = $('#height');
+        var topField = $('#x');
+        var leftField = $('#y');
+
+        var imageToResize = getImageElement();
+        var imageWidth = $(imageToResize).attr('width');
+        var imageHeight = $(imageToResize).attr('height');
+
+        var overlay = $('#resizeMe');
+        var imageContainer = $('#imageContainer');
+		var imageContainerTop = parseInt($(imageContainer).css('top').replace('px', ''));
+		var imageContainerLeft = parseInt($(imageContainer).css('left').replace('px', ''));
+        //Init Container
+        $(imageContainer).css('width', imageWidth + 'px');
+        $(imageContainer).css('height', imageHeight + 'px');
+		
+        //Init Overlay
+		$(imageToResize).css('opacity', '100');
+        $(overlay).css('width', imageWidth + 'px');
+        $(overlay).css('height', imageHeight + 'px');
+		$(overlay).css('background-image', '');
+		$(overlay).css('backgroundPosition', '0 0');
+		$(overlay).css('left', imageContainerLeft);
+		$(overlay).css('top', imageContainerTop);
+
+        //Init Form
+        $(widthField).val(imageWidth);
+        $(heightField).val(imageHeight);
+        $(topField).val(0);
+        $(leftField).val(0);
+		$('#angle').val(0);
+		$('#flip_angle').val('');
+	};
+	/**
+	*	enable rotate function
+	*/
+	function enableRotate()
+	{
+		hideHandlers();
+	toggleDisabledButton('actionRotateLeft', false);
+	toggleDisabledButton('actionRotateRight', false);			
+		
+	};
+	/**
+	*	disable rotation function
+	*/
+	function disableRotate()
+	{
+	toggleDisabledButton('actionRotateLeft', true);
+	toggleDisabledButton('actionRotateRight', true);			
+	};
+	
+	function enableConstraint()
+	{
+		$('#constraint').removeAttr('disabled');
+	};
+	
+	function disableConstraint()
+	{
+		$('#constraint').attr('disabled', 'disabled');
+	};
+	function ShowHandlers()
+	{
+		$('#resizeSE').show();
+		$('#resizeE').show();
+		$('#resizeNE').show();	
+		$('#resizeN').show();
+		$('#resizeNW').show();
+		$('#resizeW').show();	
+		$('#resizeSW').show();
+		$('#resizeS').show();	
+	}	;
+	
+	/**
+	*	turn constraint on or off
+	*/
+	function toggleConstraint()
+	{
+		hideHandlers();	
+		if(document.formAction.constraint.checked)
+		{
+			$('#resizeMe').ResizeConstraint(true);
+			switch(getModeValue())
+			{
+				case "resize":
+					$('#resizeSE').show();	
+					break;
+				case "crop":
+					$('#resizeSE').show();
+					$('#resizeNE').show();	
+					$('#resizeNW').show();
+					$('#resizeSW').show();
+					
+					break;
+				case "rotate":
+					break;
+			}
+						
+		}else
+		{
+			$('#resizeMe').ResizeConstraint(false);
+			switch(getModeValue())
+			{
+				case "resize":
+					$('#resizeSE').show();	
+					$('#resizeE').show();
+					$('#resizeS').show();
+					break;
+				case "crop":
+					ShowHandlers();
+					break;
+				case "rotate":
+					break;					
+			}			
+		}
+		
+	};
+	
+
+	/**
+	*	restore to the state the image was
+	*/
+	function restoreToOriginal(warning)
+	{
+			if(typeof(warning) == "boolean" && warning)
+			{
+					if(!window.confirm(warningReset))
+					{
+						return false;	
+					}
+			}
+			
+			$("#imageContainer").empty();
+			$("#hiddenImage img").clone().appendTo("#imageContainer");		
+			return true;
+			
+	
+	};
+	/*
+	*	left rotate
+	*/	
+	function leftRotate()
+	{
+		
+		var imageToResize = getImageElement();
+		$(imageToResize).rotate(-90);		
+		swapWidthWithHeight();
+		addImageHistory();
+		var angle = $('#angle');
+
+		var angleDegree = (parseInt($(angle).val()) + 90);
+		angleDegree = ((angleDegree == 360)?angleDegree:angleDegree%360);
+		$(angle).val((angleDegree )); 
+		return false;
+		
+	};
+	/**
+	*	cancel mode change
+	*/
+	function cancelChangeMode()
+	{
+		$('#formAction input[@value=' + $('#image_mode').val() + ']').attr('checked', 'checked');	
+	};
+	/**
+	*	get the image element which is going to be modified
+	*/
+	function getImageElement()
+	{
+		var imageElement = null;
+		var imageContainer = document.getElementById('imageContainer');
+		for(var i = 0; i < imageContainer.childNodes.length; i++)
+		{
+			if((typeof(imageContainer.childNodes[i].name) != "undefined" && imageContainer.childNodes[i].name.toLowerCase() == 'image') || (typeof(imageContainer.childNodes[i].tagName) != "undefined" && (imageContainer.childNodes[i].tagName.toLowerCase() == 'canvas' ||  imageContainer.childNodes[i].tagName.toLowerCase() == 'img'))  )
+			{
+				imageElement = 	imageContainer.childNodes[i];
+			}
+		}
+		return imageElement;
+	};
+	/*	
+		right rotate
+	*/
+	function rightRotate()
+	{
+		
+		var imageToResize = getImageElement();
+		$(imageToResize).rotate(90);	
+		swapWidthWithHeight();
+		addImageHistory();
+		var angle = $('#angle');
+
+		
+		var angleDegree = (parseInt($(angle).val()) - 90 );
+		if(angleDegree < 0)
+		{
+			angleDegree += 360;
+		}
+		angleDegree = ((angleDegree == 360)?angleDegree:angleDegree%360);		
+		$(angle).val((angleDegree )); 
+		return false;
+	}	;
+	/**
+	*	swap image width with height when rotation fired
+	*/
+	function swapWidthWithHeight()
+	{
+		var imageContainer = $('#imageContainer');
+		var resizeMe = $('#resizeMe');
+		var width = $('#width');
+		var height = $('#height');			
+		var imageToResize = getImageElement();
+		var newWidth = 0;
+		var newHeight = 0;
+		newWidth = $(imageToResize).attr('width');
+		newHeight = $(imageToResize).attr('height');			
+		$(imageContainer).css('width', newWidth + 'px');
+		$(imageContainer).css('height', newHeight + 'px');		
+		$(width).val(newWidth);
+		$(height).val(newHeight);	
+		$(resizeMe).css('width', newWidth + 'px');
+		$(resizeMe).css('height', newHeight + 'px');
+		
+
+
+				
+	};
+
+
+
+	/**
+	*	records all change mede to the image
+	*	this features will be implemented next release
+	*/
+	function addImageHistory()
+	{
+		imageHistory = true;
+		initDisabledButtons(false);
+	};
+	
+	
+	/**
+	*	cleare all records
+	*	this features will be implemented next release
+	*/	
+	function clearImageHistory()
+	{
+		imageHistory = false;
+		initDisabledButtons(true);
+		
+		
+	};
+	
+	function initDisabledButtons(forceDisable)
+	{		
+		if(numSessionHistory)
+		{
+			toggleDisabledButton('actionUndo', false);
+		}else
+		{
+			toggleDisabledButton('actionUndo', true);
+		}
+		if(imageHistory)
+		{
+			toggleDisabledButton('actionSave', false);	
+			toggleDisabledButton('actionReset', false);
+		}else
+		{
+			toggleDisabledButton('actionSave', true);	
+			toggleDisabledButton('actionReset', true);
+		}
+	};
+	
+	/**
+	*	return record
+	*	this features will be implemented next release
+	*/		
+	function getImageHistory()
+	{
+		return imageHistory;
+	};
+	/**
+	*	check if there exists any changes
+	*	this features will be implemented next release
+	*/		
+	function isImageHistoryExist()
+	{
+		return imageHistory;		
+	};
+	
+function flipHorizontal()
+{
+	if(window.confirm(warningFlipHorizotal))
+	{
+		addImageHistory();
+		$('#flip_angle').val('horizontal');	
+		$('#mode').val('flip');
+		saveImage();		
+	}
+
+	return false;
+};
+
+function flipVertical()
+{
+	if(window.confirm(warningFlipVertical))
+	{
+	addImageHistory();
+	$('#flip_angle').val('vertical');	
+	$('#mode').val('flip');
+	saveImage();		
+	}
+
+	return false;
+};
+
+function enableFlip()
+{
+	toggleDisabledButton('actionFlipH', false);
+	toggleDisabledButton('actionFlipV', false);
+};
+
+function toggleDisabledButton(buttonId, forceDisable)
+{
+	var disabledButton = $('#' + buttonId);
+	var newClass = '';
+	var changeRequired = true;
+	var toBeDisabled = false;
+	var currentClass = $(disabledButton).attr('class') ;
+	if(typeof(forceDisable) == 'boolean')
+	{
+		
+		if(forceDisable && currentClass == 'button')
+		{
+			newClass = 'disabledButton';
+			$(disabledButton).attr('disabled', 'disabled');				
+		}else if(!forceDisable && currentClass == 'disabledButton')
+		{
+			newClass = 'button';
+			$(disabledButton).removeAttr('disabled');					
+		}else
+		{
+			changeRequired = false;
+		}
+		
+		
+	}
+	else if(currentClass == 'button')
+	{
+		newClass = 'disabledButton';
+		$(disabledButton).attr('disabled', 'disabled');	
+	}else
+	{
+		newClass = 'button';
+		$(disabledButton).removeAttr('disabled');			
+	}
+	if(changeRequired)
+	{
+	$(disabledButton).removeClass('button disabledButton');
+	$(disabledButton).addClass(newClass);			
+	}
+
+	
+};
+
+function disableFlip()
+{
+	toggleDisabledButton('actionFlipH', true);
+	toggleDisabledButton('actionFlipV', true);	
+};
+	
+	function undoImage()
+	{
+		if(numSessionHistory < 1)
+		{
+			alert(warningResetEmpty);
+
+		}else
+		{
+			if(window.confirm(warningUndoImage))
+			{
+				processImage('formAction');
+			}
+			
+		}
+		return false;
+		
+	};	
+	
+function processImage(formId)
+{
+			$("#loading")
+			   .ajaxStart(function(){
+				   $(this).show();
+			   })
+			   .ajaxComplete(function(){
+				   $(this).hide();
+			   });	
+			var options = 
+			{ 
+				dataType: 'json',
+				error: function (data, status, e) 
+				{
+					alert(e);
+				},				
+				success: function(data) 
+				{ 
+					if(typeof(data.error) == 'undefined')
+					{
+						alert('Unexpected information ');
+					}
+					else if(data.error != '')
+					{
+						
+						alert(data.error);
+					}else
+					{
+						$("#loading").show();
+						
+								currentFolder = data.folder_path;
+								if(data.save_as == '1')
+								{
+									numSessionHistory = 0;
+								}else
+								{
+									numSessionHistory = parseInt(data.history);
+								}
+								$('#file_path').val(data.path);
+								$('#path').val(data.path);
+				        var preImage = new Image();
+								preImage.width = data.width;
+								preImage.height = data.height;													
+				        preImage.onload = function()
+				        {				
+				          
+									$('#hiddenImage').empty();														
+									$(preImage).appendTo('#hiddenImage');
+									
+									changeMode(false, true);		
+									$('#loading').hide(); 		
+									$('#windowSaveAs').jqm({modal: true}).jqmHide();
+				             
+				        };
+						var now = new Date();
+				        preImage.src = data.path + "?" + now.getTime();
+
+								
+										
+						
+					}
+				} 
+			}; 
+			$('#' + formId).ajaxSubmit(options); 		
+			return false;
+};
+
+function saveAsImagePre()
+{
+	$('#windowSaveAs').jqm({modal: true}).jqmShow();
+	var saveTo = $('#save_to');
+	$(saveTo).removeOption(/./);
+	$(saveTo).ajaxAddOption(urlGetFolderList, {}, false, 
+														function()
+														{
+																$(saveTo).selectOptions(currentFolder);
+															});
+	return false;
+};
+
+function saveAsImage()
+{
+
+	var pattern=/^[A-Za-z0-9_ \-]+$/i;
+	
+	var newName = $('#new_name');
+	
+	var saveAs = $('#save_to').get(0);
+	//alert($(saveAs).val());
+	if(!pattern.test($(newName).val()))
+	{
+		alert(warningInvalidNewName);	
+	}else if(saveAs.selectedIndex < 0)
+	{
+		alert(warningNoFolderSelected);
+	}else
+	{	
+	
+		$('#hidden_new_name').val($(newName).val());
+		$('#hidden_save_to').val(saveAs.options[saveAs.selectedIndex].value);
+		if(saveImage(true))
+		{
+			
+			
+		}
+		
+		
+	}
+	
+	
+	return false;
+};
+
+function saveImage(saveAs)
+{
+	if(typeof(saveAs) == 'boolean' && saveAs)
+	{
+		
+	}else
+	{//remove new name if just normal save
+		$('#hidden_new_name').val('');
+		$('#hidden_save_to').val('');
+	}
+	if (!isImageHistoryExist() && (typeof(saveAs) == 'undefined' || !saveAs))
+	{
+		alert(noChangeMadeBeforeSave);
+	}else
+	{
+		
+		if(processImage('formImageInfo'))
+		{			
+			return true;
+		}
+	}
+	return false;
+	
+};
+
+
+
+function editorClose()
+{
+	if(window.confirm(warningEditorClose))
+	{
+		window.close();
+	}
+	return false;
+};

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaximageeditor_c.js


+ 91 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxtexteditor.js

@@ -0,0 +1,91 @@
+			function save(id, text)
+			{
+				jQuery('#text').val(text);
+				jQuery('#save_as_request').val('0');
+				jQuery('#name').val(currentName);					
+				jQuery('#folder').val(currentFolder);				
+				do_save(false);
+			};
+			function do_save(saveAsRequest)
+			{
+				jQuery('#windowProcessing').jqmShow();
+
+			var options = 
+			{ 
+				dataType: 'json',
+				error: function (data, status, e) 
+				{
+					alert(e);
+				},				
+				success: function(data) 
+				{ 
+										if(typeof(data.error) == 'undefined')
+										{
+											alert('Unexpected information ');
+
+											if(typeof(saveAsRequest) == 'boolean' && saveAsRequest)
+											{
+												jQuery('#windowSaveAs').jqmShow();		
+											}											
+										}
+										else if(data.error != '')
+										{
+											alert(data.error);
+											jQuery('#windowProcessing').jqmHide();											
+											if(typeof(saveAsRequest) == 'boolean' && saveAsRequest)
+											{
+												jQuery('#windowSaveAs').jqmShow();		
+											}
+										}else
+										{													
+											jQuery('#windowProcessing').jqmHide();
+											jQuery('#windowSaveAs').jqmHide();
+											currentFolder = data.folder;
+											currentName = data.name;
+										}
+				} 
+			}; 
+			jQuery('#frmProcessing').ajaxSubmit(options); 		
+			};
+			function save_as(id, text)
+			{
+				
+				jQuery('#text').val(text);
+				jQuery('#windowSaveAs').jqmShow();
+				var saveTo = jQuery('#save_to');
+				jQuery(saveTo).removeOption(/./);
+				jQuery(saveTo).ajaxAddOption(urlGetFolderList, {}, false, 
+																	function()
+																	{
+																			jQuery(saveTo).selectOptions(currentFolder);
+																		});				
+	
+			  
+			};
+			function do_save_as()
+			{
+				var pattern=/^[A-Za-z0-9_ \-]+$/i;				
+				var newName = jQuery('#new_name');				
+				var saveAs = jQuery('#save_to').get(0);
+				var ext = jQuery('#ext').get(0);
+				if(!pattern.test(jQuery(newName).val()))
+				{
+					alert(warningInvalidName);	
+				}else if(saveAs.selectedIndex < 0)
+				{
+					alert(waringFolderNotSelected);
+				}else if(ext.selectedIndex < 0)
+				{
+					alert(warningExtNotSelected);
+				}
+				else
+				{			
+					
+					jQuery('#name').val(jQuery(newName).val() + "." + ext.options[ext.selectedIndex].value);					
+					jQuery('#folder').val(saveAs.options[saveAs.selectedIndex].value);
+					jQuery('#save_as_request').val('1');
+					jQuery('#windowSaveAs').jqmHide();	
+					do_save(true);
+				}
+				return false;						
+			};

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/ajaxtexteditor_c.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 5 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/calendar.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/contextmenu.js


+ 352 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/edit_area.css

@@ -0,0 +1,352 @@
+body, html{
+	margin: 0; 
+	padding: 0;
+	height: 100%;
+	border: none;
+	overflow: hidden;
+	background-color: #FFFFFF;
+}
+
+body, html, table, form, textarea{
+	font: 12px monospace, sans-serif;
+}
+
+#editor{
+	border: solid #888888 1px;
+	overflow: hidden;
+}
+
+#result{
+	z-index: 4; 
+	overflow: scroll;
+	border-top: solid #888888 1px;
+	border-bottom: solid #888888 1px;
+	position: relative;
+}
+
+#container{
+	overflow: hidden;
+	/*height: 100px;*/
+	border: solid blue 0px;
+	position: relative; 
+	padding: 0 5px 0px 0;
+	z-index: 10;
+}
+
+#textarea{
+	position: relative; 
+	top: 0px; 
+	left: 0px;
+	padding: 0px 0px 0px 45px; 
+	width: 100%;
+	height: 100%; 
+	/*position: absolute;*/
+	overflow: hidden;  
+	z-index: 7; 
+	border: solid green 0px;
+/*	background: none;
+	background-color: transparent;*/
+}
+
+#content_highlight{
+	white-space: pre;
+	/*background-color: #FFFFFF;*/
+	padding: 1px 0 0 45px; 
+	position : absolute; 
+	z-index: 4; 
+	overflow: visible; 
+	border: solid yellow 0px;
+}
+
+
+#selection_field{
+	padding: 0px 0px 0 45px; 
+	background-color: #FFFF99; 
+	height: 1px;  
+	position: absolute;
+	z-index: 5;
+	top: -100px;
+	margin: 1px 0 0 0px;
+	white-space: pre;
+	overflow: hidden;
+}
+
+#line_number{
+	position: absolute;
+	overflow: hidden;
+	border-right: solid black 1px;
+	z-index:8;
+	width: 38px;
+	padding-right: 5px;
+	text-align: right;
+	color: #AAAAAA;
+}
+
+#test_font_size{
+	padding: 0; 
+	margin: 0; 
+	visibility: hidden;
+	position: absolute;
+	white-space: pre;
+}
+
+pre{
+	margin: 0;
+	padding: 0;
+}
+
+.hidden{
+	opacity: 0.2; 
+	-moz-opacity: 0.2;
+	filter:alpha(opacity=20);
+}
+
+#result .edit_area_cursor{
+	position: absolute; 
+	z-index:6; 
+	background-color: #FF6633;
+	top: -100px;
+	margin: 1px 0 0 0px;
+}
+
+#result .edit_area_selection_field .overline{
+	background-color: #996600;
+}
+
+
+/* area popup */
+.editarea_popup{
+	border: solid 1px #888888;
+	background-color: #ECE9D8; 
+	width: 250px; 
+	padding: 4px; 
+	position: absolute;
+	visibility: hidden; 
+	/*display: none;*/
+	z-index: 15;
+	top: -500px;
+
+	/*font-family: Aria, Verdana, sans-serif;
+	font-size: 10pt;*/
+}
+
+.editarea_popup, .editarea_popup table{
+	font-family: sans-serif;
+	font-size: 10pt;
+}
+
+.editarea_popup img{
+	border: 0;
+}
+
+.editarea_popup .close_popup{
+	float: right; 
+	line-height: 16px; 
+	border: 0px; 
+	padding: 0px;
+}
+
+.editarea_popup h1,.editarea_popup h2,.editarea_popup h3,.editarea_popup h4,.editarea_popup h5,.editarea_popup h6{
+	margin: 0px;
+	padding: 0px;
+}
+
+.editarea_popup .copyright{
+	text-align: right;
+}	
+
+/* Area_search */
+div#area_search_replace{
+	/*width: 250px;*/
+}
+
+div#area_search_replace img{
+	border: 0px;
+}
+
+div#area_search_replace div.button{
+	text-align: center;
+	line-height: 1.7em;
+}
+
+div#area_search_replace .button a{
+	cursor: pointer;
+	border: solid 1px #888888;
+	background-color: #DEDEDE;
+	text-decoration: none;
+	padding: 0 2px;
+	color: #000000;	
+	white-space: nowrap;
+}
+
+div#area_search_replace a:hover{	
+	/*border: solid 1px #888888;*/
+	background-color: #EDEDED;
+}
+
+div#area_search_replace  #move_area_search_replace{
+	cursor: move; 
+	border: solid 1px #888888;
+}
+
+div#area_search_replace  #close_area_search_replace{
+	text-align: right; 
+	vertical-align: top; 
+	white-space: nowrap;
+}
+
+div#area_search_replace  #area_search_msg{
+	height: 18px; 
+	overflow: hidden; 
+	border-top: solid 1px #888888; 
+	margin-top: 3px;
+}
+
+/* area help */
+#edit_area_help{
+	width: 350px;
+}
+
+#edit_area_help div.close_popup{
+	float: right;
+}
+
+/* area_toolbar */
+.area_toolbar{
+	/*font: 11px sans-serif;*/
+	width: 100%; 
+	/*height: 21px; */
+	margin: 0px; 
+	padding: 0px;
+	background-color: #ECE9D8;
+	text-align: center;
+}
+
+.area_toolbar, .area_toolbar table{
+	font: 11px sans-serif;
+}
+
+.area_toolbar img{
+	border: 0px;
+	vertical-align: middle;
+}
+
+.area_toolbar input{
+	margin: 0px;
+	padding: 0px;
+}
+
+.area_toolbar select{
+    font-family: 'MS Sans Serif',sans-serif,Verdana,Arial;
+    font-size: 7pt;
+    font-weight: normal;
+    margin: 2px 0 0 0 ;
+    padding: 0;
+    vertical-align: top;
+    background-color: #F0F0EE;
+}
+
+table.statusbar{
+	width: 100%;
+}
+
+.area_toolbar td.infos{
+	text-align: center;
+	width: 130px;
+	border-right: solid 1px #888888;
+	border-width: 0 1px 0 0;
+	padding: 0;
+}
+
+.area_toolbar td.total{
+	text-align: right;
+	width: 50px;
+	padding: 0;
+}
+
+.area_toolbar td.resize{
+	text-align: right;
+}
+/*
+.area_toolbar span{
+	line-height: 1px;
+	padding: 0;
+	margin: 0;
+}*/
+
+.area_toolbar span#resize_area{
+	cursor: nw-resize;
+	visibility: hidden;
+}
+
+/* toolbar buttons */
+.editAreaButtonNormal, .editAreaButtonOver, .editAreaButtonDown, .editAreaSeparator, .editAreaSeparatorLine, .editAreaButtonDisabled, .editAreaButtonSelected {
+	border: 0px; margin: 0px; padding: 0px; background: transparent;
+	margin-top: 0px;
+	margin-left: 1px;
+	padding: 0px;
+}
+
+.editAreaButtonNormal {
+	border: 1px solid #ECE9D8 !important;
+	cursor: pointer;
+}
+
+.editAreaButtonOver {
+	border: 1px solid #0A246A !important;
+	cursor: pointer;
+	background-color: #B6BDD2;
+}
+
+.editAreaButtonDown {
+	cursor: pointer;
+	border: 1px solid #0A246A !important;
+	background-color: #8592B5;
+}
+
+.editAreaButtonSelected {
+	border: 1px solid #C0C0BB !important;
+	cursor: pointer;
+	background-color: #F4F2E8;
+}
+
+.editAreaButtonDisabled {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+	border: 1px solid #F0F0EE !important;
+	cursor: pointer;
+}
+
+.editAreaSeparatorLine {
+	margin: 1px 2px;
+	background-color: #C0C0BB;
+	width: 2px;
+	height: 18px;
+}
+
+/* waiting screen */
+#processing{
+	display: none; 
+	background-color:#ECE9D8; 
+	border: solid #888888 1px;
+	position: absolute; 
+	top: 0; 
+	left: 0;
+	width: 100%; 
+	height: 100%; 
+	z-index: 100; 
+	text-align: center;
+}
+
+#processing_text{
+	position:absolute;
+	left: 50%;
+	top: 50%;
+	width: 200px;
+	height: 20px; 
+	margin-left: -100px;
+	margin-top: -10px;
+	text-align: center;
+}
+/* end */

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/edit_area_full.js


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/close.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/fullscreen.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/go_to_line.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/help.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/highlight.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/load.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/move.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/newdocument.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/opacity.png


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/processing.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/redo.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/reset_highlight.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/save.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/save_as.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/search.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/smooth_selection.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/spacer.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/statusbar_resize.gif


BIN
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/images/undo.gif


+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/de.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["de"]={
+new_document: "neues leeres Dokument",
+search_button: "suchen und ersetzen",
+search_command: "suche n&auml;chsten / &ouml;ffne Suchfeld",
+search: "suche",
+replace: "ersetze",
+replace_command: "ersetze / &ouml;ffne Suchfeld",
+find_next: "finde n&auml;chsten",
+replace_all: "ersetze alle Treffer",
+reg_exp: "regul&auml;re Ausdr&uuml;cke",
+match_case: "passt auf den Begriff<br />",
+not_found: "Nicht gefunden.",
+occurrence_replaced: "Die Vorkommen wurden ersetzt.",
+search_field_empty: "leeres Suchfeld",
+restart_search_at_begin: "Ende des zu durchsuchenden Bereiches erreicht. Es wird die Suche von Anfang an fortgesetzt.", //find a shorter translation
+move_popup: "Suchfenster bewegen",
+font_size: "--Schriftgr&ouml;&szlig;e--",
+go_to_line: "gehe zu Zeile",
+go_to_line_prompt: "gehe zu Zeilennummmer:",
+undo: "r&uuml;ckg&auml;ngig machen",
+redo: "wiederherstellen",
+change_smooth_selection: "aktiviere/deaktiviere einige Features (weniger Bildschirmnutzung aber mehr CPU-Belastung)",
+highlight: "Syntax Highlighting an- und ausschalten",
+reset_highlight: "Highlighting zur&uuml;cksetzen (falls mit Text nicht konform)",
+help: "&uuml;ber",
+save: "sichern",
+load: "&ouml;ffnen",
+line_abbr: "Ln",
+char_abbr: "Ch",
+position: "Position",
+total: "Gesamt",
+close_popup: "Popup schlie&szligen",
+shortcuts: "Shortcuts",
+add_tab: "Tab zum Text hinzuf&uuml;gen",
+remove_tab: "Tab aus Text entfernen",
+about_notice: "Bemerkung: Syntax Highlighting ist nur f&uuml;r kurze Texte",
+toggle: "Editor an- und ausschalten",
+accesskey: "Accesskey",
+tab: "Tab",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "In Bearbeitung...",
+fullscreen: "fullscreen"
+};

+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/dk.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["dk"]={
+new_document: "nyt tomt dokument",
+search_button: "s&oslash;g og erstat",
+search_command: "find n&aelig;ste / &aring;ben s&oslash;gefelt",
+search: "s&oslash;g",
+replace: "erstat",
+replace_command: "erstat / &aring;ben s&oslash;gefelt",
+find_next: "find n&aelig;ste",
+replace_all: "erstat alle",
+reg_exp: "regular expressions",
+match_case: "forskel på store/sm&aring; bogstaver<br />",
+not_found: "not found.",
+occurrence_replaced: "occurences replaced.",
+search_field_empty: "Search field empty",
+restart_search_at_begin: "End of area reached. Restart at begin.",
+move_popup: "flyt søgepopup",
+font_size: "--Skriftstørrelse--",
+go_to_line: "g&aring; til linie",
+go_to_line_prompt: "gå til linienummer:",
+undo: "fortryd",
+redo: "gentag",
+change_smooth_selection: "sl&aring; display funktioner til/fra (smartere display men mere CPU kr&aelig;vende)",
+highlight: "sl&aring; syntax highlight til/fra",
+reset_highlight: "nulstil highlight (hvis den er desynkroniseret fra teksten)",
+help: "om",
+save: "gem",
+load: "hent",
+line_abbr: "Ln",
+char_abbr: "Ch",
+position: "Position",
+total: "Total",
+close_popup: "luk popup",
+shortcuts: "Genveje",
+add_tab: "tilf&oslash;j tabulation til tekst",
+remove_tab: "fjern tabulation fra tekst",
+about_notice: "Husk: syntax highlight funktionen b&oslash;r kun bruge til sm&aring; tekster",
+toggle: "Sl&aring; editor til / fra",
+accesskey: "Accesskey",
+tab: "Tab",
+shift: "Skift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "Processing...",
+fullscreen: "fullscreen"
+};

+ 46 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/en.js

@@ -0,0 +1,46 @@
+editAreaLoader.lang["en"]={
+new_document: "new empty document",
+search_button: "search and replace",
+search_command: "search next / open search area",
+search: "search",
+replace: "replace",
+replace_command: "replace / open search area",
+find_next: "find next",
+replace_all: "replace all",
+reg_exp: "regular expressions",
+match_case: "match case",
+not_found: "not found.",
+occurrence_replaced: "occurences replaced.",
+search_field_empty: "Search field empty",
+restart_search_at_begin: "End of area reached. Restart at begin.",
+move_popup: "move search popup",
+font_size: "--Font size--",
+go_to_line: "go to line",
+go_to_line_prompt: "go to line number:",
+undo: "undo",
+redo: "redo",
+change_smooth_selection: "enable/disable some display features (smarter display but more CPU charge)",
+highlight: "toggle syntax highlight on/off",
+reset_highlight: "reset highlight (if desyncronized from text)",
+help: "about",
+save: "save",
+save_as: "save as",
+load: "load",
+line_abbr: "Ln",
+char_abbr: "Ch",
+position: "Position",
+total: "Total",
+close_popup: "close popup",
+shortcuts: "Shortcuts",
+add_tab: "add tabulation to text",
+remove_tab: "remove tabulation to text",
+about_notice: "Notice: syntax highlight function is only for small text",
+toggle: "Toggle editor",
+accesskey: "Accesskey",
+tab: "Tab",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "Processing...",
+fullscreen: "fullscreen"
+};

+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/fr.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["fr"]={
+new_document: "nouveau document (efface le contenu)",
+search_button: "rechercher / remplacer",
+search_command: "rechercher suivant / ouvrir la fen&ecirc;tre de recherche",
+search: "rechercher",
+replace: "remplacer",
+replace_command: "remplacer / ouvrir la fen&ecirc;tre de recherche",
+find_next: "rechercher",
+replace_all: "tout remplacer",
+reg_exp: "expr. r&eacute;guli&egrave;re",
+match_case: "respecter la casse",
+not_found: "pas trouv&eacute;.",
+occurrence_replaced: "remplacements &eacute;ffectu&eacute;s.",
+search_field_empty: "Le champ de recherche est vide.",
+restart_search_at_begin: "Fin du texte atteint, poursuite au d&eacute;but.",
+move_popup: "d&eacute;placer la fen&ecirc;tre de recherche",
+font_size: "--Taille police--",
+go_to_line: "aller &agrave; la ligne",
+go_to_line_prompt: "aller a la ligne numero:",
+undo: "annuler",
+redo: "refaire",
+change_smooth_selection: "activer/d&eacute;sactiver des fonctions d'affichage (meilleur affichage mais plus de charge processeur)",
+highlight: "activer/d&eacute;sactiver la coloration syntaxique",
+reset_highlight: "r&eacute;initialiser la coloration syntaxique (si d&eacute;syncronis&eacute;e du texte)",
+help: "&agrave; propos",
+save: "sauvegarder",
+load: "charger",
+line_abbr: "Ln",
+char_abbr: "Ch",
+position: "Position",
+total: "Total",
+close_popup: "fermer le popup",
+shortcuts: "Racourcis clavier",
+add_tab: "ajouter une tabulation dans le texte",
+remove_tab: "retirer une tabulation dans le texte",
+about_notice: "Note: la coloration syntaxique n'est pr&eacute;vue que pour de courts textes.",
+toggle: "basculer l'&eacute;diteur",
+accesskey: "Accesskey",
+tab: "Tab",
+shift: "Maj",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "chargement...",
+fullscreen: "plein &eacute;cran"
+};

+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/hr.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["hr"]={
+new_document: "Novi dokument",
+search_button: "Traži i izmijeni",
+search_command: "Traži dalje / Otvori prozor za traženje",
+search: "Traži",
+replace: "Izmijeni",
+replace_command: "Izmijeni / Otvori prozor za traženje",
+find_next: "Traži dalje",
+replace_all: "Izmjeni sve",
+reg_exp: "Regularni izrazi",
+match_case: "Bitna vel. slova",
+not_found: "nije naðeno.",
+occurrence_replaced: "izmjenjenih.",
+search_field_empty: "Prazno polje za traženje!",
+restart_search_at_begin: "Došao do kraja. Poèeo od poèetka.",
+move_popup: "Pomakni prozor",
+font_size: "--Velièina teksta--",
+go_to_line: "Odi na redak",
+go_to_line_prompt: "Odi na redak:",
+undo: "Vrati natrag",
+redo: "Napravi ponovo",
+change_smooth_selection: "Ukljuèi/iskljuèi neke moguænosti prikaza (pametniji prikaz, ali zagušeniji CPU)",
+highlight: "Ukljuèi/iskljuèi bojanje sintakse",
+reset_highlight: "Ponovi kolorizaciju (ako je nesinkronizirana s tekstom)",
+help: "O edit_area",
+save: "Spremi",
+load: "Uèitaj",
+line_abbr: "Ln",
+char_abbr: "Zn",
+position: "Pozicija",
+total: "Ukupno",
+close_popup: "Zatvori prozor",
+shortcuts: "Kratice",
+add_tab: "Dodaj tabulaciju",
+remove_tab: "Makni tabulaciju",
+about_notice: "Napomena: koloriziranje sintakse je samo za kratke kodove",
+toggle: "Prebaci naèin ureðivanja",
+accesskey: "Accesskey",
+tab: "Tab",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "Procesiram...",
+fullscreen: "Cijeli prozor"
+};

+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/it.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["it"]={
+new_document: "nuovo documento vuoto",
+search_button: "cerca e sostituisci",
+search_command: "trova successivo / apri finestra di ricerca",
+search: "cerca",
+replace: "sostituisci",
+replace_command: "sostituisci / apri finestra di ricerca",
+find_next: "trova successivo",
+replace_all: "sostituisci tutti",
+reg_exp: "espressioni regolari",
+match_case: "confronta maiuscole/minuscole<br />",
+not_found: "non trovato.",
+occurrence_replaced: "occorrenze sostituite.",
+search_field_empty: "Campo ricerca vuoto",
+restart_search_at_begin: "Fine del testo raggiunta. Ricomincio dall'inizio.",
+move_popup: "sposta popup di ricerca",
+font_size: "-- Dimensione --",
+go_to_line: "vai alla linea",
+go_to_line_prompt: "vai alla linea numero:",
+undo: "annulla",
+redo: "ripeti",
+change_smooth_selection: "abilita/disabilita alcune caratteristiche della visualizzazione",
+highlight: "abilita/disabilita colorazione della sintassi",
+reset_highlight: "aggiorna colorazione (se non sincronizzata)",
+help: "informazioni su...",
+save: "salva",
+load: "carica",
+line_abbr: "Ln",
+char_abbr: "Ch",
+position: "Posizione",
+total: "Totale",
+close_popup: "chiudi popup",
+shortcuts: "Scorciatoie",
+add_tab: "aggiungi tabulazione",
+remove_tab: "rimuovi tabulazione",
+about_notice: "Avviso: la colorazione della sintassi vale solo con testo piccolo",
+toggle: "Abilita/disabilita editor",
+accesskey: "Accesskey",
+tab: "Tab",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "In corso...",
+fullscreen: "fullscreen"
+};

+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/ja.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["ja"]={
+new_document: "新規作成",
+search_button: "検索・置換",
+search_command: "次を検索 / 検索窓を表示",
+search: "検索",
+replace: "置換",
+replace_command: "置換 / 置換窓を表示",
+find_next: "次を検索",
+replace_all: "全置換",
+reg_exp: "正規表現",
+match_case: "大文字小文字の区別",
+not_found: "見つかりません。",
+occurrence_replaced: "置換しました。",
+search_field_empty: "検索対象文字列が空です。",
+restart_search_at_begin: "終端に達しました、始めに戻ります",
+move_popup: "検索窓を移動",
+font_size: "--フォントサイズ--",
+go_to_line: "指定行へ移動",
+go_to_line_prompt: "指定行へ移動します:",
+undo: "元に戻す",
+redo: "やり直し",
+change_smooth_selection: "スムース表示の切り替え(CPUを使います)",
+highlight: "構文強調表示の切り替え",
+reset_highlight: "構文強調表示のリセット",
+help: "ヘルプを表示",
+save: "保存",
+load: "読み込み",
+line_abbr: "行",
+char_abbr: "文字",
+position: "位置",
+total: "合計",
+close_popup: "ポップアップを閉じる",
+shortcuts: "ショートカット",
+add_tab: "タブを挿入する",
+remove_tab: "タブを削除する",
+about_notice: "注意:構文強調表示は短いテキストでしか有効に機能しません。",
+toggle: "テキストエリアとeditAreaの切り替え",
+accesskey: "アクセスキー",
+tab: "Tab",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "処理中です...",
+fullscreen: "fullscreen"
+};

+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/nl.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["nl"]={
+new_document: "nieuw leeg document",
+search_button: "zoek en vervang",
+search_command: "zoek volgende / zoekscherm openen",
+search: "zoek",
+replace: "vervang",
+replace_command: "vervang / zoekscherm openen",
+find_next: "volgende vinden",
+replace_all: "alles vervangen",
+reg_exp: "reguliere expressies",
+match_case: "hoofdletter gevoelig",
+not_found: "niet gevonden.",
+occurrence_replaced: "object vervangen.",
+search_field_empty: "Zoek veld leeg",
+restart_search_at_begin: "Niet meer instanties gevonden, begin opnieuw",
+move_popup: "versleep zoek scherm",
+font_size: "--Letter grootte--",
+go_to_line: "Ga naar regel",
+go_to_line_prompt: "Ga naar regel nummer:",
+undo: "Ongedaan maken",
+redo: "Opnieuw doen",
+change_smooth_selection: "zet wat schermopties aan/uit (kan langzamer zijn)",
+highlight: "zet syntax highlight aan/uit",
+reset_highlight: "reset highlight (indien gedesynchronizeerd)",
+help: "informatie",
+save: "opslaan",
+load: "laden",
+line_abbr: "Ln",
+char_abbr: "Ch",
+position: "Positie",
+total: "Totaal",
+close_popup: "Popup sluiten",
+shortcuts: "Snelkoppelingen",
+add_tab: "voeg tabs toe in tekst",
+remove_tab: "verwijder tabs uit tekst",
+about_notice: "Notitie: syntax highlight functie is alleen voor kleine tekst",
+toggle: "geavanceerde bewerkingsopties",
+accesskey: "Accessknop",
+tab: "Tab",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "Verwerken...",
+fullscreen: "fullscreen"
+};

+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/pl.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["pl"]={
+new_document: "nowy dokument",
+search_button: "znajdź i zamień",
+search_command: "znajdź następny",
+search: "znajdź",
+replace: "zamień",
+replace_command: "zamień",
+find_next: "następny",
+replace_all: "zamień wszystko",
+reg_exp: "wyrażenie regularne",
+match_case: "uwzględnij wielkość liter<br />",
+not_found: "nie znaleziono.",
+occurrence_replaced: "wystąpień zamieniono.",
+search_field_empty: "Nie wprowadzono tekstu",
+restart_search_at_begin: "Koniec dokumentu. Wyszukiwanie od początku.",
+move_popup: "przesuń okienko wyszukiwania",
+font_size: "Rozmiar",
+go_to_line: "idź do linii",
+go_to_line_prompt: "numer linii:",
+undo: "cofnij",
+redo: "przywróć",
+change_smooth_selection: "włącz/wyłącz niektóre opcje wyglądu (zaawansowane opcje wyglądu obciążają procesor)",
+highlight: "włącz/wyłącz podświetlanie składni",
+reset_highlight: "odśwież podświetlanie składni (jeśli rozsynchronizowało się z tekstem)",
+help: "o programie",
+save: "zapisz",
+load: "otwórz",
+line_abbr: "Ln",
+char_abbr: "Zn",
+position: "Pozycja",
+total: "W sumie",
+close_popup: "zamknij okienko",
+shortcuts: "Skróty klawiaturowe",
+add_tab: "dodaj wcięcie do zaznaczonego tekstu",
+remove_tab: "usuń wcięcie",
+about_notice: "Uwaga: podświetlanie składni nie jest zalecane dla długich tekstów",
+toggle: "Włącz/wyłącz edytor",
+accesskey: "Alt+",
+tab: "Tab",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "Przetwarzanie...",
+fullscreen: "fullscreen"
+};

+ 45 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/pt.js

@@ -0,0 +1,45 @@
+editAreaLoader.lang["pt"]={
+new_document: "Novo documento",
+search_button: "Localizar e substituir",
+search_command: "Localizar próximo",
+search: "Localizar",
+replace: "Substituir",
+replace_command: "Substituir",
+find_next: "Localizar",
+replace_all: "Subst. tudo",
+reg_exp: "Expressões regulares",
+match_case: "Diferenciar maiúsculas e minúsculas",
+not_found: "Não encontrado.",
+occurrence_replaced: "Ocorrências substituidas",
+search_field_empty: "Campo localizar vazio.",
+restart_search_at_begin: "Fim das ocorrências. Recomeçar do inicio.",
+move_popup: "Mover janela",
+font_size: "--Tamanho da fonte--",
+go_to_line: "Ir para linha",
+go_to_line_prompt: "Ir para a linha:",
+undo: "Desfazer",
+redo: "Refazer",
+change_smooth_selection: "Opções visuais",
+highlight: "Cores de sintaxe",
+reset_highlight: "Resetar cores (se não sincronizado)",
+help: "Sobre",
+save: "Salvar",
+load: "Carregar",
+line_abbr: "Ln",
+char_abbr: "Ch",
+position: "Posição",
+total: "Total",
+close_popup: "Fechar",
+shortcuts: "Shortcuts",
+add_tab: "Adicionar tabulação",
+remove_tab: "Remover tabulação",
+about_notice: "Atenção: Cores de sintaxe são indicados somente para textos pequenos",
+toggle: "Exibir editor",
+accesskey: "Accesskey",
+tab: "Tab",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "Processando...",
+fullscreen: "fullscreen"
+};

+ 46 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/langs/zh_cn.js

@@ -0,0 +1,46 @@
+editAreaLoader.lang["zh_cn"]={
+new_document: "新建文件",
+search_button: "查找与替换",
+search_command: "新查找/打开查找框",
+search: "查找",
+replace: "替换",
+replace_command: "替换/打开查找框",
+find_next: "查找下一个",
+replace_all: "替换全部",
+reg_exp: "正则表达式",
+match_case: "大小写区分",
+not_found: "无匹配.",
+occurrence_replaced: "被替换次数.",
+search_field_empty: "查找关键词为空",
+restart_search_at_begin: "已达文字框底,重新开始.",
+move_popup: "移动查找窗口",
+font_size: "--文字大小--",
+go_to_line: "指定行数",
+go_to_line_prompt: "移动到指定行数:",
+undo: "上一步",
+redo: "下一步",
+change_smooth_selection: "激活/禁止某些显示特效",
+highlight: "代码高亮开关",
+reset_highlight: "重设代码高亮",
+help: "关于",
+save: "保存",
+save_as: "别存为",
+load: "加载",
+line_abbr: "行数",
+char_abbr: "字节",
+position: "位置",
+total: "总共",
+close_popup: "关闭窗口",
+shortcuts: "快捷键",
+add_tab: "添加间隔号",
+remove_tab: "删除间隔号",
+about_notice: "提示:代码高度功能只适用于小文档",
+toggle: "转换编辑",
+accesskey: "可访问键",
+tab: "间隔号",
+shift: "Shift",
+ctrl: "Ctrl",
+esc: "Esc",
+processing: "处理中...",
+fullscreen: "全屏"
+};

+ 69 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/basic.js

@@ -0,0 +1,69 @@
+editAreaLoader.load_syntax["basic"] = {
+	'COMMENT_SINGLE' : {1 : "'", 2 : 'rem'}
+	,'COMMENT_MULTI' : { }
+	,'QUOTEMARKS' : {1: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : false
+	,'KEYWORDS' : {
+		'statements' : [
+			'if','then','for','wend','while',
+			'else','elseif','select','case','end select',
+			'until','next','step','to','end if', 'call'
+		]
+		,'keywords' : [
+			'sub', 'end sub', 'function', 'end function', 'exit',
+			'exit function', 'dim', 'redim', 'shared', 'const',
+			'is', 'absolute', 'access', 'any', 'append', 'as',
+			'base', 'beep', 'binary', 'bload', 'bsave', 'chain',
+			'chdir', 'circle', 'clear', 'close', 'cls', 'color',
+			'com', 'common', 'data', 'date', 'declare', 'def',
+			'defdbl', 'defint', 'deflng', 'defsng', 'defstr',
+			'double', 'draw', 'environ', 'erase', 'error', 'field',
+			'files', 'fn', 'get', 'gosub', 'goto', 'integer', 'key',
+			'kill', 'let', 'line', 'list', 'locate', 'lock', 'long',
+			'lprint', 'lset', 'mkdir', 'name', 'off', 'on', 'open',
+			'option', 'out', 'output', 'paint', 'palette', 'pcopy',
+			'poke', 'preset', 'print', 'pset', 'put', 'random',
+			'randomize', 'read', 'reset', 'restore', 'resume',
+			'return', 'rmdir', 'rset', 'run', 'screen', 'seg',
+			'shell', 'single', 'sleep', 'sound', 'static', 'stop',
+			'strig', 'string', 'swap', 'system', 'time', 'timer',
+			'troff', 'tron', 'type', 'unlock', 'using', 'view',
+			'wait', 'width', 'window', 'write'
+	        ]
+		,'functions' : [
+			'abs', 'asc', 'atn', 'cdbl', 'chr', 'cint', 'clng',
+			'cos', 'csng', 'csrlin', 'cvd', 'cvdmbf', 'cvi', 'cvl',
+			'cvs', 'cvsmbf', 'eof', 'erdev', 'erl', 'err', 'exp',
+			'fileattr', 'fix', 'fre', 'freefile', 'hex', 'inkey',
+			'inp', 'input', 'instr', 'int', 'ioctl', 'lbound',
+			'lcase', 'left', 'len', 'loc', 'lof', 'log', 'lpos',
+			'ltrim', 'mid', 'mkd', 'mkdmbf', 'mki', 'mkl', 'mks',
+			'mksmbf', 'oct', 'peek', 'pen', 'play', 'pmap', 'point',
+			'pos', 'right', 'rnd', 'rtrim', 'seek', 'sgn', 'sin',
+			'space', 'spc', 'sqr', 'stick', 'str', 'tab', 'tan',
+			'ubound', 'ucase', 'val', 'varptr', 'varseg'
+		]
+		,'operators' : [
+			'and', 'eqv', 'imp', 'mod', 'not', 'or', 'xor'
+		]
+	}
+	,'OPERATORS' :[
+		'+', '-', '/', '*', '=', '<', '>', '!', '&'
+	]
+	,'DELIMITERS' :[
+		'(', ')', '[', ']', '{', '}'
+	]
+	,'STYLES' : {
+		'COMMENTS': 'color: #99CC00;'
+		,'QUOTESMARKS': 'color: #333399;'
+		,'KEYWORDS' : {
+			'keywords' : 'color: #3366FF;'
+			,'functions' : 'color: #0000FF;'
+			,'statements' : 'color: #3366FF;'
+			,'operators' : 'color: #FF0000;'
+			}
+		,'OPERATORS' : 'color: #FF0000;'
+		,'DELIMITERS' : 'color: #0000FF;'
+
+	}
+};

+ 44 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/brainfuck.js

@@ -0,0 +1,44 @@
+editAreaLoader.load_syntax["brainfuck"] = {
+	'COMMENT_SINGLE' : {}
+	,'COMMENT_MULTI' : {}
+	,'QUOTEMARKS' : {}
+	,'KEYWORD_CASE_SENSITIVE' : true
+	,'OPERATORS' :[
+		'+', '-'
+	]
+	,'DELIMITERS' :[
+		'[', ']'
+	]
+	,'REGEXPS' : {
+		'bfispis' : {
+			'search' : '()(\\.)()'
+			,'class' : 'bfispis'
+			,'modifiers' : 'g'
+			,'execute' : 'before'
+		}
+		,'bfupis' : {
+			'search' : '()(\\,)()'
+			,'class' : 'bfupis'
+			,'modifiers' : 'g'
+			,'execute' : 'before'
+		}
+		,'bfmemory' : {
+			'search' : '()([<>])()'
+			,'class' : 'bfmemory'
+			,'modifiers' : 'g'
+			,'execute' : 'before'
+		}
+	}
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #6381F8;'
+		,'OPERATORS' : 'color: #88AA00;'
+		,'DELIMITERS' : 'color: #00C138;'
+		,'REGEXPS' : {
+			'bfispis' : 'color: #EE0000;'
+			,'bfupis' : 'color: #4455ee;'
+			,'bfmemory' : 'color: #DD00DD;'
+		}
+	}
+};
+

+ 62 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/c.js

@@ -0,0 +1,62 @@
+editAreaLoader.load_syntax["c"] = {
+	'COMMENT_SINGLE' : {1 : '//'}
+	,'COMMENT_MULTI' : {'/*' : '*/'}
+	,'QUOTEMARKS' : {1: "'", 2: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : true
+	,'KEYWORDS' : {
+		'constants' : [
+			'NULL', 'false', 'stdin', 'stdout', 'stderr', 'true'
+		]
+		,'types' : [
+			'FILE', 'auto', 'char', 'const', 'double',
+			'extern', 'float', 'inline', 'int', 'long', 'register',
+			'short', 'signed', 'size_t', 'static', 'struct',
+			'time_t', 'typedef', 'union', 'unsigned', 'void',
+			'volatile'
+		]
+		,'statements' : [
+			'do', 'else', 'enum', 'for', 'goto', 'if', 'sizeof',
+			'switch', 'while'
+		]
+ 		,'keywords' : [
+			'break', 'case', 'continue', 'default', 'delete',
+			'return'
+		]
+	}
+	,'OPERATORS' :[
+		'+', '-', '/', '*', '=', '<', '>', '%', '!', '?', ':', '&'
+	]
+	,'DELIMITERS' :[
+		'(', ')', '[', ']', '{', '}'
+	]
+	,'REGEXPS' : {
+		'precompiler' : {
+			'search' : '()(#[^\r\n]*)()'
+			,'class' : 'precompiler'
+			,'modifiers' : 'g'
+			,'execute' : 'before'
+		}
+/*		,'precompilerstring' : {
+			'search' : '(#[\t ]*include[\t ]*)([^\r\n]*)([^\r\n]*[\r\n])'
+			,'class' : 'precompilerstring'
+			,'modifiers' : 'g'
+			,'execute' : 'before'
+		}*/
+	}
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #6381F8;'
+		,'KEYWORDS' : {
+			'constants' : 'color: #EE0000;'
+			,'types' : 'color: #0000EE;'
+			,'statements' : 'color: #60CA00;'
+			,'keywords' : 'color: #48BDDF;'
+		}
+		,'OPERATORS' : 'color: #FF00FF;'
+		,'DELIMITERS' : 'color: #0038E1;'
+		,'REGEXPS' : {
+			'precompiler' : 'color: #009900;'
+			,'precompilerstring' : 'color: #994400;'
+		}
+	}
+};

+ 65 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/cpp.js

@@ -0,0 +1,65 @@
+editAreaLoader.load_syntax["cpp"] = {
+	'COMMENT_SINGLE' : {1 : '//'}
+	,'COMMENT_MULTI' : {'/*' : '*/'}
+	,'QUOTEMARKS' : {1: "'", 2: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : true
+	,'KEYWORDS' : {
+		'constants' : [
+			'NULL', 'false', 'std', 'stdin', 'stdout', 'stderr',
+			'true'
+		]
+		,'types' : [
+			'FILE', 'auto', 'char', 'class', 'const', 'double',
+			'extern', 'float', 'friend', 'inline', 'int',
+			'iterator', 'long', 'map', 'operator', 'queue',
+			'register', 'short', 'signed', 'size_t', 'stack',
+			'static', 'string', 'struct', 'time_t', 'typedef',
+			'union', 'unsigned', 'vector', 'void', 'volatile'
+		]
+		,'statements' : [
+			'catch', 'do', 'else', 'enum', 'for', 'goto', 'if',
+			'sizeof', 'switch', 'this', 'throw', 'try', 'while'
+		]
+ 		,'keywords' : [
+			'break', 'case', 'continue', 'default', 'delete',
+			'namespace', 'new', 'private', 'protected', 'public',
+			'return', 'using'
+		]
+	}
+	,'OPERATORS' :[
+		'+', '-', '/', '*', '=', '<', '>', '%', '!', '?', ':', '&'
+	]
+	,'DELIMITERS' :[
+		'(', ')', '[', ']', '{', '}'
+	]
+	,'REGEXPS' : {
+		'precompiler' : {
+			'search' : '()(#[^\r\n]*)()'
+			,'class' : 'precompiler'
+			,'modifiers' : 'g'
+			,'execute' : 'before'
+		}
+/*		,'precompilerstring' : {
+			'search' : '(#[\t ]*include[\t ]*)([^\r\n]*)([^\r\n]*[\r\n])'
+			,'class' : 'precompilerstring'
+			,'modifiers' : 'g'
+			,'execute' : 'before'
+		}*/
+	}
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #6381F8;'
+		,'KEYWORDS' : {
+			'constants' : 'color: #EE0000;'
+			,'types' : 'color: #0000EE;'
+			,'statements' : 'color: #60CA00;'
+			,'keywords' : 'color: #48BDDF;'
+		}
+		,'OPERATORS' : 'color: #FF00FF;'
+		,'DELIMITERS' : 'color: #0038E1;'
+		,'REGEXPS' : {
+			'precompiler' : 'color: #009900;'
+			,'precompilerstring' : 'color: #994400;'
+		}
+	}
+};

+ 84 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/css.js

@@ -0,0 +1,84 @@
+editAreaLoader.load_syntax["css"] = {
+	'COMMENT_SINGLE' : {1 : '@'}
+	,'COMMENT_MULTI' : {'/*' : '*/'}
+	,'QUOTEMARKS' : ['"', "'"]
+	,'KEYWORD_CASE_SENSITIVE' : false
+	,'KEYWORDS' : {
+		'attributes' : [
+			'aqua', 'azimuth', 'background-attachment', 'background-color',
+			'background-image', 'background-position', 'background-repeat',
+			'background', 'border-bottom-color', 'border-bottom-style',
+			'border-bottom-width', 'border-left-color', 'border-left-style',
+			'border-left-width', 'border-right', 'border-right-color',
+			'border-right-style', 'border-right-width', 'border-top-color',
+			'border-top-style', 'border-top-width','border-bottom', 'border-collapse',
+			'border-left', 'border-width', 'border-color', 'border-spacing',
+			'border-style', 'border-top', 'border',  'caption-side',
+			'clear', 'clip', 'color', 'content', 'counter-increment', 'counter-reset',
+			'cue-after', 'cue-before', 'cue', 'cursor', 'direction', 'display',
+			'elevation', 'empty-cells', 'float', 'font-family', 'font-size',
+			'font-size-adjust', 'font-stretch', 'font-style', 'font-variant',
+			'font-weight', 'font', 'height', 'letter-spacing', 'line-height',
+			'list-style', 'list-style-image', 'list-style-position', 'list-style-type',
+			'margin-bottom', 'margin-left', 'margin-right', 'margin-top', 'margin',
+			'marker-offset', 'marks', 'max-height', 'max-width', 'min-height',
+			'min-width', 'opacity', 'orphans', 'outline', 'outline-color', 'outline-style',
+			'outline-width', 'overflow', 'padding-bottom', 'padding-left',
+			'padding-right', 'padding-top', 'padding', 'page', 'page-break-after',
+			'page-break-before', 'page-break-inside', 'pause-after', 'pause-before',
+			'pause', 'pitch', 'pitch-range',  'play-during', 'position', 'quotes',
+			'richness', 'right', 'size', 'speak-header', 'speak-numeral', 'speak-punctuation',
+			'speak', 'speech-rate', 'stress', 'table-layout', 'text-align', 'text-decoration',
+			'text-indent', 'text-shadow', 'text-transform', 'top', 'unicode-bidi',
+			'vertical-align', 'visibility', 'voice-family', 'volume', 'white-space', 'widows',
+			'width', 'word-spacing', 'z-index', 'bottom', 'left'
+		]
+		,'values' : [
+			'above', 'absolute', 'always', 'armenian', 'aural', 'auto', 'avoid',
+			'baseline', 'behind', 'below', 'bidi-override', 'black', 'blue', 'blink', 'block', 'bold', 'bolder', 'both',
+			'capitalize', 'center-left', 'center-right', 'center', 'circle', 'cjk-ideographic', 
+            'close-quote', 'collapse', 'condensed', 'continuous', 'crop', 'crosshair', 'cross', 'cursive',
+			'dashed', 'decimal-leading-zero', 'decimal', 'default', 'digits', 'disc', 'dotted', 'double',
+			'e-resize', 'embed', 'extra-condensed', 'extra-expanded', 'expanded',
+			'fantasy', 'far-left', 'far-right', 'faster', 'fast', 'fixed', 'fuchsia',
+			'georgian', 'gray', 'green', 'groove', 'hebrew', 'help', 'hidden', 'hide', 'higher',
+			'high', 'hiragana-iroha', 'hiragana', 'icon', 'inherit', 'inline-table', 'inline',
+			'inset', 'inside', 'invert', 'italic', 'justify', 'katakana-iroha', 'katakana',
+			'landscape', 'larger', 'large', 'left-side', 'leftwards', 'level', 'lighter', 'lime', 'line-through', 'list-item', 'loud', 'lower-alpha', 'lower-greek', 'lower-roman', 'lowercase', 'ltr', 'lower', 'low',
+			'maroon', 'medium', 'message-box', 'middle', 'mix', 'monospace',
+			'n-resize', 'narrower', 'navy', 'ne-resize', 'no-close-quote', 'no-open-quote', 'no-repeat', 'none', 'normal', 'nowrap', 'nw-resize',
+			'oblique', 'olive', 'once', 'open-quote', 'outset', 'outside', 'overline',
+			'pointer', 'portrait', 'purple', 'px',
+			'red', 'relative', 'repeat-x', 'repeat-y', 'repeat', 'rgb', 'ridge', 'right-side', 'rightwards',
+			's-resize', 'sans-serif', 'scroll', 'se-resize', 'semi-condensed', 'semi-expanded', 'separate', 'serif', 'show', 'silent', 'silver', 'slow', 'slower', 'small-caps', 'small-caption', 'smaller', 'soft', 'solid', 'spell-out', 'square',
+			'static', 'status-bar', 'super', 'sw-resize',
+			'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row', 'table-row-group', 'teal', 'text', 'text-bottom', 'text-top', 'thick', 'thin', 'transparent',
+			'ultra-condensed', 'ultra-expanded', 'underline', 'upper-alpha', 'upper-latin', 'upper-roman', 'uppercase', 'url',
+			'visible',
+			'w-resize', 'wait', 'white', 'wider',
+			'x-fast', 'x-high', 'x-large', 'x-loud', 'x-low', 'x-small', 'x-soft', 'xx-large', 'xx-small',
+			'yellow', 'yes'
+		]
+		,'specials' : [
+			'important'
+		]
+	}
+	,'OPERATORS' :[
+		':', ';', '!', '.', '#'
+	]
+	,'DELIMITERS' :[
+		'{', '}'
+	]
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #6381F8;'
+		,'KEYWORDS' : {
+			'attributes' : 'color: #48BDDF;'
+			,'values' : 'color: #2B60FF;'
+			,'specials' : 'color: #FF0000;'
+			}
+		,'OPERATORS' : 'color: #FF00FF;'
+		,'DELIMITERS' : 'color: #60CA00;'
+				
+	}
+};

+ 50 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/html.js

@@ -0,0 +1,50 @@
+/*
+* last update: 2006-08-24
+*/
+
+editAreaLoader.load_syntax["html"] = {
+	'COMMENT_SINGLE' : {}
+	,'COMMENT_MULTI' : {'<!--' : '-->'}
+	,'QUOTEMARKS' : {1: "'", 2: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : false
+	,'KEYWORDS' : {
+	}
+	,'OPERATORS' :[
+	]
+	,'DELIMITERS' :[
+	]
+	,'REGEXPS' : {
+		'doctype' : {
+			'search' : '()(<!DOCTYPE[^>]*>)()'
+			,'class' : 'doctype'
+			,'modifiers' : ''
+			,'execute' : 'before' // before or after
+		}
+		,'tags' : {
+			'search' : '(<)(/?[a-z][^ \r\n\t>]*)([^>]*>)'
+			,'class' : 'tags'
+			,'modifiers' : 'gi'
+			,'execute' : 'before' // before or after
+		}
+		,'attributes' : {
+			'search' : '( |\n|\r|\t)([^ \r\n\t=]+)(=)'
+			,'class' : 'attributes'
+			,'modifiers' : 'g'
+			,'execute' : 'before' // before or after
+		}
+	}
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #6381F8;'
+		,'KEYWORDS' : {
+			}
+		,'OPERATORS' : 'color: #E775F0;'
+		,'DELIMITERS' : ''
+		,'REGEXPS' : {
+			'attributes': 'color: #B1AC41;'
+			,'tags': 'color: #E62253;'
+			,'doctype': 'color: #8DCFB5;'
+			,'test': 'color: #00FF00;'
+		}	
+	}		
+};

+ 60 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/js.js

@@ -0,0 +1,60 @@
+editAreaLoader.load_syntax["js"] = {
+	'COMMENT_SINGLE' : {1 : '//'}
+	,'COMMENT_MULTI' : {'/*' : '*/'}
+	,'QUOTEMARKS' : {1: "'", 2: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : true
+	,'KEYWORDS' : {
+		'statements' : [
+			'as', 'break', 'case', 'catch', 'continue', 'decodeURI', 'delete', 'do',
+			'else', 'encodeURI', 'eval', 'finally', 'for', 'if', 'in', 'is', 'item',
+			'instanceof', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'void',
+			'while', 'write', 'with'
+		]
+ 		,'keywords' : [
+			'class', 'const', 'default', 'debugger', 'export', 'extends', 'false',
+			'function', 'import', 'namespace', 'new', 'null', 'package', 'private',
+			'protected', 'public', 'super', 'true', 'use', 'var', 'window', 'document',		
+			// the list below must be sorted and checked (if it is a keywords or a function and if it is not present twice
+			'Link ', 'outerHeight ', 'Anchor', 'FileUpload', 
+			'location', 'outerWidth', 'Select', 'Area', 'find', 'Location', 'Packages', 'self', 
+			'arguments', 'locationbar', 'pageXoffset', 'Form', 
+			'Math', 'pageYoffset', 'setTimeout', 'assign', 'Frame', 'menubar', 'parent', 'status', 
+			'blur', 'frames', 'MimeType', 'parseFloat', 'statusbar', 'Boolean', 'Function', 'moveBy', 
+			'parseInt', 'stop', 'Button', 'getClass', 'moveTo', 'Password', 'String', 'callee', 'Hidden', 
+			'name', 'personalbar', 'Submit', 'caller', 'history', 'NaN', 'Plugin', 'sun', 'captureEvents', 
+			'History', 'navigate', 'print', 'taint', 'Checkbox', 'home', 'navigator', 'prompt', 'Text', 
+			'Image', 'Navigator', 'prototype', 'Textarea', 'clearTimeout', 'Infinity', 
+			'netscape', 'Radio', 'toolbar', 'close', 'innerHeight', 'Number', 'ref', 'top', 'closed', 
+			'innerWidth', 'Object', 'RegExp', 'toString', 'confirm', 'isFinite', 'onBlur', 'releaseEvents', 
+			'unescape', 'constructor', 'isNan', 'onError', 'Reset', 'untaint', 'Date', 'java', 'onFocus', 
+			'resizeBy', 'unwatch', 'defaultStatus', 'JavaArray', 'onLoad', 'resizeTo', 'valueOf', 'document', 
+			'JavaClass', 'onUnload', 'routeEvent', 'watch', 'Document', 'JavaObject', 'open', 'scroll', 'window', 
+			'Element', 'JavaPackage', 'opener', 'scrollbars', 'Window', 'escape', 'length', 'Option', 'scrollBy'			
+		]
+    	,'functions' : [
+			// common functions for Window object
+			'alert', 'Array', 'back', 'blur', 'clearInterval', 'close', 'confirm', 'eval ', 'focus', 'forward', 'home',
+			'name', 'navigate', 'onblur', 'onerror', 'onfocus', 'onload', 'onmove',
+			'onresize', 'onunload', 'open', 'print', 'prompt', 'scroll', 'scrollTo', 'setInterval', 'status',
+			'stop' 
+		]
+	}
+	,'OPERATORS' :[
+		'+', '-', '/', '*', '=', '<', '>', '%', '!'
+	]
+	,'DELIMITERS' :[
+		'(', ')', '[', ']', '{', '}'
+	]
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #6381F8;'
+		,'KEYWORDS' : {
+			'statements' : 'color: #60CA00;'
+			,'keywords' : 'color: #48BDDF;'
+			,'functions' : 'color: #2B60FF;'
+		}
+		,'OPERATORS' : 'color: #FF00FF;'
+		,'DELIMITERS' : 'color: #0038E1;'
+				
+	}
+};

+ 82 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/pas.js

@@ -0,0 +1,82 @@
+editAreaLoader.load_syntax["pas"] = {
+	'COMMENT_SINGLE' : {}
+	,'COMMENT_MULTI' : {'{' : '}', '(*':'*)'}
+	,'QUOTEMARKS' : {1: '"', 2: "'"}
+	,'KEYWORD_CASE_SENSITIVE' : false
+	,'KEYWORDS' : {
+		'constants' : [
+			'Blink', 'Black', 'Blue', 'Green', 'Cyan', 'Red',
+			'Magenta', 'Brown', 'LightGray', 'DarkGray',
+			'LightBlue', 'LightGreen', 'LightCyan', 'LightRed',
+			'LightMagenta', 'Yellow', 'White', 'MaxSIntValue',
+			'MaxUIntValue', 'maxint', 'maxLongint', 'maxSmallint',
+			'erroraddr', 'errorcode', 'LineEnding'
+		]
+		,'keywords' : [
+			'in', 'or', 'div', 'mod', 'and', 'shl', 'shr', 'xor',
+			'pow', 'is', 'not','Absolute', 'And_then', 'Array',
+			'Begin', 'Bindable', 'Case', 'Const', 'Do', 'Downto',
+			'Else', 'End', 'Export', 'File', 'For', 'Function',
+			'Goto', 'If', 'Import', 'Implementation', 'Inherited',
+			'Inline', 'Interface', 'Label', 'Module', 'Nil',
+			'Object', 'Of', 'Only', 'Operator', 'Or_else',
+			'Otherwise', 'Packed', 'Procedure', 'Program',
+			'Protected', 'Qualified', 'Record', 'Repeat',
+			'Restricted', 'Set', 'Then', 'To', 'Type', 'Unit',
+			'Until', 'Uses', 'Value', 'Var', 'Virtual', 'While',
+			'With'
+		]
+		,'functions' : [
+			'Abs', 'Addr', 'Append', 'Arctan', 'Assert', 'Assign',
+			'Assigned', 'BinStr', 'Blockread', 'Blockwrite',
+			'Break', 'Chdir', 'Chr', 'Close', 'CompareByte',
+			'CompareChar', 'CompareDWord', 'CompareWord', 'Concat',
+			'Continue', 'Copy', 'Cos', 'CSeg', 'Dec', 'Delete',
+			'Dispose', 'DSeg', 'Eof', 'Eoln', 'Erase', 'Exclude',
+			'Exit', 'Exp', 'Filepos', 'Filesize', 'FillByte',
+			'Fillchar', 'FillDWord', 'Fillword', 'Flush', 'Frac',
+			'Freemem', 'Getdir', 'Getmem', 'GetMemoryManager',
+			'Halt', 'HexStr', 'Hi', 'High', 'Inc', 'Include',
+			'IndexByte', 'IndexChar', 'IndexDWord', 'IndexWord',
+			'Insert', 'IsMemoryManagerSet', 'Int', 'IOresult',
+			'Length', 'Ln', 'Lo', 'LongJmp', 'Low', 'Lowercase',
+			'Mark', 'Maxavail', 'Memavail', 'Mkdir', 'Move',
+			'MoveChar0', 'New', 'Odd', 'OctStr', 'Ofs', 'Ord',
+			'Paramcount', 'Paramstr', 'Pi', 'Pos', 'Power', 'Pred',
+			'Ptr', 'Random', 'Randomize', 'Read', 'Readln',
+			'Real2Double', 'Release', 'Rename', 'Reset', 'Rewrite',
+			'Rmdir', 'Round', 'Runerror', 'Seek', 'SeekEof',
+			'SeekEoln', 'Seg', 'SetMemoryManager', 'SetJmp',
+			'SetLength', 'SetString', 'SetTextBuf', 'Sin', 'SizeOf',
+			'Sptr', 'Sqr', 'Sqrt', 'SSeg', 'Str', 'StringOfChar',
+			'Succ', 'Swap', 'Trunc', 'Truncate', 'Upcase', 'Val',
+			'Write', 'WriteLn'
+		]
+		,'types' : [
+			'Integer', 'Shortint', 'SmallInt', 'Longint',
+			'Longword', 'Int64', 'Byte', 'Word', 'Cardinal',
+			'QWord', 'Boolean', 'ByteBool', 'LongBool', 'Char',
+			'Real', 'Single', 'Double', 'Extended', 'Comp',
+			'String', 'ShortString', 'AnsiString', 'PChar'
+		]
+	}
+	,'OPERATORS' :[
+		'@', '*', '+', '-', '/', '^', ':=', '<', '=', '>'
+	]
+	,'DELIMITERS' :[
+		'(', ')', '[', ']'
+	]
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #6381F8;'
+		,'KEYWORDS' : {
+			'specials' : 'color: #EE0000;'
+			,'constants' : 'color: #654321;'
+			,'keywords' : 'color: #48BDDF;'
+			,'functions' : 'color: #449922;'
+			,'types' : 'color: #2B60FF;'
+			}
+		,'OPERATORS' : 'color: #FF00FF;'
+		,'DELIMITERS' : 'color: #60CA00;'
+	}
+};

+ 75 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/php.js

@@ -0,0 +1,75 @@
+editAreaLoader.load_syntax["php"] = {
+	'COMMENT_SINGLE' : {1 : '//', 2 : '#'}
+	,'COMMENT_MULTI' : {'/*' : '*/'}
+	,'QUOTEMARKS' : {1: "'", 2: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : false
+	,'KEYWORDS' : {
+		'statements' : [
+			'include', 'require', 'include_once', 'require_once',
+			'for', 'foreach', 'as', 'if', 'elseif', 'else', 'while', 'do', 'endwhile',
+            'endif', 'switch', 'case', 'endswitch',
+			'return', 'break', 'continue'
+		]
+		,'reserved' : [
+			'_GET', '_POST', '_SERVER', '_FILES', '_ENV', '_COOKIE', '_REQUEST',
+			'null', '__LINE__', '__FILE__',
+			'false', '&lt;?php', '?&gt;', '&lt;?',
+			'&lt;script language', '&lt;/script&gt;',
+			'true', 'var', 'default',
+			'function', 'class', 'new', '&amp;new', 'this',
+			'__FUNCTION__', '__CLASS__', '__METHOD__', 'PHP_VERSION',
+			'PHP_OS', 'DEFAULT_INCLUDE_PATH', 'PEAR_INSTALL_DIR', 'PEAR_EXTENSION_DIR',
+			'PHP_EXTENSION_DIR', 'PHP_BINDIR', 'PHP_LIBDIR', 'PHP_DATADIR', 'PHP_SYSCONFDIR',
+			'PHP_LOCALSTATEDIR', 'PHP_CONFIG_FILE_PATH', 'PHP_OUTPUT_HANDLER_START', 'PHP_OUTPUT_HANDLER_CONT',
+			'PHP_OUTPUT_HANDLER_END', 'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE',
+			'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING', 'E_USER_ERROR',
+			'E_USER_WARNING', 'E_USER_NOTICE', 'E_ALL'
+			
+		]
+		,'functions' : [
+			'func_num_args', 'func_get_arg', 'func_get_args', 'strlen', 'strcmp', 'strncmp', 'strcasecmp', 'strncasecmp', 'each', 'error_reporting', 'define', 'defined',
+			'trigger_error', 'user_error', 'set_error_handler', 'restore_error_handler', 'get_declared_classes', 'get_loaded_extensions',
+			'extension_loaded', 'get_extension_funcs', 'debug_backtrace',
+			'constant', 'bin2hex', 'sleep', 'usleep', 'time', 'mktime', 'gmmktime', 'strftime', 'gmstrftime', 'strtotime', 'date', 'gmdate', 'getdate', 'localtime', 'checkdate', 'flush', 'wordwrap', 'htmlspecialchars', 'htmlentities', 'html_entity_decode', 'md5', 'md5_file', 'crc32', 'getimagesize', 'image_type_to_mime_type', 'phpinfo', 'phpversion', 'phpcredits', 'strnatcmp', 'strnatcasecmp', 'substr_count', 'strspn', 'strcspn', 'strtok', 'strtoupper', 'strtolower', 'strpos', 'strrpos', 'strrev', 'hebrev', 'hebrevc', 'nl2br', 'basename', 'dirname', 'pathinfo', 'stripslashes', 'stripcslashes', 'strstr', 'stristr', 'strrchr', 'str_shuffle', 'str_word_count', 'strcoll', 'substr', 'substr_replace', 'quotemeta', 'ucfirst', 'ucwords', 'strtr', 'addslashes', 'addcslashes', 'rtrim', 'str_replace', 'str_repeat', 'count_chars', 'chunk_split', 'trim', 'ltrim', 'strip_tags', 'similar_text', 'explode', 'implode', 'setlocale', 'localeconv',
+			'parse_str', 'str_pad', 'chop', 'strchr', 'sprintf', 'printf', 'vprintf', 'vsprintf', 'sscanf', 'fscanf', 'parse_url', 'urlencode', 'urldecode', 'rawurlencode', 'rawurldecode', 'readlink', 'linkinfo', 'link', 'unlink', 'exec', 'system', 'escapeshellcmd', 'escapeshellarg', 'passthru', 'shell_exec', 'proc_open', 'proc_close', 'rand', 'srand', 'getrandmax', 'mt_rand', 'mt_srand', 'mt_getrandmax', 'base64_decode', 'base64_encode', 'abs', 'ceil', 'floor', 'round', 'is_finite', 'is_nan', 'is_infinite', 'bindec', 'hexdec', 'octdec', 'decbin', 'decoct', 'dechex', 'base_convert', 'number_format', 'fmod', 'ip2long', 'long2ip', 'getenv', 'putenv', 'getopt', 'microtime', 'gettimeofday', 'getrusage', 'uniqid', 'quoted_printable_decode', 'set_time_limit', 'get_cfg_var', 'magic_quotes_runtime', 'set_magic_quotes_runtime', 'get_magic_quotes_gpc', 'get_magic_quotes_runtime',
+			'import_request_variables', 'error_log', 'serialize', 'unserialize', 'memory_get_usage', 'var_dump', 'var_export', 'debug_zval_dump', 'print_r','highlight_file', 'show_source', 'highlight_string', 'ini_get', 'ini_get_all', 'ini_set', 'ini_alter', 'ini_restore', 'get_include_path', 'set_include_path', 'restore_include_path', 'setcookie', 'header', 'headers_sent', 'connection_aborted', 'connection_status', 'ignore_user_abort', 'parse_ini_file', 'is_uploaded_file', 'move_uploaded_file', 'intval', 'floatval', 'doubleval', 'strval', 'gettype', 'settype', 'is_null', 'is_resource', 'is_bool', 'is_long', 'is_float', 'is_int', 'is_integer', 'is_double', 'is_real', 'is_numeric', 'is_string', 'is_array', 'is_object', 'is_scalar',
+			'ereg', 'ereg_replace', 'eregi', 'eregi_replace', 'split', 'spliti', 'join', 'sql_regcase', 'dl', 'pclose', 'popen', 'readfile', 'rewind', 'rmdir', 'umask', 'fclose', 'feof', 'fgetc', 'fgets', 'fgetss', 'fread', 'fopen', 'fpassthru', 'ftruncate', 'fstat', 'fseek', 'ftell', 'fflush', 'fwrite', 'fputs', 'mkdir', 'rename', 'copy', 'tempnam', 'tmpfile', 'file', 'file_get_contents', 'stream_select', 'stream_context_create', 'stream_context_set_params', 'stream_context_set_option', 'stream_context_get_options', 'stream_filter_prepend', 'stream_filter_append', 'fgetcsv', 'flock', 'get_meta_tags', 'stream_set_write_buffer', 'set_file_buffer', 'set_socket_blocking', 'stream_set_blocking', 'socket_set_blocking', 'stream_get_meta_data', 'stream_register_wrapper', 'stream_wrapper_register', 'stream_set_timeout', 'socket_set_timeout', 'socket_get_status', 'realpath', 'fnmatch', 'fsockopen', 'pfsockopen', 'pack', 'unpack', 'get_browser', 'crypt', 'opendir', 'closedir', 'chdir', 'getcwd', 'rewinddir', 'readdir', 'dir', 'glob', 'fileatime', 'filectime', 'filegroup', 'fileinode', 'filemtime', 'fileowner', 'fileperms', 'filesize', 'filetype', 'file_exists', 'is_writable', 'is_writeable', 'is_readable', 'is_executable', 'is_file', 'is_dir', 'is_link', 'stat', 'lstat', 'chown',
+			'touch', 'clearstatcache', 'mail', 'ob_start', 'ob_flush', 'ob_clean', 'ob_end_flush', 'ob_end_clean', 'ob_get_flush', 'ob_get_clean', 'ob_get_length', 'ob_get_level', 'ob_get_status', 'ob_get_contents', 'ob_implicit_flush', 'ob_list_handlers', 'ksort', 'krsort', 'natsort', 'natcasesort', 'asort', 'arsort', 'sort', 'rsort', 'usort', 'uasort', 'uksort', 'shuffle', 'array_walk', 'count', 'end', 'prev', 'next', 'reset', 'current', 'key', 'min', 'max', 'in_array', 'array_search', 'extract', 'compact', 'array_fill', 'range', 'array_multisort', 'array_push', 'array_pop', 'array_shift', 'array_unshift', 'array_splice', 'array_slice', 'array_merge', 'array_merge_recursive', 'array_keys', 'array_values', 'array_count_values', 'array_reverse', 'array_reduce', 'array_pad', 'array_flip', 'array_change_key_case', 'array_rand', 'array_unique', 'array_intersect', 'array_intersect_assoc', 'array_diff', 'array_diff_assoc', 'array_sum', 'array_filter', 'array_map', 'array_chunk', 'array_key_exists', 'pos', 'sizeof', 'key_exists', 'assert', 'assert_options', 'version_compare', 'ftok', 'str_rot13', 'aggregate',
+			'session_name', 'session_module_name', 'session_save_path', 'session_id', 'session_regenerate_id', 'session_decode', 'session_register', 'session_unregister', 'session_is_registered', 'session_encode',
+			'session_start', 'session_destroy', 'session_unset', 'session_set_save_handler', 'session_cache_limiter', 'session_cache_expire', 'session_set_cookie_params', 'session_get_cookie_params', 'session_write_close', 'preg_match', 'preg_match_all', 'preg_replace', 'preg_replace_callback', 'preg_split', 'preg_quote', 'preg_grep', 'overload', 'ctype_alnum', 'ctype_alpha', 'ctype_cntrl', 'ctype_digit', 'ctype_lower', 'ctype_graph', 'ctype_print', 'ctype_punct', 'ctype_space', 'ctype_upper', 'ctype_xdigit', 'virtual', 'apache_request_headers', 'apache_note', 'apache_lookup_uri', 'apache_child_terminate', 'apache_setenv', 'apache_response_headers', 'apache_get_version', 'getallheaders', 'mysql_connect', 'mysql_pconnect', 'mysql_close', 'mysql_select_db', 'mysql_create_db', 'mysql_drop_db', 'mysql_query', 'mysql_unbuffered_query', 'mysql_db_query', 'mysql_list_dbs', 'mysql_list_tables', 'mysql_list_fields', 'mysql_list_processes', 'mysql_error', 'mysql_errno', 'mysql_affected_rows', 'mysql_insert_id', 'mysql_result', 'mysql_num_rows', 'mysql_num_fields', 'mysql_fetch_row', 'mysql_fetch_array', 'mysql_fetch_assoc', 'mysql_fetch_object', 'mysql_data_seek', 'mysql_fetch_lengths', 'mysql_fetch_field', 'mysql_field_seek', 'mysql_free_result', 'mysql_field_name', 'mysql_field_table', 'mysql_field_len', 'mysql_field_type', 'mysql_field_flags', 'mysql_escape_string', 'mysql_real_escape_string', 'mysql_stat',
+			'mysql_thread_id', 'mysql_client_encoding', 'mysql_get_client_info', 'mysql_get_host_info', 'mysql_get_proto_info', 'mysql_get_server_info', 'mysql_info', 'mysql', 'mysql_fieldname', 'mysql_fieldtable', 'mysql_fieldlen', 'mysql_fieldtype', 'mysql_fieldflags', 'mysql_selectdb', 'mysql_createdb', 'mysql_dropdb', 'mysql_freeresult', 'mysql_numfields', 'mysql_numrows', 'mysql_listdbs', 'mysql_listtables', 'mysql_listfields', 'mysql_db_name', 'mysql_dbname', 'mysql_tablename', 'mysql_table_name', 'pg_connect', 'pg_pconnect', 'pg_close', 'pg_connection_status', 'pg_connection_busy', 'pg_connection_reset', 'pg_host', 'pg_dbname', 'pg_port', 'pg_tty', 'pg_options', 'pg_ping', 'pg_query', 'pg_send_query', 'pg_cancel_query', 'pg_fetch_result', 'pg_fetch_row', 'pg_fetch_assoc', 'pg_fetch_array', 'pg_fetch_object', 'pg_fetch_all', 'pg_affected_rows', 'pg_get_result', 'pg_result_seek', 'pg_result_status', 'pg_free_result', 'pg_last_oid', 'pg_num_rows', 'pg_num_fields', 'pg_field_name', 'pg_field_num', 'pg_field_size', 'pg_field_type', 'pg_field_prtlen', 'pg_field_is_null', 'pg_get_notify', 'pg_get_pid', 'pg_result_error', 'pg_last_error', 'pg_last_notice', 'pg_put_line', 'pg_end_copy', 'pg_copy_to', 'pg_copy_from',
+			'pg_trace', 'pg_untrace', 'pg_lo_create', 'pg_lo_unlink', 'pg_lo_open', 'pg_lo_close', 'pg_lo_read', 'pg_lo_write', 'pg_lo_read_all', 'pg_lo_import', 'pg_lo_export', 'pg_lo_seek', 'pg_lo_tell', 'pg_escape_string', 'pg_escape_bytea', 'pg_unescape_bytea', 'pg_client_encoding', 'pg_set_client_encoding', 'pg_meta_data', 'pg_convert', 'pg_insert', 'pg_update', 'pg_delete', 'pg_select', 'pg_exec', 'pg_getlastoid', 'pg_cmdtuples', 'pg_errormessage', 'pg_numrows', 'pg_numfields', 'pg_fieldname', 'pg_fieldsize', 'pg_fieldtype', 'pg_fieldnum', 'pg_fieldprtlen', 'pg_fieldisnull', 'pg_freeresult', 'pg_result', 'pg_loreadall', 'pg_locreate', 'pg_lounlink', 'pg_loopen', 'pg_loclose', 'pg_loread', 'pg_lowrite', 'pg_loimport', 'pg_loexport',
+			'echo', 'print', 'global', 'static', 'exit', 'array', 'empty', 'eval', 'isset', 'unset', 'die'
+
+		]
+	}
+	,'OPERATORS' :[
+		'+', '-', '/', '*', '=', '<', '>', '%', '!', '&&', '||'
+	]
+	,'DELIMITERS' :[
+		'(', ')', '[', ']', '{', '}'
+	]
+	,'REGEXPS' : {
+		// highlight all variables ($...)
+		'variables' : {
+			'search' : '()(\\$\\w+)()'
+			,'class' : 'variables'
+			,'modifiers' : 'g'
+			,'execute' : 'before' // before or after
+		}
+	}
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #879EFA;'
+		,'KEYWORDS' : {
+			'reserved' : 'color: #48BDDF;'
+			,'functions' : 'color: #0040FD;'
+			,'statements' : 'color: #60CA00;'
+			}
+		,'OPERATORS' : 'color: #FF00FF;'
+		,'DELIMITERS' : 'color: #2B60FF;'
+		,'REGEXPS' : {
+			'variables' : 'color: #E0BD54;'
+		}		
+	}
+};

+ 144 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/python.js

@@ -0,0 +1,144 @@
+/**
+ * Python syntax v 1.1 
+ * 
+ * v1.1 by Andre Roberge (2006/12/27)
+ *   
+**/
+editAreaLoader.load_syntax["python"] = {
+	'COMMENT_SINGLE' : {1 : '#'}
+	,'COMMENT_MULTI' : {}
+	,'QUOTEMARKS' : {1: "'", 2: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : true
+	,'KEYWORDS' : {
+		/*
+		** Set 1: reserved words
+		** http://python.org/doc/current/ref/keywords.html
+		** Note: 'as' and 'with' have been added starting with Python 2.5
+		*/
+		'reserved' : [
+			'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif',
+			'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 
+			'import', 'is', 'in', 'lambda', 'not', 'or', 'pass', 'print', 'raise',
+			'return', 'try', 'while', 'with', 'yield'
+			//the following are *almost* reserved; we'll treat them as such
+			, 'False', 'True', 'None'
+		]
+		/*
+		** Set 2: builtins
+		** http://python.org/doc/current/lib/built-in-funcs.html
+		*/	
+		,'builtins' : [
+			'__import__', 'abs', 'basestring', 'bool', 'callable', 'chr', 'classmethod', 'cmp', 
+			'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 
+			'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help',
+			'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals',
+			'long', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'range',
+			'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
+			'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 
+			'vars', 'xrange', 'zip',
+			// Built-in constants: http://www.python.org/doc/2.4.1/lib/node35.html
+			//'False', 'True', 'None' have been included in 'reserved'
+			'NotImplemented', 'Ellipsis',
+			// Built-in Exceptions: http://python.org/doc/current/lib/module-exceptions.html
+			'Exception', 'StandardError', 'ArithmeticError', 'LookupError', 'EnvironmentError',
+			'AssertionError', 'AttributeError', 'EOFError', 'FloatingPointError', 'IOError',
+			'ImportError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'MemoryError', 'NameError',
+			'NotImplementedError', 'OSError', 'OverflowError', 'ReferenceError', 'RuntimeError',
+			'StopIteration', 'SyntaxError', 'SystemError', 'SystemExit', 'TypeError',
+			'UnboundlocalError', 'UnicodeError', 'UnicodeEncodeError', 'UnicodeDecodeError',
+			'UnicodeTranslateError', 'ValueError', 'WindowsError', 'ZeroDivisionError', 'Warning',
+			'UserWarning', 'DeprecationWarning', 'PendingDeprecationWarning', 'SyntaxWarning',
+			'RuntimeWarning', 'FutureWarning',		
+			// we will include the string methods as well
+			// http://python.org/doc/current/lib/string-methods.html
+			'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
+			'find', 'index', 'isalnum', 'isaplpha', 'isdigit', 'islower', 'isspace', 'istitle',
+			'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust',
+			'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
+			'translate', 'upper', 'zfill'
+		]
+		/*
+		** Set 3: standard library
+		** http://python.org/doc/current/lib/modindex.html
+		*/
+		,'stdlib' : [
+			'__builtin__', '__future__', '__main__', '_winreg', 'aifc', 'AL', 'al', 'anydbm',
+			'array', 'asynchat', 'asyncore', 'atexit', 'audioop', 'base64', 'BaseHTTPServer',
+			'Bastion', 'binascii', 'binhex', 'bisect', 'bsddb', 'bz2', 'calendar', 'cd', 'cgi',
+			'CGIHTTPServer', 'cgitb', 'chunk', 'cmath', 'cmd', 'code', 'codecs', 'codeop',
+			'collections', 'colorsys', 'commands', 'compileall', 'compiler', 'compiler',
+			'ConfigParser', 'Cookie', 'cookielib', 'copy', 'copy_reg', 'cPickle', 'crypt',
+			'cStringIO', 'csv', 'curses', 'datetime', 'dbhash', 'dbm', 'decimal', 'DEVICE',
+			'difflib', 'dircache', 'dis', 'distutils', 'dl', 'doctest', 'DocXMLRPCServer', 'dumbdbm',
+			'dummy_thread', 'dummy_threading', 'email', 'encodings', 'errno', 'exceptions', 'fcntl',
+			'filecmp', 'fileinput', 'FL', 'fl', 'flp', 'fm', 'fnmatch', 'formatter', 'fpectl',
+			'fpformat', 'ftplib', 'gc', 'gdbm', 'getopt', 'getpass', 'gettext', 'GL', 'gl', 'glob',
+			'gopherlib', 'grp', 'gzip', 'heapq', 'hmac', 'hotshot', 'htmlentitydefs', 'htmllib',
+			'HTMLParser', 'httplib', 'imageop', 'imaplib', 'imgfile', 'imghdr', 'imp', 'inspect',
+			'itertools', 'jpeg', 'keyword', 'linecache', 'locale', 'logging', 'mailbox', 'mailcap',
+			'marshal', 'math', 'md5', 'mhlib', 'mimetools', 'mimetypes', 'MimeWriter', 'mimify',
+			'mmap', 'msvcrt', 'multifile', 'mutex', 'netrc', 'new', 'nis', 'nntplib', 'operator',
+			'optparse', 'os', 'ossaudiodev', 'parser', 'pdb', 'pickle', 'pickletools', 'pipes',
+			'pkgutil', 'platform', 'popen2', 'poplib', 'posix', 'posixfile', 'pprint', 'profile',
+			'pstats', 'pty', 'pwd', 'py_compile', 'pyclbr', 'pydoc', 'Queue', 'quopri', 'random',
+			're', 'readline', 'repr', 'resource', 'rexec', 'rfc822', 'rgbimg', 'rlcompleter',
+			'robotparser', 'sched', 'ScrolledText', 'select', 'sets', 'sgmllib', 'sha', 'shelve',
+			'shlex', 'shutil', 'signal', 'SimpleHTTPServer', 'SimpleXMLRPCServer', 'site', 'smtpd',
+			'smtplib', 'sndhdr', 'socket', 'SocketServer', 'stat', 'statcache', 'statvfs', 'string',
+			'StringIO', 'stringprep', 'struct', 'subprocess', 'sunau', 'SUNAUDIODEV', 'sunaudiodev',
+			'symbol', 'sys', 'syslog', 'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'termios',
+			'test', 'textwrap', 'thread', 'threading', 'time', 'timeit', 'Tix', 'Tkinter', 'token',
+			'tokenize', 'traceback', 'tty', 'turtle', 'types', 'unicodedata', 'unittest', 'urllib2',
+			'urllib', 'urlparse', 'user', 'UserDict', 'UserList', 'UserString', 'uu', 'warnings',
+			'wave', 'weakref', 'webbrowser', 'whichdb', 'whrandom', 'winsound', 'xdrlib', 'xml',
+			'xmllib', 'xmlrpclib', 'zipfile', 'zipimport', 'zlib'
+
+		]
+		/*
+		** Set 4: special methods
+		** http://python.org/doc/current/ref/specialnames.html
+		*/
+		,'special' : [
+			// Basic customization: http://python.org/doc/current/ref/customization.html
+			'__new__', '__init__', '__del__', '__repr__', '__str__', 
+			'__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__cmp__', '__rcmp__',
+			'__hash__', '__nonzero__', '__unicode__', '__dict__',
+			// Attribute access: http://python.org/doc/current/ref/attribute-access.html
+			'__setattr__', '__delattr__', '__getattr__', '__getattribute__', '__get__', '__set__',
+			'__delete__', '__slots__',
+			// Class creation, callable objects
+			'__metaclass__', '__call__', 
+			// Container types: http://python.org/doc/current/ref/sequence-types.html
+			'__len__', '__getitem__', '__setitem__', '__delitem__', '__iter__', '__contains__',
+			'__getslice__', '__setslice__', '__delslice__',
+			// Numeric types: http://python.org/doc/current/ref/numeric-types.html
+			'__abs__','__add__','__and__','__coerce__','__div__','__divmod__','__float__',
+			'__hex__','__iadd__','__isub__','__imod__','__idiv__','__ipow__','__iand__',
+			'__ior__','__ixor__', '__ilshift__','__irshift__','__invert__','__int__',
+			'__long__','__lshift__',
+			'__mod__','__mul__','__neg__','__oct__','__or__','__pos__','__pow__',
+			'__radd__','__rdiv__','__rdivmod__','__rmod__','__rpow__','__rlshift__','__rrshift__',
+			'__rshift__','__rsub__','__rmul__','__repr__','__rand__','__rxor__','__ror__',
+			'__sub__','__xor__'
+		]
+	}
+	,'OPERATORS' :[
+		'+', '-', '/', '*', '=', '<', '>', '%', '!', '&', ';', '?', '`', ':', ','
+	]
+	,'DELIMITERS' :[
+		'(', ')', '[', ']', '{', '}'
+	]
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #660066;'
+		,'KEYWORDS' : {
+			'reserved' : 'color: #0000FF;'
+			,'builtins' : 'color: #009900;'
+			,'stdlib' : 'color: #009900;'
+			,'special': 'color: #006666;'
+			}
+		,'OPERATORS' : 'color: #993300;'
+		,'DELIMITERS' : 'color: #993300;'
+				
+	}
+};

+ 52 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/vb.js

@@ -0,0 +1,52 @@
+editAreaLoader.load_syntax["vb"] = {
+	'COMMENT_SINGLE' : {1 : "'"}
+	,'COMMENT_MULTI' : { }
+	,'QUOTEMARKS' : {1: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : false
+	,'KEYWORDS' : {
+		'statements' : [
+	        'if','then','for','each','while','do','loop',
+            'else','elseif','select','case','end select',
+            'until','next','step','to','in','end if'
+		]
+		,'keywords' : [
+            'empty','isempty','nothing','null','isnull','true','false',
+            'set','call',
+            'sub','end sub','function','end function','exit','exit function',
+            'dim','Mod','In','private','public','shared','const'
+        ]
+
+		,'functions' : [
+			'CDate','Date','DateAdd','DateDiff','DatePart','DateSerial','DateValue','Day','FormatDateTime',
+            'Hour','IsDate','Minute','Month',
+            'MonthName','Now','Second','Time','Timer','TimeSerial','TimeValue','Weekday','WeekdayName ','Year',
+            'Asc','CBool','CByte','CCur','CDate','CDbl','Chr','CInt','CLng','CSng','CStr','Hex','Oct','FormatCurrency',
+            'FormatDateTime','FormatNumber','FormatPercent','Abs','Atn','Cos','Exp','Hex','Int','Fix','Log','Oct',
+            'Rnd','Sgn','Sin','Sqr','Tan',
+            'Array','Filter','IsArray','Join','LBound','Split','UBound',
+            'InStr','InStrRev','LCase','Left','Len','LTrim','RTrim','Trim','Mid','Replace','Right','Space','StrComp',
+            'String','StrReverse','UCase',
+            'CreateObject','Eval','GetLocale','GetObject','GetRef','InputBox','IsEmpty','IsNull','IsNumeric',
+            'IsObject','LoadPicture','MsgBox','RGB','Round','ScriptEngine','ScriptEngineBuildVersion','ScriptEngineMajorVersion',
+            'ScriptEngineMinorVersion','SetLocale','TypeName','VarType'
+		]
+	}
+	,'OPERATORS' :[
+		'+', '-', '/', '*', '=', '<', '>', '!', '&'
+	]
+	,'DELIMITERS' :[
+		'(', ')', '[', ']', '{', '}'
+	]
+	,'STYLES' : {
+		'COMMENTS': 'color: #99CC00;'
+		,'QUOTESMARKS': 'color: #333399;'
+		,'KEYWORDS' : {
+			'keywords' : 'color: #3366FF;'
+			,'functions' : 'color: #0000FF;'
+			,'statements' : 'color: #3366FF;'
+			}
+		,'OPERATORS' : 'color: #FF0000;'
+		,'DELIMITERS' : 'color: #0000FF;'
+
+	}
+};

+ 56 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/edit_area/reg_syntax/xml.js

@@ -0,0 +1,56 @@
+/*
+* last update: 2006-08-24
+*/
+
+editAreaLoader.load_syntax["xml"] = {
+	'COMMENT_SINGLE' : {}
+	,'COMMENT_MULTI' : {'<!--' : '-->'}
+	,'QUOTEMARKS' : {1: "'", 2: '"'}
+	,'KEYWORD_CASE_SENSITIVE' : false
+	,'KEYWORDS' : {
+	}
+	,'OPERATORS' :[
+	]
+	,'DELIMITERS' :[
+	]
+	,'REGEXPS' : {
+		'xml' : {
+			'search' : '()(<\\?[^>]*?\\?>)()'
+			,'class' : 'xml'
+			,'modifiers' : 'g'
+			,'execute' : 'before' // before or after
+		}
+		,'cdatas' : {
+			'search' : '()(<!\\[CDATA\\[.*?\\]\\]>)()'
+			,'class' : 'cdata'
+			,'modifiers' : 'g'
+			,'execute' : 'before' // before or after
+		}
+		,'tags' : {
+			'search' : '(<)(/?[a-z][^ \r\n\t>]*)([^>]*>)'
+			,'class' : 'tags'
+			,'modifiers' : 'gi'
+			,'execute' : 'before' // before or after
+		}
+		,'attributes' : {
+			'search' : '( |\n|\r|\t)([^ \r\n\t=]+)(=)'
+			,'class' : 'attributes'
+			,'modifiers' : 'g'
+			,'execute' : 'before' // before or after
+		}
+	}
+	,'STYLES' : {
+		'COMMENTS': 'color: #AAAAAA;'
+		,'QUOTESMARKS': 'color: #6381F8;'
+		,'KEYWORDS' : {
+			}
+		,'OPERATORS' : 'color: #E775F0;'
+		,'DELIMITERS' : ''
+		,'REGEXPS' : {
+			'attributes': 'color: #B1AC41;'
+			,'tags': 'color: #E62253;'
+			,'xml': 'color: #8DCFB5;'
+			,'cdata': 'color: #50B020;'
+		}	
+	}		
+};

+ 27 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/for_fckeditor.js

@@ -0,0 +1,27 @@
+//function below added by logan (cailongqun [at] yahoo [dot] com [dot] cn) from www.phpletter.com
+function selectFile()
+{
+	var selectedFileRowNum = $('#selectedFileRowNum').val();
+  if(selectedFileRowNum != '' && $('#row' + selectedFileRowNum))
+  {
+
+	  // insert information now
+	  var url = $('#fileUrl'+selectedFileRowNum).val();  	
+		window.opener.SetUrl( url ) ;
+		window.close() ;
+		
+  }else
+  {
+  	alert(noFileSelected);
+  }
+  
+
+}
+
+
+
+function cancelSelectFile()
+{
+  // close popup window
+  window.close() ;
+}

+ 16 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/for_form.js

@@ -0,0 +1,16 @@
+function selectFile(url)
+{
+      window.opener.document.getElementById(elementId).value = url;
+      window.close() ;
+ 
+
+}
+
+
+
+function cancelSelectFile()
+{
+  // close popup window
+  window.close() ;
+}
+

+ 5 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/for_stand_alone.js

@@ -0,0 +1,5 @@
+function cancelSelectFile()
+{
+    // close popup window
+    window.close();
+}

+ 248 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/for_tinymce.js

@@ -0,0 +1,248 @@
+// Some global instances
+var tinymce = null, tinyMCEPopup, tinyMCE;
+
+tinyMCEPopup = {
+	init : function() {
+		var t = this, w = t.getWin(), ti;
+
+		// Find API
+		tinymce = w.tinymce;
+		tinyMCE = w.tinyMCE;
+		t.editor = tinymce.EditorManager.activeEditor;
+		t.params = t.editor.windowManager.params;
+
+		// Setup local DOM
+		t.dom = t.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document);
+		t.dom.loadCSS(t.editor.settings.popup_css);
+
+		// Setup on init listeners
+		t.listeners = [];
+		t.onInit = {
+			add : function(f, s) {
+				t.listeners.push({func : f, scope : s});
+			}
+		};
+
+		t.isWindow = !t.getWindowArg('mce_inline');
+		t.id = t.getWindowArg('mce_window_id');
+		t.editor.windowManager.onOpen.dispatch(t.editor.windowManager, window);
+	},
+
+	getWin : function() {
+		return window.dialogArguments || opener || parent || top;
+	},
+
+	getWindowArg : function(n, dv) {
+		var v = this.params[n];
+
+		return tinymce.is(v) ? v : dv;
+	},
+
+	getParam : function(n, dv) {
+		return this.editor.getParam(n, dv);
+	},
+
+	getLang : function(n, dv) {
+		return this.editor.getLang(n, dv);
+	},
+
+	execCommand : function(cmd, ui, val) {
+		this.restoreSelection();
+		return this.editor.execCommand(cmd, ui, val);
+	},
+
+	resizeToInnerSize : function() {
+		var t = this, n, b = document.body, vp = t.dom.getViewPort(window), dw, dh;
+
+		dw = t.getWindowArg('mce_width') - vp.w;
+		dh = t.getWindowArg('mce_height') - vp.h;
+
+		if (t.isWindow)
+			window.resizeBy(dw, dh);
+		else
+			t.editor.windowManager.resizeBy(dw, dh, t.id);
+	},
+
+	executeOnLoad : function(s) {
+		this.onInit.add(function() {
+			eval(s);
+		});
+	},
+
+	storeSelection : function() {
+		this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark('simple');
+	},
+
+	restoreSelection : function() {
+		var t = tinyMCEPopup;
+
+		if (!t.isWindow && tinymce.isIE)
+			t.editor.selection.moveToBookmark(t.editor.windowManager.bookmark);
+	},
+
+	requireLangPack : function() {
+		var u = this.getWindowArg('plugin_url') || this.getWindowArg('theme_url');
+
+		if (u)
+			document.write('<script type="text/javascript" src="' + u + '/langs/' + this.editor.settings.language + '_dlg.js' + '"></script>');
+	},
+
+	pickColor : function(e, element_id) {
+		this.execCommand('mceColorPicker', true, {
+			color : document.getElementById(element_id).value,
+			func : function(c) {
+				document.getElementById(element_id).value = c;
+
+				if (tinymce.is(document.getElementById(element_id).onchange, 'function'))
+					document.getElementById(element_id).onchange();
+			}
+		});
+	},
+
+	openBrowser : function(element_id, type, option) {
+		tinyMCEPopup.restoreSelection();
+		this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window);
+	},
+
+	close : function() {
+		var t = this;
+
+		t.dom = t.dom.doc = null; // Cleanup
+		t.editor.windowManager.close(window, t.id);
+	},
+
+	// Internal functions	
+
+	_restoreSelection : function() {
+		var e = window.event.srcElement;
+
+		if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button'))
+			tinyMCEPopup.restoreSelection();
+	},
+
+/*	_restoreSelection : function() {
+		var e = window.event.srcElement;
+
+		// If user focus a non text input or textarea
+		if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text')
+			tinyMCEPopup.restoreSelection();
+	},*/
+
+	_onDOMLoaded : function() {
+		var t = this, ti = document.title, bm, h;
+
+		// Translate page
+		h = document.body.innerHTML;
+
+		// Replace a=x with a="x" in IE
+		if (tinymce.isIE)
+			h = h.replace(/ (value|title|alt)=([^\s>]+)/gi, ' $1="$2"');
+
+		document.body.innerHTML = t.editor.translate(h);
+		document.title = ti = t.editor.translate(ti);
+		document.body.style.display = '';
+
+		// Restore selection in IE when focus is placed on a non textarea or input element of the type text
+		if (tinymce.isIE)
+			document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection);
+
+		t.restoreSelection();
+
+		// Call onInit
+		tinymce.each(t.listeners, function(o) {
+			o.func.call(o.scope, t.editor);
+		});
+
+		t.resizeToInnerSize();
+
+		if (t.isWindow)
+			window.focus();
+		else
+			t.editor.windowManager.setTitle(ti, t.id);
+
+		if (!tinymce.isIE && !t.isWindow) {
+			tinymce.dom.Event._add(document, 'focus', function() {
+				t.editor.windowManager.focus(t.id)
+			});
+		}
+
+		// Patch for accessibility
+		tinymce.each(t.dom.select('select'), function(e) {
+			e.onkeydown = tinyMCEPopup._accessHandler;
+		});
+
+		// Move focus to window
+		window.focus();
+	},
+
+	_accessHandler : function(e) {
+		var e = e || window.event;
+
+		if (e.keyCode == 13 || e.keyCode == 32) {
+			e = e.target || e.srcElement;
+
+			if (e.onchange)
+				e.onchange();
+
+			return tinymce.dom.Event.cancel(e);
+		}
+	},
+
+	_wait : function() {
+		var t = this, ti;
+
+		if (tinymce.isIE && document.location.protocol != 'https:') {
+			// Fake DOMContentLoaded on IE
+			document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');
+			document.getElementById("__ie_onload").onreadystatechange = function() {
+				if (this.readyState == "complete") {
+					t._onDOMLoaded();
+					document.getElementById("__ie_onload").onreadystatechange = null; // Prevent leak
+				}
+			};
+		} else {
+			if (tinymce.isIE || tinymce.isWebKit) {
+				ti = setInterval(function() {
+					if (/loaded|complete/.test(document.readyState)) {
+						clearInterval(ti);
+						t._onDOMLoaded();
+					}
+				}, 10);
+			} else {
+				window.addEventListener('DOMContentLoaded', function() {
+					t._onDOMLoaded();
+				}, false);
+			}
+		}
+	}
+};
+
+tinyMCEPopup.init();
+//tinyMCEPopup._wait(); // Wait for DOM Content Loaded
+
+//tinyMCEPopup.requireLangPack();
+
+function selectFile(url)
+{
+	if(typeof(url) != 'undefined')
+	{
+		
+	}
+	
+	if(url != '')
+	{
+		var win = tinyMCEPopup.getWindowArg("window");
+        win.document.getElementById(tinyMCEPopup.getWindowArg("input")).value = url;
+        //for image browsers
+        try { win.ImageDialog.showPreviewImage(url); }
+        catch (e) { void(e); }
+        tinyMCEPopup.close();   		
+	}
+    
+}
+
+function cancelSelectFile()
+{
+    // close popup window
+    tinyMCEPopup.close();
+}

+ 807 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/form.js

@@ -0,0 +1,807 @@
+/*
+ * jQuery form plugin
+ * @requires jQuery v1.1 or later
+ *
+ * Examples at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id$
+ * Version: 1.0.3
+ */
+ (function($) {
+/**
+ * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
+ *
+ * ajaxSubmit accepts a single argument which can be either a success callback function
+ * or an options Object.  If a function is provided it will be invoked upon successful
+ * completion of the submit and will be passed the response from the server.
+ * If an options Object is provided, the following attributes are supported:
+ *
+ *  target:   Identifies the element(s) in the page to be updated with the server response.
+ *            This value may be specified as a jQuery selection string, a jQuery object,
+ *            or a DOM element.
+ *            default value: null
+ *
+ *  url:      URL to which the form data will be submitted.
+ *            default value: value of form's 'action' attribute
+ *
+ *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
+ *            default value: value of form's 'method' attribute (or 'GET' if none found)
+ *
+ *  beforeSubmit:  Callback method to be invoked before the form is submitted.
+ *            default value: null
+ *
+ *  success:  Callback method to be invoked after the form has been successfully submitted
+ *            and the response has been returned from the server
+ *            default value: null
+ *
+ *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
+ *            default value: null
+ *
+ *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
+ *            default value: false
+ *
+ *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
+ *
+ *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
+ *
+ *
+ * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
+ * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
+ * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
+ * in array format, the jQuery object, and the options object passed into ajaxSubmit.
+ * The form data array takes the following form:
+ *
+ *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * If a 'success' callback method is provided it is invoked after the response has been returned
+ * from the server.  It is passed the responseText or responseXML value (depending on dataType).
+ * See jQuery.ajax for further details.
+ *
+ *
+ * The dataType option provides a means for specifying how the server response should be handled.
+ * This maps directly to the jQuery.httpData method.  The following values are supported:
+ *
+ *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'success'
+ *                   callback method, if specified, will be passed the responseXML value
+ *      'json':   if dataType == 'json' the server response will be evaluted and passed to
+ *                   the 'success' callback, if specified
+ *      'script': if dataType == 'script' the server response is evaluated in the global context
+ *
+ *
+ * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
+ * are provided the target will be ignored.
+ *
+ * The semantic argument can be used to force form serialization in semantic order.
+ * This is normally true anyway, unless the form contains input elements of type='image'.
+ * If your form must be submitted with name/value pairs in semantic order and your form
+ * contains an input of type='image" then pass true for this arg, otherwise pass false
+ * (or nothing) to avoid the overhead for this logic.
+ *
+ *
+ * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
+ *
+ * $("#form-id").submit(function() {
+ *     $(this).ajaxSubmit(options);
+ *     return false; // cancel conventional submit
+ * });
+ *
+ * When using ajaxForm(), however, this is done for you.
+ *
+ * @example
+ * $('#myForm').ajaxSubmit(function(data) {
+ *     alert('Form submit succeeded! Server returned: ' + data);
+ * });
+ * @desc Submit form and alert server response
+ *
+ *
+ * @example
+ * var options = {
+ *     target: '#myTargetDiv'
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Submit form and update page element with server response
+ *
+ *
+ * @example
+ * var options = {
+ *     success: function(responseText) {
+ *         alert(responseText);
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Submit form and alert the server response
+ *
+ *
+ * @example
+ * var options = {
+ *     beforeSubmit: function(formArray, jqForm) {
+ *         if (formArray.length == 0) {
+ *             alert('Please enter data.');
+ *             return false;
+ *         }
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Pre-submit validation which aborts the submit operation if form data is empty
+ *
+ *
+ * @example
+ * var options = {
+ *     url: myJsonUrl.php,
+ *     dataType: 'json',
+ *     success: function(data) {
+ *        // 'data' is an object representing the the evaluated json data
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc json data returned and evaluated
+ *
+ *
+ * @example
+ * var options = {
+ *     url: myXmlUrl.php,
+ *     dataType: 'xml',
+ *     success: function(responseXML) {
+ *        // responseXML is XML document object
+ *        var data = $('myElement', responseXML).text();
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc XML data returned from server
+ *
+ *
+ * @example
+ * var options = {
+ *     resetForm: true
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc submit form and reset it if successful
+ *
+ * @example
+ * $('#myForm).submit(function() {
+ *    $(this).ajaxSubmit();
+ *    return false;
+ * });
+ * @desc Bind form's submit event to use ajaxSubmit
+ *
+ *
+ * @name ajaxSubmit
+ * @type jQuery
+ * @param options  object literal containing options which control the form submission process
+ * @cat Plugins/Form
+ * @return jQuery
+ */
+$.fn.ajaxSubmit = function(options) {
+    if (typeof options == 'function')
+        options = { success: options };
+
+    options = $.extend({
+        url:  this.attr('action') || window.location,
+        type: this.attr('method') || 'GET'
+    }, options || {});
+
+    var a = this.formToArray(options.semantic);
+
+    // give pre-submit callback an opportunity to abort the submit
+    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
+
+    // fire vetoable 'validate' event
+    var veto = {};
+    $.event.trigger('form.submit.validate', [a, this, options, veto]);
+    if (veto.veto)
+        return this;
+
+    var q = $.param(a);//.replace(/%20/g,'+');
+
+    if (options.type.toUpperCase() == 'GET') {
+        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+        options.data = null;  // data is null for 'get'
+    }
+    else
+        options.data = q; // data is the query string for 'post'
+
+    var $form = this, callbacks = [];
+    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
+    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
+
+    // perform a load on the target only if dataType is not provided
+    if (!options.dataType && options.target) {
+        var oldSuccess = options.success;// || function(){};
+        callbacks.push(function(data) {
+            $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments);
+        });
+    }
+    else if (options.success)
+        callbacks.push(options.success);
+
+    options.success = function(data, status) {
+        for (var i=0, max=callbacks.length; i < max; i++)
+            callbacks[i](data, status, $form);
+    };
+
+    // are there files to upload?
+    var files = $('input:file', this).fieldValue();
+    var found = false;
+    for (var j=0; j < files.length; j++)
+        if (files[j]) 
+            found = true;
+
+    if (options.iframe || found) // options.iframe allows user to force iframe mode
+        fileUpload();
+    else
+        $.ajax(options);
+
+    // fire 'notify' event
+    $.event.trigger('form.submit.notify', [this, options]);
+    return this;
+
+
+    // private function for handling file uploads (hat tip to YAHOO!)
+    function fileUpload() {
+        var form = $form[0];
+        var opts = $.extend({}, $.ajaxSettings, options);
+        
+        var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
+        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
+        var io = $io[0];
+        var op8 = $.browser.opera && window.opera.version() < 9;
+        if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
+        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+
+        var xhr = { // mock object
+            responseText: null,
+            responseXML: null,
+            status: 0,
+            statusText: 'n/a',
+            getAllResponseHeaders: function() {},
+            getResponseHeader: function() {},
+            setRequestHeader: function() {}
+        };
+        
+        var g = opts.global;
+        // trigger ajax global events so that activity/block indicators work like normal
+        if (g && ! $.active++) $.event.trigger("ajaxStart");
+        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
+        
+        var cbInvoked = 0;
+        var timedOut = 0;
+        
+        // take a breath so that pending repaints get some cpu time before the upload starts
+        setTimeout(function() {
+            $io.appendTo('body');
+            // jQuery's event binding doesn't work for iframe events in IE
+            io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+            
+            // make sure form attrs are set
+            var encAttr = form.encoding ? 'encoding' : 'enctype';
+            var t = $form.attr('target');
+            $form.attr({
+                target:   id,
+                method:  'POST',
+                encAttr: 'multipart/form-data',
+                action:   opts.url
+            });
+
+            // support timout
+            if (opts.timeout)
+                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
+
+            form.submit();
+            $form.attr('target', t); // reset target
+        }, 10);
+        
+        function cb() {
+            if (cbInvoked++) return;
+            
+            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
+
+            var ok = true;
+            try {
+                if (timedOut) throw 'timeout';
+                // extract the server response from the iframe
+                var data, doc;
+                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+                xhr.responseText = doc.body ? doc.body.innerHTML : null;
+                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+                
+                if (opts.dataType == 'json' || opts.dataType == 'script') {
+                    var ta = doc.getElementsByTagName('textarea')[0];
+                    data = ta ? ta.value : xhr.responseText;
+                    if (opts.dataType == 'json')
+                        eval("data = " + data);
+                    else
+                        $.globalEval(data);
+                }
+                else if (opts.dataType == 'xml') {
+                    data = xhr.responseXML;
+                    if (!data && xhr.responseText != null)
+                        data = toXml(xhr.responseText);
+                }
+                else {
+                    data = xhr.responseText;
+                }
+            }
+            catch(e){
+                ok = false;
+                $.handleError(opts, xhr, 'error', e);
+            }
+
+            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+            if (ok) {
+                opts.success(data, 'success');
+                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
+            }
+            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
+            if (g && ! --$.active) $.event.trigger("ajaxStop");
+            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
+
+            // clean up
+            setTimeout(function() { 
+                $io.remove(); 
+                xhr.responseXML = null;
+            }, 100);
+        };
+        
+        function toXml(s, doc) {
+            if (window.ActiveXObject) {
+                doc = new ActiveXObject('Microsoft.XMLDOM');
+                doc.async = 'false';
+                doc.loadXML(s);
+            }
+            else
+                doc = (new DOMParser()).parseFromString(s, 'text/xml');
+            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
+        };
+    };
+};
+$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for <input type="image" /> elements (if the element
+ *    is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ *    used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * Note that for accurate x/y coordinates of image submit elements in all browsers
+ * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.  See ajaxSubmit for a full description of the options argument.
+ *
+ *
+ * @example
+ * var options = {
+ *     target: '#myTargetDiv'
+ * };
+ * $('#myForm').ajaxSForm(options);
+ * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
+ *       when the form is submitted.
+ *
+ *
+ * @example
+ * var options = {
+ *     success: function(responseText) {
+ *         alert(responseText);
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Bind form's submit event so that server response is alerted after the form is submitted.
+ *
+ *
+ * @example
+ * var options = {
+ *     beforeSubmit: function(formArray, jqForm) {
+ *         if (formArray.length == 0) {
+ *             alert('Please enter data.');
+ *             return false;
+ *         }
+ *     }
+ * };
+ * $('#myForm').ajaxSubmit(options);
+ * @desc Bind form's submit event so that pre-submit callback is invoked before the form
+ *       is submitted.
+ *
+ *
+ * @name   ajaxForm
+ * @param  options  object literal containing options which control the form submission process
+ * @return jQuery
+ * @cat    Plugins/Form
+ * @type   jQuery
+ */
+$.fn.ajaxForm = function(options) {
+    return this.ajaxFormUnbind().submit(submitHandler).each(function() {
+        // store options in hash
+        this.formPluginId = $.fn.ajaxForm.counter++;
+        $.fn.ajaxForm.optionHash[this.formPluginId] = options;
+        $(":submit,input:image", this).click(clickHandler);
+    });
+};
+
+$.fn.ajaxForm.counter = 1;
+$.fn.ajaxForm.optionHash = {};
+
+function clickHandler(e) {
+    var $form = this.form;
+    $form.clk = this;
+    if (this.type == 'image') {
+        if (e.offsetX != undefined) {
+            $form.clk_x = e.offsetX;
+            $form.clk_y = e.offsetY;
+        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+            var offset = $(this).offset();
+            $form.clk_x = e.pageX - offset.left;
+            $form.clk_y = e.pageY - offset.top;
+        } else {
+            $form.clk_x = e.pageX - this.offsetLeft;
+            $form.clk_y = e.pageY - this.offsetTop;
+        }
+    }
+    // clear form vars
+    setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
+};
+
+function submitHandler() {
+    // retrieve options from hash
+    var id = this.formPluginId;
+    var options = $.fn.ajaxForm.optionHash[id];
+    $(this).ajaxSubmit(options);
+    return false;
+};
+
+/**
+ * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+ *
+ * @name   ajaxFormUnbind
+ * @return jQuery
+ * @cat    Plugins/Form
+ * @type   jQuery
+ */
+$.fn.ajaxFormUnbind = function() {
+    this.unbind('submit', submitHandler);
+    return this.each(function() {
+        $(":submit,input:image", this).unbind('click', clickHandler);
+    });
+
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property.  An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ *
+ * The semantic argument can be used to force form serialization in semantic order.
+ * This is normally true anyway, unless the form contains input elements of type='image'.
+ * If your form must be submitted with name/value pairs in semantic order and your form
+ * contains an input of type='image" then pass true for this arg, otherwise pass false
+ * (or nothing) to avoid the overhead for this logic.
+ *
+ * @example var data = $("#myForm").formToArray();
+ * $.post( "myscript.cgi", data );
+ * @desc Collect all the data from a form and submit it to the server.
+ *
+ * @name formToArray
+ * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
+ * @type Array<Object>
+ * @cat Plugins/Form
+ */
+$.fn.formToArray = function(semantic) {
+    var a = [];
+    if (this.length == 0) return a;
+
+    var form = this[0];
+    var els = semantic ? form.getElementsByTagName('*') : form.elements;
+    if (!els) return a;
+    for(var i=0, max=els.length; i < max; i++) {
+        var el = els[i];
+        var n = el.name;
+        if (!n) continue;
+
+        if (semantic && form.clk && el.type == "image") {
+            // handle image inputs on the fly when semantic == true
+            if(!el.disabled && form.clk == el)
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+            continue;
+        }
+
+        var v = $.fieldValue(el, true);
+        if (v && v.constructor == Array) {
+            for(var j=0, jmax=v.length; j < jmax; j++)
+                a.push({name: n, value: v[j]});
+        }
+        else if (v !== null && typeof v != 'undefined')
+            a.push({name: n, value: v});
+    }
+
+    if (!semantic && form.clk) {
+        // input type=='image' are not found in elements array! handle them here
+        var inputs = form.getElementsByTagName("input");
+        for(var i=0, max=inputs.length; i < max; i++) {
+            var input = inputs[i];
+            var n = input.name;
+            if(n && !input.disabled && input.type == "image" && form.clk == input)
+                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+        }
+    }
+    return a;
+};
+
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&amp;name2=value2
+ *
+ * The semantic argument can be used to force form serialization in semantic order.
+ * If your form must be submitted with name/value pairs in semantic order then pass
+ * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
+ * this logic (which can be significant for very large forms).
+ *
+ * @example var data = $("#myForm").formSerialize();
+ * $.ajax('POST', "myscript.cgi", data);
+ * @desc Collect all the data from a form into a single string
+ *
+ * @name formSerialize
+ * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
+ * @type String
+ * @cat Plugins/Form
+ */
+$.fn.formSerialize = function(semantic) {
+    //hand off to jQuery.param for proper encoding
+    return $.param(this.formToArray(semantic));
+};
+
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&amp;name2=value2
+ *
+ * The successful argument controls whether or not serialization is limited to
+ * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.
+ *
+ * @example var data = $("input").formSerialize();
+ * @desc Collect the data from all successful input elements into a query string
+ *
+ * @example var data = $(":radio").formSerialize();
+ * @desc Collect the data from all successful radio input elements into a query string
+ *
+ * @example var data = $("#myForm :checkbox").formSerialize();
+ * @desc Collect the data from all successful checkbox input elements in myForm into a query string
+ *
+ * @example var data = $("#myForm :checkbox").formSerialize(false);
+ * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
+ *
+ * @example var data = $(":input").formSerialize();
+ * @desc Collect the data from all successful input, select, textarea and button elements into a query string
+ *
+ * @name fieldSerialize
+ * @param successful true if only successful controls should be serialized (default is true)
+ * @type String
+ * @cat Plugins/Form
+ */
+$.fn.fieldSerialize = function(successful) {
+    var a = [];
+    this.each(function() {
+        var n = this.name;
+        if (!n) return;
+        var v = $.fieldValue(this, successful);
+        if (v && v.constructor == Array) {
+            for (var i=0,max=v.length; i < max; i++)
+                a.push({name: n, value: v[i]});
+        }
+        else if (v !== null && typeof v != 'undefined')
+            a.push({name: this.name, value: v});
+    });
+    //hand off to jQuery.param for proper encoding
+    return $.param(a);
+};
+
+
+/**
+ * Returns the value(s) of the element in the matched set.  For example, consider the following form:
+ *
+ *  <form><fieldset>
+ *      <input name="A" type="text" />
+ *      <input name="A" type="text" />
+ *      <input name="B" type="checkbox" value="B1" />
+ *      <input name="B" type="checkbox" value="B2"/>
+ *      <input name="C" type="radio" value="C1" />
+ *      <input name="C" type="radio" value="C2" />
+ *  </fieldset></form>
+ *
+ *  var v = $(':text').fieldValue();
+ *  // if no values are entered into the text inputs
+ *  v == ['','']
+ *  // if values entered into the text inputs are 'foo' and 'bar'
+ *  v == ['foo','bar']
+ *
+ *  var v = $(':checkbox').fieldValue();
+ *  // if neither checkbox is checked
+ *  v === undefined
+ *  // if both checkboxes are checked
+ *  v == ['B1', 'B2']
+ *
+ *  var v = $(':radio').fieldValue();
+ *  // if neither radio is checked
+ *  v === undefined
+ *  // if first radio is checked
+ *  v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array.  If no valid value can be determined the
+ *       array will be empty, otherwise it will contain one or more values.
+ *
+ * @example var data = $("#myPasswordElement").fieldValue();
+ * alert(data[0]);
+ * @desc Alerts the current value of the myPasswordElement element
+ *
+ * @example var data = $("#myForm :input").fieldValue();
+ * @desc Get the value(s) of the form elements in myForm
+ *
+ * @example var data = $("#myForm :checkbox").fieldValue();
+ * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
+ *
+ * @example var data = $("#mySingleSelect").fieldValue();
+ * @desc Get the value(s) of the select control
+ *
+ * @example var data = $(':text').fieldValue();
+ * @desc Get the value(s) of the text input or textarea elements
+ *
+ * @example var data = $("#myMultiSelect").fieldValue();
+ * @desc Get the values for the select-multiple control
+ *
+ * @name fieldValue
+ * @param Boolean successful true if only the values for successful controls should be returned (default is true)
+ * @type Array<String>
+ * @cat Plugins/Form
+ */
+$.fn.fieldValue = function(successful) {
+    for (var val=[], i=0, max=this.length; i < max; i++) {
+        var el = this[i];
+        var v = $.fieldValue(el, successful);
+        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
+            continue;
+        v.constructor == Array ? $.merge(val, v) : val.push(v);
+    }
+    return val;
+};
+
+/**
+ * Returns the value of the field element.
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true.  If the given element is not
+ * successful and the successful arg is not false then the returned value will be null.
+ *
+ * Note: If the successful flag is true (default) but the element is not successful, the return will be null
+ * Note: The value returned for a successful select-multiple element will always be an array.
+ * Note: If the element has no value the return value will be undefined.
+ *
+ * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
+ * @desc Gets the current value of the myPasswordElement element
+ *
+ * @name fieldValue
+ * @param Element el The DOM element for which the value will be returned
+ * @param Boolean successful true if value returned must be for a successful controls (default is true)
+ * @type String or Array<String> or null or undefined
+ * @cat Plugins/Form
+ */
+$.fieldValue = function(el, successful) {
+    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+    if (typeof successful == 'undefined') successful = true;
+
+    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+        (t == 'checkbox' || t == 'radio') && !el.checked ||
+        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+        tag == 'select' && el.selectedIndex == -1))
+            return null;
+
+    if (tag == 'select') {
+        var index = el.selectedIndex;
+        if (index < 0) return null;
+        var a = [], ops = el.options;
+        var one = (t == 'select-one');
+        var max = (one ? index+1 : ops.length);
+        for(var i=(one ? index : 0); i < max; i++) {
+            var op = ops[i];
+            if (op.selected) {
+                // extra pain for IE...
+                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
+                if (one) return v;
+                a.push(v);
+            }
+        }
+        return a;
+    }
+    return el.value;
+};
+
+
+/**
+ * Clears the form data.  Takes the following actions on the form's input fields:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ *
+ * @example $('form').clearForm();
+ * @desc Clears all forms on the page.
+ *
+ * @name clearForm
+ * @type jQuery
+ * @cat Plugins/Form
+ */
+$.fn.clearForm = function() {
+    return this.each(function() {
+        $('input,select,textarea', this).clearFields();
+    });
+};
+
+/**
+ * Clears the selected form elements.  Takes the following actions on the matched elements:
+ *  - input text fields will have their 'value' property set to the empty string
+ *  - select elements will have their 'selectedIndex' property set to -1
+ *  - checkbox and radio inputs will have their 'checked' property set to false
+ *  - inputs of type submit, button, reset, and hidden will *not* be effected
+ *  - button elements will *not* be effected
+ *
+ * @example $('.myInputs').clearFields();
+ * @desc Clears all inputs with class myInputs
+ *
+ * @name clearFields
+ * @type jQuery
+ * @cat Plugins/Form
+ */
+$.fn.clearFields = $.fn.clearInputs = function() {
+    return this.each(function() {
+        var t = this.type, tag = this.tagName.toLowerCase();
+        if (t == 'text' || t == 'password' || tag == 'textarea')
+            this.value = '';
+        else if (t == 'checkbox' || t == 'radio')
+            this.checked = false;
+        else if (tag == 'select')
+            this.selectedIndex = -1;
+    });
+};
+
+
+/**
+ * Resets the form data.  Causes all form elements to be reset to their original value.
+ *
+ * @example $('form').resetForm();
+ * @desc Resets all forms on the page.
+ *
+ * @name resetForm
+ * @type jQuery
+ * @cat Plugins/Form
+ */
+$.fn.resetForm = function() {
+    return this.each(function() {
+        // guard against an input with the name of 'reset'
+        // note that IE reports the reset function as an 'object'
+        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
+            this.reset();
+    });
+};
+
+})(jQuery);

+ 764 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/interface.js

@@ -0,0 +1,764 @@
+
+jQuery.iUtil = {
+	getPosition : function(e)
+	{
+		var x = 0;
+		var y = 0;
+		var es = e.style;
+		var restoreStyles = false;
+		if (jQuery(e).css('display') == 'none') {
+			var oldVisibility = es.visibility;
+			var oldPosition = es.position;
+			restoreStyles = true;
+			es.visibility = 'hidden';
+			es.display = 'block';
+			es.position = 'absolute';
+		}
+		var el = e;
+		while (el){
+			x += el.offsetLeft + (el.currentStyle && !jQuery.browser.opera ?parseInt(el.currentStyle.borderLeftWidth)||0:0);
+			y += el.offsetTop + (el.currentStyle && !jQuery.browser.opera ?parseInt(el.currentStyle.borderTopWidth)||0:0);
+			el = el.offsetParent;
+		}
+		el = e;
+		while (el && el.tagName  && el.tagName.toLowerCase() != 'body')
+		{
+			x -= el.scrollLeft||0;
+			y -= el.scrollTop||0;
+			el = el.parentNode;
+		}
+		if (restoreStyles == true) {
+			es.display = 'none';
+			es.position = oldPosition;
+			es.visibility = oldVisibility;
+		}
+		return {x:x, y:y};
+	},
+	getPositionLite : function(el)
+	{
+		var x = 0, y = 0;
+		while(el) {
+			x += el.offsetLeft || 0;
+			y += el.offsetTop || 0;
+			el = el.offsetParent;
+		}
+		return {x:x, y:y};
+	},
+	getSize : function(e)
+	{
+		var w = jQuery.css(e,'width');
+		var h = jQuery.css(e,'height');
+		var wb = 0;
+		var hb = 0;
+		var es = e.style;
+		if (jQuery(e).css('display') != 'none') {
+			wb = e.offsetWidth;
+			hb = e.offsetHeight;
+		} else {
+			var oldVisibility = es.visibility;
+			var oldPosition = es.position;
+			es.visibility = 'hidden';
+			es.display = 'block';
+			es.position = 'absolute';
+			wb = e.offsetWidth;
+			hb = e.offsetHeight;
+			es.display = 'none';
+			es.position = oldPosition;
+			es.visibility = oldVisibility;
+		}
+		return {w:w, h:h, wb:wb, hb:hb};
+	},
+	getSizeLite : function(el)
+	{
+		return {
+			wb:el.offsetWidth||0,
+			hb:el.offsetHeight||0
+		};
+	},
+	getClient : function(e)
+	{
+		var h, w, de;
+		if (e) {
+			w = e.clientWidth;
+			h = e.clientHeight;
+		} else {
+			de = document.documentElement;
+			w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
+			h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
+		}
+		return {w:w,h:h};
+	},
+	getScroll : function (e)
+	{
+		var t=0, l=0, w=0, h=0, iw=0, ih=0;
+		if (e && e.nodeName.toLowerCase() != 'body') {
+			t = e.scrollTop;
+			l = e.scrollLeft;
+			w = e.scrollWidth;
+			h = e.scrollHeight;
+			iw = 0;
+			ih = 0;
+		} else  {
+			if (document.documentElement) {
+				t = document.documentElement.scrollTop;
+				l = document.documentElement.scrollLeft;
+				w = document.documentElement.scrollWidth;
+				h = document.documentElement.scrollHeight;
+			} else if (document.body) {
+				t = document.body.scrollTop;
+				l = document.body.scrollLeft;
+				w = document.body.scrollWidth;
+				h = document.body.scrollHeight;
+			}
+			iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
+			ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
+		}
+		return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };
+	},
+	getMargins : function(e, toInteger)
+	{
+		var el = jQuery(e);
+		var t = el.css('marginTop') || '';
+		var r = el.css('marginRight') || '';
+		var b = el.css('marginBottom') || '';
+		var l = el.css('marginLeft') || '';
+		if (toInteger)
+			return {
+				t: parseInt(t)||0,
+				r: parseInt(r)||0,
+				b: parseInt(b)||0,
+				l: parseInt(l)
+			};
+		else
+			return {t: t, r: r,	b: b, l: l};
+	},
+	getPadding : function(e, toInteger)
+	{
+		var el = jQuery(e);
+		var t = el.css('paddingTop') || '';
+		var r = el.css('paddingRight') || '';
+		var b = el.css('paddingBottom') || '';
+		var l = el.css('paddingLeft') || '';
+		if (toInteger)
+			return {
+				t: parseInt(t)||0,
+				r: parseInt(r)||0,
+				b: parseInt(b)||0,
+				l: parseInt(l)
+			};
+		else
+			return {t: t, r: r,	b: b, l: l};
+	},
+	getBorder : function(e, toInteger)
+	{
+		var el = jQuery(e);
+		var t = el.css('borderTopWidth') || '';
+		var r = el.css('borderRightWidth') || '';
+		var b = el.css('borderBottomWidth') || '';
+		var l = el.css('borderLeftWidth') || '';
+		if (toInteger)
+			return {
+				t: parseInt(t)||0,
+				r: parseInt(r)||0,
+				b: parseInt(b)||0,
+				l: parseInt(l)||0
+			};
+		else
+			return {t: t, r: r,	b: b, l: l};
+	},
+	getPointer : function(event)
+	{
+		var x = event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)) || 0;
+		var y = event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)) || 0;
+		return {x:x, y:y};
+	},
+	traverseDOM : function(nodeEl, func)
+	{
+		func(nodeEl);
+		nodeEl = nodeEl.firstChild;
+		while(nodeEl){
+			jQuery.iUtil.traverseDOM(nodeEl, func);
+			nodeEl = nodeEl.nextSibling;
+		}
+	},
+	purgeEvents : function(nodeEl)
+	{
+		jQuery.iUtil.traverseDOM(
+			nodeEl,
+			function(el)
+			{
+				for(var attr in el){
+					if(typeof el[attr] === 'function') {
+						el[attr] = null;
+					}
+				}
+			}
+		);
+	},
+	centerEl : function(el, axis)
+	{
+		var clientScroll = jQuery.iUtil.getScroll();
+		var windowSize = jQuery.iUtil.getSize(el);
+		if (!axis || axis == 'vertically')
+			jQuery(el).css(
+				{
+					top: clientScroll.t + ((Math.max(clientScroll.h,clientScroll.ih) - clientScroll.t - windowSize.hb)/2) + 'px'
+				}
+			);
+		if (!axis || axis == 'horizontally')
+			jQuery(el).css(
+				{
+					left:	clientScroll.l + ((Math.max(clientScroll.w,clientScroll.iw) - clientScroll.l - windowSize.wb)/2) + 'px'
+				}
+			);
+	},
+	fixPNG : function (el, emptyGIF) {
+		var images = jQuery('img[@src*="png"]', el||document), png;
+		images.each( function() {
+			png = this.src;				
+			this.src = emptyGIF;
+			this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + png + "')";
+		});
+	}
+};
+
+// Helper function to support older browsers!
+[].indexOf || (Array.prototype.indexOf = function(v, n){
+	n = (n == null) ? 0 : n;
+	var m = this.length;
+	for (var i=n; i<m; i++)
+		if (this[i] == v)
+			return i;
+	return -1;
+});
+
+
+
+//iresizable show below
+/**
+ * Interface Elements for jQuery
+ * Resizable
+ *
+ * http://interface.eyecon.ro
+ *
+ * Copyright (c) 2006 Stefan Petre
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ *
+ */
+
+jQuery.iResize = {
+	resizeElement: null,
+	resizeDirection: null,
+	dragged: null,
+	pointer: null,
+	sizes: null,
+	position: null,
+	/**
+	 * internal: Start function
+	 */
+	startDrag: function(e) {
+		jQuery.iResize.dragged = (this.dragEl) ? this.dragEl: this;
+		jQuery.iResize.pointer = jQuery.iUtil.getPointer(e);
+
+		// Save original size
+		jQuery.iResize.sizes = {
+			width: parseInt(jQuery(jQuery.iResize.dragged).css('width')) || 0,
+			height: parseInt(jQuery(jQuery.iResize.dragged).css('height')) || 0
+		};
+
+		// Save original position
+		jQuery.iResize.position = {
+			top: parseInt(jQuery(jQuery.iResize.dragged).css('top')) || 0,
+			left: parseInt(jQuery(jQuery.iResize.dragged).css('left')) || 0
+		};
+
+		// Assign event handlers
+		jQuery(document)
+			.bind('mousemove', jQuery.iResize.moveDrag)
+			.bind('mouseup', jQuery.iResize.stopDrag);
+
+		// Callback?
+		if (typeof jQuery.iResize.dragged.resizeOptions.onDragStart === 'function') {
+			jQuery.iResize.dragged.resizeOptions.onDragStart.apply(jQuery.iResize.dragged);
+		}
+		return false;
+	},
+	/**
+	 * internal: Stop function
+	 */
+	stopDrag: function(e) {
+		// Unbind event handlers
+		jQuery(document)
+			.unbind('mousemove', jQuery.iResize.moveDrag)
+			.unbind('mouseup', jQuery.iResize.stopDrag);
+
+		// Callback?
+		if (typeof jQuery.iResize.dragged.resizeOptions.onDragStop === 'function') {
+			jQuery.iResize.dragged.resizeOptions.onDragStop.apply(jQuery.iResize.dragged);
+		}
+
+		// Remove dragged element
+		jQuery.iResize.dragged = null;
+	},
+	/**
+	 * internal: Move function
+	 */
+	moveDrag: function(e) {
+		if (!jQuery.iResize.dragged) {
+			return;
+		}
+
+		pointer = jQuery.iUtil.getPointer(e);
+
+		// Calculate new positions
+		newTop = jQuery.iResize.position.top - jQuery.iResize.pointer.y + pointer.y;
+		newLeft = jQuery.iResize.position.left - jQuery.iResize.pointer.x + pointer.x;
+		newTop = Math.max(
+						Math.min(newTop, jQuery.iResize.dragged.resizeOptions.maxBottom - jQuery.iResize.sizes.height),
+						jQuery.iResize.dragged.resizeOptions.minTop
+					);
+		newLeft = Math.max(
+						Math.min(newLeft, jQuery.iResize.dragged.resizeOptions.maxRight- jQuery.iResize.sizes.width),
+						jQuery.iResize.dragged.resizeOptions.minLeft
+					);
+
+		// Callback
+		if (typeof jQuery.iResize.dragged.resizeOptions.onDrag === 'function') {
+			var newPos = jQuery.iResize.dragged.resizeOptions.onDrag.apply(jQuery.iResize.dragged, [newLeft, newTop]);
+			if (typeof newPos == 'array' && newPos.length == 2) {
+				newLeft = newPos[0];
+				newTop = newPos[1];
+			}
+		}
+
+		// Update the element
+		jQuery.iResize.dragged.style.top = newTop + 'px';
+		jQuery.iResize.dragged.style.left = newLeft + 'px';
+
+		return false;
+	},
+	start: function(e) {
+		// Bind event handlers
+		jQuery(document)
+			.bind('mousemove', jQuery.iResize.move)
+			.bind('mouseup', jQuery.iResize.stop);
+
+		// Initialize resizable
+		jQuery.iResize.resizeElement = this.resizeElement;
+		jQuery.iResize.resizeDirection = this.resizeDirection;
+		jQuery.iResize.pointer = jQuery.iUtil.getPointer(e);
+		jQuery.iResize.sizes = {
+				width: parseInt(jQuery(this.resizeElement).css('width'))||0,
+				height: parseInt(jQuery(this.resizeElement).css('height'))||0
+			};
+		jQuery.iResize.position = {
+				top: parseInt(jQuery(this.resizeElement).css('top'))||0,
+				left: parseInt(jQuery(this.resizeElement).css('left'))||0
+			};
+
+		// Callback function
+		if (jQuery.iResize.resizeElement.resizeOptions.onStart) {
+			jQuery.iResize.resizeElement.resizeOptions.onStart.apply(jQuery.iResize.resizeElement, [this]);
+		}
+
+		return false;
+	},
+	stop: function() {
+		// Unbind event handlers
+		jQuery(document)
+			.unbind('mousemove', jQuery.iResize.move)
+			.unbind('mouseup', jQuery.iResize.stop);
+
+		// Callback function
+		if (jQuery.iResize.resizeElement.resizeOptions.onStop) {
+			jQuery.iResize.resizeElement.resizeOptions.onStop.apply(jQuery.iResize.resizeElement, [jQuery.iResize.resizeDirection]);
+		}
+
+		// Unbind
+		jQuery.iResize.resizeElement = null;
+		jQuery.iResize.resizeDirection = null;
+	},
+	getWidth: function(dx, side) {
+		return Math.min(
+						Math.max(jQuery.iResize.sizes.width + dx * side, jQuery.iResize.resizeElement.resizeOptions.minWidth),
+						jQuery.iResize.resizeElement.resizeOptions.maxWidth
+					);
+	},
+	getHeight: function(dy, side) {
+		return Math.min(
+						Math.max(jQuery.iResize.sizes.height + dy * side, jQuery.iResize.resizeElement.resizeOptions.minHeight),
+						jQuery.iResize.resizeElement.resizeOptions.maxHeight
+					);
+	},
+	getHeightMinMax: function(height) {
+		return Math.min(
+						Math.max(height, jQuery.iResize.resizeElement.resizeOptions.minHeight),
+						jQuery.iResize.resizeElement.resizeOptions.maxHeight
+					);
+	},
+	
+	/**
+	*	setting and getting the ratio value
+	* 	defined by Logan Cai cailongqun [at] yahoo [dot] com [dot] cn
+	*/
+	ResizeRatio: function(value)
+	{
+		var ratio;
+		this.each(
+			function() {
+				var el = this;
+				if(typeof(value) == 'integer')
+				{//setting new ratio
+					el.resizeOptions.ratio = value;	
+				}else
+				{//getting the ratio
+					if(el.resizeOptions.ratio)
+					{
+						ratio = el.resizeOptions.ratio;
+					}else
+					{
+						var width =  parseInt(jQuery(el).css('width')) || 0;
+						var height = parseInt(jQuery(el).css('height'))|| 0;	
+						if(width > 0 && height > 0)
+						{
+							ratio = (Math.round(height/width * 10000)/10000);
+						}else
+						{
+							ratio = null;
+						}
+					}
+				}
+			}
+			
+		);
+		return ratio;	
+		
+	},	
+	/**
+	*	setting and getting the ratio value
+	* 	defined by Logan Cai cailongqun [at] yahoo [dot] com [dot] cn
+	*/
+	ResizeConstraint: function(OnOrOff)
+	{
+		var ratio;
+		
+		this.each(
+			function()
+			{
+				var el = this;
+				if(typeof(OnOrOff) != 'boolean' || !OnOrOff)
+				{//turn off resize constraint
+						el.resizeOptions.ratio =  null;
+				}else
+				{//turn on the resize constraint and set the ratio calculated from current image width & height
+					var width =  parseInt(jQuery(el).css('width')) || 0;
+					var height = parseInt(jQuery(el).css('height'))|| 0;	
+					if(width > 0 && height > 0)
+					{
+						el.resizeOptions.ratio = (Math.round(height/width * 10000)/10000);
+					}else
+					{
+						el.resizeOptions.ratio = null;
+					}
+				}
+			}
+			
+		);
+		
+	},	
+	
+	move: function(e) {
+		if (jQuery.iResize.resizeElement == null) {
+			return;
+		}
+
+		pointer = jQuery.iUtil.getPointer(e);
+		dx = pointer.x - jQuery.iResize.pointer.x;
+		dy = pointer.y - jQuery.iResize.pointer.y;
+
+		newSizes = {
+				width: jQuery.iResize.sizes.width,
+				height: jQuery.iResize.sizes.height
+			};
+		newPosition = {
+				top: jQuery.iResize.position.top,
+				left: jQuery.iResize.position.left
+			};
+
+		switch (jQuery.iResize.resizeDirection){
+			case 'e':
+				newSizes.width = jQuery.iResize.getWidth(dx,1);
+				break;
+			case 'se':
+				newSizes.width = jQuery.iResize.getWidth(dx,1);
+				newSizes.height = jQuery.iResize.getHeight(dy,1);
+				break;
+			case 'w':
+				newSizes.width = jQuery.iResize.getWidth(dx,-1);
+				newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
+				break;
+			case 'sw':
+				newSizes.width = jQuery.iResize.getWidth(dx,-1);
+				newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
+				newSizes.height = jQuery.iResize.getHeight(dy,1);
+				break;
+			case 'nw':
+				newSizes.height = jQuery.iResize.getHeight(dy,-1);
+				newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
+				newSizes.width = jQuery.iResize.getWidth(dx,-1);
+				newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
+				break;
+			case 'n':
+				newSizes.height = jQuery.iResize.getHeight(dy,-1);
+				newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
+				break;
+			case 'ne':
+				newSizes.height = jQuery.iResize.getHeight(dy,-1);
+				newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
+				newSizes.width = jQuery.iResize.getWidth(dx,1);
+				break;
+			case 's':
+				newSizes.height = jQuery.iResize.getHeight(dy,1);
+				break;
+		}
+
+		if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+			if (jQuery.iResize.resizeDirection == 'n' || jQuery.iResize.resizeDirection == 's')
+				nWidth = newSizes.height * jQuery.iResize.resizeElement.resizeOptions.ratio;
+			else
+				nWidth = newSizes.width;
+			nHeight = jQuery.iResize.getHeightMinMax(nWidth * jQuery.iResize.resizeElement.resizeOptions.ratio);
+			nWidth = nHeight / jQuery.iResize.resizeElement.resizeOptions.ratio;
+
+			switch (jQuery.iResize.resizeDirection){
+				case 'n':
+				case 'nw':
+				case 'ne':
+					newPosition.top += newSizes.height - nHeight;
+				break;
+			}
+
+			switch (jQuery.iResize.resizeDirection){
+				case 'nw':
+				case 'w':
+				case 'sw':
+					newPosition.left += newSizes.width - nWidth;
+				break;
+			}
+
+			newSizes.height = nHeight;
+			newSizes.width = nWidth;
+		}
+
+		if (newPosition.top < jQuery.iResize.resizeElement.resizeOptions.minTop) {
+			nHeight = newSizes.height + newPosition.top - jQuery.iResize.resizeElement.resizeOptions.minTop;
+			newPosition.top = jQuery.iResize.resizeElement.resizeOptions.minTop;
+
+			if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+				nWidth = nHeight / jQuery.iResize.resizeElement.resizeOptions.ratio;
+				switch (jQuery.iResize.resizeDirection){
+					case 'nw':
+					case 'w':
+					case 'sw':
+						newPosition.left += newSizes.width - nWidth;
+					break;
+				}
+				newSizes.width = nWidth;
+			}
+			newSizes.height = nHeight;
+		}
+
+		if (newPosition.left < jQuery.iResize.resizeElement.resizeOptions.minLeft ) {
+			nWidth = newSizes.width + newPosition.left - jQuery.iResize.resizeElement.resizeOptions.minLeft;
+			newPosition.left = jQuery.iResize.resizeElement.resizeOptions.minLeft;
+
+			if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+				nHeight = nWidth * jQuery.iResize.resizeElement.resizeOptions.ratio;
+				switch (jQuery.iResize.resizeDirection){
+					case 'n':
+					case 'nw':
+					case 'ne':
+						newPosition.top += newSizes.height - nHeight;
+					break;
+				}
+				newSizes.height = nHeight;
+			}
+			newSizes.width = nWidth;
+		}
+
+		if (newPosition.top + newSizes.height > jQuery.iResize.resizeElement.resizeOptions.maxBottom) {
+			newSizes.height = jQuery.iResize.resizeElement.resizeOptions.maxBottom - newPosition.top;
+			if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+				newSizes.width = newSizes.height / jQuery.iResize.resizeElement.resizeOptions.ratio;
+			}
+
+		}
+
+		if (newPosition.left + newSizes.width > jQuery.iResize.resizeElement.resizeOptions.maxRight) {
+			newSizes.width = jQuery.iResize.resizeElement.resizeOptions.maxRight - newPosition.left;
+			if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+				newSizes.height = newSizes.width * jQuery.iResize.resizeElement.resizeOptions.ratio;
+			}
+
+		}
+
+		var newDimensions = false;
+		if (jQuery.iResize.resizeElement.resizeOptions.onResize) {
+			newDimensions = jQuery.iResize.resizeElement.resizeOptions.onResize.apply( jQuery.iResize.resizeElement, [ newSizes, newPosition ] );
+			if (newDimensions) {
+				if (newDimensions.sizes) {
+					jQuery.extend(newSizes, newDimensions.sizes);
+				}
+
+				if (newDimensions.position) {
+					jQuery.extend(newPosition, newDimensions.position);
+				}
+			}
+		}
+			elS = jQuery.iResize.resizeElement.style;
+			elS.left = newPosition.left + 'px';
+			elS.top = newPosition.top + 'px';
+			elS.width = newSizes.width + 'px';
+			elS.height = newSizes.height + 'px';
+
+		return false;
+	},
+	/**
+	 * Builds the resizable
+	 */
+	build: function(options) {
+		if (!options || !options.handlers || options.handlers.constructor != Object) {
+			return;
+		}
+
+		return this.each(
+			function() {
+				var el = this;
+				el.resizeOptions = options;
+				el.resizeOptions.minWidth = options.minWidth || 10;
+				el.resizeOptions.minHeight = options.minHeight || 10;
+				el.resizeOptions.maxWidth = options.maxWidth || 3000;
+				el.resizeOptions.maxHeight = options.maxHeight || 3000;
+				el.resizeOptions.minTop = options.minTop || -1000;
+				el.resizeOptions.minLeft = options.minLeft || -1000;
+				el.resizeOptions.maxRight = options.maxRight || 3000;
+				el.resizeOptions.maxBottom = options.maxBottom || 3000;
+				elPosition = jQuery(el).css('position');
+				if (!(elPosition == 'relative' || elPosition == 'absolute')) {
+					el.style.position = 'relative';
+				}
+
+				directions = /n|ne|e|se|s|sw|w|nw/g;
+				for (i in el.resizeOptions.handlers) {
+					if (i.toLowerCase().match(directions) != null) {
+						if (el.resizeOptions.handlers[i].constructor == String) {
+							handle = jQuery(el.resizeOptions.handlers[i]);
+							if (handle.size() > 0) {
+								el.resizeOptions.handlers[i] = handle.get(0);
+							}
+						}
+
+						if (el.resizeOptions.handlers[i].tagName) {
+							el.resizeOptions.handlers[i].resizeElement = el;
+							el.resizeOptions.handlers[i].resizeDirection = i;
+							jQuery(el.resizeOptions.handlers[i]).bind('mousedown', jQuery.iResize.start);
+						}
+					}
+				}
+
+				if (el.resizeOptions.dragHandle) {
+					if (typeof el.resizeOptions.dragHandle === 'string') {
+						handleEl = jQuery(el.resizeOptions.dragHandle);
+						if (handleEl.size() > 0) {
+							handleEl.each(function() {
+									this.dragEl = el;
+								});
+							handleEl.bind('mousedown', jQuery.iResize.startDrag);
+						}
+					} else if (el.resizeOptions.dragHandle == true) {
+						jQuery(this).bind('mousedown', jQuery.iResize.startDrag);
+					}
+				}
+			}
+		);
+	},
+
+	/**
+	 * Destroys the resizable
+	 */
+	destroy: function() {
+		return this.each(
+			function() {
+				var el = this;
+
+				// Unbind the handlers
+				for (i in el.resizeOptions.handlers) {
+					el.resizeOptions.handlers[i].resizeElement = null;
+					el.resizeOptions.handlers[i].resizeDirection = null;
+					jQuery(el.resizeOptions.handlers[i]).unbind('mousedown', jQuery.iResize.start);
+				}
+
+				// Remove the draghandle
+				if (el.resizeOptions.dragHandle) {
+					if (typeof el.resizeOptions.dragHandle === 'string') {
+						handle = jQuery(el.resizeOptions.dragHandle);
+						if (handle.size() > 0) {
+							handle.unbind('mousedown', jQuery.iResize.startDrag);
+						}
+					} else if (el.resizeOptions.dragHandle == true) {
+						jQuery(this).unbind('mousedown', jQuery.iResize.startDrag);
+					}
+				}
+
+				// Reset the options
+				el.resizeOptions = null;
+			}
+		);
+	}
+};
+
+
+jQuery.fn.extend ({
+		/**
+		 * Create a resizable element with a number of advanced options including callback, dragging
+		 * 
+		 * @name Resizable
+		 * @description Create a resizable element with a number of advanced options including callback, dragging
+		 * @param Hash hash A hash of parameters. All parameters are optional.
+		 * @option Hash handlers hash with keys for each resize direction (e, es, s, sw, w, nw, n) and value string selection
+		 * @option Integer minWidth (optional) the minimum width that element can be resized to
+		 * @option Integer maxWidth (optional) the maximum width that element can be resized to
+		 * @option Integer minHeight (optional) the minimum height that element can be resized to
+		 * @option Integer maxHeight (optional) the maximum height that element can be resized to
+		 * @option Integer minTop (optional) the minmum top position to wich element can be moved to
+		 * @option Integer minLeft (optional) the minmum left position to wich element can be moved to
+		 * @option Integer maxRight (optional) the maximum right position to wich element can be moved to
+		 * @option Integer maxBottom (optional) the maximum bottom position to wich element can be moved to
+		 * @option Float ratio (optional) the ratio between width and height to constrain elements sizes to that ratio
+		 * @option Mixed dragHandle (optional) true to make the element draggable, string selection for drag handle
+		 * @option Function onDragStart (optional) A function to be executed whenever the dragging starts
+		 * @option Function onDragStop (optional) A function to be executed whenever the dragging stops
+		 * @option Function onDrag (optional) A function to be executed whenever the element is dragged
+		 * @option Function onStart (optional) A function to be executed whenever the element starts to be resized
+		 * @option Function onStop (optional) A function to be executed whenever the element stops to be resized
+		 * @option Function onResize (optional) A function to be executed whenever the element is resized
+		 * @type jQuery
+		 * @cat Plugins/Interface
+		 * @author Stefan Petre
+		 */
+		Resizable: jQuery.iResize.build,
+		ResizableRatio: jQuery.iResize.ResizeRatio,
+		ResizeConstraint: jQuery.iResize.ResizeConstraint,
+		/**
+		 * Destroy a resizable
+		 * 
+		 * @name ResizableDestroy
+		 * @description Destroy a resizable
+		 * @type jQuery
+		 * @cat Plugins/Interface
+		 * @author Stefan Petre
+		 */
+		ResizableDestroy: jQuery.iResize.destroy
+	});

+ 527 - 0
main/inc/lib/fckeditor/editor/plugins/ajaxfilemanager/jscripts/iresizable.js

@@ -0,0 +1,527 @@
+/**
+ * Interface Elements for jQuery
+ * Resizable
+ *
+ * http://interface.eyecon.ro
+ *
+ * Copyright (c) 2006 Stefan Petre
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ *
+ */
+
+jQuery.iResize = {
+	resizeElement: null,
+	resizeDirection: null,
+	dragged: null,
+	pointer: null,
+	sizes: null,
+	position: null,
+	/**
+	 * internal: Start function
+	 */
+	startDrag: function(e) {
+		jQuery.iResize.dragged = (this.dragEl) ? this.dragEl: this;
+		jQuery.iResize.pointer = jQuery.iUtil.getPointer(e);
+
+		// Save original size
+		jQuery.iResize.sizes = {
+			width: parseInt(jQuery(jQuery.iResize.dragged).css('width')) || 0,
+			height: parseInt(jQuery(jQuery.iResize.dragged).css('height')) || 0
+		};
+
+		// Save original position
+		jQuery.iResize.position = {
+			top: parseInt(jQuery(jQuery.iResize.dragged).css('top')) || 0,
+			left: parseInt(jQuery(jQuery.iResize.dragged).css('left')) || 0
+		};
+
+		// Assign event handlers
+		jQuery(document)
+			.bind('mousemove', jQuery.iResize.moveDrag)
+			.bind('mouseup', jQuery.iResize.stopDrag);
+
+		// Callback?
+		if (typeof jQuery.iResize.dragged.resizeOptions.onDragStart === 'function') {
+			jQuery.iResize.dragged.resizeOptions.onDragStart.apply(jQuery.iResize.dragged);
+		}
+		return false;
+	},
+	/**
+	 * internal: Stop function
+	 */
+	stopDrag: function(e) {
+		// Unbind event handlers
+		jQuery(document)
+			.unbind('mousemove', jQuery.iResize.moveDrag)
+			.unbind('mouseup', jQuery.iResize.stopDrag);
+
+		// Callback?
+		if (typeof jQuery.iResize.dragged.resizeOptions.onDragStop === 'function') {
+			jQuery.iResize.dragged.resizeOptions.onDragStop.apply(jQuery.iResize.dragged);
+		}
+
+		// Remove dragged element
+		jQuery.iResize.dragged = null;
+	},
+	/**
+	 * internal: Move function
+	 */
+	moveDrag: function(e) {
+		if (!jQuery.iResize.dragged) {
+			return;
+		}
+
+		pointer = jQuery.iUtil.getPointer(e);
+
+		// Calculate new positions
+		newTop = jQuery.iResize.position.top - jQuery.iResize.pointer.y + pointer.y;
+		newLeft = jQuery.iResize.position.left - jQuery.iResize.pointer.x + pointer.x;
+		newTop = Math.max(
+						Math.min(newTop, jQuery.iResize.dragged.resizeOptions.maxBottom - jQuery.iResize.sizes.height),
+						jQuery.iResize.dragged.resizeOptions.minTop
+					);
+		newLeft = Math.max(
+						Math.min(newLeft, jQuery.iResize.dragged.resizeOptions.maxRight- jQuery.iResize.sizes.width),
+						jQuery.iResize.dragged.resizeOptions.minLeft
+					);
+
+		// Callback
+		if (typeof jQuery.iResize.dragged.resizeOptions.onDrag === 'function') {
+			var newPos = jQuery.iResize.dragged.resizeOptions.onDrag.apply(jQuery.iResize.dragged, [newLeft, newTop]);
+			if (typeof newPos == 'array' && newPos.length == 2) {
+				newLeft = newPos[0];
+				newTop = newPos[1];
+			}
+		}
+
+		// Update the element
+		jQuery.iResize.dragged.style.top = newTop + 'px';
+		jQuery.iResize.dragged.style.left = newLeft + 'px';
+
+		return false;
+	},
+	start: function(e) {
+		// Bind event handlers
+		jQuery(document)
+			.bind('mousemove', jQuery.iResize.move)
+			.bind('mouseup', jQuery.iResize.stop);
+
+		// Initialize resizable
+		jQuery.iResize.resizeElement = this.resizeElement;
+		jQuery.iResize.resizeDirection = this.resizeDirection;
+		jQuery.iResize.pointer = jQuery.iUtil.getPointer(e);
+		jQuery.iResize.sizes = {
+				width: parseInt(jQuery(this.resizeElement).css('width'))||0,
+				height: parseInt(jQuery(this.resizeElement).css('height'))||0
+			};
+		jQuery.iResize.position = {
+				top: parseInt(jQuery(this.resizeElement).css('top'))||0,
+				left: parseInt(jQuery(this.resizeElement).css('left'))||0
+			};
+
+		// Callback function
+		if (jQuery.iResize.resizeElement.resizeOptions.onStart) {
+			jQuery.iResize.resizeElement.resizeOptions.onStart.apply(jQuery.iResize.resizeElement, [this]);
+		}
+
+		return false;
+	},
+	stop: function() {
+		// Unbind event handlers
+		jQuery(document)
+			.unbind('mousemove', jQuery.iResize.move)
+			.unbind('mouseup', jQuery.iResize.stop);
+
+		// Callback function
+		if (jQuery.iResize.resizeElement.resizeOptions.onStop) {
+			jQuery.iResize.resizeElement.resizeOptions.onStop.apply(jQuery.iResize.resizeElement, [jQuery.iResize.resizeDirection]);
+		}
+
+		// Unbind
+		jQuery.iResize.resizeElement = null;
+		jQuery.iResize.resizeDirection = null;
+	},
+	getWidth: function(dx, side) {
+		return Math.min(
+						Math.max(jQuery.iResize.sizes.width + dx * side, jQuery.iResize.resizeElement.resizeOptions.minWidth),
+						jQuery.iResize.resizeElement.resizeOptions.maxWidth
+					);
+	},
+	getHeight: function(dy, side) {
+		return Math.min(
+						Math.max(jQuery.iResize.sizes.height + dy * side, jQuery.iResize.resizeElement.resizeOptions.minHeight),
+						jQuery.iResize.resizeElement.resizeOptions.maxHeight
+					);
+	},
+	getHeightMinMax: function(height) {
+		return Math.min(
+						Math.max(height, jQuery.iResize.resizeElement.resizeOptions.minHeight),
+						jQuery.iResize.resizeElement.resizeOptions.maxHeight
+					);
+	},
+	
+	/**
+	*	setting and getting the ratio value
+	* 	defined by Logan Cai cailongqun [at] yahoo [dot] com [dot] cn
+	*/
+	ResizeRatio: function(value)
+	{
+		var ratio;
+		this.each(
+			function() {
+				var el = this;
+				if(typeof(value) == 'integer')
+				{//setting new ratio
+					el.resizeOptions.ratio = value;	
+				}else
+				{//getting the ratio
+					if(el.resizeOptions.ratio)
+					{
+						ratio = el.resizeOptions.ratio;
+					}else
+					{
+						var width =  parseInt(jQuery(el).css('width')) || 0;
+						var height = parseInt(jQuery(el).css('height'))|| 0;	
+						if(width > 0 && height > 0)
+						{
+							ratio = (Math.round(height/width * 10000)/10000);
+						}else
+						{
+							ratio = null;
+						}
+					}
+				}
+			}
+			
+		);
+		return ratio;	
+		
+	},	
+	/**
+	*	setting and getting the ratio value
+	* 	defined by Logan Cai cailongqun [at] yahoo [dot] com [dot] cn
+	*/
+	ResizeConstraint: function(OnOrOff)
+	{
+		var ratio;
+		
+		this.each(
+			function()
+			{
+				var el = this;
+				if(typeof(OnOrOff) != 'boolean' || !OnOrOff)
+				{//turn off resize constraint
+						el.resizeOptions.ratio =  null;
+				}else
+				{//turn on the resize constraint and set the ratio calculated from current image width & height
+					var width =  parseInt(jQuery(el).css('width')) || 0;
+					var height = parseInt(jQuery(el).css('height'))|| 0;	
+					if(width > 0 && height > 0)
+					{
+						el.resizeOptions.ratio = (Math.round(height/width * 10000)/10000);
+					}else
+					{
+						el.resizeOptions.ratio = null;
+					}
+				}
+			}
+			
+		);
+		
+	},	
+	
+	move: function(e) {
+		if (jQuery.iResize.resizeElement == null) {
+			return;
+		}
+
+		pointer = jQuery.iUtil.getPointer(e);
+		dx = pointer.x - jQuery.iResize.pointer.x;
+		dy = pointer.y - jQuery.iResize.pointer.y;
+
+		newSizes = {
+				width: jQuery.iResize.sizes.width,
+				height: jQuery.iResize.sizes.height
+			};
+		newPosition = {
+				top: jQuery.iResize.position.top,
+				left: jQuery.iResize.position.left
+			};
+
+		switch (jQuery.iResize.resizeDirection){
+			case 'e':
+				newSizes.width = jQuery.iResize.getWidth(dx,1);
+				break;
+			case 'se':
+				newSizes.width = jQuery.iResize.getWidth(dx,1);
+				newSizes.height = jQuery.iResize.getHeight(dy,1);
+				break;
+			case 'w':
+				newSizes.width = jQuery.iResize.getWidth(dx,-1);
+				newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
+				break;
+			case 'sw':
+				newSizes.width = jQuery.iResize.getWidth(dx,-1);
+				newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
+				newSizes.height = jQuery.iResize.getHeight(dy,1);
+				break;
+			case 'nw':
+				newSizes.height = jQuery.iResize.getHeight(dy,-1);
+				newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
+				newSizes.width = jQuery.iResize.getWidth(dx,-1);
+				newPosition.left = jQuery.iResize.position.left - newSizes.width + jQuery.iResize.sizes.width;
+				break;
+			case 'n':
+				newSizes.height = jQuery.iResize.getHeight(dy,-1);
+				newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
+				break;
+			case 'ne':
+				newSizes.height = jQuery.iResize.getHeight(dy,-1);
+				newPosition.top = jQuery.iResize.position.top - newSizes.height + jQuery.iResize.sizes.height;
+				newSizes.width = jQuery.iResize.getWidth(dx,1);
+				break;
+			case 's':
+				newSizes.height = jQuery.iResize.getHeight(dy,1);
+				break;
+		}
+
+		if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+			if (jQuery.iResize.resizeDirection == 'n' || jQuery.iResize.resizeDirection == 's')
+				nWidth = newSizes.height * jQuery.iResize.resizeElement.resizeOptions.ratio;
+			else
+				nWidth = newSizes.width;
+			nHeight = jQuery.iResize.getHeightMinMax(nWidth * jQuery.iResize.resizeElement.resizeOptions.ratio);
+			nWidth = nHeight / jQuery.iResize.resizeElement.resizeOptions.ratio;
+
+			switch (jQuery.iResize.resizeDirection){
+				case 'n':
+				case 'nw':
+				case 'ne':
+					newPosition.top += newSizes.height - nHeight;
+				break;
+			}
+
+			switch (jQuery.iResize.resizeDirection){
+				case 'nw':
+				case 'w':
+				case 'sw':
+					newPosition.left += newSizes.width - nWidth;
+				break;
+			}
+
+			newSizes.height = nHeight;
+			newSizes.width = nWidth;
+		}
+
+		if (newPosition.top < jQuery.iResize.resizeElement.resizeOptions.minTop) {
+			nHeight = newSizes.height + newPosition.top - jQuery.iResize.resizeElement.resizeOptions.minTop;
+			newPosition.top = jQuery.iResize.resizeElement.resizeOptions.minTop;
+
+			if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+				nWidth = nHeight / jQuery.iResize.resizeElement.resizeOptions.ratio;
+				switch (jQuery.iResize.resizeDirection){
+					case 'nw':
+					case 'w':
+					case 'sw':
+						newPosition.left += newSizes.width - nWidth;
+					break;
+				}
+				newSizes.width = nWidth;
+			}
+			newSizes.height = nHeight;
+		}
+
+		if (newPosition.left < jQuery.iResize.resizeElement.resizeOptions.minLeft ) {
+			nWidth = newSizes.width + newPosition.left - jQuery.iResize.resizeElement.resizeOptions.minLeft;
+			newPosition.left = jQuery.iResize.resizeElement.resizeOptions.minLeft;
+
+			if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+				nHeight = nWidth * jQuery.iResize.resizeElement.resizeOptions.ratio;
+				switch (jQuery.iResize.resizeDirection){
+					case 'n':
+					case 'nw':
+					case 'ne':
+						newPosition.top += newSizes.height - nHeight;
+					break;
+				}
+				newSizes.height = nHeight;
+			}
+			newSizes.width = nWidth;
+		}
+
+		if (newPosition.top + newSizes.height > jQuery.iResize.resizeElement.resizeOptions.maxBottom) {
+			newSizes.height = jQuery.iResize.resizeElement.resizeOptions.maxBottom - newPosition.top;
+			if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+				newSizes.width = newSizes.height / jQuery.iResize.resizeElement.resizeOptions.ratio;
+			}
+
+		}
+
+		if (newPosition.left + newSizes.width > jQuery.iResize.resizeElement.resizeOptions.maxRight) {
+			newSizes.width = jQuery.iResize.resizeElement.resizeOptions.maxRight - newPosition.left;
+			if (jQuery.iResize.resizeElement.resizeOptions.ratio) {
+				newSizes.height = newSizes.width * jQuery.iResize.resizeElement.resizeOptions.ratio;
+			}
+
+		}
+
+		var newDimensions = false;
+		if (jQuery.iResize.resizeElement.resizeOptions.onResize) {
+			newDimensions = jQuery.iResize.resizeElement.resizeOptions.onResize.apply( jQuery.iResize.resizeElement, [ newSizes, newPosition ] );
+			if (newDimensions) {
+				if (newDimensions.sizes) {
+					jQuery.extend(newSizes, newDimensions.sizes);
+				}
+
+				if (newDimensions.position) {
+					jQuery.extend(newPosition, newDimensions.position);
+				}
+			}
+		}
+			elS = jQuery.iResize.resizeElement.style;
+			elS.left = newPosition.left + 'px';
+			elS.top = newPosition.top + 'px';
+			elS.width = newSizes.width + 'px';
+			elS.height = newSizes.height + 'px';
+
+		return false;
+	},
+	/**
+	 * Builds the resizable
+	 */
+	build: function(options) {
+		if (!options || !options.handlers || options.handlers.constructor != Object) {
+			return;
+		}
+
+		return this.each(
+			function() {
+				var el = this;
+				el.resizeOptions = options;
+				el.resizeOptions.minWidth = options.minWidth || 10;
+				el.resizeOptions.minHeight = options.minHeight || 10;
+				el.resizeOptions.maxWidth = options.maxWidth || 3000;
+				el.resizeOptions.maxHeight = options.maxHeight || 3000;
+				el.resizeOptions.minTop = options.minTop || -1000;
+				el.resizeOptions.minLeft = options.minLeft || -1000;
+				el.resizeOptions.maxRight = options.maxRight || 3000;
+				el.resizeOptions.maxBottom = options.maxBottom || 3000;
+				elPosition = jQuery(el).css('position');
+				if (!(elPosition == 'relative' || elPosition == 'absolute')) {
+					el.style.position = 'relative';
+				}
+
+				directions = /n|ne|e|se|s|sw|w|nw/g;
+				for (i in el.resizeOptions.handlers) {
+					if (i.toLowerCase().match(directions) != null) {
+						if (el.resizeOptions.handlers[i].constructor == String) {
+							handle = jQuery(el.resizeOptions.handlers[i]);
+							if (handle.size() > 0) {
+								el.resizeOptions.handlers[i] = handle.get(0);
+							}
+						}
+
+						if (el.resizeOptions.handlers[i].tagName) {
+							el.resizeOptions.handlers[i].resizeElement = el;
+							el.resizeOptions.handlers[i].resizeDirection = i;
+							jQuery(el.resizeOptions.handlers[i]).bind('mousedown', jQuery.iResize.start);
+						}
+					}
+				}
+
+				if (el.resizeOptions.dragHandle) {
+					if (typeof el.resizeOptions.dragHandle === 'string') {
+						handleEl = jQuery(el.resizeOptions.dragHandle);
+						if (handleEl.size() > 0) {
+							handleEl.each(function() {
+									this.dragEl = el;
+								});
+							handleEl.bind('mousedown', jQuery.iResize.startDrag);
+						}
+					} else if (el.resizeOptions.dragHandle == true) {
+						jQuery(this).bind('mousedown', jQuery.iResize.startDrag);
+					}
+				}
+			}
+		);
+	},
+
+	/**
+	 * Destroys the resizable
+	 */
+	destroy: function() {
+		return this.each(
+			function() {
+				var el = this;
+
+				// Unbind the handlers
+				for (i in el.resizeOptions.handlers) {
+					el.resizeOptions.handlers[i].resizeElement = null;
+					el.resizeOptions.handlers[i].resizeDirection = null;
+					jQuery(el.resizeOptions.handlers[i]).unbind('mousedown', jQuery.iResize.start);
+				}
+
+				// Remove the draghandle
+				if (el.resizeOptions.dragHandle) {
+					if (typeof el.resizeOptions.dragHandle === 'string') {
+						handle = jQuery(el.resizeOptions.dragHandle);
+						if (handle.size() > 0) {
+							handle.unbind('mousedown', jQuery.iResize.startDrag);
+						}
+					} else if (el.resizeOptions.dragHandle == true) {
+						jQuery(this).unbind('mousedown', jQuery.iResize.startDrag);
+					}
+				}
+
+				// Reset the options
+				el.resizeOptions = null;
+			}
+		);
+	}
+};
+
+
+jQuery.fn.extend ({
+		/**
+		 * Create a resizable element with a number of advanced options including callback, dragging
+		 * 
+		 * @name Resizable
+		 * @description Create a resizable element with a number of advanced options including callback, dragging
+		 * @param Hash hash A hash of parameters. All parameters are optional.
+		 * @option Hash handlers hash with keys for each resize direction (e, es, s, sw, w, nw, n) and value string selection
+		 * @option Integer minWidth (optional) the minimum width that element can be resized to
+		 * @option Integer maxWidth (optional) the maximum width that element can be resized to
+		 * @option Integer minHeight (optional) the minimum height that element can be resized to
+		 * @option Integer maxHeight (optional) the maximum height that element can be resized to
+		 * @option Integer minTop (optional) the minmum top position to wich element can be moved to
+		 * @option Integer minLeft (optional) the minmum left position to wich element can be moved to
+		 * @option Integer maxRight (optional) the maximum right position to wich element can be moved to
+		 * @option Integer maxBottom (optional) the maximum bottom position to wich element can be moved to
+		 * @option Float ratio (optional) the ratio between width and height to constrain elements sizes to that ratio
+		 * @option Mixed dragHandle (optional) true to make the element draggable, string selection for drag handle
+		 * @option Function onDragStart (optional) A function to be executed whenever the dragging starts
+		 * @option Function onDragStop (optional) A function to be executed whenever the dragging stops
+		 * @option Function onDrag (optional) A function to be executed whenever the element is dragged
+		 * @option Function onStart (optional) A function to be executed whenever the element starts to be resized
+		 * @option Function onStop (optional) A function to be executed whenever the element stops to be resized
+		 * @option Function onResize (optional) A function to be executed whenever the element is resized
+		 * @type jQuery
+		 * @cat Plugins/Interface
+		 * @author Stefan Petre
+		 */
+		Resizable: jQuery.iResize.build,
+		ResizableRatio: jQuery.iResize.ResizeRatio,
+		ResizeConstraint: jQuery.iResize.ResizeConstraint,
+		/**
+		 * Destroy a resizable
+		 * 
+		 * @name ResizableDestroy
+		 * @description Destroy a resizable
+		 * @type jQuery
+		 * @cat Plugins/Interface
+		 * @author Stefan Petre
+		 */
+		ResizableDestroy: jQuery.iResize.destroy
+	});

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác