// A script for Clover Theme Manager // Copyright (C) 2014-2015 Blackosx // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // //Version=0.75.4 var gTmpDir = "/tmp/CloverThemeManager/"; var gLogBashToJs = "CloverThemeManager_BashToJs.log"; var lastLine="-1"; var prevLastLine=""; var prevLastLineCount=0; var eof=0; //------------------------------------------------------------------------------------- // On initial load $(document).ready(function() { macgap.app.launch("started") readLogFileForMessages(); }); //------------------------------------------------------------------------------------- // Called when the process is to close. function terminate() { //clearTimeout(timerCheckEof); macgap.app.terminate(); } //------------------------------------------------------------------------------------- // looks for a file and if found, returns the contents function GetFileContents(filename) { xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET",gTmpDir+"/"+filename,false); xmlhttp.send(null); fileContent = xmlhttp.responseText; if (fileContent != "" ) { return fileContent; } else { return 0; } } //------------------------------------------------------------------------------------- function redirectToMainPage() { var redirect=(gTmpDir + "managethemes.html" ); window.location = (redirect); } //------------------------------------------------------------------------------------- function SetMessageBoxText(title,message) { $(".box h1").html(title); $(".box p").html(message); } //------------------------------------------------------------------------------------- function HideMessageBoxClose() { $("a.boxclose").css("display","none"); } //------------------------------------------------------------------------------------- function ShowMessageBoxClose() { $("a.boxclose").css("display","block"); } //------------------------------------------------------------------------------------- function ShowMessageBox() { // Read position of box and only fade in if at default off screen position. var position = $('#box').position(); if (position.top = -300) { // starting position = should match .box top in css $('#overlay').fadeIn('fast',function(){ $('#box').animate({'top':'150px'},500, function(){ // Bounce doBounce($('.box'), 2, '10px', 100); }); }); } } //------------------------------------------------------------------------------------- // from http://stackoverflow.com/questions/10363671/jquery-bounce-effect-on-click-no-jquery-ui function doBounce(element, times, distance, speed) { for(var i = 0; i < times; i++) { element.animate({marginTop: '-='+distance}, speed) .animate({marginTop: '+='+distance}, speed); } } //------------------------------------------------------------------------------------- function CloseMessageBox() { // Read position of box and only fade out if at calculated top position is 150px which is set in ShowMessageBox() var position = $('#box').position(); if (position.top = 150) { $('#box').animate({'top':'-300px'},500,function(){ // starting position = should match .box top in css $('#overlay').fadeOut('fast'); }); } } //------------------------------------------------------------------------------------- $(function() { //----------------------------------------------------- // On clicking the message box close button $('#boxclose').click(function(){ CloseMessageBox(); macgap.app.terminate(); }); }); //------------------------------------------------------------------------------------- function ChangeMessageBoxHeaderColour(colour) { if(colour == "blue") { $("#box h1").css("background-color","#1e8ec6"); $("#box h1").css("color","#c4e0ee"); } if(colour == "red") { $("#box h1").css("background-color","#b43239"); $("#box h1").css("color","#f2d6d8"); } if(colour == "green") { $("#box h1").css("background-color","#8db035"); $("#box h1").css("color","#e4ecce"); } } // Read /tmp/CloverThemeManager/CloverThemeManagerLog.txt looking for embedded // messages for showing the initialisation process. //------------------------------------------------------------------------------------- function readLogFileForMessages() { eof=0; var splitContent=""; fileContent=GetFileContents("CloverThemeManagerLog.txt"); if (fileContent != 0) { splitContent = fileContent.split("\n"); lastLine = splitContent[splitContent.length-2]; if (lastLine != prevLastLine) { for (i = prevLastLineCount; i <= splitContent.length; i++) { // Does this line contain CTM_AppVersion? if (/CTM_Version/i.test(splitContent[i])) { // remove anything before the 'CTM_Version' text. version = splitContent[i].substring(splitContent[i].indexOf("CTM_Version") + 11); // append version to title. $("#textversions").text(version); } else if (/CTM_GitOK/i.test(splitContent[i])) { $("#check_GitInstalled").append( " \u2713" ); $("#status_GitInstalled").css("color","#FFF"); } else if (/CTM_GitFail/i.test(splitContent[i])) { $("#status_GitInstalled").css("color","#DD171B"); ChangeMessageBoxHeaderColour("red"); SetMessageBoxText('Attention: git is not installed' , 'git is a requirement for this app and it cannot continue without it.

