/**
 * Qwajax - Qwest Ajax Solutions
 * Designed and Developed by Andrew Ambrose
 * Qwest Communications. 
 */ 
var qwajax_version = "1.4.0 (JQuery Implementation)";
var qwajax_last_modified = "Wednesday, January 16th, 2008";
log.info("qwajax.js[LoadedVersion]","\n****************************\nQwajax Controls Version: "+qwajax_version);
log.info("qwajax.js[LastModified]","Last Modified: "+qwajax_last_modified);
var AjaxDebug = true;
var AJAX_TAG_NAME = "div"; // "qwajax:component"
var AJAX_NODE = "_Node";

// Global variables
var isCSS, isW3C, isIE4, isNN4, isMAC;
if (document.images) {
 isCSS = (document.body && document.body.style) ? true : false;
 isW3C = (isCSS && document.getElementById) ? true : false;
 isIE = (isCSS && document.all) ? true : false;
 isNN4 = (document.layers) ? true : false;
 isMAC = (navigator.userAgent.indexOf("Mac") > -1) ? true : false;
}
var isNav = (navigator.appName.indexOf("Netscape") !=-1);
var isSafari = (navigator.appName.indexOf("safari") !=-1);

function getComponent(objName){
	return ajaxObjects[objName];
}

/* AJAX */
function AjaxConnect(component){
	log.info("AjaxConnect(component)()init","AjaxConnect(component) init");
	var AjaxConnection = this;
	this.component = component;
	this.name = (component.name)?component.name:"";
	this.xmlHttpObj =  new XMLHttpRequest();
	this.mimeType = component.mimeType;
	this.version="";
	this.request = new Request(component.url,component.method);
	this.response = new Response();
	this.connect = function(){
		var node = "#"+AjaxConnection.component.target+AJAX_NODE;
		AjaxConnection.request.time = new Date();
		try{
			$(node).load(getFullyQualifiedUrl(AjaxConnection.request.url), function(){
				$(this).fadeIn();
				AjaxConnection.response.time = (new Date()-AjaxConnection.request.time)*0.01;
				try{
					eval(AjaxConnection.component.functionName);
				}catch(ex){
					log.error("functionName Exception","functionName "+ex.name+"; "+ex.message);
				}
			});
		} catch(e){
			log.error("connectError"+e.name,"Connect Error: \n > "+e.message);
		}
	}
	this.OnReadyState = function(){}
}
function Request(url,method){ 
 this.cacheInt = Math.floor(Math.random()*1000);
 req = this;
 this.method=method; // GET/POST
 this.status="";
 this.url = (url.toString()!="") ? (url.toString().indexOf("?")!=-1) ? url+"&cache="+req.cacheInt :  url+"?cache="+req.cacheInt : ""; // XML Path
 this.time=null;
} 
function Response(){ 
 this.xml=""; 
 this.text=""; 
 this.time=null;
 this.message="";
} 

