/**
 * @requires OpenLayers/OpenLayers.js
 * @requires GMES.js
 */

/**
 * Class: GMES.Requests
 */
GMES.Request = OpenLayers.Class({

	layerList : null,
	currentProject : "",
	currentService : "",

	 /**
	  * Constructor: GMES.Layer
	  * Create a new GMES layer object
	  */
	initialize: function(layerList) {
		GMES.assert(layerList!=null,"layerList should not be null");
		this.layerList = layerList;
	},

	updateLayerChooser: function() {
		GMES.assert(this.layerList!=null,"layerList should not be null");
		var chosenLayers= this.layerList.getLayerNames().join(",");

		var params = "action=updatelayerchooser&page=" + this.layerList.getPagerIndex();
		params += "&chosenLayers=" + chosenLayers;
		params += this.getFilterString(this.layerList.getFilterItems());
		this.updateComponent("layerchooser",params);
	},

	updateLayerManager: function() {
		var pageIndex = GMES.request.layerList.getPagerIndex();
		var filterItems =  GMES.request.layerList.getFilterItems();
		var params = "action=updatelayermanager"
			+ "&layers=" +  GMES.request.layerList.getLayerNames()
			+ "&opacities=" +  GMES.request.layerList.getOpacities()
			+ "&visibilities=" +  GMES.request.layerList.getVisibilities()
			+ "&legendVisibilities=" +  GMES.request.layerList.getLegendVisibilities();
		if (typeof pageIndex == 'undefined') {
			pageIndex = 1;
		}
		params += "&page=" + pageIndex;
		GMES.request.updateComponent("menurightLayer", params);
	},

	updateMetadata: function(event) {
		var params = "action=updatemetadataview&layer=" + GMES.request.getLayerNameFromEvent.call(GMES.request,event);
		GMES.request.updateComponent.call(GMES.request,"metadata",params,GMES.request.getNotifyFunction.call(GMES.request,"metadata","Requesting metadata from CSW..."));
	},

	updateEMailForm: function(event) {
		var params = "action=updateemailform&layer=" + GMES.request.getLayerNameFromEvent.call(GMES.request,event);
		GMES.request.updateComponent.call(GMES.request,"metadata",params,GMES.request.getNotifyFunction.call(GMES.request,"email","Requesting email form ..."));
	},

	sendEmail: function(event) {
		var params = "action=sendemail" +
				"&emailname=" + $('emailname').value +
				"&emailfrom=" + $('emailaddress').value +
				"&emailcompany=" + $('emailcompany').value +
				"&emailmessage=" + $('emailtext').value;
		this.post(params);
	},

	updateWmsLayerList: function(wmsurl) {
		var params = "action=getwmslayerlist&wmsurl="+wmsurl;
		this.updateComponent("menuleftWms", params, this.getNotifyFunction("menuleftWms","Loading ..."),
				function(transport) {
					$(menuleftWms).innerHTML = transport.responseText;
					GMES.gui.setLayerChooserHeight();
				});
	},

	updateExtrasWindow: function(pageName) {
		var params = "action=updateextraswindow&extraspage="+pageName;
		this.updateComponent("extrascontent", params);
	},

	updateFilters: function(project, service) {
		if (project != this.currentProject) {
			this.updateServiceList(project);
			this.updateProductList(project, service);
			this.currentProject = project;
		} else if (service != this.currentService) {
			this.updateProductList(project, service);
			this.currentService = service;
		}
	},

	updateServiceList: function(newProject) {
		this.currentService = "";
		var params = "action=getservicelist&project=" + newProject;
		this.updateComponent(null, params, null,
			function(transport) {
				var services = transport.responseText.split(",");
				this.updateServices(services);
			});
	},

	updateServices: function(services) {
		var serviceSelect = $('filterservice');
		serviceSelect.value="";
		for (i = serviceSelect.length - 1; i>=0; i--) {
			serviceSelect.remove(i);
		}
		var optionEntry = new Option("No Selection", "");
		serviceSelect[0]=(optionEntry);
		for (i = 0; i < services.length; i++) {
			if (typeof services[i] != 'undefined'  && services[i].length > 0) {
				var optionEntry = new Option(services[i], services[i]);
				serviceSelect[i+1]=(optionEntry);
			}
		}
	},

	updateProductList: function(newProject, newService) {
		var params = "action=getproductlist&project=" + newProject + "&service=" + newService;
		this.updateComponent(null, params, null,
				function(transport) {
					var products = transport.responseText.split(",");
					this.updateProducts(products);
				}
			);
	},

	 updateProducts: function(products) {
		var productSelect = $('filterproduct');
		productSelect.value="";
		for (i = productSelect.length - 1; i>=0; i--) {
			productSelect.remove(i);
		}
		var optionEntry = new Option("No Selection", "");
		productSelect[0]=(optionEntry);
		for (i = 0; i < products.length; i++) {
			if (typeof products[i] != 'undefined' && products[i].length > 0) {
				var optionEntry = new Option(products[i], products[i]);
				productSelect[i+1]=(optionEntry);
			}
		}
	},

	getLayerNameFromEvent: function(event){
		var element = event.element();
		return element.id.split(".")[1];
	},

	getFilterString : function(filterItems) {
		var filters = filterItems;
		if (GMES.isArrayEmpty(filters)) {
			filters = new Array(5);
		}
		for (var i = 0 ; i < 5; i++) {
			if (typeof filters[i] == 'undefined') {
				filters[i]="";
			}
		}
		var keyValues = ['&filters=project:' + filters[0],'service:' + filters[1],'product:' + filters[2],'freetext:' + filters[3],'boundingbox:'+filters[4].gsub(/,/,'|')];
		return keyValues.join(",");
	},

	updateComponent: function(componentName,params,notify,complete){
		GMES.debug("Arguments: "+Array.prototype.join.call(arguments," ,"))
		var ajax = new Ajax.Updater( { success : componentName }, "", { method : 'get', evalScripts: true, parameters : params,onLoading: notify,onComplete: complete });
	},

	post: function(params){
		var ajax = new Ajax.Request("", {method: 'post',evalScripts: true,parameters : params });
	},

	getNotifyFunction: function(componentName,message){
		return function(transport) {
			$(componentName).innerHTML="<div class=\"notify-box\">"
				+"<div class=\"notify\">"
				+"<div class=\"loadingspinner\">"
				+"<span>"+message+"</span>"
				+"</div>"
				+"</div>"
				+"</div>";
			};
	},

	saveWMCDocument: function(name){
		var name = $('wmcname').value;
		var wmc = {
			layers: GMES.layerList.getLayersAsJSON(),
			bbox: GMES.map.getExtent(),
			filters: GMES.layerList.getFilterItems(),
			legends: GMES.layerList.legendVisibilities,
		}
		GMES.request.saveWMC(name,Object.toJSON(wmc));
		return false;
	},

	loadWMCDocument: function(id){
		GMES.request.loadWMC(id);
	},

	requestWMCMap: function(){
		new Ajax.Request("wmc/list", {
			method: 'get',
			onSuccess: function(response) {
				var xml = new OpenLayers.Format.XML();
				var rootNode = xml.read(response.responseText);
				var nodesList = rootNode.getElementsByTagName("wmc");
				var listAsLinks = "";
				var wmcMap = new Hash();
				for(var i =0;i < nodesList.length;i++){
					var node = nodesList[i];
					var key = node.getAttribute("id");
					var value = xml.getChildValue(node);
					wmcMap.set(key,value);
					listAsLinks+="<li onclick=\"GMES.request.loadWMC('"+key+"');\"><a class=\"label\" href=\"#\" onclick=\"GMES.request.loadWMC('"+key+"');\" title=\"Add to layer list\">"+value+"</a>";
					listAsLinks+="<a href=\"#\" onclick=\"GMES.request.removeWMC('"+key+"');\">Delete</a><img class=\"button-delete\" onclick=\"GMES.request.removeWMC('"+key+"');\" src=\"images/blank.png\" title=\"Delete this WMC\"/></div>";
				};
				$('wmclist').update(listAsLinks);
			}
		});
	},

	saveWMC: function(name,wmc){
		new Ajax.Request("wmc/store?"+Object.toQueryString({'name':name}), {
			method: 'post',
			postBody: wmc,
			onSuccess: function(response) {
				GMES.gui.showInfo("<h3>WMC Document saved as "+name+'</h3>');
				GMES.request.requestWMCMap();
			}
		});
		return false;
	},

	loadWMC: function(id){
		new Ajax.Request("wmc/get", {
			method: 'get',
			parameters: {'id':id},
			onCreate: this.getNotifyFunction("wmcNotify","Loading ..."),
			onSuccess: function(response) {
				GMES.layerList.getLayerNames().each(function(layername){
					GMES.layerList.removeLayer(layername);
				});
				var wmc = response.responseText.evalJSON();
				GMES.map.zoomToExtent(new OpenLayers.Bounds(wmc.bbox.left,wmc.bbox.bottom,wmc.bbox.right,wmc.bbox.top));
				wmc.layers.each(function(layerAsJSON){
					var l = layerAsJSON.evalJSON(true);
					var newLayer = new GMES.Layer(l.name, l.region, l.product, l.url, l.params, l.options);
					GMES.layerList.addLayer(newLayer);
					GMES.layerList.setOpacity(l.name,l.opacity);
					GMES.layerList.setVisibility(l.name,l.visibility);
				});
				GMES.layerList.legendVisibilities = wmc.legends;
				GMES.layerList.setFilterItems(wmc.filters);
				GMES.request.updateLayerChooser();
				GMES.request.updateLayerManager();
				$('wmcNotify').innerHTML="";
			}
		});
		return false;
	},

	removeWMC: function(id){
		new Ajax.Request("wmc/remove", {
			method: 'get',
			parameters: {'id':id},
			onCreate: null,
			onSuccess: function(response) {
				$('wmcNotify').innerHTML="";
				GMES.gui.showInfo("<h3>WMC Document "+id+" removed.</h3>");
				GMES.request.requestWMCMap();
			}
		});
		return false;
	}
});
