com_starsensortech_www_atms_fastrack_adapter = new es_lang.Package(true,
	/*Title*/   'The fastrack server <- client adapter/binding',
	/*Docs */   '-- none --',
	/*Package*/ function() {
		// Package
		var LANG = es_lang;
		var LOG = es_util_logging;
		var NET = es_net;
		var WU = com_pagasg_www_util;
		var MPNG = com_starsensortech_www_atms_mapping;
		var FST = com_starsensortech_www_atms_fastrack;
		var XSER = com_pagasg_xxapp_serialize;
		
		// Constructor imports
		var Class = LANG.Class;
		var Enum = LANG.Enum;
		var StringBuilder = LANG.StringBuilder;

		var Objects = WU.Objects;
		var Elements = WU.Elements;
		var Strings = WU.Strings;
		var Container = WU.Container;

		var Converter = MPNG.Converter;
		var Point = MPNG.Point;
		var Extent = MPNG.Extent;
		var Handle = MPNG.Handle;
		var Dot = MPNG.Dot;
		var Ellipse = MPNG.Ellipse;

		var Unit = FST.Unit;

		var extend = Class.extend;
		var implement = Class.implement;
		var enumerate = Enum.enumerate;

		// Namespace Imports
		var NS = FST.NS;

		// ****** HttpBinding ******
		FastrackHttpBinding = {
			webapp: /*FST.WebApplication*/ undefined,
			logger: LOG.Logger.getLogger('com.starsensortech.www.ez2track.driver.FastrackHttpBinding'),
			serializer: new XSER.Serializer(),

			startup: function(webapp) {
				FastrackHttpBinding.webapp = webapp;
			},
			loadSession: function(session) {
				var credentials;
				var sessionXml;
				var errorXml;

				if (this.webapp && session) {
					sessionXml = session(this.serializer.deserialize);
					errorXml = sessionXml.getChild('error');

					if (errorXml == null) {
						this.webapp.session.setCredentials(sessionXml.getChild('credentials'));
					} else {
						alert('Your login information was not valid, please try again.');
					}
				} else if (this.webapp) {
					this.logger.warning('Session loaded prior to webapp.');
				}
			},
			handleSetStarterDisable: function(response) {
				var unit;
				var unitKey;
				var unitXml;
				var errorXml;
				var responseXml;
				var session = this.webapp.session;

				if (response) {
					responseXml = response(FastrackHttpBinding.serializer.deserialize);

					errorXml = responseXml.getChild('error');
					if (errorXml == null) {
						if (session && session.isLoggedOn()) {
							unitXml = responseXml.getChild('unit', NS.store);
							unitKey = unitXml.getAttribute('external-id', NS.atms);
							
							unit = FastrackHttpBinding.webapp.units.get(unitKey);
							if (unit == null) {
								unit = new Unit(unitXml);
							} else {
								unit.xml = unitXml;
							}
							this.webapp.units.put(unitKey, unit);
						} else {
							alert('You are not logged on');
						}
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},
			handleSetSpeedThreshold: function(response) {
				var unit;
				var unitKey;
				var unitXml;
				var errorXml;
				var responseXml;
				var session = this.webapp.session;

				if (response) {
					responseXml = response(FastrackHttpBinding.serializer.deserialize);

					errorXml = responseXml.getChild('error');
					if (errorXml == null) {
						if (session && session.isLoggedOn()) {
							unitXml = responseXml.getChild('unit', NS.store);
							unitKey = unitXml.getAttribute('external-id', NS.atms);
							
							unit = FastrackHttpBinding.webapp.units.get(unitKey);
							if (unit == null) {
								unit = new Unit(unitXml);
							} else {
								unit.xml = unitXml;
							}
							this.webapp.units.put(unitKey, unit);
						} else {
							alert('You are not logged on');
						}
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},
			handleUnitUpdate: function(response) {
				var unit;
				var unitKey;
				var unitXml;
				var errorXml;
				var responseXml;
				var session = this.webapp.session;

				if (response) {
					responseXml = response(FastrackHttpBinding.serializer.deserialize);

					errorXml = responseXml.getChild('error');
					if (errorXml == null) {
						if (session && session.isLoggedOn()) {
							unitXml = responseXml.getChild('unit', NS.store);
							unitKey = unitXml.getAttribute('external-id', NS.atms);
							
							unit = FastrackHttpBinding.webapp.units.get(unitKey);
							if (unit == null) {
								unit = new Unit(unitXml);
							} else {
								unit.xml = unitXml;
							}
							this.webapp.units.put(unitKey, unit);
						} else {
							alert('You are not logged on');
						}
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},
			handleSetPerimeter: function(response) {
				alert('The zone was update was successfully submitted.\rNote: if the unit is not current powered on or cannot be contacted, it may take some time for the zone information to be updated.');
				FastrackHttpBinding.handleUnitUpdate(response);
			},
			handleLocate: function(response) {
				var serial;
				var reportXml;
				var report;

				if (response) {
					responseXml = response(FastrackHttpBinding.serializer.deserialize);
					reportXml = responseXml.getChild('report');

					// TODO: Put this report as the last report for the unit
					if (reportXml) {
						serial = reportXml.getChild('serial').text;
						this.webapp.reports.put(serial, reportXml);
						this.webapp.onLocate.fire({ responded: true, response: responseXml, serial: serial });
					} else {
						this.webapp.onLocate.fire({ responded: false });
						alert('The unit did not respond');
					}
				}
			},
			handleRenewResponse: function(session) {
				var fn;
				var item;
				var xml;
				var extId;
				var xmlList;
				var errorXml;
				var sessionXml;
				var container;
				var containers;
				var fns = [ FST.Unit, FST.Notifier, FST.Region, FST.Report ];
				var types = [ 'unit', 'notifier', 'region', 'report' ];
				var webapp = FastrackHttpBinding.webapp;

				if (webapp) {
					containers = [ webapp.units, webapp.notifiers, webapp.regions, webapp.reports ];
					if (session) {
						sessionXml = session(this.serializer.deserialize);
						errorXml = sessionXml.getChild('error');

						if (errorXml == null) {
							for (var type = 0; type < types.length; type++) {
								xmlList = sessionXml.getChildren(types[type]);
								container = containers[type];
								fn = fns[type]

								container.startTransaction();
								try {
									for (var i = 0; i < xmlList.length; i++) {
										xml = xmlList[i];
										extId = xml.getAttribute('external-id', NS.atms);

										if (!container.contains(extId)) {
											item = new fn(xml);
											container.put(extId, item);
										}
									}
								} catch (e) {
									FastrackHttpBinding.logger.info(Objects.display(e, 1));
								} finally {
									container.endTransaction();
								}
							}
						} else {
							alert(errorXml.getChild('description'));
						}
					}
				}
			},
			handlePollResponse: function(response) {
				var unit;
				var unitXml;
				var extId;
				var unitList;
				var responseXml;
				var units = this.webapp.units;

				if (response) {
					responseXml = response(this.serializer.deserialize);

					unitList = responseXml.getChildren('unit');

					for (var i = 0; i < unitList.length; i++) {
						unitXml = unitList[i];
						extId = unitXml.getAttribute('external-id', NS.atms);

						if (!units.contains(extId)) {
							unit = new FST.Unit(unitXml);
							units.put(extId, unit);
						}
					}
				}
			},
			handleContactUpdate: function(response) {
				var credentialsXml;
				var priorContactXml;
				var contactXml;
				var errorXml;
				var responseXml;
				var session = this.webapp.session;

				if (response) {
					responseXml = response(this.serializer.deserialize);

					errorXml = responseXml.getChild('error');
					if (errorXml == null) {
						if (session && session.isLoggedOn()) {
							credentialsXml = session.credentials;
							if (credentialsXml) {
								priorContactXml = credentialsXml.getChild('contact');
								contactXml = responseXml.getChild('contact', NS.store);
								
								if (contactXml) {
									credentialsXml.replaceChild(priorContactXml, contactXml);
									session.onUpdateContact.fire({ contact: contactXml, priorContact: priorContactXml });
								}
							}
						} else {
							alert('You are not logged on');
						}
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},
			handleUserUpdate: function(response) {
				var credentialsXml;
				var priorUserXml;
				var userXml;
				var errorXml;
				var responseXml;
				var session = this.webapp.session;

				if (response) {
					responseXml = response(this.serializer.deserialize);

					errorXml = responseXml.getChild('error');
					if (errorXml == null) {
						if (session && session.isLoggedOn()) {
							credentialsXml = session.credentials;
							if (credentialsXml) {
								priorUserXml = credentialsXml.getChild('user');
								userXml = responseXml.getChild('user', NS.store);

								if (userXml) {
									credentialsXml.replaceChild(priorUserXml, userXml);
									session.onUpdateUser.fire({ user: userXml, priorUser: priorUserXml });
								}
							}
						} else {
							alert('You are not logged on');
						}
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},
			handleNotifierUpdate: function(response) {
				var notifier;
				var credentialsXml;
				var notifierKey;
				var notifierXml;
				var errorXml;
				var responseXml;
				var session = this.webapp.session;

				if (response) {
					responseXml = response(this.serializer.deserialize);

					errorXml = responseXml.getChild('error');
					if (errorXml == null) {
						if (session && session.isLoggedOn()) {
							credentialsXml = session.credentials;
							if (credentialsXml) {
								
								notifierXml = responseXml.getChild('notifier', NS.store);
								notifierKey = notifierXml.getAttribute('external-id', NS.atms);
								
								notifier = this.webapp.notifiers.get(notifierKey);
								if (notifier == null) {
									notifier = new Notifier(notifierXml);
									this.webapp.notifiers.put(notifierKey, notifier);
								} else {
									notifier.xml = notifierXml;
									this.webapp.notifiers.put(notifierKey, notifier);
								}
							}
						} else {
							alert('You are not logged on');
						}
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},
			/*handleUnitUpdate: function(response) {
				var unit;
				var credentialsXml;
				var unitKey;
				var unitXml;
				var errorXml;
				var responseXml;
				var session = this.webapp.session;

				if (response) {
					responseXml = response(this.serializer.deserialize);

					errorXml = responseXml.getChild('error');
					if (errorXml == null) {
						if (session && session.isLoggedOn()) {
							credentialsXml = session.credentials;
							if (credentialsXml) {
								unitXml = responseXml.getChild('unit', NS.store);
								unitKey = unitXml.getAttribute('external-id', NS.atms);

								unit = this.webapp.units.get(unitKey);
								if (unit == null) {
								 unit = new unit(unitXml);
								 this.webapp.units.put(unitKey, unit);
								} else {
								 unit.xml = unitXml;
								this.webapp.units.put(unitKey, unit);
								}
							}
						} else {
							alert('You are not logged on');
						}
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},*/
			handleActivation: function(response) {
				var priorActivationXml;
				var activationXml;
				var errorXml;
				var responseXml;
				var activation = this.webapp.activation;
				
				if (response) {
					responseXml = response(this.serializer.deserialize);

					errorXml = responseXml.getChild('error');
					if (errorXml == null) {
						activationXml = responseXml.getChild('activation', NS.fst);
						activation.handleActivation(activationXml);
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},
			handleRegionUpdate: function(response) {
				var unit;
				var credentialsXml;
				var regionKey;
				var regionXml;
				var errorXml;
				var responseXml;
				var session = this.webapp.session;
				var regions = this.webapp.regions;
				
				if (response) {
					responseXml = response(this.serializer.deserialize);
					errorXml = responseXml.getChild('error');
					
					if (errorXml == null) {
						if (session && session.isLoggedOn()) {
							credentialsXml = session.credentials;
							if (credentialsXml) {
								
								regionXml = responseXml.getChild('region', NS.store);
								regionKey = regionXml.getAttribute('external-id', NS.atms);
								
								region = this.webapp.regions.get(regionKey);
								if (region == null) {
									region = new Region(regionXml);
									this.webapp.regions.put(regionKey, region);
								} else {
									region.xml = regionXml;
									this.webapp.regions.put(regionKey, region);
								}
							}
						} else {
							alert('You are not logged on');
						}
					} else {
						alert(errorXml.getChild('description'));
					}
				}
			},
			receiveReport: function(url, response, html) {
				var responseXml;
				var responseHtml;
				var query;
				var uri = new NET.URI(url);
				var path = uri.path;
				
				if (response && url) {
					uri = new NET.URI(url);
					path = uri.path;
					responseXml = response(this.serializer.deserialize);
					responseHtml = html;
					query = this.webapp.queries.get(path);
					if (!query) {
						query = new FST.Query();
						this.webapp.queries.put(path, query);
					}
					//todo: remove... eventually per wim's fix
					this.webapp.onReceiveReport.fire({ url: url, response: responseXml, html: html });
					query.setResponse(responseXml, responseHtml);
					
					this.webapp.onReportAlert.fire({ url: url, response: responseXml, html: html });
				}
				
			},
			tail: undefined  // TODO: for IE
		}

		// === PACKAGE PUBLIC ===
		this.FastrackHttpBinding = FastrackHttpBinding;
		this.Unit = Unit;
		// === PACKAGE PUBLIC ===
	}
);


