var ajaxObjects = new Array();
function loadAjaxObjectsOnPage(){
	try{
		objs = document.getElementsByTagName(AJAX_TAG_NAME);
		for(i=0; i<objs.length; i++){
			if(objs[i].getAttribute("ajax")){
				addAjaxComponent(objs[i]);
			}
		}
		loadEmUp();
	} catch (E){}
}
function loadEmUp(){
	try{
		for(i=0; i<ajaxObjects.length; i++){
			var component = ajaxObjects[i];
			if(component){
				if(component.displayOnload==true){
					component.load();
				}
			}
		}
	} catch (Eg){}
}
function AccessComponent(url){
	var component = this;
	this.url = url;
	this.connection;
	this.loaded = false;
	this.lastResponseTime= 0;
	this.responseContentLength=0;
	this.retrievedXML  = false;
	this.responseXML   = "";
	this.functionName="";
	this.target = "";
	this.method = "Post";
	this.load = function(){
		component.connection = new AjaxConnect(component);
		component.connection.connect();
		try{
			if(component.connection.xmlHttpObj.readyState==4){
				component.loaded = true;
			}
			log.info("component.accessContent",wrapTitle("Access Content Loaded"));
		} catch (e) {
			log.error("component.accessContentError",wrapTitle("Access Content Error:") + component);
		}
	}
}
function AjaxObjectComponent(obj){
	var component = this;
	this.connection;
	this.count         = (obj.count)? obj.count : (obj.getAttribute("count"))? obj.getAttribute("count") : 'infinite';
	this.displayOnload = (obj.displayOnload)? obj.displayOnload : (obj.getAttribute("displayOnload"))? obj.getAttribute("displayOnload") : true;
	this.functionName  = (obj.functionName)? obj.functionName : (obj.getAttribute("functionName"))? obj.getAttribute("functionName") : "";
	this.intervalID="";
	this.interval      = (obj.interval)? obj.interval : (obj.getAttribute("interval"))? obj.getAttribute("interval") : 0;
	this.method        = (obj.methodType)? obj.methodType : (obj.getAttribute("methodType"))? obj.getAttribute("methodType") : "POST";
	this.mimeType      = (obj.mimeType)? obj.mimeType : "text/xml"; 
	this.name          = (obj.name)? obj.name : obj.getAttribute("name"); // required
	this.requestCount  = 0;
	this.lastResponseTime= 0;
	this.responseContentLength=0;
	this.retrievedXML  = false;
	this.responseXML   = "";
	this.stop          = false;
	this.status        = "0";
	this.target        = (obj.target)? (obj.target=="self")? component.name:obj.target: (obj.getAttribute("target"))? obj.getAttribute("target") : component.name; // Control ID
	this.url           = (obj.url)? obj.url : (obj.getAttribute("url"))? obj.getAttribute("url") : "";
	this.XMLObjects = new Array();
	log.info("NewComponent_"+component.name,wrapTitle("New Component: "+component.name));
	this.print = function(){
		log.info("Properties_"+component.name,wrapTitle("Proprties for: "+component.name));
		for(var property in component){
			if(typeof component[property] != "function"){
				log.info("PropertiesItem"+component.name+component[property]," > Property:   "+ property +" : "+ component[property]);
			}
		}
	}
	this.setError = function(description){
		try{
			var node = document.getElementById(component.target);
			if(node){
				node.innerHTML = "[Error: "+description+"]";
			} else {
				log.warn("InserWarn","No object to insert into: Expecting component.name: "+component.name+AJAX_NODE);
			}
		} catch (feedError){
			log.error("FeedError"+feedError.name,"Feed Error"+feedError.message);
		}
	}
	this.load = function(){
		try{log.info("LoadComponent_"+component.name,wrapTitle("Load Component: "+component.name));}catch(sdfd){}
		var loadComponent = true;
		var usingTemplateForComponent = false;
		/**
		 * Validate this connection
		 */
		if(component.count!="infinite"){
			if(component.requestCount<=component.count){

			} else {
				clearInterval(component.intervalID);
				log.info("CountReached"+component.name," > Count Reached:   "+ component.count);
				component.stop=true;
			}
		}
		if(component.stop==true){
			loadComponent=false;
		}
		usingTemplateForComponent=false;

		
		if(loadComponent==true){
			// Make call for this component
			try{
				component.connection = new AjaxConnect(component);
				component.connection.connect();
				component.requestCount++;
			} catch (eConnectError){
				log.error("eConnectError",eConnectError.name+": \n > "+eConnectError.message);
			}
			try{component.print();}catch(ePrint){}
		} else {
			log.info("TemplateLoadStop","The AJaX Component has completed or stopped by request.");
		}
	}
	if(component.interval > 0){
		if(this.count>1){
			component.intervalID = setInterval(component.load,component.interval);
		}
	}
}
function addAjaxComponent(obj){
	var name="";
	try{
		if(obj){
			name = (obj.name) ? obj.name : obj.getAttribute("name");
			if(name!=null){
				var AjaxObject = new AjaxObjectComponent(obj);
				ajaxObjects[name] = AjaxObject;
				ajaxObjects.push(AjaxObject);
				log.info("NewComponent_"+name,wrapTitle("New Component: "+name));
			} else {
				log.warn("addAjaxComponent","Did not add Component.");
			}
		} else {
			log.error("addAjaxComponent Null Obj","addAjaxComponent(); Obj is null");
		}
	} catch (e){
		log.error("addAjaxComponent Exception","addAjaxComponent() "+e.name+"; "+e.message);
	}
}

