diff --git a/app/assets/css/checkboxStyles.css b/app/assets/css/checkboxStyles.css index eda370c..9fdc65f 100644 --- a/app/assets/css/checkboxStyles.css +++ b/app/assets/css/checkboxStyles.css @@ -718,3 +718,19 @@ input[type=color]::-webkit-color-swatch { height: 33px; padding: 5px; } +.w3-col .speedo-check.extrCheck { + padding: 2px 2px 0px 4px; +} +#aaBetaVer { + top: 9px; +} +#custOptions19 tr.w3-col.w3-row td { + padding: 2px 2px 0px 0px; +} +tr.w3-row.w3-col td strong { + margin: 15px; + line-height: 2; +} +.w3-sidenav tr.w3-row.w3-col td strong { + margin: 8px; +} diff --git a/app/assets/css/index.css b/app/assets/css/index.css index 04c169e..3ba6490 100644 --- a/app/assets/css/index.css +++ b/app/assets/css/index.css @@ -355,6 +355,7 @@ footer [class*="icon-"] { } span.test-panel-toggle, .footer-donate { + margin-top: 5px; position: fixed; left: 10px; z-index: 99999; @@ -374,6 +375,7 @@ span.test-panel-toggle, font-size: 21px; } footer .contact-form { + margin-top: 3px; right: 10px; position: fixed; } @@ -463,6 +465,7 @@ section.options { font-size: 14px; letter-spacing: normal; font-weight: normal; + line-height: normal; } .form-group, .form-actions { margin: 10px; @@ -988,6 +991,9 @@ body.w3-black { .modal-footer button { font-size: 18px; } +.bootbox.copytoUSB1 .bootbox-body { + width: 360px; +} .copytoUSB1 .modal-footer button, .bootbox-confirm .modal-footer button { min-width: 35%; @@ -1294,6 +1300,7 @@ span.icon-question { } #sidePanel td { padding: 3px 5px; + vertical-align: -webkit-baseline-middle; } div#fullSystemRestore { top: 30%; @@ -1715,10 +1722,12 @@ tr#uistyle-mainlabel.color td input[type="color"] { .update-info h5 { font-weight: 600; } +.unwifiap, .update-info a, .help-messages a, #sidePanel a:not(.w3-closenav) { border-bottom: 1px dashed #499aff; + cursor: pointer; } a#update-available { white-space: nowrap; @@ -1794,23 +1803,24 @@ a.handle:active { .featherlight.myStance .featherlight-content { max-width: 90%; } -.featherlight.myStance h1.featherlight-inner { +.featherlight.myStance .featherlight-inner h1 { white-space:normal; font-size: 1.6rem; } -.featherlight.myStance h2.featherlight-inner { +.featherlight.myStance .featherlight-inner h2 { text-align: center; font-size: 1.2rem; } -.featherlight.myStance h3.featherlight-inner { +.featherlight.myStance .featherlight-inner h3 { text-align: center; font-size: 1.1rem; } -.featherlight.myStance h4.featherlight-inner { +.featherlight.myStance .featherlight-inner h4 { text-align: justify; font-size: 1rem; } .featherlight.myStance p.featherlight-inner { + font-size: 20px; text-align: justify; } .featherlight.myStance a { @@ -1823,6 +1833,12 @@ a.handle:active { .featherlight.myStance { user-select:none; } +.featherlight.myStance #firstTimer { + text-align: center; +} +script.featherlight-inner { + display: none!important; +} .featherlight.autoHelpBox .featherlight-content { width: 80%; max-width: 800px; @@ -1897,6 +1913,23 @@ input#id7Recovery { line-height: 40px; border: none; } +style.featherlight-inner{ + display:none!important; +} +.speedoRef{ + text-align:right; + margin-top:-500px; + width:40%; + max-width:500px; +} +pre.featherlight-inner code { + white-space: pre; + width: 60%; + display: inline-block; +} +.featherlight .featherlight-content{ + max-height:100% +} #sidePanel div#anonce { border: 2px dashed; padding: 20px; @@ -1905,8 +1938,8 @@ input#id7Recovery { } #sidePanel td.aa-side.w3-col label, #sidePanel td.aa-side.w3-col input { - margin-top: 0; - padding-bottom: 10px; + margin-top: 0; + padding-bottom: 10px; } .featherlight-content .anonCloseBtn { display: none; @@ -1943,5 +1976,14 @@ label.w3-label.checkAutorun { } .w3-navbar *, .w3-sidenav * { - cursor: pointer; + cursor: pointer; +} +.w3-sidenav .AAmsg div { + padding: 10px; + font-weight: 500; + font-size: 14px; +} +.w3-sidenav .AAmsg div a { + display: inline; + padding: 0px 2px; } diff --git a/app/assets/js/build-tweaks.js b/app/assets/js/build-tweaks.js index e3ecfbd..b87b70b 100644 --- a/app/assets/js/build-tweaks.js +++ b/app/assets/js/build-tweaks.js @@ -63,9 +63,7 @@ function buildTweakFile (user) { message: `
${langObj.popupMsgs[0].msg}

...
${langObj.popupMsgs[1].msg}: ${tmpdir}
`, closeButton: false }) - persistantData.set('keepBackups', user.backups.org) - persistantData.set('testBackups', user.backups.test) - persistantData.set('skipConfirm', user.backups.skipconfirm) + saveInstallerOps(user) if (fs.existsSync(`${tmpdir}`)) { aioLog('Delete old _copy_to_usb folder...') try { @@ -405,12 +403,28 @@ function buildTweak (user) { } else if (user.speedoOps.bg.id === 31) { addTweak('19_speedo-old_background.txt', true) } + if (user.speedoOps.sbtemp) { + addTweak('19_speedo-sbtemp.txt', true) + } + if (user.speedoOps.temperature.id === 43) { + addTweak('19_speedo-temp.txt', true) + } + if (user.speedoOps.effic.id === 41) { + addTweak('19_speedo-sbtemp.txt', true) + } + if (user.speedoOps.digiclock) { + addTweak('19_speedo-digiclock.txt', true) + } addTweak('19_speedo-i2.txt', true) addTweakDir('speedometer', true) - if (user.speedoOps.mod) { + if (user.speedoOps.mod || user.speedoOps.simpmod) { addTweak('19_speedo_variant-i.txt', true) addTweakDir('speedometer_mod', true) } + if (user.speedoOps.simpmod) { + addTweak('19_speedo_bar.txt', true) + addTweakDir('speedometer_bar', true) + } } if (user.options.indexOf(21) !== -1) { addTweak('08_orderflac-i.txt') @@ -423,7 +437,8 @@ function buildTweak (user) { if (user.options.indexOf(25) !== -1) { addTweak('25_androidauto-i.txt') addTweakDir('androidauto', true) - if(user.aaBetaVer){ + if(user.aaBetaVer) { + addTweak('25_androidautob-i.txt') addTweakDir('androidautob', true) } } @@ -453,6 +468,9 @@ function buildTweak (user) { if (user.options.indexOf(17) !== -1) { addTweak('17_videoplayer-i.txt') addTweakDir('videoplayer', true) + if(user.vpUnicode) { + addTweak('17_videoplayer-unicode.txt') + } } if (user.options.indexOf(27) !== -1) { addTweak('27_aioapp-i.txt') @@ -559,6 +577,8 @@ function buildTweak (user) { if (user.swapOps.mount) { swapdest = '/config/swapfile/' addTweak('18_swapfile-i.txt') + } else { + swapdest = '/' } } // Finish with the end script @@ -893,12 +913,18 @@ function usbDrives () { }) appendAIOlog(`Error finding USB drives: ${error}`) } + try { dsklst.forEach((drive) => { if (!drive.system) { disks.push({'desc': drive.description, 'mp': `${drive.mountpoints[0].path}`}) usbDriveLst.push({'text': ` ${drive.mountpoints[0].path} ${drive.description.replace(' USB Device', '')}`, 'value': drive.mountpoints[0].path}) } }) + } catch(e) { + appendAIOlog("Error: " + e) + disks = null + } + introJs().hideHints() var usb = disks var lst = '' @@ -933,12 +959,12 @@ function usbDrives () { if (!result) { unzipSwapfile(null) } else { - persistantData.set('delCopyFolder', $('#rmCpDirCheck').prop('checked')) + settings.set('delCopyFolder', $('#rmCpDirCheck').prop('checked')) copyToUSB(result) } } }) - $('#rmCpDirCheck').prop('checked', persistantData.get('delCopyFolder')) + $('#rmCpDirCheck').prop('checked', settings.get('delCopyFolder')) } else if (usb.length === 1) { lst = `

${langObj.popupMsgs[6].msg}:

` for (var k = 0; k < usb.length; k++) { @@ -964,12 +990,12 @@ function usbDrives () { if (!result) { unzipSwapfile(null) } else { - persistantData.set('delCopyFolder', $('#rmCpDirCheck').prop('checked')) + settings.set('delCopyFolder', $('#rmCpDirCheck').prop('checked')) copyToUSB(usb[0].mp) } } }) - $('#rmCpDirCheck').prop('checked', persistantData.get('delCopyFolder')) + $('#rmCpDirCheck').prop('checked', settings.get('delCopyFolder')) return usb } }) @@ -1036,7 +1062,7 @@ function unzipSwapfile (dest) { }, 35000) setTimeout(function () { if (document.getElementById('swapLogView')) { - document.getElementById('swapLogView').innerHTML = `${langObj.popupMsgs[16].msg}:
${langObj.tweakOps[17].toolTip}` + document.getElementById('swapLogView').innerHTML = `${langObj.popupMsgs[16].msg}:
${langObj.tweakOps[19].toolTip}` } }, 40000) try { @@ -1074,7 +1100,7 @@ var openUSB = '' function finishedMessage (mp) { // Finished message if (mp) { - if (persistantData.get('delCopyFolder')) { + if (settings.get('delCopyFolder')) { cleanCopyDir() cp2usb = '' } @@ -1094,7 +1120,7 @@ function finishedMessage (mp) { className: 'finishedMessage', closeButton: false }) - finalbox.on('shown.bs.modal',function(){ + finalbox.on('shown.bs.modal',function() { $("#startOver").focus(); }) }, 100) @@ -1108,6 +1134,11 @@ function postInstallTitle () { $('.twkfltr').hide() document.getElementById(`mzd-title`).innerHTML = `${viewLog}${document.getElementById('mzd-title').innerHTML}${strtOver}` } +function saveInstallerOps (user) { + settings.set('keepBackups', user.backups.org) + settings.set('testBackups', user.backups.test) + settings.set('skipConfirm', user.backups.skipconfirm) +} function cleanCopyDir () { rimraf(`${tmpdir}`, function () { appendAIOlog(`
  • Deleted '_copy_to_usb' Folder
  • `) }) } @@ -1136,10 +1167,10 @@ function fullSystemRestore (user) { addRootFiles() tweaks2write.push(`${builddir}00___fullRestore.sh`) if(fs.existsSync(`${extradir}/color-schemes/Red/jci.zip`)) { - mkdirp.sync(`${tmpdir}/config/color-schemes`) + mkdirp.sync(`${tmpdir}/config/color-schemes/Red`) aioLog(`Unzipping Red color theme folder`) extract(`${extradir}/color-schemes/Red/jci.zip`, {dir: `${tmpdir}/config/color-schemes/Red`}, function (err) { - if (err) { aioLog(err, err) } + if (err) { aioLog(err) } aioLog(`Red Color Scheme Added Successfully`) }) } @@ -1216,7 +1247,7 @@ function addWifiApp (user) { size: "small", title: "Values Were Not Changed", message: "WiFi App Will not be installed", - callback: function(){ + callback: function() { rimraf.sync(`${tmpdir}/00-start-wifiAP/`) printAIOlog() } diff --git a/app/assets/vendor/w3.css b/app/assets/vendor/w3.css index c89b4a9..7be5685 100644 --- a/app/assets/vendor/w3.css +++ b/app/assets/vendor/w3.css @@ -108,7 +108,7 @@ ul.w3-ul li:last-child{border-bottom:none} .w3-accordion-content a{padding:6px 16px;display:block}.w3-accordion-content a:hover{background-color:#ccc} .w3-progress-container{width:100%;height:1.5em;position:relative;background-color:#f1f1f1} .w3-progressbar{background-color:#757575;height:100%;position:absolute;line-height:inherit} -.bootbox-form .checkbox input[type=checkbox],input[type=checkbox].w3-check,input[type=radio].w3-radio{width:24px;height:24px;position:relative;top:6px;visibility:visible;} +.bootbox-form .checkbox input[type=checkbox],input[type=checkbox].w3-check,input[type=radio].w3-radio{width:24px;height:24px;position:relative;/*top:6px;*/visibility:visible;} input[type=checkbox].w3-check:checked+.w3-validate,input[type=radio].w3-radio:checked+.w3-validate{color:#009688} input[type=checkbox].w3-check:disabled+.w3-validate,input[type=radio].w3-radio:disabled+.w3-validate{color:#aaa} .w3-responsive{overflow-x:auto} diff --git a/app/controllers/home.js b/app/controllers/home.js index 2e098e5..2a023ef 100644 --- a/app/controllers/home.js +++ b/app/controllers/home.js @@ -37,7 +37,7 @@ $scope.faqs = langObj.FAQs $scope.popupMsgs = langObj.popupMsgs $scope.colors = langObj.colors - $scope.rmCpDir = persistantData.get('delCopyFolder') || false + $scope.rmCpDir = settings.get('delCopyFolder') || false $scope.loc = persistantData.get('locale') || 'en-US' $scope.twkfltr = '' $scope.bgSec = 60 @@ -62,9 +62,10 @@ advancedOps: false, dataDump: false, aaBetaVer: false, + vpUnicode: false, darkMode: settings.get('darkMode') || false, flipOption: settings.get('flipOption') || '', - transMsg: persistantData.get('transMsg') || false, + transMsg: settings.get('transMsg') || false, copydir: persistantData.get('copyFolderLocation') } $scope.user.autorun = { @@ -88,9 +89,9 @@ uninst: false } $scope.user.backups = { - org: persistantData.get('keepBackups') || false, - test: persistantData.get('testBackups') || false, - skipconfirm: persistantData.get('skipConfirm') || false + org: settings.get('keepBackups') || false, + test: settings.get('testBackups') || false, + skipconfirm: settings.get('skipConfirm') || false } $scope.user.boot = { logo1: 0, @@ -117,9 +118,15 @@ xph: {id: 11}, sml: {id: 22}, bg: {id: 30}, + effic: {id: 40}, + temperature: {id: 42}, + startbar: {id:45}, color: null, mod: false, modAlt: false, + simpmod: false, + sbtemp: false, + digiclock: false, opac: 0 } $scope.user.statusbar = { diff --git a/app/files/screenshots/barSpeedo.jpg b/app/files/screenshots/barSpeedo.jpg new file mode 100644 index 0000000..e9b5ea6 Binary files /dev/null and b/app/files/screenshots/barSpeedo.jpg differ diff --git a/app/files/screenshots/barSpeedo2.jpg b/app/files/screenshots/barSpeedo2.jpg new file mode 100644 index 0000000..b111b75 Binary files /dev/null and b/app/files/screenshots/barSpeedo2.jpg differ diff --git a/app/files/screenshots/mzd_SpeedoCompass.gif b/app/files/screenshots/mzd_SpeedoCompass.gif index 77000cd..6096a14 100644 Binary files a/app/files/screenshots/mzd_SpeedoCompass.gif and b/app/files/screenshots/mzd_SpeedoCompass.gif differ diff --git a/app/files/tweaks/00_intro.txt b/app/files/tweaks/00_intro.txt index ba75c23..18c4506 100644 --- a/app/files/tweaks/00_intro.txt +++ b/app/files/tweaks/00_intro.txt @@ -1,5 +1,5 @@ #!/bin/sh -# tweaks.sh - MZD-AIO-TI Version 2.7.2 +# tweaks.sh - MZD-AIO-TI Version 2.7.4 # Special thanks to Siutsch for collecting all the tweaks and for the original AIO # Big Thanks to Modfreakz, khantaena, Xep, ID7, Doog, Diginix, oz_paulb & lmagder # For more information visit https://mazdatweaks.com @@ -9,5 +9,5 @@ hwclock --hctosys # AIO Variables -AIO_VER=2.7.2 -AIO_DATE=2017.11.27 +AIO_VER=2.7.4 +AIO_DATE=2017.12.24 diff --git a/app/files/tweaks/17_videoplayer-i.txt b/app/files/tweaks/17_videoplayer-i.txt index d6690ae..7e7fd4e 100644 --- a/app/files/tweaks/17_videoplayer-i.txt +++ b/app/files/tweaks/17_videoplayer-i.txt @@ -2,10 +2,10 @@ # Video_Player by many many people # V3.1 - Mods by vic_bam85 & Trezdog44 ####################################################################### -show_message "VIDEOPLAYER v3.1\nMODS BY VIC_BAM85 & TREZDOG44" +show_message "VIDEOPLAYER v3.2\nMODS BY VIC_BAM85 & TREZDOG44" log_message "============*********** INSTALL VIDEOPLAYER ************=============" -log_message "=== Begin Installation of VideoPlayer V3.1 ===" +log_message "=== Begin Installation of VideoPlayer V3.2 ===" if [ "${TESTBKUPS}" = "1" ] then @@ -56,10 +56,13 @@ fi count=$(grep -c '/jci/gui/addon-common/websocketd --port=9998 sh' /jci/scripts/stage_wifi.sh) if [ "$count" = "0" ] then - cp /jci/scripts/stage_wifi.sh /jci/scripts/stage_wifi.sh.old - echo -e '\n\n\n### Video player' >> /jci/scripts/stage_wifi.sh - echo -e '\n/jci/gui/addon-common/websocketd --port=9998 sh &' >> /jci/scripts/stage_wifi.sh - chmod 755 /jci/scripts/stage_wifi.sh + #echo -e '\n\n\n### Video player' >> /jci/scripts/stage_wifi.sh + #echo -e '\n/jci/gui/addon-common/websocketd --port=9998 sh &' >> /jci/scripts/stage_wifi.sh + sed -i '/#!/ a\### Video player' /jci/scripts/stage_wifi.sh + sleep 1 + sed -i '/Video player/ i\ ' /jci/scripts/stage_wifi.sh + sed -i '/Video player/ a\/jci/gui/addon-common/websocketd --port=9998 sh &' /jci/scripts/stage_wifi.sh + chmod 755 /jci/scripts/stage_wifi.sh log_message "=== Modified Stage_wifi.sh ===" fi @@ -69,6 +72,27 @@ add_app_json "_videoplayer" "Video Player" cp -a ${MYDIR}/config/videoplayer/jci/gui/apps/* /jci/gui/apps/ chmod 755 -R /jci/gui/apps/_videoplayer/ +log_message "=== Copy VideoPlayer Files ===" + + +cp -a ${MYDIR}/config/videoplayer/usr/lib/gstreamer-0.10/* /usr/lib/gstreamer-0.10/ +chmod 755 -R /usr/lib/gstreamer-0.10/libgstautodetect.so +log_message "=== Copy libs to usr/lib/gstreamer-0.10 ===" + + +count=$(grep -c '/imx-mm/video-codec' /etc/profile) +if [ "$count" = "0" ] + then + sed -i 's/\/imx-mm\/parser/\/imx-mm\/parser:\/usr\/lib\/imx-mm\/video-codec/g' /etc/profile + log_message "=== Fix exports / codecs ===" +fi + +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/imx-mm/video-codec + +rm -f /tmp/root/.gstreamer-0.10/registry.arm.bin +/usr/bin/gst-inspect +log_message "=== Updated gstreamer registry ===" + # patch systemApp.js if needed for v59+ app list if ! grep -Fq "_videoplayer" /jci/gui/apps/system/js/systemApp.js && [ ${APP_PATCH_59} -eq 0 ] then diff --git a/app/files/tweaks/17_videoplayer-unicode.txt b/app/files/tweaks/17_videoplayer-unicode.txt new file mode 100644 index 0000000..d652580 --- /dev/null +++ b/app/files/tweaks/17_videoplayer-unicode.txt @@ -0,0 +1,3 @@ +# change to Unicode mode as default +sed -i 's/var defaultUnicode = false;\/\/ Change to true for Unicode Mode/var defaultUnicode = true;\/\/ Change to false for ASCII Mode/g' /jci/gui/apps/_videoplayer/js/videoplayer-v2.js +log_message "=== CHANGED VIDEO PLAYER TO DEFAULT UNICODE MODE ===" diff --git a/app/files/tweaks/18_swapfile-i.txt b/app/files/tweaks/18_swapfile-i.txt index 09175a7..1d19ff2 100644 --- a/app/files/tweaks/18_swapfile-i.txt +++ b/app/files/tweaks/18_swapfile-i.txt @@ -38,10 +38,10 @@ then else echo '### find swap file' >> /jci/scripts/stage_wifi.sh echo ' sleep 5' >> /jci/scripts/stage_wifi.sh - echo ' USBDRV=$(ls /mnt | grep sd)" resources"' >> /jci/scripts/stage_wifi.sh + echo ' USBDRV=$(ls /tmp/mnt | grep sd)" resources"' >> /jci/scripts/stage_wifi.sh echo ' for USB in $USBDRV' >> /jci/scripts/stage_wifi.sh echo ' do' >> /jci/scripts/stage_wifi.sh - echo ' USBPATH=/tmp/mnt/${USBDRV}' >> /jci/scripts/stage_wifi.sh + echo ' USBPATH=/tmp/mnt/${USB}' >> /jci/scripts/stage_wifi.sh echo ' SWAPFILE="${USBPATH}"/swapfile' >> /jci/scripts/stage_wifi.sh echo ' if [ -e "${SWAPFILE}" ]' >> /jci/scripts/stage_wifi.sh echo ' then' >> /jci/scripts/stage_wifi.sh @@ -60,11 +60,15 @@ log_message "=== Swap File Added To USB Drive log_message "=== Deleting Tweak Files ===" rm -fr ${MYDIR}/config rm -fr ${MYDIR}/config_org +rm -fr ${MYDIR}/bakups +rm -fr ${MYDIR}/VehDataPull rm -f ${MYDIR}/cmu_dataretrieval.up rm -f ${MYDIR}/dataRetrieval_config.txt rm -f ${MYDIR}/jci-autoupdate +rm -f ${MYDIR}/MZD_LOG.md +rm -f ${MYDIR}/AIO_info.json +rm -f ${MYDIR}/headunit.log rm -f ${MYDIR}/tweaks.sh -rm -fr ${MYDIR}/VehDataPull log_message "===========********** END INSTALLATION OF SWAP FILE **********===========" log_message " " diff --git a/app/files/tweaks/19_speedo-analog.txt b/app/files/tweaks/19_speedo-analog.txt index f220312..044c8c9 100644 --- a/app/files/tweaks/19_speedo-analog.txt +++ b/app/files/tweaks/19_speedo-analog.txt @@ -1,4 +1,4 @@ # csetting speedometer variant start in analog mode -show_message "SETTING ANALOG STARTUP MODE ..." +# show_message "SETTING ANALOG STARTUP MODE ..." sed -i 's/var startAnalog = false;/var startAnalog = true;/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== START MODED SPEEDOMETER IN ANALOG MODE ===" diff --git a/app/files/tweaks/19_speedo-digiclock.txt b/app/files/tweaks/19_speedo-digiclock.txt new file mode 100644 index 0000000..630319b --- /dev/null +++ b/app/files/tweaks/19_speedo-digiclock.txt @@ -0,0 +1,3 @@ +# Digital Clock Mod +sed -i '/Remove this/d' /jci/gui/apps/_speedometer/css/StatusBarSpeedometer.css +log_message "=== Digital Clock Mod ===" diff --git a/app/files/tweaks/19_speedo-english.txt b/app/files/tweaks/19_speedo-english.txt index 088abe5..c174979 100644 --- a/app/files/tweaks/19_speedo-english.txt +++ b/app/files/tweaks/19_speedo-english.txt @@ -1,4 +1,4 @@ # change to english version -show_message "CHANGE SPEEDOMETER TO ENGLISH..." +# show_message "CHANGE SPEEDOMETER TO ENGLISH..." sed -i 's/var language = "DE";/var language = "EN";/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== CHANGED SPEEDOMETER TO ENGLISH VERSION ===" diff --git a/app/files/tweaks/19_speedo-french.txt b/app/files/tweaks/19_speedo-french.txt index c3555c5..b088c6c 100644 --- a/app/files/tweaks/19_speedo-french.txt +++ b/app/files/tweaks/19_speedo-french.txt @@ -1,4 +1,4 @@ # change to french version -show_message "CHANGE SPEEDOMETER TO FRENCH..." +# show_message "CHANGE SPEEDOMETER TO FRENCH..." sed -i 's/var language = "DE";/var language = "FR";/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== CHANGED SPEEDOMETER TO FRENCH VERSION ===" diff --git a/app/files/tweaks/19_speedo-i1.txt b/app/files/tweaks/19_speedo-i1.txt index 5c69886..b3cfff2 100644 --- a/app/files/tweaks/19_speedo-i1.txt +++ b/app/files/tweaks/19_speedo-i1.txt @@ -1,5 +1,5 @@ # Speedometer v4.8 -show_message "DIGINIX'S SPEEDOMETER v4.8 WITH ROTATING COMPASS\nAND ADDITIONAL GPS INFOS IN STATUSBAR" +show_message "INSTALL SPEEDOMETER v5.0 ..." log_message "==========**************** INSTALL SPEEDOMETER *****************=========" log_message "=== Begin Installation of Speedometer ===" @@ -18,7 +18,7 @@ rm -fr /jci/gui/addon-speedometer rm -fr /jci/gui/speedometer rm -fr /jci/gui/apps/_speedometer -sed -i '/Speedo-Compass-Video_Tweak/d' /jci/scripts/stage_wifi.sh +sed -i '/Speedo-Compass-Video/d' /jci/scripts/stage_wifi.sh sed -i '/v3.2/d' /jci/scripts/stage_wifi.sh sed -i '/Removed requirement/d' /jci/scripts/stage_wifi.sh sed -i '/# mount /d' /jci/scripts/stage_wifi.sh @@ -39,6 +39,7 @@ sed -i '/Log data collection/d' /jci/scripts/stage_wifi.sh sed -i '/get-log-data.sh/d' /jci/scripts/stage_wifi.sh sed -i '/addon-speedometer.sh &/d' /jci/scripts/stage_wifi.sh sed -i '/addon-player.sh &/d' /jci/scripts/stage_wifi.sh +sed -i '/stage_vehSpeed.sh/d' /jci/scripts/stage_wifi.sh sed -i '/mount of SD card/d' /jci/scripts/stage_wifi.sh sed -i '/sleep 40/d' /jci/scripts/stage_wifi.sh sed -i '/sleep 55/d' /jci/scripts/stage_wifi.sh @@ -56,6 +57,7 @@ sed -i '/#!/ a\ ' /jci/scripts/stage_wifi.sh # cp -a ${MYDIR}/config/speedometer/jci/opera/opera_dir/userjs/speedometer-startup.js/jci/opera/opera_dir/userjs/ # Remove startup file from userjs rm -f /jci/opera/opera_dir/userjs/speedometer-startup.js +rm -f /jci/opera/opera_dir/userjs/speedometer.js #if [ -e /jci/gui/apps/_mzdmeter/js/mzdmeter.js ] #then # log_message "=== Mzdmeter installed copied startup file ===" @@ -101,18 +103,13 @@ fi # add commands for speedometer to stage_wifi.sh if [ -e /jci/scripts/stage_wifi.sh ] then - if grep -Fq "### Speedometer" /jci/scripts/stage_wifi.sh + if grep -Fq "speedometer.sh &" /jci/scripts/stage_wifi.sh then log_message "=== Speedometer entry already exists in /jci/scripts/stage_wifi.sh ===" else sed -i '/#!/ a\### Speedometer' /jci/scripts/stage_wifi.sh sleep 1 sed -i '/Speedometer/ i\ ' /jci/scripts/stage_wifi.sh - fi - if grep -Fq "speedometer.sh &" /jci/scripts/stage_wifi.sh - then - log_message "=== Speedometer entry already exists in /jci/scripts/stage_wifi.sh ===" - else sed -i '/### Speedometer/ a\/jci/gui/addon-common/websocketd --port=55554 /jci/gui/apps/_speedometer/sh/speedometer.sh &' /jci/scripts/stage_wifi.sh log_message "=== Added speedometer entry to /jci/scripts/stage_wifi.sh ===" cp /jci/scripts/stage_wifi.sh "${MYDIR}/bakups/test/stage_wifi_speedometer-after.sh" diff --git a/app/files/tweaks/19_speedo-i2.txt b/app/files/tweaks/19_speedo-i2.txt index 303be09..d298efa 100644 --- a/app/files/tweaks/19_speedo-i2.txt +++ b/app/files/tweaks/19_speedo-i2.txt @@ -1,7 +1,7 @@ if [ ${TESTBKUPS} = "1" ] then cp -a /jci/gui/apps/_speedometer/js/speedometer-startup.js ${MYDIR}/bakups/test/ - cp -a /jci/scripts/stage_wwifi.sh ${MYDIR}/bakups/test/stage_wwifi-after_speedo.sh + cp -a /jci/scripts/stage_wifi.sh ${MYDIR}/bakups/test/stage_wifi-after_speedo.sh fi log_message "=======********** END INSTALLATION OF SPEEDOMETER **********=======" diff --git a/app/files/tweaks/19_speedo-italian.txt b/app/files/tweaks/19_speedo-italian.txt index a2c82e3..9e2427f 100644 --- a/app/files/tweaks/19_speedo-italian.txt +++ b/app/files/tweaks/19_speedo-italian.txt @@ -1,4 +1,4 @@ # change to Italian version -show_message "CHANGE SPEEDOMETER TO ITALIAN..." +# show_message "CHANGE SPEEDOMETER TO ITALIAN..." sed -i 's/var language = "DE";/var language = "IT";/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== CHANGED SPEEDOMETER TO ITALIAN VERSION ===" diff --git a/app/files/tweaks/19_speedo-kml.txt b/app/files/tweaks/19_speedo-kml.txt new file mode 100644 index 0000000..ac22ed2 --- /dev/null +++ b/app/files/tweaks/19_speedo-kml.txt @@ -0,0 +1,3 @@ +# cchange km/l to L/100km +sed -i 's/var fuelEffunit_kml = false;/var fuelEffunit_kml = true;/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js +log_message "=== km/L => L/100km ===" diff --git a/app/files/tweaks/19_speedo-mph.txt b/app/files/tweaks/19_speedo-mph.txt index 8cf7d60..26ae32f 100644 --- a/app/files/tweaks/19_speedo-mph.txt +++ b/app/files/tweaks/19_speedo-mph.txt @@ -1,4 +1,4 @@ # change to version with mph -show_message "CHANGE SPEEDOMETER TO MPH ..." +# show_message "CHANGE SPEEDOMETER TO MPH ..." sed -i 's/var isMPH = false;/var isMPH = true;/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== CHANGED SPEEDOMETER TO MPH ===" diff --git a/app/files/tweaks/19_speedo-old_background.txt b/app/files/tweaks/19_speedo-old_background.txt index ee8fa99..d57bb34 100644 --- a/app/files/tweaks/19_speedo-old_background.txt +++ b/app/files/tweaks/19_speedo-old_background.txt @@ -1,4 +1,4 @@ # Original speedometer background -show_message "SET ORIGINAL SPEEDOMETER BACKGROUND ..." +# show_message "SET ORIGINAL SPEEDOMETER BACKGROUND ..." sed -i 's/var original_background_image = false;/var original_background_image = true;/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== SET ORIGINAL SPEEDOMETER BACKGROUND ===" diff --git a/app/files/tweaks/19_speedo-own_background.txt b/app/files/tweaks/19_speedo-own_background.txt index 43e9c10..0efcc92 100644 --- a/app/files/tweaks/19_speedo-own_background.txt +++ b/app/files/tweaks/19_speedo-own_background.txt @@ -1,5 +1,5 @@ # own background -show_message "SET BACKGROUND OPACITY TO ${OPACITY}" +# show_message "SET BACKGROUND OPACITY TO ${OPACITY}" log_message "=== Set background opacity to ${OPACITY} ===" if [ ! ${OPACITY} = 0 ] then diff --git a/app/files/tweaks/19_speedo-polish.txt b/app/files/tweaks/19_speedo-polish.txt index 952238d..31901ee 100644 --- a/app/files/tweaks/19_speedo-polish.txt +++ b/app/files/tweaks/19_speedo-polish.txt @@ -1,4 +1,4 @@ # change to polish version -show_message "CHANGE SPEEDOMETER TO POLISH..." +# show_message "CHANGE SPEEDOMETER TO POLISH..." sed -i 's/var language = "DE";/var language = "PL";/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== CHANGED SPEEDOMETER TO POLISH VERSION ===" diff --git a/app/files/tweaks/19_speedo-sbtemp.txt b/app/files/tweaks/19_speedo-sbtemp.txt new file mode 100644 index 0000000..519339a --- /dev/null +++ b/app/files/tweaks/19_speedo-sbtemp.txt @@ -0,0 +1,3 @@ +# no small speedometer in statusbar +sed -i 's/var sbTemp = false;/var sbTemp = true;/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js +log_message "=== ADD TEMPERATURE TO STATUSBAR ===" diff --git a/app/files/tweaks/19_speedo-slovak.txt b/app/files/tweaks/19_speedo-slovak.txt index a72641e..1404c2b 100644 --- a/app/files/tweaks/19_speedo-slovak.txt +++ b/app/files/tweaks/19_speedo-slovak.txt @@ -1,4 +1,4 @@ # change to slovak version -show_message "CHANGE SPEEDOMETER TO SLOVAK..." +# show_message "CHANGE SPEEDOMETER TO SLOVAK..." sed -i 's/var language = "DE";/var language = "SK";/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== CHANGED SPEEDOMETER TO SLOVAK VERSION ===" diff --git a/app/files/tweaks/19_speedo-small_speedo_off.txt b/app/files/tweaks/19_speedo-small_speedo_off.txt index 32573a5..c25a4d2 100644 --- a/app/files/tweaks/19_speedo-small_speedo_off.txt +++ b/app/files/tweaks/19_speedo-small_speedo_off.txt @@ -1,4 +1,4 @@ # no small speedometer in statusbar -show_message "DISABLE SMALL SPEEDOMETER IN STATUSBAR ..." +# show_message "DISABLE SMALL SPEEDOMETER IN STATUSBAR ..." sed -i 's/var enableSmallSbSpeedo = true;/var enableSmallSbSpeedo = false;/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== DISABLE SMALL SPEEDOMETER IN STATUSBAR ===" diff --git a/app/files/tweaks/19_speedo-small_speedo_on_vehicle.txt b/app/files/tweaks/19_speedo-small_speedo_on_vehicle.txt index 1a72eb2..d8a95a8 100644 --- a/app/files/tweaks/19_speedo-small_speedo_on_vehicle.txt +++ b/app/files/tweaks/19_speedo-small_speedo_on_vehicle.txt @@ -1,5 +1,5 @@ # show the vehicle speed instead of the gps speed in the small speedometer -show_message "CHANGE TO VEHICLE SPEED IN SMALL SPEEDO ..." +# show_message "CHANGE TO VEHICLE SPEED IN SMALL SPEEDO ..." sed -i 's/
    0<\/div>/
    0<\/div>/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js sed -i 's/.gpsSpeedValue/.vehicleSpeed/g' /jci/gui/apps/_speedometer/css/StatusBarSpeedometer.css log_message "=== CHANGE TO VEHICLE SPEED IN SMALL SPEEDO ===" diff --git a/app/files/tweaks/19_speedo-spanish.txt b/app/files/tweaks/19_speedo-spanish.txt index 4457b6c..2ab7831 100644 --- a/app/files/tweaks/19_speedo-spanish.txt +++ b/app/files/tweaks/19_speedo-spanish.txt @@ -1,4 +1,4 @@ # change to spanish version -show_message "CHANGE SPEEDOMETER TO SPANISH..." +# show_message "CHANGE SPEEDOMETER TO SPANISH..." sed -i 's/var language = "DE";/var language = "ES";/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== CHANGED SPEEDOMETER TO SPANISH VERSION ===" diff --git a/app/files/tweaks/19_speedo-temp.txt b/app/files/tweaks/19_speedo-temp.txt new file mode 100644 index 0000000..4530316 --- /dev/null +++ b/app/files/tweaks/19_speedo-temp.txt @@ -0,0 +1,3 @@ +# change temp from C to F +sed -i 's/var tempIsF = false;/var tempIsF = true;/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js +log_message "=== TEMPERATURE SET TO FAHRENHEIT ===" diff --git a/app/files/tweaks/19_speedo-turkish.txt b/app/files/tweaks/19_speedo-turkish.txt index f8d2b00..a49da04 100644 --- a/app/files/tweaks/19_speedo-turkish.txt +++ b/app/files/tweaks/19_speedo-turkish.txt @@ -1,4 +1,4 @@ # change to Turkish version -show_message "CHANGE SPEEDOMETER TO TURKISH..." +# show_message "CHANGE SPEEDOMETER TO TURKISH..." sed -i 's/var language = "DE";/var language = "TR";/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js log_message "=== CHANGED SPEEDOMETER TO TURKISH VERSION ===" diff --git a/app/files/tweaks/19_speedo-u.txt b/app/files/tweaks/19_speedo-u.txt index 8e73934..ab61320 100644 --- a/app/files/tweaks/19_speedo-u.txt +++ b/app/files/tweaks/19_speedo-u.txt @@ -97,10 +97,17 @@ fi log_message "=== cleanup old versions ===" rm -fr /jci/gui/addon-player rm -fr /jci/gui/addon-speedometer -rm -fr /jci/gui/speedometer rm -fr /jci/gui/apps/_speedometer +rm -fr /jci/gui/speedometer rm -f /jci/opera/opera_dir/userjs/addon-startup.js rm -f /jci/scripts/stage_wifi.sh.bak? +rm -f /jci/scripts/get-vehicle-speed.sh +rm -f /jci/scripts/stage_vehSpeed.sh +rm -f /jci/scripts/get-vehicle-fuel.sh +rm -f /jci/scripts/get-gps-speed.sh +rm -f /jci/scripts/get-engine-speed.sh +rm -f /jci/scripts/get-gear-position.sh +rm -f /jci/scripts/get-temp.sh if [ "${TESTBKUPS}" = "1" ] then diff --git a/app/files/tweaks/19_speedo_bar.txt b/app/files/tweaks/19_speedo_bar.txt new file mode 100644 index 0000000..1ecee50 --- /dev/null +++ b/app/files/tweaks/19_speedo_bar.txt @@ -0,0 +1,15 @@ +# Speedometer v5.0 +show_message "INSTALL DIGITAL BAR SPEEDOMETER VARIANT ..." +log_message "=========********** INSTALL DIGITAL BAR SPEEDOMETER ************=========" + +cp -a ${MYDIR}/config/speedometer_bar/jci / +log_message "=== Speedometer Bar Variant Installed ===" + +cp -a ${MYDIR}/config/speedometer_bar/speedometer-config.js /jci/gui/apps/_speedometer/js +log_message "=== Copied Speedometer Config File ===" + +sed -i 's/var barSpeedometerMod = false;/var barSpeedometerMod = true;/g' /jci/gui/apps/_speedometer/js/speedometer-startup.js +log_message "=== Set flag for bar speedometer in speedometer-startup.js ===" + +log_message "=========************ END DIGITAL BAR SPEEDOMETER **************=========" +log_message " " diff --git a/app/files/tweaks/19_speedo_variant-i.txt b/app/files/tweaks/19_speedo_variant-i.txt index 618b5ed..c4d9511 100644 --- a/app/files/tweaks/19_speedo_variant-i.txt +++ b/app/files/tweaks/19_speedo_variant-i.txt @@ -1,9 +1,13 @@ -show_message "INSTALL SPEEDOMETER VARIANT BY: PNEDKOV ..." -log_message "========****** INSTALL SPEEDOMETER VARIANT BY: PNEDKOV ... ******========" +show_message "INSTALL SPEEDOMETER VARIANT" +log_message "========****** INSTALL SPEEDOMETER VARIANT ... ******========" # Copy modded speedo files cp -a ${MYDIR}/config/speedometer_mod/jci / log_message "=== Speedometer Variant Installed ===" +chmod 755 /jci/fonts/Crysta.ttf +chmod 755 /jci/fonts/CHN/Crysta.ttf +chmod 755 /jci/fonts/JP/Crysta.ttf + log_message "=======******** END INSTALLATION OF SPEEDOMETER VARIANT *********========" log_message " " diff --git a/app/files/tweaks/24_castscreen-i.txt b/app/files/tweaks/24_castscreen-i.txt index cca41ef..cc4f9f5 100644 --- a/app/files/tweaks/24_castscreen-i.txt +++ b/app/files/tweaks/24_castscreen-i.txt @@ -23,18 +23,15 @@ if [ -e /jci/scripts/stage_wifi.sh ] then if grep -Fq "watch /jci/scripts/mirroring.sh &" /jci/scripts/stage_wifi.sh then - echo "exist" - log_message "=== Modifications already done to stage_wifi.sh ===" + log_message "=== Castscreen Receiver already in stage_wifi.sh ===" else - if [ ! -e /jci/scripts/stage_wifi.sh.org ] - then - cp -a /jci/scripts/stage_wifi.sh /jci/scripts/stage_wifi.sh.org - log_message "=== Backup of stage_wifi.sh to stage_wifi.sh.org ===" - fi - echo "### Castscreen receiver watch" >> /jci/scripts/stage_wifi.sh - echo "watch /jci/scripts/mirroring.sh &" >> /jci/scripts/stage_wifi.sh - sed -i '/Castscreen receiver watch/ i\ ' /jci/scripts/stage_wifi.sh - log_message "=== Modifications added to /jci/scripts/stage_wifi.sh ===" + #echo "### Castscreen receiver watch" >> /jci/scripts/stage_wifi.sh + #echo "watch /jci/scripts/mirroring.sh &" >> /jci/scripts/stage_wifi.sh + sed -i '/#!/ a\#### Castscreen receiver' /jci/scripts/stage_wifi.sh + sleep 1 + sed -i '/Castscreen receiver/ i\ ' /jci/scripts/stage_wifi.sh + sed -i '/Castscreen receiver/ a\watch /jci/scripts/mirroring.sh &' /jci/scripts/stage_wifi.sh + log_message "=== Castscreen Receiver added to stage_wifi.sh ===" if [ "${TESTBKUPS}" = "1" ] then cp /jci/scripts/stage_wifi.sh ${MYDIR}/bakups/test/stage_wifi_castscreen-after.sh diff --git a/app/files/tweaks/25_androidauto-i.txt b/app/files/tweaks/25_androidauto-i.txt index 7ea545a..c2d3152 100644 --- a/app/files/tweaks/25_androidauto-i.txt +++ b/app/files/tweaks/25_androidauto-i.txt @@ -1,6 +1,6 @@ # Install Android Auto Headunit App -show_message "INSTALL ANDROID AUTO HEADUNIT APP v1.07 ..." -log_message "====******* INSTALL ANDROID AUTO HEADUNIT APP v1.07... *******====" +show_message "INSTALL ANDROID AUTO HEADUNIT APP ..." +log_message "====************ INSTALL ANDROID AUTO HEADUNIT APP v1.08...*********====" log_message "=== Begin Installation Of Android Auto Headunit App ===" TESTBKUPS=1 if [ "${TESTBKUPS}" = "1" ] @@ -44,9 +44,13 @@ sed -i '/#!/ a\ ' /jci/scripts/stage_wifi.sh # check for 1st line of stage_wifi.sh if grep -Fq "#!/bin/sh" /jci/scripts/stage_wifi.sh then - echo -e "\n\n### Android Auto start" >> /jci/scripts/stage_wifi.sh - sleep 1 - echo -e "headunit-wrapper &" >> /jci/scripts/stage_wifi.sh + #echo -e "\n\n### Android Auto start" >> /jci/scripts/stage_wifi.sh + #sleep 1 + #echo -e "headunit-wrapper &" >> /jci/scripts/stage_wifi.sh + sed -i '/#!/ a\#### Android Auto start' /jci/scripts/stage_wifi.sh + sleep 1 + sed -i '/Android Auto start/ i\ ' /jci/scripts/stage_wifi.sh + sed -i '/Android Auto start/ a\headunit-wrapper &' /jci/scripts/stage_wifi.sh log_message "=== Added Android Auto entry to /jci/scripts/stage_wifi.sh ===" else cp -a "${MYDIR}/config/androidauto/stage_wifi.sh" /jci/scripts/ diff --git a/app/files/tweaks/25_androidautob-i.txt b/app/files/tweaks/25_androidautob-i.txt new file mode 100644 index 0000000..428b355 --- /dev/null +++ b/app/files/tweaks/25_androidautob-i.txt @@ -0,0 +1,6 @@ +# Android Auto Headunit App w/ Disabled Car Navigation +if [ -e ${MYDIR}/config/androidautob/data_persist/dev/bin/headunit ] +then + cp -a ${MYDIR}/config/androidautob/data_persist/dev/bin/headunit /tmp/mnt/data_persist/dev/bin + log_message "=== Copied Android Auto v1.08b ===" +fi diff --git a/app/files/tweaks/27_aioapp-i.txt b/app/files/tweaks/27_aioapp-i.txt index 0667ea6..b397251 100644 --- a/app/files/tweaks/27_aioapp-i.txt +++ b/app/files/tweaks/27_aioapp-i.txt @@ -1,8 +1,8 @@ ####################################################################### # AIO Tweaks Headunit App -# V0.4 By: Trezdog44 +# V0.4a By: Trezdog44 ####################################################################### -show_message "INSTALLING AIO TWEAKS APP v0.4..." +show_message "INSTALLING AIO TWEAKS APP v0.4a..." log_message "=========************ INSTALL AIO TWEAKS APP *************===========" if [ "${TESTBKUPS}" = "1" ] @@ -46,13 +46,16 @@ sed -i '/AIO/d' /jci/scripts/stage_wifi.sh sed -i '/--port=9997/d' /jci/scripts/stage_wifi.sh sed -i '/--passenv/d' /jci/scripts/stage_wifi.sh -echo -e '\n\n\n### AIO Tweaks App' >> /jci/scripts/stage_wifi.sh -echo -e '\n/jci/gui/addon-common/websocketd --passenv $(env | grep XDG_ | sed "s/=.*$//g" | tr "\\n" ",")PATH,SHELL --port=9997 sh &' >> /jci/scripts/stage_wifi.sh -chmod 755 /jci/scripts/stage_wifi.sh - +#echo -e '\n\n\n### AIO Tweaks App' >> /jci/scripts/stage_wifi.sh +#echo -e '\n/jci/gui/addon-common/websocketd --passenv $(env | grep XDG_ | sed "s/=.*$//g" | tr "\\n" ",")PATH,SHELL --port=9997 sh &' >> /jci/scripts/stage_wifi.sh +sed -i '/#!/ a\### AIO Tweaks App' /jci/scripts/stage_wifi.sh +sleep 1 +sed -i '/AIO Tweaks/ i\ ' /jci/scripts/stage_wifi.sh +sed -i '/AIO Tweaks/ a\/jci/gui/addon-common/websocketd --passenv $(env | grep XDG_ | sed "s/=.*$//g" | tr "\\n" ",")PATH,SHELL --port=9997 sh &' /jci/scripts/stage_wifi.sh # delete empty lines sed -i '/^ *$/ d' /jci/scripts/stage_wifi.sh sed -i '/#!/ a\ ' /jci/scripts/stage_wifi.sh +chmod 755 /jci/scripts/stage_wifi.sh log_message "=== Set Websocketd for AIO in Stage_wifi.sh ===" @@ -69,7 +72,7 @@ fi # add preload to the AA json entry if needed if ! grep -q "AIO-startup.js" /jci/opera/opera_dir/userjs/additionalApps.json then - sed -i 's/"label": "AIO Tweaks" }/"label": "AIO Tweaks", "preload": "AIO-startup.js" }/g' /jci/opera/opera_dir/userjs/additionalApps.json + sed -i 's/"label": "AIO Tweaks" \}/"label": "AIO Tweaks", "preload": "AIO-startup.js" \}/g' /jci/opera/opera_dir/userjs/additionalApps.json log_message "=== Added AIO-startup.js to AIO Tweaks json entry ===" fi diff --git a/app/files/tweaks/casdk/scripts/casdk.aio b/app/files/tweaks/casdk/scripts/casdk.aio index 3a72423..c1a1c33 100644 --- a/app/files/tweaks/casdk/scripts/casdk.aio +++ b/app/files/tweaks/casdk/scripts/casdk.aio @@ -1,2 +1,2 @@ -AIO_VER=2.4.0 +AIO_VER=2.7.4 CASDK_VER=0.0.4 diff --git a/app/files/tweaks/config/aio-app/data_persist/dev/system_restore/restore.sh b/app/files/tweaks/config/aio-app/data_persist/dev/system_restore/restore.sh index afa2046..9d892ed 100644 --- a/app/files/tweaks/config/aio-app/data_persist/dev/system_restore/restore.sh +++ b/app/files/tweaks/config/aio-app/data_persist/dev/system_restore/restore.sh @@ -1,5 +1,5 @@ #!/bin/sh -# restore.sh - MZD-AIO-TI Version 2.7.2 +# restore.sh - MZD-AIO-TI Version 2.7.4 # The Full Restore script for the AIO Tweaks app # For more information visit http://mazdatweaks.com # By Trezdog44 - Trevelopment.com @@ -9,7 +9,7 @@ hwclock --hctosys # AIO Variables AIO_VER=0.4 -AIO_DATE=2017.10.20 +AIO_DATE=2018.01.01 # TO DELETE ALL BACKUP FILES CHENGE DEL_BAKUPS=0 TO DEL_BAKUPS=1 DEL_BAKUPS=0 diff --git a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/AIO-startup.js b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/AIO-startup.js index b512857..9f097a9 100644 --- a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/AIO-startup.js +++ b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/AIO-startup.js @@ -4,16 +4,17 @@ function applyTweaks(){ if (!window.jQuery) { utility.loadScript("addon-common/jquery.min.js"); } - var tweaks = localStorage.aiotweaks; - if(tweaks && tweaks.length > 0) { + var tweaks = localStorage.getItem("aio.tweaks") || ""; + if(tweaks.length > 0) { var AIOcss = document.createElement("link"); AIOcss.href = "apps/_aiotweaks/css/_aiotweaksApp.css"; AIOcss.rel = "stylesheet"; AIOcss.type = "text/css"; body.insertBefore(AIOcss, body.firstChild); - var savedTweaks = JSON.parse(tweaks) || ""; - body.className = savedTweaks; + body.className = tweaks; } } +framework.transitionsObj._genObj._TEMPLATE_CATEGORIES_TABLE.AIOTweaksTmplt = "Detail with UMP"; + applyTweaks(); diff --git a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/_aiotweaksApp.js b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/_aiotweaksApp.js index 84e5060..b7d5847 100644 --- a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/_aiotweaksApp.js +++ b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/_aiotweaksApp.js @@ -45,10 +45,12 @@ _aiotweaksApp.prototype.appInit = function() //@formatter:on //@formatter:off - this._messageTable = { - // haven't yet been able to receive messages from MMUI + this._messageTable = + { + //Speed Handlers + "Global.AtSpeed" : this._AtSpeedMsgHandler.bind(this), + "Global.NoSpeed" : this._NoSpeedMsgHandler.bind(this) }; - //@formatter:on }; /** @@ -56,6 +58,12 @@ _aiotweaksApp.prototype.appInit = function() * CONTEXT CALLBACKS * ========================= */ +_aiotweaksApp.prototype._AtSpeedMsgHandler = function (msg){ + log.info("AIO Tweaks App Received AtSpeedMsg" + msg); +} +_aiotweaksApp.prototype._NoSpeedMsgHandler = function (msg){ + log.info("AIO Tweaks App Received NoSpeedMsg" + msg); +} _aiotweaksApp.prototype._StartContextReady = function () { framework.common.setSbDomainIcon("apps/_aiotweaks/app.png"); @@ -65,7 +73,7 @@ _aiotweaksApp.prototype._StartContextOut = function () { var currTwks = document.getElementsByTagName("body")[0].className; if(currTwks.length > 0) { - localStorage.aiotweaks = JSON.stringify(currTwks); + localStorage.setItem("aio.tweaks",currTwks); } }; /** diff --git a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/mzd.js b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/mzd.js index fcaf045..07def6d 100644 --- a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/mzd.js +++ b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/js/mzd.js @@ -1,14 +1,15 @@ // ***************************** -// ** AIO Tweaks App v0.4 - mzd.js +// ** AIO Tweaks App v0.4a - mzd.js // ** All the functions for Buttons in AIO Tweaks App // ** By Trezdog44 // ***************************** /* jshint -W117 */ -var wsAIO = null; + var AArunning = false; -var AIOvideo = false; var appListData = []; -var aioWsVideo = null; +//var wsAIO = null; +//var aioWsVideo = null; +//var AIOvideo = false; $(document).ready(function(){ try { @@ -25,27 +26,27 @@ $(document).ready(function(){ // AIO info getAppListData(); $('button').on('click',function(){$('button').removeClass('selectedItem');$(this).addClass('selectedItem')}); - $("#aioInfo").on("click",function(){showAioInfo("

    AIO Tweaks App v0.4

    This is an experimental app by Trezdog44 made to test the capabilities, functionalities, and limitations of apps in the MZD Infotainment System.
    This app has some useful and fun functions although it is not guaranteed that everything works. There may be non-functioning or experimental features.
    ");}); + $("#aioInfo").on("click",function(){showAioInfo("

    AIO Tweaks App v0.4a

    This is an experimental app by Trezdog44 made to test the capabilities, functionalities, and limitations of apps in the MZD Infotainment System.
    This app has some useful and fun functions although it is not guaranteed that everything works. There may be non-functioning or experimental features.
    ");}); $("#aioReboot").on("click",myRebootSystem); - $("#mainMenuLoop").on("click",setMainMenuLoop); - $("#test").on("click",myTest); + //$("#mainMenuLoop").on("click",setMainMenuLoop); + //$("#test").on("click",myTest); $("#touchscreenBtn").on("click",enableTouchscreen); $("#touchscreenOffBtn").on("click",disableTouchscreen); $("#touchscreenCompassBtn").on("click",enableCompass); - $("#messageBtn").on("click",myMessage); + //$("#messageBtn").on("click",myMessage); $("#messageTestBtn").on("click",messageTest); - $("#screenshotBtn").on("click",takeScreenshot); - $("#saveScreenshotBtn").on("click",saveScreenshot); + //$("#screenshotBtn").on("click",takeScreenshot); + //$("#saveScreenshotBtn").on("click",saveScreenshot); $("#AAstart").on("click",startHeadunit); $("#AAstop").on("click",stopHeadunit); $("#CSstart").on("click",startCastScreen); $("#CSstop").on("click",stopCastScreen); - $("#SPstart").on("click",startSpeedometer); - $("#SPstop").on("click",stopSpeedometer); - $("#chooseBg").on("click",chooseBackground); + //$("#SPstart").on("click",startSpeedometer); + //$("#SPstop").on("click",stopSpeedometer); + //$("#chooseBg").on("click",chooseBackground); $("#systemTab").on("click",settingsSystemTab); $("#wifiSettings").on("click",wifiSettings); - $("#runTweaksBtn").on("click",playAllVideos); + //$("#runTweaksBtn").on("click",playAllVideos); $("#fullRestoreConfirmBtn").on("click",fullSystemRestoreConfirm); $("#headunitLogBtn").on("click",showHeadunitLog); $("#scrollUpBtn").on("click",scrollUp); @@ -53,7 +54,6 @@ $(document).ready(function(){ $("#appListBtn").on("click",showAppList); $("#showEnvBtn").on("click",showEnvVar); $("#closeAioInfo").on("click",closeAioInfo); - $("#backupCamBtn").on("click",showBodyClassName); $("#showDFHBtn").on("click",showDFH); $("#showPSBtn").on("click",showPS); $("#showMeminfoBtn").on("click",showMeminfo); @@ -61,17 +61,22 @@ $(document).ready(function(){ $("#stopFirewallBtn").on("click",stopFirewall); $("#displayOffBtn").on("click",displayOff); $("#mountSwapBtn").on("click",mountSwap); - $("#createSwapBtn").on("click",createSwap); + $("#unmountSwapBtn").on("click",unmountSwap); + $("#createSwapBtn").on("click",showVehicleType); + $("#backupCamBtn").on("click",showBodyClassName); $("#showBgBtn").on("click",function(){$("html").addClass("showBg")}); $("#twkOut").on("click",function(){framework.sendEventToMmui("common", "Global.IntentHome")}); $("#usba").on("click",function(){framework.sendEventToMmui("system", "SelectUSBA")}); $("#usbb").on("click",function(){framework.sendEventToMmui("system", "SelectUSBB")}); + //$("#BluetoothAudio").on("click",function(){framework.sendEventToMmui("common", "Global.Resume")}); + //$("#previousTrackBtn").on("click",function(){framework.sendEventToMmui("common", "Global.PreviousHoldStop")}); + //$("#nextTrackBtn").on("click",function(){framework.sendEventToMmui("common", "Global.NextHoldStop")}); $("#BluetoothAudio").on("click",function(){framework.sendEventToMmui("system", "SelectBTAudio")}); $("#previousTrackBtn").on("click",function(){framework.sendEventToMmui("Common", "Global.Previous")}); $("#nextTrackBtn").on("click",function(){framework.sendEventToMmui("Common", "Global.Next")}); $(".mmLayout").on("click",function(){changeLayout($(this).attr("id"));$("#MainMenuMsg").html($(this).text());}); $(".toggleTweaks").on("click",function(){$("body").toggleClass($(this).attr("id"));$("#MainMenuMsg").html($(this).text());}); - $("#clearTweaksBtn").on("click",function(){$("body").attr("class","");$("#MainMenuMsg").text("Main Menu Restored");localStorage.removeItem("aiotweaks");}); + $("#clearTweaksBtn").on("click",function(){$("body").attr("class","");$("#MainMenuMsg").text("Main Menu Restored");localStorage.removeItem("aio.tweaks");}); //$("#touchscreenToggle").on("click",toggleTSPanel); $("#closeTouchPanel").on("click",closeTSPanel); // Tab select & localStrage save on each button press @@ -88,13 +93,18 @@ $(document).ready(function(){ document.getElementById("mySidenav").style.width = "0"; document.getElementById("main").style.marginLeft= "0"; }); + /*if (typeof(Storage) !== "undefined") { + console.log("localStorage Supported: " + JSON.stringify(localStorage)); + } else { + console.log("localStorage Not Supported!!"); + }*/ }); // ***************************** // ** Button Functions GO! // ***************************** function saveTweaks () { var body = document.getElementsByTagName("body")[0]; - localStorage.aiotweaks = JSON.stringify(body.className); + localStorage.setItem("aio.tweaks",body.className); aioWs("sync && echo DONE"); } function changeLayout (newlayout) { @@ -105,12 +115,16 @@ function changeLayout (newlayout) { saveTweaks(); } function getAppListData(){ - $.getJSON( "../opera/opera_dir/userjs/additionalApps.json", function( data ) { - appListData = data; - hasAA(); - hasCS(); - hasSwap(); - }); + try { + $.getJSON( "../opera/opera_dir/userjs/additionalApps.json", function(data) { + appListData = data; + hasAA(); + hasCS(); + hasSwap(); + }); + } catch (e) { + showAioInfo('Error: Cannot retrieve AIO app list...
    ' + e); + } } /*this.unsetMainMenuLoop = function() { this.offSetFocus = MainMenuCtrl.prototype._offsetFocus.toString(); @@ -206,20 +220,16 @@ function myRebootSystem(){ showAioInfo("$ reboot"); aioWs('reboot', 0); //reboot } -function runTweaks(){ - CSExists(); - //aioWs('/bin/sh /jci/gui/apps/_aiotweaks/sh/poc.sh', 3); //run AIOtweaks -} function fullSystemRestoreConfirm(){ - showAioInfo('
    ARE YOU SURE?

    THIS WILL REMOVE ALL AIO TWEAKS AND APPS *INCLUDING THIS ONE*
    But it will not restore default color theme files

    '); + showAioInfo('
    ARE YOU SURE?

    THIS WILL REMOVE ALL AIO TWEAKS AND APPS *INCLUDING THIS ONE*
    But it will not restore default color theme files

    '); } function fullSystemRestore(){ aioWs('/bin/sh /tmp/mnt/data_persist/dev/system_restore/restore.sh', 2); // Run Full Restore Script } -function backUpCam(){ +/*function backUpCam(){ utility.setRequiredSurfaces("NATGUI_SURFACE", true); aioWs('/bin/sh /jci/backupcam/start_cam.sh', 2); -} +}*/ function toggleWifiAP(){ showAioInfo("$ start_wifi.sh && jci-wifiap.sh start"); aioWs('/bin/sh /jci/scripts/start_wifi.sh; /bin/sh /jci/scripts/jci-wifiap.sh start && echo DONE ', 5); @@ -228,10 +238,10 @@ function stopFirewall(){ showAioInfo("$ jci-fw.sh stop"); aioWs('/bin/sh /jci/scripts/jci-fw.sh stop && echo "DONE" || echo "FAILBOAT" ', 1); } -function myMessage(){ +/*function myMessage(){ var msg = '/jci/gui/apps/_aiotweaks/sh/message.sh "MESSAGES DISPLAY SUCCESS!!
    THIS IS A P.O.C. FOR DISPAYING JCI-DIALOG
    MESSAGES USING WEBSOCKETS AND JAVASCRIPT"'; aioWs(msg, 0); -} +}*/ function hasAA(){ var AA = false; $.each(appListData, function( key, val ) { @@ -261,12 +271,25 @@ function AioFileCheck(fc) { //$('#createSwapBtn').off('click').on('click',deleteSwap).html('Delete Swapfile'); } else if (fc.indexOf('_NOSWAP') !== -1) { $('#mountSwapBtn').remove(); + $('#unmountSwapBtn').remove(); //$('#mountSwapBtn').html('').hide(); //$('#createSwapBtn').off('click').on('click',createSwap).html('Create Swapfile'); } else { showAioInfo('INVALID FILE CHECK: ' + fc); } } +function showVehicleType(){ + var vehicleType = framework.getSharedData("syssettings","VehicleType"); + var hud = framework.getSharedData("vehsettings", "HudInstalled"); + var IgnitionStatus = framework.getSharedData("vehsettings", "IgnitionStatus"); + var CANStatus = framework.getSharedData("vehsettings", "CanStatus"); + var vehicleConfig = framework.getSharedData("syssettings","VehicleConfigData"); + var email = framework.getSharedData('email',"emailSupported"); + var destination = framework.getSharedData("syssettings", "DestinationCode") ; + var steeringWheelType = framework.getSharedData("vehsettings","SteeringWheelLoc"); + var toolTipsEnabled = framework.getSharedData("syssettings", "ToolTips"); + showAioInfo("Vehicle Type: " + vehicleType + "
    HUD: " + hud + "
    Ignition Status: " + IgnitionStatus + "
    CAN Status: " + CANStatus + "
    Vehicle Configuration Data: " + vehicleConfig + "
    Email Support: " + email + "
    Destination: " + destination + "
    Steering Wheel Type: " + steeringWheelType + "
    Tool Tips Enabled: " + toolTipsEnabled); +} function showAppList(){ var items = []; $.each(appListData, function( key, val ) { @@ -304,7 +327,7 @@ function stopCastScreen(){ showAioInfo("$ killall cs_receiver_arm"); aioWs('killall cs_receiver_arm 2>&1', 0); } -function startSpeedometer(){ +/*function startSpeedometer(){ utility.loadScript('apps/_speedometer/js/speedometer.js'); $('
    0
    ').appendTo('body'); aioWs('/jci/gui/addon-common/websocketd --port=55554 /jci/gui/apps/_speedometer/sh/speedometer.sh &', 1); @@ -313,7 +336,7 @@ function stopSpeedometer(){ utility.removeScript('apps/_speedometer/js/speedometer.js'); $("#SbSpeedo").remove(); aioWs('pkill speedometer.sh', 1); -} +}*/ function settingsSystemTab(){ framework.sendEventToMmui("common", "Global.IntentSettingsTab",{payload:{settingsTab:"System"}}); } @@ -325,9 +348,6 @@ function wifiSettings(){ function messageTest() { aioWs('/bin/sh /jci/gui/apps/_aiotweaks/sh/message.sh'); } -function pocTweaks() { - // aioWs('/bin/sh /jci/gui/apps/_aiotweaks/sh/poc.sh "Yo What Up Dooooggggggg!!!!"'); -} function showVersion(){ showAioInfo("$ show_version.sh"); aioWs('show_version.sh', 1); @@ -338,9 +358,7 @@ function displayOff(){ //framework.sendEventToMmui("system", "DisplayOffGUIActivity"); } function showHeadunitLog(){ - /*showAioInfo("$ cat /tmp/mnt/data/headunit.log"); - aioWs('cat /tmp/mnt/data/headunit.log &', 2);*/ - showAioInfo(); + showAioInfo("Loading /tmp/mnt/data/headunit.log ..."); $.ajax({ url : "/tmp/mnt/data/headunit.log", dataType: "text", @@ -354,7 +372,9 @@ function showHeadunitLog(){ } function showBodyClassName(){ //showAioInfo("Body className:
    " + document.getElementsByTagName("body")[0].className + "

    localStorage.getItem(\"aiotweaks\"):
    " + JSON.parse(localStorage.getItem("aiotweaks"))); - showAioInfo("
    " + JSON.stringify(localStorage) + "
    "); + str = JSON.stringify(localStorage); + str = str.replace(/,/g, '
    '); + showAioInfo("
    " + str + "
    "); } function showDFH(){ showAioInfo("$ df -h"); @@ -378,11 +398,14 @@ function scrollDown(){ function mountSwap(){ showAioInfo('$ swapon ${SWAPFILE}
    '); aioWs('sh /jci/gui/apps/_aiotweaks/sh/resource_swap.sh 2>&1 && echo DONE'); + $("#mountSwapBtn").fadeOut(5000); } + function unmountSwap(){ showAioInfo('$ swapoff -a
    '); aioWs('swapoff -a 2>&1'); } +/* function createSwap() { showAioInfo('$ dd if=/dev/zero of=${SWAPFILE} size=1024k steps=1000'); aioWs('dd if=/dev/zero of=/tmp/mnt/sda1/swapfile bs=1024 count=524288 2>&1 && echo "Swapfile Created Successfully" && echo DONE &', 3); @@ -395,13 +418,7 @@ function deleteSwap() { //aioWs('sh /jci/gui/apps/_aiotweaks/sh/deleteSwap.sh'); hasSwap(false); } -function playAllVideos(){ - showAioInfo("$ gplay"); - //var src = 'gst-launch filesrc location=$(ls -d -1 /tmp/mnt/sd*/Movies/** | egrep ".avi|.mp4|.wmv|.flv" | tr "\n" ",") typefind=true ! aiurdemux name=demux demux. ! queue max-size-buffers=0 max-size-time=0 ! vpudec ! mfw_v4lsink demux. ! queue max-size-buffers=0 max-size-time=0 ! beepdec ! audioconvert ! "audio/x-raw-int, channels=2" ! alsasink' - //var src = 'gplay --video-sink=mfw_v4lsink --audio-sink=alsasink $(ls -d -1 /tmp/mnt/sd*/Movies/** | egrep ".avi|.mp4|.wmv|.flv" | tr "\n" ",") 2>&1 && echo DONE'; - var src = 'sync; for n in 0 1 2 3; do echo $n > /proc/sys/vm/drop_caches; done; gplay --video-sink=mfw_v4lsink --audio-sink=alsasink $(ls -d -1 /tmp/mnt/sd*/Movies/** | egrep ".avi|.mp4|.wmv|.flv" | tr "\n" ";") 2>&1 && echo DONE'; - aioWs(src,4); -} +*/ /* ****************** function globalPause(){ // only works with CASDK framework.sendEventToMmui("system", "SelectUSBB"); diff --git a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/sh/resource_swap.sh b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/sh/resource_swap.sh index 8289824..5c463de 100644 --- a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/sh/resource_swap.sh +++ b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/sh/resource_swap.sh @@ -9,18 +9,41 @@ show_message() killall -q jci-dialog } -USBDRV="resources $(ls /mnt | grep sd)" -for USB in ${USBDRV} -do - USBPATH=/tmp/mnt/${USB} - SWAPFILE="${USBPATH}"/swapfile - if [ -e "${SWAPFILE}" ] - then - show_message "SWAPFILE FOUND, MOUNTING: ${SWAPFILE}" - mount -o rw,remount ${USBPATH} - mkswap ${SWAPFILE} - swapon ${SWAPFILE} - break - fi -done -exit 0 +CMD="$1" +shift + +if [ "$CMD" = "" ] || ["$CMD" = "mount" ] ; then + USBDRV="resources $(ls /mnt | grep sd)" + for USB in ${USBDRV} + do + USBPATH=/tmp/mnt/${USB} + SWAPFILE="${USBPATH}"/swapfile + if [ -e "${SWAPFILE}" ] + then + show_message "SWAPFILE FOUND, MOUNTING: ${SWAPFILE}" + mount -o rw,remount ${USBPATH} + mkswap ${SWAPFILE} + swapon ${SWAPFILE} + break + fi + done + exit 0 +fi + +if ["$CMD" = "unmount" ] ; then + USBDRV="resources $(ls /mnt | grep sd)" + for USB in ${USBDRV} + do + USBPATH=/tmp/mnt/${USB} + SWAPFILE="${USBPATH}"/swapfile + if [ -e "${SWAPFILE}" ] + then + show_message "SWAPFILE FOUND, UNMOUNTING: ${SWAPFILE}" + mount -o rw,remount ${USBPATH} + swapoff ${SWAPFILE} + break + fi + done + exit 0 + +fi diff --git a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/templates/AIOTweaks/js/AIOTweaksTmplt.js b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/templates/AIOTweaks/js/AIOTweaksTmplt.js index 414bb12..43bdd6d 100644 --- a/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/templates/AIOTweaks/js/AIOTweaksTmplt.js +++ b/app/files/tweaks/config/aio-app/jci/gui/apps/_aiotweaks/templates/AIOTweaks/js/AIOTweaksTmplt.js @@ -55,7 +55,8 @@ function AIOTweaksTmplt(uiaId, parentDiv, templateID, controlProperties) '
    '+ '
    '+ '
    '+ - '
    '; + '
    '+ + ''; function AIOTabs(tab, tabLink) { $(".tablinks").removeClass("active-tab"); @@ -98,6 +99,7 @@ function AIOTweaksTmplt(uiaId, parentDiv, templateID, controlProperties) $("
    ").appendTo($('#Tweaks')); $("
    ' + +''; +$.getScript('apps/_speedometer/js/speedometerUpdate.js', setTimeout(function() {updateSpeedoApp();}, 700)); +} + +/* + * ========================= + * Standard Template API functions + * ========================= + */ + +/* (internal - called by the framework) + * Handles multicontroller events. + * @param eventID (string) any of the “Internal event name” values in IHU_GUI_MulticontrollerSimulation.docx (e.g. 'cw', + * 'ccw', 'select') + */ + SpeedoMeterTmplt.prototype.handleControllerEvent = function(eventID) + { + log.debug("handleController() called, eventID: " + eventID); + + var retValue = 'giveFocusLeft'; + + switch(eventID) { + case "select": + $('.vehDataMain.pos0').click(); + retValue = "consumed"; + break; + case "down": + $('#SbSpeedo').click(); + retValue = "consumed"; + break; + case "up": + $('.vehDataMain.pos1').click(); + retValue = "consumed"; + break; + case "right": + $('.vehDataMain.pos3').click(); + retValue = "consumed"; + break; + case "left": + $('.vehDataMain.pos4').click(); + retValue = "consumed"; + break; + // case "cw": + // case "ccw": + default: + retValue = "ignored"; + } + + return retValue; + }; +/* + * Called by the app during templateNoLongerDisplayed. Used to perform garbage collection procedures on the template and + * its controls. + */ +SpeedoMeterTmplt.prototype.cleanUp = function() +{ + +}; + +framework.registerTmpltLoaded("SpeedoMeterTmplt"); diff --git a/app/files/tweaks/config/speedometer_bar/speedometer-config.js b/app/files/tweaks/config/speedometer_bar/speedometer-config.js new file mode 100644 index 0000000..d3b7bd9 --- /dev/null +++ b/app/files/tweaks/config/speedometer_bar/speedometer-config.js @@ -0,0 +1,40 @@ +/** speedometer-config.js ************************************************************** *\ +|* ========================= *| +|* Speedometer Configuration - Used to configure position of Speedometer values. *| +|* ========================= *| +|* Main Speedometer Value: [0, 0, 0] - Large, Front, & Center. *| +|* Other Values: [ 0/1:(0 For Main Column OR 1 For Bottom Rows), Row Number, Position ] *| +|* Main Column Positions: 4 Values (1-4 From Top to Bottom) *| +|* Bottom Rows Positions: 5 Values Per Row (1-5 From Left to Right) *| +|* Examples: *| +|* [0, 1, 4] = [Main, Column, 4th position (Bottom of the Column)] *| +|* [1, 3, 1] = [Bottom, 3rd Row, First Position (Left Side)] *| +|* [1, 1, 5] = [Bottom, 1st Row, Last Position (Right Side)] *| +|* To Hide a Value = [1, 1, 0] (Any bottom row position 0 will hide the value) *| +|* Note: Only numbers inside [] brackets determine position, order in this list DOES NOT *| +\* ************************************************************************************* */ +var spdTbl = { + vehSpeed: [0, 0, 0], //Vehicle Speed + topSpeed: [0, 1, 1], //Top Speed + avgSpeed: [0, 1, 2], //Average Speed + gpsSpeed: [0, 1, 3], //GPS Speed + engSpeed: [0, 1, 4], //Engine Speed + trpTime: [1, 1, 1], //Trip Time + trpDist: [1, 1, 2], //Trip Distance + outTemp: [1, 1, 3], //Outside Temperature + inTemp: [1, 1, 4], //Intake Temperature + coolTemp: [1, 1, 5], //Coolant Temperature + gearPos: [1, 2, 1], //Gear Position + fuelLvl: [1, 2, 2], //Fuel Gauge Level + trpFuel: [1, 2, 3], //Trip Fuel Economy + totFuel: [1, 2, 4], //Total Fuel Economy + avgFuel: [1, 2, 5], //Average Fuel Economy + gpsAlt: [1, 3, 2], //Altitude + gpsAltMM: [1, 3, 3], //Altitude Min/Max + gpsHead: [1, 3, 1], //GPS Heading + gpsLat: [1, 3, 4], //GPS Latitude + gpsLon: [1, 3, 5], //GPS Longitude + trpIdle: [1, 1, 0], //Idle Time + trpEngIdle: [1, 1, 0], //Engine Idle Time + engTop: [1, 1, 0], //Engine Top Speed +}; diff --git a/app/files/tweaks/config/speedometer_mod/jci/fonts/CHN/Crysta.ttf b/app/files/tweaks/config/speedometer_mod/jci/fonts/CHN/Crysta.ttf new file mode 100644 index 0000000..b06bf40 Binary files /dev/null and b/app/files/tweaks/config/speedometer_mod/jci/fonts/CHN/Crysta.ttf differ diff --git a/app/files/tweaks/config/speedometer_mod/jci/fonts/Crysta.ttf b/app/files/tweaks/config/speedometer_mod/jci/fonts/Crysta.ttf new file mode 100644 index 0000000..b06bf40 Binary files /dev/null and b/app/files/tweaks/config/speedometer_mod/jci/fonts/Crysta.ttf differ diff --git a/app/files/tweaks/config/speedometer_mod/jci/fonts/JP/Crysta.ttf b/app/files/tweaks/config/speedometer_mod/jci/fonts/JP/Crysta.ttf new file mode 100644 index 0000000..b06bf40 Binary files /dev/null and b/app/files/tweaks/config/speedometer_mod/jci/fonts/JP/Crysta.ttf differ diff --git a/app/files/tweaks/config/speedometer_mod/jci/gui/addon-common/cufon-yui.js b/app/files/tweaks/config/speedometer_mod/jci/gui/addon-common/cufon-yui.js new file mode 100644 index 0000000..996c68f --- /dev/null +++ b/app/files/tweaks/config/speedometer_mod/jci/gui/addon-common/cufon-yui.js @@ -0,0 +1 @@ +var Cufon=(function(){var m=function(){return m.replace.apply(null,arguments)};var x=m.DOM={ready:(function(){var C=false,E={loaded:1,complete:1};var B=[],D=function(){if(C){return}C=true;for(var F;F=B.shift();F()){}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",D,false);window.addEventListener("pageshow",D,false)}if(!window.opera&&document.readyState){(function(){E[document.readyState]?D():setTimeout(arguments.callee,10)})()}if(document.readyState&&document.createStyleSheet){(function(){try{document.body.doScroll("left");D()}catch(F){setTimeout(arguments.callee,1)}})()}q(window,"load",D);return function(F){if(!arguments.length){D()}else{C?F():B.push(F)}}})(),root:function(){return document.documentElement||document.body}};var n=m.CSS={Size:function(C,B){this.value=parseFloat(C);this.unit=String(C).match(/[a-z%]*$/)[0]||"px";this.convert=function(D){return D/B*this.value};this.convertFrom=function(D){return D/this.value*B};this.toString=function(){return this.value+this.unit}},addClass:function(C,B){var D=C.className;C.className=D+(D&&" ")+B;return C},color:j(function(C){var B={};B.color=C.replace(/^rgba\((.*?),\s*([\d.]+)\)/,function(E,D,F){B.opacity=parseFloat(F);return"rgb("+D+")"});return B}),fontStretch:j(function(B){if(typeof B=="number"){return B}if(/%$/.test(B)){return parseFloat(B)/100}return{"ultra-condensed":0.5,"extra-condensed":0.625,condensed:0.75,"semi-condensed":0.875,"semi-expanded":1.125,expanded:1.25,"extra-expanded":1.5,"ultra-expanded":2}[B]||1}),getStyle:function(C){var B=document.defaultView;if(B&&B.getComputedStyle){return new a(B.getComputedStyle(C,null))}if(C.currentStyle){return new a(C.currentStyle)}return new a(C.style)},gradient:j(function(F){var G={id:F,type:F.match(/^-([a-z]+)-gradient\(/)[1],stops:[]},C=F.substr(F.indexOf("(")).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);for(var E=0,B=C.length,D;E0){E=" "+E}}else{if(B400}if(I==500){I=400}for(var J in G){if(!k(G,J)){continue}J=parseInt(J,10);if(!F||JD){D=J}K.push(J)}if(ID){I=D}K.sort(function(M,L){return(E?(M>=I&&L>=I)?ML:(M<=I&&L<=I)?M>L:Mcufoncanvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}cufoncanvas{position:absolute;text-align:left;}cufon{display:inline-block;position:relative;vertical-align:'+(h?"middle":"text-bottom")+";}cufon cufontext{position:absolute;left:-10000in;font-size:1px;}a cufon{cursor:pointer}}@media print{cufon cufoncanvas{display:none;}}").replace(/;/g,"!important;"));function c(i,j){return a(i,/(?:em|ex|%)$|^[a-z-]+$/i.test(j)?"1em":j)}function a(l,m){if(m==="0"){return 0}if(/px$/i.test(m)){return parseFloat(m)}var k=l.style.left,j=l.runtimeStyle.left;l.runtimeStyle.left=l.currentStyle.left;l.style.left=m.replace("%","em");var i=l.style.pixelLeft;l.style.left=k;l.runtimeStyle.left=j;return i}function f(l,k,j,n){var i="computed"+n,m=k[i];if(isNaN(m)){m=k.get(n);k[i]=m=(m=="normal")?0:~~j.convertFrom(a(l,m))}return m}var g={};function d(p){var q=p.id;if(!g[q]){var n=p.stops,o=document.createElement("cvml:fill"),i=[];o.type="gradient";o.angle=180;o.focus="0";o.method="sigma";o.color=n[0][1];for(var m=1,l=n.length-1;mO){O=K}if(I>N){N=I}if(K=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return valuemax?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function($){var hasOwnProperty=Object.prototype.hasOwnProperty;function Canvas(cls,container){var element=container.children("."+cls)[0];if(element==null){element=document.createElement("canvas");element.className=cls;$(element).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(container);if(!element.getContext){if(window.G_vmlCanvasManager){element=window.G_vmlCanvasManager.initElement(element)}else{throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.")}}}this.element=element;var context=this.context=element.getContext("2d");var devicePixelRatio=window.devicePixelRatio||1,backingStoreRatio=context.webkitBackingStorePixelRatio||context.mozBackingStorePixelRatio||context.msBackingStorePixelRatio||context.oBackingStorePixelRatio||context.backingStorePixelRatio||1;this.pixelRatio=devicePixelRatio/backingStoreRatio;this.resize(container.width(),container.height());this.textContainer=null;this.text={};this._textCache={}}Canvas.prototype.resize=function(width,height){if(width<=0||height<=0){throw new Error("Invalid dimensions for plot, width = "+width+", height = "+height)}var element=this.element,context=this.context,pixelRatio=this.pixelRatio;if(this.width!=width){element.width=width*pixelRatio;element.style.width=width+"px";this.width=width}if(this.height!=height){element.height=height*pixelRatio;element.style.height=height+"px";this.height=height}context.restore();context.save();context.scale(pixelRatio,pixelRatio)};Canvas.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)};Canvas.prototype.render=function(){var cache=this._textCache;for(var layerKey in cache){if(hasOwnProperty.call(cache,layerKey)){var layer=this.getTextLayer(layerKey),layerCache=cache[layerKey];layer.hide();for(var styleKey in layerCache){if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache){if(hasOwnProperty.call(styleCache,key)){var positions=styleCache[key].positions;for(var i=0,position;position=positions[i];i++){if(position.active){if(!position.rendered){layer.append(position.element);position.rendered=true}}else{positions.splice(i--,1);if(position.rendered){position.element.detach()}}}if(positions.length==0){delete styleCache[key]}}}}}layer.show()}}};Canvas.prototype.getTextLayer=function(classes){var layer=this.text[classes];if(layer==null){if(this.textContainer==null){this.textContainer=$("
    ").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)}layer=this.text[classes]=$("
    ").addClass(classes).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)}return layer};Canvas.prototype.getTextInfo=function(layer,text,font,angle,width){var textStyle,layerCache,styleCache,info;text=""+text;if(typeof font==="object"){textStyle=font.style+" "+font.variant+" "+font.weight+" "+font.size+"px/"+font.lineHeight+"px "+font.family}else{textStyle=font}layerCache=this._textCache[layer];if(layerCache==null){layerCache=this._textCache[layer]={}}styleCache=layerCache[textStyle];if(styleCache==null){styleCache=layerCache[textStyle]={}}info=styleCache[text];if(info==null){var element=$("
    ").html(text).css({position:"absolute","max-width":width,top:-9999}).appendTo(this.getTextLayer(layer));if(typeof font==="object"){element.css({font:textStyle,color:font.color})}else if(typeof font==="string"){element.addClass(font)}info=styleCache[text]={width:element.outerWidth(true),height:element.outerHeight(true),element:element,positions:[]};element.detach()}return info};Canvas.prototype.addText=function(layer,x,y,text,font,angle,width,halign,valign){var info=this.getTextInfo(layer,text,font,angle,width),positions=info.positions;if(halign=="center"){x-=info.width/2}else if(halign=="right"){x-=info.width}if(valign=="middle"){y-=info.height/2}else if(valign=="bottom"){y-=info.height}for(var i=0,position;position=positions[i];i++){if(position.x==x&&position.y==y){position.active=true;return}}position={active:true,rendered:false,element:positions.length?info.element.clone():info.element,x:x,y:y};positions.push(position);position.element.css({top:Math.round(y),left:Math.round(x),"text-align":halign})};Canvas.prototype.removeText=function(layer,x,y,text,font,angle){if(text==null){var layerCache=this._textCache[layer];if(layerCache!=null){for(var styleKey in layerCache){if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache){if(hasOwnProperty.call(styleCache,key)){var positions=styleCache[key].positions;for(var i=0,position;position=positions[i];i++){position.active=false}}}}}}}else{var positions=this.getTextInfo(layer,text,font,angle).positions;for(var i=0,position;position=positions[i];i++){if(position.x==x&&position.y==y){position.active=false}}}};function Plot(placeholder,data_,options_,plugins){var series=[],options={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false,zero:true},shadowSize:3,highlightColor:null},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},surface=null,overlay=null,eventHolder=null,ctx=null,octx=null,xaxes=[],yaxes=[],plotOffset={left:0,right:0,top:0,bottom:0},plotWidth=0,plotHeight=0,hooks={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},plot=this;plot.setData=setData;plot.setupGrid=setupGrid;plot.draw=draw;plot.getPlaceholder=function(){return placeholder};plot.getCanvas=function(){return surface.element};plot.getPlotOffset=function(){return plotOffset};plot.width=function(){return plotWidth};plot.height=function(){return plotHeight};plot.offset=function(){var o=eventHolder.offset();o.left+=plotOffset.left;o.top+=plotOffset.top;return o};plot.getData=function(){return series};plot.getAxes=function(){var res={},i;$.each(xaxes.concat(yaxes),function(_,axis){if(axis)res[axis.direction+(axis.n!=1?axis.n:"")+"axis"]=axis});return res};plot.getXAxes=function(){return xaxes};plot.getYAxes=function(){return yaxes};plot.c2p=canvasToAxisCoords;plot.p2c=axisToCanvasCoords;plot.getOptions=function(){return options};plot.highlight=highlight;plot.unhighlight=unhighlight;plot.triggerRedrawOverlay=triggerRedrawOverlay;plot.pointOffset=function(point){return{left:parseInt(xaxes[axisNumber(point,"x")-1].p2c(+point.x)+plotOffset.left,10),top:parseInt(yaxes[axisNumber(point,"y")-1].p2c(+point.y)+plotOffset.top,10)}};plot.shutdown=shutdown;plot.destroy=function(){shutdown();placeholder.removeData("plot").empty();series=[];options=null;surface=null;overlay=null;eventHolder=null;ctx=null;octx=null;xaxes=[];yaxes=[];hooks=null;highlights=[];plot=null};plot.resize=function(){var width=placeholder.width(),height=placeholder.height();surface.resize(width,height);overlay.resize(width,height)};plot.hooks=hooks;initPlugins(plot);parseOptions(options_);setupCanvases();setData(data_);setupGrid();draw();bindEvents();function executeHooks(hook,args){args=[plot].concat(args);for(var i=0;imaxIndex){maxIndex=sc}}}if(neededColors<=maxIndex){neededColors=maxIndex+1}var c,colors=[],colorPool=options.colors,colorPoolSize=colorPool.length,variation=0;for(i=0;i=0){if(variation<.5){variation=-variation-.2}else variation=0}else variation=-variation}colors[i]=c.scale("rgb",1+variation)}var colori=0,s;for(i=0;iaxis.datamax&&max!=fakeInfinity)axis.datamax=max}$.each(allAxes(),function(_,axis){axis.datamin=topSentry;axis.datamax=bottomSentry;axis.used=false});for(i=0;i0&&points[k-ps]!=null&&points[k-ps]!=points[k]&&points[k-ps+1]!=points[k+1]){for(m=0;mxmax)xmax=val}if(f.y){if(valymax)ymax=val}}}if(s.bars.show){var delta;switch(s.bars.align){case"left":delta=0;break;case"right":delta=-s.bars.barWidth;break;default:delta=-s.bars.barWidth/2}if(s.bars.horizontal){ymin+=delta;ymax+=delta+s.bars.barWidth}else{xmin+=delta;xmax+=delta+s.bars.barWidth}}updateAxis(s.xaxis,xmin,xmax);updateAxis(s.yaxis,ymin,ymax)}$.each(allAxes(),function(_,axis){if(axis.datamin==topSentry)axis.datamin=null;if(axis.datamax==bottomSentry)axis.datamax=null})}function setupCanvases(){placeholder.css("padding",0).children().filter(function(){return!$(this).hasClass("flot-overlay")&&!$(this).hasClass("flot-base")}).remove();if(placeholder.css("position")=="static")placeholder.css("position","relative");surface=new Canvas("flot-base",placeholder);overlay=new Canvas("flot-overlay",placeholder);ctx=surface.context;octx=overlay.context;eventHolder=$(overlay.element).unbind();var existing=placeholder.data("plot");if(existing){existing.shutdown();overlay.clear()}placeholder.data("plot",plot)}function bindEvents(){if(options.grid.hoverable){eventHolder.mousemove(onMouseMove);eventHolder.bind("mouseleave",onMouseLeave)}if(options.grid.clickable)eventHolder.click(onClick);executeHooks(hooks.bindEvents,[eventHolder])}function shutdown(){if(redrawTimeout)clearTimeout(redrawTimeout);eventHolder.unbind("mousemove",onMouseMove);eventHolder.unbind("mouseleave",onMouseLeave);eventHolder.unbind("click",onClick);executeHooks(hooks.shutdown,[eventHolder])}function setTransformationHelpers(axis){function identity(x){return x}var s,m,t=axis.options.transform||identity,it=axis.options.inverseTransform;if(axis.direction=="x"){s=axis.scale=plotWidth/Math.abs(t(axis.max)-t(axis.min));m=Math.min(t(axis.max),t(axis.min))}else{s=axis.scale=plotHeight/Math.abs(t(axis.max)-t(axis.min));s=-s;m=Math.max(t(axis.max),t(axis.min))}if(t==identity)axis.p2c=function(p){return(p-m)*s};else axis.p2c=function(p){return(t(p)-m)*s};if(!it)axis.c2p=function(c){return m+c/s};else axis.c2p=function(c){return it(m+c/s)}}function measureTickLabels(axis){var opts=axis.options,ticks=axis.ticks||[],labelWidth=opts.labelWidth||0,labelHeight=opts.labelHeight||0,maxWidth=labelWidth||(axis.direction=="x"?Math.floor(surface.width/(ticks.length||1)):null),legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=opts.font||"flot-tick-label tickLabel";for(var i=0;i=0;--i)allocateAxisBoxFirstPhase(allocatedAxes[i]);adjustLayoutForThingsStickingOut();$.each(allocatedAxes,function(_,axis){allocateAxisBoxSecondPhase(axis)})}plotWidth=surface.width-plotOffset.left-plotOffset.right;plotHeight=surface.height-plotOffset.bottom-plotOffset.top;$.each(axes,function(_,axis){setTransformationHelpers(axis)});if(showGrid){drawAxisLabels()}insertLegend()}function setRange(axis){var opts=axis.options,min=+(opts.min!=null?opts.min:axis.datamin),max=+(opts.max!=null?opts.max:axis.datamax),delta=max-min;if(delta==0){var widen=max==0?1:.01;if(opts.min==null)min-=widen;if(opts.max==null||opts.min!=null)max+=widen}else{var margin=opts.autoscaleMargin;if(margin!=null){if(opts.min==null){min-=delta*margin;if(min<0&&axis.datamin!=null&&axis.datamin>=0)min=0}if(opts.max==null){max+=delta*margin;if(max>0&&axis.datamax!=null&&axis.datamax<=0)max=0}}}axis.min=min;axis.max=max}function setupTickGeneration(axis){var opts=axis.options;var noTicks;if(typeof opts.ticks=="number"&&opts.ticks>0)noTicks=opts.ticks;else noTicks=.3*Math.sqrt(axis.direction=="x"?surface.width:surface.height);var delta=(axis.max-axis.min)/noTicks,dec=-Math.floor(Math.log(delta)/Math.LN10),maxDec=opts.tickDecimals;if(maxDec!=null&&dec>maxDec){dec=maxDec}var magn=Math.pow(10,-dec),norm=delta/magn,size;if(norm<1.5){size=1}else if(norm<3){size=2;if(norm>2.25&&(maxDec==null||dec+1<=maxDec)){size=2.5;++dec}}else if(norm<7.5){size=5}else{size=10}size*=magn;if(opts.minTickSize!=null&&size0){if(opts.min==null)axis.min=Math.min(axis.min,niceTicks[0]);if(opts.max==null&&niceTicks.length>1)axis.max=Math.max(axis.max,niceTicks[niceTicks.length-1])}axis.tickGenerator=function(axis){var ticks=[],v,i;for(i=0;i1&&/\..*0$/.test((ts[1]-ts[0]).toFixed(extraDec))))axis.tickDecimals=extraDec}}}}function setTicks(axis){var oticks=axis.options.ticks,ticks=[];if(oticks==null||typeof oticks=="number"&&oticks>0)ticks=axis.tickGenerator(axis);else if(oticks){if($.isFunction(oticks))ticks=oticks(axis);else ticks=oticks}var i,v;axis.ticks=[];for(i=0;i1)label=t[1]}else v=+t;if(label==null)label=axis.tickFormatter(v,axis);if(!isNaN(v))axis.ticks.push({v:v,label:label})}}function snapRangeToTicks(axis,ticks){if(axis.options.autoscaleMargin&&ticks.length>0){if(axis.options.min==null)axis.min=Math.min(axis.min,ticks[0].v);if(axis.options.max==null&&ticks.length>1)axis.max=Math.max(axis.max,ticks[ticks.length-1].v)}}function draw(){surface.clear();executeHooks(hooks.drawBackground,[ctx]);var grid=options.grid;if(grid.show&&grid.backgroundColor)drawBackground();if(grid.show&&!grid.aboveData){drawGrid()}for(var i=0;ito){var tmp=from;from=to;to=tmp}return{from:from,to:to,axis:axis}}function drawBackground(){ctx.save();ctx.translate(plotOffset.left,plotOffset.top);ctx.fillStyle=getColorOrGradient(options.grid.backgroundColor,plotHeight,0,"rgba(255, 255, 255, 0)");ctx.fillRect(0,0,plotWidth,plotHeight);ctx.restore()}function drawGrid(){var i,axes,bw,bc;ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var markings=options.grid.markings;if(markings){if($.isFunction(markings)){axes=plot.getAxes();axes.xmin=axes.xaxis.min;axes.xmax=axes.xaxis.max;axes.ymin=axes.yaxis.min;axes.ymax=axes.yaxis.max;markings=markings(axes)}for(i=0;ixrange.axis.max||yrange.toyrange.axis.max)continue;xrange.from=Math.max(xrange.from,xrange.axis.min);xrange.to=Math.min(xrange.to,xrange.axis.max); +yrange.from=Math.max(yrange.from,yrange.axis.min);yrange.to=Math.min(yrange.to,yrange.axis.max);if(xrange.from==xrange.to&&yrange.from==yrange.to)continue;xrange.from=xrange.axis.p2c(xrange.from);xrange.to=xrange.axis.p2c(xrange.to);yrange.from=yrange.axis.p2c(yrange.from);yrange.to=yrange.axis.p2c(yrange.to);if(xrange.from==xrange.to||yrange.from==yrange.to){ctx.beginPath();ctx.strokeStyle=m.color||options.grid.markingsColor;ctx.lineWidth=m.lineWidth||options.grid.markingsLineWidth;ctx.moveTo(xrange.from,yrange.from);ctx.lineTo(xrange.to,yrange.to);ctx.stroke()}else{ctx.fillStyle=m.color||options.grid.markingsColor;ctx.fillRect(xrange.from,yrange.to,xrange.to-xrange.from,yrange.from-yrange.to)}}}axes=allAxes();bw=options.grid.borderWidth;for(var j=0;jaxis.max||t=="full"&&(typeof bw=="object"&&bw[axis.position]>0||bw>0)&&(v==axis.min||v==axis.max))continue;if(axis.direction=="x"){x=axis.p2c(v);yoff=t=="full"?-plotHeight:t;if(axis.position=="top")yoff=-yoff}else{y=axis.p2c(v);xoff=t=="full"?-plotWidth:t;if(axis.position=="left")xoff=-xoff}if(ctx.lineWidth==1){if(axis.direction=="x")x=Math.floor(x)+.5;else y=Math.floor(y)+.5}ctx.moveTo(x,y);ctx.lineTo(x+xoff,y+yoff)}ctx.stroke()}if(bw){bc=options.grid.borderColor;if(typeof bw=="object"||typeof bc=="object"){if(typeof bw!=="object"){bw={top:bw,right:bw,bottom:bw,left:bw}}if(typeof bc!=="object"){bc={top:bc,right:bc,bottom:bc,left:bc}}if(bw.top>0){ctx.strokeStyle=bc.top;ctx.lineWidth=bw.top;ctx.beginPath();ctx.moveTo(0-bw.left,0-bw.top/2);ctx.lineTo(plotWidth,0-bw.top/2);ctx.stroke()}if(bw.right>0){ctx.strokeStyle=bc.right;ctx.lineWidth=bw.right;ctx.beginPath();ctx.moveTo(plotWidth+bw.right/2,0-bw.top);ctx.lineTo(plotWidth+bw.right/2,plotHeight);ctx.stroke()}if(bw.bottom>0){ctx.strokeStyle=bc.bottom;ctx.lineWidth=bw.bottom;ctx.beginPath();ctx.moveTo(plotWidth+bw.right,plotHeight+bw.bottom/2);ctx.lineTo(0,plotHeight+bw.bottom/2);ctx.stroke()}if(bw.left>0){ctx.strokeStyle=bc.left;ctx.lineWidth=bw.left;ctx.beginPath();ctx.moveTo(0-bw.left/2,plotHeight+bw.bottom);ctx.lineTo(0-bw.left/2,0);ctx.stroke()}}else{ctx.lineWidth=bw;ctx.strokeStyle=options.grid.borderColor;ctx.strokeRect(-bw/2,-bw/2,plotWidth+bw,plotHeight+bw)}}ctx.restore()}function drawAxisLabels(){$.each(allAxes(),function(_,axis){var box=axis.box,legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=axis.options.font||"flot-tick-label tickLabel",tick,x,y,halign,valign;surface.removeText(layer);if(!axis.show||axis.ticks.length==0)return;for(var i=0;iaxis.max)continue;if(axis.direction=="x"){halign="center";x=plotOffset.left+axis.p2c(tick.v);if(axis.position=="bottom"){y=box.top+box.padding}else{y=box.top+box.height-box.padding;valign="bottom"}}else{valign="middle";y=plotOffset.top+axis.p2c(tick.v);if(axis.position=="left"){x=box.left+box.width-box.padding;halign="right"}else{x=box.left+box.padding}}surface.addText(layer,x,y,tick.label,font,null,null,halign,valign)}})}function drawSeries(series){if(series.lines.show)drawSeriesLines(series);if(series.bars.show)drawSeriesBars(series);if(series.points.show)drawSeriesPoints(series)}function drawSeriesLines(series){function plotLine(datapoints,xoffset,yoffset,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize,prevx=null,prevy=null;ctx.beginPath();for(var i=ps;i=y2&&y1>axisy.max){if(y2>axisy.max)continue;x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.max}else if(y2>=y1&&y2>axisy.max){if(y1>axisy.max)continue;x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.max}if(x1<=x2&&x1=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.max}if(x1!=prevx||y1!=prevy)ctx.moveTo(axisx.p2c(x1)+xoffset,axisy.p2c(y1)+yoffset);prevx=x2;prevy=y2;ctx.lineTo(axisx.p2c(x2)+xoffset,axisy.p2c(y2)+yoffset)}ctx.stroke()}function plotLineArea(datapoints,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize,bottom=Math.min(Math.max(0,axisy.min),axisy.max),i=0,top,areaOpen=false,ypos=1,segmentStart=0,segmentEnd=0;while(true){if(ps>0&&i>points.length+ps)break;i+=ps;var x1=points[i-ps],y1=points[i-ps+ypos],x2=points[i],y2=points[i+ypos];if(areaOpen){if(ps>0&&x1!=null&&x2==null){segmentEnd=i;ps=-ps;ypos=2;continue}if(ps<0&&i==segmentStart+ps){ctx.fill();areaOpen=false;ps=-ps;ypos=1;i=segmentStart=segmentEnd+ps;continue}}if(x1==null||x2==null)continue;if(x1<=x2&&x1=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.max}if(!areaOpen){ctx.beginPath();ctx.moveTo(axisx.p2c(x1),axisy.p2c(bottom));areaOpen=true}if(y1>=axisy.max&&y2>=axisy.max){ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.max));ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.max));continue}else if(y1<=axisy.min&&y2<=axisy.min){ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.min));ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.min));continue}var x1old=x1,x2old=x2;if(y1<=y2&&y1=axisy.min){x1=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.min}else if(y2<=y1&&y2=axisy.min){x2=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.min}if(y1>=y2&&y1>axisy.max&&y2<=axisy.max){x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.max}else if(y2>=y1&&y2>axisy.max&&y1<=axisy.max){x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.max}if(x1!=x1old){ctx.lineTo(axisx.p2c(x1old),axisy.p2c(y1))}ctx.lineTo(axisx.p2c(x1),axisy.p2c(y1));ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2));if(x2!=x2old){ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2));ctx.lineTo(axisx.p2c(x2old),axisy.p2c(y2))}}}ctx.save();ctx.translate(plotOffset.left,plotOffset.top);ctx.lineJoin="round";var lw=series.lines.lineWidth,sw=series.shadowSize;if(lw>0&&sw>0){ctx.lineWidth=sw;ctx.strokeStyle="rgba(0,0,0,0.1)";var angle=Math.PI/18;plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/2),Math.cos(angle)*(lw/2+sw/2),series.xaxis,series.yaxis);ctx.lineWidth=sw/2;plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/4),Math.cos(angle)*(lw/2+sw/4),series.xaxis,series.yaxis)}ctx.lineWidth=lw;ctx.strokeStyle=series.color;var fillStyle=getFillStyle(series.lines,series.color,0,plotHeight);if(fillStyle){ctx.fillStyle=fillStyle;plotLineArea(series.datapoints,series.xaxis,series.yaxis)}if(lw>0)plotLine(series.datapoints,0,0,series.xaxis,series.yaxis);ctx.restore()}function drawSeriesPoints(series){function plotPoints(datapoints,radius,fillStyle,offset,shadow,axisx,axisy,symbol){var points=datapoints.points,ps=datapoints.pointsize;for(var i=0;iaxisx.max||yaxisy.max)continue;ctx.beginPath();x=axisx.p2c(x);y=axisy.p2c(y)+offset;if(symbol=="circle")ctx.arc(x,y,radius,0,shadow?Math.PI:Math.PI*2,false);else symbol(ctx,x,y,radius,shadow);ctx.closePath();if(fillStyle){ctx.fillStyle=fillStyle;ctx.fill()}ctx.stroke()}}ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var lw=series.points.lineWidth,sw=series.shadowSize,radius=series.points.radius,symbol=series.points.symbol;if(lw==0)lw=1e-4;if(lw>0&&sw>0){var w=sw/2;ctx.lineWidth=w;ctx.strokeStyle="rgba(0,0,0,0.1)";plotPoints(series.datapoints,radius,null,w+w/2,true,series.xaxis,series.yaxis,symbol);ctx.strokeStyle="rgba(0,0,0,0.2)";plotPoints(series.datapoints,radius,null,w/2,true,series.xaxis,series.yaxis,symbol)}ctx.lineWidth=lw;ctx.strokeStyle=series.color;plotPoints(series.datapoints,radius,getFillStyle(series.points,series.color),0,false,series.xaxis,series.yaxis,symbol);ctx.restore()}function drawBar(x,y,b,barLeft,barRight,fillStyleCallback,axisx,axisy,c,horizontal,lineWidth){var left,right,bottom,top,drawLeft,drawRight,drawTop,drawBottom,tmp;if(horizontal){drawBottom=drawRight=drawTop=true;drawLeft=false;left=b;right=x;top=y+barLeft;bottom=y+barRight;if(rightaxisx.max||topaxisy.max)return;if(leftaxisx.max){right=axisx.max;drawRight=false}if(bottomaxisy.max){top=axisy.max;drawTop=false}left=axisx.p2c(left);bottom=axisy.p2c(bottom);right=axisx.p2c(right);top=axisy.p2c(top);if(fillStyleCallback){c.fillStyle=fillStyleCallback(bottom,top);c.fillRect(left,top,right-left,bottom-top)}if(lineWidth>0&&(drawLeft||drawRight||drawTop||drawBottom)){c.beginPath();c.moveTo(left,bottom);if(drawLeft)c.lineTo(left,top);else c.moveTo(left,top);if(drawTop)c.lineTo(right,top);else c.moveTo(right,top);if(drawRight)c.lineTo(right,bottom);else c.moveTo(right,bottom);if(drawBottom)c.lineTo(left,bottom);else c.moveTo(left,bottom);c.stroke()}}function drawSeriesBars(series){function plotBars(datapoints,barLeft,barRight,fillStyleCallback,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize;for(var i=0;i");fragments.push("");rowStarted=true}fragments.push('
    '+''+entry.label+"")}if(rowStarted)fragments.push("");if(fragments.length==0)return;var table=''+fragments.join("")+"
    ";if(options.legend.container!=null)$(options.legend.container).html(table);else{var pos="",p=options.legend.position,m=options.legend.margin;if(m[0]==null)m=[m,m];if(p.charAt(0)=="n")pos+="top:"+(m[1]+plotOffset.top)+"px;";else if(p.charAt(0)=="s")pos+="bottom:"+(m[1]+plotOffset.bottom)+"px;";if(p.charAt(1)=="e")pos+="right:"+(m[0]+plotOffset.right)+"px;";else if(p.charAt(1)=="w")pos+="left:"+(m[0]+plotOffset.left)+"px;";var legend=$('
    '+table.replace('style="','style="position:absolute;'+pos+";")+"
    ").appendTo(placeholder);if(options.legend.backgroundOpacity!=0){var c=options.legend.backgroundColor;if(c==null){c=options.grid.backgroundColor;if(c&&typeof c=="string")c=$.color.parse(c);else c=$.color.extract(legend,"background-color");c.a=1;c=c.toString()}var div=legend.children();$('
    ').prependTo(legend).css("opacity",options.legend.backgroundOpacity)}}}var highlights=[],redrawTimeout=null;function findNearbyItem(mouseX,mouseY,seriesFilter){var maxDistance=options.grid.mouseActiveRadius,smallestDistance=maxDistance*maxDistance+1,item=null,foundPoint=false,i,j,ps;for(i=series.length-1;i>=0;--i){if(!seriesFilter(series[i]))continue;var s=series[i],axisx=s.xaxis,axisy=s.yaxis,points=s.datapoints.points,mx=axisx.c2p(mouseX),my=axisy.c2p(mouseY),maxx=maxDistance/axisx.scale,maxy=maxDistance/axisy.scale;ps=s.datapoints.pointsize;if(axisx.options.inverseTransform)maxx=Number.MAX_VALUE;if(axisy.options.inverseTransform)maxy=Number.MAX_VALUE;if(s.lines.show||s.points.show){for(j=0;jmaxx||x-mx<-maxx||y-my>maxy||y-my<-maxy)continue;var dx=Math.abs(axisx.p2c(x)-mouseX),dy=Math.abs(axisy.p2c(y)-mouseY),dist=dx*dx+dy*dy;if(dist=Math.min(b,x)&&my>=y+barLeft&&my<=y+barRight:mx>=x+barLeft&&mx<=x+barRight&&my>=Math.min(b,y)&&my<=Math.max(b,y))item=[i,j/ps]}}}if(item){i=item[0];j=item[1];ps=series[i].datapoints.pointsize;return{datapoint:series[i].datapoints.points.slice(j*ps,(j+1)*ps),dataIndex:j,series:series[i],seriesIndex:i}}return null}function onMouseMove(e){if(options.grid.hoverable)triggerClickHoverEvent("plothover",e,function(s){return s["hoverable"]!=false})}function onMouseLeave(e){if(options.grid.hoverable)triggerClickHoverEvent("plothover",e,function(s){return false})}function onClick(e){triggerClickHoverEvent("plotclick",e,function(s){return s["clickable"]!=false})}function triggerClickHoverEvent(eventname,event,seriesFilter){var offset=eventHolder.offset(),canvasX=event.pageX-offset.left-plotOffset.left,canvasY=event.pageY-offset.top-plotOffset.top,pos=canvasToAxisCoords({left:canvasX,top:canvasY});pos.pageX=event.pageX;pos.pageY=event.pageY;var item=findNearbyItem(canvasX,canvasY,seriesFilter);if(item){item.pageX=parseInt(item.series.xaxis.p2c(item.datapoint[0])+offset.left+plotOffset.left,10);item.pageY=parseInt(item.series.yaxis.p2c(item.datapoint[1])+offset.top+plotOffset.top,10)}if(options.grid.autoHighlight){for(var i=0;iaxisx.max||yaxisy.max)return;var pointRadius=series.points.radius+series.points.lineWidth/2;octx.lineWidth=pointRadius;octx.strokeStyle=highlightColor;var radius=1.5*pointRadius;x=axisx.p2c(x);y=axisy.p2c(y);octx.beginPath();if(series.points.symbol=="circle")octx.arc(x,y,radius,0,2*Math.PI,false);else series.points.symbol(octx,x,y,radius,false);octx.closePath();octx.stroke()}function drawBarHighlight(series,point){var highlightColor=typeof series.highlightColor==="string"?series.highlightColor:$.color.parse(series.color).scale("a",.5).toString(),fillStyle=highlightColor,barLeft;switch(series.bars.align){case"left":barLeft=0;break;case"right":barLeft=-series.bars.barWidth;break;default:barLeft=-series.bars.barWidth/2}octx.lineWidth=series.bars.lineWidth;octx.strokeStyle=highlightColor;drawBar(point[0],point[1],point[2]||0,barLeft,barLeft+series.bars.barWidth,function(){return fillStyle},series.xaxis,series.yaxis,octx,series.bars.horizontal,series.bars.lineWidth)}function getColorOrGradient(spec,bottom,top,defaultColor){if(typeof spec=="string")return spec;else{var gradient=ctx.createLinearGradient(0,top,0,bottom);for(var i=0,l=spec.colors.length;i)[^>]*$|#([\w\-]*)$)/,rsingleTag=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,rvalidchars=/^[\],:{}\s]*$/,rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,rvalidescape=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,rvalidtokens=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([\da-z])/gi,fcamelCase=function(all,letter){return(letter+"").toUpperCase()},DOMContentLoaded=function(){if(document.addEventListener){document.removeEventListener("DOMContentLoaded",DOMContentLoaded,false);jQuery.ready()}else if(document.readyState==="complete"){document.detachEvent("onreadystatechange",DOMContentLoaded);jQuery.ready()}},class2type={};jQuery.fn=jQuery.prototype={constructor:jQuery,init:function(selector,context,rootjQuery){var match,elem,ret,doc;if(!selector){return this}if(selector.nodeType){this.context=this[0]=selector;this.length=1;return this}if(typeof selector==="string"){if(selector.charAt(0)==="<"&&selector.charAt(selector.length-1)===">"&&selector.length>=3){match=[null,selector,null]}else{match=rquickExpr.exec(selector)}if(match&&(match[1]||!context)){if(match[1]){context=context instanceof jQuery?context[0]:context;doc=context&&context.nodeType?context.ownerDocument||context:document;selector=jQuery.parseHTML(match[1],doc,true);if(rsingleTag.test(match[1])&&jQuery.isPlainObject(context)){this.attr.call(selector,context,true)}return jQuery.merge(this,selector)}else{elem=document.getElementById(match[2]);if(elem&&elem.parentNode){if(elem.id!==match[2]){return rootjQuery.find(selector)}this.length=1;this[0]=elem}this.context=document;this.selector=selector;return this}}else if(!context||context.jquery){return(context||rootjQuery).find(selector)}else{return this.constructor(context).find(selector)}}else if(jQuery.isFunction(selector)){return rootjQuery.ready(selector)}if(selector.selector!==undefined){this.selector=selector.selector;this.context=selector.context}return jQuery.makeArray(selector,this)},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return core_slice.call(this)},get:function(num){return num==null?this.toArray():num<0?this[this.length+num]:this[num]},pushStack:function(elems,name,selector){var ret=jQuery.merge(this.constructor(),elems);ret.prevObject=this;ret.context=this.context;if(name==="find"){ret.selector=this.selector+(this.selector?" ":"")+selector}else if(name){ret.selector=this.selector+"."+name+"("+selector+")"}return ret},each:function(callback,args){return jQuery.each(this,callback,args)},ready:function(fn){jQuery.ready.promise().done(fn);return this},eq:function(i){i=+i;return i===-1?this.slice(i):this.slice(i,i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(core_slice.apply(this,arguments),"slice",core_slice.call(arguments).join(","))},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem)}))},end:function(){return this.prevObject||this.constructor(null)},push:core_push,sort:[].sort,splice:[].splice};jQuery.fn.init.prototype=jQuery.fn;jQuery.extend=jQuery.fn.extend=function(){var options,name,src,copy,copyIsArray,clone,target=arguments[0]||{},i=1,length=arguments.length,deep=false;if(typeof target==="boolean"){deep=target;target=arguments[1]||{};i=2}if(typeof target!=="object"&&!jQuery.isFunction(target)){target={}}if(length===i){target=this;--i}for(;i0){return}readyList.resolveWith(document,[jQuery]);if(jQuery.fn.trigger){jQuery(document).trigger("ready").off("ready")}},isFunction:function(obj){return jQuery.type(obj)==="function"},isArray:Array.isArray||function(obj){return jQuery.type(obj)==="array"},isWindow:function(obj){return obj!=null&&obj==obj.window},isNumeric:function(obj){return!isNaN(parseFloat(obj))&&isFinite(obj)},type:function(obj){return obj==null?String(obj):class2type[core_toString.call(obj)]||"object"},isPlainObject:function(obj){if(!obj||jQuery.type(obj)!=="object"||obj.nodeType||jQuery.isWindow(obj)){return false}try{if(obj.constructor&&!core_hasOwn.call(obj,"constructor")&&!core_hasOwn.call(obj.constructor.prototype,"isPrototypeOf")){return false}}catch(e){return false}var key;for(key in obj){}return key===undefined||core_hasOwn.call(obj,key)},isEmptyObject:function(obj){var name;for(name in obj){return false}return true},error:function(msg){throw new Error(msg)},parseHTML:function(data,context,scripts){var parsed;if(!data||typeof data!=="string"){return null}if(typeof context==="boolean"){scripts=context;context=0}context=context||document;if(parsed=rsingleTag.exec(data)){return[context.createElement(parsed[1])]}parsed=jQuery.buildFragment([data],context,scripts?null:[]);return jQuery.merge([],(parsed.cacheable?jQuery.clone(parsed.fragment):parsed.fragment).childNodes)},parseJSON:function(data){if(!data||typeof data!=="string"){return null}data=jQuery.trim(data);if(window.JSON&&window.JSON.parse){return window.JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))){return new Function("return "+data)()}jQuery.error("Invalid JSON: "+data)},parseXML:function(data){var xml,tmp;if(!data||typeof data!=="string"){return null}try{if(window.DOMParser){tmp=new DOMParser;xml=tmp.parseFromString(data,"text/xml")}else{xml=new ActiveXObject("Microsoft.XMLDOM");xml.async="false";xml.loadXML(data)}}catch(e){xml=undefined}if(!xml||!xml.documentElement||xml.getElementsByTagName("parsererror").length){jQuery.error("Invalid XML: "+data)}return xml},noop:function(){},globalEval:function(data){if(data&&core_rnotwhite.test(data)){(window.execScript||function(data){window["eval"].call(window,data)})(data)}},camelCase:function(string){return string.replace(rmsPrefix,"ms-").replace(rdashAlpha,fcamelCase)},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase()},each:function(obj,callback,args){var name,i=0,length=obj.length,isObj=length===undefined||jQuery.isFunction(obj);if(args){if(isObj){for(name in obj){if(callback.apply(obj[name],args)===false){break}}}else{for(;i0&&elems[0]&&elems[length-1]||length===0||jQuery.isArray(elems));if(isArray){for(;i-1){list.splice(index,1);if(firing){if(index<=firingLength){firingLength--}if(index<=firingIndex){firingIndex--}}}})}return this},has:function(fn){return jQuery.inArray(fn,list)>-1},empty:function(){list=[];return this},disable:function(){list=stack=memory=undefined;return this},disabled:function(){return!list},lock:function(){stack=undefined;if(!memory){self.disable()}return this},locked:function(){return!stack},fireWith:function(context,args){args=args||[];args=[context,args.slice?args.slice():args];if(list&&(!fired||stack)){if(firing){stack.push(args)}else{fire(args)}}return this},fire:function(){self.fireWith(this,arguments);return this},fired:function(){return!!fired}};return self};jQuery.extend({Deferred:function(func){var tuples=[["resolve","done",jQuery.Callbacks("once memory"),"resolved"],["reject","fail",jQuery.Callbacks("once memory"),"rejected"],["notify","progress",jQuery.Callbacks("memory")]],state="pending",promise={state:function(){return state},always:function(){deferred.done(arguments).fail(arguments);return this},then:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var action=tuple[0],fn=fns[i];deferred[tuple[1]](jQuery.isFunction(fn)?function(){var returned=fn.apply(this,arguments);if(returned&&jQuery.isFunction(returned.promise)){returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify)}else{newDefer[action+"With"](this===deferred?newDefer:this,[returned])}}:newDefer[action])});fns=null}).promise()},promise:function(obj){return obj!=null?jQuery.extend(obj,promise):promise}},deferred={};promise.pipe=promise.then;jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[3];promise[tuple[1]]=list.add;if(stateString){list.add(function(){state=stateString},tuples[i^1][2].disable,tuples[2][2].lock)}deferred[tuple[0]]=list.fire;deferred[tuple[0]+"With"]=list.fireWith});promise.promise(deferred);if(func){func.call(deferred,deferred)}return deferred},when:function(subordinate){var i=0,resolveValues=core_slice.call(arguments),length=resolveValues.length,remaining=length!==1||subordinate&&jQuery.isFunction(subordinate.promise)?length:0,deferred=remaining===1?subordinate:jQuery.Deferred(),updateFunc=function(i,contexts,values){return function(value){contexts[i]=this;values[i]=arguments.length>1?core_slice.call(arguments):value;if(values===progressValues){deferred.notifyWith(contexts,values)}else if(!--remaining){deferred.resolveWith(contexts,values)}}},progressValues,progressContexts,resolveContexts;if(length>1){progressValues=new Array(length);progressContexts=new Array(length);resolveContexts=new Array(length);for(;i
    a";all=div.getElementsByTagName("*");a=div.getElementsByTagName("a")[0];if(!all||!a||!all.length){return{}}select=document.createElement("select");opt=select.appendChild(document.createElement("option"));input=div.getElementsByTagName("input")[0];a.style.cssText="top:1px;float:left;opacity:.5";support={leadingWhitespace:div.firstChild.nodeType===3,tbody:!div.getElementsByTagName("tbody").length,htmlSerialize:!!div.getElementsByTagName("link").length,style:/top/.test(a.getAttribute("style")),hrefNormalized:a.getAttribute("href")==="/a",opacity:/^0.5/.test(a.style.opacity),cssFloat:!!a.style.cssFloat,checkOn:input.value==="on",optSelected:opt.selected,getSetAttribute:div.className!=="t",enctype:!!document.createElement("form").enctype,html5Clone:document.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",boxModel:document.compatMode==="CSS1Compat",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,boxSizingReliable:true,pixelPosition:false};input.checked=true;support.noCloneChecked=input.cloneNode(true).checked;select.disabled=true;support.optDisabled=!opt.disabled;try{delete div.test}catch(e){support.deleteExpando=false}if(!div.addEventListener&&div.attachEvent&&div.fireEvent){div.attachEvent("onclick",clickFn=function(){support.noCloneEvent=false});div.cloneNode(true).fireEvent("onclick");div.detachEvent("onclick",clickFn)}input=document.createElement("input");input.value="t";input.setAttribute("type","radio");support.radioValue=input.value==="t";input.setAttribute("checked","checked");input.setAttribute("name","t");div.appendChild(input);fragment=document.createDocumentFragment();fragment.appendChild(div.lastChild);support.checkClone=fragment.cloneNode(true).cloneNode(true).lastChild.checked;support.appendChecked=input.checked;fragment.removeChild(input);fragment.appendChild(div);if(div.attachEvent){for(i in{submit:true,change:true,focusin:true}){eventName="on"+i;isSupported=eventName in div;if(!isSupported){div.setAttribute(eventName,"return;");isSupported=typeof div[eventName]==="function"}support[i+"Bubbles"]=isSupported}}jQuery(function(){var container,div,tds,marginDiv,divReset="padding:0;margin:0;border:0;display:block;overflow:hidden;",body=document.getElementsByTagName("body")[0];if(!body){return}container=document.createElement("div");container.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";body.insertBefore(container,body.firstChild);div=document.createElement("div");container.appendChild(div);div.innerHTML="
    t
    ";tds=div.getElementsByTagName("td");tds[0].style.cssText="padding:0;margin:0;border:0;display:none";isSupported=tds[0].offsetHeight===0;tds[0].style.display="";tds[1].style.display="none";support.reliableHiddenOffsets=isSupported&&tds[0].offsetHeight===0;div.innerHTML="";div.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";support.boxSizing=div.offsetWidth===4;support.doesNotIncludeMarginInBodyOffset=body.offsetTop!==1;if(window.getComputedStyle){support.pixelPosition=(window.getComputedStyle(div,null)||{}).top!=="1%";support.boxSizingReliable=(window.getComputedStyle(div,null)||{width:"4px"}).width==="4px";marginDiv=document.createElement("div");marginDiv.style.cssText=div.style.cssText=divReset;marginDiv.style.marginRight=marginDiv.style.width="0";div.style.width="1px";div.appendChild(marginDiv);support.reliableMarginRight=!parseFloat((window.getComputedStyle(marginDiv,null)||{}).marginRight)}if(typeof div.style.zoom!=="undefined"){div.innerHTML="";div.style.cssText=divReset+"width:1px;padding:1px;display:inline;zoom:1";support.inlineBlockNeedsLayout=div.offsetWidth===3;div.style.display="block";div.style.overflow="visible";div.innerHTML="
    ";div.firstChild.style.width="5px";support.shrinkWrapBlocks=div.offsetWidth!==3;container.style.zoom=1}body.removeChild(container);container=div=tds=marginDiv=null});fragment.removeChild(div);all=a=select=opt=input=fragment=div=null;return support}();var rbrace=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,rmultiDash=/([A-Z])/g;jQuery.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(jQuery.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(elem){elem=elem.nodeType?jQuery.cache[elem[jQuery.expando]]:elem[jQuery.expando];return!!elem&&!isEmptyDataObject(elem)},data:function(elem,name,data,pvt){if(!jQuery.acceptData(elem)){return}var thisCache,ret,internalKey=jQuery.expando,getByName=typeof name==="string",isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[internalKey]:elem[internalKey]&&internalKey;if((!id||!cache[id]||!pvt&&!cache[id].data)&&getByName&&data===undefined){return}if(!id){if(isNode){elem[internalKey]=id=jQuery.deletedIds.pop()||jQuery.guid++}else{id=internalKey}}if(!cache[id]){cache[id]={};if(!isNode){cache[id].toJSON=jQuery.noop}}if(typeof name==="object"||typeof name==="function"){if(pvt){cache[id]=jQuery.extend(cache[id],name)}else{cache[id].data=jQuery.extend(cache[id].data,name)}}thisCache=cache[id];if(!pvt){if(!thisCache.data){thisCache.data={}}thisCache=thisCache.data}if(data!==undefined){thisCache[jQuery.camelCase(name)]=data}if(getByName){ret=thisCache[name];if(ret==null){ret=thisCache[jQuery.camelCase(name)]}}else{ret=thisCache}return ret},removeData:function(elem,name,pvt){if(!jQuery.acceptData(elem)){return}var thisCache,i,l,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[jQuery.expando]:jQuery.expando;if(!cache[id]){return}if(name){thisCache=pvt?cache[id]:cache[id].data;if(thisCache){if(!jQuery.isArray(name)){if(name in thisCache){name=[name]}else{name=jQuery.camelCase(name);if(name in thisCache){name=[name]}else{name=name.split(" ")}}}for(i=0,l=name.length;i1,null,false)},removeData:function(key){return this.each(function(){jQuery.removeData(this,key)})}});function dataAttr(elem,key,data){if(data===undefined&&elem.nodeType===1){var name="data-"+key.replace(rmultiDash,"-$1").toLowerCase();data=elem.getAttribute(name);if(typeof data==="string"){try{data=data==="true"?true:data==="false"?false:data==="null"?null:+data+""===data?+data:rbrace.test(data)?jQuery.parseJSON(data):data}catch(e){}jQuery.data(elem,key,data)}else{data=undefined}}return data}function isEmptyDataObject(obj){var name;for(name in obj){if(name==="data"&&jQuery.isEmptyObject(obj[name])){continue}if(name!=="toJSON"){return false}}return true}jQuery.extend({queue:function(elem,type,data){var queue;if(elem){type=(type||"fx")+"queue";queue=jQuery._data(elem,type);if(data){if(!queue||jQuery.isArray(data)){queue=jQuery._data(elem,type,jQuery.makeArray(data))}else{queue.push(data)}}return queue||[]}},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type),next=function(){jQuery.dequeue(elem,type)};if(fn==="inprogress"){fn=queue.shift();startLength--}if(fn){if(type==="fx"){queue.unshift("inprogress")}delete hooks.stop;fn.call(elem,next,hooks)}if(!startLength&&hooks){hooks.empty.fire()}},_queueHooks:function(elem,type){var key=type+"queueHooks";return jQuery._data(elem,key)||jQuery._data(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){jQuery.removeData(elem,type+"queue",true);jQuery.removeData(elem,key,true)})})}});jQuery.fn.extend({queue:function(type,data){var setter=2;if(typeof type!=="string"){data=type;type="fx";setter--}if(arguments.length1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})},prop:function(name,value){return jQuery.access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){name=jQuery.propFix[name]||name;return this.each(function(){try{this[name]=undefined;delete this[name]}catch(e){}})},addClass:function(value){var classNames,i,l,elem,setClass,c,cl;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).addClass(value.call(this,j,this.className))})}if(value&&typeof value==="string"){classNames=value.split(core_rspace);for(i=0,l=this.length;i=0){className=className.replace(" "+removes[c]+" "," ")}}elem.className=value?jQuery.trim(className):""}}}return this},toggleClass:function(value,stateVal){var type=typeof value,isBool=typeof stateVal==="boolean";if(jQuery.isFunction(value)){return this.each(function(i){jQuery(this).toggleClass(value.call(this,i,this.className,stateVal),stateVal)})}return this.each(function(){if(type==="string"){var className,i=0,self=jQuery(this),state=stateVal,classNames=value.split(core_rspace);while(className=classNames[i++]){state=isBool?state:!self.hasClass(className);self[state?"addClass":"removeClass"](className)}}else if(type==="undefined"||type==="boolean"){if(this.className){jQuery._data(this,"__className__",this.className)}this.className=this.className||value===false?"":jQuery._data(this,"__className__")||""}})},hasClass:function(selector){var className=" "+selector+" ",i=0,l=this.length;for(;i=0){return true}}return false},val:function(value){var hooks,ret,isFunction,elem=this[0];if(!arguments.length){if(elem){hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()];if(hooks&&"get"in hooks&&(ret=hooks.get(elem,"value"))!==undefined){return ret}ret=elem.value;return typeof ret==="string"?ret.replace(rreturn,""):ret==null?"":ret}return}isFunction=jQuery.isFunction(value);return this.each(function(i){var val,self=jQuery(this);if(this.nodeType!==1){return}if(isFunction){val=value.call(this,i,self.val())}else{val=value}if(val==null){val=""}else if(typeof val==="number"){val+=""}else if(jQuery.isArray(val)){val=jQuery.map(val,function(value){return value==null?"":value+""})}hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()];if(!hooks||!("set"in hooks)||hooks.set(this,val,"value")===undefined){this.value=val}})}});jQuery.extend({valHooks:{option:{get:function(elem){var val=elem.attributes.value;return!val||val.specified?elem.value:elem.text}},select:{get:function(elem){var value,option,options=elem.options,index=elem.selectedIndex,one=elem.type==="select-one"||index<0,values=one?null:[],max=one?index+1:options.length,i=index<0?max:one?index:0;for(;i=0});if(!values.length){elem.selectedIndex=-1}return values}}},attrFn:{},attr:function(elem,name,value,pass){var ret,hooks,notxml,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}if(pass&&jQuery.isFunction(jQuery.fn[name])){return jQuery(elem)[name](value)}if(typeof elem.getAttribute==="undefined"){return jQuery.prop(elem,name,value)}notxml=nType!==1||!jQuery.isXMLDoc(elem);if(notxml){name=name.toLowerCase();hooks=jQuery.attrHooks[name]||(rboolean.test(name)?boolHook:nodeHook)}if(value!==undefined){if(value===null){jQuery.removeAttr(elem,name);return}else if(hooks&&"set"in hooks&¬xml&&(ret=hooks.set(elem,value,name))!==undefined){return ret}else{elem.setAttribute(name,value+"");return value}}else if(hooks&&"get"in hooks&¬xml&&(ret=hooks.get(elem,name))!==null){return ret}else{ret=elem.getAttribute(name);return ret===null?undefined:ret}},removeAttr:function(elem,value){var propName,attrNames,name,isBool,i=0;if(value&&elem.nodeType===1){attrNames=value.split(core_rspace);for(;i=0}}})});var rformElems=/^(?:textarea|input|select)$/i,rtypenamespace=/^([^\.]*|)(?:\.(.+)|)$/,rhoverHack=/(?:^|\s)hover(\.\S+|)\b/,rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|contextmenu)|click/,rfocusMorph=/^(?:focusinfocus|focusoutblur)$/,hoverHack=function(events){return jQuery.event.special.hover?events:events.replace(rhoverHack,"mouseenter$1 mouseleave$1")};jQuery.event={add:function(elem,types,handler,data,selector){var elemData,eventHandle,events,t,tns,type,namespaces,handleObj,handleObjIn,handlers,special;if(elem.nodeType===3||elem.nodeType===8||!types||!handler||!(elemData=jQuery._data(elem))){return}if(handler.handler){handleObjIn=handler;handler=handleObjIn.handler;selector=handleObjIn.selector}if(!handler.guid){handler.guid=jQuery.guid++}events=elemData.events;if(!events){elemData.events=events={}}eventHandle=elemData.handle;if(!eventHandle){elemData.handle=eventHandle=function(e){return typeof jQuery!=="undefined"&&(!e||jQuery.event.triggered!==e.type)?jQuery.event.dispatch.apply(eventHandle.elem,arguments):undefined};eventHandle.elem=elem}types=jQuery.trim(hoverHack(types)).split(" ");for(t=0;t=0){type=type.slice(0,-1);exclusive=true}if(type.indexOf(".")>=0){namespaces=type.split(".");type=namespaces.shift();namespaces.sort()}if((!elem||jQuery.event.customEvent[type])&&!jQuery.event.global[type]){return}event=typeof event==="object"?event[jQuery.expando]?event:new jQuery.Event(type,event):new jQuery.Event(type);event.type=type;event.isTrigger=true;event.exclusive=exclusive;event.namespace=namespaces.join(".");event.namespace_re=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;ontype=type.indexOf(":")<0?"on"+type:"";if(!elem){cache=jQuery.cache;for(i in cache){if(cache[i].events&&cache[i].events[type]){jQuery.event.trigger(event,data,cache[i].handle.elem,true)}}return}event.result=undefined;if(!event.target){event.target=elem}data=data!=null?jQuery.makeArray(data):[];data.unshift(event);special=jQuery.event.special[type]||{};if(special.trigger&&special.trigger.apply(elem,data)===false){return}eventPath=[[elem,special.bindType||type]];if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){bubbleType=special.delegateType||type;cur=rfocusMorph.test(bubbleType+type)?elem:elem.parentNode;for(old=elem;cur;cur=cur.parentNode){eventPath.push([cur,bubbleType]);old=cur}if(old===(elem.ownerDocument||document)){eventPath.push([old.defaultView||old.parentWindow||window,bubbleType])}}for(i=0;i=0:jQuery.find(sel,this,null,[cur]).length}if(selMatch[sel]){matches.push(handleObj)}}if(matches.length){handlerQueue.push({elem:cur,matches:matches})}}}}if(handlers.length>delegateCount){handlerQueue.push({elem:this,matches:handlers.slice(delegateCount)})}for(i=0;i0?this.on(name,null,data,fn):this.trigger(name)};if(rkeyEvent.test(name)){jQuery.event.fixHooks[name]=jQuery.event.keyHooks}if(rmouseEvent.test(name)){jQuery.event.fixHooks[name]=jQuery.event.mouseHooks}});(function(window,undefined){var cachedruns,assertGetIdNotName,Expr,getText,isXML,contains,compile,sortOrder,hasDuplicate,outermostContext,baseHasDuplicate=true,strundefined="undefined",expando=("sizcache"+Math.random()).replace(".",""),Token=String,document=window.document,docElem=document.documentElement,dirruns=0,done=0,pop=[].pop,push=[].push,slice=[].slice,indexOf=[].indexOf||function(elem){var i=0,len=this.length;for(;iExpr.cacheLength){delete cache[keys.shift()]}return cache[key+" "]=value},cache)},classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),whitespace="[\\x20\\t\\r\\n\\f]",characterEncoding="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",identifier=characterEncoding.replace("w","w#"),operators="([*^$|!~]?=)",attributes="\\["+whitespace+"*("+characterEncoding+")"+whitespace+"*(?:"+operators+whitespace+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+identifier+")|)|)"+whitespace+"*\\]",pseudos=":("+characterEncoding+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+attributes+")|[^:]|\\\\.)*|.*))\\)|)",pos=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)",rtrim=new RegExp("^"+whitespace+"+|((?:^|[^\\\\])(?:\\\\.)*)"+whitespace+"+$","g"),rcomma=new RegExp("^"+whitespace+"*,"+whitespace+"*"),rcombinators=new RegExp("^"+whitespace+"*([\\x20\\t\\r\\n\\f>+~])"+whitespace+"*"),rpseudo=new RegExp(pseudos),rquickExpr=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,rnot=/^:not/,rsibling=/[\x20\t\r\n\f]*[+~]/,rendsWithNot=/:not\($/,rheader=/h\d/i,rinputs=/input|select|textarea|button/i,rbackslash=/\\(?!\\)/g,matchExpr={ID:new RegExp("^#("+characterEncoding+")"),CLASS:new RegExp("^\\.("+characterEncoding+")"),NAME:new RegExp("^\\[name=['\"]?("+characterEncoding+")['\"]?\\]"),TAG:new RegExp("^("+characterEncoding.replace("w","w*")+")"),ATTR:new RegExp("^"+attributes),PSEUDO:new RegExp("^"+pseudos),POS:new RegExp(pos,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),needsContext:new RegExp("^"+whitespace+"*[>+~]|"+pos,"i")},assert=function(fn){var div=document.createElement("div");try{return fn(div)}catch(e){return false}finally{div=null}},assertTagNameNoComments=assert(function(div){div.appendChild(document.createComment(""));return!div.getElementsByTagName("*").length}),assertHrefNotNormalized=assert(function(div){div.innerHTML="";return div.firstChild&&typeof div.firstChild.getAttribute!==strundefined&&div.firstChild.getAttribute("href")==="#"}),assertAttributes=assert(function(div){div.innerHTML="";var type=typeof div.lastChild.getAttribute("multiple");return type!=="boolean"&&type!=="string"}),assertUsableClassName=assert(function(div){div.innerHTML="";if(!div.getElementsByClassName||!div.getElementsByClassName("e").length){return false}div.lastChild.className="e";return div.getElementsByClassName("e").length===2}),assertUsableName=assert(function(div){div.id=expando+0;div.innerHTML="
    ";docElem.insertBefore(div,docElem.firstChild);var pass=document.getElementsByName&&document.getElementsByName(expando).length===2+document.getElementsByName(expando+0).length;assertGetIdNotName=!document.getElementById(expando);docElem.removeChild(div);return pass});try{slice.call(docElem.childNodes,0)[0].nodeType}catch(e){slice=function(i){var elem,results=[];for(;elem=this[i];i++){results.push(elem)}return results}}function Sizzle(selector,context,results,seed){results=results||[];context=context||document;var match,elem,xml,m,nodeType=context.nodeType;if(!selector||typeof selector!=="string"){return results}if(nodeType!==1&&nodeType!==9){return[]}xml=isXML(context);if(!xml&&!seed){if(match=rquickExpr.exec(selector)){if(m=match[1]){if(nodeType===9){elem=context.getElementById(m);if(elem&&elem.parentNode){if(elem.id===m){results.push(elem);return results}}else{return results}}else{if(context.ownerDocument&&(elem=context.ownerDocument.getElementById(m))&&contains(context,elem)&&elem.id===m){results.push(elem);return results}}}else if(match[2]){push.apply(results,slice.call(context.getElementsByTagName(selector),0));return results}else if((m=match[3])&&assertUsableClassName&&context.getElementsByClassName){push.apply(results,slice.call(context.getElementsByClassName(m),0));return results}}}return select(selector.replace(rtrim,"$1"),context,results,seed,xml)}Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)};Sizzle.matchesSelector=function(elem,expr){return Sizzle(expr,null,null,[elem]).length>0};function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&elem.type===type}}function createPositionalPseudo(fn){return markFunction(function(argument){argument=+argument;return markFunction(function(seed,matches){var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;while(i--){if(seed[j=matchIndexes[i]]){seed[j]=!(matches[j]=seed[j])}}})})}getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(nodeType){if(nodeType===1||nodeType===9||nodeType===11){if(typeof elem.textContent==="string"){return elem.textContent}else{for(elem=elem.firstChild;elem;elem=elem.nextSibling){ret+=getText(elem)}}}else if(nodeType===3||nodeType===4){return elem.nodeValue}}else{for(;node=elem[i];i++){ret+=getText(node)}}return ret};isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return documentElement?documentElement.nodeName!=="HTML":false};contains=Sizzle.contains=docElem.contains?function(a,b){var adown=a.nodeType===9?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!!(bup&&bup.nodeType===1&&adown.contains&&adown.contains(bup))}:docElem.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode){if(b===a){return true}}return false};Sizzle.attr=function(elem,name){var val,xml=isXML(elem);if(!xml){name=name.toLowerCase()}if(val=Expr.attrHandle[name]){return val(elem)}if(xml||assertAttributes){return elem.getAttribute(name)}val=elem.getAttributeNode(name);return val?typeof elem[name]==="boolean"?elem[name]?name:null:val.specified?val.value:null:null};Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:assertHrefNotNormalized?{}:{href:function(elem){return elem.getAttribute("href",2)},type:function(elem){return elem.getAttribute("type")}},find:{ID:assertGetIdNotName?function(id,context,xml){if(typeof context.getElementById!==strundefined&&!xml){var m=context.getElementById(id);return m&&m.parentNode?[m]:[]}}:function(id,context,xml){if(typeof context.getElementById!==strundefined&&!xml){var m=context.getElementById(id);return m?m.id===id||typeof m.getAttributeNode!==strundefined&&m.getAttributeNode("id").value===id?[m]:undefined:[]}},TAG:assertTagNameNoComments?function(tag,context){if(typeof context.getElementsByTagName!==strundefined){return context.getElementsByTagName(tag)}}:function(tag,context){var results=context.getElementsByTagName(tag);if(tag==="*"){var elem,tmp=[],i=0;for(;elem=results[i];i++){if(elem.nodeType===1){tmp.push(elem)}}return tmp}return results},NAME:assertUsableName&&function(tag,context){if(typeof context.getElementsByName!==strundefined){return context.getElementsByName(name)}},CLASS:assertUsableClassName&&function(className,context,xml){if(typeof context.getElementsByClassName!==strundefined&&!xml){return context.getElementsByClassName(className)}}},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(match){match[1]=match[1].replace(rbackslash,"");match[3]=(match[4]||match[5]||"").replace(rbackslash,"");if(match[2]==="~="){match[3]=" "+match[3]+" "}return match.slice(0,4)},CHILD:function(match){match[1]=match[1].toLowerCase();if(match[1]==="nth"){if(!match[2]){Sizzle.error(match[0])}match[3]=+(match[3]?match[4]+(match[5]||1):2*(match[2]==="even"||match[2]==="odd"));match[4]=+(match[6]+match[7]||match[2]==="odd")}else if(match[2]){Sizzle.error(match[0])}return match},PSEUDO:function(match){var unquoted,excess;if(matchExpr["CHILD"].test(match[0])){return null}if(match[3]){match[2]=match[3]}else if(unquoted=match[4]){if(rpseudo.test(unquoted)&&(excess=tokenize(unquoted,true))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)){unquoted=unquoted.slice(0,excess);match[0]=match[0].slice(0,excess)}match[2]=unquoted}return match.slice(0,3)}},filter:{ID:assertGetIdNotName?function(id){id=id.replace(rbackslash,"");return function(elem){return elem.getAttribute("id")===id}}:function(id){id=id.replace(rbackslash,"");return function(elem){var node=typeof elem.getAttributeNode!==strundefined&&elem.getAttributeNode("id");return node&&node.value===id}},TAG:function(nodeName){if(nodeName==="*"){return function(){return true}}nodeName=nodeName.replace(rbackslash,"").toLowerCase();return function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},CLASS:function(className){var pattern=classCache[expando][className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test(elem.className||typeof elem.getAttribute!==strundefined&&elem.getAttribute("class")||"")})},ATTR:function(name,operator,check){return function(elem,context){var result=Sizzle.attr(elem,name);if(result==null){return operator==="!="}if(!operator){return true}result+="";return operator==="="?result===check:operator==="!="?result!==check:operator==="^="?check&&result.indexOf(check)===0:operator==="*="?check&&result.indexOf(check)>-1:operator==="$="?check&&result.substr(result.length-check.length)===check:operator==="~="?(" "+result+" ").indexOf(check)>-1:operator==="|="?result===check||result.substr(0,check.length+1)===check+"-":false}},CHILD:function(type,argument,first,last){if(type==="nth"){return function(elem){var node,diff,parent=elem.parentNode;if(first===1&&last===0){return true}if(parent){diff=0;for(node=parent.firstChild;node;node=node.nextSibling){if(node.nodeType===1){diff++; +if(elem===node){break}}}}diff-=last;return diff===first||diff%first===0&&diff/first>=0}}return function(elem){var node=elem;switch(type){case"only":case"first":while(node=node.previousSibling){if(node.nodeType===1){return false}}if(type==="first"){return true}node=elem;case"last":while(node=node.nextSibling){if(node.nodeType===1){return false}}return true}}},PSEUDO:function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);if(fn[expando]){return fn(argument)}if(fn.length>1){args=[pseudo,pseudo,"",argument];return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){var idx,matched=fn(seed,argument),i=matched.length;while(i--){idx=indexOf.call(seed,matched[i]);seed[idx]=!(matches[idx]=matched[i])}}):function(elem){return fn(elem,0,args)}}return fn}},pseudos:{not:markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;while(i--){if(elem=unmatched[i]){seed[i]=!(matches[i]=elem)}}}):function(elem,context,xml){input[0]=elem;matcher(input,null,xml,results);return!results.pop()}}),has:markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),contains:markFunction(function(text){return function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),enabled:function(elem){return elem.disabled===false},disabled:function(elem){return elem.disabled===true},checked:function(elem){var nodeName=elem.nodeName.toLowerCase();return nodeName==="input"&&!!elem.checked||nodeName==="option"&&!!elem.selected},selected:function(elem){if(elem.parentNode){elem.parentNode.selectedIndex}return elem.selected===true},parent:function(elem){return!Expr.pseudos["empty"](elem)},empty:function(elem){var nodeType;elem=elem.firstChild;while(elem){if(elem.nodeName>"@"||(nodeType=elem.nodeType)===3||nodeType===4){return false}elem=elem.nextSibling}return true},header:function(elem){return rheader.test(elem.nodeName)},text:function(elem){var type,attr;return elem.nodeName.toLowerCase()==="input"&&(type=elem.type)==="text"&&((attr=elem.getAttribute("type"))==null||attr.toLowerCase()===type)},radio:createInputPseudo("radio"),checkbox:createInputPseudo("checkbox"),file:createInputPseudo("file"),password:createInputPseudo("password"),image:createInputPseudo("image"),submit:createButtonPseudo("submit"),reset:createButtonPseudo("reset"),button:function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type==="button"||name==="button"},input:function(elem){return rinputs.test(elem.nodeName)},focus:function(elem){var doc=elem.ownerDocument;return elem===doc.activeElement&&(!doc.hasFocus||doc.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},active:function(elem){return elem===elem.ownerDocument.activeElement},first:createPositionalPseudo(function(){return[0]}),last:createPositionalPseudo(function(matchIndexes,length){return[length-1]}),eq:createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),even:createPositionalPseudo(function(matchIndexes,length){for(var i=0;i=0;){matchIndexes.push(i)}return matchIndexes}),gt:createPositionalPseudo(function(matchIndexes,length,argument){for(var i=argument<0?argument+length:argument;++i1?function(elem,context,xml){var i=matchers.length;while(i--){if(!matchers[i](elem,context,xml)){return false}}return true}:matchers[0]}function condense(unmatched,map,filter,context,xml){var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=map!=null;for(;i-1){seed[temp]=!(results[temp]=elem)}}}}else{matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut);if(postFinder){postFinder(null,results,matcherOut,xml)}else{push.apply(results,matcherOut)}}})}function matcherFromTokens(tokens){var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,true),matchAnyContext=addCombinator(function(elem){return indexOf.call(checkContext,elem)>-1},implicitRelative,true),matchers=[function(elem,context,xml){return!leadingRelative&&(xml||context!==outermostContext)||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml))}];for(;i1&&elementMatcher(matchers),i>1&&tokens.slice(0,i-1).join("").replace(rtrim,"$1"),matcher,i0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,expandContext){var elem,j,matcher,setMatched=[],matchedCount=0,i="0",unmatched=seed&&[],outermost=expandContext!=null,contextBackup=outermostContext,elems=seed||byElement&&Expr.find["TAG"]("*",expandContext&&context.parentNode||context),dirrunsUnique=dirruns+=contextBackup==null?1:Math.E;if(outermost){outermostContext=context!==document&&context;cachedruns=superMatcher.el}for(;(elem=elems[i])!=null;i++){if(byElement&&elem){for(j=0;matcher=elementMatchers[j];j++){if(matcher(elem,context,xml)){results.push(elem);break}}if(outermost){dirruns=dirrunsUnique;cachedruns=++superMatcher.el}}if(bySet){if(elem=!matcher&&elem){matchedCount--}if(seed){unmatched.push(elem)}}}matchedCount+=i;if(bySet&&i!==matchedCount){for(j=0;matcher=setMatchers[j];j++){matcher(unmatched,setMatched,context,xml)}if(seed){if(matchedCount>0){while(i--){if(!(unmatched[i]||setMatched[i])){setMatched[i]=pop.call(results)}}}setMatched=condense(setMatched)}push.apply(results,setMatched);if(outermost&&!seed&&setMatched.length>0&&matchedCount+setMatchers.length>1){Sizzle.uniqueSort(results)}}if(outermost){dirruns=dirrunsUnique;outermostContext=contextBackup}return unmatched};superMatcher.el=0;return bySet?markFunction(superMatcher):superMatcher}compile=Sizzle.compile=function(selector,group){var i,setMatchers=[],elementMatchers=[],cached=compilerCache[expando][selector+" "];if(!cached){if(!group){group=tokenize(selector)}i=group.length;while(i--){cached=matcherFromTokens(group[i]);if(cached[expando]){setMatchers.push(cached)}else{elementMatchers.push(cached)}}cached=compilerCache(selector,matcherFromGroupMatchers(elementMatchers,setMatchers))}return cached};function multipleContexts(selector,contexts,results){var i=0,len=contexts.length;for(;i2&&(token=tokens[0]).type==="ID"&&context.nodeType===9&&!xml&&Expr.relative[tokens[1].type]){context=Expr.find["ID"](token.matches[0].replace(rbackslash,""),context,xml)[0];if(!context){return results}selector=selector.slice(tokens.shift().length)}for(i=matchExpr["POS"].test(selector)?-1:tokens.length-1;i>=0;i--){token=tokens[i];if(Expr.relative[type=token.type]){break}if(find=Expr.find[type]){if(seed=find(token.matches[0].replace(rbackslash,""),rsibling.test(tokens[0].type)&&context.parentNode||context,xml)){tokens.splice(i,1);selector=seed.length&&tokens.join("");if(!selector){push.apply(results,slice.call(seed,0));return results}break}}}}}compile(selector,match)(seed,context,xml,results,rsibling.test(selector));return results}if(document.querySelectorAll){(function(){var disconnectedMatch,oldSelect=select,rescape=/'|\\/g,rattributeQuotes=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,rbuggyQSA=[":focus"],rbuggyMatches=[":active"],matches=docElem.matchesSelector||docElem.mozMatchesSelector||docElem.webkitMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector;assert(function(div){div.innerHTML="";if(!div.querySelectorAll("[selected]").length){rbuggyQSA.push("\\["+whitespace+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)")}if(!div.querySelectorAll(":checked").length){rbuggyQSA.push(":checked")}});assert(function(div){div.innerHTML="

    ";if(div.querySelectorAll("[test^='']").length){rbuggyQSA.push("[*^$]="+whitespace+"*(?:\"\"|'')")}div.innerHTML="";if(!div.querySelectorAll(":enabled").length){rbuggyQSA.push(":enabled",":disabled")}});rbuggyQSA=new RegExp(rbuggyQSA.join("|"));select=function(selector,context,results,seed,xml){if(!seed&&!xml&&!rbuggyQSA.test(selector)){var groups,i,old=true,nid=expando,newContext=context,newSelector=context.nodeType===9&&selector;if(context.nodeType===1&&context.nodeName.toLowerCase()!=="object"){groups=tokenize(selector);if(old=context.getAttribute("id")){nid=old.replace(rescape,"\\$&")}else{context.setAttribute("id",nid)}nid="[id='"+nid+"'] ";i=groups.length;while(i--){groups[i]=nid+groups[i].join("")}newContext=rsibling.test(selector)&&context.parentNode||context;newSelector=groups.join(",")}if(newSelector){try{push.apply(results,slice.call(newContext.querySelectorAll(newSelector),0));return results}catch(qsaError){}finally{if(!old){context.removeAttribute("id")}}}}return oldSelect(selector,context,results,seed,xml)};if(matches){assert(function(div){disconnectedMatch=matches.call(div,"div");try{matches.call(div,"[test!='']:sizzle");rbuggyMatches.push("!=",pseudos)}catch(e){}});rbuggyMatches=new RegExp(rbuggyMatches.join("|"));Sizzle.matchesSelector=function(elem,expr){expr=expr.replace(rattributeQuotes,"='$1']");if(!isXML(elem)&&!rbuggyMatches.test(expr)&&!rbuggyQSA.test(expr)){try{var ret=matches.call(elem,expr);if(ret||disconnectedMatch||elem.document&&elem.document.nodeType!==11){return ret}}catch(e){}}return Sizzle(expr,null,null,[elem]).length>0}}})()}Expr.pseudos["nth"]=Expr.pseudos["eq"];function setFilters(){}Expr.filters=setFilters.prototype=Expr.pseudos;Expr.setFilters=new setFilters;Sizzle.attr=jQuery.attr;jQuery.find=Sizzle;jQuery.expr=Sizzle.selectors;jQuery.expr[":"]=jQuery.expr.pseudos;jQuery.unique=Sizzle.uniqueSort;jQuery.text=Sizzle.getText;jQuery.isXMLDoc=Sizzle.isXML;jQuery.contains=Sizzle.contains})(window);var runtil=/Until$/,rparentsprev=/^(?:parents|prev(?:Until|All))/,isSimple=/^.[^:#\[\.,]*$/,rneedsContext=jQuery.expr.match.needsContext,guaranteedUnique={children:true,contents:true,next:true,prev:true};jQuery.fn.extend({find:function(selector){var i,l,length,n,r,ret,self=this;if(typeof selector!=="string"){return jQuery(selector).filter(function(){for(i=0,l=self.length;i0){for(n=length;n=0:jQuery.filter(selector,this).length>0:this.filter(selector).length>0)},closest:function(selectors,context){var cur,i=0,l=this.length,ret=[],pos=rneedsContext.test(selectors)||typeof selectors!=="string"?jQuery(selectors,context||this.context):0;for(;i-1:jQuery.find.matchesSelector(cur,selectors)){ret.push(cur);break}cur=cur.parentNode}}ret=ret.length>1?jQuery.unique(ret):ret;return this.pushStack(ret,"closest",selectors)},index:function(elem){if(!elem){return this[0]&&this[0].parentNode?this.prevAll().length:-1}if(typeof elem==="string"){return jQuery.inArray(this[0],jQuery(elem))}return jQuery.inArray(elem.jquery?elem[0]:elem,this)},add:function(selector,context){var set=typeof selector==="string"?jQuery(selector,context):jQuery.makeArray(selector&&selector.nodeType?[selector]:selector),all=jQuery.merge(this.get(),set);return this.pushStack(isDisconnected(set[0])||isDisconnected(all[0])?all:jQuery.unique(all))},addBack:function(selector){return this.add(selector==null?this.prevObject:this.prevObject.filter(selector))}});jQuery.fn.andSelf=jQuery.fn.addBack;function isDisconnected(node){return!node||!node.parentNode||node.parentNode.nodeType===11}function sibling(cur,dir){do{cur=cur[dir]}while(cur&&cur.nodeType!==1);return cur}jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&parent.nodeType!==11?parent:null},parents:function(elem){return jQuery.dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return jQuery.dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"previousSibling")},nextAll:function(elem){return jQuery.dir(elem,"nextSibling")},prevAll:function(elem){return jQuery.dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return jQuery.dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return jQuery.dir(elem,"previousSibling",until)},siblings:function(elem){return jQuery.sibling((elem.parentNode||{}).firstChild,elem)},children:function(elem){return jQuery.sibling(elem.firstChild)},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.merge([],elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var ret=jQuery.map(this,fn,until);if(!runtil.test(name)){selector=until}if(selector&&typeof selector==="string"){ret=jQuery.filter(selector,ret)}ret=this.length>1&&!guaranteedUnique[name]?jQuery.unique(ret):ret;if(this.length>1&&rparentsprev.test(name)){ret=ret.reverse()}return this.pushStack(ret,name,core_slice.call(arguments).join(","))}});jQuery.extend({filter:function(expr,elems,not){if(not){expr=":not("+expr+")"}return elems.length===1?jQuery.find.matchesSelector(elems[0],expr)?[elems[0]]:[]:jQuery.find.matches(expr,elems)},dir:function(elem,dir,until){var matched=[],cur=elem[dir];while(cur&&cur.nodeType!==9&&(until===undefined||cur.nodeType!==1||!jQuery(cur).is(until))){if(cur.nodeType===1){matched.push(cur)}cur=cur[dir]}return matched},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType===1&&n!==elem){r.push(n)}}return r}});function winnow(elements,qualifier,keep){qualifier=qualifier||0;if(jQuery.isFunction(qualifier)){return jQuery.grep(elements,function(elem,i){var retVal=!!qualifier.call(elem,i,elem);return retVal===keep})}else if(qualifier.nodeType){return jQuery.grep(elements,function(elem,i){return elem===qualifier===keep})}else if(typeof qualifier==="string"){var filtered=jQuery.grep(elements,function(elem){return elem.nodeType===1});if(isSimple.test(qualifier)){return jQuery.filter(qualifier,filtered,!keep)}else{qualifier=jQuery.filter(qualifier,filtered)}}return jQuery.grep(elements,function(elem,i){return jQuery.inArray(elem,qualifier)>=0===keep})}function createSafeFragment(document){var list=nodeNames.split("|"),safeFrag=document.createDocumentFragment();if(safeFrag.createElement){while(list.length){safeFrag.createElement(list.pop())}}return safeFrag}var nodeNames="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|"+"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",rinlinejQuery=/ jQuery\d+="(?:null|\d+)"/g,rleadingWhitespace=/^\s+/,rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,rtagName=/<([\w:]+)/,rtbody=/]","i"),rcheckableType=/^(?:checkbox|radio)$/,rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,rscriptType=/\/(java|ecma)script/i,rcleanScript=/^\s*\s*$/g,wrapMap={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},safeFragment=createSafeFragment(document),fragmentDiv=safeFragment.appendChild(document.createElement("div"));wrapMap.optgroup=wrapMap.option;wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead;wrapMap.th=wrapMap.td;if(!jQuery.support.htmlSerialize){wrapMap._default=[1,"X
    ","
    "]}jQuery.fn.extend({text:function(value){return jQuery.access(this,function(value){return value===undefined?jQuery.text(this):this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(value))},null,value,arguments.length)},wrapAll:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapAll(html.call(this,i))})}if(this[0]){var wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){wrap.insertBefore(this[0])}wrap.map(function(){var elem=this;while(elem.firstChild&&elem.firstChild.nodeType===1){elem=elem.firstChild}return elem}).append(this)}return this},wrapInner:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapInner(html.call(this,i))})}return this.each(function(){var self=jQuery(this),contents=self.contents();if(contents.length){contents.wrapAll(html)}else{self.append(html)}})},wrap:function(html){var isFunction=jQuery.isFunction(html);return this.each(function(i){jQuery(this).wrapAll(isFunction?html.call(this,i):html)})},unwrap:function(){return this.parent().each(function(){if(!jQuery.nodeName(this,"body")){jQuery(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(elem){if(this.nodeType===1||this.nodeType===11){this.appendChild(elem)}})},prepend:function(){return this.domManip(arguments,true,function(elem){if(this.nodeType===1||this.nodeType===11){this.insertBefore(elem,this.firstChild)}})},before:function(){if(!isDisconnected(this[0])){return this.domManip(arguments,false,function(elem){this.parentNode.insertBefore(elem,this)})}if(arguments.length){var set=jQuery.clean(arguments);return this.pushStack(jQuery.merge(set,this),"before",this.selector)}},after:function(){if(!isDisconnected(this[0])){return this.domManip(arguments,false,function(elem){this.parentNode.insertBefore(elem,this.nextSibling)})}if(arguments.length){var set=jQuery.clean(arguments);return this.pushStack(jQuery.merge(this,set),"after",this.selector)}},remove:function(selector,keepData){var elem,i=0;for(;(elem=this[i])!=null;i++){if(!selector||jQuery.filter(selector,[elem]).length){if(!keepData&&elem.nodeType===1){jQuery.cleanData(elem.getElementsByTagName("*"));jQuery.cleanData([elem])}if(elem.parentNode){elem.parentNode.removeChild(elem)}}}return this},empty:function(){var elem,i=0;for(;(elem=this[i])!=null;i++){if(elem.nodeType===1){jQuery.cleanData(elem.getElementsByTagName("*"))}while(elem.firstChild){elem.removeChild(elem.firstChild)}}return this},clone:function(dataAndEvents,deepDataAndEvents){dataAndEvents=dataAndEvents==null?false:dataAndEvents;deepDataAndEvents=deepDataAndEvents==null?dataAndEvents:deepDataAndEvents;return this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){return jQuery.access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(value===undefined){return elem.nodeType===1?elem.innerHTML.replace(rinlinejQuery,""):undefined}if(typeof value==="string"&&!rnoInnerhtml.test(value)&&(jQuery.support.htmlSerialize||!rnoshimcache.test(value))&&(jQuery.support.leadingWhitespace||!rleadingWhitespace.test(value))&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=value.replace(rxhtmlTag,"<$1>");try{for(;i1&&typeof value==="string"&&rchecked.test(value)){return this.each(function(){jQuery(this).domManip(args,table,callback)})}if(jQuery.isFunction(value)){return this.each(function(i){var self=jQuery(this);args[0]=value.call(this,i,table?self.html():undefined);self.domManip(args,table,callback)})}if(this[0]){results=jQuery.buildFragment(args,this,scripts);fragment=results.fragment;first=fragment.firstChild;if(fragment.childNodes.length===1){fragment=first}if(first){table=table&&jQuery.nodeName(first,"tr");for(iNoClone=results.cacheable||l-1;i0?this.clone(true):this).get();jQuery(insert[i])[original](elems);ret=ret.concat(elems)}return this.pushStack(ret,name,insert.selector)}}});function getAll(elem){if(typeof elem.getElementsByTagName!=="undefined"){return elem.getElementsByTagName("*")}else if(typeof elem.querySelectorAll!=="undefined"){return elem.querySelectorAll("*")}else{return[]}}function fixDefaultChecked(elem){if(rcheckableType.test(elem.type)){elem.defaultChecked=elem.checked}}jQuery.extend({clone:function(elem,dataAndEvents,deepDataAndEvents){var srcElements,destElements,i,clone;if(jQuery.support.html5Clone||jQuery.isXMLDoc(elem)||!rnoshimcache.test("<"+elem.nodeName+">")){clone=elem.cloneNode(true)}else{fragmentDiv.innerHTML=elem.outerHTML;fragmentDiv.removeChild(clone=fragmentDiv.firstChild)}if((!jQuery.support.noCloneEvent||!jQuery.support.noCloneChecked)&&(elem.nodeType===1||elem.nodeType===11)&&!jQuery.isXMLDoc(elem)){cloneFixAttributes(elem,clone);srcElements=getAll(elem);destElements=getAll(clone);for(i=0;srcElements[i];++i){if(destElements[i]){cloneFixAttributes(srcElements[i],destElements[i])}}}if(dataAndEvents){cloneCopyEvent(elem,clone);if(deepDataAndEvents){srcElements=getAll(elem);destElements=getAll(clone);for(i=0;srcElements[i];++i){cloneCopyEvent(srcElements[i],destElements[i])}}}srcElements=destElements=null;return clone},clean:function(elems,context,fragment,scripts){var i,j,elem,tag,wrap,depth,div,hasBody,tbody,len,handleScript,jsTags,safe=context===document&&safeFragment,ret=[];if(!context||typeof context.createDocumentFragment==="undefined"){context=document}for(i=0;(elem=elems[i])!=null;i++){if(typeof elem==="number"){elem+=""}if(!elem){continue}if(typeof elem==="string"){if(!rhtml.test(elem)){elem=context.createTextNode(elem)}else{safe=safe||createSafeFragment(context);div=context.createElement("div");safe.appendChild(div);elem=elem.replace(rxhtmlTag,"<$1>");tag=(rtagName.exec(elem)||["",""])[1].toLowerCase();wrap=wrapMap[tag]||wrapMap._default;depth=wrap[0];div.innerHTML=wrap[1]+elem+wrap[2];while(depth--){div=div.lastChild +}if(!jQuery.support.tbody){hasBody=rtbody.test(elem);tbody=tag==="table"&&!hasBody?div.firstChild&&div.firstChild.childNodes:wrap[1]===""&&!hasBody?div.childNodes:[];for(j=tbody.length-1;j>=0;--j){if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length){tbody[j].parentNode.removeChild(tbody[j])}}}if(!jQuery.support.leadingWhitespace&&rleadingWhitespace.test(elem)){div.insertBefore(context.createTextNode(rleadingWhitespace.exec(elem)[0]),div.firstChild)}elem=div.childNodes;div.parentNode.removeChild(div)}}if(elem.nodeType){ret.push(elem)}else{jQuery.merge(ret,elem)}}if(div){elem=div=safe=null}if(!jQuery.support.appendChecked){for(i=0;(elem=ret[i])!=null;i++){if(jQuery.nodeName(elem,"input")){fixDefaultChecked(elem)}else if(typeof elem.getElementsByTagName!=="undefined"){jQuery.grep(elem.getElementsByTagName("input"),fixDefaultChecked)}}}if(fragment){handleScript=function(elem){if(!elem.type||rscriptType.test(elem.type)){return scripts?scripts.push(elem.parentNode?elem.parentNode.removeChild(elem):elem):fragment.appendChild(elem)}};for(i=0;(elem=ret[i])!=null;i++){if(!(jQuery.nodeName(elem,"script")&&handleScript(elem))){fragment.appendChild(elem);if(typeof elem.getElementsByTagName!=="undefined"){jsTags=jQuery.grep(jQuery.merge([],elem.getElementsByTagName("script")),handleScript);ret.splice.apply(ret,[i+1,0].concat(jsTags));i+=jsTags.length}}}}return ret},cleanData:function(elems,acceptData){var data,id,elem,type,i=0,internalKey=jQuery.expando,cache=jQuery.cache,deleteExpando=jQuery.support.deleteExpando,special=jQuery.event.special;for(;(elem=elems[i])!=null;i++){if(acceptData||jQuery.acceptData(elem)){id=elem[internalKey];data=id&&cache[id];if(data){if(data.events){for(type in data.events){if(special[type]){jQuery.event.remove(elem,type)}else{jQuery.removeEvent(elem,type,data.handle)}}}if(cache[id]){delete cache[id];if(deleteExpando){delete elem[internalKey]}else if(elem.removeAttribute){elem.removeAttribute(internalKey)}else{elem[internalKey]=null}jQuery.deletedIds.push(id)}}}}}});(function(){var matched,browser;jQuery.uaMatch=function(ua){ua=ua.toLowerCase();var match=/(chrome)[ \/]([\w.]+)/.exec(ua)||/(webkit)[ \/]([\w.]+)/.exec(ua)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua)||/(msie) ([\w.]+)/.exec(ua)||ua.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua)||[];return{browser:match[1]||"",version:match[2]||"0"}};matched=jQuery.uaMatch(navigator.userAgent);browser={};if(matched.browser){browser[matched.browser]=true;browser.version=matched.version}if(browser.chrome){browser.webkit=true}else if(browser.webkit){browser.safari=true}jQuery.browser=browser;jQuery.sub=function(){function jQuerySub(selector,context){return new jQuerySub.fn.init(selector,context)}jQuery.extend(true,jQuerySub,this);jQuerySub.superclass=this;jQuerySub.fn=jQuerySub.prototype=this();jQuerySub.fn.constructor=jQuerySub;jQuerySub.sub=this.sub;jQuerySub.fn.init=function init(selector,context){if(context&&context instanceof jQuery&&!(context instanceof jQuerySub)){context=jQuerySub(context)}return jQuery.fn.init.call(this,selector,context,rootjQuerySub)};jQuerySub.fn.init.prototype=jQuerySub.fn;var rootjQuerySub=jQuerySub(document);return jQuerySub}})();var curCSS,iframe,iframeDoc,ralpha=/alpha\([^)]*\)/i,ropacity=/opacity=([^)]*)/,rposition=/^(top|right|bottom|left)$/,rdisplayswap=/^(none|table(?!-c[ea]).+)/,rmargin=/^margin/,rnumsplit=new RegExp("^("+core_pnum+")(.*)$","i"),rnumnonpx=new RegExp("^("+core_pnum+")(?!px)[a-z%]+$","i"),rrelNum=new RegExp("^([-+])=("+core_pnum+")","i"),elemdisplay={BODY:"block"},cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:0,fontWeight:400},cssExpand=["Top","Right","Bottom","Left"],cssPrefixes=["Webkit","O","Moz","ms"],eventsToggle=jQuery.fn.toggle;function vendorPropName(style,name){if(name in style){return name}var capName=name.charAt(0).toUpperCase()+name.slice(1),origName=name,i=cssPrefixes.length;while(i--){name=cssPrefixes[i]+capName;if(name in style){return name}}return origName}function isHidden(elem,el){elem=el||elem;return jQuery.css(elem,"display")==="none"||!jQuery.contains(elem.ownerDocument,elem)}function showHide(elements,show){var elem,display,values=[],index=0,length=elements.length;for(;index1)},show:function(){return showHide(this,true)},hide:function(){return showHide(this)},toggle:function(state,fn2){var bool=typeof state==="boolean";if(jQuery.isFunction(state)&&jQuery.isFunction(fn2)){return eventsToggle.apply(this,arguments)}return this.each(function(){if(bool?state:isHidden(this)){jQuery(this).show()}else{jQuery(this).hide()}})}});jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return ret===""?"1":ret}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":jQuery.support.cssFloat?"cssFloat":"styleFloat"},style:function(elem,name,value,extra){if(!elem||elem.nodeType===3||elem.nodeType===8||!elem.style){return}var ret,type,hooks,origName=jQuery.camelCase(name),style=elem.style;name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(value!==undefined){type=typeof value;if(type==="string"&&(ret=rrelNum.exec(value))){value=(ret[1]+1)*ret[2]+parseFloat(jQuery.css(elem,name));type="number"}if(value==null||type==="number"&&isNaN(value)){return}if(type==="number"&&!jQuery.cssNumber[origName]){value+="px"}if(!hooks||!("set"in hooks)||(value=hooks.set(elem,value,extra))!==undefined){try{style[name]=value}catch(e){}}}else{if(hooks&&"get"in hooks&&(ret=hooks.get(elem,false,extra))!==undefined){return ret}return style[name]}},css:function(elem,name,numeric,extra){var val,num,hooks,origName=jQuery.camelCase(name);name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(elem.style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(hooks&&"get"in hooks){val=hooks.get(elem,true,extra)}if(val===undefined){val=curCSS(elem,name)}if(val==="normal"&&name in cssNormalTransform){val=cssNormalTransform[name]}if(numeric||extra!==undefined){num=parseFloat(val);return numeric||jQuery.isNumeric(num)?num||0:val}return val},swap:function(elem,options,callback){var ret,name,old={};for(name in options){old[name]=elem.style[name];elem.style[name]=options[name]}ret=callback.call(elem);for(name in options){elem.style[name]=old[name]}return ret}});if(window.getComputedStyle){curCSS=function(elem,name){var ret,width,minWidth,maxWidth,computed=window.getComputedStyle(elem,null),style=elem.style;if(computed){ret=computed.getPropertyValue(name)||computed[name];if(ret===""&&!jQuery.contains(elem.ownerDocument,elem)){ret=jQuery.style(elem,name)}if(rnumnonpx.test(ret)&&rmargin.test(name)){width=style.width;minWidth=style.minWidth;maxWidth=style.maxWidth;style.minWidth=style.maxWidth=style.width=ret;ret=computed.width;style.width=width;style.minWidth=minWidth;style.maxWidth=maxWidth}}return ret}}else if(document.documentElement.currentStyle){curCSS=function(elem,name){var left,rsLeft,ret=elem.currentStyle&&elem.currentStyle[name],style=elem.style;if(ret==null&&style&&style[name]){ret=style[name]}if(rnumnonpx.test(ret)&&!rposition.test(name)){left=style.left;rsLeft=elem.runtimeStyle&&elem.runtimeStyle.left;if(rsLeft){elem.runtimeStyle.left=elem.currentStyle.left}style.left=name==="fontSize"?"1em":ret;ret=style.pixelLeft+"px";style.left=left;if(rsLeft){elem.runtimeStyle.left=rsLeft}}return ret===""?"auto":ret}}function setPositiveNumber(elem,value,subtract){var matches=rnumsplit.exec(value);return matches?Math.max(0,matches[1]-(subtract||0))+(matches[2]||"px"):value}function augmentWidthOrHeight(elem,name,extra,isBorderBox){var i=extra===(isBorderBox?"border":"content")?4:name==="width"?1:0,val=0;for(;i<4;i+=2){if(extra==="margin"){val+=jQuery.css(elem,extra+cssExpand[i],true)}if(isBorderBox){if(extra==="content"){val-=parseFloat(curCSS(elem,"padding"+cssExpand[i]))||0}if(extra!=="margin"){val-=parseFloat(curCSS(elem,"border"+cssExpand[i]+"Width"))||0}}else{val+=parseFloat(curCSS(elem,"padding"+cssExpand[i]))||0;if(extra!=="padding"){val+=parseFloat(curCSS(elem,"border"+cssExpand[i]+"Width"))||0}}}return val}function getWidthOrHeight(elem,name,extra){var val=name==="width"?elem.offsetWidth:elem.offsetHeight,valueIsBorderBox=true,isBorderBox=jQuery.support.boxSizing&&jQuery.css(elem,"boxSizing")==="border-box";if(val<=0||val==null){val=curCSS(elem,name);if(val<0||val==null){val=elem.style[name]}if(rnumnonpx.test(val)){return val}valueIsBorderBox=isBorderBox&&(jQuery.support.boxSizingReliable||val===elem.style[name]);val=parseFloat(val)||0}return val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox)+"px"}function css_defaultDisplay(nodeName){if(elemdisplay[nodeName]){return elemdisplay[nodeName]}var elem=jQuery("<"+nodeName+">").appendTo(document.body),display=elem.css("display");elem.remove();if(display==="none"||display===""){iframe=document.body.appendChild(iframe||jQuery.extend(document.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!iframeDoc||!iframe.createElement){iframeDoc=(iframe.contentWindow||iframe.contentDocument).document;iframeDoc.write("");iframeDoc.close()}elem=iframeDoc.body.appendChild(iframeDoc.createElement(nodeName));display=curCSS(elem,"display");document.body.removeChild(iframe)}elemdisplay[nodeName]=display;return display}jQuery.each(["height","width"],function(i,name){jQuery.cssHooks[name]={get:function(elem,computed,extra){if(computed){if(elem.offsetWidth===0&&rdisplayswap.test(curCSS(elem,"display"))){return jQuery.swap(elem,cssShow,function(){return getWidthOrHeight(elem,name,extra)})}else{return getWidthOrHeight(elem,name,extra)}}},set:function(elem,value,extra){return setPositiveNumber(elem,value,extra?augmentWidthOrHeight(elem,name,extra,jQuery.support.boxSizing&&jQuery.css(elem,"boxSizing")==="border-box"):0)}}});if(!jQuery.support.opacity){jQuery.cssHooks.opacity={get:function(elem,computed){return ropacity.test((computed&&elem.currentStyle?elem.currentStyle.filter:elem.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":computed?"1":""},set:function(elem,value){var style=elem.style,currentStyle=elem.currentStyle,opacity=jQuery.isNumeric(value)?"alpha(opacity="+value*100+")":"",filter=currentStyle&¤tStyle.filter||style.filter||"";style.zoom=1;if(value>=1&&jQuery.trim(filter.replace(ralpha,""))===""&&style.removeAttribute){style.removeAttribute("filter");if(currentStyle&&!currentStyle.filter){return}}style.filter=ralpha.test(filter)?filter.replace(ralpha,opacity):filter+" "+opacity}}}jQuery(function(){if(!jQuery.support.reliableMarginRight){jQuery.cssHooks.marginRight={get:function(elem,computed){return jQuery.swap(elem,{display:"inline-block"},function(){if(computed){return curCSS(elem,"marginRight")}})}}}if(!jQuery.support.pixelPosition&&jQuery.fn.position){jQuery.each(["top","left"],function(i,prop){jQuery.cssHooks[prop]={get:function(elem,computed){if(computed){var ret=curCSS(elem,prop);return rnumnonpx.test(ret)?jQuery(elem).position()[prop]+"px":ret}}}})}});if(jQuery.expr&&jQuery.expr.filters){jQuery.expr.filters.hidden=function(elem){return elem.offsetWidth===0&&elem.offsetHeight===0||!jQuery.support.reliableHiddenOffsets&&(elem.style&&elem.style.display||curCSS(elem,"display"))==="none"};jQuery.expr.filters.visible=function(elem){return!jQuery.expr.filters.hidden(elem)}}jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){var i,parts=typeof value==="string"?value.split(" "):[value],expanded={};for(i=0;i<4;i++){expanded[prefix+cssExpand[i]+suffix]=parts[i]||parts[i-2]||parts[0]}return expanded}};if(!rmargin.test(prefix)){jQuery.cssHooks[prefix+suffix].set=setPositiveNumber}});var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rinput=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,rselectTextarea=/^(?:select|textarea)/i;jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?jQuery.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||rselectTextarea.test(this.nodeName)||rinput.test(this.type))}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:jQuery.isArray(val)?jQuery.map(val,function(val,i){return{name:elem.name,value:val.replace(rCRLF,"\r\n")}}):{name:elem.name,value:val.replace(rCRLF,"\r\n")}}).get()}});jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,value){value=jQuery.isFunction(value)?value():value==null?"":value;s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(value)};if(traditional===undefined){traditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional}if(jQuery.isArray(a)||a.jquery&&!jQuery.isPlainObject(a)){jQuery.each(a,function(){add(this.name,this.value)})}else{for(prefix in a){buildParams(prefix,a[prefix],traditional,add)}}return s.join("&").replace(r20,"+")};function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj)){jQuery.each(obj,function(i,v){if(traditional||rbracket.test(prefix)){add(prefix,v)}else{buildParams(prefix+"["+(typeof v==="object"?i:"")+"]",v,traditional,add)}})}else if(!traditional&&jQuery.type(obj)==="object"){for(name in obj){buildParams(prefix+"["+name+"]",obj[name],traditional,add)}}else{add(prefix,obj)}}var ajaxLocParts,ajaxLocation,rhash=/#.*$/,rheaders=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,rlocalProtocol=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,rquery=/\?/,rscript=/)<[^<]*)*<\/script>/gi,rts=/([?&])_=[^&]*/,rurl=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,_load=jQuery.fn.load,prefilters={},transports={},allTypes=["*/"]+["*"];try{ajaxLocation=location.href}catch(e){ajaxLocation=document.createElement("a");ajaxLocation.href="";ajaxLocation=ajaxLocation.href}ajaxLocParts=rurl.exec(ajaxLocation.toLowerCase())||[];function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){if(typeof dataTypeExpression!=="string"){func=dataTypeExpression;dataTypeExpression="*"}var dataType,list,placeBefore,dataTypes=dataTypeExpression.toLowerCase().split(core_rspace),i=0,length=dataTypes.length;if(jQuery.isFunction(func)){for(;i=0){selector=url.slice(off,url.length);url=url.slice(0,off)}if(jQuery.isFunction(params)){callback=params;params=undefined}else if(params&&typeof params==="object"){type="POST"}jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(jqXHR,status){if(callback){self.each(callback,response||[jqXHR.responseText,status,jqXHR])}}}).done(function(responseText){response=arguments;self.html(selector?jQuery("
    ").append(responseText.replace(rscript,"")).find(selector):responseText)});return this};jQuery.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(i,o){jQuery.fn[o]=function(f){return this.on(o,f)}});jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){if(jQuery.isFunction(data)){type=type||callback;callback=data;data=undefined}return jQuery.ajax({type:method,url:url,data:data,success:callback,dataType:type})}});jQuery.extend({getScript:function(url,callback){return jQuery.get(url,undefined,callback,"script")},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json")},ajaxSetup:function(target,settings){if(settings){ajaxExtend(target,jQuery.ajaxSettings)}else{settings=target;target=jQuery.ajaxSettings}ajaxExtend(target,settings);return target},ajaxSettings:{url:ajaxLocation,isLocal:rlocalProtocol.test(ajaxLocParts[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":allTypes},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":window.String,"text html":true,"text json":jQuery.parseJSON,"text xml":jQuery.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){if(typeof url==="object"){options=url;url=undefined}options=options||{};var ifModifiedKey,responseHeadersString,responseHeaders,transport,timeoutTimer,parts,fireGlobals,i,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=callbackContext!==s&&(callbackContext.nodeType||callbackContext instanceof jQuery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},state=0,strAbort="canceled",jqXHR={readyState:0,setRequestHeader:function(name,value){if(!state){var lname=name.toLowerCase();name=requestHeadersNames[lname]=requestHeadersNames[lname]||name;requestHeaders[name]=value}return this},getAllResponseHeaders:function(){return state===2?responseHeadersString:null},getResponseHeader:function(key){var match;if(state===2){if(!responseHeaders){responseHeaders={};while(match=rheaders.exec(responseHeadersString)){responseHeaders[match[1].toLowerCase()]=match[2]}}match=responseHeaders[key.toLowerCase()]}return match===undefined?null:match},overrideMimeType:function(type){if(!state){s.mimeType=type}return this},abort:function(statusText){statusText=statusText||strAbort;if(transport){transport.abort(statusText)}done(0,statusText);return this}};function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;if(state===2){return}state=2;if(timeoutTimer){clearTimeout(timeoutTimer)}transport=undefined;responseHeadersString=headers||"";jqXHR.readyState=status>0?4:0;if(responses){response=ajaxHandleResponses(s,jqXHR,responses)}if(status>=200&&status<300||status===304){if(s.ifModified){modified=jqXHR.getResponseHeader("Last-Modified");if(modified){jQuery.lastModified[ifModifiedKey]=modified}modified=jqXHR.getResponseHeader("Etag");if(modified){jQuery.etag[ifModifiedKey]=modified}}if(status===304){statusText="notmodified";isSuccess=true}else{isSuccess=ajaxConvert(s,response);statusText=isSuccess.state;success=isSuccess.data;error=isSuccess.error;isSuccess=!error}}else{error=statusText;if(!statusText||status){statusText="error";if(status<0){status=0}}}jqXHR.status=status;jqXHR.statusText=(nativeStatusText||statusText)+"";if(isSuccess){deferred.resolveWith(callbackContext,[success,statusText,jqXHR])}else{deferred.rejectWith(callbackContext,[jqXHR,statusText,error])}jqXHR.statusCode(statusCode);statusCode=undefined;if(fireGlobals){globalEventContext.trigger("ajax"+(isSuccess?"Success":"Error"),[jqXHR,s,isSuccess?success:error])}completeDeferred.fireWith(callbackContext,[jqXHR,statusText]);if(fireGlobals){globalEventContext.trigger("ajaxComplete",[jqXHR,s]);if(!--jQuery.active){jQuery.event.trigger("ajaxStop")}}}deferred.promise(jqXHR);jqXHR.success=jqXHR.done;jqXHR.error=jqXHR.fail;jqXHR.complete=completeDeferred.add;jqXHR.statusCode=function(map){if(map){var tmp;if(state<2){for(tmp in map){statusCode[tmp]=[statusCode[tmp],map[tmp]]}}else{tmp=map[jqXHR.status];jqXHR.always(tmp)}}return this};s.url=((url||s.url)+"").replace(rhash,"").replace(rprotocol,ajaxLocParts[1]+"//");s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().split(core_rspace);if(s.crossDomain==null){parts=rurl.exec(s.url.toLowerCase());s.crossDomain=!!(parts&&(parts[1]!==ajaxLocParts[1]||parts[2]!==ajaxLocParts[2]||(parts[3]||(parts[1]==="http:"?80:443))!=(ajaxLocParts[3]||(ajaxLocParts[1]==="http:"?80:443))))}if(s.data&&s.processData&&typeof s.data!=="string"){s.data=jQuery.param(s.data,s.traditional)}inspectPrefiltersOrTransports(prefilters,s,options,jqXHR);if(state===2){return jqXHR}fireGlobals=s.global;s.type=s.type.toUpperCase();s.hasContent=!rnoContent.test(s.type);if(fireGlobals&&jQuery.active++===0){jQuery.event.trigger("ajaxStart")}if(!s.hasContent){if(s.data){s.url+=(rquery.test(s.url)?"&":"?")+s.data;delete s.data}ifModifiedKey=s.url;if(s.cache===false){var ts=jQuery.now(),ret=s.url.replace(rts,"$1_="+ts);s.url=ret+(ret===s.url?(rquery.test(s.url)?"&":"?")+"_="+ts:"")}}if(s.data&&s.hasContent&&s.contentType!==false||options.contentType){jqXHR.setRequestHeader("Content-Type",s.contentType)}if(s.ifModified){ifModifiedKey=ifModifiedKey||s.url;if(jQuery.lastModified[ifModifiedKey]){jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[ifModifiedKey])}if(jQuery.etag[ifModifiedKey]){jqXHR.setRequestHeader("If-None-Match",jQuery.etag[ifModifiedKey])}}jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+(s.dataTypes[0]!=="*"?", "+allTypes+"; q=0.01":""):s.accepts["*"]);for(i in s.headers){jqXHR.setRequestHeader(i,s.headers[i])}if(s.beforeSend&&(s.beforeSend.call(callbackContext,jqXHR,s)===false||state===2)){return jqXHR.abort()}strAbort="abort";for(i in{success:1,error:1,complete:1}){jqXHR[i](s[i])}transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR);if(!transport){done(-1,"No Transport")}else{jqXHR.readyState=1;if(fireGlobals){globalEventContext.trigger("ajaxSend",[jqXHR,s])}if(s.async&&s.timeout>0){timeoutTimer=setTimeout(function(){jqXHR.abort("timeout")},s.timeout)}try{state=1;transport.send(requestHeaders,done)}catch(e){if(state<2){done(-1,e)}else{throw e}}}return jqXHR},active:0,lastModified:{},etag:{}});function ajaxHandleResponses(s,jqXHR,responses){var ct,type,finalDataType,firstDataType,contents=s.contents,dataTypes=s.dataTypes,responseFields=s.responseFields;for(type in responseFields){if(type in responses){jqXHR[responseFields[type]]=responses[type]}}while(dataTypes[0]==="*"){dataTypes.shift();if(ct===undefined){ct=s.mimeType||jqXHR.getResponseHeader("content-type")}}if(ct){for(type in contents){if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}}}if(dataTypes[0]in responses){finalDataType=dataTypes[0]}else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}if(!firstDataType){firstDataType=type}}finalDataType=finalDataType||firstDataType}if(finalDataType){if(finalDataType!==dataTypes[0]){dataTypes.unshift(finalDataType)}return responses[finalDataType]}}function ajaxConvert(s,response){var conv,conv2,current,tmp,dataTypes=s.dataTypes.slice(),prev=dataTypes[0],converters={},i=0;if(s.dataFilter){response=s.dataFilter(response,s.dataType)}if(dataTypes[1]){for(conv in s.converters){converters[conv.toLowerCase()]=s.converters[conv]}}for(;current=dataTypes[++i];){if(current!=="*"){if(prev!=="*"&&prev!==current){conv=converters[prev+" "+current]||converters["* "+current];if(!conv){for(conv2 in converters){tmp=conv2.split(" ");if(tmp[1]===current){conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]];if(conv){if(conv===true){conv=converters[conv2]}else if(converters[conv2]!==true){current=tmp[0];dataTypes.splice(i--,0,current)}break}}}}if(conv!==true){if(conv&&s["throws"]){response=conv(response)}else{try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}}}prev=current}}return{state:"success",data:response}}var oldCallbacks=[],rquestion=/\?/,rjsonp=/(=)\?(?=&|$)|\?\?/,nonce=jQuery.now();jQuery.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var callback=oldCallbacks.pop()||jQuery.expando+"_"+nonce++;this[callback]=true;return callback}});jQuery.ajaxPrefilter("json jsonp",function(s,originalSettings,jqXHR){var callbackName,overwritten,responseContainer,data=s.data,url=s.url,hasCallback=s.jsonp!==false,replaceInUrl=hasCallback&&rjsonp.test(url),replaceInData=hasCallback&&!replaceInUrl&&typeof data==="string"&&!(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&rjsonp.test(data);if(s.dataTypes[0]==="jsonp"||replaceInUrl||replaceInData){callbackName=s.jsonpCallback=jQuery.isFunction(s.jsonpCallback)?s.jsonpCallback():s.jsonpCallback;overwritten=window[callbackName];if(replaceInUrl){s.url=url.replace(rjsonp,"$1"+callbackName)}else if(replaceInData){s.data=data.replace(rjsonp,"$1"+callbackName)}else if(hasCallback){s.url+=(rquestion.test(url)?"&":"?")+s.jsonp+"="+callbackName}s.converters["script json"]=function(){if(!responseContainer){jQuery.error(callbackName+" was not called")}return responseContainer[0]};s.dataTypes[0]="json";window[callbackName]=function(){responseContainer=arguments};jqXHR.always(function(){window[callbackName]=overwritten;if(s[callbackName]){s.jsonpCallback=originalSettings.jsonpCallback;oldCallbacks.push(callbackName)}if(responseContainer&&jQuery.isFunction(overwritten)){overwritten(responseContainer[0])}responseContainer=overwritten=undefined});return"script"}});jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(text){jQuery.globalEval(text);return text}}});jQuery.ajaxPrefilter("script",function(s){if(s.cache===undefined){s.cache=false}if(s.crossDomain){s.type="GET";s.global=false}});jQuery.ajaxTransport("script",function(s){if(s.crossDomain){var script,head=document.head||document.getElementsByTagName("head")[0]||document.documentElement;return{send:function(_,callback){script=document.createElement("script");script.async="async";if(s.scriptCharset){script.charset=s.scriptCharset}script.src=s.url;script.onload=script.onreadystatechange=function(_,isAbort){if(isAbort||!script.readyState||/loaded|complete/.test(script.readyState)){script.onload=script.onreadystatechange=null;if(head&&script.parentNode){head.removeChild(script)}script=undefined;if(!isAbort){callback(200,"success")}}};head.insertBefore(script,head.firstChild)},abort:function(){if(script){script.onload(0,1)}}}}});var xhrCallbacks,xhrOnUnloadAbort=window.ActiveXObject?function(){for(var key in xhrCallbacks){xhrCallbacks[key](0,1)}}:false,xhrId=0;function createStandardXHR(){try{return new window.XMLHttpRequest}catch(e){}}function createActiveXHR(){try{return new window.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}jQuery.ajaxSettings.xhr=window.ActiveXObject?function(){return!this.isLocal&&createStandardXHR()||createActiveXHR()}:createStandardXHR;(function(xhr){jQuery.extend(jQuery.support,{ajax:!!xhr,cors:!!xhr&&"withCredentials"in xhr})})(jQuery.ajaxSettings.xhr());if(jQuery.support.ajax){jQuery.ajaxTransport(function(s){if(!s.crossDomain||jQuery.support.cors){var callback;return{send:function(headers,complete){var handle,i,xhr=s.xhr();if(s.username){xhr.open(s.type,s.url,s.async,s.username,s.password)}else{xhr.open(s.type,s.url,s.async)}if(s.xhrFields){for(i in s.xhrFields){xhr[i]=s.xhrFields[i]}}if(s.mimeType&&xhr.overrideMimeType){xhr.overrideMimeType(s.mimeType)}if(!s.crossDomain&&!headers["X-Requested-With"]){headers["X-Requested-With"]="XMLHttpRequest"}try{for(i in headers){xhr.setRequestHeader(i,headers[i])}}catch(_){}xhr.send(s.hasContent&&s.data||null);callback=function(_,isAbort){var status,statusText,responseHeaders,responses,xml;try{if(callback&&(isAbort||xhr.readyState===4)){callback=undefined;if(handle){xhr.onreadystatechange=jQuery.noop;if(xhrOnUnloadAbort){delete xhrCallbacks[handle]}}if(isAbort){if(xhr.readyState!==4){xhr.abort()}}else{status=xhr.status;responseHeaders=xhr.getAllResponseHeaders();responses={};xml=xhr.responseXML;if(xml&&xml.documentElement){responses.xml=xml}try{responses.text=xhr.responseText}catch(e){}try{statusText=xhr.statusText}catch(e){statusText=""}if(!status&&s.isLocal&&!s.crossDomain){status=responses.text?200:404}else if(status===1223){status=204}}}}catch(firefoxAccessException){if(!isAbort){complete(-1,firefoxAccessException)}}if(responses){complete(status,statusText,responses,responseHeaders)}};if(!s.async){callback()}else if(xhr.readyState===4){setTimeout(callback,0)}else{handle=++xhrId;if(xhrOnUnloadAbort){if(!xhrCallbacks){xhrCallbacks={};jQuery(window).unload(xhrOnUnloadAbort)}xhrCallbacks[handle]=callback}xhr.onreadystatechange=callback}},abort:function(){if(callback){callback(0,1)}}}}})}var fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rfxnum=new RegExp("^(?:([-+])=|)("+core_pnum+")([a-z%]*)$","i"),rrun=/queueHooks$/,animationPrefilters=[defaultPrefilter],tweeners={"*":[function(prop,value){var end,unit,tween=this.createTween(prop,value),parts=rfxnum.exec(value),target=tween.cur(),start=+target||0,scale=1,maxIterations=20;if(parts){end=+parts[2];unit=parts[3]||(jQuery.cssNumber[prop]?"":"px");if(unit!=="px"&&start){start=jQuery.css(tween.elem,prop,true)||end||1;do{scale=scale||".5";start=start/scale;jQuery.style(tween.elem,prop,start+unit)}while(scale!==(scale=tween.cur()/target)&&scale!==1&&--maxIterations)}tween.unit=unit;tween.start=start;tween.end=parts[1]?start+(parts[1]+1)*end:end}return tween}]};function createFxNow(){setTimeout(function(){fxNow=undefined},0);return fxNow=jQuery.now()}function createTweens(animation,props){jQuery.each(props,function(prop,value){var collection=(tweeners[prop]||[]).concat(tweeners["*"]),index=0,length=collection.length;for(;index-1,props={},curPosition={},curTop,curLeft;if(calculatePosition){curPosition=curElem.position();curTop=curPosition.top;curLeft=curPosition.left}else{curTop=parseFloat(curCSSTop)||0;curLeft=parseFloat(curCSSLeft)||0}if(jQuery.isFunction(options)){options=options.call(elem,i,curOffset)}if(options.top!=null){props.top=options.top-curOffset.top+curTop}if(options.left!=null){props.left=options.left-curOffset.left+curLeft}if("using"in options){options.using.call(elem,props)}else{curElem.css(props)}}};jQuery.fn.extend({position:function(){if(!this[0]){return}var elem=this[0],offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=rroot.test(offsetParent[0].nodeName)?{top:0,left:0}:offsetParent.offset();offset.top-=parseFloat(jQuery.css(elem,"marginTop"))||0;offset.left-=parseFloat(jQuery.css(elem,"marginLeft"))||0;parentOffset.top+=parseFloat(jQuery.css(offsetParent[0],"borderTopWidth"))||0;parentOffset.left+=parseFloat(jQuery.css(offsetParent[0],"borderLeftWidth"))||0;return{top:offset.top-parentOffset.top,left:offset.left-parentOffset.left}},offsetParent:function(){return this.map(function(){var offsetParent=this.offsetParent||document.body;while(offsetParent&&(!rroot.test(offsetParent.nodeName)&&jQuery.css(offsetParent,"position")==="static")){offsetParent=offsetParent.offsetParent}return offsetParent||document.body})}});jQuery.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(method,prop){var top=/Y/.test(prop);jQuery.fn[method]=function(val){return jQuery.access(this,function(elem,method,val){var win=getWindow(elem);if(val===undefined){return win?prop in win?win[prop]:win.document.documentElement[method]:elem[method]}if(win){win.scrollTo(!top?val:jQuery(win).scrollLeft(),top?val:jQuery(win).scrollTop())}else{elem[method]=val}},method,val,arguments.length,null)}});function getWindow(elem){return jQuery.isWindow(elem)?elem:elem.nodeType===9?elem.defaultView||elem.parentWindow:false}jQuery.each({Height:"height",Width:"width"},function(name,type){jQuery.each({padding:"inner"+name,content:type,"":"outer"+name},function(defaultExtra,funcName){jQuery.fn[funcName]=function(margin,value){var chainable=arguments.length&&(defaultExtra||typeof margin!=="boolean"),extra=defaultExtra||(margin===true||value===true?"margin":"border");return jQuery.access(this,function(elem,type,value){var doc;if(jQuery.isWindow(elem)){return elem.document.documentElement["client"+name]}if(elem.nodeType===9){doc=elem.documentElement;return Math.max(elem.body["scroll"+name],doc["scroll"+name],elem.body["offset"+name],doc["offset"+name],doc["client"+name])}return value===undefined?jQuery.css(elem,type,value,extra):jQuery.style(elem,type,value,extra)},type,chainable?margin:undefined,chainable,null)}})});window.jQuery=window.$=jQuery;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return jQuery})}})(window); \ No newline at end of file diff --git a/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/js/speedometer.js b/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/js/speedometer.js index 216eef3..e3f0677 100644 --- a/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/js/speedometer.js +++ b/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/js/speedometer.js @@ -1,5 +1,11 @@ // try not to make changes to the lines below - +// if config file is invalid these values can fallback on defaults +var enableSmallSbSpeedo = enableSmallSbSpeedo || false; +var barSpeedometerMod = barSpeedometerMod || false; +var language = language || 'EN'; +var tempIsF = tempIsF || false; +var sbTemp = sbTemp || false; +var isMPH = isMPH || false; var tripDistCurrent = 0; var prevTripDist = 0; var tripDistBkp = 0; @@ -11,6 +17,7 @@ var speedAvg = 0; var GPSspeedCurrent = 0; var GPSaltCurrent = 0; var FuelEfficiency = 0; +var AvgFuelEfficiency = 0; var TotFuelEfficiency = 0; var idleTimeValue = '0:00'; var engONidleTimeValue = '0:00'; @@ -26,482 +33,705 @@ var totalMoveCount = 0; var direction = "---"; var engineSpeedCurrent = 0; var engineSpeedTop = 0; -var idleValuesHidden = false; - -// Credits for JS font: http://www.cufonfonts.com/ & https://github.com/serezhka/mzd_speedometer -var Cufon=(function(){var m=function(){return m.replace.apply(null,arguments)};var x=m.DOM={ready:(function(){var C=false,E={loaded:1,complete:1};var B=[],D=function(){if(C){return}C=true;for(var F;F=B.shift();F()){}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",D,false);window.addEventListener("pageshow",D,false)}if(!window.opera&&document.readyState){(function(){E[document.readyState]?D():setTimeout(arguments.callee,10)})()}if(document.readyState&&document.createStyleSheet){(function(){try{document.body.doScroll("left");D()}catch(F){setTimeout(arguments.callee,1)}})()}q(window,"load",D);return function(F){if(!arguments.length){D()}else{C?F():B.push(F)}}})(),root:function(){return document.documentElement||document.body}};var n=m.CSS={Size:function(C,B){this.value=parseFloat(C);this.unit=String(C).match(/[a-z%]*$/)[0]||"px";this.convert=function(D){return D/B*this.value};this.convertFrom=function(D){return D/this.value*B};this.toString=function(){return this.value+this.unit}},addClass:function(C,B){var D=C.className;C.className=D+(D&&" ")+B;return C},color:j(function(C){var B={};B.color=C.replace(/^rgba\((.*?),\s*([\d.]+)\)/,function(E,D,F){B.opacity=parseFloat(F);return"rgb("+D+")"});return B}),fontStretch:j(function(B){if(typeof B=="number"){return B}if(/%$/.test(B)){return parseFloat(B)/100}return{"ultra-condensed":0.5,"extra-condensed":0.625,condensed:0.75,"semi-condensed":0.875,"semi-expanded":1.125,expanded:1.25,"extra-expanded":1.5,"ultra-expanded":2}[B]||1}),getStyle:function(C){var B=document.defaultView;if(B&&B.getComputedStyle){return new a(B.getComputedStyle(C,null))}if(C.currentStyle){return new a(C.currentStyle)}return new a(C.style)},gradient:j(function(F){var G={id:F,type:F.match(/^-([a-z]+)-gradient\(/)[1],stops:[]},C=F.substr(F.indexOf("(")).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);for(var E=0,B=C.length,D;E0){E=" "+E}}else{if(B400}if(I==500){I=400}for(var J in G){if(!k(G,J)){continue}J=parseInt(J,10);if(!F||JD){D=J}K.push(J)}if(ID){I=D}K.sort(function(M,L){return(E?(M>=I&&L>=I)?ML:(M<=I&&L<=I)?M>L:Mcufoncanvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}cufoncanvas{position:absolute;text-align:left;}cufon{display:inline-block;position:relative;vertical-align:'+(h?"middle":"text-bottom")+";}cufon cufontext{position:absolute;left:-10000in;font-size:1px;}a cufon{cursor:pointer}}@media print{cufon cufoncanvas{display:none;}}").replace(/;/g,"!important;"));function c(i,j){return a(i,/(?:em|ex|%)$|^[a-z-]+$/i.test(j)?"1em":j)}function a(l,m){if(m==="0"){return 0}if(/px$/i.test(m)){return parseFloat(m)}var k=l.style.left,j=l.runtimeStyle.left;l.runtimeStyle.left=l.currentStyle.left;l.style.left=m.replace("%","em");var i=l.style.pixelLeft;l.style.left=k;l.runtimeStyle.left=j;return i}function f(l,k,j,n){var i="computed"+n,m=k[i];if(isNaN(m)){m=k.get(n);k[i]=m=(m=="normal")?0:~~j.convertFrom(a(l,m))}return m}var g={};function d(p){var q=p.id;if(!g[q]){var n=p.stops,o=document.createElement("cvml:fill"),i=[];o.type="gradient";o.angle=180;o.focus="0";o.method="sigma";o.color=n[0][1];for(var m=1,l=n.length-1;mO){O=K}if(I>N){N=I}if(K 0 && minutes < 10){minutes = "0"+minutes;} + if(seconds < 10){seconds = "0"+seconds;} + if(hours > 0){ + $('.tripTimeValue').text(hours+':'+minutes+':'+seconds); + } else { + $('.tripTimeValue').text(minutes+':'+seconds); } - // -------------------------------------------------------------------------- - // websocket end - - // update trip time - // -------------------------------------------------------------------------- - function updateTripTime(){ - totalTripSeconds++; - var hours = Math.floor(totalTripSeconds / 3600); - var minutes = Math.floor((totalTripSeconds - (hours * 3600)) / 60); - var seconds = totalTripSeconds - (hours * 3600) - (minutes * 60); - - if(hours > 0 && minutes < 10){minutes = "0"+minutes;} - if(seconds < 10){seconds = "0"+seconds;} - if(hours > 0){ - $('.tripTimeValue').text(hours+':'+minutes+':'+seconds); - } else { - $('.tripTimeValue').text(minutes+':'+seconds); - } - if(totalIdleSeconds > 0){ - IdlePercent = Math.round(totalIdleSeconds / totalTripSeconds * 100); - $('.idleTimeValue').html('('+IdlePercent+'%)'+idleTimeValue); - } - if(totalEngineOnSeconds > 0){ - engONidlePercent = Math.round(totalEngineOnSeconds / totalTripSeconds * 100); - $('.engineIdleTimeValue').html('('+engONidlePercent+'%)'+engONidleTimeValue); - } + if(totalIdleSeconds > 0){ + IdlePercent = Math.round(totalIdleSeconds / totalTripSeconds * 100); + $('.idleTimeValue').html('('+IdlePercent+'%)'+idleTimeValue); } - // -------------------------------------------------------------------------- + if(totalEngineOnSeconds > 0){ + engONidlePercent = Math.round(totalEngineOnSeconds / totalTripSeconds * 100); + $('.engineIdleTimeValue').html('('+engONidlePercent+'%)'+engONidleTimeValue); + } + } + // -------------------------------------------------------------------------- - // update idle times + // update idle times + // -------------------------------------------------------------------------- + function updateIdleTime(speed){ + // update stop time // -------------------------------------------------------------------------- - function updateIdleTime(speed){ - // update stop time - // -------------------------------------------------------------------------- - if(speed == 0 && totalTripSeconds > 35){ - totalIdleSeconds++; - var hours = Math.floor(totalIdleSeconds / 3600); - var minutes = Math.floor((totalIdleSeconds - (hours * 3600)) / 60); - var seconds = totalIdleSeconds - (hours * 3600) - (minutes * 60); - - if(hours > 0 && minutes < 10){minutes = "0"+minutes;} - if(seconds < 10){seconds = "0"+seconds;} - if(hours > 0){ - idleTimeValue = (hours+':'+minutes+':'+seconds); - } else { - idleTimeValue = (minutes+':'+seconds); - } - } - - // update engine idle time - // -------------------------------------------------------------------------- - if(speed == 0 && engineSpeedCurrent > 0 && totalTripSeconds > 35){ - totalEngineOnSeconds++; - var hours = Math.floor(totalEngineOnSeconds / 3600); - var minutes = Math.floor((totalEngineOnSeconds - (hours * 3600)) / 60); - var seconds = totalEngineOnSeconds - (hours * 3600) - (minutes * 60); - - if(hours > 0 && minutes < 10){minutes = "0"+minutes;} - if(seconds < 10){seconds = "0"+seconds;} - if(hours > 0){ - engONidleTimeValue = (hours+':'+minutes+':'+seconds); - } else { - engONidleTimeValue = (minutes+':'+seconds); - } - } - // $('.idleTimeValue').html('('+engONidleTimeValue+')'+idleTimeValue); + if(speed === 0 && totalTripSeconds > 35){ + totalIdleSeconds++; + var hours = Math.floor(totalIdleSeconds / 3600); + var minutes = Math.floor((totalIdleSeconds - (hours * 3600)) / 60); + var seconds = totalIdleSeconds - (hours * 3600) - (minutes * 60); + + if(hours > 0 && minutes < 10){minutes = "0"+minutes;} + if(seconds < 10){seconds = "0"+seconds;} + if(hours > 0){ + idleTimeValue = (hours+':'+minutes+':'+seconds); + } else { + idleTimeValue = (minutes+':'+seconds); + } } - // -------------------------------------------------------------------------- - // update vehicle speed + // update engine idle time // -------------------------------------------------------------------------- - function updateVehicleSpeed(currentSpeed){ - var currentSpeed = $.trim(currentSpeed); - if($.isNumeric(currentSpeed)){ - if(isMPH){ - speedCurrent = Math.ceil(currentSpeed * 0.006213712); - } else { - speedCurrent = Math.ceil(currentSpeed * 0.01); - } + if(speed === 0 && engineSpeedCurrent > 0 && totalTripSeconds > 35){ + totalEngineOnSeconds++; + var hoursE = Math.floor(totalEngineOnSeconds / 3600); + var minutesE = Math.floor((totalEngineOnSeconds - (hoursE * 3600)) / 60); + var secondsE = totalEngineOnSeconds - (hoursE * 3600) - (minutesE * 60); + + if(hoursE > 0 && minutesE < 10){minutesE = "0"+minutesE;} + if(secondsE < 10){secondsE = "0"+secondsE;} + if(hoursE > 0){ + engONidleTimeValue = (hoursE+':'+minutesE+':'+secondsE); + } else { + engONidleTimeValue = (minutesE+':'+secondsE); + } + } + // $('.idleTimeValue').html('('+engONidleTimeValue+')'+idleTimeValue); + } + // -------------------------------------------------------------------------- + + // update vehicle speed + // -------------------------------------------------------------------------- + function updateVehicleSpeed(currentSpeed){ + currentSpeed = $.trim(currentSpeed); + if($.isNumeric(currentSpeed)){ + if(isMPH){ + speedCurrent = Math.ceil(currentSpeed * 0.006213712); + } else { + speedCurrent = Math.ceil(currentSpeed * 0.01); + } - // update vehicle top speed - // -------------------------------------------------------------------------- - if(speedCurrent > speedTop){ - if(isMPH){ - $('.topSpeedIndicator').css("transform","rotate("+(-120+speedCurrent*2)+"deg)"); - } else { - $('.topSpeedIndicator').css("transform","rotate("+(-120+speedCurrent)+"deg)"); - } - speedTop = speedCurrent; - $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); - } - // -------------------------------------------------------------------------- - - // update vehicle average speed - // -------------------------------------------------------------------------- - if(speedCurrent > 0){ - totalMoveCount++; - speedSumTotal += speedCurrent; - var avgSpeed = Math.ceil(speedSumTotal / totalMoveCount); - if(speedAvg != avgSpeed){ - speedAvg = avgSpeed; - $('.speedAvgValue').text(speedAvg); - } - } - // -------------------------------------------------------------------------- - - // update vehicle current speed - // -------------------------------------------------------------------------- - if(isMPH){ - $('.speedIndicator').css("transform","rotate("+(-120+speedCurrent*2)+"deg)"); - } else { - $('.speedIndicator').css("transform","rotate("+(-120+speedCurrent)+"deg)"); - } - $('.vehicleSpeed').text(speedCurrent); - // cufon stuff - // -------------------------------------------------------------------------- - Cufon.replace('#digital .vehicleSpeed'); - // -------------------------------------------------------------------------- + // update vehicle top speed + // -------------------------------------------------------------------------- + if(speedCurrent > speedTop){ + speedTop = speedCurrent; + if(barSpeedometerMod) { + $('.speedTopValue').html(speedTop); + } else { + $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); + if(isMPH){ + $('.topSpeedIndicator').css("transform","rotate("+(-120+speedCurrent*2)+"deg)"); + } else { + $('.topSpeedIndicator').css("transform","rotate("+(-120+speedCurrent)+"deg)"); + } } - } - // -------------------------------------------------------------------------- + } + // -------------------------------------------------------------------------- + + // update vehicle average speed + // -------------------------------------------------------------------------- + if(speedCurrent > 0){ + totalMoveCount++; + speedSumTotal += speedCurrent; + var avgSpeed = Math.ceil(speedSumTotal / totalMoveCount); + if(speedAvg !== avgSpeed){ + speedAvg = avgSpeed; + $('.speedAvgValue').text(speedAvg); + } + } + // -------------------------------------------------------------------------- - // update total fuel efficiency - // -------------------------------------------------------------------------- - function updateTotFuelEfficiency(totfuelEff){ - var totfuelEff = $.trim(totfuelEff); - if($.isNumeric(totfuelEff) && totfuelEff != 0){ - if(isMPH){ - // 1 km/L = 2.3521458 US MPG - TotFuelEfficiency = (Math.round(totfuelEff * 2.3521458)/10); - } else { - if(fuelEffunit_kml){ - TotFuelEfficiency = (Math.round(totfuelEff)/10).toFixed(1); - } else { - // converts km/L to L/100km - TotFuelEfficiency = (Math.round(10000 / totfuelEff)/10).toFixed(1); - } - } - if(language == 'DE' || language == 'FR'){ - TotFuelEfficiency = TotFuelEfficiency.toString().replace(".",","); - } - // $('.TotFuelEfficiency').text(TotFuelEfficiency); + // update vehicle current speed + // -------------------------------------------------------------------------- + if(!barSpeedometerMod) { + if(isMPH){ + $('.speedIndicator').css("transform","rotate("+(-120+speedCurrent*2)+"deg)"); + } else { + $('.speedIndicator').css("transform","rotate("+(-120+speedCurrent)+"deg)"); } + } + $('.vehicleSpeed').each(function () { + var $this = $(this); + $({Counter: $this.text()}).animate({Counter: speedCurrent}, { + duration: 950, + easing: 'linear', + step: function (now) { + $this.text(Math.ceil(now)); + speedCurrent = $this.text(); + var speedBar = (isMPH) ? speedCurrent * 1.6 : speedCurrent; + updateSpeedBar(Math.ceil(speedBar)); + }, + complete: function () { + } + }); + }); + // cufon stuff + // -------------------------------------------------------------------------- + Cufon.replace('#digital .vehicleSpeed'); + // -------------------------------------------------------------------------- } - // -------------------------------------------------------------------------- - - // update fuel efficiency - // -------------------------------------------------------------------------- - function updateFuelEfficiency(currentfuelEff){ - var currentfuelEff = $.trim(currentfuelEff); - if($.isNumeric(currentfuelEff) && currentfuelEff != 0){ - if(isMPH){ - // 1 km/L = 2.3521458 US MPG - FuelEfficiency = (Math.round(currentfuelEff * 2.3521458)/10); - } else { - if(fuelEffunit_kml){ - FuelEfficiency = (Math.round(currentfuelEff)/10).toFixed(1); - } else { - // converts km/L to L/100km - FuelEfficiency = (Math.round(10000 / currentfuelEff)/10).toFixed(1); - } - } - if(language == 'DE' || language == 'FR'){ - FuelEfficiency = FuelEfficiency.toString().replace(".",","); - } - $('.Drv1AvlFuelEValue').html('('+TotFuelEfficiency+')'+FuelEfficiency); + } + // -------------------------------------------------------------------------- + + // update total fuel efficiency + // -------------------------------------------------------------------------- + function updateTotFuelEfficiency(totfuelEff){ + totfuelEff = $.trim(totfuelEff); + if($.isNumeric(totfuelEff) && totfuelEff !== 0){ + if(isMPH){ + // 1 km/L = 2.3521458 US MPG + TotFuelEfficiency = (Math.round(totfuelEff * 2.3521458)/10); + } else { + if(fuelEffunit_kml){ + TotFuelEfficiency = parseFloat((Math.round(totfuelEff)/10).toFixed(1)); + } else { + // converts km/L to L/100km + TotFuelEfficiency = parseFloat((Math.round(10000 / totfuelEff)/10).toFixed(1)); } + } + if(language === 'DE' || language === 'FR'){ + TotFuelEfficiency = TotFuelEfficiency.toString().replace(".",","); + } + if(barSpeedometerMod) { + $('.TotFuelEfficiency').html(TotFuelEfficiency); + } } - // -------------------------------------------------------------------------- - - // update trip distance - // -------------------------------------------------------------------------- - function updateTripDist(currtripDist){ - var currtripDist = $.trim(currtripDist); - if($.isNumeric(currtripDist)){ - if(currtripDist > 0){ - tripDistCurrent = parseFloat(currtripDist)+parseFloat(tripDistBkp); - if(currtripDist > 2){ - prevTripDist = tripDistCurrent; - } - } - if(currtripDist >= 0 && currtripDist <= 2 && prevTripDist > 0){ - tripDistBkp = prevTripDist; - } - - if(isMPH){ - tripDist = (tripDistCurrent * 0.02 * 0.6213712).toFixed(2); - } else { - tripDist = (tripDistCurrent * 0.02).toFixed(2); - } - if(language == 'DE' || language == 'FR'){ - tripDist = tripDist.toString().replace(".",","); - } - $('.tripDistance').text(tripDist); + } + // -------------------------------------------------------------------------- + + // update fuel efficiency + // -------------------------------------------------------------------------- + function updateFuelEfficiency(currentfuelEff){ + currentfuelEff = $.trim(currentfuelEff); + if($.isNumeric(currentfuelEff) && currentfuelEff !== 0){ + if(isMPH){ + // 1 km/L = 2.3521458 US MPG + FuelEfficiency = (Math.round(currentfuelEff * 2.3521458)/10); + } else { + if(fuelEffunit_kml){ + FuelEfficiency = parseFloat((Math.round(currentfuelEff)/10).toFixed(1)); + } else { + // converts km/L to L/100km + FuelEfficiency = parseFloat((Math.round(10000 / currentfuelEff)/10).toFixed(1)); } + } + if(language === 'DE' || language === 'FR'){ + FuelEfficiency = FuelEfficiency.toString().replace(".",","); + } + if(barSpeedometerMod) { + $('.Drv1AvlFuelEValue').html(FuelEfficiency); + } else { + $('.Drv1AvlFuelEValue').html('('+TotFuelEfficiency+')'+FuelEfficiency); + } } - // -------------------------------------------------------------------------- - - // update GPS speed - // -------------------------------------------------------------------------- - function updateGPSSpeed(currentGPSSpeed){ - var currentGPSSpeed = $.trim(currentGPSSpeed); - if($.isNumeric(currentGPSSpeed)){ - if(isMPH){ - GPSspeedCurrent = Math.floor(currentGPSSpeed * 0.6213712); - } else { - GPSspeedCurrent = Math.floor(currentGPSSpeed); - } - $('.gpsSpeedValue').text(GPSspeedCurrent); + } + // -------------------------------------------------------------------------- + + // update average fuel efficiency + // -------------------------------------------------------------------------- + function updateAvgFuelEfficiency(avgfuelEff){ + avgfuelEff = $.trim(avgfuelEff); + if($.isNumeric(avgfuelEff) && avgfuelEff !== 0){ + if(isMPH){ + // 1 km/L = 2.3521458 US MPG + AvgFuelEfficiency = (Math.round(avgfuelEff * 2.3521458)/100); + } else { + if(fuelEffunit_kml){ + AvgFuelEfficiency = parseFloat((Math.round(avgfuelEff)/100).toFixed(1)); + } else { + // converts km/L to L/100km + AvgFuelEfficiency = parseFloat(Math.round(10000 / avgfuelEff).toFixed(1)); } + } + if(language === 'DE' || language === 'FR'){ + AvgFuelEfficiency = AvgFuelEfficiency.toString().replace(".",","); + } + $('.avgFuelValue').html(AvgFuelEfficiency); } - // -------------------------------------------------------------------------- + } + // -------------------------------------------------------------------------- + + // update trip distance + // -------------------------------------------------------------------------- + function updateTripDist(currtripDist){ + currtripDist = $.trim(currtripDist); + if($.isNumeric(currtripDist)){ + if(currtripDist > 0){ + tripDistCurrent = parseFloat(currtripDist)+parseFloat(tripDistBkp); + if(currtripDist > 2){ + prevTripDist = tripDistCurrent; + } + } + if(currtripDist >= 0 && currtripDist <= 2 && prevTripDist > 0){ + tripDistBkp = prevTripDist; + } - // update GPS altitude - // -------------------------------------------------------------------------- - function updateGPSAltitude(currentGPSalt){ - var currentGPSalt = $.trim(currentGPSalt); - if($.isNumeric(currentGPSalt) && currentGPSalt != GPSaltCurrent){ - if(isMPH){ - GPSaltCurrent = Math.round(currentGPSalt * 3.28084); - } else { - GPSaltCurrent = Math.round(currentGPSalt); - } + if(isMPH){ + tripDist = parseFloat((tripDistCurrent * 0.02 * 0.6213712).toFixed(2)); + } else { + tripDist = parseFloat((tripDistCurrent * 0.02).toFixed(2)); + } + if(language === 'DE' || language === 'FR'){ + tripDist = tripDist.toString().replace(".",","); + } + $('.tripDistance').text(tripDist); + } + } + // -------------------------------------------------------------------------- + + // update GPS speed + // -------------------------------------------------------------------------- + function updateGPSSpeed(currentGPSSpeed){ + currentGPSSpeed = $.trim(currentGPSSpeed); + if($.isNumeric(currentGPSSpeed)){ + if(isMPH){ + GPSspeedCurrent = Math.floor(currentGPSSpeed * 0.6213712); + } else { + GPSspeedCurrent = Math.floor(currentGPSSpeed); + } + $('.gpsSpeedValue').each(function () { + var $this = $(this); + $({Counter: $this.text()}).animate({Counter: GPSspeedCurrent}, { + duration: 950, + easing: 'linear', + step: function (now) { + $this.text(Math.ceil(now)); + }, + complete: function () { + } + }); + }); + } + } + // -------------------------------------------------------------------------- + + // update GPS altitude + // -------------------------------------------------------------------------- + function updateGPSAltitude(currentGPSalt){ + currentGPSalt = $.trim(currentGPSalt); + if($.isNumeric(currentGPSalt) && currentGPSalt !== GPSaltCurrent){ + if(isMPH){ + GPSaltCurrent = Math.round(currentGPSalt * 3.28084); + } else { + GPSaltCurrent = Math.round(currentGPSalt); + } - // update max altitude - // -------------------------------------------------------------------------- - if(GPSaltCurrent > altGPSmax){ - altGPSmax = GPSaltCurrent; - // $('.gpsAltitudeMax').text(altGPSmax); - } - // -------------------------------------------------------------------------- + // update max altitude + // -------------------------------------------------------------------------- + if(GPSaltCurrent > altGPSmax){ + altGPSmax = GPSaltCurrent; + // $('.gpsAltitudeMax').text(altGPSmax); + } + // -------------------------------------------------------------------------- - // update min altitude - // -------------------------------------------------------------------------- - if(GPSaltCurrent < altGPSmin && GPSaltCurrent != 0){ - altGPSmin = GPSaltCurrent; - // $('.gpsAltitudeMin').text(altGPSmin); - } - // -------------------------------------------------------------------------- + // update min altitude + // -------------------------------------------------------------------------- + if(GPSaltCurrent < altGPSmin && GPSaltCurrent !== 0){ + altGPSmin = GPSaltCurrent; + // $('.gpsAltitudeMin').text(altGPSmin); + } + // -------------------------------------------------------------------------- - if(altGPSmin != 9999){ - $('.gpsAltitudeMinMax').html(altGPSmin+' / '+altGPSmax); - } + if(altGPSmin !== 9999){ + $('.gpsAltitudeMinMax').html(altGPSmin+' / '+altGPSmax); + } - // update current altitude - // -------------------------------------------------------------------------- - $('.gpsAltitudeValue').text(GPSaltCurrent); - // -------------------------------------------------------------------------- - } + // update current altitude + // -------------------------------------------------------------------------- + $('.gpsAltitudeValue').text(GPSaltCurrent); + // -------------------------------------------------------------------------- } - // -------------------------------------------------------------------------- - - // update GPS Heading - // -------------------------------------------------------------------------- - function updateGPSHeading(currentGPShead){ - var currentGPShead = $.trim(currentGPShead); - if($.isNumeric(currentGPShead) && currentGPShead != lastGPSheadingValue){ - // without NavSD - if(noNavSD){ - if(speedCurrent > 0){ - $('.gpsCompassBG').css("transform","rotate("+(-Math.round(currentGPShead))+"deg)"); - // Mazda Infotainment System GPS heading is S = 0/360 degrees even though docs say otherwise, YMMV - headingSwitchValue = Math.round(currentGPShead / 22.5); - // Close enough - switch(headingSwitchValue){ - case 1: direction = "NNE"; break; - case 2: direction = "NE"; break; - case 3: direction = "ENE"; break; - case 4: direction = "E"; break; - case 5: direction = "ESE"; break; - case 6: direction = "SE"; break; - case 7: direction = "SSE"; break; - case 8: direction = "S"; break; - case 9: direction = "SSW"; break; - case 10: direction = "SW"; break; - case 11: direction = "WSW"; break; - case 12: direction = "W"; break; - case 13: direction = "WNW"; break; - case 14: direction = "NW"; break; - case 15: direction = "NNW"; break; - default: direction = "N"; - } - if(language == 'DE'){ - direction = direction.replace(/E/g, "O"); - } - if(language == 'FR'){ - direction = direction.replace(/W/g, "O"); - } - if(language == 'TR'){ - direction = direction.replace(/N/g, "K"); - direction = direction.replace(/S/g, "G"); - direction = direction.replace(/E/g, "D"); - direction = direction.replace(/W/g, "B"); - } - $('.gpsHeading').text(direction); - lastGPSheadingValue = currentGPShead; - } - // with NavSD - } else { - $('.gpsCompassBG').css("transform","rotate("+(-Math.abs(currentGPShead)+180)+"deg)"); - // Mazda Infotainment System GPS heading is S = 0/360 degrees even though docs say otherwise, YMMV - headingSwitchValue = Math.round(currentGPShead / 22.5); - // Close enough - switch(headingSwitchValue){ - case 1: direction = "SSW"; break; - case 2: direction = "SW"; break; - case 3: direction = "WSW"; break; - case 4: direction = "W"; break; - case 5: direction = "WNW"; break; - case 6: direction = "NW"; break; - case 7: direction = "NNW"; break; - case 8: direction = "N"; break; - case 9: direction = "NNE"; break; - case 10: direction = "NE"; break; - case 11: direction = "ENE"; break; - case 12: direction = "E"; break; - case 13: direction = "ESE"; break; - case 14: direction = "SE"; break; - case 15: direction = "SSE"; break; - default: direction = "S"; - } - if(language == 'DE'){ - direction = direction.replace(/E/g, "O"); - } - if(language == 'FR'){ - direction = direction.replace(/W/g, "O"); - } - if(language == 'TR'){ - direction = direction.replace(/N/g, "K"); - direction = direction.replace(/S/g, "G"); - direction = direction.replace(/E/g, "D"); - direction = direction.replace(/W/g, "B"); - } - $('.gpsHeading').text(direction); - lastGPSheadingValue = currentGPShead; - } + } + // -------------------------------------------------------------------------- + + // update GPS Heading + // -------------------------------------------------------------------------- + function updateGPSHeading(currentGPShead){ + currentGPShead = $.trim(currentGPShead); + if($.isNumeric(currentGPShead) && currentGPShead !== lastGPSheadingValue){ + // without NavSD + if(noNavSD){ + if(speedCurrent > 0){ + $('.gpsCompassBG').css("transform","rotate("+(-Math.round(currentGPShead))+"deg)"); + // Mazda Infotainment System GPS heading is S = 0/360 degrees even though docs say otherwise, YMMV + headingSwitchValue = Math.round(currentGPShead / 22.5); + // Close enough + switch(headingSwitchValue){ + case 1: direction = "NNE"; break; + case 2: direction = "NE"; break; + case 3: direction = "ENE"; break; + case 4: direction = "E"; break; + case 5: direction = "ESE"; break; + case 6: direction = "SE"; break; + case 7: direction = "SSE"; break; + case 8: direction = "S"; break; + case 9: direction = "SSW"; break; + case 10: direction = "SW"; break; + case 11: direction = "WSW"; break; + case 12: direction = "W"; break; + case 13: direction = "WNW"; break; + case 14: direction = "NW"; break; + case 15: direction = "NNW"; break; + default: direction = "N"; + } + if(language === 'DE'){ + direction = direction.replace(/E/g, "O"); + } + if(language === 'FR'){ + direction = direction.replace(/W/g, "O"); + } + if(language === 'TR'){ + direction = direction.replace(/N/g, "K"); + direction = direction.replace(/S/g, "G"); + direction = direction.replace(/E/g, "D"); + direction = direction.replace(/W/g, "B"); + } + $('.gpsHeading').text(direction); + lastGPSheadingValue = currentGPShead; } - } - // -------------------------------------------------------------------------- - - // update GPS latitude - // -------------------------------------------------------------------------- - function updateGPSLatitude(currentGPSlat){ - var currentGPSlat = $.trim(currentGPSlat); - if($.isNumeric(currentGPSlat)){ - GPSlatCurrent = parseFloat(currentGPSlat).toFixed(4); - // North - if(GPSlatCurrent > 0){ - $('.gpsLatitudeValue').html(GPSlatCurrent+'°').removeClass("lat_s").addClass("lat_n"); - // South - } else { - $('.gpsLatitudeValue').html(Math.abs(GPSlatCurrent)+'°').removeClass("lat_n").addClass("lat_s"); - } - if(language == 'TR'){ - $('.gpsLatitudeValue').addClass("tr"); - } + // with NavSD + } else { + $('.gpsCompassBG').css("transform","rotate("+(-Math.abs(currentGPShead)+180)+"deg)"); + // Mazda Infotainment System GPS heading is S = 0/360 degrees even though docs say otherwise, YMMV + headingSwitchValue = Math.round(currentGPShead / 22.5); + // Close enough + switch(headingSwitchValue){ + case 1: direction = "SSW"; break; + case 2: direction = "SW"; break; + case 3: direction = "WSW"; break; + case 4: direction = "W"; break; + case 5: direction = "WNW"; break; + case 6: direction = "NW"; break; + case 7: direction = "NNW"; break; + case 8: direction = "N"; break; + case 9: direction = "NNE"; break; + case 10: direction = "NE"; break; + case 11: direction = "ENE"; break; + case 12: direction = "E"; break; + case 13: direction = "ESE"; break; + case 14: direction = "SE"; break; + case 15: direction = "SSE"; break; + default: direction = "S"; + } + if(language === 'DE'){ + direction = direction.replace(/E/g, "O"); + } + if(language === 'FR'){ + direction = direction.replace(/W/g, "O"); } + if(language === 'TR'){ + direction = direction.replace(/N/g, "K"); + direction = direction.replace(/S/g, "G"); + direction = direction.replace(/E/g, "D"); + direction = direction.replace(/W/g, "B"); + } + $('.gpsHeading').text(direction); + lastGPSheadingValue = currentGPShead; + } } - // -------------------------------------------------------------------------- + } + // -------------------------------------------------------------------------- + + // update GPS latitude + // -------------------------------------------------------------------------- + function updateGPSLatitude(currentGPSlat){ + currentGPSlat = $.trim(currentGPSlat); + if($.isNumeric(currentGPSlat)){ + GPSlatCurrent = parseFloat(currentGPSlat).toFixed(4); + // North + if(GPSlatCurrent > 0){ + $('.gpsLatitudeValue').html(GPSlatCurrent+'°').removeClass("lat_s").addClass("lat_n"); + // South + } else { + $('.gpsLatitudeValue').html(Math.abs(GPSlatCurrent)+'°').removeClass("lat_n").addClass("lat_s"); + } + if(language === 'TR'){ + $('.gpsLatitudeValue').addClass("tr"); + } + } + } + // -------------------------------------------------------------------------- + + // update GPS longitude + // -------------------------------------------------------------------------- + function updateGPSLongitude(currentGPSlon){ + currentGPSlon = $.trim(currentGPSlon); + if($.isNumeric(currentGPSlon)){ + GPSlonCurrent = parseFloat(currentGPSlon).toFixed(4); + // East + if(GPSlonCurrent > 0){ + $('.gpsLongitudeValue').html(GPSlonCurrent+'°').removeClass("lon_w").addClass("lon_e"); + // West + } else { + $('.gpsLongitudeValue').html(Math.abs(GPSlonCurrent)+'°').removeClass("lon_e").addClass("lon_w"); + } + if(language === 'DE'){ + $('.gpsLongitudeValue').addClass("de"); + } + if(language === 'FR'){ + $('.gpsLongitudeValue').addClass("fr"); + } + if(language === 'TR'){ + $('.gpsLongitudeValue').addClass("tr"); + } + } + } + // -------------------------------------------------------------------------- + + // Update Engine Speed + // -------------------------------------------------------------------------- + function updateEngineSpeed(currentEngineSpeed){ + currentEngineSpeed = $.trim(currentEngineSpeed); + if($.isNumeric(currentEngineSpeed)){ + engineSpeedCurrent = Math.round(currentEngineSpeed * 2); + if(engineSpeedCurrent <= 8000){ + + // update engine top speed + // -------------------------------------------------------------------------- + if(engineSpeedCurrent > engineSpeedTop){ + $('.topRPMIndicator').css("transform","rotate("+(-145-engineSpeedCurrent*0.01)+"deg)"); + engineSpeedTop = engineSpeedCurrent; + $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); + } + // -------------------------------------------------------------------------- - // update GPS longitude - // -------------------------------------------------------------------------- - function updateGPSLongitude(currentGPSlon){ - var currentGPSlon = $.trim(currentGPSlon); - if($.isNumeric(currentGPSlon)){ - GPSlonCurrent = parseFloat(currentGPSlon).toFixed(4); - // East - if(GPSlonCurrent > 0){ - $('.gpsLongitudeValue').html(GPSlonCurrent+'°').removeClass("lon_w").addClass("lon_e"); - // West - } else { - $('.gpsLongitudeValue').html(Math.abs(GPSlonCurrent)+'°').removeClass("lon_e").addClass("lon_w"); - } - if(language == 'DE'){ - $('.gpsLongitudeValue').addClass("de"); - } - if(language == 'FR'){ - $('.gpsLongitudeValue').addClass("fr"); - } - if(language == 'TR'){ - $('.gpsLongitudeValue').addClass("tr"); - } + // update engine speed + // -------------------------------------------------------------------------- + if(!barSpeedometerMod){ + $('.RPMIndicator').css("transform","rotate("+(-145-engineSpeedCurrent*0.01)+"deg)"); } + $('.engineSpeedValue').each(function () { + var $this = $(this); + $({Counter: $this.text()}).animate({Counter: engineSpeedCurrent}, { + duration: 950, + easing: 'linear', + step: function (now) { + $this.text(Math.ceil(now)); + }, + complete: function () { + } + }); + }); + // -------------------------------------------------------------------------- + } } - // -------------------------------------------------------------------------- + } + // -------------------------------------------------------------------------- + + // Update Outside Temperature + // -------------------------------------------------------------------------- + function updateOutsideTemp(outTemp) { + outTemp = $.trim(outTemp); + if ($.isNumeric(outTemp)) { + outsideTemp = outTemp -= 40; + if(tempIsF) { + outTemp = outTemp * 1.8 + 32; + outsideTemp = parseFloat(outTemp.toFixed(1)); + } + $('.outsideTempValue').html(outsideTemp + "°"); + } + } + // -------------------------------------------------------------------------- + + // Update Intake Temperature + // -------------------------------------------------------------------------- + function updateIntakeTemp(inTemp) { + inTemp = $.trim(inTemp); + if ($.isNumeric(inTemp)) { + intakeTemp = inTemp -= 40; + if(tempIsF) { + inTemp = inTemp * 1.8 + 32; + intakeTemp = parseFloat(inTemp.toFixed(1)); + } + $('.intakeTempValue').html(intakeTemp + "°"); + } + } + // -------------------------------------------------------------------------- + + // Update Coolant Temperature + // -------------------------------------------------------------------------- + function updateCoolantTemp(coolTemp) { + coolTemp = $.trim(coolTemp); + if ($.isNumeric(coolTemp)) { + coolantTemp = coolTemp -= 40; + if(tempIsF) { + coolTemp = coolTemp * 1.8 + 32; + coolantTemp = parseFloat(coolTemp.toFixed(1)); + } + $('.coolantTempValue').html(coolantTemp + "°"); + } + } + // -------------------------------------------------------------------------- + + // Update Gear Position + // -------------------------------------------------------------------------- + function updateGearPos(gearPos) { + gearPos = $.trim(gearPos); + if ($.isNumeric(gearPos)) { + lastGearPositionValue = gearPos; + $('.gearPositionValue').text(gearPos); + } + } + // -------------------------------------------------------------------------- + + // Update Fuel Gauge + // -------------------------------------------------------------------------- + function updateFuelGauge(fuelGaugeVal) { + fuelGaugeVal = $.trim(fuelGaugeVal); + if ($.isNumeric(fuelGaugeVal)) { + lastFuelGaugeValue = Math.round(fuelGaugeVal/2); + $('.fuelGaugeValue').text(lastFuelGaugeValue+"%"); + } + } + // -------------------------------------------------------------------------- - // update Engine Speed - // -------------------------------------------------------------------------- - function updateEngineSpeed(currentEngineSpeed){ - var currentEngineSpeed = $.trim(currentEngineSpeed); - if($.isNumeric(currentEngineSpeed)){ - engineSpeedCurrent = Math.round(currentEngineSpeed * 2); - if(engineSpeedCurrent <= 8000){ - - // update engine top speed - // -------------------------------------------------------------------------- - if(engineSpeedCurrent > engineSpeedTop){ - $('.topRPMIndicator').css("transform","rotate("+(-145-engineSpeedCurrent*0.01)+"deg)"); - engineSpeedTop = engineSpeedCurrent; - $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); - } - // -------------------------------------------------------------------------- - - // update engine speed - // -------------------------------------------------------------------------- - $('.RPMIndicator').css("transform","rotate("+(-145-engineSpeedCurrent*0.01)+"deg)"); - // -------------------------------------------------------------------------- - } + setInterval(function (){ + updateTripTime(); + if(speedCurrent === 0){ + updateIdleTime(speedCurrent); + } + if ((enableSmallSbSpeedo) && (!$('#SbSpeedo').hasClass('parking'))) { + var visibleIcons = 0; + $('.StatusBarCtrlIconContainer .StatusBarCtrlIcon').each(function(index) { + if($(this).is(':visible')){ + visibleIcons++; } + }); + if(visibleIcons > 3){ + $('#SbSpeedo').addClass('morespace'); + } else { + $('#SbSpeedo').removeClass('morespace'); + } } - // -------------------------------------------------------------------------- - - setInterval(function (){ - updateTripTime(); - if(speedCurrent == 0){ - updateIdleTime(speedCurrent); + }, 1000); + setInterval(function (){ + var sbSpeedoVal1 = (sbTemp) ? $('#SbSpeedo .outsideTempValue') : $('#SbSpeedo .gpsHeading'); + var sbSpeedoVal2 = (sbTemp) ? $('#SbSpeedo .Drv1AvlFuelEValue') : $('#SbSpeedo .gpsAltitudeValue'); + if((enableSmallSbSpeedo) && (!$('#SbSpeedo').hasClass('parking'))){ + sbSpeedoVal1.fadeOut(); + sbSpeedoVal2.fadeIn(); + setTimeout(function(){ + sbSpeedoVal2.fadeOut(); + sbSpeedoVal1.fadeIn(); + }, 2000); + } + }, 4000); + + setTimeout(function(){ + retrievedata('vehicleData'); + retrievedata('envData'); + }, 15000); + + function updateSpeedBar(speed){ + if(barSpeedometerMod) { + for(var i = 150; i >= 105; i -= 5){ + var barClassName = '.speedBar_' + i; + if(speed >= i){ + switch(i){ + case 150: backgroundColor = '#FF0000'; break; + case 145: backgroundColor = '#FF0000'; break; + case 140: backgroundColor = '#FF0000'; break; + case 135: backgroundColor = '#FF0000'; break; + case 130: backgroundColor = '#FF0000'; break; + case 125: backgroundColor = '#FE2E2E'; break; + case 120: backgroundColor = '#FF451C'; break; + case 115: backgroundColor = '#FF6932'; break; + case 110: backgroundColor = '#FE9A2E'; break; + case 105: backgroundColor = '#FECC20'; break; + } + $(barClassName).css({'background-color' : backgroundColor}); + } else { + $(barClassName).css({'background-color' : 'transparent'}); + } } - if ((enableSmallSbSpeedo) && (!$('#SbSpeedo').hasClass('parking'))) { - var visibleIcons = 0; - $('.StatusBarCtrlIconContainer .StatusBarCtrlIcon').each(function(index) { - if($(this).is(':visible')) - visibleIcons++; - }); - if(visibleIcons > 3){ - $('#SbSpeedo').addClass('morespace'); + for(var j = 100; j >= 55; j -= 5){ + var barClassName2 = '.speedBar_' + j; + if(speed >= j){ + switch(j){ + case 100: backgroundColor = '#FFED2E'; break; + case 95: backgroundColor = '#FFF430'; break; + case 90: backgroundColor = '#F7FE2E'; break; + case 85: backgroundColor = '#C8FE2E'; break; + case 80: backgroundColor = '#9AFE2E'; break; + case 75: backgroundColor = '#64FE2E'; break; + case 70: backgroundColor = '#2EFE2E'; break; + case 65: backgroundColor = '#2EFE64'; break; + case 60: backgroundColor = '#2EFE9A'; break; + case 55: backgroundColor = '#58FAD0'; break; + } + $(barClassName2).css({'background-color' : backgroundColor}); } else { - $('#SbSpeedo').removeClass('morespace'); + $(barClassName2).css({'background-color' : 'transparent'}); } } - }, 1000); - - setInterval(function (){ - if((enableSmallSbSpeedo) && ($("#speedometerContainer").length == 0) && (!$('#SbSpeedo').hasClass('parking'))){ - $('#SbSpeedo .gpsHeading').fadeOut(); - $('#SbSpeedo .gpsAltitudeValue').fadeIn(); - setTimeout(function(){ - $('#SbSpeedo .gpsAltitudeValue').fadeOut(); - $('#SbSpeedo .gpsHeading').fadeIn(); - }, 2000); + for(var k = 50; k >= 5; k -= 5){ + var barClassName3 = '.speedBar_' + k; + if(speed >= k){ + switch(k){ + case 50: backgroundColor = '#58FAD0'; break; + case 45: backgroundColor = '#58FAD0'; break; + case 40: backgroundColor = '#58FAD0'; break; + case 35: backgroundColor = '#58FAD0'; break; + case 30: backgroundColor = '#58FAD0'; break; + case 25: backgroundColor = '#81F7D8'; break; + case 20: backgroundColor = '#A9F5E1'; break; + case 15: backgroundColor = '#CEF6EC'; break; + case 10: backgroundColor = '#E0F8F1'; break; + case 5: backgroundColor = '#EFFBF8'; break; + } + $(barClassName3).css({'background-color' : backgroundColor}); + } else { + $(barClassName3).css({'background-color' : 'transparent'}); } - }, 4000); - - setTimeout(function(){ - retrievedata('vehicleSpeed'); - retrievedata('gpsdata'); - retrievedata('totfuelEfficiency'); - retrievedata('fuelEfficiency'); - retrievedata('drivedist'); - retrievedata('engineSpeed'); - }, 35000); - + } + } + } }); diff --git a/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/js/speedometerUpdate.js b/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/js/speedometerUpdate.js index 854edb6..d9facb2 100644 --- a/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/js/speedometerUpdate.js +++ b/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/js/speedometerUpdate.js @@ -1,200 +1,294 @@ function updateSpeedoApp(){ - + $('#vehdataMainDiv fieldset[class*="vehDataBar"].pos0').remove(); if(enableSmallSbSpeedo){ $('#SbSpeedo').fadeIn(); } + if(barSpeedometerMod){ + $('.vehDataMain.pos0').click(function(){ + (currDataBar > 2) ? currDataBar = 1 : currDataBar++; + $('[class*="vehDataBar"]').removeClass('activeDataBar'); + $('.vehDataBar' + currDataBar).addClass('activeDataBar'); + }) + } else { + // touch to toggle Analog / Digital + // -------------------------------------------------------------------------- + $('#analog').click(function(){ + $('#analog').hide(); + $('#digital').show(); + }); - $('.StatusBarCtrlDomainIcon').css("background-image", "url('/jci/gui/apps/_speedometer/IcnSbnSpeedometer.png')"); - - // touch to togle Analog / Digital - // -------------------------------------------------------------------------- - $('#analog').click(function(){ - $('#analog').hide(); - $('#digital').show(); - }); - - $('#digital').click(function(){ - $('#digital').hide(); - $('#analog').show(); -}); - // Hide Ilde Valuse and enlarge the fonts of the other values - // -------------------------------------------------------------------------- - $('.speedTopFieldSet').click(function(){ - $('#valuetable').toggleClass('alt1'); - }); - // Reset Values to 0 values are updated right away + $('#digital').click(function(){ + $('#digital').hide(); + $('#analog').show(); + }); + // Hide Idle Values and enlarge the fonts of the other values + // -------------------------------------------------------------------------- + $('#speedTopFieldSet').click(function(){ + $('#valuetable').toggleClass('alt1'); + }); + // Show alternate values + // -------------------------------------------------------------------------- + $('#speedAvgFieldSet').click(function(){ + $('#valuetable').toggleClass('alt0'); + }); + // Reset Values to 0 values are updated right away + // -------------------------------------------------------------------------- + } + $('#tripTimeFieldSet').click(function(){ + tripDistCurrent = 0; + prevTripDist = 0; + tripDistBkp = 0; + tripDist = 0; + speedCurrent = 0; + speedSumTotal = 0; + speedTop = 0; + speedAvg = 0; + GPSspeedCurrent = 0; + GPSaltCurrent = 0; + idleTimeValue = '0:00'; + engONidleTimeValue = '0:00'; + totalTripSeconds = 0; + totalIdleSeconds = 0; + totalEngineOnSeconds = 0; + totalMoveCount = 0; + engineSpeedCurrent = 0; + engineSpeedTop = 0; + }); + // Toggle Fuel Efficiency or Temperature + // -------------------------------------------------------------------------- + var fuelToggler = (barSpeedometerMod) ? $('.vehDataMain.pos3') : $('#Drv1AvlFuelEFieldSet'); + fuelToggler.click(function(){ + (isMPH) ? toggleTempUnit() : toggleFuelEffUnit(); + }); + // Toggle km/L - L/100km + // -------------------------------------------------------------------------- + function toggleFuelEffUnit() { + fuelEffunit_kml = !fuelEffunit_kml; + $('legend .fuelEffUnit').html((fuelEffunit_kml) ? 'km/L ∅' : 'L/100 km ∅'); + } + // Toggle Temperature (C & F) + // -------------------------------------------------------------------------- + function toggleTempUnit(){ + tempIsF = !tempIsF; + if(tempIsF) { + $('.tempUnit').html('F'); + $('.intakeTempValue').html(C_2_F(intakeTemp)+'°'); + $('.coolantTempValue').html(C_2_F(coolantTemp)+'°'); + $('.outsideTempValue').html(C_2_F(outsideTemp)+'°'); + } else { + $('.tempUnit').html('C'); + $('.intakeTempValue').html(F_2_C(intakeTemp)+'°'); + $('.coolantTempValue').html(F_2_C(coolantTemp)+'°'); + $('.outsideTempValue').html(F_2_C(outsideTemp)+'°'); + } + } + /** Fahrenheit to Celsius ** T(°C) = (T(°F) - 32) / 1.8 **/ + function F_2_C(temp) { + return parseFloat(((temp-32)/1.8).toFixed(2)); + } + /** Celsius to Fahrenheit ** T(°F) = T(°C) × 1.8 + 32 **/ + function C_2_F(temp) { + return parseFloat((temp*1.8+32).toFixed(2)); + } + // Toggle kmh / MPH // -------------------------------------------------------------------------- - $('.tripTimeFieldSet').click(function(){ - tripDistCurrent = 0; - prevTripDist = 0; - tripDistBkp = 0; - tripDist = 0; - speedCurrent = 0; - speedSumTotal = 0; - speedTop = 0; - speedAvg = 0; - GPSspeedCurrent = 0; - GPSaltCurrent = 0; - idleTimeValue = '0:00'; - engONidleTimeValue = '0:00'; - totalTripSeconds = 0; - totalIdleSeconds = 0; - totalEngineOnSeconds = 0; - totalMoveCount = 0; - engineSpeedCurrent = 0; - engineSpeedTop = 0; - }); + var typeToggler = (barSpeedometerMod) ? $('.vehDataMain.pos1') : $('#tripDistFieldSet'); + typeToggler.click(ToggleSpeedoType); - // touch to togle kmh / MPH - // -------------------------------------------------------------------------- - $('#valuetable .tripDistFieldSet').click(function(){ + function ToggleSpeedoType() { if(isMPH){ isMPH = false; speedSumTotal = Math.round(speedSumTotal * 1.609344); speedTop = Math.round(speedTop * 1.609344); speedAvg = Math.round(speedAvg * 1.609344); - $('#speedometerContainer .vehicleSpeed').css("background","url('/jci/gui/apps/_speedometer/templates/SpeedoMeter/images/currentSpeed.png') no-repeat scroll center center transparent"); - $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); + $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); $('.speedAvgValue').text(speedAvg); $('.speedUnit').text('km/h'); - $('#speedometerDial').removeClass('mph'); - $('.tripDistFieldSet').removeClass('mphbu'); - $('.tripDistFieldSet legend span').text('(km)'); - $('.gpsAltitudeFieldSet legend span').text('(m)'); + $('#tripDistFieldSet').removeClass('mphbu'); + $('legend .distUnit').text('km'); + $('legend .altUnit').text('m'); if(fuelEffunit_kml){ - $('.Drv1AvlFuelEFieldSet legend').html('km/L ∅'); + $('legend .fuelEffUnit').html('km/L ∅'); } else { - $('.Drv1AvlFuelEFieldSet legend').html('L/100 km ∅'); + $('legend .fuelEffUnit').html('L/100 km ∅'); } - $('#textSpeed20').text('20'); - $('#textSpeed40').text('40'); - $('#textSpeed60').text('60'); - $('#textSpeed80').text('80'); - $('#textSpeed100').text('100'); - $('#textSpeed100').removeClass('mph'); - $('#textSpeed120').text('120'); - $('#textSpeed120').removeClass('mph'); - $('#textSpeed140').text('140'); - $('#textSpeed140').removeClass('mph'); - $('#textSpeed160').text('160'); - $('#textSpeed180').text('180'); - $('#textSpeed200').text('200'); - $('#textSpeed220').text('220'); - $('#textSpeed240').text('240'); - $('.topSpeedIndicator').css("transform","rotate("+(-120+speedTop)+"deg)"); + if(!barSpeedometerMod) { + $('#speedometerDial').removeClass('mph'); + $('#speedometerContainer .vehicleSpeed').css("background","url('apps/_speedometer/templates/SpeedoMeter/images/currentSpeed.png') no-repeat scroll center center transparent"); + $('#textSpeed20').text('20'); + $('#textSpeed40').text('40'); + $('#textSpeed60').text('60'); + $('#textSpeed80').text('80'); + $('#textSpeed100').text('100'); + $('#textSpeed100').removeClass('mph'); + $('#textSpeed120').text('120'); + $('#textSpeed120').removeClass('mph'); + $('#textSpeed140').text('140'); + $('#textSpeed140').removeClass('mph'); + $('#textSpeed160').text('160'); + $('#textSpeed180').text('180'); + $('#textSpeed200').text('200'); + $('#textSpeed220').text('220'); + $('#textSpeed240').text('240'); + $('.topSpeedIndicator').css("transform","rotate("+(-120+speedTop)+"deg)"); + } } else { isMPH = true; speedSumTotal = Math.round(speedSumTotal * 0.6213712); speedTop = Math.round(speedTop * 0.6213712); speedAvg = Math.round(speedAvg * 0.6213712); - $('#speedometerContainer .vehicleSpeed').css("background","url('/jci/gui/apps/_speedometer/templates/SpeedoMeter/images/currentSpeed_mpg.png') no-repeat scroll center center transparent"); - $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); $('.speedAvgValue').text(speedAvg); $('.speedUnit').text('mph'); $('#speedometerDial').addClass('mph'); - $('.tripDistFieldSet').addClass('mphbu'); - $('.tripDistFieldSet legend span').text('(mi)'); - $('.gpsAltitudeFieldSet legend span').text('(ft)'); - $('.Drv1AvlFuelEFieldSet legend').html('MPG ∅'); - $('#textSpeed20').text('10'); - $('#textSpeed40').text('20'); - $('#textSpeed60').text('30'); - $('#textSpeed80').text('40'); - $('#textSpeed100').text('50'); - $('#textSpeed100').addClass('mph'); - $('#textSpeed120').text('60'); - $('#textSpeed120').addClass('mph'); - $('#textSpeed140').text('70'); - $('#textSpeed140').addClass('mph'); - $('#textSpeed160').text('80'); - $('#textSpeed180').text('90'); - $('#textSpeed200').text('100'); - $('#textSpeed220').text('110'); - $('#textSpeed240').text('120'); - $('.topSpeedIndicator').css("transform","rotate("+(-120+speedTop*2)+"deg)"); + $('#tripDistFieldSet').addClass('mphbu'); + $('legend .distUnit').text('mi'); + $('legend .altUnit').text('ft'); + $('legend .fuelEffUnit').html('MPG ∅'); + if(barSpeedometerMod) { + $('.speedTopValue').html(speedTop); + $('.engineSpeedTopValue').html(engineSpeedTop); + } else { + $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); + $('#speedometerContainer .vehicleSpeed').css("background","url('apps/_speedometer/templates/SpeedoMeter/images/currentSpeed_mpg.png') no-repeat scroll center center transparent"); + $('#textSpeed20').text('10'); + $('#textSpeed40').text('20'); + $('#textSpeed60').text('30'); + $('#textSpeed80').text('40'); + $('#textSpeed100').text('50'); + $('#textSpeed100').addClass('mph'); + $('#textSpeed120').text('60'); + $('#textSpeed120').addClass('mph'); + $('#textSpeed140').text('70'); + $('#textSpeed140').addClass('mph'); + $('#textSpeed160').text('80'); + $('#textSpeed180').text('90'); + $('#textSpeed200').text('100'); + $('#textSpeed220').text('110'); + $('#textSpeed240').text('120'); + $('.topSpeedIndicator').css("transform","rotate("+(-120+speedTop*2)+"deg)"); + } } - }); + } + // Toggle Background + // -------------------------------------------------------------------------- + var bgToggler = (barSpeedometerMod) ? $('.vehDataMain.pos4') : $('#UnitValue'); + bgToggler.click(toggleSpeedometerBackground); + function toggleSpeedometerBackground() { + if ($('#speedometerContainer').css('background-image').indexOf('speedometer_background') !== -1) { + $('#speedometerContainer').css("background-image",""); + } else { + $('#speedometerContainer').css("background-image","url(apps/_speedometer/templates/SpeedoMeter/images/speedometer_background.jpg)"); + } + } + // ********************************************************************************************************************* + // ********************************************************************************************************************* // language specific labels - + // ********************************************************************************************************************* + // ********************************************************************************************************************* // Español if(language === 'ES'){ - // $('.gpsSpeedFieldSet legend').html('Vel. GPS'); - $('.tripDistFieldSet legend').html('Dist. de viaje (km)'); - $('.speedTopFieldSet legend').html('Vel. Max'); - $('.speedAvgFieldSet legend').html('Vel. ∅'); - $('.gpsAltitudeFieldSet legend').html('Altitud (m)'); - // $('.gpsAltitudeMinFieldSet legend').html('Altitud min'); - // $('.gpsAltitudeMaxFieldSet legend').html('Altitud max'); - $('.gpsAltitudeMinMaxFieldSet legend').html('min/max'); - $('.gpsHeadingFieldSet legend').html('Dirección'); - $('.gpsLatitudeFieldSet legend').html('Lat.'); - $('.gpsLongitudeFieldSet legend').html('Lon.'); - $('.tripTimeFieldSet legend').html('T. Total'); - $('.idleTimeFieldSet legend').html('T. Descanso'); - $('.engIdleTimeFieldSet legend').html('Engine Idle'); + // $('#gpsSpeedFieldSet legend').html('Vel. GPS'); + $('#tripDistFieldSet legend').html('Dist. de viaje (km)'); + $('#speedTopFieldSet legend').html('Vel. Max'); + $('#speedAvgFieldSet legend').html('Vel. ∅'); + $('#gpsAltitudeFieldSet legend').html('Altitud (m)'); + // $('#gpsAltitudeMinFieldSet legend').html('Altitud min'); + // $('#gpsAltitudeMaxFieldSet legend').html('Altitud max'); + $('#gpsAltitudeMinMaxFieldSet legend').html('min/max'); + $('#gpsHeadingFieldSet legend').html('Dirección'); + $('#gpsLatitudeFieldSet legend').html('Lat.'); + $('#gpsLongitudeFieldSet legend').html('Lon.'); + $('#tripTimeFieldSet legend').html('T. Total'); + $('#idleTimeFieldSet legend').html('T. Descanso'); + $('#engIdleTimeFieldSet legend').html('Engine Idle'); + $('#fuelGaugeFieldSet legend').html('Fuel Gauge'); + $('#gearPositionFieldSet legend').html('Gear Position'); + $('#outsideTempFieldSet legend').html('Outside )'); + $('#intakeTempFieldSet legend').html('Intake )'); + $('#coolantTempFieldSet legend').html('Coolant )'); } // Polskie else if(language === 'PL'){ - // $('.gpsSpeedFieldSet legend').html('PrÄ™dkość GPS'); - $('.tripDistFieldSet legend').html('Dystans (km)'); - $('.speedTopFieldSet legend').html('Prędkość maks.'); - $('.speedAvgFieldSet legend').html('Prędkość śr.'); - $('.gpsAltitudeFieldSet legend').html('Wysokość n.p.m. (m)'); - $('.gpsAltitudeMinMaxFieldSet legend').html('min./maks.'); - $('.gpsLatitudeFieldSet legend').html('Szer. geogr.'); - $('.gpsLongitudeFieldSet legend').html('Dł. geogr.'); - $('.tripTimeFieldSet legend').html('Czas całk.'); - $('.idleTimeFieldSet legend').html('Czas bezcz.'); - $('.engIdleTimeFieldSet legend').html('Engine Idle'); + // $('#gpsSpeedFieldSet legend').html('PrÄ™dkość GPS'); + $('#tripDistFieldSet legend').html('Dystans (km)'); + $('#speedTopFieldSet legend').html('Prędkość maks.'); + $('#speedAvgFieldSet legend').html('Prędkość śr.'); + $('#gpsAltitudeFieldSet legend').html('Wysokość n.p.m. (m)'); + $('#gpsAltitudeMinMaxFieldSet legend').html('min./maks.'); + $('#gpsLatitudeFieldSet legend').html('Szer. geogr.'); + $('#gpsLongitudeFieldSet legend').html('Dł. geogr.'); + $('#tripTimeFieldSet legend').html('Czas całk.'); + $('#idleTimeFieldSet legend').html('Czas bezcz.'); + $('#engIdleTimeFieldSet legend').html('Engine Idle'); + $('#fuelGaugeFieldSet legend').html('Fuel Gauge'); + $('#gearPositionFieldSet legend').html('Gear Position'); + $('#outsideTempFieldSet legend').html('Outside )'); + $('#intakeTempFieldSet legend').html('Intake )'); + $('#coolantTempFieldSet legend').html('Coolant )'); } // Slovenský else if(language === 'SK'){ - $('.tripDistFieldSet legend').html('Vzdialenosť (km)'); - $('.speedTopFieldSet legend').html('Najvyššia rých.'); - $('.speedAvgFieldSet legend').html('Priemerná rýchlosť'); - $('.gpsAltitudeFieldSet legend').html('Nadmorská výška (m)'); - $('.gpsAltitudeMinMaxFieldSet legend').html('min/max'); - $('.gpsLatitudeFieldSet legend').html('Zem. šírka'); - $('.gpsLongitudeFieldSet legend').html('Zem. dĺžka'); - $('.tripTimeFieldSet legend').html('Celkový čas'); - $('.idleTimeFieldSet legend').html('Doba nečinn.'); - $('.engIdleTimeFieldSet legend').html('Engine Idle'); + $('#tripDistFieldSet legend').html('Vzdialenosť (km)'); + $('#speedTopFieldSet legend').html('Najvyššia rých.'); + $('#speedAvgFieldSet legend').html('Priemerná rýchlosť'); + $('#gpsAltitudeFieldSet legend').html('Nadmorská výška (m)'); + $('#gpsAltitudeMinMaxFieldSet legend').html('min/max'); + $('#gpsLatitudeFieldSet legend').html('Zem. šírka'); + $('#gpsLongitudeFieldSet legend').html('Zem. dĺžka'); + $('#tripTimeFieldSet legend').html('Celkový čas'); + $('#idleTimeFieldSet legend').html('Doba nečinn.'); + $('#engIdleTimeFieldSet legend').html('Engine Idle'); + $('#fuelGaugeFieldSet legend').html('Fuel Gauge'); + $('#gearPositionFieldSet legend').html('Gear Position'); + $('#outsideTempFieldSet legend').html('Outside )'); + $('#intakeTempFieldSet legend').html('Intake )'); + $('#coolantTempFieldSet legend').html('Coolant )'); } // Deutsch else if(language === 'DE'){ - // $('.gpsSpeedFieldSet legend').html('Geschw. GPS'); - $('.tripDistFieldSet legend').html('Strecke (km)'); - $('.speedTopFieldSet legend').html('Geschw. max'); - $('.speedAvgFieldSet legend').html('Geschw. ∅'); - $('.gpsAltitudeFieldSet legend').html('Höhe ü. NN (m)'); - $('.gpsAltitudeMinMaxFieldSet legend').html('min/max'); - $('.gpsLatitudeFieldSet legend').html('Breite'); - $('.gpsLongitudeFieldSet legend').html('Länge'); - $('.tripTimeFieldSet legend').html('Gesamtzeit'); - $('.idleTimeFieldSet legend').html('Standzeit'); - $('.engIdleTimeFieldSet legend').html('Leerlaufzeit'); + // $('#gpsSpeedFieldSet legend').html('Geschw. GPS'); + $('#tripDistFieldSet legend').html('Strecke (km)'); + $('#speedTopFieldSet legend').html('Geschw. max'); + $('#speedAvgFieldSet legend').html('Geschw. ∅'); + $('#gpsAltitudeFieldSet legend').html('Höhe ü. NN (m)'); + $('#gpsAltitudeMinMaxFieldSet legend').html('min/max'); + $('#gpsLatitudeFieldSet legend').html('Breite'); + $('#gpsLongitudeFieldSet legend').html('Länge'); + $('#tripTimeFieldSet legend').html('Gesamtzeit'); + $('#idleTimeFieldSet legend').html('Standzeit'); + $('#engIdleTimeFieldSet legend').html('Leerlaufzeit'); $('.NorthEast').html('NO'); $('.East').html('O'); $('.SouthEast').html('SO'); $('#rpmDial .unit').text('U/min'); + $('#fuelGaugeFieldSet legend').html('Fuel Gauge'); + $('#gearPositionFieldSet legend').html('Gear Position'); + $('#outsideTempFieldSet legend').html('Outside )'); + $('#intakeTempFieldSet legend').html('Intake )'); + $('#coolantTempFieldSet legend').html('Coolant )'); } // Türk else if(language === 'TR'){ - $('.tripDistFieldSet legend').html('Gidilen Yol (km)'); - $('.speedTopFieldSet legend').html('Maksimum Hız'); - $('.speedAvgFieldSet legend').html('Ortalama Hız'); - $('.gpsAltitudeFieldSet legend').html('Yükseklik anlık (m)'); - $('.gpsAltitudeMinMaxFieldSet legend').html('en az/en çok'); - $('.gpsLatitudeFieldSet legend').html('Enlem'); - $('.gpsLongitudeFieldSet legend').html('Boylam'); - $('.tripTimeFieldSet legend').html('Toplam Süre'); - $('.idleTimeFieldSet legend').html('Durma Süresi'); - $('.engIdleTimeFieldSet legend').html('Engine Idle'); + $('#tripDistFieldSet legend').html('Gidilen Yol (km)'); + $('#speedTopFieldSet legend').html('Maksimum Hız'); + $('#speedAvgFieldSet legend').html('Ortalama Hız'); + $('#gpsAltitudeFieldSet legend').html('Yükseklik anlık (m)'); + $('#gpsAltitudeMinMaxFieldSet legend').html('en az/en çok'); + $('#gpsLatitudeFieldSet legend').html('Enlem'); + $('#gpsLongitudeFieldSet legend').html('Boylam'); + $('#tripTimeFieldSet legend').html('Toplam Süre'); + $('#idleTimeFieldSet legend').html('Durma Süresi'); + $('#engIdleTimeFieldSet legend').html('Engine Idle'); + $('#fuelGaugeFieldSet legend').html('Fuel Gauge'); + $('#gearPositionFieldSet legend').html('Gear Position'); + $('#outsideTempFieldSet legend').html('Outside )'); + $('#intakeTempFieldSet legend').html('Intake )'); + $('#coolantTempFieldSet legend').html('Coolant )'); $('.North').html('K'); $('.NorthEast').html('KD'); $('.East').html('D'); @@ -208,75 +302,90 @@ function updateSpeedoApp(){ // Français else if(language === 'FR'){ - // $('.gpsSpeedFieldSet legend').html('Vit. GPS'); - $('.tripDistFieldSet legend').html('Trajet Dist. (km)'); - $('.speedTopFieldSet legend').html('V. max'); - $('.speedAvgFieldSet legend').html('V. Moyenne'); - $('.gpsAltitudeFieldSet legend').html('Altitude (m)'); - $('.gpsAltitudeMinMaxFieldSet legend').html('min/max'); - $('.gpsLatitudeFieldSet legend').html('Lat.'); - $('.gpsLongitudeFieldSet legend').html('Lon.'); - $('.tripTimeFieldSet legend').html('T. total'); - $('.idleTimeFieldSet legend').html('T. d\'arrêt'); - $('.engIdleTimeFieldSet legend').html('T. au ralenti'); + // $('#gpsSpeedFieldSet legend').html('Vit. GPS'); + $('#tripDistFieldSet legend').html('Trajet Dist. (km)'); + $('#speedTopFieldSet legend').html('V. max'); + $('#speedAvgFieldSet legend').html('V. Moyenne'); + $('#gpsAltitudeFieldSet legend').html('Altitude (m)'); + $('#gpsAltitudeMinMaxFieldSet legend').html('min/max'); + $('#gpsLatitudeFieldSet legend').html('Lat.'); + $('#gpsLongitudeFieldSet legend').html('Lon.'); + $('#tripTimeFieldSet legend').html('T. total'); + $('#idleTimeFieldSet legend').html('T. d\'arrêt'); + $('#engIdleTimeFieldSet legend').html('T. au ralenti'); + $('#fuelGaugeFieldSet legend').html('Fuel Gauge'); + $('#gearPositionFieldSet legend').html('Gear Position'); + $('#outsideTempFieldSet legend').html('Outside )'); + $('#intakeTempFieldSet legend').html('Intake )'); + $('#coolantTempFieldSet legend').html('Coolant )'); $('.SouthWest').html('SO'); $('.West').html('O'); $('.NorthWest').html('NO'); - $('.Drv1AvlFuelEFieldSet legend').html('L/100 km Moy.'); + $('legend .fuelEffUnit').html('L/100 km Moy.'); } // Italiano else if(language === 'IT'){ - // $('.gpsSpeedFieldSet legend').html('Vel. GPS'); - $('.tripDistFieldSet legend').html('Dist. tragitto (km)'); - $('.speedTopFieldSet legend').html('Vel. max'); - $('.speedAvgFieldSet legend').html('Vel. media'); - $('.gpsAltitudeFieldSet legend').html('Altitudine (m)'); - // $('.gpsAltitudeMinFieldSet legend').html('Altitudine min'); - // $('.gpsAltitudeMaxFieldSet legend').html('Altitudine max'); - $('.gpsAltitudeMinMaxFieldSet legend').html('min/max'); - $('.gpsHeadingFieldSet legend').html('Direzione'); - $('.gpsLatitudeFieldSet legend').html('Lat.'); - $('.gpsLongitudeFieldSet legend').html('Lon.'); - $('.tripTimeFieldSet legend').html('Tempo tot.'); - $('.idleTimeFieldSet legend').html('T. d\'arresto'); - $('.engIdleTimeFieldSet legend').html('T. di inattività'); + // $('#gpsSpeedFieldSet legend').html('Vel. GPS'); + $('#tripDistFieldSet legend').html('Dist. tragitto (km)'); + $('#speedTopFieldSet legend').html('Vel. max'); + $('#speedAvgFieldSet legend').html('Vel. media'); + $('#gpsAltitudeFieldSet legend').html('Altitudine (m)'); + // $('#gpsAltitudeMinFieldSet legend').html('Altitudine min'); + // $('#gpsAltitudeMaxFieldSet legend').html('Altitudine max'); + $('#gpsAltitudeMinMaxFieldSet legend').html('min/max'); + $('#gpsHeadingFieldSet legend').html('Direzione'); + $('#gpsLatitudeFieldSet legend').html('Lat.'); + $('#gpsLongitudeFieldSet legend').html('Lon.'); + $('#tripTimeFieldSet legend').html('Tempo tot.'); + $('#idleTimeFieldSet legend').html('T. d\'arresto'); + $('#engIdleTimeFieldSet legend').html('T. di inattività'); $('.SouthWest').html('SO'); $('.West').html('O'); $('.NorthWest').html('NO'); - $('.Drv1AvlFuelEFieldSet legend').html('L/100 km media'); + $('legend .fuelEffUnit').html('L/100 km media'); + $('#fuelGaugeFieldSet legend').html('Fuel Gauge'); + $('#gearPositionFieldSet legend').html('Gear Position'); + $('#outsideTempFieldSet legend').html('Outside )'); + $('#intakeTempFieldSet legend').html('Intake )'); + $('#coolantTempFieldSet legend').html('Coolant )'); } // unit specific changes if(isMPH){ - $('.speedUnit').text('mph'); - $('#speedometerDial').addClass('mph'); - $('.tripDistFieldSet legend span').text('(mi)'); - $('.gpsAltitudeFieldSet legend span').text('(ft)'); - $('.Drv1AvlFuelEFieldSet legend').html('MPG ∅'); - $('#textSpeed20').text('10'); - $('#textSpeed40').text('20'); - $('#textSpeed60').text('30'); - $('#textSpeed80').text('40'); - $('#textSpeed100').text('50'); - $('#textSpeed100').addClass('mph'); - $('#textSpeed120').text('60'); - $('#textSpeed120').addClass('mph'); - $('#textSpeed140').text('70'); - $('#textSpeed140').addClass('mph'); - $('#textSpeed160').text('80'); - $('#textSpeed180').text('90'); - $('#textSpeed200').text('100'); - $('#textSpeed220').text('110'); - $('#textSpeed240').text('120'); - $('.topSpeedIndicator').css("transform","rotate("+(-120+speedTop*2)+"deg)"); - } else { + $('.speedUnit').text('mph'); + $('#speedometerDial').addClass('mph'); + $('legend .distUnit').text('mi'); + $('legend .altUnit').text('ft'); + $('legend .fuelEffUnit').html('MPG ∅'); + if(!barSpeedometerMod) { + $('#textSpeed20').text('10'); + $('#textSpeed40').text('20'); + $('#textSpeed60').text('30'); + $('#textSpeed80').text('40'); + $('#textSpeed100').text('50'); + $('#textSpeed100').addClass('mph'); + $('#textSpeed120').text('60'); + $('#textSpeed120').addClass('mph'); + $('#textSpeed140').text('70'); + $('#textSpeed140').addClass('mph'); + $('#textSpeed160').text('80'); + $('#textSpeed180').text('90'); + $('#textSpeed200').text('100'); + $('#textSpeed220').text('110'); + $('#textSpeed240').text('120'); + $('.topSpeedIndicator').css("transform","rotate("+(-120+speedTop*2)+"deg)"); + } + } else { $('.speedUnit').text('km/h'); - $('.topSpeedIndicator').css("transform","rotate("+(-120+speedTop)+"deg)"); + $('legend .fuelEffUnit').html('L/100 km ∅'); + if(!barSpeedometerMod) { + $('.topSpeedIndicator').css("transform","rotate("+(-120+speedTop)+"deg)"); + } } - if(fuelEffunit_kml){ - $('.Drv1AvlFuelEFieldSet legend').html('km/L ∅'); + if(fuelEffunit_kml) { + $('legend .fuelEffUnit').html('km/L ∅'); } // custom background @@ -288,26 +397,36 @@ function updateSpeedoApp(){ $('#speedometerContainer').css("background-image","url(apps/_speedometer/templates/SpeedoMeter/images/speedometer_background.jpg)"); } - // fix layout if average symbol is used - - $('fieldset legend:contains("∅")').css("margin-top","2px"); // restore values after app restart - - $('.tripDistance').text(tripDist); - $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); - $('.speedAvgValue').text(speedAvg); - $('.gpsAltitudeValue').text(GPSaltCurrent); + (tempIsF) ? $('.tempUnit').html('F') : $('.tempUnit').html('C'); + $('.tripDistance').html(tripDist); + $('.speedAvgValue').html(speedAvg); + $('.gpsAltitudeValue').html(GPSaltCurrent); + $('.coolantTempValue').html(coolantTemp+"°"); + $('.intakeTempValue').html(intakeTemp+"°"); + $('.outsideTempValue').html(outsideTemp+"°"); + $('.gearPositionValue').html(lastGearPositionValue); + $('.fuelGaugeValue').html(lastFuelGaugeValue+"%"); if(altGPSmin != 9999){ $('.gpsAltitudeMinMax').html(altGPSmin+' / '+altGPSmax); } - - $('.Drv1AvlFuelEValue').html('('+TotFuelEfficiency+')'+FuelEfficiency); - $('.topRPMIndicator').css("transform","rotate("+(-145-engineSpeedTop*0.01)+"deg)"); - - if (startAnalog) { - $('#digital').hide(); - $('#analog').show(); - } + if(barSpeedometerMod) { + $('.vehDataBar1').addClass('activeDataBar'); + $('.speedTopValue').html(speedTop); + $('.TotFuelEfficiency').html(TotFuelEfficiency); + $('.Drv1AvlFuelEValue').html(FuelEfficiency); + $('.avgFuelValue').html(AvgFuelEfficiency); + } else { + $('.speedTopValue').html('('+engineSpeedTop+')'+speedTop); + $('.Drv1AvlFuelEValue').html('('+TotFuelEfficiency+')'+FuelEfficiency); + $('.topRPMIndicator').css("transform","rotate("+(-145-engineSpeedTop*0.01)+"deg)"); + if (startAnalog) { + $('#digital').hide(); + $('#analog').show(); + } + // fix layout if average symbol is used + $('fieldset legend:contains("∅")').css("margin-top","2px"); + } } diff --git a/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/templates/SpeedoMeter/css/SpeedoMeterTmplt.css b/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/templates/SpeedoMeter/css/SpeedoMeterTmplt.css index 7e9af4b..83d89a4 100644 --- a/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/templates/SpeedoMeter/css/SpeedoMeterTmplt.css +++ b/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/templates/SpeedoMeter/css/SpeedoMeterTmplt.css @@ -1,454 +1,474 @@ /* start */ #speedometerContainer { - font-family:Tipperary,verdana; - top:0px; - right:0; - bottom:0; - left:0; - height:416px; - width:800px; - position:absolute; - overflow: hidden; + font-family:Tipperary,verdana; + top:0px; + right:0; + bottom:0; + left:0; + height:416px; + width:800px; + position:absolute; + overflow: hidden; } #analog { - height: 436px; - left: -5px; - position: absolute; - top: -20px; - width: 496px; - overflow: hidden; + height: 436px; + left: -5px; + position: absolute; + top: -20px; + width: 496px; + overflow: hidden; } #speedometerBG { - left: 3px; - top: 13px; - width: 496px; - height: 482px; - background: url('../images/bg_analog.png') no-repeat scroll center top transparent; - position:absolute; - z-index: 100; + left: 3px; + top: 13px; + width: 496px; + height: 482px; + background: url('../images/bg_analog.png') no-repeat scroll center top transparent; + position:absolute; + z-index: 100; } #speedometerDial { - left: 110px; - top: 113px; - width: 278px; - height: 241px; - background: url('../images/Ticks_Style04_kmh.png') no-repeat scroll 0 0 transparent; - background-size: 100% 93.7%; - position:absolute; - z-index: 101; + left: 110px; + top: 113px; + width: 278px; + height: 241px; + background: url('../images/Ticks_Style04_kmh.png') no-repeat scroll 0 0 transparent; + background-size: 100% 93.7%; + position:absolute; + z-index: 101; } #speedometerDial.mph { - background: url('../images/Ticks_Style04_mph.png') no-repeat scroll 0 0 transparent; - background-size: 100% 93.7%; + background: url('../images/Ticks_Style04_mph.png') no-repeat scroll 0 0 transparent; + background-size: 100% 93.7%; } .topSpeedIndicator { - width: 25px; - height: 310px; - background: url('../images/TopSpeedNeedle.png') no-repeat scroll center center transparent; - left: 237px; - position: absolute; - top: 99px; - z-index: 102; - transform: rotate(-120deg); - transition: transform 1.0s ease-out 0s; + width: 25px; + height: 310px; + background: url('../images/TopSpeedNeedle.png') no-repeat scroll center center transparent; + left: 237px; + position: absolute; + top: 99px; + z-index: 102; + transform: rotate(-120deg); + transition: transform 1.0s ease-out 0s; } .gpsCompassBG { - position: absolute; - left: 139px; - top: 143px; - width: 220px; - height: 220px; - background: url('../images/compass_bg_divider.png') no-repeat scroll center center transparent; - transform: rotate(0deg); - z-index: 104; + position: absolute; + left: 139px; + top: 143px; + width: 220px; + height: 220px; + background: url('../images/compass_bg_divider.png') no-repeat scroll center center transparent; + transform: rotate(0deg); + z-index: 104; } #gpsCompass { - position: relative; - top: 21px; - left: 21px; - width: 179px; - height: 179px; - z-index: 104; + position: relative; + top: 21px; + left: 21px; + width: 179px; + height: 179px; + z-index: 104; } .speedIndicator { - width: 25px; - height: 310px; - background: url('../images/NeedlePointer.png') no-repeat scroll center center transparent; - left: 237px; - position: absolute; - top: 99px; - z-index: 105; - transform: rotate(-120deg); - transition: transform 0.25s linear 0s; + width: 25px; + height: 310px; + background: url('../images/NeedlePointer.png') no-repeat scroll center center transparent; + left: 237px; + position: absolute; + top: 99px; + z-index: 105; + transform: rotate(-120deg); + transition: transform 0.25s linear 0s; } #speedometerContainer .vehicleSpeed { - position: absolute; - left: 139px; - top: 143px; - width: 220px; - height: 220px; - background: url('../images/currentSpeed.png') no-repeat scroll center center transparent; - color: #FFFFFF; - font-size: 45px; - line-height: 217px; - text-align: center; - text-shadow: 1px 1px 4px rgba(0, 0, 0, 0.8); - z-index: 105; + position: absolute; + left: 139px; + top: 143px; + width: 220px; + height: 220px; + background: url('../images/currentSpeed.png') no-repeat scroll center center transparent; + color: #FFFFFF; + font-size: 45px; + line-height: 217px; + text-align: center; + text-shadow: 1px 1px 4px rgba(0, 0, 0, 0.8); + z-index: 105; } #digital .vehicleSpeed { - position: absolute; - right: 430px; - top: 60px; - color: #FFFFFF; - font-size: 240px; + position: absolute; + right: 430px; + top: 60px; + color: #FFFFFF; + font-size: 240px; } #digital .speedUnit { - font-family:Tipperary,verdana; - position: absolute; - left: 370px; - top: 220px; - color: #808080; - font-size: 40px; - text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); - z-index: 105; + font-family:Tipperary,verdana; + position: absolute; + left: 370px; + top: 220px; + color: #808080; + font-size: 40px; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); + z-index: 105; } #speedometerContainer .speedUnit { - position: absolute; - left: 130px; - top: 332px; - color: #808080; - font-size: 12px; - text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); - z-index: 105; + position: absolute; + left: 130px; + top: 332px; + color: #808080; + font-size: 12px; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); + z-index: 105; } #gpsCompass * { - position: absolute; - width: 24px; - height: 24px; - text-align: center; - font-size: 20px; - color: #DDDDDD; - text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); - line-height: 20px; + position: absolute; + width: 24px; + height: 24px; + text-align: center; + font-size: 20px; + color: #DDDDDD; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); + line-height: 20px; } #gpsCompass .small { - width: 30px; - font-size: 16px; - color: #BBBBBB; - line-height: 22px; + width: 30px; + font-size: 16px; + color: #BBBBBB; + line-height: 22px; } #gpsCompass .North { - top: 0px; - left: 78px; - color: #FFFFFF; - transform: rotate(0deg); + top: 0px; + left: 78px; + color: #FFFFFF; + transform: rotate(0deg); } #gpsCompass .NorthEast { - top: 24px; - left: 128px; - transform: rotate(45deg); + top: 24px; + left: 128px; + transform: rotate(45deg); } #gpsCompass .East { - top: 78px; - right: 0px; - transform: rotate(90deg); + top: 78px; + right: 0px; + transform: rotate(90deg); } #gpsCompass .SouthEast { - bottom: 24px; - left: 127px; - transform: rotate(135deg); + bottom: 24px; + left: 127px; + transform: rotate(135deg); } #gpsCompass .South { - bottom: 0px; - left: 78px; - transform: rotate(180deg); + bottom: 0px; + left: 78px; + transform: rotate(180deg); } #gpsCompass .SouthWest { - bottom: 24px; - left: 20px; - transform: rotate(225deg); + bottom: 24px; + left: 20px; + transform: rotate(225deg); } #gpsCompass .West { - top: 78px; - left: 0px; - transform: rotate(270deg); + top: 78px; + left: 0px; + transform: rotate(270deg); } #gpsCompass .NorthWest { - top: 24px; - left: 20px; - transform: rotate(315deg); + top: 24px; + left: 20px; + transform: rotate(315deg); } #table_bg { - position: absolute; - top: 0; - right: 10px; - width: 313px; - height: 420px; - background: url('../images/bg_table.png') no-repeat scroll 0 0 transparent; + position: absolute; + top: 0; + right: 10px; + width: 313px; + height: 420px; + background: url('../images/bg_table.png') no-repeat scroll 0 0 transparent; } #valuetable { - position: absolute; - right: 34px; - top: 27px; - width: 245px; + position: absolute; + right: 34px; + top: 27px; + width: 245px; } fieldset { - border: 1px solid #444444; - border-width: 0px 0px 1px 0px; - padding: 2px 0 3px; - margin: 0; - color: #999999; - text-align: right; + border: 1px solid #444444; + border-width: 0px 0px 1px 0px; + padding: 2px 0 3px; + margin: 0; + color: #999999; + text-align: right; } fieldset:last-child { - border-color: transparent; + border-color: transparent; } fieldset legend { - color: #BBBBBB; - float: left; - font-size: 20px; - margin-top: 4px; - padding: 0px; + color: #BBBBBB; + float: left; + font-size: 20px; + margin-top: 4px; + padding: 0px; } fieldset legend span{ - font-size: 16px; + font-size: 16px; } fieldset div { - color: #EEEEEE; - margin: 0; - font-size: 24px; + color: #EEEEEE; + margin: 0; + font-size: 24px; } .gpsAltitudeFieldSet { - border-color: transparent; - padding-bottom: 0px; + border-color: transparent; + padding-bottom: 0px; } .gpsLatitudeFieldSet div.lat_n { - padding-right: 17px; - background: url('../images/Lat_N.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lat_N.png') no-repeat scroll right center transparent; } .gpsLatitudeFieldSet div.lat_s { - padding-right: 17px; - background: url('../images/Lat_S.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lat_S.png') no-repeat scroll right center transparent; } .gpsLongitudeFieldSet div.lon_w { - padding-right: 17px; - background: url('../images/Lon_W.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lon_W.png') no-repeat scroll right center transparent; } .gpsLongitudeFieldSet div.lon_e { - padding-right: 17px; - background: url('../images/Lon_E.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lon_E.png') no-repeat scroll right center transparent; } /* German begin */ .gpsLongitudeFieldSet div.lon_e.de { - padding-right: 17px; - background: url('../images/Lon_O.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lon_O.png') no-repeat scroll right center transparent; } /* German end */ /* French begin */ .gpsLongitudeFieldSet div.lon_w.fr { - padding-right: 17px; - background: url('../images/Lon_O.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lon_O.png') no-repeat scroll right center transparent; } /* French end */ /* Turkish begin */ .gpsLatitudeFieldSet div.lat_n.tr { - padding-right: 17px; - background: url('../images/Lat_N_K.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lat_N_K.png') no-repeat scroll right center transparent; } .gpsLatitudeFieldSet div.lat_s.tr { - padding-right: 17px; - background: url('../images/Lat_S_G.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lat_S_G.png') no-repeat scroll right center transparent; } .gpsLongitudeFieldSet div.lon_w.tr { - padding-right: 17px; - background: url('../images/Lon_W_B.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lon_W_B.png') no-repeat scroll right center transparent; } .gpsLongitudeFieldSet div.lon_e.tr { - padding-right: 17px; - background: url('../images/Lon_E_D.png') no-repeat scroll right center transparent; + padding-right: 17px; + background: url('../images/Lon_E_D.png') no-repeat scroll right center transparent; } /* Turkish end */ fieldset div span { - color: #BBBBBB; - font-size: 16px; - padding-right: 4px; + color: #BBBBBB; + font-size: 16px; + padding-right: 4px; } #textSpeed0, #textSpeed20, #textSpeed40, #textSpeed60, #textSpeed80, #textSpeed100, #textSpeed120, #textSpeed140, #textSpeed160, #textSpeed180, #textSpeed200, #textSpeed220, #textSpeed240 { - position: absolute; - z-index: 101; - color: #CCCCCC; - font-size: 25px; - text-align: center; - text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.8); + position: absolute; + z-index: 101; + color: #CCCCCC; + font-size: 25px; + text-align: center; + text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.8); } #textSpeed0 { - color: #666666; - left: 108px; - top: 320px; + color: #666666; + left: 108px; + top: 320px; } #textSpeed20 { - left: 73px; - top: 265px; + left: 73px; + top: 265px; } #textSpeed40 { - left: 73px; - top: 209px; + left: 73px; + top: 209px; } #textSpeed60 { - left: 91px; - top: 158px; + left: 91px; + top: 158px; } #textSpeed80 { - left: 126px; - top: 114px; + left: 126px; + top: 114px; } #textSpeed100 { - left: 165px; - top: 84px; + left: 165px; + top: 84px; } #textSpeed100.mph { - left: 176px; - top: 88px; + left: 176px; + top: 88px; } #textSpeed120 { - left: 226px; - top: 74px; + left: 226px; + top: 74px; } #textSpeed120.mph { - left: 233px; - top: 79px; + left: 233px; + top: 79px; } #textSpeed140 { - left: 286px; - top: 84px; + left: 286px; + top: 84px; } #textSpeed140.mph { - left: 288px; - top: 88px; + left: 288px; + top: 88px; } #textSpeed160 { - left: 341px; - top: 114px; + left: 341px; + top: 114px; } #textSpeed180 { - left: 376px; - top: 158px; + left: 376px; + top: 158px; } #textSpeed200 { - left: 393px; - top: 209px; + left: 393px; + top: 209px; } #textSpeed220 { - left: 393px; - top: 265px; + left: 393px; + top: 265px; } #textSpeed240 { - left: 375px; - top: 320px; + left: 375px; + top: 320px; } #rpmDial { - background: url("../images/engine_speed.png") no-repeat scroll 0 0 transparent; - height: 40px; - left: 111px; - position: absolute; - top: 353px; - width: 278px; - z-index: 101; + background: url("../images/engine_speed.png") no-repeat scroll 0 0 transparent; + height: 40px; + left: 111px; + position: absolute; + top: 353px; + width: 278px; + z-index: 101; } .RPMIndicator, .topRPMIndicator { - width: 25px; - height: 310px; - background: url('../images/RPMNeedle.png') no-repeat scroll center center transparent; - left: 237px; - position: absolute; - top: 99px; - z-index: 103; - transform: rotate(-145deg); - transition: transform 0.2s linear 0s; + width: 25px; + height: 310px; + background: url('../images/RPMNeedle.png') no-repeat scroll center center transparent; + left: 237px; + position: absolute; + top: 99px; + z-index: 103; + transform: rotate(-145deg); + transition: transform 0.2s linear 0s; } .topRPMIndicator { - z-index: 102; - background: url('../images/TopRPMNeedle.png') no-repeat scroll center center transparent; - transition: transform 1.0s ease-out 0s; + z-index: 102; + background: url('../images/TopRPMNeedle.png') no-repeat scroll center center transparent; + transition: transform 1.0s ease-out 0s; } #rpmDial .step { - color: #cccccc; - font-size: 20px; - left: 47px; - position: absolute; - text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); - top: 13px; + color: #cccccc; + font-size: 20px; + left: 47px; + position: absolute; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); + top: 13px; } #rpmDial .step.s0 { - color: #666666; + color: #666666; } #rpmDial .step.s1 { - left: 68px; - top: 25px; + left: 68px; + top: 25px; } #rpmDial .step.s2 { - left: 93px; - top: 35px; + left: 93px; + top: 35px; } #rpmDial .step.s3 { - left: 120px; - top: 40px; + left: 120px; + top: 40px; } #rpmDial .step.s4 { - left: 147px; - top: 40px; + left: 147px; + top: 40px; } #rpmDial .step.s5 { - left: 172px; - top: 35px; + left: 172px; + top: 35px; } #rpmDial .step.s6 { - left: 198px; - top: 25px; + left: 198px; + top: 25px; } #rpmDial .step.s7 { - left: 220px; - top: 15px; + left: 220px; + top: 15px; } #rpmDial .unit, #rpmDial .scale { - color: #808080; - font-size: 12px; - left: 47px; - position: absolute; - text-align: center; - text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); - top: 54px; + color: #808080; + font-size: 12px; + left: 47px; + position: absolute; + text-align: center; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); + top: 54px; } #rpmDial .scale { - left: 197px; + left: 197px; } /* end org */ .tripDistFieldSet { -background: url(../images/btn1.png) 0% 100% repeat-x transparent; + background: url(../images/btn1.png) 0% 100% repeat-x transparent; } .mphbu { -background: url(../images/btn1_mph.png) 0% 100% repeat-x transparent; + background: url(../images/btn1_mph.png) 0% 100% repeat-x transparent; +} +.outsideTempFieldSet, +.intakeTempFieldSet, +.coolantTempFieldSet, +.gearPositionFieldSet { + display: none; +} +.alt0 .outsideTempFieldSet, +.alt0 .intakeTempFieldSet, +.alt0 .coolantTempFieldSet, +.alt0 .gearPositionFieldSet { + display: block; +} +.alt0 .Drv1AvlFuelEFieldSet, +.alt0 .tripTimeFieldSet, +.alt0 .idleTimeFieldSet, +.alt0 .engIdleTimeFieldSet { + display: none; } /* For Resize Mods */ .alt1 fieldset legend { - font-size: 24px; + font-size: 24px; } .alt1 fieldset legend span{ - font-size: 18px; + font-size: 18px; } .alt1 fieldset div { - font-weight: 700; - font-size: 30px; + font-weight: 700; + font-size: 30px; } +.alt1 .intakeTempFieldSet, +.alt1 .coolantTempFieldSet, .alt1 .idleTimeFieldSet, .alt1 .engIdleTimeFieldSet { - display: none; + display: none; } diff --git a/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/templates/SpeedoMeter/js/SpeedoMeterTmplt.js b/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/templates/SpeedoMeter/js/SpeedoMeterTmplt.js index 8fa2684..666b5db 100644 --- a/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/templates/SpeedoMeter/js/SpeedoMeterTmplt.js +++ b/app/files/tweaks/config/speedometer_mod/jci/gui/apps/_speedometer/templates/SpeedoMeter/js/SpeedoMeterTmplt.js @@ -36,68 +36,84 @@ function SpeedoMeterTmplt(uiaId, parentDiv, templateID, controlProperties) // create the div for template this.divElt = document.createElement('div'); this.divElt.id = templateID; - this.divElt.className = "TemplateWithStatus"; + this.divElt.className = "TemplateWithStatus SpeedoMeterTmplt"; parentDiv.appendChild(this.divElt); // do whatever you want here - this.divElt.innerHTML = ''+ + this.divElt.innerHTML = ''+ '
    '+ '
    '+ '
    '+ '
    '+ -'
    '+ - 'Trip Dist. (km)'+ +'
    '+ + 'Trip Dist. (km)'+ '
    0.00
    '+ '
    '+ -'
    '+ +'
    '+ 'Top Speed'+ '
    (0)0
    '+ '
    '+ -'
    '+ +'
    '+ 'Avg. Speed'+ '
    0
    '+ '
    '+ -'
    '+ - 'Altitude (m)'+ +'
    '+ + 'Altitude (m)'+ '
    -
    '+ '
    '+ -// '
    '+ +// '
    '+ // 'Altitude min'+ // '
    -
    '+ // '
    '+ -// '
    '+ +// '
    '+ // 'Altitude max'+ // '
    -
    '+ // '
    '+ -'
    '+ +'
    '+ 'min/max'+ '
    -
    '+ '
    '+ -'
    '+ +'
    '+ 'Lat.'+ '
    -
    '+ '
    '+ -'
    '+ +'
    '+ 'Lon.'+ '
    -
    '+ '
    '+ -'
    '+ +'
    '+ 'Total Time'+ '
    0:00
    '+ '
    '+ -'
    '+ +'
    '+ 'Idle Time'+ '
    0:00
    '+ '
    '+ -'
    '+ +'
    '+ 'Engine Idle'+ '
    0:00
    '+ '
    '+ -'
    '+ +'
    '+ 'L/100 km ∅'+ '
    (0)0
    '+ '
    '+ +'
    '+ + 'Outside Temp.'+ + '
    0
    '+ +'
    '+ +'
    '+ + 'Intake Temp.'+ + '
    0
    '+ +'
    '+ +'
    '+ + 'Coolant Temp.'+ + '
    0
    '+ +'
    '+ +'
    '+ + 'Gear Position'+ + '
    0
    '+ +'
    '+ '
    '+ '
    '+ ''+ -''; +''; +$.getScript('apps/_speedometer/js/speedometerUpdate.js', setTimeout(function() {updateSpeedoApp();}, 700)); } /* @@ -173,29 +190,29 @@ SpeedoMeterTmplt.prototype.handleControllerEvent = function(eventID) var retValue = 'giveFocusLeft'; switch(eventID) { - case "select": - $('.tripTimeFieldSet').click(); + case "select": + $('#speedAvgFieldSet').click(); retValue = "consumed"; break; - case "down": - $('.speedTopFieldSet').click(); + case "down": + $('#speedTopFieldSet').click(); retValue = "consumed"; break; - case "up": - $('#valuetable .tripDistFieldSet').click(); + case "up": + $('#engineSpeedFieldSet').click(); retValue = "consumed"; break; - case "left": + case "left": $('#analog').click(); retValue = "consumed"; break; - case "right": + case "right": $('#digital').click(); retValue = "consumed"; break; // case "cw": // case "ccw": - default: + default: retValue = "ignored"; } diff --git a/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/js/_videoplayerApp.js b/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/js/_videoplayerApp.js index 6cf43a6..9a02893 100644 --- a/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/js/_videoplayerApp.js +++ b/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/js/_videoplayerApp.js @@ -60,6 +60,7 @@ _videoplayerApp.prototype.appInit = function() _videoplayerApp.prototype._StartContextReady = function () { framework.common.setSbDomainIcon("apps/_videoplayer/templates/VideoPlayer/images/icon.png"); + framework.transitionsObj._genObj._TEMPLATE_CATEGORIES_TABLE.VideoPlayerTmplt = "Detail with UMP"; }; /** diff --git a/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/js/videoplayer-v2.js b/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/js/videoplayer-v2.js index 85ddabb..5a01b3d 100644 --- a/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/js/videoplayer-v2.js +++ b/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/js/videoplayer-v2.js @@ -50,10 +50,13 @@ * Complete the plugins in the cmu in order to allow more file types and fullscreen toggle */ var enableLog = false; +var vpColor = "Red"; +var vphColor = "darkred"; +var vpColorClass = "selectedItem" + vpColor; //var folderPath='/home/victor/Videos1'; var folderPath='/tmp/mnt'; -var currentVideoTrack = null; +var currentVideoTrack = JSON.parse(localStorage.getItem('videoplayer.currentvideo')) || null; var Repeat = JSON.parse(localStorage.getItem('videoplayer.repeat')) || false; var FullScreen = JSON.parse(localStorage.getItem('videoplayer.fullscreen')) || false; var Shuffle = JSON.parse(localStorage.getItem('videoplayer.shuffle')) || false; @@ -69,19 +72,20 @@ var CurrentVideoPlayTime = -5; //The gplay delays ~5s to start var TotalVideoTime = null; var intervalPlaytime; var waitingNext = false; -var optionsPanelOpen = false; var selectedItem = 0; +var defaultUnicode = false;// Change to true for Unicode Mode +var unicodeMode = JSON.parse(localStorage.getItem('videoplayer.unicodemode')) || defaultUnicode; var recentlyPlayed = JSON.parse(localStorage.getItem('videoplayer.recentlyplayed')) || []; -var unicodeMode = JSON.parse(localStorage.getItem('videoplayer.unicodemode')) || false; var hideUnicodeBtn = JSON.parse(localStorage.getItem('videoplayer.hideunicodebtn')) || false; var statusbarTitleVideo = JSON.parse(localStorage.getItem('videoplayer.statusbartitle')) || false; var selectedOptionItem = -1; //6 ?? -var colorcode = "255,0,0"; //var logFile = "/tmp/mnt/sd_nav/video-log.txt"; var logFile = "/jci/gui/apps/_videoplayer/videoplayer_log.txt"; var boxChecked = 'url(apps/_videoplayer/templates/VideoPlayer/images/myVideoCheckedBox.png)'; var boxUncheck = 'url(apps/_videoplayer/templates/VideoPlayer/images/myVideoUncheckBox.png)'; +var startFullScreen = JSON.parse(localStorage.getItem('videoplayer.fullscreen')) || false; +var optionsPanelOpen = false; var src = ''; @@ -100,53 +104,48 @@ $(document).ready(function(){ //var usbaudioApp = framework.getAppInstance("usbaudio"); //framework.sendEventToMmui(usbaudioApp.uiaId, "Global.Pause"); //usbaudioApp._changePlayButton("pause"); + if (localStorage.getItem('videoplayer.colortheme')) { + var colorPick = JSON.parse(localStorage.getItem('videoplayer.colortheme')) || null; + if(utility.toType(colorPick) === "array") { + vpColor = colorPick[0].charAt(0).toUpperCase() + colorPick[0].slice(1); + vphColor = colorPick[1]; + } else if(utility.toType(colorPick) === "string") { + vpColor = colorPick.charAt(0).toUpperCase() + colorPick.slice(1); + vphColor = colorPick; + } + vpColorClass = "selectedItem" + vpColor; + } + if (JSON.parse(localStorage.getItem('videoplayer.background'))) { + $('#myVideoContainer').addClass('noBg'); + } } catch(err) { } - setCheckBoxes('#myVideoFullScrBtn', FullScreen); - setCheckBoxes('#myVideoShuffleBtn', Shuffle); - setCheckBoxes('#myVideoRepeatBtn', Repeat); - setCheckBoxes('#myVideoRepeatAllBtn', RepeatAll); - function setCheckBoxes(opId, checkIt) { - var check = (checkIt) ? boxChecked : boxUncheck; - $(opId).css({'background-image': check}); + if(hideUnicodeBtn) { + $('#myUnicodeToggle').css({"visibility":"hidden"}); } - $('#colorThemes a').click(function(e){ - var colorPick = $(this).html(); - getVideoColorCode(colorPick); - $('#colorThemes a').css('background',''); - $(this).css('background',colorPick); - document.getElementById('myVideoControlDiv').className = colorPick + 'Theme'; - localStorage.setItem('videoplayer.colortheme', JSON.stringify(colorPick)); - }); - function getVideoColorCode(colorPick) { - switch(colorPick) { - case "blue": - colorcode = "0,0,255"; - break; - case "green": - colorcode = "0,255,0"; - break; - case "pink": - colorcode = "255,0,255"; - break; - default: - colorcode = "255,0,0"; - break; - } + setCheckBoxes('#myVideoFullScrBtn', FullScreen); + setCheckBoxes('#myVideoShuffleBtn', Shuffle); + setCheckBoxes('#myVideoRepeatBtn', Repeat); + setCheckBoxes('#myVideoRepeatAllBtn', RepeatAll); + function setCheckBoxes(opId, checkIt) { + var check = (checkIt) ? boxChecked : boxUncheck; + $(opId).css({'background-image': check}); } - if (JSON.parse(localStorage.getItem('videoplayer.colortheme'))) { - var colortheme = JSON.parse(localStorage.getItem('videoplayer.colortheme')); - document.getElementById('myVideoControlDiv').className = colortheme + 'Theme'; - getVideoColorCode(colortheme); - } - if (JSON.parse(localStorage.getItem('videoplayer.background'))) {$('#myVideoContainer').addClass('noBg');} - if(hideUnicodeBtn){$('#myUnicodeToggle').css({"visibility":"hidden"});} - // if (window.File && window.FileReader && window.FileList && window.Blob) { - // $('#myVideoList').html("step 1"); - // } + $('#colorThemes a').click(function(e){ + var colorPick = $(this).html(); + $('#colorThemes a').removeClass(vpColorClass); + vpColor = colorPick.charAt(0).toUpperCase() + colorPick.slice(1); + vphColor = $(this).attr('class'); + vpColorClass = "selectedItem" + vpColor; + $(this).css('background', vphColor); + var themeColors = [vpColor,vphColor]; + localStorage.setItem('videoplayer.colortheme', JSON.stringify(themeColors)); + }); + + if (enableLog) { myVideoWs('mount -o rw,remount /; hwclock --hctosys; ', false); //enable-write - Change Date @@ -174,6 +173,8 @@ $(document).ready(function(){ src += 'cat /proc/swaps >> '+ logFile +'; '; } + src += 'rm -f /tmp/root/.gstreamer-0.10/registry.arm.bin;'; //cleans the gstreamer registry + src += 'gst-inspect-0.10 > /dev/null 2>&1; '; // Start gstreamer before starting videos myVideoWs(src, false); //start-swap @@ -386,52 +387,52 @@ $(document).ready(function(){ $('.memErrorMessage').delay(1500).fadeOut(1000); }); - /* Video information / options panel - ==================================================================================*/ - $('#myVideoInfo, #myVideoInfoClose').click(function(){ - $('#videoInfoPanel').toggleClass('showInfo'); - optionsPanelOpen = $('#videoInfoPanel').hasClass('showInfo'); - if(optionsPanelOpen){ - setCheckBoxes('#optionHideUnicodeBtn', hideUnicodeBtn); - setCheckBoxes('#optionStatusbarTitle', statusbarTitleVideo); - } - }); + /* Video information / options panel + ==================================================================================*/ + $('#myVideoInfo, #myVideoInfoClose').click(function(){ + $('#videoInfoPanel').toggleClass('showInfo'); + optionsPanelOpen = $('#videoInfoPanel').hasClass('showInfo'); + if(optionsPanelOpen){ + $('#popInfoTab').css("background", vpColor); + setCheckBoxes('#optionHideUnicodeBtn', hideUnicodeBtn); + setCheckBoxes('#optionStatusbarTitle', statusbarTitleVideo); + } else { + SelectCurrentTrack(); + } + }); + $('#popInfoTab').click(function(){ $('#videoInfoPanel').removeClass('state'); + $('#popInfoTab').css("background", vphColor); + $('#popOptionsTab').css("background", ''); }); $('#popOptionsTab').click(function(){ $('#videoInfoPanel').addClass('state'); + $('#popOptionsTab').css("background", vphColor); + $('#popInfoTab').css("background", ''); }); setTimeout(function () { //writeLog("setTimeout started"); myVideoListRequest(); - /* if (recentlyPlayed.length > 0) - { - selectedItem = recentlyPlayed[recentlyPlayed.length -1]; - selectedItem++; - currentVideoListContainer = Math.floor(selectedItem / 8); - handleCommander("ccw"); - } */ }, 500); //try to close the video if the videoplayer is not the current app intervalVideoPlayer = setInterval(function () { - //writeLog("setInterval intervalVideoPlayer - " + framework.getCurrentApp()); if ((!waitingForClose) && (framework.getCurrentApp() !== '_videoplayer')) { - clearInterval(intervalPlaytime); + myVideoStopRequest(); + waitingForClose = true; clearInterval(intervalVideoPlayer); - writeLog("Closing App - New App: " + framework.getCurrentApp()); - waitingForClose = true; - myVideoStopRequest(); + clearInterval(intervalPlaytime); if (enableLog === true) { + writeLog("Closing App - New App: " + framework.getCurrentApp()); myVideoWs('mount -o ro,remount /', false); //disable-write } @@ -480,14 +481,15 @@ function myVideoListRequest(){ writeLog("Start List Recall"); + src=''; if (enableLog) { - src = 'echo "====retrieve list start====" >> '+logFile+'; '; + src += 'echo "====retrieve list start====" >> '+logFile+'; '; } - src = 'MNTFOLDER=\'' + folderPath + '\'; '; - src += 'FILES=$(ls -d -1 $MNTFOLDER/sd*/Movies/** | egrep ".avi|.mp4|.wmv|.flv"); '; + src += 'MNTFOLDER=\'' + folderPath + '\'; '; + src += 'FILES=$(ls -d -1 $MNTFOLDER/sd*/Movies/** | sort -f -t \/ -k 6 | egrep ".avi|.mp4|.wmv|.flv"); '; src += 'FILES=$(echo "$FILES" | tr \'\n\' \'|\'); '; @@ -517,16 +519,25 @@ function myVideoListResponse(data){ if(videos[0] === ""){ writeLog("No videos found"); - videoList.html('No videos found

    Tap to search again'); + videoList.html('No videos found

    Tap to search again

    Make sure your avi/mp4/flv/wmv files are in the "Movies" folder'); + + currentVideoTrack = null; + + $(".playbackOption").css("background-image", function(i, val){return val.substring(0, val.indexOf(")")+1);}); + + selectedOptionItem = 0; + + $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){return val + ", -o-linear-gradient(top," + vphColor + ", rgba(0,0,0,0))";}); } else { + //$(".playbackOption").css("background-image", function(i, val){return val.substring(0, val.indexOf(")")+1);}); writeLog("myVideoList insert data --- " + data); videoList.append($('
      ') .addClass("videoListContainer")); - videoListUl = $("#ul" + totalVideoListContainer); + var videoListUl = $("#ul" + totalVideoListContainer); videos.forEach(function(item, index){ @@ -552,10 +563,8 @@ function myVideoListResponse(data){ }); totalVideos = videos.length; - selectedItem=1; - handleCommander("ccw"); - $('#toggleBgBtn').css({'visibility' : 'visible'}); - $('#myVideoInfo').css({'visibility' : 'visible'}); + + SelectCurrentTrack();// Check for USB Existance if(totalVideoListContainer > 1) { @@ -616,17 +625,13 @@ function myUnicodeListRequest(){ //add more file type if needed src += 'for VIDEO in "${USBPATH}"/*.mp4 "${USBPATH}"/*.avi "${USBPATH}"/*.flv "${USBPATH}"/*.wmv; ' + - 'do '; + 'do ' + //'VIDEO=${VIDEO// / }; ' + //'VIDEO=${VIDEO//\\\'/'}; ' + //'VIDEO=${VIDEO//\\"/"}; ' + - if (enableLog) - { - src += 'echo $VIDEO >> '+ logFile +'; '; - } - src += 'VIDEONAME=$(echo "${VIDEO}" | cut -d\'/\' -f 6); ' + + 'VIDEONAME=$(echo "${VIDEO}" | cut -d\'/\' -f 6); ' + 'VIDEOCHECK=${VIDEONAME:0:1}; ' + 'if [ "${VIDEOCHECK}" != "*" ]; ' + 'then ' + @@ -765,6 +770,8 @@ function myVideoStartRequest(obj){ writeLog("Recently Played: " + recentlyPlayed); $('#widgetContent').prepend($('
      ').addClass('recentPlayedItem').text(currentVideoTrack + ": " + videoToPlay)); + localStorage.setItem('videoplayer.currentvideo', JSON.stringify(currentVideoTrack)); + waitingNext = false; writeLog("myVideoStartRequest - Video #" + currentVideoTrack + ": " + videoToPlay); @@ -817,7 +824,8 @@ function myVideoStartRequest(obj){ try { - src = 'sleep 0.3; '; + src = 'killall -9 gplay; '; + src += 'sleep 0.3; '; writeLog('start playing'); @@ -829,14 +837,16 @@ function myVideoStartRequest(obj){ //Screen size 800w*480h //Small screen player 700w*367h - src += '/usr/bin/gplay --video-sink="mfw_v4lsink'; + src += '/usr/bin/gplay '; + //src += '--video-sink="mfw_v4lsink '; - if (!FullScreen) + /* if (!FullScreen) { src += ' disp-width=700 disp-height=367 axis-left=50 axis-top=64'; - } + } */ - src += '" --audio-sink=alsasink "' + videoToPlay + '" 2>&1 '; + //src += '" --audio-sink=alsasink '; + src += '"' + videoToPlay + '" 2>&1 '; if (enableLog) { @@ -848,6 +858,8 @@ function myVideoStartRequest(obj){ CurrentVideoPlayTime = -5; + startFullScreen = FullScreen; + wsVideo = new WebSocket('ws://127.0.0.1:9998/'); wsVideo.onopen = function(){ @@ -938,6 +950,7 @@ function myVideoNextRequest(){ if(nextVideoObject.length !== 0) { wsVideo.send('x'); + myVideoWs('killall -9 gplay', false); wsVideo.close(); wsVideo=null; @@ -963,7 +976,6 @@ function myVideoPreviousRequest(){ clearInterval(intervalPlaytime); - //var previousVideoTrack = currentVideoTrack; var previousVideoTrack = recentlyPlayed.pop(); while (previousVideoTrack === currentVideoTrack) @@ -997,12 +1009,8 @@ function myVideoPreviousRequest(){ ==========================================================================================================*/ function myVideoStopRequest(){ writeLog("myVideoStopRequest called"); - $('.memErrorMessage').remove(); - clearInterval(intervalPlaytime); - $('#myVideoName').html(''); - $('#myVideoStatus').html(''); - VideoPaused=false; - $('#myVideoPausePlayBtn').css({'background-image' : 'url(apps/_videoplayer/templates/VideoPlayer/images/myVideoPauseBtn.png)'}); + + framework.common.setSbName("Video Player"); if (wsVideo !== null) { @@ -1010,7 +1018,19 @@ function myVideoStopRequest(){ wsVideo.close(); wsVideo = null; } - currentVideoTrack = null; + + clearInterval(intervalPlaytime); + + $('.memErrorMessage').remove(); + + $('#myVideoName').html(''); + $('#myVideoStatus').html(''); + VideoPaused=false; + $('#myVideoPausePlayBtn').css({'background-image' : 'url(apps/_videoplayer/templates/VideoPlayer/images/myVideoPauseBtn.png)'}); + + SelectCurrentTrack(); + + //currentVideoTrack = null; $('#myVideoPreviousBtn').css({'display' : 'none'}); $('#myVideoRW').css({'display' : 'none'}); @@ -1086,9 +1106,7 @@ function myVideoFFRequest(){ { CurrentVideoPlayTime = TotalVideoTime - 1; } - wsVideo.send('e'); - wsVideo.send('1'); - wsVideo.send('t' + CurrentVideoPlayTime); + wsVideo.send('e 1 t' + CurrentVideoPlayTime); waitingWS = false; } @@ -1110,9 +1128,7 @@ function myVideoRWRequest(){ CurrentVideoPlayTime = 0; } - wsVideo.send('e'); - wsVideo.send('1'); - wsVideo.send('t' + CurrentVideoPlayTime); + wsVideo.send('e 1 t' + CurrentVideoPlayTime); waitingWS = false; } @@ -1137,7 +1153,16 @@ function fullScreenRequest() } localStorage.setItem('videoplayer.fullscreen', JSON.stringify(FullScreen)); + + if (!startFullScreen) + { wsVideo.send('f'); + } + else + { + wsVideo.send('z 50 64 700 367'); + startFullScreen = false; + } waitingWS = false; } @@ -1180,6 +1205,35 @@ function checkStatus(state) showMemErrorMessage(res); } //$('#widgetContentState').prepend(res + "
      "); + +} + + +/* Select Current Track +============================================================================================= */ +function SelectCurrentTrack() +{ + writeLog('SelectCurrentTrack called'); + + $(".videoTrack").removeClass(vpColorClass); + if ((currentVideoTrack === null) || (currentVideoTrack > totalVideos -1)) + { + currentVideoTrack = 0; + } + + selectedItem = currentVideoTrack; + + currentVideoTrack = null; + + $(".videoListContainer:eq(" + currentVideoListContainer + ")").css("display", "none"); + + currentVideoListContainer = ((selectedItem) / 8) >> 0; + + $(".videoListContainer:eq(" + currentVideoListContainer + ")").css("display", ""); + + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); + + myVideoListScrollUpDown('other');// moved from 4 lines above } function showMemErrorMessage(res){ @@ -1210,6 +1264,13 @@ function startPlayTimeInterval() if (!VideoPaused) { CurrentVideoPlayTime++; + if (CurrentVideoPlayTime === 0) + { + if (!FullScreen) + { + wsVideo.send('z 50 64 700 367'); + } + } var state = ''; var hours = Math.floor(CurrentVideoPlayTime / 3600); @@ -1259,7 +1320,7 @@ function handleCommander(eventID) case "down": if (optionsPanelOpen) { - $('#myVideoInfoClose').click(); + $('#myVideoInfoClose').click(); } else if (currentVideoTrack === null) { @@ -1267,7 +1328,9 @@ function handleCommander(eventID) { $('#myVideoScrollDown').click(); - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".playbackOption").css("background-image", function(i, val){return val.substring(0, val.indexOf(")")+1);}); + $(".videoTrack").removeClass(vpColorClass); + selectedItem += 8; if (selectedItem >= totalVideos) @@ -1275,13 +1338,13 @@ function handleCommander(eventID) selectedItem = totalVideos - 1; } - $(".videoTrack").eq(selectedItem).addClass("selectedItem"); + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); } else if ((currentVideoListContainer + 1) === totalVideoListContainer) { - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".videoTrack").removeClass(vpColorClass); selectedItem = totalVideos - 1; - $(".videoTrack").eq(selectedItem).addClass("selectedItem"); + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); } } else @@ -1301,15 +1364,16 @@ function handleCommander(eventID) { $('#myVideoScrollUp').click(); - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".playbackOption").css("background-image", function(i, val){return val.substring(0, val.indexOf(")")+1);}); + $(".videoTrack").removeClass(vpColorClass); selectedItem -= 8; - $(".videoTrack").eq(selectedItem).addClass("selectedItem"); + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); } else if (currentVideoListContainer === 0) { - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".videoTrack").removeClass(vpColorClass); selectedItem = 0; - $(".videoTrack").eq(selectedItem).addClass("selectedItem"); + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); } } else @@ -1319,11 +1383,12 @@ function handleCommander(eventID) break; case "ccw": - if (optionsPanelOpen) + if (optionsPanelOpen) { - $(".panelOptions a").eq(selectedItem).removeClass("selectedItem"); - (selectedItem < 0) ? selectedItem = 5 : selectedItem--; - $(".panelOptions a").eq(selectedItem).addClass("selectedItem"); + $('#colorThemes a').css({'background':''}); + $(".panelOptions a").removeClass(vpColorClass); + (selectedItem < 0) ? selectedItem = 9 : selectedItem--; + $(".panelOptions a").eq(selectedItem).addClass(vpColorClass); } else if (currentVideoTrack !== null) { @@ -1331,13 +1396,11 @@ function handleCommander(eventID) } else { - $(".playbackOption").eq(selectedOptionItem).removeClass("selectedItem"); - $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){ - return val.substring(val.indexOf("url("));}); + $(".playbackOption").css("background-image", function(i, val){return val.substring(0, val.indexOf(")")+1);}); if (selectedItem > 0) { - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".videoTrack").removeClass(vpColorClass); if ((selectedItem % 8) === 0) { @@ -1345,24 +1408,27 @@ function handleCommander(eventID) } selectedItem--; - $(".videoTrack").eq(selectedItem).addClass("selectedItem"); + + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); + } else //if (selectedItem < 0) { - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".videoTrack").removeClass(vpColorClass); selectedItem = totalVideos - 1; myVideoListScrollUpDown('bottom'); - $(".videoTrack").eq(selectedItem).addClass("selectedItem"); + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); } } break; case "cw": - if (optionsPanelOpen) + if (optionsPanelOpen) { - $(".panelOptions a").eq(selectedItem).removeClass("selectedItem"); - (selectedItem > 5) ? selectedItem = 0 : selectedItem++; - $(".panelOptions a").eq(selectedItem).addClass("selectedItem"); + $('#colorThemes a').css({'background':''}); + $(".panelOptions a").removeClass(vpColorClass); + (selectedItem > 9) ? selectedItem = 0 : selectedItem++; + $(".panelOptions a").eq(selectedItem).addClass(vpColorClass); } else if (currentVideoTrack !== null) { @@ -1370,15 +1436,13 @@ function handleCommander(eventID) } else { - $(".playbackOption").eq(selectedOptionItem).removeClass("selectedItem"); - $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){ - return val.substring(val.indexOf("url("));}); + $(".playbackOption").css("background-image", function(i, val){return val.substring(0, val.indexOf(")")+1);}); if (selectedItem < totalVideos - 1) { - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".videoTrack").removeClass(vpColorClass); selectedItem++; - $(".videoTrack").eq(selectedItem).addClass("selectedItem"); + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); if ((selectedItem > 0) && ((selectedItem % 8) === 0)) { @@ -1387,10 +1451,10 @@ function handleCommander(eventID) } else //if (selectedItem >= totalVideos) { - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".videoTrack").removeClass(vpColorClass); selectedItem = 0; myVideoListScrollUpDown('top'); - $(".videoTrack").eq(selectedItem).addClass("selectedItem"); + $(".videoTrack").eq(selectedItem).addClass(vpColorClass); } } break; @@ -1406,11 +1470,9 @@ function handleCommander(eventID) } else { - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".videoTrack").removeClass(vpColorClass); - $(".playbackOption").eq(selectedOptionItem).removeClass("selectedItem"); - $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){ - return val.substring(val.indexOf("url("));}); + $(".playbackOption").css("background-image", function(i, val){return val.substring(0, val.indexOf(")") + 1);}); selectedOptionItem++; @@ -1419,9 +1481,7 @@ function handleCommander(eventID) selectedOptionItem = 0; } - $(".playbackOption").eq(selectedOptionItem).addClass("selectedItem"); - $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){ - return "-o-linear-gradient(top,rgba(" + colorcode + ",0),rgba(" + colorcode + ",1)), " + val;}); + $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){return val + ", -o-linear-gradient(top," + vphColor + ", rgba(0,0,0,0))";}); } break; @@ -1432,19 +1492,19 @@ function handleCommander(eventID) } else if (optionsPanelOpen) { - $('.panelOptions .selectedItem').click(); + $(".videoTrack").removeClass(vpColorClass); + $('.panelOptions .' + vpColorClass).click(); } else { - if ($(".videoTrack").eq(selectedItem).hasClass("selectedItem")) + if ($(".videoTrack").eq(selectedItem).hasClass(vpColorClass)) { myVideoStartRequest($(".videoTrack").eq(selectedItem)); } else { $('.playbackOption').eq(selectedOptionItem).click(); - $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){ - return "-o-linear-gradient(top,rgba(" + colorcode + ",0),rgba(" + colorcode + ",1)), " + val;}); + $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){return val + ", -o-linear-gradient(top, rgba(0,0,0,0)," + vphColor + ")";}); } } break; @@ -1460,11 +1520,9 @@ function handleCommander(eventID) } else { - $(".videoTrack").eq(selectedItem).removeClass("selectedItem"); + $(".videoTrack").removeClass(vpColorClass); - $(".playbackOption").eq(selectedOptionItem).removeClass("selectedItem"); - $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){ - return val.substring(val.indexOf("url("));}); + $(".playbackOption").css("background-image", function(i, val){return val.substring(0, val.indexOf(")") + 1);}); selectedOptionItem--; @@ -1473,10 +1531,7 @@ function handleCommander(eventID) selectedOptionItem = 7; } - $(".playbackOption").eq(selectedOptionItem).addClass("selectedItem"); - $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){ - return "-o-linear-gradient(top,rgba(" + colorcode + ",0),rgba(" + colorcode + ",1)), " + val;}); - + $(".playbackOption").eq(selectedOptionItem).css("background-image", function(i, val){return val + ", -o-linear-gradient(top," + vphColor + ", rgba(0,0,0,0))";}); } break; diff --git a/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/templates/VideoPlayer/css/VideoPlayerTmplt.css b/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/templates/VideoPlayer/css/VideoPlayerTmplt.css index ff56d89..e0273c9 100644 --- a/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/templates/VideoPlayer/css/VideoPlayerTmplt.css +++ b/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/templates/VideoPlayer/css/VideoPlayerTmplt.css @@ -3,6 +3,7 @@ width:100%; position:relative; background-image: url('../images/player_background.jpg'); + text-shadow: 2px 2px .8px #000; } #myVideoContainer.noBg { background-image:none; @@ -82,7 +83,7 @@ padding-bottom: 22px; } #myVideoControlDiv ul li:active { - background: -o-linear-gradient(bottom,rgba(0,0,0,0),rgba(0,0,0,1)); /*Opera 11.1-12*/ + background: linear-gradient(bottom,rgba(0,0,0,0),rgba(0,0,0,1)); background-repeat: no-repeat !important; background-position: 0 3px; } @@ -95,7 +96,7 @@ #myVideoList { top:66px; right:100px; - bottom:61px; + bottom:50px; left:20px; position:absolute; font-size: 24px; @@ -119,8 +120,8 @@ text-overflow: ellipsis; } #myVideoList ul li:focus, #myVideoList ul li:active { - background: -o-linear-gradient(top,rgba(255,0,0,0),rgba(255,0,0,1)); /*Opera 11.1-12*/ - background: -webkit-linear-gradient(top,rgba(0,0,0,255), rgba(0,0,255,1)); /*Standard*/ + background: linear-gradient(top,rgba(0,139,139,0),rgba(0,139,139,1)); + background: -webkit-linear-gradient(top,rgba(0,0,0,255), rgba(0,0,139,1)); } #myVideoScroll { top:40px; @@ -223,28 +224,70 @@ background-color: transparent; background-image: none; } -.selectedItem, .playbackOption.selectedItem { - background: -o-linear-gradient(top,rgba(255,0,0,0),rgba(255,0,0,1)); - background: -webkit-linear-gradient(top,rgba(255,0,0,0),rgba(255,0,0,1)); -} -.blueTheme~#videoInfoPanel .selectedItem, .blueTheme~#myVideoList .selectedItem { - background: -o-linear-gradient(top,rgba(0,0,255,0),rgba(0,0,255,1)); - background: -webkit-linear-gradient(top,rgba(0,0,255,0),rgba(0,0,255,1)); -} -.greenTheme~#videoInfoPanel .selectedItem, .greenTheme~#myVideoList .selectedItem { - background: -o-linear-gradient(top,rgba(0,255,0,0),rgba(0,255,0,1)); - background: -webkit-linear-gradient(top,rgba(0,255,0,0),rgba(0,255,0,1)); -} -.pinkTheme~#videoInfoPanel .selectedItem, .pinkTheme~#myVideoList .selectedItem { - background: -o-linear-gradient(top,rgba(255,0,255,0),rgba(255,0,255,1)); - background: -webkit-linear-gradient(top,rgba(255,0,255,0),rgba(255,0,255,1)); -} #videoInfoPanel ul li#colorThemes a { width: 25%; float: left; text-align: center; padding-bottom: 20px; } +.selectedItemRed { + background: -webkit-linear-gradient(to top,rgba(139,0,0,1) 44%,rgba(0,0,0,0.1)); +} +.selectedItemBlue { + background: -webkit-linear-gradient(to top,rgba(0,0,139,1) 44%,rgba(0,0,0,0.1)); +} +.selectedItemGreen { + background: -webkit-linear-gradient(to top,rgba(0,100,0,1) 44%,rgba(0,0,0,0.1)); +} +.selectedItemOrange { + background: -webkit-linear-gradient(to top,rgba(255,140,0,1) 44%,rgba(0,0,0,0.1)); +} +.selectedItemTeal { + background: -webkit-linear-gradient(to top,rgba(0,139,139,1) 44%,rgba(0,0,0,0.1)); +} +.selectedItemSlate { + background: -webkit-linear-gradient(to top,rgba(47,79,79,1) 44%,rgba(0,0,0,0.1)); +} +.selectedItemGold { + background: -webkit-linear-gradient(to top,rgba(184,134,11,1) 44%,rgba(0,0,0,0.1)); +} +.selectedItemWhite { + background: -webkit-linear-gradient(to top,rgba(255,255,255,1) 74%,rgba(0,0,0,0.1)); + color: #000!important; +} +.selectedItemPink, +.selectedItemViolet { + background: -webkit-linear-gradient(to top,rgba(148,0,211,1) 44%,rgba(0,0,0,0.1)); +} +#myVideoList .selectedItemRed { + background: -webkit-linear-gradient(to left,rgba(139,0,0,0),rgba(139,0,0,1) 60%); +} +#myVideoList .selectedItemBlue { + background: -webkit-linear-gradient(to left,rgba(0,0,139,0),rgba(0,0,139,1) 60%); +} +#myVideoList .selectedItemGreen { + background: -webkit-linear-gradient(to left,rgba(0,100,0,0),rgba(0,100,0,1) 60%); +} +#myVideoList .selectedItemOrange { + background: -webkit-linear-gradient(to left,rgba(255,140,0,0),rgba(255,140,0,1) 60%); +} +#myVideoList .selectedItemTeal { + background: -webkit-linear-gradient(to left,rgba(0,139,139,0),rgba(0,139,139,1) 60%); +} +#myVideoList .selectedItemSlate { + background: -webkit-linear-gradient(to left,rgba(0,0,0,0),rgba(47,79,79,1) 60%); +} +#myVideoList .selectedItemPink, +#myVideoList .selectedItemViolet { + background: -webkit-linear-gradient(to left,rgba(148,0,211,0),rgba(148,0,211,1) 60%); +} +#myVideoList .selectedItemGold { + background: -webkit-linear-gradient(to left,rgba(184,134,11,0),rgba(184,134,11,1) 60%); +} +#myVideoList .selectedItemWhite { + background: -webkit-linear-gradient(to left,rgba(255,255,255,0.1),rgba(255,255,255,1) 60%); + color: #000!important; +} #myVideoContainer .unicodeMessage { position: absolute; font-size: 20px; @@ -270,6 +313,7 @@ left: 5%; text-align:center; z-index: 20600; + text-shadow: 2px 2px .8px #000; } #memErrorMessage ul { list-style: none; @@ -283,7 +327,7 @@ } .playbackOption.selectedItem { text-shadow: 0 0 5px #fff; - /* background: rgba(0, 117, 48, 0.45);*/ + background: rgba(0, 117, 48, 0.45); } #videoInfoPanel { display:none; @@ -301,6 +345,7 @@ background-size: contain; background-repeat: no-repeat; z-index: 20400; + text-shadow: 2px 2px .8px #000; } #videoInfoPanel.showInfo { display: block; diff --git a/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/templates/VideoPlayer/js/VideoPlayerTmplt.js b/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/templates/VideoPlayer/js/VideoPlayerTmplt.js index 832a1fc..4a71f4d 100644 --- a/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/templates/VideoPlayer/js/VideoPlayerTmplt.js +++ b/app/files/tweaks/config/videoplayer/jci/gui/apps/_videoplayer/templates/VideoPlayer/js/VideoPlayerTmplt.js @@ -80,6 +80,7 @@ function VideoPlayerTmplt(uiaId, parentDiv, templateID, controlProperties) '
    • '+ ''+ '
      '+ + ''+ '
      '+ 'Options'+ 'Info'+ @@ -90,24 +91,31 @@ function VideoPlayerTmplt(uiaId, parentDiv, templateID, controlProperties) ''+ '
      '+ + '
    • '+ + 'red'+ + 'blue'+ + 'green'+ + 'violet
      '+ + 'orange'+ + 'teal'+ + 'slate'+ + 'white'+ + ''+ + '
    • '+ '
      '+ '
      Video Player Information
      '+ '
      • Best Video Format: 360p MP4 H264 AAC
      • '+ '
      • Switch To Unicode Mode To Fix Character Isues
      • '+ '
      • For Hackers:
      • '+ '
      • https://github.com/Trevelopment/Mazda-Videoplayer
      • '+ - '
      '; - //''; - //''; - if (!window.jQuery) { + ''+ + ''+ + ''; + /*if (!window.jQuery) { utility.loadScript("addon-common/jquery.min.js", {}, function(){ $.getScript("apps/_videoplayer/js/videoplayer-v2.js"); }); - } else { - $.getScript("apps/_videoplayer/js/videoplayer-v2.js"); - } + }*/ } /* diff --git a/app/files/tweaks/config/videoplayer/usr/lib/gstreamer-0.10/libgstautodetect.so b/app/files/tweaks/config/videoplayer/usr/lib/gstreamer-0.10/libgstautodetect.so new file mode 100644 index 0000000..fc2a968 Binary files /dev/null and b/app/files/tweaks/config/videoplayer/usr/lib/gstreamer-0.10/libgstautodetect.so differ diff --git a/app/lang/english.aio.json b/app/lang/english.aio.json index 4c3559a..dccc92b 100644 --- a/app/lang/english.aio.json +++ b/app/lang/english.aio.json @@ -844,6 +844,26 @@ "label": "KM/H" } }, + "effic": { + "kml": { + "id": 40, + "label": "km/L" + }, + "lkm": { + "id": 41, + "label": "L/100km" + } + }, + "temperature": { + "cel": { + "id": 42, + "label": "C" + }, + "fer": { + "id": 43, + "label": "F" + } + }, "sml": { "gps": { "id": 20, @@ -871,7 +891,7 @@ "color": ["Blue","Green","Purple","Yellow","Orange","Pink","Silver"], "mod": { "id": 50, - "label": "Speedo Variant By: pnedkov" + "label": "Speedo Variant" }, "modAlt": { "id": 51, @@ -1107,9 +1127,9 @@ { "id": 19, "OpName": "Speedometer", - "INST": "Install speedometer by Diginix", - "DEINST": "Remove speedometer by Diginix", - "toolTip": "
      Speedometer With Compass in the Application Menu.
      • Below the speedometer is km/h or mph, depending on the setting
      • Speed range up to 240 km/h
      • Consumption values
      • Optimized graphics modules with new speedometer pointer
      • Small speedometer needle for top speed in the analog part
      • The picture for the speedometer scale has different lengths or bright lines for 5, 10 and 20 km/h jumps
      • Right table English or German and color / size optimized
      • All numbers have a slight shadow around to better stand out from the background.
      • On travel direction rotating compass central to the current speed
      • Animated overlay in the status with GPS speed and direction of travel in each menu can be prepared by touch at the clock
      • Latitude and longitude in the right table
      • When the Navi or Rear Camera is started, it automatically appears

      For the small speedo in the status bar you have to install date_to_statusbar mod V2.2 too. Therefore it will be automatically selected, if not already done.", + "INST": "Install speedometer", + "DEINST": "Remove speedometer", + "toolTip": "
      Speedometer With Compass in the Application Menu.
      • Below the speedometer is km/h or mph, depending on the setting
      • Speed range up to 240 km/h
      • Consumption values
      • Optimized graphics modules with new speedometer pointer
      • Small speedometer needle for top speed in the analog part
      • The picture for the speedometer scale has different lengths or bright lines for 5, 10 and 20 km/h jumps
      • Right table English or German and color / size optimized
      • All numbers have a slight shadow around to better stand out from the background.
      • On travel direction rotating compass central to the current speed
      • Animated overlay in the status with GPS speed and direction of travel in each menu can be prepared by touch at the clock
      • Latitude and longitude in the right table
      • When the Navi or Rear Camera is started, it automatically appears

      For the small speedo in the status bar you have to install date_to_statusbar mod too. Therefore it will be automatically selected, if not already done.", "img": "mzd_SpeedoCompass.gif", "safetylvl": "safe", "extraOps": true, diff --git a/app/lang/french.aio.json b/app/lang/french.aio.json index 4b85b14..6eda10a 100644 --- a/app/lang/french.aio.json +++ b/app/lang/french.aio.json @@ -843,6 +843,26 @@ "label": "KM/H" } }, + "effic": { + "kml": { + "id": 40, + "label": "km/L" + }, + "lkm": { + "id": 41, + "label": "L/100km" + } + }, + "temperature": { + "cel": { + "id": 42, + "label": "C" + }, + "fer": { + "id": 43, + "label": "F" + } + }, "sml": { "gps": { "id": 20, @@ -869,7 +889,7 @@ }, "mod": { "id": 50, - "label": "Speedo Variant By: pnedkov" + "label": "Speedo Variant" }, "modAlt": { "id": 51, diff --git a/app/lang/german.aio.json b/app/lang/german.aio.json index 59cf434..2475eaf 100644 --- a/app/lang/german.aio.json +++ b/app/lang/german.aio.json @@ -844,6 +844,26 @@ "label": "km/h" } }, + "effic": { + "kml": { + "id": 40, + "label": "km/L" + }, + "lkm": { + "id": 41, + "label": "L/100km" + } + }, + "temperature": { + "cel": { + "id": 42, + "label": "C" + }, + "fer": { + "id": 43, + "label": "F" + } + }, "sml": { "gps": { "id": 20, @@ -870,7 +890,7 @@ }, "mod": { "id": 50, - "label": "Speedo Variant By: pnedkov" + "label": "Speedo Variant" }, "modAlt": { "id": 51, @@ -1030,8 +1050,8 @@ { "id": 20, "OpName": "Statusbar Tweaks", - "INST": "Date_to_statusbar_mod by diginix installieren?", - "DEINST": "Date_to_statusbar_mod by diginix entfernen?", + "INST": "Date_to_statusbar_mod installieren?", + "DEINST": "Date_to_statusbar_mod entfernen?", "toolTip": "

      Datum in Statusleiste

      Dauerhaft sichtbares Datum + Icons über der Uhr, auch wenn vom MZD Navi- oder Systemmeldung eingeblendet werden.

      ", "img": "mzd_datum_icons_all.jpg", "safetylvl": "safe", @@ -1107,8 +1127,8 @@ { "id": 19, "OpName": "Speedometer", - "INST": "Speedometer by Diginix installieren?", - "DEINST": "Speedometer by Diginix entfernen?\"", + "INST": "Speedometer installieren?", + "DEINST": "Speedometer entfernen?\"", "toolTip": "
      Speedometer mit Kompass als App im Anwendungsmenü
      • unter dem Tacho steht km/h oder mph, je nach Einstellung
      • Geschwindigkeitsbereich bis 240 km/h
      • Verbrauchswerte
      • Optimierte Grafikbausteine mit neuem Tachozeiger
      • Kleine Tachonadel für Topspeed im analogen Teil
      • Das Bild für die Tachoskala hat unterschiedlich lange oder helle Striche für 5, 10 und 20 km/h Sprünge
      • Rechte Tabelle komplett deutsch und Farbe/Größe optimiert
      • Alle Zahlen haben einen leichten Schatten um sich besser vom Hintergrund abzuheben.
      • Fahrtrichtungsabhängig rotierender Kompass zentral um die aktuelle Geschwindigkeit
      • Längen- und Breitengrad in rechter Tabelle
      • Animiertes Overlay in der Statusbar mit GPS Speed und Fahrtrichtung welches in jedem Menü angezeigt werden kann, durch Touch auf die Uhr kann es ein-/ausgeblendet werden
      • Wenn das Navi oder Rückfahrkamera gestartet wird, erscheint es automatisch
      • Für den kleinen Speedo in der Statusbar muss der 'date_to_statusbar' Mod V2.2 mit installiert werden, dieser wird nun also automatisch mit ausgewählt, falls nicht schon geschehen.
      ", "img": "mzd_SpeedoCompass.gif", "safetylvl": "safe", diff --git a/app/lang/magyar.aio.json b/app/lang/magyar.aio.json index 3b59d30..d4ab7bf 100644 --- a/app/lang/magyar.aio.json +++ b/app/lang/magyar.aio.json @@ -843,6 +843,26 @@ "label": "KM/H" } }, + "effic": { + "kml": { + "id": 40, + "label": "km/L" + }, + "lkm": { + "id": 41, + "label": "L/100km" + } + }, + "temperature": { + "cel": { + "id": 42, + "label": "C" + }, + "fer": { + "id": 43, + "label": "F" + } + }, "sml": { "gps": { "id": 20, @@ -869,7 +889,7 @@ }, "mod": { "id": 50, - "label": "Speedo Variant By: pnedkov" + "label": "Speedo Variant" }, "modAlt": { "id": 51, @@ -1105,8 +1125,8 @@ { "id": 19, "OpName": "Speedometer", - "INST": "Speedometer by Diginix telepítése", - "DEINST": "Speedometer by Diginix törlése", + "INST": "Speedometer telepítése", + "DEINST": "Speedometer törlése", "toolTip": "
      Speedometer íránytűvel App-ként mutatása az alkalmazás menüben
      • a sebességmérő alatt km/h vagy mph látszik a beállítások függvényében
      • Max. mutatható sebesség: 240 km/h
      • Fogyasztási adatoks
      • Optimalizált grafikus elemek új sebességmérővel
      • Kis sebességmérő tű, mely a legnagyobb sebességet mutatja az analóg skálán
      • A skála különböző hosszúságú és világosságú az 5, 10 ill. 20 km/h-s felbontás függvényében
      • Jobboldali táblázat német és angol szövegekre lett optimalizálva
      • Minden számnak van árnyéka a jobb olvashatóság érdekében
      • Haladási iránytól függő iránytű a sebesség körül
      • Animált felület a fejlécben GPS által mért sebességgel és haladási iránnyal, mely egy érintéssel az órára bármelyik menüben előhozható vagy elrejthető
      • Szélességi és hosszúsági fokok a jobboldali táblázatban
      • Ha a navigáció vagy a tolatókamera aktiválódik, automatikusan elindul

      A kis sebességmérő fejlécben való mutatása a \"dátum a fejlécben\" mod V2.2 igényli, ezért ez automatikusan kiválasztásra kerül, ha nem történt még meg..", "img": "mzd_SpeedoCompass.gif", "safetylvl": "safe", diff --git a/app/opts/17options.htm b/app/opts/17options.htm index e3aa477..347ff87 100644 --- a/app/opts/17options.htm +++ b/app/opts/17options.htm @@ -9,10 +9,18 @@ -->
      - + + + + + diff --git a/app/opts/19options.htm b/app/opts/19options.htm index 7bcfa09..485609f 100644 --- a/app/opts/19options.htm +++ b/app/opts/19options.htm @@ -9,7 +9,55 @@ -->
      + + + +
      - - + +
      - + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + - + + + + + + + + + + + - + + + - - - - - -
      Speedometer Language:
      +
      + + +
      +
      + +
      + + + + + +
      + Instructions For Customizing Bar Speedometer +
      +
      + +
      +
      + +
      + + + +
      + Speedometer Language: +
      @@ -21,13 +69,27 @@
      Color: -
      + Color: + + -
      +
      + + +
      +
      + +
      @@ -39,7 +101,30 @@
      Speedometer In Statusbar:
      +
      + + +
      +
      + +
      + Speedometer In Statusbar: +
      + + + +
      @@ -51,7 +136,11 @@
      Speedometer Background:
      + Speedometer Background: +
      @@ -63,25 +152,6 @@
      -
      - - -
      -
      - - -
      - -
      -
      - -
      Background Opacity: {{user.speedoOps.opac}}
      diff --git a/app/opts/25options.htm b/app/opts/25options.htm index 53ae2c7..697ad26 100644 --- a/app/opts/25options.htm +++ b/app/opts/25options.htm @@ -9,44 +9,15 @@ --> - - + - - GPS fix for HUD.
      - Switch audio to MZD entertainment with FAV ()
      - +
      - v1.07 +
      AA v1.08
      +
      + +
      + If you experience navigaion issues choose this option to force AA to use phone GPS data only.
      +
      For more information, previous releases, or to check for new releases visit the Headunit Info Page and the Headunit Repository
      +
      - diff --git a/app/views/autoHelp.htm b/app/views/autoHelp.htm index 406ba3b..22726bc 100644 --- a/app/views/autoHelp.htm +++ b/app/views/autoHelp.htm @@ -1,7 +1,7 @@
      ID7_recovery scripts - A collection of autorun scripts by id7, made for recovering from a catastrophic event that results in the loss of SSH access and/or the ability to install tweaks with MZD-AIO-TI. Install recovery pack BEFORE updating firmware and it will automatically detect and restore SSH access if it is lost for any reason.
      -
      Auto WiFi AP - Starts the WiFi AP on boot runs a DHCP server. You MUST CHANGE VALUES 'YourSSID' and 'YourSSIDPassword' to run the wifi app! The app will not start if the values are not changed.
      Parameters of AP: 801.11G, channel=9, WPA2, AES is fixed but can be modified at line ~40 of jci-wifiap.sh
      CMU IP: 192.168.53.1 open SSH ports 22, 24000, 36000
      +
      Auto WiFi AP - Starts the WiFi AP on boot runs a DHCP server. You MUST CHANGE VALUES 'YourSSID' and 'YourSSIDPassword' to run the wifi app! The app will not start if the values are not changed.
      Parameters of AP: 801.11G, channel=9, WPA2, AES is fixed but can be modified at line ~40 of jci-wifiap.sh
      CMU IP: 192.168.53.1 open SSH ports 22, 24000, 36000 SCRIPT TO UNINSTALL WIFI AP ONLY
      Auto ADB - Starts SSH over ADB via port 2222. You must use an Android device with 'Android Debugging' enabled in 'Developer Options' to make this SSH connection over USB or WiFi. Over USB connect using shell command SSH --host=localhost --port=2222 or SSH client localhost:2222 (or 127.0.0.1:2222)
      Dryrun Script - This script is used to test and confirm the autorun installation is working properly. It is recommended to use this after installing autorun for the first time. This script (run.sh) can be used by itself or it can be moved to an SD card or another USB drive to test after the installation is complete.
      diff --git a/app/views/contact.html b/app/views/contact.html index 1259b37..f6cf275 100644 --- a/app/views/contact.html +++ b/app/views/contact.html @@ -92,6 +92,6 @@

      Have a question, suggestion, feedback, or just want to say hi?

      } -
      Or you can send an email to aio@mazdatweaks.com
      +
      Or you can send an email to aio@mazdatweaks.com
      diff --git a/app/views/speed.htm b/app/views/speed.htm new file mode 100644 index 0000000..4fe3149 --- /dev/null +++ b/app/views/speed.htm @@ -0,0 +1,42 @@ +

      To costomize the Bar Speedometer edit the file (from USB Drive or _copy_to_usb folder): 'config/speedometer_bar/speedometer-config.js'

      +
      /** speedometer-config.js ************************************************************** *\
      +|* =========================                                                             *|
      +|* Speedometer Configuration - Used to configure position of Speedometer values.         *|
      +|* =========================                                                             *|
      +|* Main Speedometer Value: [0, 0, 0] - Large, Front, & Center.                           *|
      +|* Other Values: [ 0/1:(0 For Main Column OR 1 For Bottom Rows), Row Number, Position ]  *|
      +|* Main Column Positions: 4 Values (1-4 From Top to Bottom)                              *|
      +|* Bottom Rows Positions: 5 Values Per Row (1-5 From Left to Right)                      *|
      +|* Examples:                                                                             *|
      +|* [0, 1, 4] = [Main, Column, 4th position (Bottom of the Column)]                       *|
      +|* [1, 3, 1] = [Bottom, 3rd Row, First Position (Left Side)]                             *|
      +|* [1, 1, 5] = [Bottom, 1st Row, Last Position (Right Side)]                             *|
      +|* To Hide a Value = [1, 1, 0] (Any bottom row position 0 will hide the value)           *|
      +|* Note: Only numbers inside [] brackets determine position, order in this list DOES NOT *|
      +\* ************************************************************************************* */
      +var spdTbl = { // Default Layout:
      +  vehSpeed:   [0, 0, 0], //Vehicle Speed
      +  topSpeed:   [0, 1, 1], //Top Speed
      +  avgSpeed:   [0, 1, 2], //Average Speed
      +  gpsSpeed:   [0, 1, 3], //GPS Speed
      +  engSpeed:   [0, 1, 4], //Engine Speed
      +  trpTime:    [1, 1, 1], //Trip Time
      +  trpDist:    [1, 1, 2], //Trip Distance
      +  outTemp:    [1, 1, 3], //Outside Temperature
      +  inTemp:     [1, 1, 4], //Intake Temperature
      +  coolTemp:   [1, 1, 5], //Coolant Temperature
      +  gearPos:    [1, 2, 1], //Gear Position
      +  fuelLvl:    [1, 2, 2], //Fuel Gauge Level
      +  trpFuel:    [1, 2, 3], //Trip Fuel Economy
      +  totFuel:    [1, 2, 4], //Total Fuel Economy
      +  avgFuel:    [1, 2, 5], //Average Fuel Economy
      +  gpsAlt:     [1, 3, 2], //Altitude
      +  gpsAltMM:   [1, 3, 3], //Altitude Min/Max
      +  gpsHead:    [1, 3, 1], //GPS Heading
      +  gpsLat:     [1, 3, 4], //GPS Latitude
      +  gpsLon:     [1, 3, 5], //GPS Longitude
      +  trpIdle:    [1, 1, 0], //Idle Time
      +  trpEngIdle: [1, 1, 0], //Engine Idle Time
      +  engTop:     [1, 1, 0], //Engine Top Speed
      +};
      +
      diff --git a/app/views/stance.htm b/app/views/stance.htm index f2a4c12..52af414 100644 --- a/app/views/stance.htm +++ b/app/views/stance.htm @@ -1,8 +1,15 @@ -

      WARNING: V59.00.502+ HAS LOCKED OUT TWEAKS INSTALLATION

      -

      IF YOU ARE CONSIDERING UPDATING TO V59.00.502 THEN INSTALLING THE ID7_RECOVERY PACK WILL ALLOW FOR A SEAMLESS UPDATE WITHOUT ANY LOSS OF ACCESS

      -

      IF YOU HAVE ALREADY UPDATED OR PURCHASED THE VEHICLE WITH V59.OO.502 YOUR ONLY OPTION RIGHT NOW IS TO CONNECT VIA SERIAL CONNECTION . THEN YOU WILL NEED TO INSTALL THE ID7_RECOVERY PACK AFTER GAINING SERIAL ACCESS.

      - -

      Its been a while since the last update because I have been very busy but since I do this for fun there are many improvements. Thanks for the support!
      - - + +

      WARNING: V59.00.502+ HAS LOCKED OUT TWEAKS INSTALLATION

      +

      IF YOU ARE CONSIDERING UPDATING TO V59.00.502 OR HIGHER THEN INSTALLING THE ID7_RECOVERY PACK WILL ALLOW FOR A SEAMLESS UPDATE WITHOUT ANY LOSS OF ACCESS

      +

      IF YOU HAVE ALREADY UPDATED OR PURCHASED THE VEHICLE WITH V59.OO.502+ YOUR ONLY OPTION RIGHT NOW IS TO CONNECT VIA SERIAL CONNECTION . THEN YOU WILL NEED TO INSTALL THE ID7_RECOVERY PACK AFTER GAINING SERIAL ACCESS.

      +

      +
      Hi Everyone!
      +

      This is the most solid AIO release to date. + Performance has been improved for the Video Player App, Speedometer App, and AIO Tweaks App, a new variant has been added to the Speedometer, and Android Auto Headunit App works better than ever. + AIO is used by tens of thousands all over the world and has become the safest, easiest, and best way to modify your MZD Infotainment System. + I am so proud of this app and thank each and every one of you for tweaking!

      ~Trezdog44

      diff --git a/app/views/translate.html b/app/views/translate.html index e4b904f..9f25a10 100644 --- a/app/views/translate.html +++ b/app/views/translate.html @@ -14,7 +14,7 @@

      MZD-AIO-TI v{{appVer}}

      MZD-AIO-TI {{trans[0].label}}

      -

      ×{{trans[10].label}}
      HINT: Double click to paste to a text field. (only works for single line text boxes for now)

      +

      ×{{trans[10].label}}
      HINT: Double click to paste to a text field. (only works for single line text boxes for now)


      diff --git a/app/views/update.htm b/app/views/update.htm index 39e4a41..3608fa2 100644 --- a/app/views/update.htm +++ b/app/views/update.htm @@ -1,95 +1,80 @@

      Full Changelog

      - -

      2.7.2

      - -
      Android Auto v1.07
      - +

      2.7.4

      +
      Android Auto v1.08
        -
      • All Bluetooth Calling & Video Focus Issues are fixed
      • -
      • Release Audio Focus (To Radio, USB Audio, etc.) with FAV () Button
      • -
      • Control USB Audio with Next/Prev steering wheel buttons when it has Audio Focus
      • -
      • Fix for GPS, Mazda Navigation and HUD features will now function correctly
      • -
      • Black screen issues are memory related and can be avoided by minimizing the amount of memory being used by the system. This can be done by: -
          -
        • Removing Nav SD card and other connected USB devices.
        • -
        • Speedometer and CastScreen apps use active memory, uninstalling them will improve AA performance.
        • -
        • Reboot the system, connect your phone after reboot.
        • -
        • Use the Swapfile for additional memory.
        • -
      • +
      • Fixed music not resuming after phone calls
      • +
      • More code optimizations
      • +
      • All Audio Focus transitions are smooth
      • +
      • Navigation Fixes +
      • Option to disable processing car GPS in case there are still navigation issues
          +
        • There may still be navigation issues with FW v56 with a Nav SD card connected (Disconnecting Nav SD card fixes the issue)
      - -
      VideoPlayer v3.1
      - -
        -
      • Fully Multicontroller Navigable
      • -
      • Navigate "Video Options/Info" panel with Control Knob. -
          -
        • Rotate to choose
        • -
        • Push to toggle option
        • -
        • Tilt up/down to close options/info panel
        • -
        • Tilt left right to choose between info and options
        • -
      • -
      • Change Highlight Color +
        Speedometer v5.0
          -
        • Choices: Red, Blue, Green, Pink
        • -
      • -
      • Fixed bug: random never played the last video in the list
      • +
      • Major performance improvements to all styles and variants. (All variants use the same data collection script)
      • +
      • Every variation value is configurable and toggleable
          +
        • Added option for starting temperature (°C & °F)
        • +
        • and fuel efficiency (km/L & L/100km)
        - -
        AIO Tweaks v0.4
        - -
          -
        • Mount SwapFile -
            -
          • Mount an unmounted SwapFile
          • -
        • -
        • Some shell commands with output (command shown in message when one is used) -
            -
          • Running Processes: ps
          • -
          • Disk Space: df -h
          • -
          • Memory Info: cat /proc/swaps && cat /proc/meminfo
          • -
          • E-mail me for requests/suggestions
          • -
        • -
        • Select Tweaks with command knob -
            -
          • Rotate to choose
          • -
          • Push to Select
          • -
        • -
        • Scroll message box by rotating/tilting command knob -
            -
          • Tilt up at the top and pushing select close the message box
          • -
          • Tilt up to reopen
          • -
          • Works well when checking headunit.log
          • -
        • -
        • Irrelevant options are now hidden -
            -
          • Ex: If CastScreen is not installed the CastScreen Start/Stop options will be hidden
          • -
        • -
        • General little fixes -
          There are MANY failed legitimate attempts in the AIO Tweaks App code most notable of which include "Show Backup Camera," "Take Screenshot" and global "Pause/Play Music". If you think you can get something to work that I have not, go for it!
        • + +
        • Digital Bar Speedometer Mod
            +
          • 4 values in the right column
          • +
          • Cycle through 3 groups of 5 values on the bottom row.
          • +
          • Including Main speed that's 20 values!
          • +
          • Command knob "select" to change bottom bar values.
          • +
          • Tilt up to toggle mph & km/h
          • +
          • Tilt right to
              +
            • Toggle km/L & L/100km (in km/h mode)
            • +
            • Toggle °C & °F (in mph mode)
            - -
            Speedometer to StatusBar
            - +
          • +
          • Tilt left to toggle background.
          • +
          • Tilt down to toggle the speedometer in statusbar extra values between Heading/Altitude & Temperature/Fuel Efficiency
          • +
          • Fully Customizable - Value positions can be customized in and easy and intuitive way, Even the Main speedometer value can be changed to any value +
          • +
          +
        • +
        • Speedometer in Statusbar Alternate Values
            +
          • Outside Temperature & Current Drive Fuel Efficiency
          • +
          • Tap the statusbar speedometer to toggle the extra values (same as tilt down when speedometer is open)
          • +
          +
        • +
        • Digital Clock Mod
            +
          • Use the font from the digital bar speedometer on the statusbar speedometer & clock.
          • +
          +
        • +
        +
        AIO Tweaks v0.4a
          -
        • Now Speedometer to StatusBar moves the 'volume meter' and 'contact loading meter' a little bit to the left so they do not overlap the numbers.
        • +
        • Removed superfluous/experimental code that may be causing the app to freeze for some.
        - -

        Swapfile

        - +
        Video Player v3.2
          -
        • Choose to mount on boot (on by default) or copy without mounting. +
        • Option to use Unicode Mode by default (still toggleable inside the app)
        • +
        • I need a lot of color in my life so now you can choose between 8!
            +
          • Red, Green, Blue, Violet, Orange, Teal, Slate, and White.
          • +
          +
        • +
        • Merged improvements by VIC_BAM85
            +
          • Sort order now is case insensitive (only for ASCII mode Not Unicode)
          • +
          • You start with selection on the last played video
          • +
          • Small fixes on the FF / RW in order to make only one call
          • +
          • Added a plugin to the cmu in order to allow fullscreen toggle (commander up while playing) so it changes while playing the video, resize and rotate (not available on the GUI yet)
          • +
          • Delete the gstreamer registry on start in order to fix the plugin repository (Resets to the one without the codecs at car restart)
          • +
          +
        • +
        +
        Swapfile
          -
        • Mounted automatically when starting the VideoPlayer App
        • -
        • Can be mounted manually with the AIO Tweaks App
        • -
        • Swapfile can be copied by itself onto the root of a separate USB drive containing music and/or videos and mounted during run-time as needed
        • -
      • +
      • Fixed swap memory mounting on boot
      • +
      • Improvements to how swapfile is mounted and order of apps initializing during boot
      - -

      App Changes

      - +
      All Apps
        -
      • Skip Confirmation choice will persist
      • +
      • Now use built in framework transitions for smoother opening and closing
      • +
      • Improvements with initialization methods & startup scripts