/*
* This file is part of the Doodle3D project (http://doodle3d.com).
*
* Copyright (c) 2013, Doodle3D
* This software is licensed under the terms of the GNU GPL v2 or later.
* See file LICENSE.txt or visit http://www.gnu.org/licenses/gpl.html for full license details.
*/
(function ConnectingToNetworkPage(w) {
var _page;
var _statusField;
var _actionField;
var _networkAPI = new NetworkAPI();
var _connectAPI = new ConnectAPI();
var _infoAPI = new InfoAPI();
var _pageData = {};
var _formData;
var _wifiboxid;
var _wifiboxSSID;
var _connectedChecking = false;
var CONNECTED_REDIRECT_DELAY = 5000;
var BACKUP_REDIRECT_DELAY = 10*1000; // when the wifiboxid isn't retrievable we want to redirect anyway
var PAGE_ID = "#connecting_to_network";
var _self = this;
$.mobile.document.on( "pageinit", PAGE_ID, function( event, data ) {
console.log("Connecting to network page pageinit");
_page = $(this);
_statusField = _page.find("#status");
_actionField = _page.find("#action");
});
$.mobile.document.on( "pagebeforeshow", PAGE_ID, function( event, data ) {
console.log("Connecting to network page pagebeforeshow");
_pageData = d3d.util.getPageParams(PAGE_ID);
var boxURL = "http://"+_pageData.localip;
var form = data.prevPage.find("form");
_formData = d3d.util.getFormData(form);
_infoAPI.init(boxURL);
_networkAPI.init(boxURL);
retrieveWiFiBoxID(function() {
joinNetwork();
_networkAPI.refreshing = onRefreshing;
_networkAPI.updated = onStatusUpdated;
_networkAPI.startAutoRefresh();
});
});
$.mobile.document.on( "pagehide", PAGE_ID, function( event, data ) {
console.log("Connecting to network page pagehide");
_networkAPI.stopAutoRefresh();
_connectAPI.stop();
});
function retrieveWiFiBoxID(completeHandler) {
console.log(PAGE_ID+":retrieveWiFiBoxID");
_infoAPI.getInfo(function(infoData) {
_wifiboxid = infoData.wifiboxid;
_wifiboxSSID = infoData.substituted_ssid;
console.log(" _wifiboxid: ",_wifiboxid);
console.log(" _wifiboxSSID: ",_wifiboxSSID);
completeHandler();
},function() {
_wifiboxid = undefined;
_wifiboxSSID = undefined;
// try connecting anyway (making sure wifiboxid retrieval isn't blocking)
completeHandler();
});
}
function joinNetwork() {
console.log("joinNetwork");
_networkAPI.associate(_pageData.ssid,_formData.password,true);
_connectedChecking = false;
}
function onRefreshing() {
//console.log("ConnectingToNetworkPage:onRefreshing");
d3d.util.showLoader(true);
}
function onStatusUpdated(data) {
console.log("ConnectingToNetworkPage:onStatusUpdated");
//console.log(" data: ",data);
data.status = parseInt(data.status,10);
console.log(" data.status: ",data.status);
// update texts
var statusText = "";
var actionText = "";
switch(data.status) {
case NetworkAPI.STATUS.CONNECTING:
statusText = "Connecting to "+_pageData.ssid+"...";
//actionText = "Please reconnect yourself to "+_pageData.ssid+". Once you are connected return to this page.";
actionText = "Please reconnect yourself to "+_pageData.ssid+". Once you are connected return to this page.";
_actionField.attr("class","notice");
break;
case NetworkAPI.STATUS.CONNECTING_FAILED:
statusText = "Could not connect...";
actionText = "Please check password and try again";
_actionField.attr("class","error");
break;
case NetworkAPI.STATUS.CONNECTED:
statusText = "Connected to "+_pageData.ssid;
actionText = "Please reconnect yourself to "+_pageData.ssid+". Once you are connected return to this page.";
_actionField.attr("class","notice");
break;
default:
actionText = "Something went wrong, please try again";
_actionField.attr("class","error");
break;
}
// TODO ignore connected?
_statusField.html(statusText);
_actionField.html(actionText);
// When the box is connecting we start checking connect.doodle3d.com
// for a box with the same wifiboxid
if(data.status === NetworkAPI.STATUS.CONNECTING && !_connectedChecking) {
if(_wifiboxid !== undefined || _wifiboxSSID !== undefined) {
_connectAPI.boxAppeared = onBoxAppeared;
} else {
// if there is no wifiboxid or ssid available we'll check if we're online
_connectAPI.listSuccess = onListSuccess;
}
_connectAPI.checkLocal = false;
_connectAPI.start();
_connectedChecking = true;
}
}
function onBoxAppeared(boxData) {
console.log(PAGE_ID+":onBoxAppeared: ",boxData.localip,boxData.wifiboxid);
// if same box is found...
if(_wifiboxid !== undefined && boxData.wifiboxid === _wifiboxid) {
console.log("found _wifiboxid");
checkBox(boxData);
// wifiboxid of older firmware isn't available, fallback to ssid
} else if(_wifiboxSSID !== undefined){
console.log("no _wifiboxid, falling back to _wifiboxSSID comparison");
var connectedBoxConfigAPI = new ConfigAPI();
connectedBoxConfigAPI.init("http://"+boxData.localip);
connectedBoxConfigAPI.save({},function(saveResponseData) {
if(saveResponseData.substituted_ssid === _wifiboxSSID) {
checkBox(boxData);
}
});
}
}
function checkBox(boxData) {
// check if it finished connecting
var boxURL = "http://"+boxData.localip;
var connectedBoxNetworkAPI = new NetworkAPI();
connectedBoxNetworkAPI.init(boxURL);
connectedBoxNetworkAPI.updated = function(data) {
data.status = parseInt(data.status,10);
console.log(PAGE_ID+":connectedBoxNetworkAPI:onStatusUpdated: ",data.status);
// if box finished connecting
if(data.status === NetworkAPI.STATUS.CONNECTED) {
console.log(" found connected box");
_statusField.html("Connected to "+_pageData.ssid);
_actionField.html("Congratulations the box is connected to "+_pageData.ssid+". You will be redirected in a moment...");
_actionField.attr("class","info");
// prevent status changes by wired box
_networkAPI.stopAutoRefresh();
setTimeout(function () {
// redirect to it's box page
console.log(" redirect to box");
var linkParams = {localip: boxData.localip,wifiboxid: boxData.wifiboxid};
var link = "#box";
link = d3d.util.replaceURLParameters(link,linkParams);
$.mobile.changePage(link);
connectedBoxNetworkAPI.stopAutoRefresh();
// disable warnings that are enabled on boxes page
d3d.util.disableRefreshPrevention();
d3d.util.disableLeaveWarning();
},CONNECTED_REDIRECT_DELAY);
}
};
connectedBoxNetworkAPI.startAutoRefresh();
}
function onListSuccess() {
setTimeout(function () {
$.mobile.changePage("#boxes");
},BACKUP_REDIRECT_DELAY);
}
})(window);