Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d8ff32f888 | ||
|
|
d0315891b7 | ||
|
|
a796dc2376 | ||
|
|
eb4cc629a3 | ||
|
|
280320ef9a | ||
|
|
328ddeb46d | ||
|
|
13df2cb182 | ||
|
|
bf73a03125 | ||
|
|
8c98e13984 | ||
|
|
c159e9326e | ||
|
|
662bd1188d | ||
|
|
b3e57075de | ||
|
|
c6a08896f0 | ||
|
|
8cfe6b557c | ||
|
|
8ce1da9485 | ||
|
|
c44b1689b3 | ||
|
|
dcf2571437 | ||
|
|
c9aca08d4e | ||
|
|
fe8486d456 | ||
|
|
b31dc5fb16 | ||
|
|
160ee475fd | ||
|
|
dca9e6a88a | ||
|
|
4172f7d157 | ||
|
|
7a2275b3fb | ||
|
|
76ac21a92d | ||
|
|
f21012202f | ||
|
|
c0eb4172a2 | ||
|
|
2ed832c729 | ||
|
|
bfbf84ca24 | ||
|
|
5747825c14 | ||
|
|
67cbc08b60 | ||
|
|
be0c8088ce | ||
|
|
c36b7d842d | ||
|
|
74534641aa | ||
|
|
f7e1ce7b50 | ||
|
|
dab73a3eb2 | ||
|
|
24fe2bb81e | ||
|
|
1cd1529e28 | ||
|
|
72386c94a9 | ||
|
|
262efb40bb | ||
|
|
85dfe6f5fa | ||
|
|
53cee56a9d | ||
|
|
76224c40fe | ||
|
|
f12b4914e6 | ||
|
|
989b0a602d | ||
|
|
7664f1ea74 | ||
|
|
1d3d5fa56b | ||
|
|
f69edba862 | ||
|
|
20bd4d81ec | ||
|
|
aeac737c84 | ||
|
|
bea1afc01c | ||
|
|
8cbc5d79d4 | ||
|
|
d51f050d6e | ||
|
|
b485e1ce4e | ||
|
|
5de12ce651 | ||
|
|
2d455a2fcf | ||
|
|
7b5f5ae5ce | ||
|
|
853981b3b0 | ||
|
|
2449a059f0 | ||
|
|
d1e2cf4850 |
@@ -1,8 +0,0 @@
|
||||
# CodeMirror 2
|
||||
|
||||
CodeMirror is a JavaScript component that provides a code editor in
|
||||
the browser. When a mode is available for the language you are coding
|
||||
in, it will color your code, and optionally help with indentation.
|
||||
|
||||
The project page is http://codemirror.net
|
||||
The manual is at http://codemirror.net/doc/manual.html
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2011 by MarkLogic Corporation
|
||||
Author: Mike Brevoort <mike@brevoort.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
.cm-s-xq-dark { background: #0a001f; color: #f8f8f8; }
|
||||
.cm-s-xq-dark span.CodeMirror-selected { background: #a8f !important; }
|
||||
.cm-s-xq-dark .CodeMirror-gutter { background: #0a001f; border-right: 1px solid #aaa; }
|
||||
.cm-s-xq-dark .CodeMirror-gutter-text { color: #f8f8f8; }
|
||||
.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; }
|
||||
|
||||
.cm-s-xq-dark span.cm-keyword {color: #FFBD40;}
|
||||
.cm-s-xq-dark span.cm-atom {color: #6C8CD5;}
|
||||
.cm-s-xq-dark span.cm-number {color: #164;}
|
||||
.cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;}
|
||||
.cm-s-xq-dark span.cm-variable {color: #FFF;}
|
||||
.cm-s-xq-dark span.cm-variable-2 {color: #EEE;}
|
||||
.cm-s-xq-dark span.cm-variable-3 {color: #DDD;}
|
||||
.cm-s-xq-dark span.cm-property {}
|
||||
.cm-s-xq-dark span.cm-operator {}
|
||||
.cm-s-xq-dark span.cm-comment {color: gray;}
|
||||
.cm-s-xq-dark span.cm-string {color: #9FEE00;}
|
||||
.cm-s-xq-dark span.cm-meta {color: yellow;}
|
||||
.cm-s-xq-dark span.cm-error {color: #f00;}
|
||||
.cm-s-xq-dark span.cm-qualifier {color: #FFF700;}
|
||||
.cm-s-xq-dark span.cm-builtin {color: #30a;}
|
||||
.cm-s-xq-dark span.cm-bracket {color: #cc7;}
|
||||
.cm-s-xq-dark span.cm-tag {color: #FFBD40;}
|
||||
.cm-s-xq-dark span.cm-attribute {color: #FFF700;}
|
||||
1
CodeMirror-2.33/lib/codemirror-compressed.js
Normal file
@@ -9,8 +9,7 @@
|
||||
}
|
||||
|
||||
.CodeMirror-scroll {
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
overflow: auto;
|
||||
height: 300px;
|
||||
/* This is needed to prevent an IE[67] bug where the scrolled content
|
||||
is visible outside of the scrolling box. */
|
||||
@@ -20,13 +19,11 @@
|
||||
|
||||
/* Vertical scrollbar */
|
||||
.CodeMirror-scrollbar {
|
||||
float: right;
|
||||
position: absolute;
|
||||
right: 0; top: 0;
|
||||
overflow-x: hidden;
|
||||
overflow-y: scroll;
|
||||
|
||||
/* This corrects for the 1px gap introduced to the left of the scrollbar
|
||||
by the rule for .CodeMirror-scrollbar-inner. */
|
||||
margin-left: -1px;
|
||||
z-index: 5;
|
||||
}
|
||||
.CodeMirror-scrollbar-inner {
|
||||
/* This needs to have a nonzero width in order for the scrollbar to appear
|
||||
@@ -69,10 +66,6 @@
|
||||
white-space: pre;
|
||||
cursor: text;
|
||||
}
|
||||
.CodeMirror-lines * {
|
||||
/* Necessary for throw-scrolling to decelerate properly on Safari. */
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.CodeMirror pre {
|
||||
-moz-border-radius: 0;
|
||||
@@ -165,5 +158,16 @@ span.cm-em {font-style: italic;}
|
||||
span.cm-emstrong {font-style: italic; font-weight: bold;}
|
||||
span.cm-link {text-decoration: underline;}
|
||||
|
||||
span.cm-invalidchar {color: #f00;}
|
||||
|
||||
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
|
||||
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
|
||||
|
||||
@media print {
|
||||
|
||||
/* Hide the cursor when printing */
|
||||
.CodeMirror pre.CodeMirror-cursor {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
Backups are stored in this folder every 10 mins by default
|
||||
1
backups/readme.txt
Normal file
@@ -0,0 +1 @@
|
||||
Zip It! backups are stored in this folder
|
||||
27
editor.php
@@ -4,6 +4,7 @@
|
||||
<html style="margin: 0" onMouseDown="top.ICEcoder.mouseDown=true" onMouseUp="top.ICEcoder.mouseDown=false" onMouseMove="if(top.ICEcoder) {top.ICEcoder.getMouseXY(event,'editor');top.ICEcoder.canResizeFilesW()}">
|
||||
<head>
|
||||
<title>ICEcoder editor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<link rel="stylesheet" href="<?php echo $ICEcoder["codeMirrorDir"]; ?>/lib/codemirror.css">
|
||||
<!--
|
||||
codemirror-compressed.js
|
||||
@@ -16,12 +17,14 @@ foldcode, searchcursor, match-highlighter
|
||||
//-->
|
||||
<script src="<?php echo $ICEcoder["codeMirrorDir"]; ?>/lib/codemirror-compressed.js"></script>
|
||||
<link rel="stylesheet" href="<?php
|
||||
if ($ICEcoder["theme"]=="default") {echo 'lib/editor.css';} else {echo $ICEcoder["codeMirrorDir"].'/theme/'.$ICEcoder["theme"].'.css';};
|
||||
$ICEcoder["theme"]=="default" ? echo 'lib/editor.css' : echo $ICEcoder["codeMirrorDir"].'/theme/'.$ICEcoder["theme"].'.css';
|
||||
$activeLineBG = $ICEcoder["theme"]=="eclipse" || $ICEcoder["theme"]=="elegant" || $ICEcoder["theme"]=="neat" ? "#ccc" : "#000";
|
||||
?>">
|
||||
<style type="text/css">
|
||||
.CodeMirror {position: absolute; width: 0; background-color: #fff; top: 0px; width: 100%; z-index: 1}
|
||||
.CodeMirror {position: absolute; width: 0; background-color: #fff; color: #000; top: 0px; width: 100%; z-index: 1}
|
||||
.CodeMirror-scroll {height: 100%}
|
||||
.cm-s-activeLine {background: #000 !important;}
|
||||
/* Make sure this next one remains the 3rd item, updated with JS */
|
||||
.cm-s-activeLine {background: <?php echo $activeLineBG;?> !important}
|
||||
span.CodeMirror-matchhighlight {background: #555}
|
||||
.CodeMirror-focused span.CodeMirror-matchhighlight {color: #000; background: #555; !important}
|
||||
/* Make sure this next one remains the 6th item, updated with JS */
|
||||
@@ -143,12 +146,13 @@ function createNewCMInstance(num) {
|
||||
canDoEndTag=false;
|
||||
}
|
||||
}
|
||||
if(top.ICEcoder.tagString.slice(0,1)=="/"||top.ICEcoder.tagString.slice(0,1)=="?") {
|
||||
canDoEndTag=false;
|
||||
}
|
||||
if (!top.ICEcoder.codeAssist||fileName && (fileName.indexOf(".js")>0||fileName.indexOf(".css")>0||fileName.indexOf(".less")>0)) {
|
||||
canDoEndTag=false;
|
||||
}
|
||||
if (
|
||||
top.ICEcoder.tagString.slice(0,1)=="/"||
|
||||
top.ICEcoder.tagString.slice(0,1)=="?"||
|
||||
!top.ICEcoder.codeAssist||
|
||||
fileName && (fileName.indexOf(".js")>0||fileName.indexOf(".css")>0||fileName.indexOf(".less")>0)
|
||||
) {canDoEndTag=false}
|
||||
|
||||
contentType = top.ICEcoder.caretLocType;
|
||||
if (canDoEndTag && (contentType!="JavaScript"||(contentType=="JavaScript"&&top.ICEcoder.tagString=="script"))) {
|
||||
numTabs = top.ICEcoder.htmlTagArray.length;
|
||||
@@ -157,7 +161,6 @@ function createNewCMInstance(num) {
|
||||
for (i=0;i<numTabs-1;i++) {
|
||||
tabs += "\t";
|
||||
}
|
||||
//endTag = "</" + top.ICEcoder.htmlTagArray[top.ICEcoder.htmlTagArray.length-1] + ">";
|
||||
endTag = "</" + top.ICEcoder.tagString + ">";
|
||||
if (top.ICEcoder.tagString=="script") {endTag="</"+"script>"};
|
||||
if(top.ICEcoder.tagString=="title"||top.ICEcoder.tagString=="a"||top.ICEcoder.tagString=="li"||top.ICEcoder.tagString=="span"||(top.ICEcoder.tagString.slice(0,1)=="h"&&parseInt(top.ICEcoder.tagString.slice(1,2),10)>=1&&parseInt(top.ICEcoder.tagString.slice(1,2),10)<=7)) {
|
||||
@@ -177,7 +180,9 @@ function createNewCMInstance(num) {
|
||||
onGutterClick: !fileName || (fileName && fileName.indexOf(".js") == -1 && fileName.indexOf(".coffee") == -1 && fileName.indexOf(".php") && fileName.indexOf(".rb") == -1) ? codeFold : codeFold_JS_Coffee_PHP_Ruby,
|
||||
extraKeys: {
|
||||
"Tab": function(cm) {CodeMirror.commands[top.tabsIndent ? "defaultTab" : "insertTab"](cm);},
|
||||
"Shift-Tab": "indentLess"
|
||||
"Shift-Tab": "indentLess",
|
||||
"Ctrl-Up": function() {},
|
||||
"Ctrl-Down": function() {}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
<?php
|
||||
$ICEcoder["restrictedFiles"] = $_SESSION['restrictedFiles'];
|
||||
$ICEcoder["bannedFiles"] = $_SESSION['bannedFiles'];
|
||||
$serverType = strrpos($docRoot,":") ? "Windows" : "Linux";
|
||||
|
||||
// Function to sort given values alphabetically
|
||||
function alphasort($a, $b) {
|
||||
@@ -125,8 +124,7 @@ for ($i=0;$i<count($finalArray);$i++) {
|
||||
if ($_SESSION['userLevel'] == 10 || ($_SESSION['userLevel'] < 10 && !$restrictedFile)) {
|
||||
echo "<li class=\"".$class."\"><a nohref title=\"$fileFolderName\" onMouseOver=\"top.ICEcoder.overFileFolder('$type','".str_replace($docRoot,"",str_replace("/","|",$fileFolderName))."')\" onMouseOut=\"top.ICEcoder.overFileFolder('$type','')\" style=\"position: relative; left:-22px\"> <span id=\"".str_replace($docRoot,"",str_replace("/","|",$fileFolderName))."\">".basename($fileFolderName)."</span> ".$fileAtts."</a>\n";
|
||||
} else {
|
||||
if ($type == "file") {$fileAtts = "<img src=\"images/padlock.png\" style=\"cursor: pointer\" onClick=\"top.ICEcoder.message('Sorry, you need higher admin level rights to view.')\">";}
|
||||
echo "<li class=\"".$class."\" style=\"cursor: default\"><span style=\"position: relative; left:-22px; color: #888\"> [HIDDEN] ".$fileAtts."</span>";
|
||||
echo "<li class=\"".$class."\" style=\"cursor: default\"><span style=\"position: relative; left:-22px; color: #888\" onClick=\"top.ICEcoder.message('Sorry, you need higher admin level rights to view.')\"> [HIDDEN]</span>";
|
||||
}
|
||||
if ($i<count($finalArray)) {echo "</li>\n";}
|
||||
$lastPath = $fileFolderName;
|
||||
|
||||
BIN
images/blank.gif
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 55 B |
|
Before Width: | Height: | Size: 842 B |
BIN
images/files-arrow.png
Normal file
|
After Width: | Height: | Size: 158 B |
|
Before Width: | Height: | Size: 1.1 KiB |
BIN
images/nav-bg.jpg
Normal file
|
After Width: | Height: | Size: 435 B |
|
Before Width: | Height: | Size: 752 B |
91
index.php
@@ -1,26 +1,22 @@
|
||||
<?php
|
||||
include("lib/settings.php");
|
||||
$allowedIP = false;
|
||||
for($i=0;$i<count($_SESSION['allowedIPs']);$i++) {
|
||||
if ($_SESSION['allowedIPs'][$i]==$_SERVER["REMOTE_ADDR"]||$_SESSION['allowedIPs'][$i]=="*") {
|
||||
$allowedIP = true;
|
||||
}
|
||||
}
|
||||
if (!$allowedIP) {
|
||||
|
||||
// Check IP permissions
|
||||
if (!in_array($_SERVER["REMOTE_ADDR"], $_SESSION['allowedIPs']) && !in_array("*", $_SESSION['allowedIPs'])) {
|
||||
header('Location: /');
|
||||
};
|
||||
|
||||
// Check for updates of ICEcoder & CodeMirror
|
||||
// Check for updates
|
||||
if ($ICEcoder["checkUpdates"]) {
|
||||
$ICEcoderLatestVer = json_encode(file_get_contents("http://icecoder.net/latest-version.txt"));
|
||||
$ICEcoderLatestVer = rtrim(ltrim($ICEcoderLatestVer,"\""),"\"\\n");
|
||||
if (ltrim($ICEcoder["versionNo"],"v ")<ltrim($ICEcoderLatestVer,"v ")) {
|
||||
echo '<script>top.ICEcoder.message(\'ICEcoder '.$ICEcoderLatestVer.' now released\n\nPlease upgrade\');</script>';
|
||||
$icv = json_encode(file_get_contents("http://icecoder.net/latest-version.txt"));
|
||||
$icv = rtrim(ltrim($icv,'"'),'"\\n');
|
||||
if ($ICEcoder["versionNo"]<$icv) {
|
||||
$updateMsg = ';top.ICEcoder.message(\'ICEcoder '.$icv.' now released\n\nPlease upgrade\')';
|
||||
} else {
|
||||
$cMLatestVer = json_encode(file_get_contents("http://codemirror.net/latest-version.txt"));
|
||||
$cMLatestVer = rtrim(ltrim($cMLatestVer,"\""),"\"\\n");
|
||||
if ($ICEcoder["cMThisVer"]<$cMLatestVer) {
|
||||
echo '<script>top.ICEcoder.message(\'CodeMirror '.$cMLatestVer.' now released\n\nPlease upgrade\');</script>';
|
||||
$cmv = json_encode(file_get_contents("http://codemirror.net/latest-version.txt"));
|
||||
$cmv = rtrim(ltrim($cmv,'"'),'"\\n');
|
||||
if ($ICEcoder["cMThisVer"]<$cmv) {
|
||||
$updateMsg = ';top.ICEcoder.message(\'CodeMirror '.$cmv.' now released\n\nPlease upgrade\')';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,7 +25,8 @@ if ($ICEcoder["checkUpdates"]) {
|
||||
|
||||
<html onMouseDown="top.ICEcoder.mouseDown=true" onMouseUp="top.ICEcoder.mouseDown=false" onMouseMove="if(top.ICEcoder) {top.ICEcoder.getMouseXY(event,'top');top.ICEcoder.canResizeFilesW()}">
|
||||
<head>
|
||||
<title>ICEcoder <?php echo $ICEcoder["versionNo"];?></title>
|
||||
<title>ICEcoder v <?php echo $ICEcoder["versionNo"];?></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<link rel="stylesheet" type="text/css" href="lib/coder.css">
|
||||
<script>
|
||||
@@ -37,31 +34,31 @@ theme = "<?php echo $ICEcoder["theme"]=="default" ? 'icecoder' : $ICEcoder["them
|
||||
tabsIndent = <?php echo $ICEcoder["tabsIndent"] ? 'true' : 'false';?>;
|
||||
openLastFiles = <?php echo $ICEcoder["openLastFiles"] ? 'true' : 'false';?>;
|
||||
tabWidth = <?php echo $ICEcoder["tabWidth"]; ?>;
|
||||
<?php
|
||||
echo 'iceRoot = "'.$ICEcoder["root"].'";'.PHP_EOL;
|
||||
?>
|
||||
iceRoot = "<?php echo $ICEcoder["root"]; ?>";
|
||||
|
||||
window.onbeforeunload = function() {
|
||||
for (var i=0; i<=top.ICEcoder.changedContent.length; i++) {
|
||||
if (top.ICEcoder.changedContent[i]==1) {
|
||||
return "You have some unsaved changes.";
|
||||
}
|
||||
if (top.ICEcoder.changedContent.indexOf(1)>-1) {
|
||||
return "You have some unsaved changes.";
|
||||
}
|
||||
}
|
||||
|
||||
previousFiles = [<?php
|
||||
if ($ICEcoder["previousFiles"]!="" && $_SESSION['userLevel'] == 10) {
|
||||
$openFilesArray = explode(",",$ICEcoder["previousFiles"]);
|
||||
for ($i=0;$i<count($openFilesArray);$i++) {
|
||||
echo "'".$openFilesArray[$i]."'";
|
||||
if ($i<count($openFilesArray)-1) {echo ",";};
|
||||
}
|
||||
echo "'".implode("','",$openFilesArray)."'";
|
||||
}
|
||||
?>];
|
||||
showFileMenu = function() {
|
||||
document.getElementById('fileMenu').style.display='inline-block';
|
||||
}
|
||||
</script>
|
||||
<script language="JavaScript" src="lib/coder.js"></script>
|
||||
</head>
|
||||
|
||||
<body onLoad="ICEcoder.init(<?php if ($_SESSION['userLevel'] == 10) {echo "'login'";} ?>)<?php echo $onLoadExtras;?>" onResize="ICEcoder.setLayout()" onKeyDown="return ICEcoder.interceptKeys('coder', event);" onKeyUp="parent.ICEcoder.resetKeys(event);">
|
||||
<body onLoad="ICEcoder.init(<?php
|
||||
if ($_SESSION['userLevel'] == 10) {echo "'login'";};
|
||||
echo ")".$updateMsg.$onLoadExtras;
|
||||
?>" onResize="ICEcoder.setLayout()" onKeyDown="return ICEcoder.interceptKeys('coder',event);" onKeyUp="parent.ICEcoder.resetKeys(event);">
|
||||
|
||||
<div id="blackMask" class="blackMask" onClick="ICEcoder.showHide('hide',this)">
|
||||
<div class="popupVCenter">
|
||||
@@ -70,7 +67,7 @@ previousFiles = [<?php
|
||||
</div>
|
||||
|
||||
<div id="loadingMask" class="blackMask" style="visibility: visible">
|
||||
<span class="progressBar"></span>
|
||||
<span class="progressBar" id="progressBar" style="-webkit-animation:fullexpand 10s ease-out; -moz-animation:fullexpand 10s ease-out"></span>
|
||||
<div class="popupVCenter">
|
||||
<div class="popup">
|
||||
<div class="circleOutside"></div>
|
||||
@@ -82,23 +79,23 @@ previousFiles = [<?php
|
||||
|
||||
<div id="fileMenu" class="fileMenu" onMouseOver="ICEcoder.changeFilesW('expand')" onMouseOut="ICEcoder.changeFilesW('contract');this.style.display='none'">
|
||||
<span id="folderMenuItems">
|
||||
<a href="javascript:top.ICEcoder.newFile()" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">New File</a>
|
||||
<a href="javascript:top.ICEcoder.newFolder()" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">New Folder</a>
|
||||
<a href="javascript:top.ICEcoder.newFile()" onMouseOver="showFileMenu()">New File</a>
|
||||
<a href="javascript:top.ICEcoder.newFolder()" onMouseOver="showFileMenu()">New Folder</a>
|
||||
</span>
|
||||
<a href="javascript:top.ICEcoder.deleteFile(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">Delete</a>
|
||||
<a href="javascript:top.ICEcoder.deleteFile(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">Delete</a>
|
||||
<span id="singleFileMenuItems">
|
||||
<a href="javascript:top.ICEcoder.renameFile(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">Rename</a>
|
||||
<a href="javascript:window.open(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">View Webpage</a>
|
||||
<a href="javascript:top.ICEcoder.renameFile(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">Rename</a>
|
||||
<a href="javascript:window.open(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">View Webpage</a>
|
||||
</span>
|
||||
<a href="javascript:top.ICEcoder.zipIt(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">Zip It!</a>
|
||||
<a href="javascript:top.ICEcoder.propertiesScreen(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">Properties</a>
|
||||
<a href="javascript:top.ICEcoder.zipIt(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">Zip It!</a>
|
||||
<a href="javascript:top.ICEcoder.propertiesScreen(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">Properties</a>
|
||||
</div>
|
||||
|
||||
<div id="header" class="header" onContextMenu="return false">
|
||||
<div class="plugins" id="pluginsContainer">
|
||||
<?php echo $pluginsDisplay; ?>
|
||||
</div>
|
||||
<div class="version"><?php echo $ICEcoder["versionNo"];?></div><img src="images/full-screen.gif" id="screenMode" class="screenModeIcon" onClick="top.ICEcoder.fullScreenSwitcher()">
|
||||
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div><img src="images/full-screen.gif" id="screenMode" class="screenModeIcon" onClick="top.ICEcoder.fullScreenSwitcher()">
|
||||
<img src="images/ice-coder.png" class="logo" onClick="ICEcoder.helpScreen()" onContextMenu="ICEcoder.settingsScreen()">
|
||||
</div>
|
||||
|
||||
@@ -113,15 +110,15 @@ previousFiles = [<?php
|
||||
</div>
|
||||
</div>
|
||||
<div class="accountOptions">
|
||||
<div title="Save" onClick="ICEcoder.fMIcon('save')" id="fMSave" style="width: 30px; height: 32px; opacity: 0.3"></div>
|
||||
<div title="Open" onClick="ICEcoder.fMIcon('open')" id="fMOpen" style="width: 25px; height: 32px; background-position: -32px -3px; margin: 3px 0 0 7px; opacity: 0.3"></div>
|
||||
<div title="New File" onClick="ICEcoder.fMIcon('newFile')" id="fMNewFile" style="width: 15px; height: 16px; background-position: -64px 0; margin: 8px 0 0 10px; opacity: 0.3"></div>
|
||||
<div title="New Folder" onClick="ICEcoder.fMIcon('newFolder')" id="fMNewFolder" style="width: 20px; height: 16px; background-position: -80px 0; margin: 8px 0 0 5px; opacity: 0.3"></div>
|
||||
<div title="Delete" onClick="ICEcoder.fMIcon('delete')" id="fMDelete" style="width: 16px; height: 16px; background-position: -100px 0; margin: 8px 0 0 5px; opacity: 0.3"></div>
|
||||
<div title="Rename" onClick="ICEcoder.fMIcon('rename')" id="fMRename" style="width: 16px; height: 16px; background-position: -116px 0; margin: 8px 0 0 5px; opacity: 0.3"></div>
|
||||
<div title="View" onClick="ICEcoder.fMIcon('view')" id="fMView" style="width: 16px; height: 16px; background-position: -132px 0; margin: 8px 0 0 5px; opacity: 0.3"></div>
|
||||
<div title="Save" onClick="ICEcoder.fMIcon('save')" id="fMSave" class="save"></div>
|
||||
<div title="Open" onClick="ICEcoder.fMIcon('open')" id="fMOpen" class="open"></div>
|
||||
<div title="New File" onClick="ICEcoder.fMIcon('newFile')" id="fMNewFile" class="newFile"></div>
|
||||
<div title="New Folder" onClick="ICEcoder.fMIcon('newFolder')" id="fMNewFolder" class="newFolder"></div>
|
||||
<div title="Delete" onClick="ICEcoder.fMIcon('delete')" id="fMDelete" class="delete"></div>
|
||||
<div title="Rename" onClick="ICEcoder.fMIcon('rename')" id="fMRename" class="rename"></div>
|
||||
<div title="View" onClick="ICEcoder.fMIcon('view')" id="fMView" class="view"></div>
|
||||
|
||||
<div title="Lock" onClick="ICEcoder.lockUnlockNav()" id="fmLock" style="position: relative; margin-left: 208px; margin-top: -27px; width: 12px; height: 16px; background-position: -64px -16px; z-index: 1"></div>
|
||||
<div title="Lock" onClick="ICEcoder.lockUnlockNav()" id="fmLock" class="lock"></div>
|
||||
</div>
|
||||
</div>
|
||||
<iframe id="filesFrame" class="frame" name="ff" src="files.php" style="opacity: 0" onLoad="this.style.opacity='1'"></iframe>
|
||||
@@ -132,7 +129,7 @@ previousFiles = [<?php
|
||||
<div id="tabsBar" class="tabsBar" onContextMenu="return false">
|
||||
<?php
|
||||
for ($i=1;$i<=10;$i++) {
|
||||
echo '<div id="tab'.$i.'" class="tab" draggable="true" onClick="if(ICEcoder.canSwitchTabs) {ICEcoder.switchTab('.$i.')} else {ICEcoder.canSwitchTabs=true}"></div>';
|
||||
echo '<div id="tab'.$i.'" class="tab" draggable="true" onClick="ICEcoder.canSwitchTabs ? ICEcoder.switchTab('.$i.') : ICEcoder.canSwitchTabs=true"></div>';
|
||||
}
|
||||
?><div class="newTab" onClick="ICEcoder.newTab()"><img src="images/nav-new.png"></div>
|
||||
</div>
|
||||
|
||||
@@ -55,9 +55,7 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
100% { -webkit-transform:rotate(-360deg);}
|
||||
}
|
||||
|
||||
.progressBar {top: 0; left: 0; width:100%; height:1px; margin:2px 0; background:#2187e7; position:absolute; box-shadow:0 0 10px 1px rgba(0,198,255,0.7);
|
||||
-moz-animation:fullexpand 10s ease-out; -webkit-animation:fullexpand 10s ease-out;
|
||||
}
|
||||
.progressBar {top: 0; left: 0; width:100%; height:1px; margin:2px 0; background:#2187e7; position:absolute; box-shadow:0 0 10px 1px rgba(0,198,255,0.7)}
|
||||
@-moz-keyframes fullexpand {
|
||||
0% { width:0;}
|
||||
100%{ width:100%;}
|
||||
@@ -74,7 +72,7 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
.header .version {position: relative; display: inline-block; margin-top: 25px; font-size: 10px; color: #bbb}
|
||||
.header .logo {position: relative; margin: 5px 10px 0 5px; cursor: pointer}
|
||||
|
||||
.files {position: absolute; display: inline-block; top: 0; left: 0; height: 100%; width: 250px; background-color: #444; background-image: url('../images/files-arrow.gif'); background-repeat: no-repeat; background-position: 100% 50%; overflow: hidden; z-index: 1;
|
||||
.files {position: absolute; display: inline-block; top: 0; left: 0; height: 100%; width: 250px; background-color: #444; background-image: url('../images/files-arrow.png'); background-repeat: no-repeat; background-position: 100% 50%; overflow: hidden; z-index: 1;
|
||||
box-shadow: 0 0 10px 4px rgba(0,0,0,0.4);
|
||||
}
|
||||
.files .account {display: inline-block; height: 50px; width: 250px; margin-top: 40px; background-color: #888}
|
||||
@@ -87,6 +85,14 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
.files .accountOptions {position: relative; height: 32px; width: 100%; margin-left: 15px; margin-top: 8px}
|
||||
.files .accountOptions div {display: inline-block; background: url('../images/file-manager-icons.png') 0 0 no-repeat; cursor: pointer}
|
||||
.files .accountPassword {position: relative; border: 0; background-color: #333; color: #fff; height: 18px; width: 140px; margin-left: 14px; margin-top: 16px}
|
||||
.files .accountOptions .save {width: 30px; height: 32px; opacity: 0.3}
|
||||
.files .accountOptions .open {width: 25px; height: 32px; background-position: -32px -3px; margin: 3px 0 0 7px; opacity: 0.3}
|
||||
.files .accountOptions .newFile {width: 15px; height: 16px; background-position: -64px 0; margin: 8px 0 0 10px; opacity: 0.3}
|
||||
.files .accountOptions .newFolder {width: 20px; height: 16px; background-position: -80px 0; margin: 8px 0 0 5px; opacity: 0.3}
|
||||
.files .accountOptions .delete {width: 16px; height: 16px; background-position: -100px 0; margin: 8px 0 0 5px; opacity: 0.3}
|
||||
.files .accountOptions .rename {width: 16px; height: 16px; background-position: -116px 0; margin: 8px 0 0 5px; opacity: 0.3}
|
||||
.files .accountOptions .view {width: 16px; height: 16px; background-position: -132px 0; margin: 8px 0 0 5px; opacity: 0.3}
|
||||
.files .accountOptions .lock {position: relative; margin-left: 208px; margin-top: -27px; width: 12px; height: 16px; background-position: -64px -16px; z-index: 1}
|
||||
.files input:focus, .findReplace input:focus, .findReplace select:focus, .accountPassword:focus {outline: none; box-shadow: 0 0 10px 1px rgba(0,198,255,0.7)}
|
||||
.files .button {position: absolute; border: 0; background: #444; color: #eee; height:20px; margin-top: 16px; margin-left: 5px; font-size: 11px; cursor: pointer}
|
||||
.files .button:hover {background-color: #222; color: #eee}
|
||||
@@ -100,13 +106,13 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
|
||||
.editor {position: absolute; display: inline-block; top: 0; left: 15px; width: 2400px}
|
||||
.editor .tabsBar {display: inline-block; height: 22px; width: 2400px; margin-top: 40px; padding-left: 41px; background-color: #888;}
|
||||
.tabsBar .tab {display: inline-block; display: none; background-image: url('../images/nav-bg.gif'); background-repeat: repeat-x; background-position: 0 0; padding: 5px 8px 2px 8px; font-size: 10px; border-left: solid 1px #fff; border-right: solid 1px #777; color: #fff; cursor: pointer;
|
||||
.tabsBar .tab {display: inline-block; display: none; background-image: url('../images/nav-bg.jpg'); background-repeat: repeat-x; background-position: 0 0; padding: 5px 8px 2px 8px; font-size: 10px; border-left: solid 1px #fff; border-right: solid 1px #777; color: #fff; cursor: pointer;
|
||||
-webkit-transition: all 0.15s;
|
||||
-moz-transition: all 0.15s;
|
||||
transition: all 0.15s;
|
||||
}
|
||||
.tabsBar .tab .closeTab {margin: 1px 0 0 5px; border-radius: 6px}
|
||||
.tabsBar .newTab {display: inline-block; background-image: url('../images/nav-bg.gif'); background-repeat: repeat-x; background-position: 0 0; padding: 6px 5px 1px 5px; border-left: solid 1px #fff; border-right: solid 1px #777; cursor: pointer;}
|
||||
.tabsBar .newTab {display: inline-block; background-image: url('../images/nav-bg.jpg'); background-repeat: repeat-x; background-position: 0 0; padding: 6px 5px 1px 5px; border-left: solid 1px #fff; border-right: solid 1px #777; cursor: pointer;}
|
||||
.editor .findBar {display: inline-block; height: 28px; width: 2400px; color: #fff; background-color: #141414}
|
||||
.findBar .findReplace {position: absolute; z-index: 1}
|
||||
.findReplace select {position: relative; font-size: 10px; margin: 8px 2px 0 2px; top: -2px;}
|
||||
|
||||
129
lib/coder.js
@@ -91,10 +91,12 @@ var ICEcoder = {
|
||||
|
||||
// Resize the CodeMirror instances to match the window size
|
||||
cMCSS = ICEcoder.content.contentWindow.document.styleSheets[2];
|
||||
strCSS = cMCSS.rules ? 'rules' : 'cssRules';
|
||||
for(var i=0;i<cMCSS[strCSS].length;i++) {
|
||||
if(cMCSS[strCSS][i].selectorText==".CodeMirror-scroll") {
|
||||
cMCSS[strCSS][i].style['height'] = ICEcoder.content.style.height;
|
||||
if (cMCSS) {
|
||||
strCSS = cMCSS.rules ? 'rules' : 'cssRules';
|
||||
for(var i=0;i<cMCSS[strCSS].length;i++) {
|
||||
if(cMCSS[strCSS][i].selectorText==".CodeMirror-scroll") {
|
||||
cMCSS[strCSS][i].style['height'] = ICEcoder.content.style.height;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -250,6 +252,36 @@ var ICEcoder = {
|
||||
top.ICEcoder.ctrlKeyDown = false;
|
||||
return false;
|
||||
|
||||
// CTRL+right arrow (Next tab)
|
||||
} else if(key==39 && top.ICEcoder.ctrlKeyDown==true && area!="content") {
|
||||
top.ICEcoder.nextTab();
|
||||
return false;
|
||||
|
||||
// CTRL+left arrow (Previous tab)
|
||||
} else if(key==37 && top.ICEcoder.ctrlKeyDown==true && area!="content") {
|
||||
top.ICEcoder.previousTab();
|
||||
return false;
|
||||
|
||||
// CTRL+up arrow (Move line up)
|
||||
} else if(key==38 && top.ICEcoder.ctrlKeyDown==true && area=="content") {
|
||||
top.ICEcoder.moveLineUp();
|
||||
return false;
|
||||
|
||||
// CTRL+down arrow (Move line down)
|
||||
} else if(key==40 && top.ICEcoder.ctrlKeyDown==true && area=="content") {
|
||||
top.ICEcoder.moveLineDown();
|
||||
return false;
|
||||
|
||||
// CTRL+numeric plus (New tab)
|
||||
} else if(key==107 && top.ICEcoder.ctrlKeyDown==true) {
|
||||
top.ICEcoder.newTab();
|
||||
return false;
|
||||
|
||||
// CTRL+numeric minus (Close tab)
|
||||
} else if(key==109 && top.ICEcoder.ctrlKeyDown==true) {
|
||||
top.ICEcoder.closeTab(top.ICEcoder.selectedTab);
|
||||
return false;
|
||||
|
||||
// CTRL+S (Save), CTRL+Shift+S (Save As)
|
||||
} else if(key==83 && top.ICEcoder.ctrlKeyDown==true) {
|
||||
if(top.ICEcoder.shiftKeyDown==true) {
|
||||
@@ -341,7 +373,7 @@ var ICEcoder = {
|
||||
},
|
||||
|
||||
// Change tabs by switching visibility of instances
|
||||
switchTab: function(newTab) {
|
||||
switchTab: function(newTab,noFocus) {
|
||||
var cM;
|
||||
|
||||
// Identify tab that's currently selected & get the instance
|
||||
@@ -360,7 +392,7 @@ var ICEcoder = {
|
||||
cM.getWrapperElement().style.display = "block";
|
||||
|
||||
// Focus on & refresh our selected instance
|
||||
cM.focus();
|
||||
if (!noFocus) {cM.focus();}
|
||||
cM.refresh();
|
||||
|
||||
// Highlight the selected tab
|
||||
@@ -403,6 +435,7 @@ var ICEcoder = {
|
||||
|
||||
ICEcoder.cMInstances.push(ICEcoder.nextcMInstance);
|
||||
ICEcoder.selectedTab = ICEcoder.cMInstances.length;
|
||||
ICEcoder.content.style.visibility='visible';
|
||||
ICEcoder.content.contentWindow.createNewCMInstance(ICEcoder.nextcMInstance);
|
||||
|
||||
ICEcoder.thisFileFolderType='file';
|
||||
@@ -439,6 +472,22 @@ var ICEcoder = {
|
||||
top.ICEcoder.setPreviousFiles();
|
||||
},
|
||||
|
||||
// Cycle to next tab
|
||||
nextTab: function() {
|
||||
var goToTab;
|
||||
|
||||
goToTab = top.ICEcoder.selectedTab+1 <= top.ICEcoder.openFiles.length ? top.ICEcoder.selectedTab+1 : 1;
|
||||
top.ICEcoder.switchTab(goToTab,'noFocus');
|
||||
},
|
||||
|
||||
// Cycle to next tab
|
||||
previousTab: function() {
|
||||
var goToTab;
|
||||
|
||||
goToTab = top.ICEcoder.selectedTab-1 >= 1 ? top.ICEcoder.selectedTab-1 : top.ICEcoder.openFiles.length;
|
||||
top.ICEcoder.switchTab(goToTab,'noFocus');
|
||||
},
|
||||
|
||||
// Create a new tab for a file
|
||||
renameTab: function(tabNum,newName) {
|
||||
var closeTabLink;
|
||||
@@ -863,6 +912,36 @@ var ICEcoder = {
|
||||
elem.style.visibility = doVis=="show" ? 'visible' : 'hidden';
|
||||
},
|
||||
|
||||
// Move current line upwards
|
||||
moveLineUp: function() {
|
||||
var cM, line, ch, prevLine;
|
||||
|
||||
cM = top.ICEcoder.getcMInstance();
|
||||
line = cM.getCursor().line;
|
||||
ch = cM.getCursor().ch;
|
||||
if (line>0) {
|
||||
prevLine = cM.getLine(line-1);
|
||||
cM.setLine(line-1,cM.getLine(line));
|
||||
cM.setLine(line,prevLine);
|
||||
cM.setCursor(line-1,ch);
|
||||
}
|
||||
},
|
||||
|
||||
// Move current line downwards
|
||||
moveLineDown: function() {
|
||||
var cM, line, ch, nextLine;
|
||||
|
||||
cM = top.ICEcoder.getcMInstance();
|
||||
line = cM.getCursor().line;
|
||||
ch = cM.getCursor().ch;
|
||||
if (line<cM.lineCount()-1) {
|
||||
nextLine = cM.getLine(line+1);
|
||||
cM.setLine(line+1,cM.getLine(line));
|
||||
cM.setLine(line,nextLine);
|
||||
cM.setCursor(line+1,ch);
|
||||
}
|
||||
},
|
||||
|
||||
// Update find & replace options based on user selection
|
||||
findReplaceOptions: function() {
|
||||
top.document.getElementById('rText').style.display =
|
||||
@@ -923,6 +1002,7 @@ var ICEcoder = {
|
||||
lineCount=1;
|
||||
numChars=0;
|
||||
|
||||
// Count the no of chars & lines previous to our cursor's line
|
||||
for (var i=0;i<content.length;i++) {
|
||||
if (content.indexOf('\n',i)==i && lineCount<=cM.getCursor().line) {
|
||||
lineCount++;
|
||||
@@ -930,7 +1010,7 @@ var ICEcoder = {
|
||||
}
|
||||
}
|
||||
|
||||
charsToCursor = numChars+cM.getCursor().ch;
|
||||
charsToCursor = numChars+cM.getCursor().ch+1;
|
||||
ICEcoder.findResult = 0;
|
||||
for (var i=0;i<ICEcoder.results.length;i++) {
|
||||
if (ICEcoder.results[i]<charsToCursor) {
|
||||
@@ -940,15 +1020,16 @@ var ICEcoder = {
|
||||
|
||||
if (ICEcoder.findResult>ICEcoder.results.length-1) {ICEcoder.findResult=0};
|
||||
parent.parent.document.getElementById('results').innerHTML = "Highlighted result "+(ICEcoder.findResult+1)+" of "+ICEcoder.results.length+" results";
|
||||
lineCount=0;
|
||||
|
||||
lineCount=0;
|
||||
for (var i=0;i<ICEcoder.results[ICEcoder.findResult];i++) {
|
||||
if (content.indexOf('\n',i)==i) {
|
||||
lineCount++;
|
||||
numChars=i;
|
||||
}
|
||||
}
|
||||
|
||||
charCount = ICEcoder.results[ICEcoder.findResult];
|
||||
charCount = ICEcoder.results[ICEcoder.findResult] - numChars - 1;
|
||||
startPos = new Object();
|
||||
startPos.line = lineCount;
|
||||
startPos.ch = charCount;
|
||||
@@ -957,7 +1038,6 @@ var ICEcoder = {
|
||||
document.findAndReplace.connector.value=="and" && document.findAndReplace.replaceAction.value=="replace all" && buttonClick
|
||||
? endPos.ch = charCount+replaceLen
|
||||
: endPos.ch = charCount+findLen;
|
||||
|
||||
// Finally, highlight our selection
|
||||
cM = ICEcoder.getcMInstance();
|
||||
cM.setSelection(startPos, endPos);
|
||||
@@ -1457,15 +1537,24 @@ var ICEcoder = {
|
||||
|
||||
// Opens the last files we had open
|
||||
autoOpenFiles: function() {
|
||||
var loadFileURL;
|
||||
|
||||
for (var i=0;i<=top.previousFiles.length-1;i++) {
|
||||
top.ICEcoder.rightClickedFile=top.ICEcoder.thisFileFolderLink=top.previousFiles[i].replace('|','/');
|
||||
top.ICEcoder.thisFileFolderType='file';
|
||||
top.ICEcoder.openFile();
|
||||
loadFileURL = top.previousFiles[i].replace(/\|/g, "/").replace(top.docRoot+top.iceRoot,"");
|
||||
if (top.ICEcoder.openFiles.indexOf(loadFileURL)==-1) {
|
||||
top.ICEcoder.rightClickedFile=top.ICEcoder.thisFileFolderLink=top.previousFiles[i].replace('|','/');
|
||||
top.ICEcoder.thisFileFolderType='file';
|
||||
top.ICEcoder.openFile();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// Refresh file manager on demand
|
||||
refreshFileManager: function(loginAttempt) {
|
||||
top.document.getElementById('progressBar').style.webkitAnimation = top.document.getElementById('progressBar').style.mozAnimation = '';
|
||||
setTimeout(function () {
|
||||
top.document.getElementById('progressBar').style.webkitAnimation = top.document.getElementById('progressBar').style.mozAnimation = 'fullexpand 10s ease-out';
|
||||
}, 4);
|
||||
top.document.getElementById('loadingMask').style.visibility = "visible";
|
||||
top.ICEcoder.filesFrame.src="files.php";
|
||||
top.ICEcoder.filesFrame.style.opacity="0";
|
||||
@@ -1498,7 +1587,7 @@ var ICEcoder = {
|
||||
|
||||
// Show the help screen
|
||||
helpScreen: function() {
|
||||
top.document.getElementById('mediaContainer').innerHTML = '<iframe src="lib/help.php" class="whiteGlow" style="width: 400px; height: 400px"></iframe>';
|
||||
top.document.getElementById('mediaContainer').innerHTML = '<iframe src="lib/help.php" class="whiteGlow" style="width: 400px; height: 500px"></iframe>';
|
||||
top.ICEcoder.showHide('show',top.document.getElementById('blackMask'));
|
||||
},
|
||||
|
||||
@@ -1510,7 +1599,7 @@ var ICEcoder = {
|
||||
|
||||
// Update the settings used when we make a change to them
|
||||
useNewSettings: function(themeURL,tabsIndent,codeAssist,lockedNav,visibleTabs,tabWidth,refreshFM) {
|
||||
var styleNode, strCSS, cMCSS;
|
||||
var styleNode, strCSS, cMCSS, activeLineBG;
|
||||
|
||||
// Add new stylesheet for selected theme
|
||||
top.theme = themeURL.slice(themeURL.lastIndexOf("/")+1,themeURL.lastIndexOf("."));
|
||||
@@ -1520,6 +1609,7 @@ var ICEcoder = {
|
||||
styleNode.setAttribute('type', 'text/css');
|
||||
styleNode.setAttribute('href', themeURL);
|
||||
top.ICEcoder.content.contentWindow.document.getElementsByTagName('head')[0].appendChild(styleNode);
|
||||
activeLineBG = top.theme=="eclipse"||top.theme=="elegant"||top.theme=="neat" ? "#ccc": "#000";
|
||||
top.ICEcoder.switchTab(top.ICEcoder.selectedTab);
|
||||
|
||||
// Tabs indent setting
|
||||
@@ -1538,6 +1628,7 @@ var ICEcoder = {
|
||||
cMCSS = ICEcoder.content.contentWindow.document.styleSheets[2];
|
||||
strCSS = cMCSS.rules ? 'rules' : 'cssRules';
|
||||
cMCSS[strCSS][5].style['content'] = visibleTabs ? '"\\21e5"' : '" "';
|
||||
cMCSS[strCSS][2].style.cssText = "background: " + activeLineBG + " !important";
|
||||
|
||||
top.tabWidth = tabWidth;
|
||||
for (var i=0;i<ICEcoder.cMInstances.length;i++) {
|
||||
@@ -1590,7 +1681,7 @@ var ICEcoder = {
|
||||
document.mozFullScreen ? document.mozCancelFullScreen() : document.body.mozRequestFullScreen();
|
||||
// Chrome specific
|
||||
} else if ("undefined" != typeof document.webkitCancelFullScreen) {
|
||||
document.webkitIsFullScreen ? document.webkitCancelFullScreen() : document.body.webkitRequestFullScreen();
|
||||
document.webkitIsFullScreen ? document.webkitCancelFullScreen() : document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
|
||||
}
|
||||
|
||||
screenIcon.src = screenIcon.src.indexOf("images/full-screen.gif") > -1 ? "images/restored-screen.gif" : "images/full-screen.gif";
|
||||
@@ -1668,5 +1759,11 @@ var ICEcoder = {
|
||||
// Get the users input
|
||||
getInput: function(question,defaultValue) {
|
||||
return prompt(question,defaultValue);
|
||||
},
|
||||
|
||||
// Replace text in a file
|
||||
replaceInFile: function(fileRef,find,replace) {
|
||||
top.ICEcoder.serverQueue("add","lib/file-control.php?action=replaceText&fileRef="+fileRef.replace(/\//g,"|")+"&find="+find+"&replace="+replace);
|
||||
top.ICEcoder.serverMessage('<b>Replacing text in</b><br>'+fileRef);
|
||||
}
|
||||
};
|
||||
@@ -2,19 +2,21 @@
|
||||
$ICEcoder = array(
|
||||
"root" => "",
|
||||
"tabsIndent" => true,
|
||||
"checkUpdates" => false,
|
||||
"checkUpdates" => true,
|
||||
"openLastFiles" => true,
|
||||
"findFilesExclude" => array("_coder",".doc",".gif",".jpg",".jpeg",".pdf",".png",".swf",".xml",".zip"),
|
||||
"codeAssist" => true,
|
||||
"visibleTabs" => false,
|
||||
"lockedNav" => true,
|
||||
"accountPassword" => "",
|
||||
"restrictedFiles" => array("wp-",".php",".rb",".sql"),
|
||||
"restrictedFiles" => array("wp-",".php",".rb",".sql",".zip"),
|
||||
"bannedFiles" => array("_coder","wp-",".exe"),
|
||||
"allowedIPs" => array("*"),
|
||||
"plugins" => array(
|
||||
array("Database Admin","images/database.png","margin-top: 3px","plugins/adminer/adminer-3.4.0-mysql-en.php","_blank",""),
|
||||
array("Zip It!","images/zip-it.png","margin-top: 3px","plugins/zip-it/?zip=|&exclude=*.doc*.gif*.jpg*.jpeg*.pdf*.png*.swf*.xml*.zip","fileControl:<b>Zipping Files</b>","30")
|
||||
array("Adminer","plugins/adminer/icon.png","margin-top: 3px","plugins/adminer/adminer-3.4.0-mysql-en.php","_blank",""),
|
||||
array("Zip It!","plugins/zip-it/icon.png","margin-top: 3px; margin-left: 3px","plugins/zip-it/?zip=|&exclude=*.doc*.gif*.jpg*.jpeg*.pdf*.png*.swf*.xml*.zip","fileControl:<b>Zipping Files</b>","30"),
|
||||
array("ICErepo","plugins/ice-repo/icon.png","margin-top: 3px","plugins/ice-repo","_blank",""),
|
||||
array("Dochub","plugins/dochub/icon.png","margin-top: 3px","http://dochub.io","_blank","")
|
||||
),
|
||||
"theme" => "default",
|
||||
"tabWidth" => 4,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* ICE coder default theme: Based VERY loosely on Monokai */
|
||||
|
||||
.cm-s-icecoder {font-size: 12px; color: #666; background: #1c1c19;}
|
||||
.cm-s-icecoder {color: #666; background: #1c1c19;}
|
||||
|
||||
.cm-s-icecoder span.cm-keyword {color: #f8f8f8; font-weight:bold;}
|
||||
.cm-s-icecoder span.cm-atom {color: #ae81ff;}
|
||||
|
||||
@@ -87,6 +87,27 @@ if ($_GET['action']=="rename") {
|
||||
echo '<script>top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);</script>';
|
||||
}
|
||||
|
||||
// If we're due to replace text in a file...
|
||||
if ($_GET['action']=="replaceText") {
|
||||
if ($_SESSION['userLevel'] > 0 && is_writable(str_replace("|","/",strClean($_GET['fileRef'])))) {
|
||||
$file = str_replace("|","/",strClean($_GET['fileRef']));
|
||||
$loadedFile = file_get_contents($file);
|
||||
$newContent = str_replace(strClean($_GET['find']),strClean($_GET['replace']),$loadedFile);
|
||||
$fh = fopen($file, 'w') or die("Sorry, cannot save");
|
||||
fwrite($fh, $newContent);
|
||||
fclose($fh);
|
||||
echo '<script>action="replaceText";</script>';
|
||||
} else {
|
||||
if (!is_writable(str_replace("|","/",strClean($_GET['fileRef'])))) {
|
||||
echo "<script>top.ICEcoder.message('Sorry, cannot replace text in\\n".strClean($_GET['fileRef'])."');</script>";
|
||||
} else {
|
||||
echo '<script>top.ICEcoder.message(\'Sorry, you need to be logged in to rename\');</script>';
|
||||
}
|
||||
echo '<script>action="nothing";</script>';
|
||||
}
|
||||
echo '<script>top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);</script>';
|
||||
}
|
||||
|
||||
// If we're due to change permissions on a file/folder...
|
||||
if ($_GET['action']=="perms") {
|
||||
if ($_SESSION['userLevel'] > 0 && is_writable($file)) {
|
||||
@@ -209,30 +230,38 @@ if ($_GET['action']=="save") {
|
||||
<script>
|
||||
if (action=="load") {
|
||||
if (fileType=="text") {
|
||||
top.ICEcoder.loadingFile = true;
|
||||
// Reset the various states back to their initial setting
|
||||
selectedTab = top.ICEcoder.openFiles.length; // The tab that's currently selected
|
||||
setTimeout(function() {
|
||||
if (!top.ICEcoder.content.contentWindow.createNewCMInstance) {
|
||||
console.log('There was tech hiccup, likely something wasn\'t quite ready. So ICEcoder reloaded it\'s file control again.');
|
||||
window.location.reload();
|
||||
} else {
|
||||
top.ICEcoder.loadingFile = true;
|
||||
// Reset the various states back to their initial setting
|
||||
selectedTab = top.ICEcoder.openFiles.length; // The tab that's currently selected
|
||||
|
||||
// Finally, store all data, show tabs etc
|
||||
top.ICEcoder.createNewTab();
|
||||
top.ICEcoder.cMInstances.push(top.ICEcoder.nextcMInstance);
|
||||
window.onload=top.ICEcoder.content.contentWindow.createNewCMInstance(top.ICEcoder.nextcMInstance);
|
||||
// Finally, store all data, show tabs etc
|
||||
top.ICEcoder.createNewTab();
|
||||
top.ICEcoder.cMInstances.push(top.ICEcoder.nextcMInstance);
|
||||
top.ICEcoder.setLayout();
|
||||
top.ICEcoder.content.contentWindow.createNewCMInstance(top.ICEcoder.nextcMInstance);
|
||||
|
||||
// Set the value & innerHTML of the code textarea to that of our loaded file plus make it visible (it's hidden on _coder's load)
|
||||
top.ICEcoder.switchMode();
|
||||
cM = top.ICEcoder.getcMInstance();
|
||||
cM.setValue(document.getElementById('loadedFile').value);
|
||||
top.document.getElementById('content').style.visibility='visible';
|
||||
top.ICEcoder.switchTab(top.ICEcoder.selectedTab);
|
||||
cM.focus();
|
||||
// Set the value & innerHTML of the code textarea to that of our loaded file plus make it visible (it's hidden on _coder's load)
|
||||
top.ICEcoder.switchMode();
|
||||
cM = top.ICEcoder.getcMInstance();
|
||||
cM.setValue(document.getElementById('loadedFile').value);
|
||||
top.document.getElementById('content').style.visibility='visible';
|
||||
top.ICEcoder.switchTab(top.ICEcoder.selectedTab);
|
||||
cM.focus();
|
||||
|
||||
// Then clean it up, set the text cursor, update the display and get the character data
|
||||
top.ICEcoder.contentCleanUp();
|
||||
top.ICEcoder.content.contentWindow['cM'+top.ICEcoder.cMInstances[top.ICEcoder.selectedTab-1]].setLineClass(top.ICEcoder['cMActiveLine'+top.ICEcoder.selectedTab], null);
|
||||
top.ICEcoder['cMActiveLine'+top.ICEcoder.selectedTab] = top.ICEcoder.content.contentWindow['cM'+top.ICEcoder.cMInstances[top.ICEcoder.selectedTab-1]].setLineClass(0, "cm-s-activeLine");
|
||||
top.ICEcoder.nextcMInstance++;
|
||||
top.ICEcoder.openFileMDTs.push('<?php echo filemtime($file); ?>');
|
||||
top.ICEcoder.loadingFile = false;
|
||||
// Then clean it up, set the text cursor, update the display and get the character data
|
||||
top.ICEcoder.contentCleanUp();
|
||||
top.ICEcoder.content.contentWindow['cM'+top.ICEcoder.cMInstances[top.ICEcoder.selectedTab-1]].setLineClass(top.ICEcoder['cMActiveLine'+top.ICEcoder.selectedTab], null);
|
||||
top.ICEcoder['cMActiveLine'+top.ICEcoder.selectedTab] = top.ICEcoder.content.contentWindow['cM'+top.ICEcoder.cMInstances[top.ICEcoder.selectedTab-1]].setLineClass(0, "cm-s-activeLine");
|
||||
top.ICEcoder.nextcMInstance++;
|
||||
top.ICEcoder.openFileMDTs.push('<?php echo filemtime($file); ?>');
|
||||
top.ICEcoder.loadingFile = false;
|
||||
}
|
||||
},4);
|
||||
}
|
||||
|
||||
if (fileType=="image") {
|
||||
|
||||
@@ -16,11 +16,17 @@
|
||||
<span class="key">Delete</span> <span class="shortcut">Delete file</span><br><br>
|
||||
|
||||
<h2>Within document</h2>
|
||||
<span class="key">CTRL <span class="plus">+</span> ↑</span> <span class="shortcut">Move line up</span><br>
|
||||
<span class="key">CTRL <span class="plus">+</span> ↓</span> <span class="shortcut">Move line down</span><br>
|
||||
<span class="key">CTRL <span class="plus">+</span> I</span> <span class="shortcut">Search selected text</span><br>
|
||||
<span class="key">Esc</span> <span class="shortcut">Comment / uncomment text</span><br>
|
||||
<span class="key">Tab</span> <span class="shortcut">Insert tab / indent selected text</span><br><br>
|
||||
|
||||
<h2>Anywhere</h2>
|
||||
<span class="key">CTRL <span class="plus">+</span> →</span> <span class="shortcut">Next tab</span><br>
|
||||
<span class="key">CTRL <span class="plus">+</span> ←</span> <span class="shortcut">Previous tab</span><br>
|
||||
<span class="key">CTRL <span class="plus">+</span> +</span> <span class="shortcut">New tab</span><br>
|
||||
<span class="key">CTRL <span class="plus">+</span> -</span> <span class="shortcut">Close current tab</span><br>
|
||||
<span class="key">CTRL <span class="plus">+</span> F</span> <span class="shortcut">Find</span><br>
|
||||
<span class="key">CTRL <span class="plus">+</span> G</span> <span class="shortcut">Go to line</span><br>
|
||||
<span class="key">CTRL <span class="plus">+</span> S</span> <span class="shortcut">Save</span><br>
|
||||
@@ -29,7 +35,7 @@
|
||||
<span class="key">CTRL <span class="plus">+</span> S <span class="plus">+</span> Enter</span> <span class="shortcut">Save & create sticky tab</span><br>
|
||||
<span class="key">Esc</span> <span class="shortcut">Cancel tasks</span><br><br>
|
||||
|
||||
<h2>Clicking logo</h2>
|
||||
<h2>Logo</h2>
|
||||
<span class="key">Left click</span> <span class="shortcut">Help</span><br>
|
||||
<span class="key">Right click</span> <span class="shortcut">Settings</span><br>
|
||||
|
||||
|
||||
@@ -15,7 +15,15 @@
|
||||
<div id="results"></div>
|
||||
</div>
|
||||
<?php if (isset($_GET['replace'])) { ?>
|
||||
<div class="replaceAll" id="replaceAll" onClick="<?php echo isset($_GET['target']) ? 'renameAll()' : 'replaceAll()';?>" style="opacity: 0.1"><?php echo isset($_GET['target']) ? 'rename all' : 'replace all';?></div>
|
||||
<div class="replaceAll" id="replaceAll" onClick="<?php
|
||||
if (strpos($_GET['target'],"filenames")) {
|
||||
echo 'renameAll()';
|
||||
} else if (strpos($_GET['target'],"files")) {
|
||||
echo 'replaceInFilesAll()';
|
||||
} else {
|
||||
echo 'replaceAll()';
|
||||
}
|
||||
?>" style="opacity: 0.1"><?php echo strpos($_GET['target'],"filenames") ? 'rename all' : 'replace all';?></div>
|
||||
<?php ;}; ?>
|
||||
|
||||
<script>
|
||||
@@ -49,31 +57,76 @@ if (startTab!=top.ICEcoder.selectedTab) {
|
||||
<?php
|
||||
// Find in files or filenames
|
||||
} else {
|
||||
$targetName = "file/folder";
|
||||
if (strpos($_GET['target'],"filenames")>0) {
|
||||
$targetName = "file/folder";
|
||||
?>
|
||||
var spansArray = top.ICEcoder.filesFrame.contentWindow.document.getElementsByTagName('span');
|
||||
for (var i=0;i<spansArray.length;i++) {
|
||||
targetURL = spansArray[i].id.replace(/\|/g,"/");
|
||||
if (targetURL.indexOf('<?php echo strClean($_GET['find']); ?>')>-1 && targetURL.indexOf('_perms')>-1) {
|
||||
if (userTarget.indexOf("selected")>-1) {
|
||||
for (var j=0;j<top.ICEcoder.selectedFiles.length;j++) {
|
||||
if (top.ICEcoder.selectedFiles[j].indexOf(targetURL.replace(/\//g,"|").replace(/_perms/g,""))>-1) {
|
||||
foundInSelected = true;
|
||||
var spansArray = top.ICEcoder.filesFrame.contentWindow.document.getElementsByTagName('span');
|
||||
for (var i=0;i<spansArray.length;i++) {
|
||||
targetURL = spansArray[i].id.replace(/\|/g,"/");
|
||||
if (targetURL.indexOf('<?php echo strClean($_GET['find']); ?>')>-1 && targetURL.indexOf('_perms')>-1) {
|
||||
if (userTarget.indexOf("selected")>-1) {
|
||||
for (var j=0;j<top.ICEcoder.selectedFiles.length;j++) {
|
||||
if (top.ICEcoder.selectedFiles[j].indexOf(targetURL.replace(/\//g,"|").replace(/_perms/g,""))>-1) {
|
||||
foundInSelected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (userTarget.indexOf("all")>-1 || (userTarget.indexOf("selected")>-1 && foundInSelected)) {
|
||||
resultsDisplay += '<a href="javascript:top.ICEcoder.openFile(\'<?php echo $docRoot;?>'+targetURL.replace(/\|/g,"/").replace(/_perms/g,"")+'\');top.ICEcoder.showHide(\'hide\',top.document.getElementById(\'blackMask\'))">'+ targetURL.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<b><?php echo strClean($_GET['find']); ?></b>")+ '</a><br><div id="foundCount'+i+'">'+spansArray[i].innerHTML+', rename to '+targetURL.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<b><?php echo strClean($_GET['replace']);?></b>")+'</div>';
|
||||
<?php if (isset($_GET['replace'])) { ?>
|
||||
resultsDisplay += '<div class="replace" id="replace" onClick="renameSingle('+i+');this.style.display=\'none\'">rename</div>';
|
||||
<?php ;}; ?>
|
||||
resultsDisplay += '<hr>';
|
||||
foundArray.push(i);
|
||||
if (userTarget.indexOf("all")>-1 || (userTarget.indexOf("selected")>-1 && foundInSelected)) {
|
||||
resultsDisplay += '<a href="javascript:top.ICEcoder.openFile(\'<?php echo $docRoot;?>'+targetURL.replace(/\|/g,"/").replace(/_perms/g,"")+'\');top.ICEcoder.showHide(\'hide\',top.document.getElementById(\'blackMask\'))">'+ targetURL.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<b><?php echo strClean($_GET['find']); ?></b>")+ '</a><br><div id="foundCount'+i+'">'+spansArray[i].innerHTML+', rename to '+targetURL.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<b><?php echo strClean($_GET['replace']);?></b>")+'</div>';
|
||||
<?php if (isset($_GET['replace'])) { ?>
|
||||
resultsDisplay += '<div class="replace" id="replace" onClick="renameSingle('+i+');this.style.display=\'none\'">rename</div>';
|
||||
<?php ;}; ?>
|
||||
resultsDisplay += '<hr>';
|
||||
foundArray.push(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
<?php
|
||||
;}
|
||||
} else {
|
||||
$targetName = "file";
|
||||
$r = 0;
|
||||
function phpGrep($q, $path, $base) {
|
||||
$fp = opendir($path);
|
||||
$slash = $serverType == "Windows" ? "\\" : "/";
|
||||
global $r;
|
||||
global $ICEcoder;
|
||||
while($f = readdir($fp)) {
|
||||
if(preg_match("#^\.+$#", $f)) continue;
|
||||
$fullPath = $path.$slash.$f;
|
||||
if(is_dir($fullPath)) {
|
||||
$ret .= phpGrep($q, $fullPath, $base);
|
||||
} else if(stristr(file_get_contents($fullPath), $q)) {
|
||||
$rFile = false;
|
||||
$bFile = false;
|
||||
if ($_SESSION['userLevel']==0) {
|
||||
for ($i=0;$i<count($ICEcoder["restrictedFiles"]);$i++) {
|
||||
if (strpos($f,$ICEcoder['restrictedFiles'][$i])>0) {$rFile = true;};
|
||||
}
|
||||
}
|
||||
for ($i=0;$i<count($ICEcoder['bannedFiles']);$i++) {
|
||||
if (strpos($f,$ICEcoder['bannedFiles'][$i])>0) {$bFile = true;};
|
||||
}
|
||||
if (!$rFile && !$bFile) {
|
||||
$ret .= "<a href=\\\"javascript:top.ICEcoder.openFile('".$fullPath."');top.ICEcoder.showHide('hide',top.document.getElementById('blackMask'))\\\">";
|
||||
$ret .= str_replace($base,"",$fullPath)."</a><div id=\\\"foundCount".$r."\\\">Found ".substr_count(strtolower(file_get_contents($fullPath)),$q)." times</div>";
|
||||
if (isset($_GET['replace'])) {
|
||||
$ret .= "<div class=\\\"replace\\\" id=\\\"replace\\\" onClick=\\\"replaceInFileSingle('".$fullPath."');this.style.display=\'none\'\\\">replace</div>";
|
||||
};
|
||||
$ret .= '<hr>';
|
||||
echo 'foundArray.push("'.$fullPath.'");';
|
||||
$r++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
$results = phpGrep(strClean($_GET['find']), $docRoot.$ICEroot, $docRoot.$ICEroot);
|
||||
echo 'resultsDisplay += "'.$results.'";';
|
||||
?>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
foundArray.length==0 ? showHide = "hide" : showHide = "show";
|
||||
top.ICEcoder.showHide(showHide,top.document.getElementById('blackMask'));
|
||||
@@ -107,6 +160,17 @@ var replaceAll = function() {
|
||||
top.ICEcoder.showHide('hide',top.document.getElementById('blackMask'));
|
||||
}
|
||||
|
||||
var replaceInFileSingle = function(fileRef) {
|
||||
top.ICEcoder.replaceInFile(fileRef,'<?php echo strClean($_GET['find']); ?>','<?php echo strClean($_GET['replace']); ?>');
|
||||
}
|
||||
|
||||
var replaceInFilesAll = function() {
|
||||
for (var i=0;i<=foundArray.length-1;i++) {
|
||||
replaceInFileSingle(foundArray[i]);
|
||||
}
|
||||
top.ICEcoder.showHide('hide',top.document.getElementById('blackMask'));
|
||||
}
|
||||
|
||||
var renameSingle = function(arrayRef) {
|
||||
fileRef = spansArray[arrayRef].id.replace(/\|/g,"/").replace(/_perms/g,"");
|
||||
newName = spansArray[arrayRef].id.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<?php echo strClean($_GET['replace']); ?>");
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php include("settings.php");?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
@@ -11,7 +10,7 @@
|
||||
<script src="../<?php echo $ICEcoder["codeMirrorDir"]; ?>/lib/codemirror-compressed.js"></script>
|
||||
|
||||
<style type="text/css">
|
||||
.CodeMirror {position: absolute; width: 0; background-color: #fff; font-family: monospace; width: 420px}
|
||||
.CodeMirror {position: absolute; width: 0; background-color: #fff; color: #000; font-family: monospace; width: 420px}
|
||||
.CodeMirror-scroll {height: 240px; overflow: hidden}
|
||||
/* Make sure this next one remains the 3rd item, updated with JS */
|
||||
.cm-tab:after {position: relative; display: inline-block; width: 0; left: -1.4em; overflow: visible; color: #aaa; content: "<?php if($ICEcoder["visibleTabs"]) {echo '\21e5';};?>";}
|
||||
@@ -19,8 +18,15 @@
|
||||
|
||||
<link rel="stylesheet" href="editor.css">
|
||||
<?php
|
||||
$themeArray = array("ambiance","blackboard","cobalt","eclipse","elegant","erlang-dark","lesser-dark","monokai","neat","night","rubyblue","vibrant-ink","xq-dark");
|
||||
for ($i=0;$i<count($themeArray)-1;$i++) {
|
||||
$themeArray = array();
|
||||
$handle = opendir('../'.$ICEcoder["codeMirrorDir"].'/theme/');
|
||||
while (false !== ($file = readdir($handle))) {
|
||||
if ($file !== "." && $file != "..") {
|
||||
array_push($themeArray,basename($file,".css"));
|
||||
}
|
||||
}
|
||||
sort($themeArray);
|
||||
for ($i=0;$i<count($themeArray);$i++) {
|
||||
echo '<link rel="stylesheet" href="../'.$ICEcoder["codeMirrorDir"].'/theme/'.$themeArray[$i].'.css">'.PHP_EOL;
|
||||
}
|
||||
?>
|
||||
@@ -30,7 +36,7 @@ for ($i=0;$i<count($themeArray)-1;$i++) {
|
||||
|
||||
<div class="infoPane">
|
||||
<img src="../images/ice-coder.png" class="logo">
|
||||
<div class="version"><?php echo $ICEcoder["versionNo"];?></div>
|
||||
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div>
|
||||
|
||||
<p>
|
||||
git:<br>
|
||||
@@ -128,7 +134,7 @@ theme<br>
|
||||
<select onchange="selectTheme();showButton()" id="select" name="theme">
|
||||
<option<?php if ($ICEcoder["theme"]=="default") {echo ' selected';}; ?>>default</option>
|
||||
<?php
|
||||
for ($i=0;$i<count($themeArray)-1;$i++) {
|
||||
for ($i=0;$i<count($themeArray);$i++) {
|
||||
$optionSelected = $ICEcoder["theme"]==$themeArray[$i] ? ' selected' : '';
|
||||
echo '<option'.$optionSelected.'>'.$themeArray[$i].'</option>'.PHP_EOL;
|
||||
}
|
||||
|
||||
@@ -29,9 +29,9 @@ include($settingsFile);
|
||||
|
||||
// Add ICEcoder settings to beginning of $ICEcoder array
|
||||
$ICEcoder = array(
|
||||
"versionNo" => "v 0.8.0",
|
||||
"codeMirrorDir" => "CodeMirror-2.32",
|
||||
"cMThisVer" => 2.32
|
||||
"versionNo" => "0.8.4",
|
||||
"codeMirrorDir" => "CodeMirror-2.33",
|
||||
"cMThisVer" => 2.33
|
||||
)+$ICEcoder;
|
||||
|
||||
// Update this config file?
|
||||
@@ -46,14 +46,14 @@ if (isset($_POST["theme"]) && $_POST["theme"] && $_SESSION['userLevel'] == 10) {
|
||||
$ICEcoder["tabsIndent"] = $_POST['tabsIndent'] ? "true" : "false";
|
||||
$ICEcoder["checkUpdates"] = $_POST['checkUpdates'] ? "true" : "false";
|
||||
$ICEcoder["openLastFiles"] = $_POST['openLastFiles'] ? "true" : "false";
|
||||
$ICEcoder["findFilesExclude"] = 'array("'.str_replace(', ','","',strClean($_POST['findFilesExclude'])).'")';
|
||||
$ICEcoder["findFilesExclude"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['findFilesExclude']))).'")';
|
||||
$ICEcoder["codeAssist"] = $_POST['codeAssist'] ? "true" : "false";
|
||||
$ICEcoder["visibleTabs"] = $_POST['visibleTabs'] ? "true" : "false";
|
||||
$ICEcoder["lockedNav"] = $_POST['lockedNav'] ? "true" : "false";
|
||||
if ($_POST['accountPassword']!="") {$ICEcoder["accountPassword"] = generateHash(strClean($_POST['accountPassword']));};
|
||||
$ICEcoder["restrictedFiles"] = 'array("'.str_replace(', ','","',strClean($_POST['restrictedFiles'])).'")';
|
||||
$ICEcoder["bannedFiles"] = 'array("'.str_replace(', ','","',strClean($_POST['bannedFiles'])).'")';
|
||||
$ICEcoder["allowedIPs"] = 'array("'.str_replace(', ','","',strClean($_POST['allowedIPs'])).'")';
|
||||
$ICEcoder["restrictedFiles"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['restrictedFiles']))).'")';
|
||||
$ICEcoder["bannedFiles"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedFiles']))).'")';
|
||||
$ICEcoder["allowedIPs"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['allowedIPs']))).'")';
|
||||
$ICEcoder["plugins"] = 'array('.PHP_EOL.' array('.PHP_EOL.' '.str_replace('====================','),'.PHP_EOL.' array(',$_POST['plugins']).'))';
|
||||
$ICEcoder["theme"] = strClean($_POST['theme']);
|
||||
$ICEcoder["tabWidth"] = numClean($_POST['tabWidth']);
|
||||
@@ -76,7 +76,7 @@ if (isset($_POST["theme"]) && $_POST["theme"] && $_SESSION['userLevel'] == 10) {
|
||||
// OK, now the config file has been updated, update our current session with new arrays
|
||||
$settingsArray = array("findFilesExclude","restrictedFiles","bannedFiles","allowedIPs");
|
||||
for ($i=0;$i<count($settingsArray);$i++) {
|
||||
$_SESSION[$settingsArray[$i]] = $ICEcoder[$settingsArray[$i]] = explode(", ",strClean($_POST[$settingsArray[$i]]));
|
||||
$_SESSION[$settingsArray[$i]] = $ICEcoder[$settingsArray[$i]] = explode(",",str_replace(" ","",strClean($_POST[$settingsArray[$i]])));
|
||||
}
|
||||
// Work out the theme to use now
|
||||
$ICEcoder["theme"]=="default" ? $themeURL = 'lib/editor.css' : $themeURL = $ICEcoder["codeMirrorDir"].'/theme/'.$ICEcoder["theme"].'.css';
|
||||
@@ -89,6 +89,10 @@ if (isset($_POST["theme"]) && $_POST["theme"] && $_SESSION['userLevel'] == 10) {
|
||||
// Define the docRoot & iceRoot
|
||||
$docRoot = rtrim(str_replace("\\","/",$_SERVER['DOCUMENT_ROOT']));
|
||||
$iceRoot = rtrim(str_replace("\\","/",$ICEcoder["root"]));
|
||||
if ($_SESSION['userLevel'] == 10) {
|
||||
echo "<script>top.docRoot='".$docRoot."';top.iceRoot='".$iceRoot."'</script>";
|
||||
}
|
||||
$serverType = stristr($_SERVER[SERVER_SOFTWARE], "win") ? "Windows" : "Linux";
|
||||
|
||||
// Establish our user level
|
||||
if (!isset($_SESSION['userLevel'])) {$_SESSION['userLevel'] = 0;};
|
||||
@@ -223,7 +227,7 @@ if ($ICEcoder["accountPassword"] == "" && isset($_GET['settings'])) {
|
||||
<div class="screenVCenter">
|
||||
<div class="screenCenter">
|
||||
<img src="../images/ice-coder.png">
|
||||
<div class="version"><?php echo $ICEcoder["versionNo"];?></div>
|
||||
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div>
|
||||
<form name="settingsUpdate" action="../" method="POST">
|
||||
<input type="password" name="accountPassword" class="accountPassword">
|
||||
<input type="submit" name="submit" value="Set Password" class="button">
|
||||
|
||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
BIN
plugins/dochub/icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
24
plugins/ice-repo/LICENSE.md
Normal file
@@ -0,0 +1,24 @@
|
||||
Copyright (C) 2012 Matt Pass
|
||||
Website: mattpass.com
|
||||
Email: matt@mattpass.com
|
||||
Twitter: @mattpass
|
||||
|
||||
#ICErepo License
|
||||
##Standard Open Source Initiative MIT License
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
61
plugins/ice-repo/README.md
Normal file
@@ -0,0 +1,61 @@
|
||||
ICErepo
|
||||
=======
|
||||
|
||||
Show diffs, push, pull & sync your site and Github repo's.
|
||||
|
||||
While Github has a fantastic website, mobile app, desktop app and of course bash system, there's no web based UI I can find to sync your website code with Github repo's or vice versa. That's what ICErepo provides.
|
||||
|
||||
Originally intended to be a plugin for ICEcoder (https://github.com/mattpass/ICEcoder), I have decided to make it a standalone lib so it can run by itself or easily be integrated into any existing system.
|
||||
|
||||
The aim is a simple UI to view diffs between your server dir's and related Github repo's. This list will consist of new files (those only on server), deleted files (those only on Github) and changed files (files that exist in both places but are different). Files that exist in both locations and the same are not shown to keep things minimalist.
|
||||
|
||||
Users can then to pick & choose the files & folder they'd like to commit, provide a title and message, then commit to Github. As each file is synced by the user to match the server it dissapears from the UI list. Alternatively you can pull files & folders from Github to sync your server dir's with the repo itself.
|
||||
|
||||
Cool huh?
|
||||
|
||||
**Current screnshot:**
|
||||
|
||||
<img src="http://www.icecoder.net/github/screenshot.jpg" alt="ICErepo screenshot">
|
||||
|
||||
This lib uses customised & minified versions of these brilliant and time tested repos:
|
||||
|
||||
Github API lib: https://github.com/michael/github
|
||||
|
||||
JS Diff lib: https://github.com/cemerick/jsdifflib
|
||||
|
||||
###Installation
|
||||
|
||||
####Step 1: Clone the repo
|
||||
|
||||
```
|
||||
$ git clone git@github:mattpass/ICErepo
|
||||
```
|
||||
|
||||
####Step 2: Enter your auth settings
|
||||
```
|
||||
Open index.php and enter either your Github oauth token or username & password
|
||||
oauth is recommended here, view http://developer.github.com/v3/oauth/ for info
|
||||
(If using oauth ensure you have repo scope & your app is granted the URL you'll run under)
|
||||
```
|
||||
|
||||
####Step 3: Enter your repo & server dir settings
|
||||
```
|
||||
Also in index.php, enter the repo & corresponding server paths
|
||||
Enter 'selected' as a 3rd param next to your default repo/server option to autoload that
|
||||
Finally, set $_SESSION['userLevel'] to be > 0 with your own login system, or simply uncomment line 3
|
||||
Upload ICErepo, visit in a web browser & enjoy
|
||||
```
|
||||
|
||||
**Dev schedule:**
|
||||
|
||||
**v0.8**
|
||||
Bug testing, refactoring & optimisation
|
||||
|
||||
**v0.9**
|
||||
Alpha testing
|
||||
|
||||
**v0.95**
|
||||
Beta testing
|
||||
|
||||
**v1.0**
|
||||
Version 1 released
|
||||
127
plugins/ice-repo/contents.php
Normal file
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
session_start();
|
||||
if ($_SESSION['userLevel'] == 0) {
|
||||
die("Sorry, you need to be logged in to use ICErepo");
|
||||
}
|
||||
|
||||
function strClean($var) {
|
||||
// returns converted entities where there are HTML entity equivalents
|
||||
return htmlentities($var, ENT_QUOTES, "UTF-8");
|
||||
}
|
||||
|
||||
function numClean($var) {
|
||||
// returns a number, whole or decimal or null
|
||||
return is_numeric($var) ? floatval($var) : false;
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ICErepo v<?php echo $version;?></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script src="lib/base64.js"></script>
|
||||
<script src="lib/github.js"></script>
|
||||
<script src="lib/difflib.js"></script>
|
||||
<script src="ice-repo.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="ice-repo.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<?php
|
||||
// Function to sort given values alphabetically
|
||||
function alphasort($a, $b) {
|
||||
return strcmp($a->getPathname(), $b->getPathname());
|
||||
}
|
||||
|
||||
// Class to put forward the values for sorting
|
||||
class SortingIterator implements IteratorAggregate {
|
||||
private $iterator = null;
|
||||
public function __construct(Traversable $iterator, $callback) {
|
||||
$array = iterator_to_array($iterator);
|
||||
usort($array, $callback);
|
||||
$this->iterator = new ArrayIterator($array);
|
||||
}
|
||||
public function getIterator() {
|
||||
return $this->iterator;
|
||||
}
|
||||
}
|
||||
|
||||
// Get a full list of dirs & files and begin sorting using above class & function
|
||||
$repoPath = explode("@",strClean($_POST['repo']));
|
||||
$repo = $repoPath[0];
|
||||
$path = $repoPath[1];
|
||||
$objectList = new SortingIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST), 'alphasort');
|
||||
|
||||
// Finally, we have our ordered list, so display
|
||||
$i=0;
|
||||
$dirListArray = array();
|
||||
$dirSHAArray = array();
|
||||
$dirTypeArray = array();
|
||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||
foreach ($objectList as $objectRef) {
|
||||
$fileFolderName = rtrim(substr($objectRef->getPathname(), strlen($path)),"..");
|
||||
if ($objectRef->getFilename()!="." && $fileFolderName[strlen($fileFolderName)-1]!="/") {
|
||||
$contents = file_get_contents($path.$fileFolderName);
|
||||
if (strpos(finfo_file($finfo, $path.$fileFolderName),"text")===0) {
|
||||
$contents = str_replace("\r","",$contents);
|
||||
};
|
||||
$store = "blob ".strlen($contents)."\000".$contents;
|
||||
$i++;
|
||||
array_push($dirListArray,ltrim($fileFolderName,"/"));
|
||||
array_push($dirSHAArray,sha1($store));
|
||||
$type = is_dir($path.$fileFolderName) ? "dir" : "file";
|
||||
array_push($dirTypeArray,$type);
|
||||
}
|
||||
}
|
||||
finfo_close($finfo);
|
||||
?>
|
||||
|
||||
<script>
|
||||
top.repo = '<?php echo $repo;?>';
|
||||
top.path = '<?php echo $path;?>';
|
||||
dirListArray = [<?php echo "'".implode("','", $dirListArray)."'";?>];
|
||||
dirSHAArray = [<?php echo "'".implode("','", $dirSHAArray)."'";?>];
|
||||
dirTypeArray = [<?php echo "'".implode("','", $dirTypeArray)."'";?>];
|
||||
</script>
|
||||
|
||||
<div id="compareList" class="mainContainer"></div>
|
||||
|
||||
<div id="commitPane" class="commitPane">
|
||||
<b style='font-size: 18px'>COMMIT CHANGES:</b><br><br>
|
||||
<form name="fcForm" action="file-control.php" target="fileControl" method="POST">
|
||||
<input type="text" name="title" value="Title..." style="width: 260px; border: 0; background: #f8f8f8; margin-bottom: 10px" onFocus="titleDefault='Title...'; if(this.value==titleDefault) {this.value=''}" onBlur="if(this.value=='') {this.value=titleDefault}"><br>
|
||||
<textarea name="message" style="width: 260px; height: 180px; border: 0; background: #f8f8f8; margin-bottom: 5px" onFocus="messageDefault='Message...'; if(this.value==messageDefault) {this.value=''}" onBlur="if(this.value=='') {this.value=messageDefault}">Message...</textarea>
|
||||
<input type="hidden" name="token" value="<?php echo strClean($_POST['token']);?>">
|
||||
<input type="hidden" name="username" value="<?php echo strClean($_POST['username']);?>">
|
||||
<input type="hidden" name="password" value="<?php echo strClean($_POST['password']);?>">
|
||||
<input type="hidden" name="path" value="<?php echo $path; ?>">
|
||||
<input type="hidden" name="rowID" value="">
|
||||
<input type="hidden" name="gitRepo" value="<?php echo $repo; ?>">
|
||||
<input type="hidden" name="repo" value="">
|
||||
<input type="hidden" name="dir" value="">
|
||||
<input type="hidden" name="action" value="">
|
||||
<input type="submit" name="commit" value="Commit changes" onClick="return commitChanges()" style="border: 0; background: #555; color: #fff; cursor: pointer">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="infoPane" class="infoPane"></div>
|
||||
|
||||
<script>
|
||||
top.fcFormAlias = document.fcForm;
|
||||
var github = new Github(<?php
|
||||
if ($_POST['token']!="") {
|
||||
echo '{token: "'.strClean($_POST['token']).'", auth: "oauth"}';
|
||||
} else{
|
||||
echo '{username: "'.strClean($_POST['username']).'", password: "'.strClean($_POST['password']).'", auth: "basic"}';
|
||||
}?>);
|
||||
repoListArray = [];
|
||||
repoSHAArray = [];
|
||||
window.onLoad=gitCommand('repo.show','<?php echo strClean($_POST['repo']);?>');
|
||||
</script>
|
||||
|
||||
<iframe name="fileControl" style="display: none"></iframe>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
144
plugins/ice-repo/file-control.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
session_start();
|
||||
if ($_SESSION['userLevel'] == 0) {
|
||||
die("Sorry, you need to be logged in to use ICErepo");
|
||||
}
|
||||
// returns converted entities where there are HTML entity equivalents
|
||||
function strClean($var) {
|
||||
return htmlentities($var, ENT_QUOTES, "UTF-8");
|
||||
}
|
||||
|
||||
// returns a number, whole or decimal or null
|
||||
function numClean($var) {
|
||||
return is_numeric($var) ? floatval($var) : false;
|
||||
}
|
||||
|
||||
$repoPath = strClean($_POST['repoPath']);
|
||||
$gitRepo = strClean($_POST['gitRepo']);
|
||||
$path = strClean($_POST['path']);
|
||||
$rowID = strClean($_POST['rowID']);
|
||||
$repo = strClean($_POST['repo']);
|
||||
$dir = strClean($_POST['dir']);
|
||||
$action = str_replace("PULL:","",str_replace("SAVEPULLS:","",strClean($_POST['action'])));
|
||||
$rowIDArray = explode(",",$rowID);
|
||||
$repoArray = explode(",",$repo);
|
||||
$dirArray = explode(",",$dir);
|
||||
$actionArray = explode(",",$action);
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ICErepo v<?php echo $version;?></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script src="lib/underscore-min.js"></script>
|
||||
<script src="lib/base64.js"></script>
|
||||
<script src="lib/github.js"></script>
|
||||
<script src="lib/difflib.js"></script>
|
||||
<script src="ice-repo.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="ice-repo.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<script>
|
||||
fullRepoPath='<?php echo $repo;?>';
|
||||
gitRepo='<?php echo $gitRepo;?>';
|
||||
var github = new Github(<?php
|
||||
if ($_POST['token']!="") {
|
||||
echo '{token: "'.strClean($_POST['token']).'", auth: "oauth"}';
|
||||
} else{
|
||||
echo '{username: "'.strClean($_POST['username']).'", password: "'.strClean($_POST['password']).'", auth: "basic"}';
|
||||
}?>);
|
||||
repoUser = gitRepo.split('/')[0];
|
||||
repoName = gitRepo.split('/')[1];
|
||||
filePath = fullRepoPath.replace(repoUser+"/"+repoName+"/","");
|
||||
var repo = github.getRepo(repoUser,repoName);
|
||||
</script>
|
||||
|
||||
<?php if ($_POST['action']=="view") {?>
|
||||
<form name="fcForm">
|
||||
<textarea name="fileContents"><?php echo htmlentities(file_get_contents($dir)); ?></textarea>
|
||||
</form>
|
||||
<script>
|
||||
rowID = <?php echo $rowID; ?>;
|
||||
|
||||
baseTextName = "Server: <?php echo str_replace($_SERVER['DOCUMENT_ROOT']."/","",$dir);?> ";
|
||||
newTextName = "Github: <?php echo $repo;?>";
|
||||
window.onLoad = sendData(baseTextName,newTextName);
|
||||
</script>
|
||||
<?php } else if (substr($_POST['action'],0,5)=="PULL:") { ?>
|
||||
<form name="fcForm" action="file-control.php" method="POST">
|
||||
<?php
|
||||
echo '<input type="hidden" name="rowID" value="'.$rowID.'">';
|
||||
echo '<input type="hidden" name="repo" value="'.$repo.'">';
|
||||
echo '<input type="hidden" name="dir" value="'.$dir.'">';
|
||||
echo '<input type="hidden" name="action" value="SAVEPULLS:'.$action.'">';
|
||||
echo '<input type="hidden" name="path" value="'.$path.'">';
|
||||
for ($i=0;$i<count($rowIDArray);$i++) {
|
||||
if ($repoArray[$i]!="") {
|
||||
echo '<textarea name="repoContents'.$rowIDArray[$i].'"></textarea>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</form>
|
||||
<script>
|
||||
rowIDArray = [<?php echo implode(",", $rowIDArray);?>];
|
||||
repoArray = [<?php echo "'".implode("','", $repoArray)."'";?>];
|
||||
dirArray = [<?php echo "'".implode("','", $dirArray)."'";?>];
|
||||
actionArray = [<?php echo "'".implode("','", $actionArray)."'";?>];
|
||||
window.onLoad = getData();
|
||||
</script>
|
||||
<?php } else if (substr($_POST['action'],0,10)=="SAVEPULLS:") {?>
|
||||
<script>
|
||||
<?php
|
||||
for ($i=0;$i<count($rowIDArray);$i++) {
|
||||
if ($actionArray[$i]!="new") {
|
||||
$dirs = explode("/",$repoArray[$i]);
|
||||
$relDir = "";
|
||||
for ($j=0;$j<count($dirs)-1;$j++) {
|
||||
$relDir .= "/".$dirs[$j];
|
||||
if (!is_dir($path.$relDir)) {
|
||||
mkdir($path.$relDir, 0755);
|
||||
}
|
||||
}
|
||||
$fh = fopen($path."/".$repoArray[$i], 'w') or die("alert('Sorry, there was a problem pulling ".$repoArray[$i].". Either the file is unavailable on Github or server permissions aren\'t allowing it to be created/updated.');get('blackMask','top').style.display='none';");
|
||||
fwrite($fh, $_POST['repoContents'.$rowIDArray[$i]]);
|
||||
fclose($fh);
|
||||
echo "hideRow(".$rowIDArray[$i].");top.newCount--;";
|
||||
} else {
|
||||
is_dir($dir) ? $success = rmdir($dir) : $success = unlink($dir);
|
||||
if (!$success) {
|
||||
echo "alert('Sorry, couldn\'t delete ".$dir."\\n\\n";
|
||||
echo "Maybe you need to give file permissions for it to be deleted?');";
|
||||
} else {
|
||||
echo "hideRow(".$rowIDArray[$i].");top.deletedCount--;";
|
||||
}
|
||||
}
|
||||
}
|
||||
echo "get('blackMask','top').style.display = 'none';";
|
||||
?>
|
||||
</script>
|
||||
<?php } else { ?>
|
||||
<form name="fcForm">
|
||||
<?php
|
||||
for ($i=0;$i<count($rowIDArray);$i++) {
|
||||
if ($dirArray[$i]!="") {
|
||||
echo '<textarea name="fileContents'.$rowIDArray[$i].'">';
|
||||
echo htmlentities(file_get_contents($dirArray[$i]));
|
||||
echo '</textarea>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</form>
|
||||
<script>
|
||||
rowIDArray = [<?php echo implode(",", $rowIDArray);?>];
|
||||
repoArray = [<?php echo "'".implode("','", $repoArray)."'";?>];
|
||||
dirArray = [<?php echo "'".implode("','", $dirArray)."'";?>];
|
||||
actionArray = [<?php echo "'".implode("','", $actionArray)."'";?>];
|
||||
window.onLoad = startProcess();
|
||||
</script>
|
||||
<?php } ?>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
79
plugins/ice-repo/ice-repo.css
Normal file
@@ -0,0 +1,79 @@
|
||||
/* First, reset everything to a standard */
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td {
|
||||
font-family: arial, verdana, helvetica, sans-serif;
|
||||
border: 0px;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
outline: 0px;
|
||||
font-size: 12px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
html, body {background-color: #fff; width: 100%}
|
||||
p {color: #444}
|
||||
textarea, input {font-family: arial, verdana, helvetica, sans-serif; padding: 4px}
|
||||
|
||||
.header {position: absolute; width: 100%; height: 60px; background: #444; z-index: 1}
|
||||
|
||||
.mainContainer {position: relative; display: block; width: 900px; padding: 20px}
|
||||
|
||||
.blackMask {position: absolute; width: 100%; height: 100%; background: rgba(0,0,0,0.9); z-index: 200}
|
||||
.loadingMsgCenter {position: absolute; display: inline-block; left: 50%; top: 50%; width: 1px; height: 1px}
|
||||
.loadingMsgContainer {position: absolute; display: inline-block; left: -30px; top: -7px; width: 60px; height: 14px; background-color: #bbb; color: #222; font-weight: bold; text-align: center; padding: 15px; z-index: 201;
|
||||
-webkit-box-shadow: 8px 8px 8px 8px rgba(0,0,0,0.4);
|
||||
-moz-box-shadow: 8px 8px 8px 8px rgba(0,0,0,0.4);
|
||||
box-shadow: 4px 4px 8px 4px rgba(0,0,0,0.4)}
|
||||
|
||||
.repoFrame {position: absolute; width: 100%; height: 90%; left: 0px; margin-top: 60px}
|
||||
|
||||
.row {position: relative; display: inline-block; background: #ccc; color: #000; width: 880px; padding: 10px 7px; margin-bottom: 2px; cursor: pointer; padding-left: 35px}
|
||||
.row:hover {background: #888; color: #fff}
|
||||
.row .icon {display: inline-block; width: 16px; height: 16px; margin-right: 7px; background-image:url('../../images/file-folder-icons.png'); background-repeat: no-repeat}
|
||||
.row .checkbox {position: absolute; display: inline-block; height: 38px; width: 30px; top: -4px; left: 0px}
|
||||
.rowContent {position: relative; display: none; background: #eee; width: 100%; height: 300px; padding: 7px; margin-bottom: 10px; overflow: auto}
|
||||
.pullGithub {position: absolute; display: inline-block; top: 7px; left: 822px; padding: 5px; background: #bbb; color: #444; font-size: 10px; cursor: pointer}
|
||||
.pullGithubSel {position: absolute; display: inline-block; top: 7px; left: 822px; margin-top: 12px; margin-left: -22px; padding: 5px; background: #bbb; color: #444; font-size: 10px; cursor: pointer}
|
||||
.version {position: absolute; display: inline-block; width: 100px; left: 1000px; top: 33px; font-size: 10px; color: #bbb; text-align: right}
|
||||
.logo {position: absolute; left: 1107px; top: 12px}
|
||||
|
||||
.commitPane {position: fixed; background: #ccc; width: 270px; height: 300px; left: 960px; top: 0px; padding: 20px 10px 10px 10px; z-index: 100}
|
||||
.infoPane {position: fixed; width: 270px; height: 100px; left: 960px; top: 340px; padding: 20px 10px 10px 10px; z-index: 100}
|
||||
|
||||
/* Folder */
|
||||
.ext-folder {background-position: 0 0}
|
||||
|
||||
/* Additional file types */
|
||||
.ext-coffee {background-position: -48px 0}
|
||||
.ext-css {background-position: -64px 0}
|
||||
.ext-gif {background-position: -80px 0}
|
||||
.ext-htm {background-position: -96px 0}
|
||||
.ext-html {background-position: -96px 0}
|
||||
.ext-jpg {background-position: -112px 0}
|
||||
.ext-jpeg {background-position: -112px 0}
|
||||
.ext-js {background-position: -128px 0}
|
||||
.ext-less {background-position: -144px 0}
|
||||
.ext-php {background-position: -160px 0}
|
||||
.ext-png {background-position: -176px 0}
|
||||
.ext-rb {background-position: -192px 0}
|
||||
.ext-rbx {background-position: -192px 0}
|
||||
.ext-rhtml {background-position: -192px 0}
|
||||
.ext-ruby {background-position: -192px 0}
|
||||
.ext-txt {background-position: -208px 0}
|
||||
.ext-zip {background-position: -224px 0}
|
||||
.ext-file {background-position: -32px 0}
|
||||
|
||||
table.diff {color: #888; border: 0; white-space: pre-wrap}
|
||||
table.diff tbody th {color:#888; font-size: 11px; font-weight: normal; padding: 2px; vertical-align:top}
|
||||
table.diff thead th.texttitle {background: #444; color: #fff; text-align:left; padding: 2px}
|
||||
table.diff tbody td {width: 100%; font-family: Courier, monospace; vertical-align: top}
|
||||
table.diff .delete {background: #0b0; color: #fff}
|
||||
table.diff .insert {background: #b00; color: #fff}
|
||||
table.diff th.author {display: none}
|
||||
336
plugins/ice-repo/ice-repo.js
Normal file
@@ -0,0 +1,336 @@
|
||||
top.selRowArray = [];
|
||||
top.selRepoDirArray = [];
|
||||
top.selActionArray = [];
|
||||
top.filetypesArray = ['coffee','css','gif','htm','html','jpg','jpeg','js','less','php','png','rb','rbx','rhtml','ruby','txt','zip'];
|
||||
|
||||
doRepo = function(repo) {
|
||||
document.showRepo.repo.value = repo;
|
||||
document.showRepo.submit();
|
||||
}
|
||||
|
||||
updateSelection = function(elem,row,repoDir,action) {
|
||||
if (elem.checked) {
|
||||
top.selRowArray.push(row);
|
||||
top.selRepoDirArray.push(repoDir);
|
||||
top.selActionArray.push(action);
|
||||
} else {
|
||||
arrayIndex = top.selRowArray.indexOf(row);
|
||||
top.selRowArray.splice(arrayIndex,1);
|
||||
top.selRepoDirArray.splice(arrayIndex,1);
|
||||
top.selActionArray.splice(arrayIndex,1);
|
||||
};
|
||||
}
|
||||
|
||||
getContent = function(thisRow,path) {
|
||||
if("undefined" == typeof overOption || !overOption) {
|
||||
if ("undefined" == typeof lastRow || lastRow!=thisRow || get('row'+thisRow+'Content').innerHTML=="") {
|
||||
for (i=1;i<=rowID;i++) {
|
||||
get('row'+i+'Content').innerHTML = "";
|
||||
get('row'+i+'Content').style.display = "none";
|
||||
}
|
||||
repo = top.repo + "/" + path;
|
||||
dir = top.path + "/" + path;
|
||||
document.fcForm.rowID.value = thisRow;
|
||||
document.fcForm.repo.value = repo;
|
||||
document.fcForm.dir.value = dir;
|
||||
document.fcForm.action.value = "view";
|
||||
document.fcForm.submit();
|
||||
} else {
|
||||
get('row'+thisRow+'Content').innerHTML = "";
|
||||
get('row'+thisRow+'Content').style.display = "none";
|
||||
}
|
||||
lastRow = thisRow;
|
||||
}
|
||||
}
|
||||
|
||||
commitChanges = function() {
|
||||
if(top.selRowArray.length>0) {
|
||||
if (document.fcForm.title.value!="Title..." && document.fcForm.message.value!="Message...") {
|
||||
get('blackMask','top').style.display = "block";
|
||||
top.selRowValue = "";
|
||||
top.selDirValue = "";
|
||||
top.selRepoValue = "";
|
||||
top.selActionValue = "";
|
||||
for (i=0;i<top.selRowArray.length;i++) {
|
||||
top.selRowValue += top.selRowArray[i];
|
||||
if (top.selActionArray[i]=="changed") {
|
||||
top.selDirValue += top.selRepoDirArray[i].split('@')[0];
|
||||
top.selRepoValue += top.selRepoDirArray[i].split('@')[1];
|
||||
}
|
||||
if (top.selActionArray[i]=="new") {
|
||||
top.selDirValue += top.selRepoDirArray[i];
|
||||
top.selRepoValue += "";
|
||||
}
|
||||
if (top.selActionArray[i]=="deleted") {
|
||||
top.selDirValue += "";
|
||||
top.selRepoValue += top.selRepoDirArray[i];
|
||||
}
|
||||
top.selActionValue += top.selActionArray[i];
|
||||
if (i<top.selRowArray.length-1) {
|
||||
top.selRowValue += ",";
|
||||
top.selDirValue += ",";
|
||||
top.selRepoValue += ",";
|
||||
top.selActionValue += ",";
|
||||
}
|
||||
}
|
||||
document.fcForm.rowID.value = top.selRowValue;
|
||||
document.fcForm.dir.value = top.selDirValue;
|
||||
document.fcForm.repo.value = top.selRepoValue;
|
||||
document.fcForm.action.value = top.selActionValue;
|
||||
document.fcForm.submit();
|
||||
} else {
|
||||
alert('Please enter a title & message for the commit');
|
||||
}
|
||||
} else {
|
||||
alert('Please select some files/folders to commit');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
pullContent = function(thisRow,thisPath,thisRepo,thisAction) {
|
||||
get('blackMask','top').style.display = "block";
|
||||
if (thisRow=="selected") {
|
||||
top.selRowValue = "";
|
||||
top.selDirValue = "";
|
||||
top.selRepoValue = "";
|
||||
top.selActionValue = "";
|
||||
for (i=0;i<top.selRowArray.length;i++) {
|
||||
top.selRowValue += top.selRowArray[i];
|
||||
if (top.selActionArray[i]=="changed") {
|
||||
repoUser = top.selRepoDirArray[i].split('@')[1].split('/')[0];
|
||||
repoName = top.selRepoDirArray[i].split('@')[1].split('/')[1];
|
||||
top.selDirValue += top.selRepoDirArray[i].split('@')[0];
|
||||
top.selRepoValue += top.selRepoDirArray[i].split('@')[1].replace(repoUser+"/"+repoName+"/","");
|
||||
}
|
||||
if (top.selActionArray[i]=="new") {
|
||||
top.selDirValue += top.selRepoDirArray[i];
|
||||
top.selRepoValue += "";
|
||||
}
|
||||
if (top.selActionArray[i]=="deleted") {
|
||||
repoUser = top.selRepoDirArray[i].split('/')[0];
|
||||
repoName = top.selRepoDirArray[i].split('/')[1];
|
||||
top.selDirValue += "";
|
||||
top.selRepoValue += top.selRepoDirArray[i].replace(repoUser+"/"+repoName+"/","");
|
||||
}
|
||||
top.selActionValue += top.selActionArray[i];
|
||||
if (i<top.selRowArray.length-1) {
|
||||
top.selRowValue += ",";
|
||||
top.selDirValue += ",";
|
||||
top.selRepoValue += ",";
|
||||
top.selActionValue += ",";
|
||||
}
|
||||
}
|
||||
} else {
|
||||
top.selRowValue = thisRow;
|
||||
top.selDirValue = thisPath;
|
||||
top.selRepoValue = thisRepo;
|
||||
top.selActionValue = thisAction;
|
||||
}
|
||||
top.fcFormAlias.rowID.value = top.selRowValue;
|
||||
top.fcFormAlias.dir.value = top.selDirValue;
|
||||
top.fcFormAlias.repo.value = top.selRepoValue;
|
||||
top.fcFormAlias.action.value = "PULL:"+top.selActionValue;
|
||||
top.fcFormAlias.submit();
|
||||
}
|
||||
|
||||
getData = function() {
|
||||
if (actionArray[0]!="new") {
|
||||
repo.read('master', repoArray[0], function(err, data) {
|
||||
document.fcForm['repoContents'+rowIDArray[0]].innerHTML=data;
|
||||
if(!err) {
|
||||
removeFirstArrayItems();
|
||||
rowIDArray.length>0 ? getData() : document.fcForm.submit();
|
||||
} else {
|
||||
alert('Sorry, there was an error reading '+repoArray[0]);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
removeFirstArrayItems();
|
||||
rowIDArray.length>0 ? getData() : document.fcForm.submit();
|
||||
}
|
||||
}
|
||||
|
||||
sendData = function(baseTextName,newTextName) {
|
||||
repo.read('master', filePath, function(err, data) {
|
||||
dirContent = document.fcForm.fileContents.value;
|
||||
repoContent = data;
|
||||
diffUsingJS(dirContent,repoContent,baseTextName,newTextName);
|
||||
get("row"+rowID+"Content","parent").style.display = "inline-block";
|
||||
});
|
||||
}
|
||||
|
||||
removeFirstArrayItems = function() {
|
||||
rowIDArray.splice(0,1);
|
||||
repoArray.splice(0,1);
|
||||
dirArray.splice(0,1);
|
||||
actionArray.splice(0,1);
|
||||
}
|
||||
|
||||
hideRow = function(row) {
|
||||
top.rowCount--;
|
||||
updateInfo('parent');
|
||||
get('checkbox'+row,'parent').checked=false;
|
||||
parent.updateSelection(get('checkbox'+row,'parent'));
|
||||
get('row'+row,'parent').style.display = get('row'+row+'Content','parent').style.display = "none";
|
||||
}
|
||||
|
||||
function diffUsingJS (dirContent,repoContent,baseTextName,newTextName) {
|
||||
var base = difflib.stringAsLines(dirContent);
|
||||
var newtxt = difflib.stringAsLines(repoContent);
|
||||
var sm = new difflib.SequenceMatcher(base, newtxt);
|
||||
var opcodes = sm.get_opcodes();
|
||||
var diffoutputdiv = get("row"+rowID+"Content","parent");
|
||||
while (diffoutputdiv.firstChild) diffoutputdiv.removeChild(diffoutputdiv.firstChild);
|
||||
var contextSize = ""; // optional
|
||||
contextSize = contextSize ? contextSize : null;
|
||||
diffoutputdiv.appendChild(
|
||||
diffview.buildView(
|
||||
{
|
||||
baseTextLines:base,
|
||||
newTextLines:newtxt,
|
||||
opcodes:opcodes,
|
||||
baseTextName:baseTextName,
|
||||
newTextName:newTextName,
|
||||
contextSize:contextSize,
|
||||
viewType: 1 // 0 = side by side, 1 = inline
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// Add or Update files...
|
||||
ffAddOrUpdate = function(row,gitRepo,action) {
|
||||
repo.write('master', gitRepo, document.fcForm['fileContents'+row].value,parent.document.fcForm.title.value+ '\n\n'+parent.document.fcForm.message.value, function(err) {
|
||||
if(!err) {
|
||||
removeFirstArrayItems();
|
||||
hideRow(row);
|
||||
top.newCount--;
|
||||
rowIDArray.length>0 ? startProcess() : get('blackMask','top').style.display = "none";
|
||||
} else {
|
||||
alert('Sorry, there was an error adding '+gitRepo);
|
||||
}
|
||||
});
|
||||
}
|
||||
// Delete files...
|
||||
ffDelete = function(row,gitRepo,action) {
|
||||
repo.remove('master', gitRepo, function(err) {
|
||||
if(!err) {
|
||||
removeFirstArrayItems();
|
||||
hideRow(row);
|
||||
top.deletedCount--;
|
||||
rowIDArray.length>0 ? startProcess() : get('blackMask','top').style.display = "none";
|
||||
} else {
|
||||
alert('Sorry, there was an error deleting '+gitRepo);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
startProcess = function() {
|
||||
if(actionArray[0]=="changed"||actionArray[0]=="new") {
|
||||
if(actionArray[0]=="changed") {repoLoc = repoArray[0].replace(repoUser+"/"+repoName+"/","")}
|
||||
if(actionArray[0]=="new") {repoLoc = dirArray[0].replace(top.path,'')}
|
||||
ffAddOrUpdate(rowIDArray[0],repoLoc,actionArray[0]);
|
||||
}
|
||||
if(actionArray[0]=="deleted") {
|
||||
repoLoc = repoArray[0].replace(repoUser+"/"+repoName+"/","");
|
||||
ffDelete(rowIDArray[0],repoLoc,actionArray[0]);
|
||||
}
|
||||
}
|
||||
|
||||
get = function(elem,context) {
|
||||
return context ? window[context].document.getElementById(elem) : document.getElementById(elem);
|
||||
}
|
||||
|
||||
updateInfo = function(context) {
|
||||
get('infoPane',context).innerHTML = "<b style='font-size: 18px'>INFO:</b><br><br><b>"+top.rowCount+" files</b><br><br>"+top.changedCount+" changed<br>"+top.newCount+" new<br>"+top.deletedCount+" deleted";
|
||||
}
|
||||
|
||||
gitCommand = function(comm,value) {
|
||||
if (comm=="repo.show") {
|
||||
userRepo = value.split("@")[0].split("/");
|
||||
dir = value.split("@")[1];
|
||||
var repo = github.getRepo(userRepo[0],userRepo[1]);
|
||||
rowID = 0;
|
||||
repo.getTree('master?recursive=true', function(err, tree) {
|
||||
for (i=0;i<tree.length;i++) {
|
||||
repoListArray.push(tree[i].path);
|
||||
repoSHAArray.push(tree[i].sha);
|
||||
}
|
||||
var c = "", n = "", d = "";
|
||||
top.rowCount=0, top.changedCount=0, top.newCount=0, top.deletedCount=0;
|
||||
for (i=0;i<dirListArray.length;i++) {
|
||||
repoArrayPos = repoListArray.indexOf(dirListArray[i]);
|
||||
ext = dirTypeArray[i]=="dir"
|
||||
? "folder"
|
||||
: dirListArray[i].substr(dirListArray[i].lastIndexOf('.')+1);
|
||||
if (repoArrayPos == "-1") {
|
||||
rowID++;
|
||||
sE = ext == 'folder' ? ' style="cursor: default"' : '';
|
||||
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+dirListArray[i]+'\')"' : '';
|
||||
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+dirListArray[i]+'\',\''+dirListArray[i]+'\',\'new\')"';
|
||||
|
||||
n += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
|
||||
n += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.path+"/"+dirListArray[i]+"\",\"new\")'>";
|
||||
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
|
||||
n += "<div class='icon ext-"+ext+"'></div>"+dirListArray[i];
|
||||
n += "<div class='pullGithub' style='left: 815px' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Delete from server</div><br>";
|
||||
n += "</div>";
|
||||
|
||||
n += "<span class='rowContent' id='row"+rowID+"Content'></span>";
|
||||
top.rowCount++;
|
||||
top.newCount++;
|
||||
|
||||
} else if (dirTypeArray[i] == "file" && dirSHAArray[i] != repoSHAArray[repoArrayPos]) {
|
||||
rowID++;
|
||||
sE = ext == 'folder' ? ' style="cursor: default"' : '';
|
||||
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+dirListArray[i]+'\')"' : '';
|
||||
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+dirListArray[i]+'\',\''+dirListArray[i]+'\',\'changed\')"';
|
||||
|
||||
c += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
|
||||
c += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.path+"/"+dirListArray[i]+"@"+top.repo+"/"+dirListArray[i]+"\",\"changed\")'>";
|
||||
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
|
||||
c += "<div class='icon ext-"+ext+"'></div>"+dirListArray[i];
|
||||
c += "<div class='pullGithub' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Pull from Github</div><br>";
|
||||
c += "</div>";
|
||||
|
||||
c += "<span class='rowContent' id='row"+rowID+"Content'></span>";
|
||||
top.rowCount++;
|
||||
top.changedCount++;
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0;i<repoListArray.length;i++) {
|
||||
dirArrayPos = dirListArray.indexOf(repoListArray[i]);
|
||||
ext = repoListArray[i].lastIndexOf('/') > repoListArray[i].lastIndexOf('.')
|
||||
? "folder"
|
||||
: repoListArray[i].substr(repoListArray[i].lastIndexOf('.')+1);
|
||||
if (dirArrayPos == "-1") {
|
||||
rowID++;
|
||||
sE = ext == 'folder' ? ' style="cursor: default"' : '';
|
||||
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+repoListArray[i]+'\')"' : '';
|
||||
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+repoListArray[i]+'\',\''+repoListArray[i]+'\',\'deleted\')"';
|
||||
|
||||
d += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
|
||||
d += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.repo+"/"+repoListArray[i]+"\",\"deleted\")'>";
|
||||
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
|
||||
d += "<div class='icon ext-"+ext+"'></div>"+repoListArray[i];
|
||||
d += "<div class='pullGithub' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Pull from Github</div><br>";
|
||||
d += "</div>";
|
||||
|
||||
d += "<span class='rowContent' id='row"+rowID+"Content'></span>";
|
||||
top.rowCount++;
|
||||
top.deletedCount++;
|
||||
}
|
||||
}
|
||||
|
||||
c = "<b style='font-size: 18px'>CHANGED FILES:</b><br><br>"+c;
|
||||
n = "<b style='font-size: 18px'>NEW FILES:</b><br><br>"+n;
|
||||
d = "<b style='font-size: 18px'>DELETED FILES:</b><br><br>"+d
|
||||
|
||||
get('compareList').innerHTML = c+"<br><br>"+n+"<br><br>"+d;
|
||||
updateInfo();
|
||||
get('blackMask','top').style.display='none';
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
BIN
plugins/ice-repo/icon.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
plugins/ice-repo/images/ice-repo.gif
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
75
plugins/ice-repo/index.php
Normal file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
session_start();
|
||||
// $_SESSION['userLevel'] = 10;
|
||||
if ($_SESSION['userLevel'] == 0) {
|
||||
die("Sorry, you need to be logged in to use ICErepo");
|
||||
}
|
||||
|
||||
$docRoot = $_SERVER['DOCUMENT_ROOT'];
|
||||
$version = "0.7.2";
|
||||
|
||||
// AUTHENTICATION
|
||||
// Can either be done by oauth, or username & password.
|
||||
// oauth
|
||||
$token = "";
|
||||
// Basic
|
||||
$username = "username";
|
||||
$password = "password";
|
||||
|
||||
// REPOS & SERVER DIRS
|
||||
// Here you identify the repo location and related path on your server
|
||||
// (the last param is to identify which dropdown option to select by default).
|
||||
$repos = array(
|
||||
"mattpass/dirTree",$docRoot."/dirTree","",
|
||||
"mattpass/CodeMirror2",$docRoot."/CodeMirror2","selected"
|
||||
);
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ICErepo v<?php echo $version;?></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script src="lib/base64.js"></script>
|
||||
<script src="lib/github.js"></script>
|
||||
<script src="ice-repo.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="ice-repo.css">
|
||||
</head>
|
||||
|
||||
<body style="margin: 0; overflow: hidden" onLoad="doRepo(get('repos').value)">
|
||||
|
||||
<div class="blackMask" id="blackMask" style="display: block">
|
||||
<div id="loadingMsgCenter" class="loadingMsgCenter">
|
||||
<div id="loadingMsgContainer" class="loadingMsgContainer">
|
||||
WORKING...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="header">
|
||||
<select name="repos" id="repos" onChange="doRepo(this.value)" style="margin: 20px 0 0 20px">
|
||||
<?php
|
||||
for ($i=0;$i<count($repos);$i+=3) {
|
||||
echo '<option id="repo'.($i/3).'" value="'.$repos[$i].'@'.$repos[$i+1].'"';
|
||||
echo $repos[$i+2]=="selected" ? ' selected' : '';
|
||||
echo '>'.$repos[$i]."</option>\n";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
|
||||
<div class="pullGithubSel" onClick="pullContent('selected')">Pull selected from Github</div>
|
||||
<div class="version"><?php echo $version;?></div>
|
||||
<img src="images/ice-repo.gif" alt="ICErepo" class="logo">
|
||||
</div>
|
||||
|
||||
<form name="showRepo" action="contents.php" target="repo" method="POST">
|
||||
<input type="hidden" name="token" value="<?php echo $token;?>">
|
||||
<input type="hidden" name="username" value="<?php echo $username;?>">
|
||||
<input type="hidden" name="password" value="<?php echo $password;?>">
|
||||
<input type="hidden" name="repo" value="">
|
||||
</form>
|
||||
|
||||
<iframe id="repo" class="repoFrame" frameborder="0"></iframe>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
5
plugins/ice-repo/lib/base64.js
Normal file
@@ -0,0 +1,5 @@
|
||||
// This code was written by Tyler Akins and has been placed in the
|
||||
// public domain. It would be nice if you left this header intact.
|
||||
// Base64 code from Tyler Akins -- http://rumkin.com
|
||||
|
||||
var Base64=function(){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",t={encode:function(t){var n="",r,i,s,o,u,a,f,l=0;do r=t.charCodeAt(l++),i=t.charCodeAt(l++),s=t.charCodeAt(l++),o=r>>2,u=(r&3)<<4|i>>4,a=(i&15)<<2|s>>6,f=s&63,isNaN(i)?a=f=64:isNaN(s)&&(f=64),n=n+e.charAt(o)+e.charAt(u)+e.charAt(a)+e.charAt(f);while(l<t.length);return n},decode:function(t){var n="",r,i,s,o,u,a,f,l=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(l++)),u=e.indexOf(t.charAt(l++)),a=e.indexOf(t.charAt(l++)),f=e.indexOf(t.charAt(l++)),r=o<<2|u>>4,i=(u&15)<<4|a>>2,s=(a&3)<<6|f,n+=String.fromCharCode(r),a!=64&&(n+=String.fromCharCode(i)),f!=64&&(n+=String.fromCharCode(s));while(l<t.length);return n}};return t}();window.Base64=Base64
|
||||
31
plugins/ice-repo/lib/difflib.js
Normal file
11
plugins/ice-repo/lib/github.js
Normal file
@@ -0,0 +1,11 @@
|
||||
// This file contains the HTTP Req Abs, Repo API and getRepo
|
||||
// portions of Top Level API from github.com/michael/github.js
|
||||
|
||||
// ORIGINAL LIB:
|
||||
// Github.js 0.7.0
|
||||
// (c) 2012 Michael Aufreiter, Development Seed
|
||||
// Github.js is freely distributable under the MIT license.
|
||||
// For all details and documentation:
|
||||
// http://substance.io/michael/github
|
||||
|
||||
(function(){var e,t="https://api.github.com";e=window.Github=function(n){function r(e,r,i,s,o){function u(){var e=t+r;return e+(/\?/.test(e)?"&":"?")+(new Date).getTime()}var a=new XMLHttpRequest;o||(a.dataType="json"),a.open(e,u()),a.onreadystatechange=function(){this.readyState==4&&(this.status>=200&&this.status<300||this.status===304?s(null,o?this.responseText:this.responseText?JSON.parse(this.responseText):!0):s({request:this,error:this.status}))},a.setRequestHeader("Accept","application/vnd.github.raw"),a.setRequestHeader("Content-Type","application/json;charset=UTF-8"),(n.auth=="oauth"&&n.token||n.auth=="basic"&&n.username&&n.password)&&a.setRequestHeader("Authorization",n.auth=="oauth"?"token "+n.token:"Basic "+Base64.encode(n.username+":"+n.password)),i?a.send(JSON.stringify(i)):a.send()}e.Repository=function(e){function u(e,t){if(e===o.branch&&o.sha)return t(null,o.sha);i.getRef("heads/"+e,function(n,r){o.branch=e,o.sha=r,t(n,r)})}var t=e.name,n=e.user,i=this,s="/repos/"+n+"/"+t,o={branch:null,sha:null};this.getRef=function(e,t){r("GET",s+"/git/refs/"+e,null,function(e,n){if(e)return t(e);t(null,n.object.sha)})},this.createRef=function(e,t){r("POST",s+"/git/refs",e,t)},this.deleteRef=function(t,n){r("DELETE",s+"/git/refs/"+t,e,n)},this.listBranches=function(e){r("GET",s+"/git/refs/heads",null,function(t,n){if(t)return e(t);e(null,_.map(n,function(e){return _.last(e.ref.split("/"))}))})},this.getBlob=function(e,t){r("GET",s+"/git/blobs/"+e,null,t,"raw")},this.getSha=function(e,t,n){if(t==="")return i.getRef("heads/"+e,n);i.getTree(e+"?recursive=true",function(e,r){var i=_.select(r,function(e){return e.path===t})[0];n(null,i?i.sha:null)})},this.getTree=function(e,t){r("GET",s+"/git/trees/"+e,null,function(e,n){if(e)return t(e);t(null,n.tree)})},this.postBlob=function(e,t){typeof e=="string"&&(e={content:e,encoding:"utf-8"}),r("POST",s+"/git/blobs",e,function(e,n){if(e)return t(e);t(null,n.sha)})},this.updateTree=function(e,t,n,i){var o={base_tree:e,tree:[{path:t,mode:"100644",type:"blob",sha:n}]};r("POST",s+"/git/trees",o,function(e,t){if(e)return i(e);i(null,t.sha)})},this.postTree=function(e,t){r("POST",s+"/git/trees",{tree:e},function(e,n){if(e)return t(e);t(null,n.sha)})},this.commit=function(t,n,i,u){var a={message:i,author:{name:e.username},parents:[t],tree:n};r("POST",s+"/git/commits",a,function(e,t){o.sha=t.sha;if(e)return u(e);u(null,t.sha)})},this.updateHead=function(e,t,n){r("PATCH",s+"/git/refs/heads/"+e,{sha:t},function(e,t){n(e)})},this.show=function(e){r("GET",s,null,e)},this.contents=function(e,t){r("GET",s+"/contents",{path:e},t)},this.fork=function(e){r("POST",s+"/forks",null,e)},this.createPullRequest=function(e,t){r("POST",s+"/pulls",e,t)},this.read=function(e,t,n){i.getSha(e,t,function(e,t){if(!t)return n("not found",null);i.getBlob(t,function(e,r){n(e,r,t)})})},this.remove=function(e,t,n){u(e,function(r,s){i.getTree(s+"?recursive=true",function(r,o){var u=_.reject(o,function(e){return e.path===t});_.each(u,function(e){e.type==="tree"&&delete e.sha}),i.postTree(u,function(r,o){i.commit(s,o,"Deleted "+t,function(t,r){i.updateHead(e,r,function(e){n(e)})})})})})},this.move=function(e,t,n,r){u(e,function(s,o){i.getTree(o+"?recursive=true",function(s,u){_.each(u,function(e){e.path===t&&(e.path=n),e.type==="tree"&&delete e.sha}),i.postTree(u,function(n,s){i.commit(o,s,"Deleted "+t,function(t,n){i.updateHead(e,n,function(e){r(e)})})})})})},this.write=function(e,t,n,r,s){u(e,function(o,u){if(o)return s(o);i.postBlob(n,function(n,o){if(n)return s(n);i.updateTree(u,t,o,function(t,n){if(t)return s(t);i.commit(u,n,r,function(t,n){if(t)return s(t);i.updateHead(e,n,s)})})})})}},e.Gist=function(e){var t=e.id,n=this,i="/gists/"+t;this.read=function(e){r("GET",i,null,function(t,n){e(t,n)})},this.delete=function(e){r("DELETE",i,null,function(t,n){e(t,n)})},this.fork=function(e){r("POST",i+"/fork",null,function(t,n){e(t,n)})},this.update=function(e,t){r("PATCH",i,e,function(e,n){t(e,n)})}},this.getRepo=function(t,n){return new e.Repository({user:t,name:n})}}}).call(this)
|
||||
12
plugins/ice-repo/lib/underscore-min.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
// This file contains the select, reject, forEach and has functions
|
||||
// from underscore.js, then minified to make it extra tiny
|
||||
|
||||
// Underscore.js 1.3.3
|
||||
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
|
||||
// Underscore may be freely distributed under the MIT license.
|
||||
// Portions of Underscore are inspired or borrowed from Prototype,
|
||||
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
||||
// For all details and documentation:
|
||||
// http://documentcloud.github.com/underscore
|
||||
|
||||
(function(){var e=this,t=Array.prototype,n=Object.prototype,r=t.forEach,i=t.filter,s=n.hasOwnProperty,o={};_=function(obj) {return new wrapper(obj);};_.filter=_.select=function(e,t,n){var r=[];return e==null?r:i&&e.filter===i?e.filter(t,n):(u(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},_.reject=function(e,t,n){var r=[];return e==null?r:(u(e,function(e,i,s){t.call(n,e,i,s)||(r[r.length]=e)}),r)};var u=_.each=_.forEach=function(e,t,n){if(e==null)return;if(r&&e.forEach===r)e.forEach(t,n);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(i in e&&t.call(n,e[i],i,e)===o)return}else for(var u in e)if(_.has(e,u)&&t.call(n,e[u],u,e)===o)return};_.has=function(e,t){return s.call(e,t)}}).call(this)
|
||||
|
Before Width: | Height: | Size: 551 B After Width: | Height: | Size: 551 B |
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
// -----------------------------------------------
|
||||
// Zip-It! for ICEcoder v0.9.3 by Matt Pass
|
||||
// Zip-It! for ICEcoder v0.9.5 by Matt Pass
|
||||
// Will backup requested files/folders in ICEcoder
|
||||
// and remove old backups older than $keepLastDays
|
||||
// -----------------------------------------------
|
||||
@@ -13,12 +13,12 @@ include("../../lib/settings.php");
|
||||
</head>
|
||||
<body>
|
||||
<?
|
||||
$zipItSaveLocation = '../../backups/';
|
||||
if ($_GET['zip']=="|") {$zipItFileName = "root";} else {$zipItFileName = str_replace("|","_",strClean($_GET['zip']));};
|
||||
$zipItFileName .= '-'.time().'.zip';
|
||||
$saveLocation = '../../backups/';
|
||||
$_GET['zip']=="|" ? $fileName = "root" : $fileName = str_replace("|","_",strClean($_GET['zip']));
|
||||
$fileName .= '-'.time().'.zip';
|
||||
$keepLastDays = 7;
|
||||
|
||||
if (!is_dir($zipItSaveLocation)) {mkdir($zipItSaveLocation, 0777);}
|
||||
if (!is_dir($saveLocation)) {mkdir($saveLocation, 0777);}
|
||||
Class zipIt {
|
||||
public function zipFilesUp($zipDir,$zipFile,$keepLastDays,$docRoot) {
|
||||
$zipName = $zipDir.$zipFile;
|
||||
@@ -34,7 +34,7 @@ Class zipIt {
|
||||
$dir = dir($currentDir);
|
||||
while (false !== ($node = $dir->read())) {
|
||||
if (($node == '.') || ($node == '..')) {continue;}
|
||||
if (is_dir($currentDir.$node) && !strpos($currentDir.$node,"_coder")) {
|
||||
if (is_dir($currentDir.$node) && !strpos($currentDir.$node,"_coder") && !strpos($currentDir.$node,"ICEcoder")) {
|
||||
array_push($dirStack,$currentDir.$node.'/');
|
||||
}
|
||||
if (is_file($currentDir.$node)) {$zipFiles[] = $currentDir.$node;}
|
||||
@@ -77,14 +77,14 @@ Class zipIt {
|
||||
}
|
||||
}
|
||||
if($_SESSION['userLevel']==10) {
|
||||
$zipItDoZip = new zipIt();
|
||||
$doZip = new zipIt();
|
||||
echo '<script>top.ICEcoder.serverMessage("<b>Zipping Files</b>");</script>';
|
||||
$zipItAddToZip = $zipItDoZip->zipFilesUp($zipItSaveLocation,$zipItFileName,$keepLastDays,$docRoot);
|
||||
if (!$zipItAddToZip) {
|
||||
echo '<script>top.ICEcoder.message("Could not zip files up!");</script>';
|
||||
} else {
|
||||
echo '<script>setTimeout(function(){top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);},500);</script>';
|
||||
}
|
||||
$addToZip = $doZip->zipFilesUp($saveLocation,$fileName,$keepLastDays,$docRoot);
|
||||
echo '<script>';
|
||||
echo !$addToZip
|
||||
? 'top.ICEcoder.message("Could not zip files up!");'
|
||||
: 'setTimeout(function(){top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);},500);';
|
||||
echo '</script>';
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
|
||||