var journalineAppVersion = "2.7"; Config.appIdentifier = 'journaline'; Config.startPanelUrl = 'http://127.0.0.1/journaline/0.xml?0'; Config.geocoderEnabled = false; var urlPrefix = 'http://127.0.0.1/journaline/'; var objectId = '0'; var refreshTime = "0"; var retryTime = "5000"; var refreshContent = false; var objectType; var suffix; var successCount = 0; var timer; var hotButtonMenuActiv = false; var req = false; // Request helper var currentResponse; var variant = "NBT"; var hmiPlugin; /* use this tooltips if the translation file couldn't be loaded or language is unknown*/ var i18nFallback = { "locale" : "en_UK", "pageTitle" : "Journaline", "scrollUp" : "Scroll up", "scrollDown" : "Scroll down", "readOut" : "Read out", "telCall" : "Phone call" }; initApp = function() { hmiPlugin = document.getElementById("HMIPlugin"); if( hmiPlugin != null) { hmiPlugin.addNotificationOnDisplaySize(function(res){ resizeScreen(res.xSize); }); } else { LOG.error( "Journaline: hmiPlugin is null!" ); } addNBTEventListener(); EFIHelper.init(); PM.init(); LOG.info('UA: ' + PM.getUserAgent() ); variant = PM.getUserAgent().split(';', 1)[0].split('(', 2)[1]; if( variant == 'NBT_RSE') { Config.startPanelUrl = 'http://160.48.199.119/journaline/0.xml?0'; urlPrefix = 'http://160.48.199.119/journaline/'; } I18N.init(); LOG.info( 'Init complete. journalineApp.js ver: ' + journalineAppVersion + '. Variant: ' + variant ); var newCursorPos = new Cursor.cursorPosition( 0, 0, 0); /* root page */ Cursor.cursorStack.push(newCursorPos); loadContent(Config.startPanelUrl); } var generalKeydownHandler = function(evt) { var k = evt.keyCode; switch (k) { case 13: {// enter if(objectType == "menu"){ if( $('#current').find('.selected').hasClass('inactive') == false ) { refreshContent = false; clearTimeout(timer); if( req ){ // cancel current request req.abort(); } Cursor.storePosition(); } } else if( (objectType == "message") || (objectType == "list") || (objectType == "titleOnly") ) { var selected = $('#current').find('.selected'); if( selected.hasClass('scrollUp') == false && selected.hasClass('scrollDown') == false && selected.hasClass('textToSpeech') == false ) { refreshContent = false; clearTimeout(timer); if( req ){ // cancel current request req.abort(); } if( selected.hasClass('hotButton') == false ) { Cursor.storePosition(); } } } } case 39: // right arrow if (!PM.blockUI) { PM.execute(); } break; case 38: // up arrow if (!PM.blockUI) { PM.scrollUp(); } break; case 40: // down arrow if (!PM.blockUI) { PM.scrollDown(); } break; case 37: // left arrow if( req ){ // cancel current request req.abort(); } PM.back(); break; } }; var Cursor = { selectedId : 0, scrollHeight : 0, contentStyle : 0, cursorStack : new Array(), cursorPosition : function( selectedId, scrollHeight, contentStyle ) { this.selectedId = selectedId; this.scrollHeight = scrollHeight; this.contentStyle = contentStyle; }, storePosition : function() { if( objectType == "menu" ) { var t_selectedId = $('#current').find('.selected').children().attr('id'); var t_scrollHeight = $('#current ul.content').attr('scrollheight'); var t_contentStyle = $('#current ul.content').attr('style'); } else { var t_selectedId = $('#current').find('.toolbar .selected').index(); var t_scrollHeight = $('#current .content').attr('scrollheight'); var t_contentStyle = $('#current .content').attr('style'); } var newCursorPos = new Cursor.cursorPosition( t_selectedId, t_scrollHeight, t_contentStyle); Cursor.cursorStack.push(newCursorPos); LOG.info('Store cursor id: ' + t_selectedId + ' scrollHeight: ' + t_scrollHeight + ' contentStyle: ' + t_contentStyle + ' StackSize: ' + Cursor.cursorStack.length); }, restorePosition : function() { var cursorStack = Cursor.cursorStack; if(cursorStack.length > 0) { Cursor.selectedId = cursorStack[ cursorStack.length-1].selectedId; Cursor.scrollHeight = cursorStack[ cursorStack.length-1].scrollHeight; Cursor.contentStyle = cursorStack[ cursorStack.length-1].contentStyle; LOG.info('Restore cursor id: ' + Cursor.selectedId + ' scrollHeight: ' + Cursor.scrollHeight + ' contentStyle: ' + Cursor.contentStyle + ' StackSize: ' + cursorStack.length); cursorStack.pop(); } }, checkStack : function() { var extrakt = suffix.slice(5); var objectIdArray = extrakt.split(","); /* * check if maybe some objects were deleted and reduce the cursor stack appropriate */ var cursorStack = Cursor.cursorStack; if( cursorStack.length > 0) { for(var i = cursorStack.length; i >= 0 ; i--) { if( cursorStack[i-1].selectedId == objectIdArray[objectIdArray.length-1] ) { break; } else { for(var i = 0; i < objectIdArray.length; i++) { LOG.info('Suffix id ' + i + ':' + objectIdArray[i] ); } if( cursorStack.length > 0) { for(var i = cursorStack.length - 1; i >= 0 ; i--) { LOG.info('Cursor stack ' + i + ':' + cursorStack[i].selectedId ); } } cursorStack.pop(); LOG.info( 'Cursor stack: ' + cursorStack.length ); } } } } }; loadContent = function(loadUrl){ LOG.info('Request Nr. ' + successCount + ': ' + loadUrl ); req = $.ajax({ url : loadUrl, dataType : 'xml', data:'_t=' + PM.now(), timeout : Config.ajaxTimeout, success : function(xml, textStatus, jqXHR) { clearTimeout(timer); req = null; currentResponse = $(xml).find("journaline"); objectType = currentResponse.children().prop("nodeName"); objectId = currentResponse.children().attr("id"); refreshTime = currentResponse.children().attr("refreshTimeMs"); suffix = currentResponse.children().find('suffix').text(); LOG.info('Response: Nr.:' + successCount + ',objectType: ' + objectType + ',objectId: ' + objectId + ',refreshTime: ' + refreshTime ); successCount++; Cursor.checkStack(); switch (objectType) { case "menu": produceMenu(); break; case "message": case "list": case "titleOnly": produceText(); break; default: break; } }, error : function(jqXHR) { LOG.error('Journaline. Req ret: ' + jqXHR.statusText + " " + jqXHR.status ); if( jqXHR.statusText == "error" ) { setTimeout("loadContent(Config.startPanelUrl)",retryTime); } } }); } produceMenu = function(){ if(refreshContent) { Cursor.selectedId = $('#current').find('.selected').children().attr('id'); Cursor.scrollHeight = $('#current ul.content').attr('scrollheight'); Cursor.contentStyle = $('#current ul.content').attr('style'); } if( $('#current').length ) { $('#current').remove(); } var panel = ('
'+currentResponse.find('title').text()+'
    '); PM.holder.append(panel); var linkNr = 0; currentResponse.find('menuitem').each(function (index) { var isActiv = $(this).attr("activ"); if (isActiv=="n") { $('.content').append(''); } else { $('.content').append('' ); } if( Cursor.selectedId == $(this).find('targetId').text()) { linkNr = index; $('.link').removeClass('selected'); $('.link').eq(index).addClass('selected'); $('#current ul.content').attr('scrollheight', Cursor.scrollHeight); $('#current ul.content').attr('style', Cursor.contentStyle); } } ); PM.show('current'); LOG.info('Selected menu top: ' + $('#current').find('li.selected').position().top + ' scrollheight: ' + Cursor.scrollHeight + ' linkNr: ' + linkNr ); //cursor is not visible if( $('#current').find('li.selected').position().top < 0 ) { if( linkNr ) { LOG.info('Set scrollHeight: ' + (linkNr * Config.scrollHeight - Config.scrollHeight*2)); PM.visiblePanel.setScrollHeight( linkNr * Config.scrollHeight - (Config.scrollHeight*2)); } else { LOG.info('Sel pos < 0. Set scrollHeight: 0'); PM.visiblePanel.setScrollHeight(0); } } else if( $('#current').find('li.selected').position().top > ( (Config.scrollHeight * Config.scrollPageRowsCount) - (Config.scrollHeight*2)) ) { if( linkNr ) { LOG.info('Set scrollHeight: ' + (linkNr * Config.scrollHeight - Config.scrollHeight*2)); PM.visiblePanel.setScrollHeight( linkNr * Config.scrollHeight - (Config.scrollHeight*2)); } else { LOG.info('Set scrollHeight: 0' ); PM.visiblePanel.setScrollHeight(0); } } else { } if( $('#current').find('li.selected').length < 1 ) //link not available ( deleted? ) { if($('.link').length >= 0 ) { LOG.info('No selected link found. Set scrollHeight: 0' ); $('.link').eq(0).addClass('selected'); PM.visiblePanel.setScrollHeight(0); } } if(objectId == '0') { PM.isStartPage = true; PM.setStartPageDisplayed(true); } else { PM.isStartPage = false; } refresh(); } produceText = function(){ if(refreshContent ) { Cursor.selectedId = $('#current').find('.toolbar .selected').index(); Cursor.scrollHeight = $('#current .content').attr('scrollheight'); Cursor.contentStyle = $('#current .content').attr('style'); } else if(hotButtonMenuActiv) { Cursor.restorePosition(); hotButtonMenuActiv = false; } else { Cursor.selectedId = 0; Cursor.scrollHeight = 0; Cursor.contentStyle = 0; } if( $('#current').length ) { $('#current').remove(); } var panel = ('
      '); PM.holder.append(panel); var telAvailable = false; $('.content').append('
      '+currentResponse.find('title').text()+'
      '); var text = currentResponse.find('body text').text(); if( text.length > 1 ) { $('.content').append('
      ' + text); } else { $('.content').append('
      ' + text); } if( variant == 'NBT') { var links = currentResponse.find('body objectparameters links'); currentResponse.find('link').each(function (index) { var linkType = $(this).attr("type"); if( telAvailable == false ) { //found at least one tel if ( linkType == "tel" ) { telAvailable = true; $('.toolbar').append('
    • '); $('.tel').append('
      '); } } } ); } $('#current .content').attr('scrollheight', Cursor.scrollHeight); $('#current .content').attr('style', Cursor.contentStyle); LOG.info( 'TextObject scrollheight: ' + Cursor.scrollHeight + ', style: ' + Cursor.contentStyle ); PM.show('current'); $('#current').find('.toolbar').children().removeClass('selected'); $('#current').find('.toolbar').children().eq(Cursor.selectedId).addClass('selected'); if(objectId == '0') { PM.isStartPage = true; PM.setStartPageDisplayed(true); } else { PM.isStartPage = false; } if((objectType == "list")||(objectType == "titleOnly" )){ refresh(); } } loadPhoneLinkList = function(){ LOG.info('Produce phone menu:' + currentResponse.find('title').text()); if( $('#current').length ) { $('#current').remove(); } var panel = ('
      '+currentResponse.find('title').text()+'
        '); PM.holder.append(panel); var links = currentResponse.find('body objectparameters links'); currentResponse.find('link').each(function (index) { var linkType = $(this).attr("type"); if( linkType == "tel" ) { $('.content').append('' ); } } ); hotButtonMenuActiv = true; PM.show('current'); } refresh = function(){ if(refreshTime != undefined && refreshTime != '0' ) { LOG.info('Refresh: ' + urlPrefix + objectId + suffix); timer = setTimeout( "loadContent(urlPrefix + objectId + suffix)", refreshTime ); } refreshContent = true; } function resizeScreen( size ) { LOG.info("Journaline. ResizeScreen " + size); if( size == 1024 ) { $("head").append(""); } else if( size == 544 ) { $("head").append(""); } else { LOG.error( "Journaline: unknown res.xSize " + size ); } if ( (objectType == "message") || (objectType == "list") ) { PM.visiblePanel.setScroller(); PM.visiblePanel.setScrollHeight(0); } }; /* overwrite nbt.js code */ PM.init = function() { $('#Main').append( '
        '); this.idrivePlugin = document.getElementById('idrivePlugin'); this.holder = $('#PanelHolder'); } PM.show = function(panelId, url, options) { var newPanel = this.holder.find('#' + panelId); // for detail panels set the scroll buttons if (newPanel.is('.detailPanel')) { // add textToSpeech button if there are divs with class tts, not for RSE or NBT_ASN var ua = PM.getUserAgent(); if (ua != undefined && (ua.indexOf(';tts;') > -1 || ua.indexOf('Firefox') > -1 || ua.indexOf('Chrome') > -1)) { if (newPanel.find('div.tts').length != 0 && !newPanel.find('li.textToSpeech').length) { newPanel .find('.toolbar') .append( '
      • '); newPanel.find('.textToSpeech').attr('title', I18N.get('readOut')); } } // add scroll buttons if (!newPanel.is('.fix') && !newPanel.find('li.scrollUp').length) { newPanel .find('.toolbar') .each( function() { if (!$(this).hasClass('submenu')) { $(this) .prepend( ''); $(this) .append( ''); } }); } } // first make visible, then set scrollButtons inactive, if the content fits into the viewport this.changeVisiblePanel(newPanel); if (newPanel.find('li.scrollUp').length) { if (newPanel.outerHeight() <= newPanel.getViewportHeight()) { newPanel.find('li.scrollUp').addClass('inactive'); newPanel.find('li.scrollDown').addClass('inactive'); } } } PM.back = function() { LOG.info('Back' ); if(hotButtonMenuActiv == true ) { produceText(currentResponse); hotButtonMenuActiv = false; return; } Cursor.restorePosition(); clearTimeout(timer); refreshContent = false; loadContent( urlPrefix + 'up' + suffix ); } PM.readPage = function() { var header = this.visiblePanel.find('.content div.ttsheader'); if (!header.length) { header = this.visiblePanel.find('.content div.header'); } header = header.text(); var temp = this.visiblePanel.find('.content div.tts').clone(); temp.find("br").replaceWith(" \r\n\r\n"); var text = temp.text(); LOG.info('start reading'); TTS.read('', header, text); } PM.showError = function(errorCode) { if (!errorCode) { errorCode = "Unexpected error"; } LOG.error('An error occured: ' + errorCode); } /** * I18N - Translations */ var I18N = { data : {}, /** * This function search for the given key and returns the translation for the current locale. * * @param key * @returns */ get : function(key) { try { return I18N.data[key]; } catch (e) { LOG.error('Journaline: I18N.get error: ' + e); if(I18N.data == undefined) { I18N.data = i18nFallback; return I18N.data[key]; } return ""; } }, /** * This function will be called automatically, if the DOM was loaded. */ init : function() { var currentLocale = PM.getUserAgent().split(';', 7)[6]; LOG.info('currentLocale: ' + currentLocale); if( currentLocale ) { I18N.load(currentLocale); } else { LOG.error('CurrentLocale undefined. UA: ' + PM.getUserAgent()); I18N.data = i18nFallback; } }, load : function(locale) { $.ajax({ url : ('journalineNBT/tooltips/' + locale), dataType: 'json', type : 'GET', async : true, cache : false, timeout : 10000, success : function(i18nJSON) { I18N.data = i18nJSON; }, error : function() { LOG.error('Journaline: Loading tooltips failed'); I18N.data = i18nFallback; } }); }, /** * If the locale differs from the stored locale, the i18n json will be refreshed from the file system. * * @param locale */ update : function(locale) { if (I18N.get('locale') != locale) { I18N.load(locale); } } };