diff --git a/extras/android-event-viewer/.gitignore b/extras/android-event-viewer/.gitignore new file mode 100644 index 0000000000..28a312e757 --- /dev/null +++ b/extras/android-event-viewer/.gitignore @@ -0,0 +1,56 @@ +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# Intellij +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries + +# Keystore files +*.jks + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + diff --git a/extras/android-event-viewer/.idea/compiler.xml b/extras/android-event-viewer/.idea/compiler.xml new file mode 100644 index 0000000000..96cc43efa6 --- /dev/null +++ b/extras/android-event-viewer/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extras/android-event-viewer/.idea/copyright/profiles_settings.xml b/extras/android-event-viewer/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000000..e7bedf3377 --- /dev/null +++ b/extras/android-event-viewer/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/extras/android-event-viewer/.idea/misc.xml b/extras/android-event-viewer/.idea/misc.xml new file mode 100644 index 0000000000..38041c7cc6 --- /dev/null +++ b/extras/android-event-viewer/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extras/android-event-viewer/.idea/modules.xml b/extras/android-event-viewer/.idea/modules.xml new file mode 100644 index 0000000000..135b400226 --- /dev/null +++ b/extras/android-event-viewer/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/extras/android-event-viewer/.idea/runConfigurations.xml b/extras/android-event-viewer/.idea/runConfigurations.xml new file mode 100644 index 0000000000..7f68460d8b --- /dev/null +++ b/extras/android-event-viewer/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/extras/android-event-viewer/app/build.gradle b/extras/android-event-viewer/app/build.gradle new file mode 100644 index 0000000000..92924f93b3 --- /dev/null +++ b/extras/android-event-viewer/app/build.gradle @@ -0,0 +1,19 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 8 + buildToolsVersion "25.0.2" + + defaultConfig { + applicationId "pandroid_event_viewer.pandorafms" + minSdkVersion 8 + targetSdkVersion 8 + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } +} diff --git a/extras/pandroid_event_viewer/lint.xml b/extras/android-event-viewer/app/lint.xml similarity index 61% rename from extras/pandroid_event_viewer/lint.xml rename to extras/android-event-viewer/app/lint.xml index f4be1f0ca4..b148b1a931 100644 --- a/extras/pandroid_event_viewer/lint.xml +++ b/extras/android-event-viewer/app/lint.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/extras/pandroid_event_viewer/AndroidManifest.xml b/extras/android-event-viewer/app/src/main/AndroidManifest.xml similarity index 98% rename from extras/pandroid_event_viewer/AndroidManifest.xml rename to extras/android-event-viewer/app/src/main/AndroidManifest.xml index 443f3c8bd0..bdd70a163e 100644 --- a/extras/pandroid_event_viewer/AndroidManifest.xml +++ b/extras/android-event-viewer/app/src/main/AndroidManifest.xml @@ -16,8 +16,8 @@ --> + android:versionCode="6" + android:versionName="1.5" > parameters = new ArrayList(); parameters.add(new BasicNameValuePair("op", "get")); parameters.add(new BasicNameValuePair("op2", "events")); parameters.add(new BasicNameValuePair("other_mode", "url_encode_separator_|")); - parameters.add(new BasicNameValuePair("return_type", "csv")); + parameters.add(new BasicNameValuePair("return_type", returnType)); parameters.add(new BasicNameValuePair("other", serializeEventsParamsToAPI(filterAgentName, idGroup, filterSeverity, filterStatus, filterEventSearch, @@ -159,6 +162,88 @@ public class API { more_criticity))); return Core.httpGet(context, parameters); } + + /** + * Performs a get_events API call. + * + * @param context + * Application context. + * @param filterAgentName + * Agent name. + * @param idGroup + * Group id. + * @param filterSeverity + * Severity. + * @param filterStatus + * Status. + * @param filterEventSearch + * Text in event title. + * @param filterTag + * Tag. + * @param filterTimestamp + * Events after this time. + * @param itemsPerPage + * Number of items retrieved per list in each call. + * @param offset + * List offset. + * @param total + * Retrieve number of events instead of events info. + * @param more_criticity + * Retrieve maximum criticity instead of events info. + * + * @return API call result. + * @throws IOException + * if there was any problem. + */ + public static String getEvents (Context context, String filterAgentName, + int idGroup, int filterSeverity, int filterStatus, + String filterEventSearch, String filterTag, + long filterTimestamp, long itemsPerPage, long offset, + boolean total, boolean more_criticity) throws IOException { + return API.getEvents(context, + filterAgentName, idGroup, filterSeverity, filterStatus, filterEventSearch, + filterTag, filterTimestamp, itemsPerPage, offset, total, more_criticity, "csv"); + } + + /** + * Performs a get_events API call. + * + * @param context + * Application context. + * @param filterAgentName + * Agent name. + * @param idGroup + * Group id. + * @param filterSeverity + * Severity. + * @param filterStatus + * Status. + * @param filterEventSearch + * Text in event title. + * @param filterTag + * Tag. + * @param filterTimestamp + * Events after this time. + * @param itemsPerPage + * Number of items retrieved per list in each call. + * @param offset + * List offset. + * @param returnType + * To chose the type of the returned data (csv, json...). + * + * @return API call result. + * @throws IOException + * if there was any problem. + */ + public static String getEvents (Context context, String filterAgentName, + int idGroup, int filterSeverity, int filterStatus, + String filterEventSearch, String filterTag, + long filterTimestamp, long itemsPerPage, long offset, + String returnType) throws IOException { + return API.getEvents(context, + filterAgentName, idGroup, filterSeverity, filterStatus, filterEventSearch, + filterTag, filterTimestamp, itemsPerPage, offset, false, false, returnType); + } /** * Get tags through an api call. diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/About.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/About.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/About.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/About.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Core.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Core.java similarity index 95% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Core.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Core.java index 462a0af2d5..4363e7d57a 100644 --- a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Core.java +++ b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Core.java @@ -34,6 +34,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; @@ -755,4 +757,32 @@ public class Core { return null; } } + + /** + * Returns the major version by extracting it from the api_version token from the preferences. + * + * @param context Application context. + * @return int Major API version + * + * @throws Exception If the major version cannot be extracted. + * @throws NumberFormatException If the major version cannot be casted to integer. + */ + public static int getMajorVersion (Context context) throws Exception { + SharedPreferences preferences = context.getSharedPreferences( + context.getString(R.string.const_string_preferences), + Activity.MODE_PRIVATE); + // It is something like v5.0SP1 + String api_version = preferences.getString("api_version", ""); + + // Try to get the version number + Matcher apiVerMatcher = Pattern.compile("^v(\\d)+\\.\\d+.*$").matcher(api_version); + + if (apiVerMatcher.find()) { + String apiVerString = apiVerMatcher.group(1); + int apiVerNumber = Integer.parseInt(apiVerString); + + return apiVerNumber; + } + throw new Exception("The version number cannot be extracted from the version string"); + } } diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/EventList.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/EventList.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/EventList.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/EventList.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/EventListItem.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/EventListItem.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/EventListItem.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/EventListItem.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Info.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Info.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Info.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Info.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Main.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Main.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Main.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Main.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/NaiveTrustManager.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/NaiveTrustManager.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/NaiveTrustManager.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/NaiveTrustManager.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/OnBootLoader.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/OnBootLoader.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/OnBootLoader.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/OnBootLoader.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Options.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Options.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/Options.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/Options.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/PandroidEventviewerActivity.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/PandroidEventviewerActivity.java similarity index 60% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/PandroidEventviewerActivity.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/PandroidEventviewerActivity.java index 510fe0303c..df270c8fc7 100644 --- a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/PandroidEventviewerActivity.java +++ b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/PandroidEventviewerActivity.java @@ -22,6 +22,8 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import android.app.Activity; import android.app.Notification; @@ -39,9 +41,12 @@ import android.widget.BaseAdapter; import android.widget.TabHost; import android.widget.Toast; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; -public class PandroidEventviewerActivity extends TabActivity implements - Serializable { + +public class PandroidEventviewerActivity extends TabActivity implements Serializable { private static String TAG = "PandroidEventviewerActivity"; private static final int PROBLEM_NOTIFICATION_ID = 1; private static final long serialVersionUID = 1L; @@ -259,250 +264,220 @@ public class PandroidEventviewerActivity extends TabActivity implements "Configuration changes commited (timestamp)"); } } - + /** - * Get events from pandora console. For only Pandora 5.0 version - * - * @throws IOException - * If there is any connection problem. - * + * Parses a JSON object and returns a valid event list item. + * For >= v7. + * + * @param item Object with the event columns. + * + * @return EventListItem + * @throws JSONException, NumberFormatException */ - private void getEvents_v50(String[] lines) { - for (int i = 0; i < lines.length; i++) { - String[] items = lines[i].split(";"); + private EventListItem parseEvent (JSONObject item) throws JSONException, NumberFormatException { + EventListItem event = new EventListItem(); - EventListItem event = new EventListItem(); - boolean extract = true; + // Event id + event.id_event = item.optInt("id_evento"); + // Agent id + event.id_agent = item.optInt("id_agente"); + // User id + event.id_user = item.getString("id_usuario"); + // Group id + event.id_group = item.optInt("id_grupo"); + // Status + event.status = item.optInt("estado"); + // Timestamp (Y-M-d H:m:s) + event.timestamp = item.getString("timestamp"); + // Event text + event.event = item.getString("evento"); + // Unix timestamp + event.utimestamp = item.optInt("utimestamp"); + // Event type + event.event_type = item.getString("event_type"); + // Module id + event.id_agentmodule = item.optInt("id_agentmodule"); + // Alert id + event.id_alert_am = item.optInt("id_alert_am"); + // Event priority + event.criticity = item.optInt("criticity"); + // User comments + event.user_comment = item.getString("user_comment"); + // Tags + event.tags = item.getString("tags"); + // Agent name (try to use the alias) + event.agent_name = item.optString("agent_alias", item.optString("agent_name")); + // Group name + event.group_name = item.optString("group_name"); + // Group icon + event.group_icon = item.optString("group_icon"); + // Event description + event.description_event = item.optString("description_event"); + // Event description image + event.description_image = item.optString("img_description"); + // Event priority name + event.criticity_name = item.optString("criticity_name"); + // Event priority image + event.criticity_image = item.optString("img_criticy"); + + event.opened = false; + + return event; + } + + /** + * Parses a string array and returns a valid event list item. + * + * THIS IS AN HORRIBLE WAY TO DO THIS. + * Any change on the columns order on the tevento's table from the database + * or any change to the public API can break this in multiple ways. + * CSV is bad for a maintainable and scalable APIs, but someone could almost map the + * head (nonexistent) with the line columns indexes... /rage + * + * For <= v6. + * + * @param columns String array with the event columns. + * @param old Whether to use the csv parsing for the <=v4 or the >=v5 && <= v6. + * + * @return EventListItem + * @throws NumberFormatException + */ + private EventListItem parseEvent (String[] columns, boolean old) throws NumberFormatException { + EventListItem event = new EventListItem(); + + // Event id + event.id_event = (columns[0].length() > 0) ? Integer.parseInt(columns[0]) : 0; + // Agent id + event.id_agent = (columns[1].length() > 0) ? Integer.parseInt(columns[1]) : 0; + // User id + event.id_user = columns[2]; + //Get id group + event.id_group = (columns[3].length() > 0) ? Integer.parseInt(columns[3]) : 0; + // Status + event.status = (columns[4].length() > 0) ? Integer.parseInt(columns[4]) : 0; + // Timestamp (format Y-M-d H:m:s) + event.timestamp = columns[5]; + //Get event as text + event.event = columns[6]; + // Unix timestamp + event.utimestamp = (columns[7].length() > 0) ? Integer.parseInt(columns[7]) : 0; + // Event type + event.event_type = columns[8]; + // Module id + event.id_agentmodule = (columns[9].length() > 0) ? Integer.parseInt(columns[9]) : 0; + // Alert id + event.id_alert_am = (columns[10].length() > 0) ? Integer.parseInt(columns[10]) : 0; + // Priority + event.criticity = (columns[11].length() > 0) ? Integer.parseInt(columns[11]) : 0; + // User comment + event.user_comment = columns[12]; + // Tags + event.tags = columns[13]; + + // For <= v4 + if (old) { + // Agent name + event.agent_name = (columns.length >= 15) ? columns[14] : ""; + // Group name + event.group_name = (columns.length >= 16) ? columns[15] : ""; + // Group icon + event.group_icon = (columns.length >= 17) ? columns[16] : ""; + // Event description + event.description_event = (columns.length >= 18) ? columns[17] : ""; + // Event description image + event.description_image = (columns.length >= 19) ? columns[18] : ""; + // Priority image + event.criticity_image = (columns.length >= 20) ? columns[19] : ""; + // Priority name + event.criticity_name = (columns.length >= 21) ? columns[20] : ""; + } + // For v5 and v6 + else { + // Agent name + event.agent_name = (columns.length >= 23) ? columns[22] : ""; + // Group name + event.group_name = (columns.length >= 24) ? columns[23] : ""; + // Group icon + event.group_icon = (columns.length >= 25) ? columns[24] : ""; + // Event description + event.description_event = (columns.length >= 26) ? columns[25] : ""; + // Event description image + event.description_image = (columns.length >= 27) ? columns[26] : ""; + // Priority image + event.criticity_image = (columns.length >= 28) ? columns[27] : ""; + // Priority name + event.criticity_name = (columns.length >= 29) ? columns[28] : ""; + } + + event.opened = false; + + return event; + } + + /** + * Process a JSON response from the api and save the new events. + * For >= v7. + * + * @param items JSONObject array with the event rows. + */ + private void saveEvents (JSONArray items) { + if (items.length() == 0) { + Log.d("WORKS?", "NEWEVENTS = FALSE"); + this.newEvents = false; + return; + } + this.newEvents = true; + + // Iterate the JSON Objects + for (int i = 0; i < items.length(); i++) { try { - if (items.length < 14) { - extract = false; - continue; - } - //Get id event - if (items[0].length() == 0) { - event.id_event = 0; - } - else { - event.id_event = Integer.parseInt(items[0]); - } - - //Get id agent - if (items[1].length() == 0) { - event.id_agent = 0; - } - else { - event.id_agent = Integer.parseInt(items[1]); - } - - //Get id user - event.id_user = items[2]; - - //Get id group - if (items[3].length() == 0) { - event.id_group = 0; - } - else { - event.id_group = Integer.parseInt(items[3]); - } - - //Get status - if (items[4].length() == 0) { - event.status = 0; - } - else { - event.status = Integer.parseInt(items[4]); - } - - //Get timestamp (format Y-M-d H:m:s) - event.timestamp = items[5]; - - //Get event as text - event.event = items[6]; - - //Get unix timestamp - if (items[7].length() == 0) { - event.utimestamp = 0; - } - else { - event.utimestamp = Integer.parseInt(items[7]); - } - - //Get event type - event.event_type = items[8]; - - //Get id module - if (items[9].length() == 0) { - event.id_agentmodule = 0; - } - else { - event.id_agentmodule = Integer.parseInt(items[9]); - } - - //Get id alert - if (items[10].length() == 0) { - event.id_alert_am = 0; - } - else { - event.id_alert_am = Integer.parseInt(items[10]); - } - - //Get criticity - if (items[11].length() == 0) { - event.criticity = 0; - } - else { - event.criticity = Integer.parseInt(items[11]); - } - - //Get user comment - event.user_comment = items[12]; - - //Get tags - event.tags = items[13]; - - /* This fields are not used in the Pandroid event - - event.source = item[14]; - event.id_extra = item[15]; - event.critical_instructions = item[16]; - event.warning_instructions = item[17]; - event.unknown_instructions = item[18]; - event.owner_user = item[19]; - event.ack_utimestamp = item[20]; - event.custom_data = item[21] - - */ - - event.agent_name = ""; - event.group_name = ""; - event.group_icon = ""; - event.description_event = ""; - event.description_image = ""; - event.criticity_name = ""; - event.criticity_image = ""; - - if (items.length >= 23) - event.agent_name = items[22]; - if (items.length >= 24) - event.group_name = items[23]; - if (items.length >= 25) - event.group_icon = items[24]; - if (items.length >= 26) - event.description_event = items[25]; - if (items.length >= 27) - event.description_image = items[26]; - if (items.length >= 28) - event.criticity_name = items[28]; - if (items.length >= 27) - event.criticity_image = items[27]; - - event.opened = false; - } - catch (NumberFormatException nfe) { - event.event = getApplication().getString( - R.string.unknown_event_str); - launchProblemParsingNotification(); - } - if (extract) + JSONObject item = items.getJSONObject(i); + EventListItem event = this.parseEvent(item); this.eventList.add(event); - } - } - - /** - * Get events from pandora console. For old versions of Pandora (v4 <) - * - * @throws IOException - * If there is any connection problem. - * - */ - private void getEvents_old(String[] lines) { - for (int i = 0; i < lines.length; i++) { - String[] items = lines[i].split(";"); - - EventListItem event = new EventListItem(); - try { - - if (items[0].length() == 0) { - event.id_event = 0; - } - else { - event.id_event = Integer.parseInt(items[0]); - } - if (items[1].length() == 0) { - event.id_agent = 0; - } - else { - event.id_agent = Integer.parseInt(items[1]); - } - event.id_user = items[2]; - if (items[3].length() == 0) { - event.id_group = 0; - } - else { - event.id_group = Integer.parseInt(items[3]); - } - if (items[4].length() == 0) { - event.status = 0; - } - else { - event.status = Integer.parseInt(items[4]); - } - event.timestamp = items[5]; - event.event = items[6]; - if (items[7].length() == 0) { - event.utimestamp = 0; - } - else { - event.utimestamp = Integer.parseInt(items[7]); - } - event.event_type = items[8]; - if (items[9].length() == 0) { - event.id_agentmodule = 0; - } - else { - event.id_agentmodule = Integer.parseInt(items[9]); - } - if (items[10].length() == 0) { - event.id_alert_am = 0; - } - else { - event.id_alert_am = Integer.parseInt(items[10]); - } - if (items[11].length() == 0) { - event.criticity = 0; - } - else { - event.criticity = Integer.parseInt(items[11]); - } - event.user_comment = items[12]; - event.tags = items[13]; - event.agent_name = items[14]; - event.group_name = items[15]; - event.group_icon = items[16]; - event.description_event = items[17]; - event.description_image = items[18]; - event.criticity_name = items[19]; - event.criticity_image = items[20]; - - event.opened = false; } catch (NumberFormatException nfe) { - event.event = getApplication().getString( - R.string.unknown_event_str); launchProblemParsingNotification(); } - this.eventList.add(event); + catch (JSONException e) { + launchProblemParsingNotification(); + } } } - + + /** + * Process a CSV response from the api and save the new events. + * For <= v6. + * + * @param lines String array with the event lines in CSV format. + * @param old Whether to use the csv parsing for the <=v4 or the >=v5 && <= v6. + */ + private void saveEvents (String[] lines, boolean old) { + if (lines.length == 0) { + Log.d("WORKS?", "NEWEVENTS = FALSE"); + this.newEvents = false; + return; + } + this.newEvents = true; + + // Iterate the CSV lines + for (int i = 0; i < lines.length; i++) { + try { + String[] columns = lines[i].split(";"); + EventListItem event = this.parseEvent(columns, old); + this.eventList.add(event); + } + catch (NumberFormatException nfe) { + launchProblemParsingNotification(); + } + } + } + /** * Get events from pandora console. * - * @throws IOException - * If there is any connection problem. - * + * @throws IOException If there is any connection problem. */ - private void getEvents() throws IOException { + private void getEvents () throws IOException { // Get total count. String return_api = API.getEvents(getApplicationContext(), agentNameStr, id_group, severity, status, eventSearch, @@ -521,35 +496,42 @@ public class PandroidEventviewerActivity extends TabActivity implements return; } + // Try to get the API version number + int apiVerNumber = 0; + try { + apiVerNumber = Core.getMajorVersion(getApplicationContext()); + } + catch (Exception e) {} + // Get the list of events. - return_api = API.getEvents(getApplicationContext(), agentNameStr, - id_group, severity, status, eventSearch, eventTag, timestamp, - pagination, offset, false, false); + String returnType = (apiVerNumber < 7) ? "csv" : "json"; + return_api = API.getEvents(getApplicationContext(), + agentNameStr, id_group, severity, status, eventSearch, + eventTag, timestamp, pagination, offset, returnType); + Log.d(TAG, "List of events: " + return_api); - Log.i(TAG + " getEvents - return_api", return_api); - String[] lines = return_api.split("\n"); - newEvents = true; - if (return_api.length() == 0) { - Log.d("WORKS?", "NEWEVENTS = FALSE"); - newEvents = false; - return; + try { + if (apiVerNumber >= 7) { + JSONObject response = new JSONObject(return_api); + if (!response.optString("type").equals("array")) { + throw new Exception("Invalid API return type"); + } + + JSONArray rows = response.getJSONArray("data"); + this.saveEvents(rows); + } + else { + String[] lines = return_api.split("\n"); + + // The Console API changed in the v5 + boolean old = apiVerNumber < 5; + this.saveEvents(lines, old); + } } - - SharedPreferences preferences = getSharedPreferences( - getString(R.string.const_string_preferences), - Activity.MODE_PRIVATE); - String api_version = preferences.getString("api_version", ""); - - // Get the short form of the version. I.E. "v5" for "v5.0SP1" - String[] api_version_short = api_version.split("\\."); - - if (api_version_short[0].equals("v5")) { - this.getEvents_v50(lines); - } - else { - this.getEvents_old(lines); + catch (Exception e) { + this.newEvents = false; } } diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/PandroidEventviewerService.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/PandroidEventviewerService.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/PandroidEventviewerService.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/PandroidEventviewerService.java diff --git a/extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/PopupValidationEvent.java b/extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/PopupValidationEvent.java similarity index 100% rename from extras/pandroid_event_viewer/src/pandroid_event_viewer/pandorafms/PopupValidationEvent.java rename to extras/android-event-viewer/app/src/main/java/pandroid_event_viewer/pandorafms/PopupValidationEvent.java diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/about.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/about.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/about.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/about.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/b_green.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/b_green.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/b_green.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/b_green.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/b_red.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/b_red.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/b_red.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/b_red.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/b_yellow.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/b_yellow.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/b_yellow.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/b_yellow.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/bell.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/bell.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/bell.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/bell.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/cog.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/cog.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/cog.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/cog.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/config.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/config.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/config.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/config.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/criticity_0.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_0.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/criticity_0.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_0.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/criticity_1.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_1.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/criticity_1.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_1.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/criticity_2.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_2.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/criticity_2.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_2.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/criticity_3.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_3.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/criticity_3.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_3.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/criticity_4.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_4.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/criticity_4.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_4.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/criticity_default.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_default.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/criticity_default.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/criticity_default.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/cross.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/cross.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/cross.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/cross.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/delete.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/delete.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/delete.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/delete.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/delete_pressed.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/delete_pressed.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/delete_pressed.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/delete_pressed.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/err.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/err.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/err.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/err.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/error.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/error.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/error.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/error.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/eye.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/eye.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/eye.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/eye.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/help.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/help.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/help.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/help.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/icon_filter.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/icon_filter.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/icon_filter.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/icon_filter.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/icon_filter_pressed.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/icon_filter_pressed.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/icon_filter_pressed.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/icon_filter_pressed.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/icon_refresh.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/icon_refresh.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/icon_refresh.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/icon_refresh.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/icon_refresh_pressed.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/icon_refresh_pressed.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/icon_refresh_pressed.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/icon_refresh_pressed.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/network.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/network.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/network.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/network.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/ok.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/ok.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/ok.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/ok.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/pandorafms_logo.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/pandorafms_logo.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/pandorafms_logo.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/pandorafms_logo.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/refresh.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/refresh.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/refresh.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/refresh.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/save.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/save.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/save.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/save.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/save_pressed.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/save_pressed.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/save_pressed.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/save_pressed.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/severity_critical.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_critical.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/severity_critical.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_critical.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/severity_informational.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_informational.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/severity_informational.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_informational.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/severity_maintenance.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_maintenance.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/severity_maintenance.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_maintenance.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/severity_normal.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_normal.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/severity_normal.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_normal.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/severity_warning.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_warning.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/severity_warning.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/severity_warning.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/tick.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/tick.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/tick.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/tick.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/tick_off.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/tick_off.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/tick_off.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/tick_off.png diff --git a/extras/pandroid_event_viewer/res/drawable-ldpi/wand.png b/extras/android-event-viewer/app/src/main/res/drawable-ldpi/wand.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable-ldpi/wand.png rename to extras/android-event-viewer/app/src/main/res/drawable-ldpi/wand.png diff --git a/extras/pandroid_event_viewer/res/drawable/btn_dropdown.xml b/extras/android-event-viewer/app/src/main/res/drawable/btn_dropdown.xml similarity index 93% rename from extras/pandroid_event_viewer/res/drawable/btn_dropdown.xml rename to extras/android-event-viewer/app/src/main/res/drawable/btn_dropdown.xml index 6632f1172e..d02baf24eb 100644 --- a/extras/pandroid_event_viewer/res/drawable/btn_dropdown.xml +++ b/extras/android-event-viewer/app/src/main/res/drawable/btn_dropdown.xml @@ -1,4 +1,4 @@ - + diff --git a/extras/pandroid_event_viewer/res/drawable/button_normal.9.png b/extras/android-event-viewer/app/src/main/res/drawable/button_normal.9.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable/button_normal.9.png rename to extras/android-event-viewer/app/src/main/res/drawable/button_normal.9.png diff --git a/extras/pandroid_event_viewer/res/drawable/button_pressed.9.png b/extras/android-event-viewer/app/src/main/res/drawable/button_pressed.9.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable/button_pressed.9.png rename to extras/android-event-viewer/app/src/main/res/drawable/button_pressed.9.png diff --git a/extras/pandroid_event_viewer/res/drawable/combobox_normal.9.png b/extras/android-event-viewer/app/src/main/res/drawable/combobox_normal.9.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable/combobox_normal.9.png rename to extras/android-event-viewer/app/src/main/res/drawable/combobox_normal.9.png diff --git a/extras/pandroid_event_viewer/res/drawable/combobox_pressed.9.png b/extras/android-event-viewer/app/src/main/res/drawable/combobox_pressed.9.png similarity index 100% rename from extras/pandroid_event_viewer/res/drawable/combobox_pressed.9.png rename to extras/android-event-viewer/app/src/main/res/drawable/combobox_pressed.9.png diff --git a/extras/pandroid_event_viewer/res/drawable/delete_icon_button.xml b/extras/android-event-viewer/app/src/main/res/drawable/delete_icon_button.xml similarity index 92% rename from extras/pandroid_event_viewer/res/drawable/delete_icon_button.xml rename to extras/android-event-viewer/app/src/main/res/drawable/delete_icon_button.xml index 12fb68eebd..e84bc69184 100644 --- a/extras/pandroid_event_viewer/res/drawable/delete_icon_button.xml +++ b/extras/android-event-viewer/app/src/main/res/drawable/delete_icon_button.xml @@ -1,4 +1,4 @@ - + + + + + diff --git a/extras/pandroid_event_viewer/res/drawable/round_event_item_blue.xml b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_blue.xml similarity index 84% rename from extras/pandroid_event_viewer/res/drawable/round_event_item_blue.xml rename to extras/android-event-viewer/app/src/main/res/drawable/round_event_item_blue.xml index c92f785f94..80eda4b5a7 100644 --- a/extras/pandroid_event_viewer/res/drawable/round_event_item_blue.xml +++ b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_blue.xml @@ -1,4 +1,4 @@ - + diff --git a/extras/pandroid_event_viewer/res/drawable/round_event_item_green.xml b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_green.xml similarity index 84% rename from extras/pandroid_event_viewer/res/drawable/round_event_item_green.xml rename to extras/android-event-viewer/app/src/main/res/drawable/round_event_item_green.xml index 34214ad096..bca8d276f9 100644 --- a/extras/pandroid_event_viewer/res/drawable/round_event_item_green.xml +++ b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_green.xml @@ -1,4 +1,4 @@ - + diff --git a/extras/pandroid_event_viewer/res/drawable/round_event_item_grey.xml b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_grey.xml similarity index 84% rename from extras/pandroid_event_viewer/res/drawable/round_event_item_grey.xml rename to extras/android-event-viewer/app/src/main/res/drawable/round_event_item_grey.xml index 184aa46014..fb034f0191 100644 --- a/extras/pandroid_event_viewer/res/drawable/round_event_item_grey.xml +++ b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_grey.xml @@ -1,4 +1,4 @@ - + diff --git a/extras/pandroid_event_viewer/res/drawable/round_event_item_red.xml b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_red.xml similarity index 84% rename from extras/pandroid_event_viewer/res/drawable/round_event_item_red.xml rename to extras/android-event-viewer/app/src/main/res/drawable/round_event_item_red.xml index 15c4cc96e9..2102af9a64 100644 --- a/extras/pandroid_event_viewer/res/drawable/round_event_item_red.xml +++ b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_red.xml @@ -1,4 +1,4 @@ - + diff --git a/extras/pandroid_event_viewer/res/drawable/round_event_item_yellow.xml b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_yellow.xml similarity index 84% rename from extras/pandroid_event_viewer/res/drawable/round_event_item_yellow.xml rename to extras/android-event-viewer/app/src/main/res/drawable/round_event_item_yellow.xml index 07e2edaf5e..0b2f00baf3 100644 --- a/extras/pandroid_event_viewer/res/drawable/round_event_item_yellow.xml +++ b/extras/android-event-viewer/app/src/main/res/drawable/round_event_item_yellow.xml @@ -1,4 +1,4 @@ - + diff --git a/extras/pandroid_event_viewer/res/drawable/save_icon_button.xml b/extras/android-event-viewer/app/src/main/res/drawable/save_icon_button.xml similarity index 92% rename from extras/pandroid_event_viewer/res/drawable/save_icon_button.xml rename to extras/android-event-viewer/app/src/main/res/drawable/save_icon_button.xml index 4412e49258..8f4f24ecc1 100644 --- a/extras/pandroid_event_viewer/res/drawable/save_icon_button.xml +++ b/extras/android-event-viewer/app/src/main/res/drawable/save_icon_button.xml @@ -1,4 +1,4 @@ - + + + diff --git a/pandora_console/operation/visual_console/public_console.php b/pandora_console/operation/visual_console/public_console.php index 9233615b41..17a70505c9 100755 --- a/pandora_console/operation/visual_console/public_console.php +++ b/pandora_console/operation/visual_console/public_console.php @@ -84,7 +84,7 @@ if ($layout) { //~ ob_start(); //~ // Render map visual_map_print_visual_map($id_layout, true, true, $width, $height, - '../../', true, $graph_javascript, true); + '../../', true, true, true); //~ return; } else { @@ -92,7 +92,7 @@ else { } // Floating menu - Start -echo '
'; +echo '
'; echo '