var oWebsocket = false;
var bConnected = false;
var bInitialized = false;
var bSending = false;
var sHTTPProtocol = "http";
var sWSProtocol = "ws";
var aDecimals = new Array();
var aDateTime = new Array();
var aDimLevel = new Array();
var aPollInterval = new Array();
var aMarqueueInterval = new Array();
var aReadOnly = new Array();
var aStates = new Array();
var bShowTabs = true;
var bStatsEnabled = true;
var iPLVersion = 0;
var iPLNVersion = 0;
var iFWVersion = 0;
var aTimers = new Array();
var sDateTimeFormat = "HH:mm:ss YYYY-MM-DD";
var aDateTimeFormats = new Array();
var aWebcamUrl = new Array();
var aDecimalTypes = ["temperature", "humidity", "wind", "pressure", "sunriseset", "illuminance"];
var userLang = navigator.language || navigator.userLanguage;
var language;
if(document.location.protocol == "https:") {
sHTTPProtocol = "https";
sWSProtocol = "wss";
}
var language_en = {
off: "Off",
on: "On",
stopped: "Stopped",
started: "Started",
toggling: "Toggling",
up: "Up",
down: "Down",
update: "Update",
loading: "Loading",
available: "available",
confirm: "Are you sure?",
connecting: "Connecting",
connection_lost: "Connection lost, touch to reload",
connection_failed: "Failed to connect, touch to reload",
unexpected_error: "An unexpected error occured",
insecure_certificate: "You are using the default pilight.pem certificate. This results in a highly insecure https connection! Please personalize your certificate to remove this message."
}
var language_de = {
off: "Aus",
on: "Ein",
stopped: "Gestoppt",
started: "Gestartet",
toggling: "schaltend",
up: "+",
down: "-",
update: "Aktualisieren",
loading: "ladend",
available: "verfügbar",
confirm: "Bist du sicher?",
connecting: "Verbindung wird aufgebaut",
connection_lost: "Verbindung verloren! Hier berühren, um die Seite neu zu laden.",
connection_failed: "Verbindung fehlgeschlagen! Hier berühren, um die Seite neu zu laden.",
unexpected_error: "Es ist ein unerwarteter Fehler aufgetreten.",
insecure_certificate: "You are using the default {0} certificate. This is a highly insecure way of using https connections! Please personalize your certificate to remove this message."
}
var language_nl = {
off: "Uit",
on: "Aan",
stopped: "Gestopt",
started: "Gestart",
toggling: "Omzetten",
up: "Omhoog",
down: "Omlaag",
update: "Bijwerken",
loading: "Verbinding maken",
available: "beschikbaar",
confirm: "Weet u dat zeker?",
connection_lost: "Verbinding verloren, klik om te herladen",
connection_failed: "Kan niet verbinden, klik om te herhalen",
unexpected_error: "Er heeft zich een onverwachte fout voorgedaan",
insecure_certificate: "You are using the default {0} certificate. This is a highly insecure way of using https connections! Please personalize your certificate to remove this message."
}
var language_fr = {
off: "Eteint",
on: "Allumé",
stopped: "Arrêté",
started: "Démarré",
toggling: "En cours",
up: "Haut",
down: "Bas",
update: "Mise à jour",
loading: "Chargement en cours",
available: "Disponible",
confirm: "Êtes-vous sûr",
connecting: "Connexion en cours",
connection_lost: "Connexion perdue, appuyez pour recharger",
connection_failed: "Connexion impossible, appuyez pour réessayer",
unexpected_error: "Une erreur inattendue s'est produite",
insecure_certificate: "You are using the default {0} certificate. This is a highly insecure way of using https connections! Please personalize your certificate to remove this message."
}
if(userLang.indexOf('nl') != -1) {
language = language_nl;
}
else if(userLang.indexOf('de') != -1){
language = language_de;
}
else if(userLang.indexOf('fr') != -1){
language = language_fr;
}
else {
language = language_en;
}
String.prototype.format = function() {
var formatted = this;
for (var i = 0; i < arguments.length; i++) {
var regexp = new RegExp('\\{'+i+'\\}', 'gi');
formatted = formatted.replace(regexp, arguments[i]);
}
return formatted;
};
function alphaNum(string) {
return string.replace(/\W/g, '');
}
var iLatestTap1 = 0;
var iLatestTap2 = 0;
function toggleTabs() {
if(oWebsocket) {
if(bShowTabs) {
var json = '{"action":"registry","type":"set","key":"webgui.tabs","value":0}';
} else {
var json = '{"action":"registry","type":"set","key":"webgui.tabs","value":1}';
}
oWebsocket.send(json);
document.location = document.location;
} else {
bSending = true;
if(bShowTabs) {
$.get(sHTTPProtocol+'://'+location.host+'/registry?type=set&key=webgui.tabs&value=0');
} else {
$.get(sHTTPProtocol+'://'+location.host+'/registry?type=set&key=webgui.tabs&value=1');
}
$.mobile.loading('show', {
'text': '',
'textVisible': true,
'theme': 'b'
});
window.setTimeout(function() {
document.location = document.location;
}, 1000);
}
}
$(document).click(function(e) {
if($('#helpdlg').length == 1) {
$('#helpdlg').remove();
}
});
$(document).mouseup(function(e) {
if(e.target.className.indexOf('ui-page') == 0 || e.target.className.indexOf('ui-content') == 0) {
iDate = new Date().getTime();
if((iLatestTap1-iDate) > 2000) {
iLatestTap1 = 0;
iLatestTap2 = 0;
}
if(iLatestTap1 == 0) {
iLatestTap1=new Date().getTime();
} else if(iLatestTap2 == 0) {
iLatestTap2=new Date().getTime();
if((iLatestTap2-iLatestTap1) > 250 && (iLatestTap2-iLatestTap1) < 1000) {
toggleTabs();
}
iLatestTap1 = 0;
iLatestTap2 = 0;
}
}
});
$(document).keydown(function(e) {
if(e.keyCode == 72) {
if($('#helpdlg').length == 1) {
$('#helpdlg').remove();
} else {
$("
Short Cuts [ctrl] + [alt] + [shift] + t Switch between tabular or vertical view ")
.appendTo($('body'));
$('#helpdlg').css({ "display": "block", "padding": "10px", "width": "300px", "position": "relative", "left" : ($(window).width() / 2)-150+'px', "top" : (($(window).height() / 2)-($('#helpdlg').height() / 2))+'px'})
}
} else {
if($('#helpdlg').length == 1) {
$('#helpdlg').remove();
}
}
if(e.keyCode == 84 && e.altKey && e.ctrlKey && e.shiftKey) {
toggleTabs();
}
});
function createLabelElement(sTabId, sDevId, aValues) {
if($('#'+sDevId).length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues) {
oTab.append($(''+aValues['name']+'
'));
$('#'+sDevId+' div.marquee .text').css('color', aValues['color']);
// var mar = $('#'+sDevId+' div.marquee .text');
// var left = -(mar.width()+3);
// var ori = left;
// var cWidth = $('#'+sDevId+' div.marquee').width()+50;
// if(-cWidth > left) {
// mar.marquee = function() {
// mar.css('right', left);
// left++;
// if(left > cWidth) {
// left = ori;
// }
// };
// aMarqueueInterval[sDevId]=setInterval(mar.marquee, 10);
// }
}
oTab.listview();
oTab.listview("refresh");
}
}
function createSwitchElement(sTabId, sDevId, aValues) {
if($('#'+sDevId+'_switch').length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues) {
oTab.append($(''+aValues['name']+'
'+language.off+' '+language.on+' '));
}
$('#'+sDevId+'_switch').slider();
$('#'+sDevId+'_switch').bind("change", function(event, ui) {
event.stopPropagation();
if('confirm' in aValues && aValues['confirm']) {
if(window.confirm("Are you sure?") == false) {
if(this.value == "off") {
$('#'+sDevId+'_switch')[0].selectedIndex = 1;
} else {
$('#'+sDevId+'_switch')[0].selectedIndex = 0;
}
$('#'+sDevId+'_switch').slider('refresh');
return false;
}
}
if(oWebsocket) {
if('all' in aValues && aValues['all'] == 1) {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'","values":{"all": 1}}}';
} else {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'"}}';
}
oWebsocket.send(json);
} else {
bSending = true;
if('all' in aValues && aValues['all'] == 1) {
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+this.value+'&values[all]=1');
} else {
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+this.value);
}
window.setTimeout(function() { bSending = false; }, 1000);
}
});
oTab.listview();
oTab.listview("refresh");
}
if('readonly' in aValues && aValues['readonly']) {
aReadOnly[sDevId] = 1;
$('#'+sDevId+'_switch').slider('disable');
} else {
aReadOnly[sDevId] = 0;
}
}
function createPendingSwitchElement(sTabId, sDevId, aValues) {
if($('#'+sDevId+'_pendingsw').length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues) {
oTab.append($(''+aValues['name']+'
'));
}
$('#'+sDevId+'_pendingsw').button();
$('#'+sDevId+'_pendingsw').bind("click", function(event, ui) {
event.stopPropagation();
if('confirm' in aValues && aValues['confirm']) {
if(window.confirm("Are you sure?") == false) {
return false;
}
}
$('#'+sDevId+'_pendingsw').parent().removeClass('ui-icon-on').removeClass('ui-icon-off').addClass('ui-icon-loader');
$('#'+sDevId+'_pendingsw').button('disable');
$('#'+sDevId+'_pendingsw').text(language.toggling);
$('#'+sDevId+'_pendingsw').button('refresh');
if(oWebsocket) {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+((aStates[sDevId] == "off") ? "on" : "off")+'"}}';
oWebsocket.send(json);
} else {
bSending = true;
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+((aStates[sDevId] == "off") ? "on" : "off"));
window.setTimeout(function() { bSending = false; }, 1000);
}
});
$('#'+sDevId).bind("click", function(event, ui) {
if(!$('#'+sDevId+'_pendingsw').prop("disabled")) {
event.stopPropagation();
if('confirm' in aValues && aValues['confirm']) {
if(window.confirm("Are you sure?") == false) {
return false;
}
}
$('#'+sDevId+'_pendingsw').parent().removeClass('ui-icon-on').removeClass('ui-icon-off').addClass('ui-icon-loader');
$('#'+sDevId+'_pendingsw').button('disable');
$('#'+sDevId+'_pendingsw').text(language.toggling);
$('#'+sDevId+'_pendingsw').button('refresh');
if(oWebsocket) {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+((aStates[sDevId] == "off") ? "on" : "off")+'"}}';
oWebsocket.send(json);
} else {
bSending = true;
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+((aStates[sDevId] == "off") ? "on" : "off"));
window.setTimeout(function() { bSending = false; }, 1000);
}
}
});
oTab.listview();
oTab.listview("refresh");
}
if('readonly' in aValues && aValues['readonly']) {
aReadOnly[sDevId] = 1;
$('#'+sDevId+'_pendingsw').button('disable');
} else {
aReadOnly[sDevId] = 0;
}
}
function createScreenElement(sTabId, sDevId, aValues) {
if($('#'+sDevId+'_screen').length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues) {
oTab.append($(''+aValues['name']+'
'+language.down+' '+language.up+' '));
}
$("div").trigger("create");
$('#'+sDevId+'_screen_down').checkboxradio();
$('#'+sDevId+'_screen_up').checkboxradio();
$('#'+sDevId+'_screen_down').bind("change", function(event, ui) {
event.stopPropagation();
if('confirm' in aValues && aValues['confirm']) {
if(window.confirm("Are you sure?") == false) {
return false;
}
}
i = 0;
oLabel = this.parentNode.getElementsByTagName('label')[0];
$(oLabel).removeClass('ui-btn-active');
x = window.setInterval(function() {
i++;
if(i%2 == 1)
$(oLabel).removeClass('ui-btn-active');
else
$(oLabel).addClass('ui-btn-active');
if(i==2)
window.clearInterval(x);
}, 100);
if(oWebsocket) {
if('all' in aValues && aValues['all'] == 1) {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'","values":{"all": 1}}}';
} else {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'"}}'
}
oWebsocket.send(json);
} else {
bSending = true;
if('all' in aValues && aValues['all'] == 1) {
$.get(sHTTPProtocol+'://'+location.host+'/control/control?device='+sDevId+'&state='+this.value+'&values[all]=1');
} else {
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+this.value);
}
window.setTimeout(function() { bSending = false; }, 1000);
}
});
$('#'+sDevId+'_screen_up').bind("change", function(event, ui) {
event.stopPropagation();
if('confirm' in aValues && aValues['confirm']) {
if(window.confirm("Are you sure?") == false) {
return false;
}
}
i = 0;
oLabel = this.parentNode.getElementsByTagName('label')[0];
$(oLabel).removeClass('ui-btn-active');
x = window.setInterval(function() {
i++;
if(i%2 == 1)
$(oLabel).removeClass('ui-btn-active');
else
$(oLabel).addClass('ui-btn-active');
if(i==2)
window.clearInterval(x);
}, 100);
if(oWebsocket) {
if('all' in aValues && aValues['all'] == 1) {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'","values":{"all": 1}}}';
} else {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'"}}'
}
oWebsocket.send(json);
} else {
bSending = true;
if('all' in aValues && aValues['all'] == 1) {
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+this.value+'&values[all]=1');
} else {
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+this.value);
}
window.setTimeout(function() { bSending = false; }, 1000);
}
});
}
oTab.listview();
oTab.listview("refresh");
if('readonly' in aValues && aValues['readonly']) {
aReadOnly[sDevId] = 1;
$('#'+sDevId+'_screen_up').checkboxradio('disable');
$('#'+sDevId+'_screen_down').checkboxradio('disable');
} else {
aReadOnly[sDevId] = 0;
}
}
function createDimmerElement(sTabId, sDevId, aValues) {
aDimLevel[sDevId] = 0;
if($('#'+sDevId+'_switch').length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues && 'dimlevel-minimum' in aValues && 'dimlevel-maximum' in aValues) {
oTab.append($(''+aValues['name']+'
'+language.off+' '+language.on+'
'));
}
$('#'+sDevId+'_switch').slider();
$('#'+sDevId+'_switch').bind("change", function(event, ui) {
event.stopPropagation();
if('confirm' in aValues && aValues['confirm']) {
if(window.confirm("Are you sure?") == false) {
if(this.value == "off") {
$('#'+sDevId+'_switch')[0].selectedIndex = 1;
} else {
$('#'+sDevId+'_switch')[0].selectedIndex = 0;
}
$('#'+sDevId+'_switch').slider('refresh');
return false;
}
}
if(oWebsocket) {
if('all' in aValues && aValues['all'] == 1) {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'","values":{"all":1,"dimlevel":'+$('#'+sDevId+'_dimmer').val()+'}}}';
} else {
if(this.value == "on") {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'","values":{"dimlevel":'+$('#'+sDevId+'_dimmer').val()+'}}}';
} else {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"'+this.value+'"}}';
}
}
oWebsocket.send(json);
} else {
bSending = true;
if('all' in aValues && aValues['all'] == 1) {
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+this.value+'&values[all]=1&values[dimlevel]='+$('#'+sDevId+'_dimmer').val());
} else {
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state='+this.value+'&values[dimlevel]='+$('#'+sDevId+'_dimmer').val());
}
window.setTimeout(function() { bSending = false; }, 1000);
}
});
$('#'+sDevId+'_dimmer').slider({
stop: function() {
if('confirm' in aValues && aValues['confirm']) {
if(window.confirm("Are you sure?") == false) {
$('#'+sDevId+'_value').val(aDimLevel[sDevId]);
$('#'+sDevId+'_dimmer').val(aDimLevel[sDevId]);
$('#'+sDevId+'_dimmer').slider('refresh');
return false;
}
}
if(aDimLevel[sDevId] != this.value) {
aDimLevel[sDevId] = this.value;
$('#'+sDevId+'_switch')[0].selectedIndex = 1;
$('#'+sDevId+'_switch').slider('refresh');
if(oWebsocket) {
var json = '{"action":"control","code":{"device":"'+sDevId+'","state":"on","values":{"dimlevel":'+this.value+'}}}';
oWebsocket.send(json);
} else {
bSending = true;
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&state=on&values[dimlevel]='+this.value);
window.setTimeout(function() { bSending = false; }, 1000);
}
}
}
});
$('#'+sDevId+'_dimmer').change(function(event) {
$('#'+sDevId+'_value').val(this.value);
});
oTab.listview();
oTab.listview("refresh");
}
$('#'+sDevId+'_dimmer').slider('refresh');
if('readonly' in aValues && aValues['readonly']) {
aReadOnly[sDevId] = 1;
$('#'+sDevId+'_switch').slider('disable');
$('#'+sDevId+'_dimmer').slider('disable');
} else {
aReadOnly[sDevId] = 0;
}
}
function createWeatherElement(sTabId, sDevId, aValues) {
aPollInterval[sDevId] = new Array();
$.each(aDecimalTypes, function(index, value) {
if(!(sDevId in aDecimals)) {
aDecimals[sDevId] = new Array();
}
if(value+'-decimals' in aValues) {
aDecimals[sDevId][value] = aValues[value+'-decimals'];
} else {
aDecimals[sDevId][value] = 0;
}
});
if('poll-interval' in aValues) {
aPollInterval[sDevId] = aValues['poll-interval'];
}
if($('#'+sDevId+'_weather').length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues) {
oTab.append($(''+aValues['name']+'
'));
}
if('show-update' in aValues && aValues['show-update']) {
oTab.find('#'+sDevId+'_weather_values').append($('
'));
$('#'+sDevId+'_upd').click(function() {
if(this.className.indexOf('update_active') == 0) {
if(oWebsocket) {
var json = '{"action":"control","code":{"device":"'+sDevId+'","values":{"update":1}}}';
oWebsocket.send(json);
} else {
bSending = true;
$.get(sHTTPProtocol+'://'+location.host+'/control?device='+sDevId+'&values[update]=1');
window.setTimeout(function() { bSending = false; }, 1000);
}
}
});
}
if('show-battery' in aValues && aValues['show-battery'] && 'battery' in aValues) {
oTab.find('#'+sDevId+'_weather_values').append($('
'));
}
if('show-rain' in aValues && aValues['show-rain']) {
oTab.find('#'+sDevId+'_weather_values').append($('
'));
}
if('show-wind' in aValues && aValues['show-wind']) {
oTab.find('#'+sDevId+'_weather_values').append($('
'));
oTab.find('#'+sDevId+'_weather_values').append($('
'));
$('#'+sDevId+'_weather .winddir_icon').css({transform: 'rotate(' + aValues['winddir'] + 'deg)'});
}
if('show-humidity' in aValues && aValues['show-humidity']) {
oTab.find('#'+sDevId+'_weather_values').append($('
'));
}
if('show-temperature' in aValues && aValues['show-temperature']) {
oTab.find('#'+sDevId+'_weather_values').append($('
'));
}
if('show-pressure' in aValues && aValues['show-pressure']) {
oTab.find('#'+sDevId+'_weather_values').append($('
'));
}
if('show-sunriseset' in aValues && aValues['show-sunriseset']) {
oTab.find('#'+sDevId+'_weather_values').append($('
'));
oTab.find('#'+sDevId+'_weather_values').append($('
'));
$('#'+sDevId+'_sunrise_icon').addClass('yellow');
$('#'+sDevId+'_sunset_icon').addClass('gray');
}
if('show-illuminance' in aValues && aValues['show-illuminance']) {
oTab.find('#'+sDevId+'_weather').append($('
'));
}
}
oTab.listview();
oTab.listview("refresh");
}
function updateProcStatus(aValues) {
if('ram' in aValues && 'cpu' in aValues) {
var obj = $('#proc').text("CPU: "+aValues['cpu'].toFixed(2)+"% / RAM: "+aValues['ram'].toFixed(2)+"%");
} else if('ram' in aValues) {
var obj = $('#proc').text("RAM: "+aValues['ram'].toFixed(2)+"%");
} else if('cpu' in aValues) {
var obj = $('#proc').text("CPU: "+aValues['cpu'].toFixed(2)+"%");
}
obj.html(obj.html().replace(/\n/g,' '));
}
function createWebcamElement(sTabId, sDevId, aValues) {
if($('#'+sDevId+'_webcam').length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues) {
oTab.append($(''+aValues['name']+'
'));
}
oTab.find('#'+sDevId+'_webcam').append($(''));
if('image-width' in aValues && aValues['image-width'] > 0) {
$('#'+sDevId+'_img').attr('width', aValues['image-width']+'px');
}
}
oTab.listview();
oTab.listview("refresh");
if('poll-interval' in aValues) {
window.setInterval(function() {
var obj = $('#'+sDevId+'_img');
if(!(sDevId in aWebcamUrl)) {
aWebcamUrl[sDevId] = obj.attr('src');
}
if(aWebcamUrl[sDevId].indexOf('?') > -1) {
obj.attr('src', aWebcamUrl[sDevId]+"&"+new Date().getTime());
} else {
obj.attr('src', aWebcamUrl[sDevId]+"?"+new Date().getTime());
}
}, aValues['poll-interval']*1000);
}
}
function createXBMCElement(sTabId, sDevId, aValues) {
if($('#'+sDevId+'_xbmc').length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues) {
oTab.append($(''+aValues['name']+'
'));
}
if('show-action' in aValues && aValues['show-action']) {
oTab.find('#'+sDevId+'_xbmc').append($('
'));
if('action' in aValues) {
if(aValues['action'] == "play") {
$('#'+sDevId+'_action').addClass('play');
} else if(aValues['action'] == "pause") {
$('#'+sDevId+'_action').addClass('pause');
} else if(aValues['action'] == "stop") {
$('#'+sDevId+'_action').addClass('stop');
} else if(aValues['action'] == "active") {
$('#'+sDevId+'_action').addClass('screen_active');
} else if(aValues['action'] == "inactive") {
$('#'+sDevId+'_action').addClass('screen_inactive');
} else if(aValues['action'] == "shutdown") {
$('#'+sDevId+'_action').addClass('shutdown');
} else if(aValues['action'] == "home") {
$('#'+sDevId+'_action').addClass('home');
}
}
}
if('show-media' in aValues && aValues['show-media']) {
oTab.find('#'+sDevId+'_xbmc').append($('
'));
if('media' in aValues) {
if(aValues['media'] == "movie") {
$('#'+sDevId+'_media').addClass('movie');
} else if(aValues['media'] == "episode") {
$('#'+sDevId+'_media').addClass('episode');
} else if(aValues['media'] == "song") {
$('#'+sDevId+'_media').addClass('song');
}
}
}
} else {
if('show-action' in aValues && aValues['show-action']) {
if($('#'+sDevId+'_action').attr("class").indexOf("play") != -1) {
$('#'+sDevId+'_action').removeClass("play");
}
if($('#'+sDevId+'_action').attr("class").indexOf("pause") != -1) {
$('#'+sDevId+'_action').removeClass("pause");
}
if($('#'+sDevId+'_action').attr("class").indexOf("stop") != -1) {
$('#'+sDevId+'_action').removeClass("stop");
}
if($('#'+sDevId+'_action').attr("class").indexOf("screen_active") != -1) {
$('#'+sDevId+'_action').removeClass("screen_active");
}
if($('#'+sDevId+'_action').attr("class").indexOf("screen_inactive") != -1) {
$('#'+sDevId+'_action').removeClass("screen_inactive");
}
if($('#'+sDevId+'_action').attr("class").indexOf("shutdown") != -1) {
$('#'+sDevId+'_action').removeClass("shutdown");
}
if($('#'+sDevId+'_action').attr("class").indexOf("home") != -1) {
$('#'+sDevId+'_action').removeClass("home");
}
if(aValues['action'] == "play") {
$('#'+sDevId+'_action').addClass('play');
} else if(aValues['action'] == "pause") {
$('#'+sDevId+'_action').addClass('pause');
} else if(aValues['action'] == "stop") {
$('#'+sDevId+'_action').addClass('stop');
} else if(aValues['action'] == "active") {
$('#'+sDevId+'_action').addClass('screen_active');
} else if(aValues['action'] == "inactive") {
$('#'+sDevId+'_action').addClass('screen_inactive');
} else if(aValues['action'] == "shutdown") {
$('#'+sDevId+'_action').addClass('shutdown');
} else if(aValues['action'] == "home") {
$('#'+sDevId+'_action').addClass('home');
}
}
if('show-media' in aValues && aValues['show-media']) {
if('media' in aValues) {
if($('#'+sDevId+'_media').attr("class").indexOf("movie") != -1) {
$('#'+sDevId+'_media').removeClass("movie");
}
if($('#'+sDevId+'_media').attr("class").indexOf("episode") != -1) {
$('#'+sDevId+'_media').removeClass("episode");
}
if($('#'+sDevId+'_media').attr("class").indexOf("music") != -1) {
$('#'+sDevId+'_media').removeClass("music");
}
if(aValues['media'] == "movie") {
$('#'+sDevId+'_media').addClass('movie');
} else if(aValues['media'] == "episode") {
$('#'+sDevId+'_media').addClass('episode');
} else if(aValues['media'] == "song") {
$('#'+sDevId+'_media').addClass('music');
}
}
}
}
oTab.listview();
oTab.listview("refresh");
}
function createDateTimeElement(sTabId, sDevId, aValues) {
aDateTime[sDevId] = new Array();
if('format' in aValues) {
sFormat = aValues['format'];
} else {
sFormat = sDateTimeFormat;
}
aDateTimeFormats[sDevId] = sFormat;
if($('#'+sDevId+'_datetime').length == 0) {
if(bShowTabs) {
oTab = $('#'+sTabId).find('ul');
} else {
oTab = $('#all');
}
if('name' in aValues) {
oTab.append($(''+aValues['name']+'
'));
oTab.find('#'+sDevId+'_datetime').append($('
'));
}
}
oTab.listview();
oTab.listview("refresh");
}
function updateVersions() {
if(iPLVersion < iPLNVersion) {
if(iFWVersion > 0) {
var obj = $('#version').text("pilight v"+iPLVersion+" - "+language.available+" v"+iPLNVersion+" / filter firmware v"+iFWVersion);
} else {
var obj = $('#version').text("pilight v"+iPLVersion+" - "+language.available+" v"+iPLNVersion);
}
} else {
if(iFWVersion > 0) {
var obj = $('#version').text("pilight v"+iPLVersion+" / filter firmware v"+iFWVersion);
} else {
var obj = $('#version').text("pilight v"+iPLVersion);
}
}
obj.html(obj.html().replace(/\n/g,' '));
}
function createGUI(data) {
$('#tabs').append($(""));
$.each(data['gui'], function(dindex, dvalues) {
var lindex = dvalues['group'][0];
if(oWebsocket && bStatsEnabled) {
$('#proc').text("CPU: ...% / RAM: ...%");
}
if($('#'+alphaNum(lindex)).length == 0) {
if(bShowTabs) {
var oNavBar = $('#tabs');
var oLi = $(" ");
var oA = $(' ');
oA.text(lindex);
oLi.append(oA);
oNavBar.find("*").andSelf().each(function(){
$(this).removeClass(function(i, cn){
var matches = cn.match(/ui-[\w\-]+/g) || [];
return (matches.join (' '));
});
if($(this).attr("class") == "") {
$(this).removeAttr("class");
}
});
oNavBar.navbar("destroy");
oLi.appendTo($("#tabs ul"));
oNavBar.navbar();
$('#content').append($(''));
}
}
if(!bShowTabs) {
if($('#heading_'+alphaNum(lindex)).length == 0) {
if($('#all').length == 0) {
$('#content').append($(''));
} else {
$('#all').append($(''+lindex+' '));
}
}
}
aValues = new Array();
$.each(data['devices'][dindex], function(sindex, svalues) {
aValues[sindex] = svalues;
});
$.each(dvalues, function(sindex, svalues) {
aValues[sindex] = svalues;
});
if(aValues['type'] == 1 || aValues['type'] == 4) {
createSwitchElement(alphaNum(lindex), dindex, aValues);
} else if(aValues['type'] == 2) {
createDimmerElement(alphaNum(lindex), dindex, aValues);
} else if(aValues['type'] == 3) {
createWeatherElement(alphaNum(lindex), dindex, aValues);
} else if(aValues['type'] == 5) {
createScreenElement(alphaNum(lindex), dindex, aValues);
} else if(aValues['type'] == 7) {
createPendingSwitchElement(alphaNum(lindex), dindex, aValues);
} else if(aValues['type'] == 8) {
createDateTimeElement(alphaNum(lindex), dindex, aValues);
} else if(aValues['type'] == 9) {
createXBMCElement(alphaNum(lindex), dindex, aValues);
} else if(aValues['type'] == 11) {
createWebcamElement(alphaNum(lindex), dindex, aValues);
} else if(aValues['type'] == 15) {
createLabelElement(alphaNum(lindex), dindex, aValues);
}
if(bShowTabs) {
$(document).delegate('[data-role="navbar"] a', 'click', function(e) {
var iPos = this.href.indexOf('#');
var iLen = this.href.length;
var sId = this.href.substring(iPos, iLen);
$('#content .content').each(function() {
if(this.id != sId.substring(1, sId.length) && $(this).css("display") != 'none') {
$(this).toggle();
}
});
if($(sId).css("display") == "none") {
$(sId).toggle();
}
e.preventDefault();
});
if(!bInitialized) {
$('#tabs a').each(function() {
$(this).click();
$(this).addClass("ui-btn-active");
return false;
});
}
}
});
$.mobile.loading("hide");
bInitialized = true;
}
function parseValues(data) {
if(data.hasOwnProperty("devices")) {
var aValues = data.values;
var iType = data.type;
var aDevices = data['devices'];
$.each(aDevices, function(dindex, dvalues) {
$.each(aValues, function(vindex, vvalues) {
if(iType == 1 || iType == 4) {
if(vindex == 'state' && $('#'+dvalues+'_switch').length > 0) {
if(vvalues == 'on' || vvalues == 'opened') {
$('#'+dvalues+'_switch')[0].selectedIndex = 1;
} else {
$('#'+dvalues+'_switch')[0].selectedIndex = 0;
}
$('#'+dvalues+'_switch').slider('refresh');
}
} else if(iType == 2) {
if(vindex == 'state' && $('#'+dvalues+'_switch').length > 0) {
if(vvalues == 'on') {
$('#'+dvalues+'_switch')[0].selectedIndex = 1;
} else {
$('#'+dvalues+'_switch')[0].selectedIndex = 0;
}
$('#'+dvalues+'_switch').slider('refresh');
}
if(vindex == 'dimlevel') {
aDimLevel[dvalues] = vvalues;
$('#'+dvalues+'_value').val(vvalues);
$('#'+dvalues+'_dimmer').val(vvalues);
$('#'+dvalues+'_dimmer').slider('refresh');
}
} else if(iType == 5) {
if(vindex == 'state' && $('#'+dvalues+'_screen').length > 0) {
if(vvalues == 'up') {
$('#'+dvalues+'_screen_up').parent().find("label").addClass("ui-btn-active");
} else {
$('#'+dvalues+'_screen_down').parent().find("label").addClass("ui-btn-active");
}
}
} else if(iType == 8) {
if(dvalues in aDateTime && $('#'+dvalues+'_text').length > 0) {
if(vvalues < 10) {
vvalues = '0'+vvalues;
}
aDateTime[dvalues][vindex] = vvalues;
aVal = aDateTime[dvalues];
if('year' in aVal &&
'month' in aVal &&
'day' in aVal &&
'hour' in aVal &&
'minute' in aVal &&
'second' in aVal) {
if(vindex == 'second') {
sDate = moment(aVal['year']+'-'+aVal['month']+'-'+aVal['day']+' '+aVal['hour']+':'+aVal['minute']+':'+aVal['second'], ["YYYY-MM-DD HH:mm:ss"]).format(aDateTimeFormats[dvalues]);
$('#'+dvalues+'_text').text(sDate);
}
}
}
} else if(iType == 7) {
if(vindex == 'state' && $('#'+dvalues+'_pendingsw').length > 0) {
if($('#'+dvalues+'_pendingsw').parent().attr("class").indexOf("ui-icon-loader") >= 0) {
$('#'+dvalues+'_pendingsw').parent().removeClass('ui-icon-loader');
}
if($('#'+dvalues+'_pendingsw').parent().attr("class").indexOf("ui-icon-on") >= 0) {
$('#'+dvalues+'_pendingsw').parent().removeClass('ui-icon-on');
}
if($('#'+dvalues+'_pendingsw').parent().attr("class").indexOf("ui-icon-off") >= 0) {
$('#'+dvalues+'_pendingsw').parent().removeClass('ui-icon-off');
}
if(vvalues == 'running') {
if(dvalues in aReadOnly && aReadOnly[dvalues] == 0) {
$('#'+dvalues+'_pendingsw').button('enable');
}
aStates[dvalues] = "on";
$('#'+dvalues+'_pendingsw').text(language.started);
$('#'+dvalues+'_pendingsw').parent().addClass('ui-icon-on');
} else if(vvalues == 'pending') {
aStates[dvalues] = "pending";
$('#'+dvalues+'_pendingsw').button('disable');
$('#'+dvalues+'_pendingsw').text(language.toggling);
$('#'+dvalues+'_pendingsw').parent().addClass('ui-icon-loader')
} else {
aStates[dvalues] = "off";
$('#'+dvalues+'_pendingsw').button('enable');
$('#'+dvalues+'_pendingsw').text(language.stopped);
$('#'+dvalues+'_pendingsw').parent().addClass('ui-icon-off')
}
$('#'+dvalues+'_pendingsw').button('refresh');
}
} else if(iType == 3) {
if(vindex == 'temperature' && $('#'+dvalues+'_temp').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_temp').text(vvalues.toFixed(aDecimals[dvalues]['temperature']));
}
} else if(vindex == 'humidity' && $('#'+dvalues+'_humi').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_humi').text(vvalues.toFixed(aDecimals[dvalues]['humidity']));
}
} else if(vindex == 'pressure' && $('#'+dvalues+'_pres').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_pres').text(vvalues.toFixed(aDecimals[dvalues]['pressure']));
}
} else if(vindex == 'rain' && $('#'+dvalues+'_rain').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_rain').text(vvalues.toFixed(aDecimals[dvalues]['rain']));
}
} else if(vindex == 'windgust' && $('#'+dvalues+'_windgust').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_windgust').text(vvalues.toFixed(aDecimals[dvalues]['wind']));
}
} else if(vindex == 'winddir' && $('#'+dvalues+'_winddir').length > 0) {
$('#'+dvalues+'_weather .winddir_icon').css({transform: 'rotate(' + vvalues + 'deg)'});
} else if(vindex == 'windavg' && $('#'+dvalues+'_windavg').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_windavg').text(vvalues.toFixed(aDecimals[dvalues]['wind']));
}
} else if(vindex == 'sunrise' && $('#'+dvalues+'_sunrise').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_sunrise').text(vvalues.toFixed(aDecimals[dvalues]['sunriseset']));
}
} else if(vindex == 'sunset' && $('#'+dvalues+'_sunset').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_sunset').text(vvalues.toFixed(aDecimals[dvalues]['sunriseset']));
}
} else if(vindex == 'illuminance' && $('#'+dvalues+'_illu').length > 0) {
if(dvalues in aDecimals) {
$('#'+dvalues+'_illu').text(vvalues.toFixed(aDecimals[dvalues]['illuminance']));
}
} else if(vindex == 'battery' && $('#'+dvalues+'_batt').length > 0) {
if(vvalues == 1) {
if($('#'+dvalues+'_batt').attr("class").indexOf("green") == -1) {
$('#'+dvalues+'_batt').removeClass('red').addClass('green');
}
} else {
if($('#'+dvalues+'_batt').attr("class").indexOf("red") == -1) {
$('#'+dvalues+'_batt').removeClass('green').addClass('red');
}
}
} else if(vindex == 'sun' && $('#'+dvalues+'_sunrise_icon').length > 0 && $('#'+dvalues+'_sunset_icon').length > 0) {
if(vvalues == 'rise') {
if($('#'+dvalues+'_sunrise_icon').attr("class").indexOf("yellow") == -1) {
$('#'+dvalues+'_sunrise_icon').removeClass('gray').addClass('yellow');
}
if($('#'+dvalues+'_sunset_icon').attr("class").indexOf("gray") == -1) {
$('#'+dvalues+'_sunset_icon').removeClass('blue').addClass('gray');
}
} else {
if($('#'+dvalues+'_sunrise_icon').attr("class").indexOf("gray") == -1) {
$('#'+dvalues+'_sunrise_icon').removeClass('yellow').addClass('gray');
}
if($('#'+dvalues+'_sunset_icon').attr("class").indexOf("blue") == -1) {
$('#'+dvalues+'_sunset_icon').removeClass('gray').addClass('blue');
}
}
} else if(vindex == 'update' && $('#'+dvalues+'_upd').length > 0) {
if(vvalues == 0) {
if($('#'+dvalues+'_upd').attr('class').indexOf('update_inactive') == -1) {
$('#'+dvalues+'_upd').removeClass('update_active').addClass('update_inactive');
}
} else {
if($('#'+dvalues+'_upd').attr('class').indexOf('update_active') == -1) {
$('#'+dvalues+'_upd').removeClass('update_inactive').addClass('update_active');
}
}
}
} else if(iType == 9) {
if(vindex == "action" && $('#'+dvalues+'_action').length > 0) {
if($('#'+dvalues+'_action').attr("class").indexOf("play") != -1) {
$('#'+dvalues+'_action').removeClass("play");
}
if($('#'+dvalues+'_action').attr("class").indexOf("pause") != -1) {
$('#'+dvalues+'_action').removeClass("pause");
}
if($('#'+dvalues+'_action').attr("class").indexOf("stop") != -1) {
$('#'+dvalues+'_action').removeClass("stop");
}
if($('#'+dvalues+'_action').attr("class").indexOf("screen_active") != -1) {
$('#'+dvalues+'_action').removeClass("screen_active");
}
if($('#'+dvalues+'_action').attr("class").indexOf("screen_inactive") != -1) {
$('#'+dvalues+'_action').removeClass("screen_inactive");
}
if($('#'+dvalues+'_action').attr("class").indexOf("shutdown") != -1) {
$('#'+dvalues+'_action').removeClass("shutdown");
}
if($('#'+dvalues+'_action').attr("class").indexOf("home") != -1) {
$('#'+dvalues+'_action').removeClass("home");
}
if(vvalues == "play") {
$('#'+dvalues+'_action').addClass("play");
} else if(vvalues == "pause") {
$('#'+dvalues+'_action').addClass("pause");
} else if(vvalues == "stop") {
$('#'+dvalues+'_action').addClass("stop");
} else if(vvalues == "active") {
$('#'+dvalues+'_action').addClass("screen_active");
} else if(vvalues == "inactive") {
$('#'+dvalues+'_action').addClass("screen_inactive");
} else if(vvalues == "shutdown") {
$('#'+dvalues+'_action').addClass("shutdown");
} else if(vvalues == "home") {
$('#'+dvalues+'_action').addClass("home");
}
}
if(vindex == "media" && $('#'+dvalues+'_media').length > 0) {
if($('#'+dvalues+'_media').attr("class").indexOf("movie") != -1) {
$('#'+dvalues+'_media').removeClass("movie");
}
if($('#'+dvalues+'_media').attr("class").indexOf("episode") != -1) {
$('#'+dvalues+'_media').removeClass("episode");
}
if($('#'+dvalues+'_media').attr("class").indexOf("song") != -1) {
$('#'+dvalues+'_media').removeClass("song");
}
if(vvalues == "movie") {
$('#'+dvalues+'_media').addClass("movie");
} else if(vvalues == "episode") {
$('#'+dvalues+'_media').addClass("episode");
} else if(vvalues == "song") {
$('#'+dvalues+'_media').addClass("song");
}
}
} else if(iType == 11) {
if(vindex == 'url') {
$('#'+dvalues+'_img').attr("src", vvalues);
}
} else if(iType == 15) {
if(vindex == 'label') {
$('#'+dvalues+' div.marquee .text').text(vvalues);
} else if(vindex == 'color') {
$('#'+dvalues+' div.marquee .text').css('color', vvalues);
}
}
});
});
}
}
function parseData(data) {
if(data.hasOwnProperty("config")) {
config = data['config'];
if(config.hasOwnProperty("gui") && config.hasOwnProperty("devices")) {
createGUI(config);
if('registry' in config && 'pilight' in config['registry']) {
if('version' in config['registry']['pilight']) {
if('current' in config['registry']['pilight']['version']) {
iPLVersion = config['registry']['pilight']['version']['current'];
}
if('available' in config['registry']['pilight']['version']) {
iNPLVersion = config['registry']['pilight']['version']['available'];
}
}
updateVersions();
}
}
if(oWebsocket) {
oWebsocket.send("{\"action\":\"request values\"}");
}
} else if(data.hasOwnProperty("origin")) {
if(data['origin'] == "update") {
parseValues(data);
} else if(data['origin'] == "core") {
if(data['type'] == -1) {
updateProcStatus(data['values']);
}
}
} else if(data.hasOwnProperty("values")) {
$.each(data['values'], function(dindex, dvalues) {
parseValues(dvalues);
});
}
}
window.onbeforeunload = function() {
if(oWebsocket) {
oWebsocket.onclose = function() {}
oWebsocket.close();
}
}
function startAjax() {
$.get(sHTTPProtocol+'://'+location.host+'/config?internal&'+$.now(), function(txt) {
bConnected = true;
if(!bSending) {
var data = $.parseJSON(txt);
parseData(data);
}
}).fail(function() {
window.clearInterval(load);
if(bConnected) {
$.mobile.loading('show', {
'text': language.connection_lost,
'textVisible': true,
'theme': 'b'
});
$('html').on({ 'touchstart mousedown' : function(){location.reload();}});
} else {
$.mobile.loading('show', {
'text': language.connection_failed,
'textVisible': true,
'theme': 'b'
});
$('html').on({ 'touchstart mousedown' : function(){location.reload();}});
}
});
var load = window.setInterval(function() {
$.get(sHTTPProtocol+'://'+location.host+'/values?'+$.now(), function(txt) {
bConnected = true;
if(!bSending) {
var data = $.parseJSON(txt);
parseData(data);
}
}).fail(function() {
window.clearInterval(load);
if(bConnected) {
$.mobile.loading('show', {
'text': language.connection_lost,
'textVisible': true,
'theme': 'b'
});
$('html').on({ 'touchstart mousedown' : function(){location.reload();}});
} else {
$.mobile.loading('show', {
'text': language.connection_failed,
'textVisible': true,
'theme': 'b'
});
$('html').on({ 'touchstart mousedown' : function(){location.reload();}});
}
});
}, 1000);
}
function startWebsockets() {
if(typeof MozWebSocket != "undefined") {
oWebsocket = new MozWebSocket(sWSProtocol+"://"+location.host);
} else if(typeof WebSocket != "undefined") {
/* The characters after the trailing slash are needed for a wierd IE 10 bug */
oWebsocket = new WebSocket(sWSProtocol+"://"+location.host+'/websocket');
}
if(oWebsocket) {
oWebsocket.onopen = function(evt) {
bConnected = true;
oWebsocket.send("{\"action\":\"request config\"}");
};
oWebsocket.onclose = function(evt) {
if(bConnected) {
$.mobile.loading('show', {
'text': language.connection_lost,
'textVisible': true,
'theme': 'b'
});
$('html').on({ 'touchstart mousedown' : function(){location.reload();}});
} else {
$.mobile.loading('show', {
'text': language.connection_failed,
'textVisible': true,
'theme': 'b'
});
$('html').on({ 'touchstart mousedown' : function(){location.reload();}});
}
};
oWebsocket.onerror = function(evt) {
$.mobile.loading('show', {
'text': language.unexpected_error,
'textVisible': true,
'theme': 'b'
});
};
oWebsocket.onmessage = function(evt) {
var data = $.parseJSON(evt.data);
if(!('status' in data)) {
parseData(data);
}
}
}
}
$(document).ready(function() {
if($('body').length == 1) {
$.mobile.loading('show', {
'text': language.connecting,
'textVisible': true,
'theme': 'b'
});
/* Use an AJAX request to check if the user want to enforce
an AJAX connection, or if he wants to use websockets */
$.get(sHTTPProtocol+'://'+location.host+'/config?internal&'+$.now(), function(txt) {
var data = $.parseJSON(JSON.stringify(txt));
if('registry' in data) {
if('webgui' in data['registry'] &&
'tabs' in data['registry']['webgui']) {
bShowTabs = data['registry']['webgui']['tabs'];
}
if(sHTTPProtocol == "https") {
if('webserver' in data['registry'] &&
'ssl' in data['registry']['webserver'] &&
'certificate' in data['registry']['webserver']['ssl'] &&
'secure' in data['registry']['webserver']['ssl']['certificate']) {
if(data['registry']['webserver']['ssl']['certificate']['secure'] == 0) {
pemfile = 'pilight.pem';
if('location' in data['registry']['webserver']['ssl']['certificate']) {
pemfile = data['registry']['webserver']['ssl']['certificate']['location'];
}
alert(language['insecure_certificate'].format(pemfile));
}
}
}
}
if('settings' in data && 'webgui-websockets' in data['settings']) {
if(data['settings']['webgui-websockets'] == 0) {
startAjax();
} else {
startWebsockets();
}
} else {
startWebsockets();
}
if('settings' in data && 'stats-enable' in data['settings']) {
bStatsEnabled = data['settings']['stats-enable'];
}
});
$('div[data-role="header"] h1').css({'white-space':'normal'});
}
});