/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
*/

//PalmService API featureset

function LS2Request(uri, params) {
	this.uri = uri;
	params = params || {};
	if(params.method) {
		if(this.uri.charAt(this.uri.length-1) != "/") {
			this.uri += "/";
		}
		this.uri += params.method;
	}
	if(typeof params.onSuccess === 'function') {
		this.onSuccess = params.onSuccess;
	}
	if(typeof params.onFailure === 'function') {
	this.onFailure = params.onFailure;
	}
	if(typeof params.onComplete === 'function') {
	this.onComplete = params.onComplete;
	}
	this.params = (typeof params.parameters === 'object') ? params.parameters : {};
	this.subscribe = params.subscribe || false;
	if(this.subscribe) {
		this.params.subscribe = params.subscribe;
	}
	if(this.params.subscribe) {
		this.subscribe = this.params.subscribe;
	}
	this.resubscribe = params.resubscribe || false;
	this.send();
}

LS2Request.prototype.send = function() {
	if(!window.PalmServiceBridge) {
		console.error("PalmServiceBridge not found.");
		return;
	}
	this.bridge = new PalmServiceBridge();
	var self = this;
	this.bridge.onservicecallback = this.callback = function(msg) {
		var parsedMsg;
		if(self.cancelled) {
			return;
		}
		try {
			parsedMsg = JSON.parse(msg);
		} catch(e) {
			parsedMsg = {
				errorCode: -1,
				errorText: msg
			};
		}
		if((parsedMsg.errorCode || parsedMsg.returnValue==false) && self.onFailure) {
			self.onFailure(parsedMsg);
			if(self.resubscribe && self.subscribe) {
				self.delayID = setTimeout(function() {
					self.send();
				}, LS2Request.resubscribeDelay);
			}
		} else if(self.onSuccess) {
			self.onSuccess(parsedMsg);
		}
		if(self.onComplete) {
			self.onComplete(parsedMsg);
		}
		if(!self.subscribe) {
			self.cancel();
		}
	};
	this.bridge.call(this.uri, JSON.stringify(this.params));
};

LS2Request.prototype.cancel = function() {
	this.cancelled = true;
	if(this.resubscribeJob) {
			clearTimeout(this.delayID)
		}
		if(this.bridge) {
			this.bridge.cancel();
			this.bridge = undefined;
		}
};

LS2Request.prototype.toString = function() {
	return "[LS2Request]";
};

LS2Request.resubscribeDelay = 10000;

/**
 * @namespace webOS.service
 */

/**
 * @callback webOS.service~successCallback
 * @param {object} response - JSON object containing the service's response data.
 */
 
/**
  * @callback webOS.service~failureCallback
  * @param {object} error - JSON object containing the service's error details.
  */
 
/**
  * @callback webOS.service~completeCallback
  * @param {object} response - JSON object containing the service's response data; one of either proper 
  *                            response data or error details.
  */

/**
 * @typedef webOS.service~RequestObject
 * @type {object}
 * @property {string} uri - Full service request URI, including method name.
 * @property {object} params - JSON object of the request parameters to send.
 * @property {boolean} subscribe - Whether or not a subscription is desired for this request.
 * @property {boolean} resubscribe - Whether or not the request should resubscribe after a failure has occured.
 * @property {webOS.service~successCallback} onSuccess - Callback for a successful response.
 * @property {webOS.service~failureCallback} onFailure - Callback for a failed response.
 * @property {webOS.service~completeCallback} onComplete - Callback for when a request is complete 
 *                                                         (regardless of success or failure).
 * @property {function} send - Sends off the request. Automatically called on creation. No arguments.
 * @property {function} cancel - Cancels the service request and any associated subscription. No arguments.
 */

webOS.service = {
	/** Creates and sends off a service request to the system
	 * @param {string} uri - Service URI. Accepts the normal service URI format, as well as the extended format with 
	 *                       the service method included.
	 * @param {object} [params] - Service request options.
	 * @param {string} [params.method] - Service method being called.
	 * @param {object} [params.parameters={}] - JSON object of the request parameters to send.
	 * @param {boolean} [params.subscribe=false] - Whether or not a subscription is desired for this request.
	 * @param {boolean} [params.resubscribe=false] - Whether or not the request should resubscribe after a failure 
	 *                                               has occured.
	 * @param {webOS.service~successCallback} [params.onSuccess] - Callback for a successful response.
	 * @param {webOS.service~failureCallback} [params.onFailure] - Callback for a failed response.
	 * @param {webOS.service~completeCallback} [params.onComplete] - Callback for when a request is complete 
	 *                                                        (regardless of success or failure).
	 * @return {webOS.service~RequestObject} Resulting request object. Can be used to cancel subscriptions.
	 */
	request: function (uri, params) {
		return new LS2Request(uri, params);
	},
	/**
	 * System service for the current device. Either "com.palm" or "com.webos".
	 * @type {string} 
	 */
	systemPrefix: ((webOS.platform.legacy ||
			webOS.platform.open) ? "com.palm" : "com.webos"),
	/**
	 * Service URI protocol for the current device. Either "palm://" or "luna://".
	 * @type {string} 
	 */
	protocol: ((webOS.platform.legacy &&
			webOS.device.platformVersionMajor &&
			parseInt(webOS.device.platformVersionMajor)<=1) ? "palm://" : "luna://")
};
//for unified service request usage between webOS.js and Cordova in enyo-webos components
navigator.service = {request:webOS.service.request};
//temporary fallback for previous syntax
navigator.service.Request = navigator.service.request;
 
@@ -5819,16 +5819,17 @@
 com.palm
+.
 %22 or %22co
@@ -5835,16 +5835,17 @@
 om.webos
+.
 %22.%0A%09 * @
@@ -5941,16 +5941,17 @@
 com.palm
+.
 %22 : %22com
@@ -5956,16 +5956,17 @@
 om.webos
+.
 %22),%0A%09/**

Fix system prefix to include trailing period