To install only git, you can download an installer from http://git-scm.com, double click the .dmg and run the .pkg.

Alternatively you can install the Xcode command line developer tools by loading up Terminal and typing xcode-select --install

This app will quit once you close this box.'); $("#AnimatedBar").css("display","none"); ShowMessageBox(); // Send native notification //sendNotification("Problem: git is not installed."); } else if (/CTM_HTMLTemplateOK/i.test(splitContent[i])) { $("#check_HtmlTemplate").append( " \u2713" ); $("#status_HtmlTemplate").css("color","#FFF"); } else if (/CTM_HTMLTemplateFail/i.test(splitContent[i])) { $("#status_HtmlTemplate").css("color","#DD171B"); } else if (/CTM_RepositoryCheckNetwork/i.test(splitContent[i])) { $("#status_Repository").text( 'Checking network gateway...' ).append( '' ); $("#status_Repository").css("color","#FFAE40"); } else if (/CTM_RepositoryChecking/i.test(splitContent[i])) { $("#status_Repository").text( 'Connecting to repository...' ).append( '' ); $("#status_Repository").css("color","#FFAE40"); } else if (/CTM_RepositorySuccess/i.test(splitContent[i])) { $("#status_Repository").text( 'Repository online' ).append( '' ); $("#check_Repository").append( " \u2713" ); $("#status_Repository").css("color","#FFF"); } else if (/CTM_RepositoryError/i.test(splitContent[i])) { $("#status_Repository").css("color","#DD171B"); ChangeMessageBoxHeaderColour("red"); SetMessageBoxText('Attention: Repository' , 'The remote Clover Theme repository is not responding. This app cannot continue and will exit when you close this dialog box.

Check Repo in Web Browser'); $("#AnimatedBar").css("display","none"); ShowMessageBox(); // Send native notification //sendNotification("Problem: The remote Clover Theme repository is not responding."); } else if (/CTM_SupportDirOK/i.test(splitContent[i])) { $("#check_SupportDir").append( " \u2713" ); $("#status_SupportDir").css("color","#FFF"); } else if (/CTM_SupportDirFail/i.test(splitContent[i])) { $("#status_SupportDir").css("color","#DD171B"); } else if (/CTM_SymbolicLinksOK/i.test(splitContent[i])) { $("#check_SymbolicLink").append( " \u2713" ); $("#status_SymbolicLink").css("color","#FFF"); } else if (/CTM_SymbolicLinksFail/i.test(splitContent[i])) { $("#status_SymbolicLink").css("color","#DD171B"); } else if (/CTM_IndexCloneAndCheckout/i.test(splitContent[i])) { $("#status_Index").text( 'Downloading updated git index' ).append( '' ); $("#status_Index").css("color","#FFAE40"); } else if (/CTM_IndexOK/i.test(splitContent[i])) { $("#check_Index").append( " \u2713" ); $("#status_Index").css("color","#FFF"); } else if (/CTM_IndexFail/i.test(splitContent[i])) { $("#status_Index").css("color","#DD171B"); } else if (/CTM_ThemeListOK/i.test(splitContent[i])) { $("#check_ThemeList").append( " \u2713" ); $("#status_ThemeList").css("color","#FFF"); } else if (/CTM_ThemeListFail/i.test(splitContent[i])) { $("#status_ThemeList").css("color","#DD171B"); } else if (/CTM_InsertHtmlOK/i.test(splitContent[i])) { $("#check_InsertHtml").append( " \u2713" ); $("#status_InsertHtml").css("color","#FFF"); } else if (/CTM_InsertHtmlFail/i.test(splitContent[i])) { $("#status_InsertHtml").css("color","#DD171B"); } else if (/CTM_ThemeDirsScan/i.test(splitContent[i])) { $("#status_ThemeDirs").text( 'Building list of Theme dir(s)' ); $("#status_ThemeDirs").css("color","#FFAE40"); } else if (/CTM_ThemeDirsOK/i.test(splitContent[i])) { $("#status_ThemeDirs").text( 'Theme directories' ).append( ' \u2713' ); $("#status_ThemeDirs").css("color","#FFF"); } else if (/CTM_ThemeDirsFail/i.test(splitContent[i])) { $("#status_ThemeDirs").css("color","#DD171B"); } else if (/CTM_DropDownListOK/i.test(splitContent[i])) { $("#check_Dropdown").append( " \u2713" ); $("#status_Dropdown").css("color","#FFF"); } else if (/CTM_DropDownListNone/i.test(splitContent[i])) { $("#check_Dropdown").append( " \u2713" ); $("#status_Dropdown").css("color","#BBB"); // Change to lighter grey, not red. } else if (/CTM_ReadPrefsOK/i.test(splitContent[i])) { $("#check_ReadPrefs").append( " \u2713" ); $("#status_ReadPrefs").css("color","#FFF"); } else if (/CTM_ReadPrefsCreate/i.test(splitContent[i])) { $("#status_ReadPrefs").text( 'Create prefs file' ).append( ' \u2713' ); $("#status_ReadPrefs").css("color","#FFF"); } else if (/CTM_BootDeviceMBR/i.test(splitContent[i])) { ChangeMessageBoxHeaderColour("blue"); SetMessageBoxText('Attention: Boot Device' , 'Clover was loaded from an MBR partitioned device. This device will need to be detected before you can manage the themes.