function refreshTarget(target){
	var component = getComponent(target);
	var isStopped = false;
	if(component!=undefined){
		log.info("refreshTarget"+target,wrapTitle("refreshTarget(); Loading Component: "+component.name));
		isStopped = component.stop;
		component.stop = false;
		component.load();
		component.stop = isStopped;
	} else {
		log.warn("refreshTargetWarn","refreshTarget('"+target+"');\n > Component not found.");
	}
}
function loadTarget(target,params){
	var component = getComponent(target);
	if(component){
		if(component.name) {}
		if(component.url.indexOf("?")!=-1){
			component.url = component.url.substring(0,component.url.indexOf("?")+1) + "?" +params;
		} else {
			component.url += "?" +params;
		}
		var isStopped = false;
		if(component!=undefined){
			log.info("loadTarget"+target,wrapTitle("loadTarget(); Loading Component: "+component.name));
			isStopped = component.stop;
			component.stop = false;
			component.load();
			component.stop = isStopped;
		} else {
			log.warn("loadTargetWarn","loadTarget('"+target+"','"+params+"');\n > Component not found.");
		}
		var objName = component.name+AJAX_NODE;
		var obj = document.getElementById(objName);
	} else {
		alert("Could not find target: "+ target);
	}
}
function callTarget(target,params){
	var component = getComponent(target);
	var startTime;
	var responseTime;
	if(component){
		var parameters = (params!=undefined) ? params : getUrlParameters(component.url);
		 targetId="#"+target + AJAX_NODE;
		 startTime = new Date();	
		 try{
			//$(targetId).fadeOut(); // This does not work in Safari
			$.ajax({
				url: getFullyQualifiedUrl(getBaseUrl(component.url)),
				cache: false,
				data: parameters,
				async: true,
				id:targetId,
				success: function(html){
					$(this.id).fadeIn().html(html);
					//log.info("HTML"+targetId,html);
					responseTime = (new Date()-startTime)*0.001;
					log.info("responseTime"+responseTime,"Success!\n > The Response time is: "+responseTime);
					try{eval(component.functionName);} catch(ex){
						log.error("functionName Exception","functionName "+ex.name+"; "+ex.message);
					}
					log.info("callTarget(target,params)","callTarget("+target+","+params+") successfully loaded!");
				},
				error: function(textStatus, errorThrown){
					log.error("callTarget",
						"Error: callTarget: "+ 
							this.id +"\n > Error: "+
							errorThrown +"\n > Status: "+
							textStatus);
				}
			});
		 } catch (ctE){
		 	log.error("callTarget(target,params)Er","callTarget("+target+","+params+") Error:\n > "+ctE);
		 }
	}
}
/**
 * Utility Functions
 */
function getFullyQualifiedUrl(url){
	log.info(url+"E","\n\nOriginal URL: "+url);
	var hostname = window.location.hostname;
	var host = window.location.host; // includes port
	var port = window.location.port;
	var protocol = window.location.protocol;
	if(url.substring(0,1)!="http"){
		if(url.substring(0,1)!="/"){
			url = "/"+url;
		}
		url = protocol+"//"+host+url;
	}
	log.info(url,"\nFully Qualified URL: "+url);
	return url;
}
function getBaseUrl(url){
	if(url.indexOf("?")!=-1){
		return url.substring(0,(url.indexOf("?")));
	} else {
		return url;
	}
}
function getUrlParameters(url){
	var  search=""; 
	try{
		if(url.indexOf("?")!=-1){
			search = url.substring((url.indexOf("?")+1));
		}
	} catch (E){}
	return search;
}
function wrapTitle(title){
	var str="\n******************************************\n";
	str+=" "+title+"\n";
	str+="******************************************";
	return str;
}
/*
$(window).load(
	function(){
		loadAjaxObjectsOnPage();
	}
);
*/
