// (move into .js comms package)
// communication utils
homebase.comms = {
	
	/**
	*
	* URL encode / decode
	* http://www.webtoolkit.info/
	*
	**/
	
	Url : {
		URI_SEP : "?",
		PARAM_DELIM : "&",
		PARAM_ASSIGN_CHAR : "=",
		ANCHOR_CHAR : "#",
	
	    // public method for url encoding
	    encode : function (string) {
	        return escape(this._utf8_encode(string));
	    },
	
	    // public method for url decoding
	    decode : function (string) {
	        return this._utf8_decode(unescape(string));
	    },
	
	    // private method for UTF-8 encoding
	    _utf8_encode : function (string) {
	        string = string.replace(/\r\n/g,"\n");
	        var utftext = "";
	
	        for (var n = 0; n < string.length; n++) {
	
	            var c = string.charCodeAt(n);
	
	            if (c < 128) {
	                utftext += String.fromCharCode(c);
	            }
	            else if((c > 127) && (c < 2048)) {
	                utftext += String.fromCharCode((c >> 6) | 192);
	                utftext += String.fromCharCode((c & 63) | 128);
	            }
	            else {
	                utftext += String.fromCharCode((c >> 12) | 224);
	                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
	                utftext += String.fromCharCode((c & 63) | 128);
	            }
	
	        }
	
	        return utftext;
	    },
	
	    // private method for UTF-8 decoding
	    _utf8_decode : function (utftext) {
	        var string = "";
	        var i = 0;
	        var c = c1 = c2 = 0;
	
	        while ( i < utftext.length ) {
	
	            c = utftext.charCodeAt(i);
	
	            if (c < 128) {
	                string += String.fromCharCode(c);
	                i++;
	            }
	            else if((c > 191) && (c < 224)) {
	                c2 = utftext.charCodeAt(i+1);
	                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
	                i += 2;
	            }
	            else {
	                c2 = utftext.charCodeAt(i+1);
	                c3 = utftext.charCodeAt(i+2);
	                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
	                i += 3;
	            }
	
	        }
	
	        return string;
	    },
	
		/**
		 * Parse an URL string and get the value for a given parameter
		 * @url the URL to be parsed
		 * @name the parameter name
		 */
		getParameter : function(url, name) {
			var value = null; // parameter value
			
			// validate input url and name and if url has parameters before parsing
			if (url && name && url.indexOf(homebase.comms.Url.URI_SEP)!=-1) {			
				var paramStr = url.substring(url.indexOf(homebase.comms.Url.URI_SEP)); 
				var paramIndex = paramStr.indexOf(name);
				
				if (paramIndex!=-1) { // parameter found
					var valueStart = paramIndex + name.length + homebase.comms.Url.PARAM_ASSIGN_CHAR.length;
					var valueEnd = paramStr.indexOf(homebase.comms.Url.PARAM_DELIM, valueStart);

					if (valueEnd == -1) {	// parameter is the last one
						valueEnd = paramStr.indexOf(homebase.comms.Url.ANCHOR_CHAR, valueStart);
						if (valueEnd == -1) { // check for anchor maker
							valueEnd = paramStr.length;
						}
					}
					
					value = paramStr.substring(valueStart, valueEnd);
				}
			}
			
			return value;			
		}
	}

};