/*
* PhoneGap Sample App
*
*/

// Geolocation
var watchLocationID = null;

function onGeoLocationSuccess(position) {
    var element = document.getElementById('geolocation');
    element.innerHTML = 'Latitude: '  + position.coords.latitude      + '<br />' +
                        'Longitude: ' + position.coords.longitude     + '<br />' +
                        '<hr />'      + element.innerHTML;
}

function onGeoLocationError(error) {
    debugPrint('code: '    + error.code    + '\n' +
          'message: ' + error.message + '\n');
}
function getCurrentPosition() {
	var geolocation = document.getElementById('geolocation');
	try {
    Geolocation.useCordova();
		geolocation.style.display = 'block';
		navigator.geolocation.getCurrentPosition(onGeoLocationSuccess, onGeoLocationError, { frequency: 3000 });
	} catch(e) {
		alert(e.message);
	}
}
function toggleWatchPosition(em) {
	var geolocation = document.getElementById('geolocation');
	if(em.value == "GeoLocation.StartWatching") {
		em.value = "GeoLocation.StopWatching";
		geolocation.style.display = 'block';
		try {
			Geolocation.useCordova();
			watchLocationID = navigator.geolocation.watchPosition(onGeoLocationSuccess, onGeoLocationError, { frequency: 3000 });
		} catch(e) {
			alert(e.message);
		}
	} else {
		em.value = "GeoLocation.StartWatching";
		geolocation.style.display = 'none';
		try {
			navigator.geolocation.clearWatch(watchLocationID);
			geolocation.innerHTML = '';
		} catch(e) {
			alert(e.message);
		}
	}
}

// Acceleration
var watchAccelerationID = null;

function onAccelerationSuccess(acceleration) {
    var element = document.getElementById('accelerometer');
    element.innerHTML = 'Acceleration X: ' + acceleration.x + '<br />' +
                        'Acceleration Y: ' + acceleration.y + '<br />' +
                        'Acceleration Z: ' + acceleration.z + '<br />' +
                        'Timestamp: '      + acceleration.timestamp + '<br />';
}

function onAccelerationError() {
    alert('onError!');
}

function startWatchAcceleration() {
  var options = { frequency: 3000 };
  watchAccelerationID = navigator.accelerometer.watchAcceleration(onAccelerationSuccess, onAccelerationError, options);
}

function stopWatchAcceleration() {
    if (watchAccelerationID) {
        navigator.accelerometer.clearWatch(watchAccelerationID);
        watchAccelerationID = null;
    }
}

function getCurrentAcceleration() {
	var accelerometer = document.getElementById('accelerometer');
	try {
		accelerometer.style.display = 'block';
		navigator.accelerometer.getCurrentAcceleration(onAccelerationSuccess, onAccelerationError, { frequency: 5000 });
	} catch(e) {
		alert(e.message);
	}
}


function toggleStartAcceleration(em) {
	try {
		var accelerometer = document.getElementById('accelerometer');
		if(em.value == "Accelerometer.watchAcceleration") {
			em.value = "Accelerometer.clearWatch";
			accelerometer.style.display = 'block';
			startWatchAcceleration();
		} else {
			em.value = "Accelerometer.watchAcceleration";
			accelerometer.style.display = 'none';
			stopWatchAcceleration();
		}
	}
	catch(e) {
		alert(e.message);
	}
}
// Utility Function
function debugPrint(body) {
    var list = document.getElementById("debuglist");
    var item = document.createElement("li");
    item.appendChild(document.createTextNode(body));
    list.appendChild(item);
}

// Stock Browser Test (Any URL request launches Stock browser) 
function launchExternalBrowser() {
  window.location = "http://www.phonegap.com";
}


// Network
function hostIsReachable() {
  try {
    var network = document.getElementById('network');
    var callback = function(reachability) {
      var networkState = reachability.code;
      var http_code = reachability.http_code;
      var states = [];
      states[NetworkStatus.NOT_REACHABLE]                      = 'No network connection';
      states[NetworkStatus.REACHABLE_VIA_CARRIER_DATA_NETWORK] = 'Carrier data connection';
      states[NetworkStatus.REACHABLE_VIA_WIFI_NETWORK]         = 'WiFi connection';
      network.style.display = 'block';
      network.innerHTML = 'Code: '+reachability.code+' Connection type: '+states[networkState];
    }
    navigator.network.isReachable("http://phonegap.com", callback, {});
  } catch(e) {
    debugPrint("hostIsReachable(): "+e.message);
  }
}

// System
function getSystemInfo() {
  try {
    var system = document.getElementById("system");
    system.style.display = "block";
    system.innerHTML = 'Device Name: '     + device.name     + '<br />' + 
                       'Device Cordova: '  + device.cordova + '<br />' + 
                       'Device Platform: ' + device.platform + '<br />' + 
                       'Device UUID: '     + device.uuid     + '<br />' + 
                       'Device Version: '  + device.version  + '<br />';
  } catch(e) {
    debugPrint("Error Occured: "+e.message);
  }
  
}

// DebugConsole 
function Log() {
  var log_statement = document.getElementById("log_statement").value;
  console.log(log_statement); 
  console.warn(log_statement); 
  console.error(log_statement); 
  console.log({test:'pouet', test2:['pouet1', 'pouet2']});
}

// Contacts
function createContact() {
  var myContact = navigator.service.contacts.create({displayName: "Test User"});
  myContact.gender = "male";
  console.log("The contact, "+myContact.displayName + ", is of the "+myContact.gender +" gender");
}

