
/**
 * ???
 */
Navigo2.DAO = new function() {

	var messages = $H();
	var package = '';

	Event.observe(document, 'dao:locale', function(event) {
		locale = event.memo.args[0];
	});

	this.ask = function(/*String*/url, /*Function*/callback, /*Function*/msgCallback, /*Function*/errorCallback)
	{
		var id = Math.round(Math.random() * 65535);
		var script = document.createElement("script");
		script.setAttribute("type", "text/javascript");
		script.setAttribute("charset", "utf-8");
		script.setAttribute("src", url + "&ask=" + id);
		script.setAttribute("id", id);
		script.callback = callback;
        if(msgCallback != undefined) {
            script.msgCallback = msgCallback;
        } else {
            script.msgCallback = function(msg) {
                var message = Navigo2.DAO.getMessage(msg);
                if(message != undefined) {
                    Navigo2.info(message);
                } else {
                    Navigo2.info(msg);
                }
            }
        }
        if(errorCallback != undefined) {
            script.errorCallback = errorCallback;
        } else {
            script.errorCallback = function(msg) {
                var message = Navigo2.DAO.getMessage(msg);
                if(message != undefined) {
                    Navigo2.warning(message);
                } else {
                    Navigo2.warning(msg);
                }
            }
        }
        $$('head')[0].appendChild(script);        
	}	

	/**
	 * ???
	 */
	
	this.init = function() {
		this.ask(Navigo2.normalisedURL('messages.do?prefix=javascript'), function(json) {
			$A(json.messages).each(function(item) {	messages.set(item.key, item.value);	});
		});
		
		this.ask(Navigo2.normalisedURL('getPackageVersion.do'), function(json) {
			package = json.package;
		});
	}
	
	/*new Ajax.Request(Navigo2.normalisedURL('messages.do?prefix=javascript'),
	{
		method: 'get',
		onSuccess: function(transport) {
			var data = transport.responseJSON;
			$A(data.messages).each(function(item) {			
				messages.set(item.key, item.value);
			});
		}
	});	*/

	/**
	 * ???
	 */
	this.getMessage = function(/*String*/key) /*String*/
	{
		return messages.get(key);
	}

	this.getPackage = function() /*String*/
	{
		return package;
	}

	/**
	 * ???
	 */
	this.getComponent = function(/*String*/name, /*Function*/callback) /*String*/
	{
		var params = Object.toQueryString({
			viewName: name
		});
		this.ask(Navigo2.normalisedURL('default.do?' + params), callback);
		
		/*
		new Ajax.Request(Navigo2.normalisedURL('default.do?viewName=' + name),
		{
			method: 'get',
			crossSite: true,
			asynchronous: false,
			onSuccess: function(transport) {
				var html = transport.responseText;
				if(typeof callback == 'function') {
					callback.apply(this, [Navigo2.normalisedHTML(html)]);
				}
			}
		});	
		*/
	}	

	/**
	 * ???
	 */
	this.getMapComponent = function(/*String*/clip, /*String*/config_url, /*String*/params, /*String*/mvaId, /*Function*/callback) /*String*/
	{
		var params = Object.toQueryString({
			viewName: 'component.map',
			clip: clip,
			configUrl: config_url,
			params: params,
            mvaId: mvaId
		});
		
		this.ask(Navigo2.normalisedURL('default.do?' + params), callback);
		
		/*new Ajax.Request(Navigo2.normalisedURL('default.do'),
		{
			method: 'get',
			parameters: {
				viewName: 'component.map',
				configUrl: config_url,
				lang: lang
			},
			asynchronous: false,
			onSuccess: function(transport) {
				var html = transport.responseText;
				if(typeof callback == 'function') {
					callback.apply(this, [Navigo2.normalisedHTML(html)]);
				}
			}
		});*/
	}	
	
	/**
	 * ???
	 */
	this.getMenuComponent = function(/*String*/name, /*String*/selected, /*Function*/callback) /*String*/
	{
		var params = Object.toQueryString({
			viewName: name,
			selected: selected
		});
		this.ask(Navigo2.normalisedURL('default.do?' + params), callback);
	}
	
	/**
	 * ???
	 */
	this.getAddressData = function(/*String*/address, /*Long*/objectId, /*Function*/callback) /*Object*/
	{
		var params = Object.toQueryString({
			address: address,
			objectId: objectId
		});
		
		this.ask(Navigo2.normalisedURL('findObject.do?' + params), callback);
		
		/*new Ajax.Request(Navigo2.normalisedURL('findObject.do'),
		{
			method: 'get',
			parameters: {
				address: address,
				objectId: objectId
			},
			onSuccess: function(transport) {
				var data = transport.responseJSON;
				if(typeof callback == 'function') {
					callback.apply(this, [data]);
				}
			},
			onFailure: function(transport) {
				Navigo2.warning("Błąd serwera");
			},
			onException: function(transport) {
				Navigo2.warning("Błąd serwera");
			}
		});*/
	}
	
	/**
	 * Pobiera ekran poczatkowy mapy.
	 */
	this.getInitialScreen = function(/*Function*/callback) {
		
		if (Navigo2.DAO.getPackage() == 'gold') {
			var params = Object.toQueryString({
				uname:uname,
				adapter:adapter
			});
			this.ask(Navigo2.normalisedURL('getInitialScreen.do?' + params), callback);
		}
		
    	/*new Ajax.Request(Navigo2.normalisedURL("getInitialScreen.do"), {
    			method:"get",
    			parameters:{
    				uname:uname,
    				adapter:adapter
    			//,
    			//	x:x,
    			//	y:y,
    			//	scale:scale
    			},
    			onSuccess:function(transport) {
		            var data = transport.responseJSON;
        		    if (typeof callback == "function") {
                		callback.apply(this, [data]);
		            }
        		},
        		onFailure:function(transport) {
		            Navigo2.warning("Błąd serwera");
        		},
        		onException:function(transport) {
        		    Navigo2.warning("Błąd serwera");
		        }
		});*/
    };

	/**
	 * ???
	 */
	this.getRouteData = function(	/*String[]*/address,
									/*Long[]*/addressIds,
									/*String*/type, 
									/*Integer*/nbTransfers, 
									/*String*/deprtureTime, 
									/*Integer*/dpi, 
									/*Boolean*/departure, 
									/*String*/single, 
									/*Function*/callback) /*Object*/
	{

		var params = Object.toQueryString({
			type: type,
			from: address.shift(),
			fromId: addressIds.shift(),
			to: address.pop(),
			toId: addressIds.pop(),
			via: address,
			viaId: addressIds,
            transferNb: nbTransfers,
            departureTime: deprtureTime,
            dpi: dpi,
            departure: departure,
            single: single
		});
		
		this.ask(Navigo2.normalisedURL('traceRoute.do?' + params), callback);
		
		/*new Ajax.Request(Navigo2.normalisedURL('traceRoute.do'),
		{
			method: 'get',
			parameters: {
				type: type,
				from: address.shift(),
				to: address.pop(),
				via: address
			},
			onSuccess: function(transport) {
				var data = transport.responseJSON;
				if(typeof callback == 'function') {
					callback.apply(this, [data]);
				}
			},
			onFailure: function(transport) {
				Navigo2.warning("Błąd połączenia");
			},
			onException: function(transport) {
				Navigo2.warning("Błąd serwera");
			}
		});*/
	}

    this.getBusStaions = function(/*String*/token, /*String*/denom, /*Object*/busImage, /*Function*/callback) /*Object*/
	{

		var params = Object.toQueryString({
			token: token,
            denom: denom,
            urlBusImage: busImage.urlBusImage,
            urlBusSpecialImage: busImage.urlBusSpecialImage,
            urlBusChangeImage: busImage.changeImage.url,
            specialFormula: busImage.specialFormula,
            changeImgW: busImage.changeImage.w,
            changeImgH: busImage.changeImage.h,
            changeImgPosX: busImage.changeImage.posX,
            changeImgPosY: busImage.changeImage.posY,
            changeImgFontSize: busImage.changeImage.fontSize,
            changeImgFontColor: busImage.changeImage.fontColor
            
		});
		this.ask(Navigo2.normalisedURL('getBusStations.do?' + params), callback);

		/*new Ajax.Request(Navigo2.normalisedURL('traceRoute.do'),
		{
			method: 'get',
			parameters: {
				type: type,
				from: address.shift(),
				to: address.pop(),
				via: address
			},
			onSuccess: function(transport) {
				var data = transport.responseJSON;
				if(typeof callback == 'function') {
					callback.apply(this, [data]);
				}
			},
			onFailure: function(transport) {
				Navigo2.warning("Błąd połączenia");
			},
			onException: function(transport) {
				Navigo2.warning("Błąd serwera");
			}
		});*/
	}

    /**
	 * ???
	 */
	this.getAlternateRouteData = function(/*String*/token, /*Function*/callback) /*Object*/
	{

		var params = Object.toQueryString({
			token: token
		});

		this.ask(Navigo2.normalisedURL('traceAlternateRoute.do?' + params), callback);
    }
    
	/**
	 * ???
	 */
	this.findAddress = function(/*String*/type, /*Number*/num, /*Array*/coords, /*Function*/callback) /*Object*/
	{
		var params = Object.toQueryString({
			type: type,
			point: num,
			x92: coords[0],
			y92: coords[1]
		});
		this.ask(Navigo2.normalisedURL('findAddress.do?' + params), callback);
		
		/*new Ajax.Request(Navigo2.normalisedURL('findAddress.do'),
		{
			method: 'get',
			parameters: {
				type: type,
				point: num,
				x92: coords[0],
				y92: coords[1]
			},
			onSuccess: function(transport) {
				var data = transport.responseJSON;
				if(typeof callback == 'function') {
					callback.apply(this, [data]);
				}
			},
			onFailure: function(transport) {
				Navigo2.warning("Błąd połączenia");
			},
			onException: function(transport) {
				Navigo2.warning("Błąd serwera");
			}
		});*/
	}
	
	/***********************************************************************
	 * POIs DAO methods
	 ***********************************************************************/
	/**
	 * Pobiera dane punktow POI
	 */
	this.getPoisNearTo = function(/*Long*/x, 
									/*Long*/y, 
									/*Long*/scale,
									/*left, top, right, bottom*/bbox,
									/*String*/token, 
									/*String*/categories,
									/*Function*/callback) {
		if(token == undefined) { token = ''; }
		if(categories == undefined) { categories = ''; }
		var params = Object.toQueryString({
			uname:uname,
			adapter:adapter,
			x:x,
			y:y,
			scale:scale,
			bbox:bbox,
			token:token,
			categories:categories,
			locale:locale
		});
		//alert(Navigo2.normalisedURL('findPoisNearTo.do?' + params));
		this.ask(Navigo2.normalisedURL('findPoisNearTo.do?' + params), callback);
		
    	/*new Ajax.Request(Navigo2.normalisedURL("findPois.do"), {
    			method:"get",
    			parameters:{
    				uname:uname,
    				adapter:adapter,
    				x:x,
    				y:y,
    				scale:scale,
    				token:token,
    				categories:categories
    			},
    			onSuccess:function(transport) {
		            var data = transport.responseJSON;
        		    if (typeof callback == "function") {
                		callback.apply(this, [data]);
		            }
        		},
        		onFailure:function(transport) {
		            Navigo2.warning("Błąd serwera");
        		},
        		onException:function(transport) {
        		    Navigo2.warning("Błąd serwera");
		        }
		});*/
    };
    
	/**
	 * Pobiera dane najblizszego punktu POI
	 */
	this.getPoiNearestTo = function(/*Long*/x, /*Long*/y, /*Long*/scale, /*String*//*token,*/ /*String*//*categories,*/ /*Function*/callback) {
		//if(token == undefined) { token = ''; }
		//if(categories == undefined) { categories = ''; }
		
		var params = Object.toQueryString({
			uname:uname,
			adapter:adapter,
			x:x,
			y:y,
			scale:scale,
			locale:locale
			
//			,
//			token:token,
//			categories:categories
		});
		//alert('findPoiNearestTo.do?' + params);
		this.ask(Navigo2.normalisedURL('findPoiNearestTo.do?' + params), callback);
		//alert('afterAsk');
    };

    /**
	 * Pobiera liste kategorii punktow POI
	 */
	this.getPoisCategories = function(/*Function*/callback) {
		
		var params = Object.toQueryString({
			uname:uname,
			adapter:adapter,
			locale:locale
		});
		//alert(Navigo2.normalisedURL('getPoisCategories.do?' + params));
		this.ask(Navigo2.normalisedURL('getPoisCategories.do?' + params), callback);
    	/*new Ajax.Request(Navigo2.normalisedURL("getPoisCategories.do"), {
    			method:"get",
    			parameters:{
    				uname:uname,
    				adapter:adapter,
    			},
    			onSuccess:function(transport) {
		            var data = transport.responseJSON;
        		    if (typeof callback == "function") {
                		callback.apply(this, [data]);
		            }
        		},
        		onFailure:function(transport) {
		            Navigo2.warning("Błąd serwera");
        		},
        		onException:function(transport) {
        		    Navigo2.warning("Błąd serwera");
		        }
		});*/
    };   
    
    this.findPoisByExtId = function(/*String*/extIds, 
    								/*String*/extCategories, 
    								/*Integer*/flag, 
    								/*Integer*/scale, 
    								/*left, top, right, bottom*/bbox, 
    								/*Function*/callback)	
    {	
		var params = Object.toQueryString({
			uname:uname,
			adapter:adapter,
			extIds:extIds,
			extCategories:extCategories,
			flag:flag,
			locale:locale,
			scale:scale,
			bbox:bbox
		});
		this.ask(Navigo2.normalisedURL('findPoisByExtId.do?' + params), callback);
    }
    
    this.findPois = function(/*String*/token, 
    						/*String*/categories, 
    						/*Integer*/flag, 
    						/*Integer*/scale, 
    						/*left, top, right, bottom*/bbox, 
    						/*Function*/callback)
    {	
		var params = Object.toQueryString({
			uname:uname,
			adapter:adapter,
			token:token,
			categories:categories,
			flag:flag,
			scale:scale,
			bbox:bbox,
			locale:locale
		});
		this.ask(Navigo2.normalisedURL('findPois.do?' + params), callback);
    }
    
    this.getPoi = function(/*Long*/id, /*Function*/callback)
    {	
		var params = Object.toQueryString({
			uname:uname,
			adapter:adapter,
			id:id,
			locale:locale
		});
		this.ask(Navigo2.normalisedURL('getPoi.do?' + params), callback);
    }
    
    /**
     * Ogolne wyszukiwanie punktow POI
     */
    this.searchPOIs = function(/*POIFilter*/filter, 
    							/*PagingFilter*/pagingFilter,
    							/*Long*/scale, 
    							/*left, top, right, bottom*/bbox,
    							/*Function*/callback)
    {
    	var params = paramsToQueryString(filter, pagingFilter, scale, bbox);
    	this.ask(Navigo2.normalisedURL('searchPois.do?' + params), callback);
    }
    
    var paramsToQueryString = function(/*POIFilter*/filter, /*PagingFilter*/pagingFilter, /*Long*/scale, /*left, top, right, bottom*/bbox) 
    {
    	var p = {};
    	p.u = uname;
		p.a = adapter;
    	if(filter.keyword!=undefined) p.k = filter.keyword;
    	if(filter.id) p.id = filter.id; 
    	if(filter.categories) p.c = filter.categories;
    	if(filter.extIds) p.eids = filter.extIds; 
    	if(filter.extCategories) p.ecs = filter.extCategories;
    	if(filter.flag) p.f = filter.flag;
    	if(filter.addr) { 
    		p.x = filter.addr.x; 
    		p.y = filter.addr.y; 
    		p.sys = filter.addr.sys; 
    		p.r = filter.addr.radius; 
    	}
    	
    	if(pagingFilter != undefined) {
    		if(pagingFilter.page != undefined) p.page = pagingFilter.page;
    		if(pagingFilter.perPage != undefined) p.perPage = pagingFilter.perPage;
    	}
    	
    	p.s = scale;
    	p.bb = bbox;
    	p.l = locale;
    	return Object.toQueryString(p);
    }   
    /***********************************************************************
	 * end POIs DAO methods
	 ***********************************************************************/
}();