Please enter your password for running fdisk.'); $("#AnimatedBar").css("display","none"); HideMessageBoxClose(); ShowMessageBox(); } else if (/CTM_BootDeviceGPT/i.test(splitContent[i])) { ChangeMessageBoxHeaderColour("blue"); SetMessageBoxText('Attention: Boot Device' , 'Clover was loaded from an EFI system partition which is currently unmounted. It will need to be mounted to manage the themes.

Please enter your password to mount it.'); $("#AnimatedBar").css("display","none"); HideMessageBoxClose(); ShowMessageBox(); } else if (/CTM_BootDeviceCloseWindow/i.test(splitContent[i])) { CloseMessageBox(); } else if (/CTM_BootlogOK/i.test(splitContent[i])) { $("#check_ReadBootlog").append( " \u2713" ); $("#status_ReadBootlog").css("color","#FFF"); } else if (/CTM_BootlogMissing/i.test(splitContent[i])) { $("#status_ReadBootlog").text( 'Bootlog not found' ).append( ' \u2713' ); $("#status_ReadBootlog").css("color","#BBB"); // Change to lighter grey, not red. } else if (/CTM_BootlogFail/i.test(splitContent[i])) { $("#status_ReadBootlog").css("color","#DD171B"); } else if (/CTM_InitInterface/i.test(splitContent[i])) { $("#check_InitMainUI").append( " \u2713" ); $("#status_InitMainUI").css("color","#FFF"); } else if (/CTM_NvramFound/i.test(splitContent[i])) { $("#check_NvramVar").append( " \u2713" ); $("#status_NvramVar").css("color","#FFF"); } else if (/CTM_NvramNotFound/i.test(splitContent[i])) { $("#check_NvramVar").append( " \u2713" ); $("#status_NvramVar").css("color","#BBB"); // Change to lighter grey, not red. } } prevLastLineCount=splitContent.length-2; prevLastLineCount=prevLastLineCount+1 prevLastLine = lastLine; } // Is the string 'Complete!' found in fileContent? if (/Complete!/i.test(fileContent)) { // stop this timer and set to not re-iterate this function if(typeof timerCheckEof !== "undefined"){ clearTimeout(timerCheckEof); } eof=1; //Redirect after 1 second timerReadMessageFile = setTimeout(redirectToMainPage, 1000); } else { // recursively call function providing we haven't completed. if(eof==0) timerCheckEof = setTimeout(readLogFileForMessages, 50); } } else { // recursively call function providing we haven't completed. if(eof==0) timerCheckEof = setTimeout(readLogFileForMessages, 250); } }