function saveContact() {
  try {
    var onSuccess = function(result) {
      debugPrint("Save Success: "+result.message);
    };
    var onError = function(contactError) {
      debugPrint("Error = "+contactError.code);
    };
    var contact = navigator.service.contacts.create();
    contact.name = new ContactName();
    contact.name.familyName = "Doe";
    contact.name.givenName = "John";
    contact.displayName = "John Doe";
    contact.nickname = "Plumber";
    contact.phoneNumbers = [new ContactField("Mobile", "6047894567"), new ContactField("Home", "7789989674"), new ContactField("Other", "7789989673")];
    contact.emails = [new ContactField("Personal", "nomail@noset.com"), new ContactField("Work", "nomail2@noset.com"), new ContactField("Other", "nomail3@noset.com")];
    contact.urls = [new ContactField("Work", "http://www.domain.com"), new ContactField("Personal", "http://www.domain2.com")];
    contact.organization = new ContactOrganization();
    contact.organization.name = "Nitobi Software Inc";
    contact.organization.title = "Software Engineer";
    contact.birthday = new Date();
    contact.address = new ContactAddress();
    contact.address.streetAddress = "200 Abbott Street";
    contact.address.locality = "Vancouver";
    contact.address.region = "BC";
    contact.address.postalCode = "V6Z2X6";
    contact.address.country = "Canada";
    contact.save(onSuccess, onError);
  } catch(e) {
    debugPrint("Error Occured: "+e.message);
  }
}

function findContact() {
  try {
    var onSuccess = function(contacts) {
      debugPrint("Found "+contacts.length+" contacts.");
//      var contacts = navigator.service.contacts.results;
//      var contactStr = "IDs found: "
//      for(i in contacts) {
//        contactStr += contacts[i].id + " ";
//      }
//      debugPrint(contactStr);
    };
    var onFailure = function() {
      debugPrint("ERROR");
    };
    navigator.service.contacts.find(["displayName", "firstName"], onSuccess, onFailure, {filter:"7789989674"});
  } catch(e) {
    debugPrint("Error Occured: "+e.message);
  }
}

function removeContacts() {
  try {
    var onSuccess = function(result) {
      debugPrint(result.message);
    };
    var onFailure = function(result) {
      debugPrint("ERROR in Removing Contact: "+result.message);
    };
    var toRemove = navigator.service.contacts.results;
    while(toRemove.length > 0) {
      var contact = toRemove.shift();
      contact.remove(onSuccess, onFailure);
    }
  } catch(e) {
    debugPrint("Error Occured in remove Contact: "+e.message);
  }
}

// Compass
var watchCompassId = null;

function startWatchCompass() {
  var options = { frequency: 3000 };
  var onSuccess = function(compass) {
      var element = document.getElementById('compass');
      element.innerHTML = 'Compass X: ' + compass.x + '<br />' +
                          'Compass Y: ' + compass.y + '<br />' +
                          'Compass Z: ' + compass.z + '<br />' +
                          'Timestamp: '      + compass.timestamp + '<br />';
  };

  var onFail = function() {
      debugPrint('Compass Error!');
  };
  watchCompassId = navigator.compass.watchHeading(onSuccess, onFail, options);
}

function stopWatchCompass() {
    try {
      navigator.compass.clearWatch(watchCompassId);
      watchCompassId= null;
    } catch(e) {
      debugPrint("stopWatchCompass: "+e.message);
    }
}

function getCurrentHeading() {
	try {
    var compass = document.getElementById('compass');
    var onSuccess = function(compass) {
        var element = document.getElementById('compass');
        element.innerHTML = 'Compass X: ' + compass.x + '<br />' +
                            'Compass Y: ' + compass.y + '<br />' +
                            'Compass Z: ' + compass.z + '<br />' +
                            'Timestamp: ' + compass.timestamp + '<br />';
    }

    var onFail = function() {
        debugPrint('Compass Error!');
    }
		compass.style.display = 'block';
		navigator.compass.getCurrentHeading(onSuccess, onFail, { frequency: 5000 });
	} catch(e) {
		alert(e.message);
	}
}


function toggleStartCompass(em) {
	try {
		var compass = document.getElementById('compass');
		if(em.value == "Compass.watchHeading") {
			em.value = "Compass.clearWatch";
			compass.style.display = 'block';
			startWatchCompass();
		} else {
			em.value = "Compass.watchHeading";
			compass.style.display = 'none';
			stopWatchCompass();
		}
	}
	catch(e) {
		alert(e.message);
	}
}

// Notification

function notificationAlert() {
  var complete = function(button) {
    debugPrint("Alert button clicked: "+button);
  }
  try {
    navigator.notification.alert("This is an alert Dialog",complete, "Alert Title", "OK");
  } catch(e) {
    debugPrint(e.message);
  }
}

function notificationConfirm() {
  var complete = function(button) {
    debugPrint("Alert button clicked: "+button);
  }
  try {
    navigator.notification.confirm("This is an alert Dialog",complete, "Alert Title", "OK,Cancel");
  } catch(e) {
    debugPrint(e.message);
  }
}

function notificationVibrate() {
  try {
    navigator.notification.vibrate(3000);
  } catch(e) {
    debugPrint(e.message);
  }
}
function notificationBeep() {
  try {
    navigator.notification.beep(4);
  } catch(e) {
    debugPrint(e.message);
  }
}

// Camera

function getPicture() {
  try {
    var successCallback = function(uri) {
      var image = document.getElementById("picture");
      debugPrint(uri);
      image.src = uri;
    }
    var errorCallback = function(message) {
      debugPrint("Camera Failed: "+message);
    }
    navigator.camera.getPicture(successCallback, errorCallback, {});
  } catch(e) {
    debugPring(e.message);
  }
}
