var ICEcoder = { // Define settings filesW: 250, // Initial width of the files pane minFilesW: 14, // Min width of the files pane maxFilesW: 250, // Max width of the files pane selectedTab: 0, // The tab that's currently selected changedContent: [], // Binary array to indicate which tabs have changed ctrlKeyDown: false, // Indicates if CTRL keydown shiftKeyDown: false, // Indicates if Shift keydown delKeyDown: false, // Indicates if DEL keydown canSwitchTabs: true, // Stops switching of tabs when trying to close openFiles: [], // Array of open file URLs openFileMDTs: [], // Array of open file modification datetimes cMInstances: [], // List of CodeMirror instance no's nextcMInstance: 1, // Next available CodeMirror instance no selectedFiles: [], // Array of selected files findMode: false, // States if we're in find/replace mode lockedNav: true, // Nav is locked or not codeAssist: true, // Assist user with their coding mouseDown: false, // If the mouse is down or not draggingFilesW: false, // If we're dragging the file manager width or not serverQueueItems: [], // Array of URLs to call in order stickyTab: false, // If we have a sticky tab open or not stickyTabWindow: false, // Target variable for the sticky tab window pluginIntervalRefs: [], // Array of plugin interval refs dragSrcEl: null, // Tab element being dragged ready: false, // Indicates if ICEcoder is ready for action // Don't consider these tags as part of nesting as they're singles, JS, PHP or Ruby code blocks tagNestExceptions: ["!DOCTYPE","meta","link","img","br","hr","input","script","?php","?","%"], // Set our aliases initAliases: function() { var aliasArray = ["header","files","account","accountLogin","fmLock","filesFrame","editor","tabsBar","findBar","content","footer","nestValid","nestDisplay","charDisplay"]; // Create our ID aliases for (var i=0;i value fileName = ICEcoder.openFiles[ICEcoder.selectedTab-1]; if (fileName.indexOf(".js")<0 && fileName.indexOf(".coffee")<0 && fileName.indexOf(".rb")<0 && fileName.indexOf(".css")<0 && fileName.indexOf(".less")<0) { cM = ICEcoder.getcMInstance(); content = cM.getValue(); content = content.replace(//g,''); // Then set the content in the editor & clear the history cM.setValue(content); cM.clearHistory(); } }, // Work out the nesting depth location on demand and update our display if required getNestLocation: function(updateNestDisplay) { var cM, openTag, nestCheck, startPos, tagStart, canDoTheEndTag, tagEnd, tagEndJS, fileName; cM = ICEcoder.getcMInstance(); nestCheck = cM.getValue(); // Set up array to store nest data, a var to establish if a tag is open and another to establish if we're in a code block ICEcoder.htmlTagArray = [], openTag = false, ICEcoder.codeBlock = false; // For every character from the start to our caret position for(var i=0;i<=ICEcoder.caretPos;i++) { // If we find a < tag and we're not within a tag, change the open tag state & set our start position if(nestCheck.charAt(i)=="<" && openTag==false) { openTag=true; startPos=i+1; // Get the tag name and if it's the start of a code block, set the var for that tagStart=nestCheck.substr(startPos,nestCheck.length).split(" ")[0].split(">")[0].split("\n")[0]; if (tagStart=="script"||tagStart=="?php"||tagStart=="?"||tagStart=="%") {ICEcoder.codeBlock=true} if (tagStart!="") {ICEcoder.tagStart=tagStart} }; // If we find a > tag and we're within a tag or codeblock if(nestCheck.charAt(i)==">" && (openTag||ICEcoder.codeBlock)) { // Get the tag name tagString=nestCheck.substr(0,i); tagString=tagString.substr(tagString.lastIndexOf('<')+1,tagString.length); tagString=tagString.split(" ")[0]; ICEcoder.tagString = tagString; canDoTheEndTag=true; // Check it's not on our list of exceptions for (var j=0;j-1||nestCheck.indexOf("-1)) { // Then for all the array items, output as the nest display for (var i=0;i'+ICEcoder.htmlTagArray[i]+''; if(i ICEcoder.minFilesW+1 ? ICEcoder.filesW -= Math.ceil((ICEcoder.filesW-ICEcoder.minFilesW)/2) : ICEcoder.filesW = ICEcoder.minFilesW; } if ((expandContract=="expand" && ICEcoder.filesW == ICEcoder.maxFilesW)||(expandContract=="contract" && ICEcoder.filesW == ICEcoder.minFilesW)) { clearInterval(ICEcoder.changeFilesInt); } // Redo the layout to match ICEcoder.setLayout(); }, // Can click-drag file manager width? canResizeFilesW: function() { // If we have the cursor set we must be able! if (top.document.body.style.cursor == "w-resize") { // If our mouse is down and we're within a 250-400px range if (top.ICEcoder.mouseDown) { top.ICEcoder.filesW = top.ICEcoder.maxFilesW = top.ICEcoder.mouseX >=250 && top.ICEcoder.mouseX <= 400 ? top.ICEcoder.mouseX : top.ICEcoder.mouseX <250 ? 250 : 400; // Set various widths based on the new width top.ICEcoder.files.style.width = top.ICEcoder.account.style.width = top.ICEcoder.filesFrame.style.width = top.ICEcoder.filesW + "px"; top.ICEcoder.setLayout(); top.ICEcoder.draggingFilesW = true; } } else { top.ICEcoder.draggingFilesW = false; } }, // Change tabs by switching visibility of instances switchTab: function(newTab,noFocus) { var cM; // Identify tab that's currently selected & get the instance ICEcoder.selectedTab = newTab; cM = ICEcoder.getcMInstance(); if (cM) { // Switch mode to HTML, PHP, CSS etc ICEcoder.switchMode(); // Set all cM instances to be hidden, then make our selected instance visable for (var i=0;i0 ? document.getElementById('closeTabButton'+i).style.backgroundColor = "#b00" : document.getElementById('closeTabButton'+i).style.backgroundColor = "rgba(255,255,255,0.3)"; } i==selectedTab ? tColor = "#000" : tColor = "#fff"; if ("undefined" != typeof top.ICEcoder.openFiles[i-1] && top.ICEcoder.openFiles[i-1] != "/[NEW]") { fileLink = top.ICEcoder.filesFrame.contentWindow.document.getElementById(top.ICEcoder.openFiles[i-1].replace(/\//g,"|")); if (fileLink) {i==selectedTab ? fileLink.style.backgroundColor = "#49d" : fileLink.style.backgroundColor = "rgba(255,255,255,0.15)";}; } document.getElementById('tab'+i).style.color = tColor; i==selectedTab ? bgVPos = -22 : bgVPos = 0; document.getElementById('tab'+i).style.backgroundPosition = "0 "+bgVPos+"px"; } top.ICEcoder.fMIconVis('fMSave',ICEcoder.changedContent[selectedTab-1]==1 ? 1 : 0.3); }, // Starts a new file by setting a few vars & creating a new cM instance newTab: function() { var cM; ICEcoder.cMInstances.push(ICEcoder.nextcMInstance); ICEcoder.selectedTab = ICEcoder.cMInstances.length; ICEcoder.content.style.visibility='visible'; ICEcoder.content.contentWindow.createNewCMInstance(ICEcoder.nextcMInstance); ICEcoder.thisFileFolderType='file'; ICEcoder.thisFileFolderLink='/[NEW]'; ICEcoder.openFile(); cM = ICEcoder.getcMInstance('new'); ICEcoder.switchTab(ICEcoder.openFiles.length); cM.setLineClass(ICEcoder['cMActiveLine'+ICEcoder.selectedTab], null); ICEcoder['cMActiveLine'+ICEcoder.selectedTab] = cM.setLineClass(0, "cm-s-activeLine"); ICEcoder.nextcMInstance++; }, // Create a new tab for a file createNewTab: function() { var closeTabLink; // Push new file into array top.ICEcoder.openFiles.push(top.ICEcoder.shortURL); // Setup a new tab closeTabLink = ''; top.document.getElementById('tab'+(top.ICEcoder.openFiles.length)).style.display = "inline-block"; top.document.getElementById('tab'+(top.ICEcoder.openFiles.length)).innerHTML = top.ICEcoder.openFiles[top.ICEcoder.openFiles.length-1] + " " + closeTabLink; // Highlight it and state it's selected top.ICEcoder.redoTabHighlight(top.ICEcoder.openFiles.length); top.ICEcoder.selectedTab=top.ICEcoder.openFiles.length; // Add a new value ready to indicate if this content has been changed top.ICEcoder.changedContent.push(0); 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; // Push new file into array top.ICEcoder.openFiles[tabNum-1] = newName; // Setup a new tab closeTabLink = ''; top.document.getElementById('tab'+tabNum).innerHTML = top.ICEcoder.openFiles[tabNum-1] + " " + closeTabLink; }, // Indicate if the nesting structure of the code is OK updateNestingIndicator: function () { var cM, fileName, nestOK; cM = ICEcoder.getcMInstance(); fileName = ICEcoder.openFiles[ICEcoder.selectedTab-1]; ICEcoder.caretPos=cM.getValue().length; ICEcoder.getNestLocation(); nestOK = false; // Nesting is OK if at the end of the file we have no nests left, or it's a JS, Ruby or CSS file if (ICEcoder.htmlTagArray.length==0||fileName.indexOf(".js")>0||fileName.indexOf(".coffee")>0||fileName.indexOf(".rb")>0||fileName.indexOf(".css")>0||fileName.indexOf(".less")>0) { nestOK = true; } ICEcoder.nestValid.style.backgroundColor = nestOK ? "#0b0" : "#f00"; ICEcoder.nestValid.innerHTML = nestOK ? "Nesting OK" : "Nesting Broken"; }, // Get the caret position on demand getCaretPosition: function() { var cM, content, line, char, charPos, charCount; cM = ICEcoder.getcMInstance(); content = cM.getValue(); line = cM.getCursor().line; char = cM.getCursor().ch; charPos = 0; for (var i=0;icaretChunk.lastIndexOf("")&&caretLocType=="Unknown") {caretLocType = "JavaScript"}; if (caretChunk.lastIndexOf("caretChunk.lastIndexOf("?>")&&caretLocType=="Unknown") {caretLocType = "PHP"}; if (caretChunk.lastIndexOf("<%")>caretChunk.lastIndexOf("%>")&&caretLocType=="Unknown") {caretLocType = "Ruby"}; if (caretChunk.lastIndexOf("<")>caretChunk.lastIndexOf(">")&&caretLocType=="Unknown") {caretLocType = "HTML"}; if (caretLocType=="Unknown") {caretLocType = "Content"}; fileName = ICEcoder.openFiles[ICEcoder.selectedTab-1]; if (fileName.indexOf(".js")>0) {caretLocType="JavaScript"}; if (fileName.indexOf(".coffee")>0) {caretLocType="CoffeeScript"}; if (fileName.indexOf(".rb")>0) {caretLocType="Ruby"}; if (fileName.indexOf(".css")>0) {caretLocType="CSS"}; if (fileName.indexOf(".less")>0) {caretLocType="LESS"}; ICEcoder.caretLocType = caretLocType; // If we're in a JS, CoffeeScript PHP or Ruby code block, add that to the nest display if (["JavaScript","CoffeeScript","PHP","Ruby"].indexOf(caretLocType)) { ICEcoder.nestDisplay.innerHTML += " > " + caretLocType; } }, // Alter array indicating which files have changed redoChangedContent: function(evt) { var key; key = evt.keyCode ? evt.keyCode : evt.which ? evt.which : evt.charCode; // Exclude a few keys such as Escape... if (top.ICEcoder.ctrlKeyDown==false && key!=27 && key!=20 && (key<16||key>19) && (key<37||key>40) && (key!=144||key!=145) && (key!=44||key!=45) && (key<33||key>36) && (key!=91||key!=92) && (key<112||key>123)) { ICEcoder.changedContent[ICEcoder.selectedTab-1] = 1; ICEcoder.redoTabHighlight(ICEcoder.selectedTab); } }, // Close the tab upon request closeTab: function(closeTabNum) { var cM, okToRemove; cM = ICEcoder.getcMInstance(); okToRemove = true; if (ICEcoder.changedContent[closeTabNum-1]==1) { okToRemove = top.ICEcoder.ask('You have made changes.\n\nAre you sure you want to close without saving?'); } if (okToRemove) { // recursively copy over all tabs & data from the tab to the right, if there is one for (var i=closeTabNum;i0 ? ICEcoder.selectedTab-=1 : ICEcoder.selectedTab = 0; } if (ICEcoder.openFiles.length>0 && ICEcoder.selectedTab==0) {ICEcoder.selectedTab=1}; // grey out the view icon if (ICEcoder.openFiles.length==0) { top.ICEcoder.fMIconVis('fMView',0.3); } else { // Switch the mode & the tab ICEcoder.switchMode(); ICEcoder.switchTab(ICEcoder.selectedTab); } // Highlight the selected tab after splicing the change state out of the array top.ICEcoder.changedContent.splice(closeTabNum-1,1); top.parent.ICEcoder.redoTabHighlight(ICEcoder.selectedTab); top.ICEcoder.setPreviousFiles(); } // Lastly, stop it from trying to also switch tab top.ICEcoder.canSwitchTabs=false; }, // Setup the file manager fileManager: function() { ICEcoder.filesFrame = top.document.getElementById('filesFrame'); if (!ICEcoder.filesFrame.contentWindow.document.getElementsByTagName) {return;}; var aMenus = ICEcoder.filesFrame.contentWindow.document.getElementsByTagName("LI"); for (var i=0; i-1) { var submenu=aMenus[i].childNodes; for (var j=0; j 0 ? 1 : 0.3); top.ICEcoder.fMIconVis('fMRename',top.ICEcoder.selectedFiles.length == 1 ? 1 : 0.3); // Hide the file menu incase it's showing top.document.getElementById('fileMenu').style.display = "none"; }, // Select or deselect file selectDeselectFile: function(action,file) { var isOpen; isOpen = top.ICEcoder.openFiles.indexOf(file.id.replace(/\|/g,"/")) > -1 ? true : false; if (top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1] == file.id.replace(/\|/g,"/")) { file.style.backgroundColor="#49d"; } else { if (action=="select") { file.style.backgroundColor="#888"; } else { file.style.backgroundColor = isOpen ? "rgba(255,255,255,0.15)" : "transparent"; } } file.style.color= action=="select" ? "#fff" : "#eee"; }, // Create a new file (start & instant save) newFile: function() { top.ICEcoder.newTab(); top.ICEcoder.saveFile(); }, // Create a new folder newFolder: function() { var newFolder, shortURL; shortURL = top.ICEcoder.rightClickedFile.replace(/\|/g,"/"); newFolder = top.ICEcoder.getInput('Enter New Folder Name at '+shortURL,''); if (newFolder) { newFolder = (shortURL + "/" + newFolder).replace(/\/\//,"/"); top.ICEcoder.serverQueue("add","lib/file-control.php?action=newFolder&file="+newFolder.replace(/\//g,"|")); top.ICEcoder.serverMessage('Creating Folder
'+newFolder); } }, // Open a file on demand openFile: function(fileLink) { if (fileLink) { top.ICEcoder.thisFileFolderLink=fileLink; top.ICEcoder.thisFileFolderType="file"; } if (top.ICEcoder.thisFileFolderLink!="" && top.ICEcoder.thisFileFolderType=="file") { var shortURL, canOpenFile; // work out a shortened URL for the file shortURL = top.ICEcoder.thisFileFolderLink.replace(/\|/g,"/"); // No reason why we can't open a file (so far) canOpenFile = true; // Limit to 10 files open at a time if (top.ICEcoder.openFiles.length<10) { // check if we've already got it in our array for (var i=0;iOpening File
'+top.ICEcoder.shortURL); } else { top.ICEcoder.createNewTab(); } top.ICEcoder.fMIconVis('fMView',1); } } }, // Save a file on demand saveFile: function(saveAs) { var saveType; saveType = saveAs ? "saveAs" : "save"; top.ICEcoder.serverQueue("add","lib/file-control.php?action=save&file="+ICEcoder.openFiles[ICEcoder.selectedTab-1].replace(/\//g,"|")+"&fileMDT="+ICEcoder.openFileMDTs[ICEcoder.selectedTab-1]+"&saveType="+saveType); top.ICEcoder.serverMessage('Saving
'+ICEcoder.openFiles[ICEcoder.selectedTab-1]); }, // Prompt a rename dialog on demand renameFile: function(oldName,newName) { var shortURL; if (!oldName) { shortURL = top.ICEcoder.rightClickedFile.replace(/\|/g,"/"); oldName = top.ICEcoder.rightClickedFile.replace(/\|/g,"/"); } else { shortURL = oldName.replace(/\|/g,"/"); } if (!newName) { newName = top.ICEcoder.getInput('Please enter the new name for',shortURL); } if (newName) { for (var i=0;i'; top.document.getElementById('tab'+(i+1)).innerHTML = top.ICEcoder.openFiles[i] + " " + closeTabLink; } } top.ICEcoder.serverQueue("add","lib/file-control.php?action=rename&file="+newName+"&oldFileName="+oldName.replace(/\|/g,"/")); top.ICEcoder.serverMessage('Renaming to
'+newName); top.ICEcoder.setPreviousFiles(); } }, // Delete a file on demand deleteFile: function() { var delFiles, selectedFilesList; delFiles = top.ICEcoder.ask('Delete:\n\n'+top.ICEcoder.selectedFiles.toString().replace(/\|/g,"/").replace(/,/g,"\n")+'?'); // Upon supply a new name, rename tabs and update filename on server if (delFiles) { selectedFilesList = ""; for (var i=0;iDeleting File
'+top.ICEcoder.selectedFiles.toString().replace(/\|/g,"/").replace(/,/g,"\n")); }; }, // Show menu on right clicking in file manager showMenu: function() { var menuType, folderMenuItems, foundFile; if (top.ICEcoder.selectedFiles.length == 0) {top.ICEcoder.selectFileFolder()}; foundFile=false; for (var i=0;i<=top.ICEcoder.selectedFiles.length-1;i++) { if (top.ICEcoder.rightClickedFile==top.ICEcoder.selectedFiles[i].replace(/\|/g,"/")) {foundFile=true}; } if (!foundFile) {top.ICEcoder.selectFileFolder()}; if ("undefined" != typeof top.ICEcoder.thisFileFolderLink && top.ICEcoder.thisFileFolderLink!="") { menuType = top.ICEcoder.selectedFiles[0].indexOf(".")>-1 ? "file" : "folder"; folderMenuItems = top.document.getElementById('folderMenuItems'); folderMenuItems.style.display = menuType == "folder" && top.ICEcoder.selectedFiles.length == 1 ? "block" : "none"; singleFileMenuItems.style.display = top.ICEcoder.selectedFiles.length > 1 ? "none" : "block"; document.getElementById('fileMenu').style.display = "inline-block"; document.getElementById('fileMenu').style.left = (top.ICEcoder.mouseX+20) + "px"; document.getElementById('fileMenu').style.top = (top.ICEcoder.mouseY-top.document.getElementById('filesFrame').contentWindow.document.body.scrollTop+10) + "px"; } return false; }, // Show & hide target element showHide: function(doVis,elem) { 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 (line0 && document.findAndReplace.target.value=="this document") { cM = ICEcoder.getcMInstance(); content = cM.getValue(); // Find & replace the next instance, or all? if (document.findAndReplace.connector.value=="and") { if (document.findAndReplace.replaceAction.value=="replace" && cM.getSelection()==find) { cM.replaceSelection(document.getElementById('replace').value); } if (document.findAndReplace.replaceAction.value=="replace all" && buttonClick) { var rExp = new RegExp(find,"g"); cM.setValue(cM.getValue().replace(rExp,document.getElementById('replace').value)); } } // Get the content again, as it might of changed content = cM.getValue(); if (!top.ICEcoder.findMode||parent.parent.document.getElementById('find').value!=ICEcoder.lastsearch) { ICEcoder.results = []; for (var i=0;i0) { // Show results only if (resultsOnly) { parent.parent.document.getElementById('results').innerHTML = ICEcoder.results.length + " results"; // We need to take action instead } else { lineCount=1; numChars=0; // Count the no of chars & lines previous to our cursor's line for (var i=0;iICEcoder.results.length-1) {ICEcoder.findResult=0}; parent.parent.document.getElementById('results').innerHTML = "Highlighted result "+(ICEcoder.findResult+1)+" of "+ICEcoder.results.length+" results"; lineCount=0; for (var i=0;i=0) { targetQS = "&target="+document.findAndReplace.target.value.replace(/ /g,"-"); } top.document.getElementById('mediaContainer').innerHTML = ''; } } }, // Go to a specific line number goToLine: function(lineNo) { var cM; cM = ICEcoder.getcMInstance(); cM.setCursor(lineNo ? lineNo-1 : document.getElementById('goToLineNo').value-1); cM.focus(); return false; }, // Switch the CodeMirror mode on demand switchMode: function() { var cM; cM = ICEcoder.getcMInstance(); fileName = ICEcoder.openFiles[ICEcoder.selectedTab-1]; if (fileName) { if (fileName.indexOf('.js')>0) { cM.setOption("mode","javascript"); } else if (fileName.indexOf('.coffee')>0) { cM.setOption("mode","coffeescript"); } else if (fileName.indexOf('.rb')>0) { cM.setOption("mode","ruby"); } else if (fileName.indexOf('.css')>0) { cM.setOption("mode","css"); } else if (fileName.indexOf('.less')>0) { cM.setOption("mode","less"); } else { cM.setOption("mode","application/x-httpd-php"); } } }, // Lock & unlock the file manager navigation on demand lockUnlockNav: function() { var lockIcon; lockIcon = top.document.getElementById('fmLock'); ICEcoder.lockedNav = ICEcoder.lockedNav ? false : true; lockIcon.style.backgroundPosition = ICEcoder.lockedNav ? "-64px -16px" : "-80px -16px"; }, // Determine the CodeMirror instance we're using on demand getcMInstance: function(newTab) { var cM; cM = top.ICEcoder.content.contentWindow[ newTab=="new"||(newTab!="new" && ICEcoder.openFiles.length>0) ? 'cM'+ICEcoder.cMInstances[ICEcoder.selectedTab-1] : 'cM1' ]; return cM; }, // Start running plugin intervals according to given specifics startPluginIntervals: function(plugRef,plugURL,plugTarget,plugTimer) { // For this window instances if (plugTarget=="_parent"||plugTarget=="_top"||plugTarget=="_self"||plugTarget=="") { top.ICEcoder['plugTimer'+plugRef] = setInterval('window.location=\''+plugURL+'\'',plugTimer*1000*60); // for fileControl iframe instances } else if (plugTarget.indexOf("fileControl")==0) { top.ICEcoder['plugTimer'+plugRef] = setInterval(function() {top.ICEcoder.serverQueue("add",plugURL);top.ICEcoder.serverMessage(plugTarget.split(":")[1]);},plugTimer*1000*60); // for _blank or named target window instances } else { top.ICEcoder['plugTimer'+plugRef] = setInterval('window.open(\''+plugURL+'\',\''+plugTarget+'\')',plugTimer*1000*60); } // push the plugin ref into our array top.ICEcoder.pluginIntervalRefs.push(plugRef); }, // Comment or uncomment line on keypress lineCommentToggle: function() { var cM, cursorPos, linePos, lineContent, lCLen, adjustCursor, startLine, endLine; cM = ICEcoder.getcMInstance(); cursorPos = cM.getCursor().ch; linePos = cM.getCursor().line; lineContent = cM.getLine(linePos); lCLen = lineContent.length; adjustCursor = 3; if (ICEcoder.caretLocType=="JavaScript"||ICEcoder.caretLocType=="CoffeeScript"||ICEcoder.caretLocType=="PHP"||ICEcoder.caretLocType=="Ruby"||ICEcoder.caretLocType=="CSS") { if (cM.somethingSelected()) { if (ICEcoder.caretLocType=="Ruby") { startLine = cM.getCursor(true).line; endLine = cM.getCursor().line; for (var i = startLine; i<=endLine; i++) { cM.getLine(i).slice(0,2)!="# " ? cM.setLine(i, "# " + cM.getLine(i)) : cM.setLine(i, cM.getLine(i).slice(2,cM.getLine(i).length)); } } else { if (cM.getSelection().slice(0,2)!="/*") { cM.replaceSelection("/*" + cM.getSelection() + "*/"); } else { cM.replaceSelection(cM.getSelection().slice(2,cM.getSelection().length-2)); } } } else { if (ICEcoder.caretLocType=="CSS"||ICEcoder.caretLocType=="CoffeeScript") { lineContent.slice(0,3)!="/* " ? cM.setLine(linePos, "/* " + lineContent + " */") : cM.setLine(linePos, lineContent.slice(3,lCLen).slice(0,lCLen-5)); if (lineContent.slice(0,3)=="/* ") {adjustCursor = -adjustCursor}; } else if (ICEcoder.caretLocType=="Ruby") { lineContent.slice(0,2)!="# " ? cM.setLine(linePos, "# " + lineContent) : cM.setLine(linePos, lineContent.slice(2,lCLen)); if (lineContent.slice(0,2)=="# ") {adjustCursor = -adjustCursor}; } else { lineContent.slice(0,3)!="// " ? cM.setLine(linePos, "// " + lineContent) : cM.setLine(linePos, lineContent.slice(3,lCLen)); if (lineContent.slice(0,3)=="// ") {adjustCursor = -adjustCursor}; } } } else { if (cM.somethingSelected()) { if (cM.getSelection().slice(0,4)!=""); } else { cM.replaceSelection(cM.getSelection().slice(4,cM.getSelection().length-5)); } } else { lineContent.slice(0,4)!="") : cM.setLine(linePos, lineContent.slice(4,lCLen).slice(0,lCLen-9)); lineContent.slice(0,4)=="