	
	var Application = {};
	
	Application.util = {
		
		init: function()
		{
			// Browser information
			this.browserInformation.init();
		},
		
		/*
			------------------
			BrowserInformation
			------------------
		*/
		
		browserInformation:
		{
			init: function ()
			{
				this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
				this.version = this.searchVersion(navigator.userAgent)
					|| this.searchVersion(navigator.appVersion)
					|| "an unknown version";
				this.OS = this.searchString(this.dataOS) || "an unknown OS";
			},
			
			searchString: function (data)
			{
				for (var i=0;i<data.length;i++)	{
					var dataString = data[i].string;
					var dataProp = data[i].prop;
					this.versionSearchString = data[i].versionSearch || data[i].identity;
					if (dataString) {
						if (dataString.indexOf(data[i].subString) != -1)
							return data[i].identity;
					}
					else if (dataProp)
						return data[i].identity;
				}
			},
			
			searchVersion: function (dataString)
			{
				var index = dataString.indexOf(this.versionSearchString);
				if (index == -1) return;
				return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
			},
			
			dataBrowser:
			[
				{
					string: navigator.vendor,
					subString: "Apple",
					identity: "Safari"
				},
				{
					prop: window.opera,
					identity: "Opera"
				},
				{
					string: navigator.vendor,
					subString: "iCab",
					identity: "iCab"
				},
				{
					string: navigator.vendor,
					subString: "KDE",
					identity: "Konqueror"
				},
				{
					string: navigator.userAgent,
					subString: "Firefox",
					identity: "Firefox"
				},
				{	// for newer Netscapes (6+)
					string: navigator.userAgent,
					subString: "Netscape",
					identity: "Netscape"
				},
				{
					string: navigator.userAgent,
					subString: "MSIE",
					identity: "Explorer",
					versionSearch: "MSIE"
				},
				{
					string: navigator.userAgent,
					subString: "Gecko",
					identity: "Mozilla",
					versionSearch: "rv"
				},
				{ 	// for older Netscapes (4-)
					string: navigator.userAgent,
					subString: "Mozilla",
					identity: "Netscape",
					versionSearch: "Mozilla"
				}
			],
			
			dataOS : 
			[
				{
					string: navigator.platform,
					subString: "Win",
					identity: "Windows"
				},
				{
					string: navigator.platform,
					subString: "Mac",
					identity: "Mac"
				},
				{
					string: navigator.platform,
					subString: "Linux",
					identity: "Linux"
				}
			]
		}
		
	}
	
	Application.connect = {
		
		ajax: null,
		
		init: function()
		{
			// Init AjaxConn
			if(Application.util.browserInformation.browser == "Explorer")
			{
				if(!window.ActiveXObject)
				{
					alert("This browser does not support ActiveX controls calls");
					
					return false;
				}
				
				Application.connect.ajax = this.ajaxConnIE;
			}
			else
			{
				if(!window.XMLHttpRequest)
				{
					alert("This browser does not support AJAX calls");
					
					return false;
				}
				
				Application.connect.ajax = this.ajaxConnFF;
			}
			
			Application.connect.ajax.addVariable =	function(varName, varValue)
													{
														args.vars[varName] = varValue;
													};
			
			Application.connect.ajax.removeVariable = 	function(varName)
														{
															args.vars[varName] = undefined;
														};
			
			Application.connect.ajax.addHeader = 	function(headerName, headerValue)
													{
														args.headers[headerName] = headerValue;
													};
			
			Application.connect.ajax.removeHeader = 	function(headerName)
														{
															args.headers[headerName] = undefined;
														};
		},
		
		/*
			--------
			AjaxConn
			--------
		*/
		
		ajaxConnFF: function(args)
		{
			if(!args.url)
			{
				return false;
			}
			
			var variables = [];
			var headers = [];
			var xmlObj = null;
			
			if(!args.vars)
			{
				args.vars = [];
			}
			
			if(!args.headers)
			{
				args.headers = [];
			}
			
			this.addHeader = 	function( headerName, headerValue )
								{
									args.headers[ headerName ] = headerValue;
								};
			
			this.addVariable =	function( variableName, variableValue )
								{
									args.vars[ variableName ] = variableValue;
								};
			
			this.execute = 	function()
									{
										try
										{
											var xmlObj = new XMLHttpRequest();
										}
										catch( e )
										{
											alert( 'An error has occured while creating the XMLHTTP object:\nErrorName: ' + e.name + '\nErrorMessage: ' + e.message );
											
											return false;
										}
										
										args.resultAsXML = (typeof args.resultAsXML == "undefined") ? true : args.resultAsXML;
										args.username = args.username ? args.username : null;
										args.password = args.password ? args.password : null;
										args.requestType = args.requestType ? args.requestType : "GET";
										args.async = (typeof args.async == "undefined") ? true : args.async;
										
										xmlObj.onerror = function( e ) { };
										xmlObj.onprogress = function( e ) { };
										
										args.onProgress = args.onProgress ? args.onProgress:	function( domEl ) { };
										
										args.successFunction = args.successFunction ? args.successFunction:	function()
																																			{
																																				alert( "URL:" + args.url + "\nStatus: " + xmlObj.status + "\nStatusText: " + xmlObj.statusText + "\nReturn value: " + domEl );
																																			};
										
										args.onFailure = args.onError ? args.onError :	function()
																											{
																												alert( "There was a problem retrieving the XML data:\nServer: " + args.url + "\nServer status: " + xmlObj.status + "\nServer message: " + xmlObj.statusText );
																											}
										
										//
										//	Generate Args
										//
										
										var _urlArgs = "";
										
										var _recursiveVars = 	function( prefix, arg )
																			{
																				if( typeof arg != "object" )
																				{
																					_urlArgs += prefix + '[]=' + encodeURI( arg );
																					
																					return;
																				}
																				
																				for( var i in arg )
																				{
																					if( typeof arg[i] == "function" )
																					{
																						continue;
																					}
																					
																					if( /^[0-9]+$/.test( i ) )
																					{
																						_recursiveVars( prefix, arg[i] );
																					}
																					else
																					{
																						_recursiveVars( prefix + "[" + i + "]", arg[i] );
																					}
																				}
																			}
										
										for(var i in args.vars)
										{
											if( typeof args.vars[i] == "function" )
											{
												continue;
											}
											
											if( typeof args.vars[i] == "object" )
											{
												_recursiveVars( "&" + i, args.vars[i] );
											}
											else
											{
												_urlArgs = _urlArgs + '&' + (i) + '=' + encodeURI(args.vars[i]);
											}
										}
										
										//
										//	Send request
										//
										
										try
										{
											xmlObj.onreadystatechange = function()
																						{
																							switch( xmlObj.readyState )
																							{
																								case 0:
																								case 1:
																								case 2:
																								case 3:
																									
//																									args.onProgress( xmlObj );
																									
																								break;
																								case 4:
																									
																									if( xmlObj.status != 200 )
																									{
//																										alert("ajax error");
																										
																										args.onError( xmlObj );
																										
																										return;
																									}
																									
																									if( args.resultAsXML == false )
																									{
																										args.successFunction(
																													xmlObj.responseText
																												);
																										
																										return;
																									}
																									
																									args.successFunction(
																												xmlObj.responseXML,
																												xmlObj.responseText
																											);
																									
																								break;
																								default:
																									
																									alert( "Unforseen readyState encountered: " + xmlObj.readyState );
																							}
																						};
											
											var sendArguments = null;
											
											switch(args.requestType)
											{
												case "GET":
													
													args.url += _urlArgs.replace(/&/, '?');
													
												break;
												case "POST":
													
													sendArguments = _urlArgs;
													
													this.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
													
												break;
											}
											
											xmlObj.open(args.requestType, args.url, args.async, args.username, args.password);
											
											for(var i in args.headers)
											{
												if(typeof args.headers[i] == "function")
												{
													continue;
												}
												
												xmlObj.setRequestHeader(i, args.headers[i]);
											}
											
											xmlObj.send(sendArguments);
											
											return true;
										}
										catch( e )
										{
											alert( "Unforseen error encountered in AJAX request execution: ErrorNumber: " + e.number + " " + e.message + " File: " + e.filename + " Line: " + e.lineNumber + " URL: " + args.url + " Args: " + sendArguments );
											
											return false;
										}
									}
			
			if( !args.dontExecute )
			{
				this.execute();
			}
		},
		
		ajaxConnIE: function(args)
		{
			if(!args.url)
			{
				return false;
			}
			
			var variables = [];
			var headers = [];
			var xmlObj = null;
			
			if(!args.vars)
			{
				args.vars = [];
			}
			
			if(!args.headers)
			{
				args.headers = [];
			}
			
			this.addHeader = 	function( headerName, headerValue )
								{
									args.headers[ headerName ] = headerValue;
								};
			
			this.addVariable =	function( variableName, variableValue )
								{
									args.vars[ variableName ] = variableValue;
								};
			
			this.execute = 	function()
							{
								try
								{
									var xmlObj = new ActiveXObject("Msxml2.XMLHTTP");
								}
								catch(e)
								{
									alert('An error has occured calling the external site:\nErrorName: ' + e.name + '\nErrorMessage: ' + e.message);
									
									return false;
								}
								
								args.resultAsXML = (args.resultAsXML == undefined) ? true : args.resultAsXML;
								args.username = args.username?args.username:null;
								args.password = args.password?args.password:null;
								args.requestType = (typeof args.requestType == "undefined") ? "GET" : args.requestType;
								
								args.onload = args.onload ? args.onload: function() { };
								args.successFunction = args.successFunction ? args.successFunction:	function(domEl)
																									{
																										alert("URL:" + args.url + "\n\nStatus: " + xmlObj.status + "\n\nStatusText: " + xmlObj.statusText + "\n\nReturn value: " + domEl);
																									};
								
								var txt = "";
								
								for(var i in args.vars)
								{
									if( typeof args.vars[i] == 'function' )
									{
										continue;
									}
									
									txt = txt + '&' + (i) + '=' + escape(args.vars[i]);
								}
								
								try
								{
									xmlObj.onreadystatechange = function()
																{
																	switch( xmlObj.readyState )
																	{
																		case 1:
																		case 2:
																		case 3:
																			
																			// Onload Event for IE
																			args.onload(xmlObj);
																			
																		break;
																		case 4:
																			
																			if (xmlObj.status == 200)
																			{
																				if(args.resultAsXML == true)
																				{
																					args.successFunction(xmlObj.responseXML);
																				}
																				else
																				{
																					args.successFunction( xmlObj.responseXML, xmlObj.responseText );
																				}
																			}
																			else
																			{
																				if(args.onFailure)
																				{
																					args.onFailure(xmlObj);
																				}
																				else
																				{
																					alert("There was a problem retrieving the XML data:\nServer: " + args.url + "\nServer status: " + xmlObj.status + "\nServer message: " + xmlObj.statusText);
																				}
																			}
																			
																		break;
																	}
																};
									
									var sendArguments = null;
									var reqPath = args.url;
									
									switch(args.requestType)
									{
										case "GET":
											
											reqPath = args.url + txt.replace(/&/, '?');
											
										break;
										case "POST":
											
											sendArguments = txt;
											this.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
											
										break;
									}
									
									xmlObj.open(args.requestType, reqPath, args.async, args.username, args.password);
									
									for(var i in args.headers)
									{
										xmlObj.setRequestHeader(i, args.headers[i]);
									}
									
									xmlObj.send(sendArguments);
								}
								catch (e)
								{
									alert(e.number + " " + e.description + " Path: " + reqPath + " Args: " + sendArguments);
								}
							};
			
			if( !args.dontExecute )
			{
				this.execute();
			}
		}
		
	}
	