/**
 * @author alexander.farkas
 */
/**
* JS-Singelton-Klasse um Pfade und Get-Parameter auselesen zu k�nnen<br> 
* Um die meisten Methoden und Eigenschaften nutzen zu k�nnen muss die createPaths-Methode aufgerufen werden.
* @id locationModule
* @alias $.location
*/


/**
 * 	Wandlet einen durch & (default) und = (default) getrennten String in ein Object um
 * 
 * @id strToObj
 * @method
 * @alias $.location.strToObj
 * @param {String} [str] String der umgewandelt werden soll. default ist location.search 
 * @return {Object} Gibt Objekt zur�ck
 */
 
/**
 * 	Pr�ft, ob ein GET-Parameter gesetzt wurde, gibt auch dann true zur�ck, wenn der Parameter einen leeren String als Wert hat
 * 
 * @id issetQuery
 * @method
 * @alias $.location.issetQuery
 * @param {String} name Name des zu untersuchenden Parameters
 * @return {Boolean}
 */
/**
 * Object, welches alle GET-Parameter der aufgerufenen Seite enth�lt
 * @id querys
 * @type Object
 * @alias $.location.querys
 */
(function($){
	/**
	 * @id locationModule
	 */
	$.location = (function(){
		/**
		 * @id querys
		 */
		var querys = {};
		
		/**
		 * @id issetQuery
		 */
		function issetQuery(name){
			return (querys[name] || querys[name] === '');
		}
		/**
		 * @id strToObj
		 */
		function strToObj(str, opts){
			var obj = {};
			opts =  $.extend({
				decode: false,
				seperator: /&/g,
				assignator: /\=/
			}, opts);
			if (str) {
				
				if('&'.replace(opts.seperator, '1') === '1'){
					str = str.substr(str.indexOf('?') + 1).replace(/&amp;/g, '&');
				}
				str = str.split(opts.seperator);
				$.each(str, function(i, param){
					queryPair = param.split(opts.assignator);
					if (opts.decode) {
						obj[decodeURIComponent(queryPair[0]).replace(/\+/g, ' ')] = (queryPair[1]) ? decodeURIComponent(queryPair[1]).replace(/\+/g, ' ') : '';
					}
					else {
						obj[queryPair[0]] = (queryPair[1]) ? queryPair[1] : '';
					}
				});
			}
			return obj;
		}
		
		/**
		 * @id objToStr
		 */
		function objToStr(obj, opts) {
			var strAr = [], str = '';
			opts =  $.extend({
				decode: false,
				seperator: '&',
				assignator: '='
			}, opts);
			if (opts.decode) {
				for (prop in obj) {
					strAr.push((obj[prop]) ? encodeURIComponent(prop).replace(' ', '+') + opts.assignator + encodeURIComponent(obj[prop]).replace(' ', '+') : encodeURIComponent(prop).replace(' ', '+') );
				}
			} else {
				for (prop in obj) {
					strAr.push( (obj[prop]) ? prop + opts.assignator + obj[prop] : prop );
				}
			}
			str = strAr.join(opts.seperator);
			
			return str;
		}
		
		querys = strToObj(location.search);
		
		return {
			querys: querys,
			issetQuery: issetQuery,
			strToObj: strToObj,
			objToStr: objToStr
		};
	})();
})(jQuery);
