/*
This is the main js file for the CRUX framework.
Created by Bryce Holloway
Basc Consulting, Inc.
*/

var offsetX, offsetY, dragTarget;

function loadCrux(){
			
	//attach listener to draggables
	/*var elems = getElementsByClassName('draggable',"*");
	for(var i = 0; i<elems.length; i++){
		addListener("mousedown",dragDown,elems[i]);
	}*/
				
}//end loadCrux


//get all elemtns by a certain class name
function getElementsByClassName(clsName,htmltag){ 
	var arr = new Array(); 
	var elems = document.getElementsByTagName(htmltag);
	
	for ( var cls, i = 0; ( elem = elems[i] ); i++ ){
		if ( elem.className.indexOf(clsName) >= 0 ){
			arr[arr.length] = elem;
		}
	}
	return arr;
}

//get the request object for an http request
function getRequest(){
	
	var req = false;
	if(window.XMLHttpRequest){
		req = new XMLHttpRequest();
	}else if(window.ActiveXObject){
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	return req;
}

//getElementById function
function $(name){
	var elem = document.getElementById(name);
	return elem;
}

function el(name){
    return $(name);
}


//sends a request to source, gets response of type resptype, and sends the response to the method
function getData(source,resptype,method){
	
	var req = getRequest();
	var resp = "";
	req.open("GET",source);
	
	if(resptype == null || resptype == ""){
		resptype = "text";
	}
	
	req.onreadystatechange = function(){
		if(req.readyState == 4 && req.status == 200){
			
			if(resptype.toLowerCase() == "text"){	
				resp = req.responseText;
			}else if(resptype.toLowerCase() == "xml"){
				resp = req.responseXML;
			}
			eval(method)(resp);
		}
	}//end readystatechange function
	
	req.send(null);
	
}//end getData

//sends a request to source, gets response of type resptype, and sends the response as innerText or innerHTML to the elem
function getDataTo(source,resptype,elem){
	var req = getRequest();
	req.open("GET",source);
	
	if(resptype == null || resptype == ""){
		resptype = "text";
	}
	
	req.onreadystatechange = function(){
		if(req.readyState == 4 && req.status == 200){
			if(resptype.toLowerCase() == "text"){			
				resp = req.responseText;
				$(elem).innerHTML = resp;
			}else if(resptype.toLowerCase() == "xml"){
				resp = req.responseXML;
				$(elem).innerHTML = resp;
			}
						
		}//end if error free download
	}//end readystatechange function
	
	req.send(null);
	
}//end getDataTo

//gets all headers as a lump of an http request
function getAllHeaders(source){
	var req = getRequest();
	req.open("GET",source);
	
	req.onreadystatechange = function(){
		if(req.readyState == 4 && req.status == 200){
			return req.getAllResponseHeaders();						
		}//end if error free download
	}//end readystatechange function
	
	req.send(null);
		
}//end getAllHeaders

//gets an array of headers from an http request
function getHeadersArray(source){
	var req = getRequest();
	req.open("GET",source);
	
	req.onreadystatechange = function(){
		if(req.readyState == 4 && req.status == 200){
			
			var heads = new Array();
			heads['server'] = req.getResponseHeader("Server");
			heads['date'] = req.getResponseHeader("Date");
			heads['contentType'] = req.getResponseHeader("Content-Type");
			heads['acceptRanges'] = req.getResponseHeader("Accept-Ranges");
			heads['lastModified'] = req.getResponseHeader("Last-Modified");
			heads['etAg'] = req.getResponseHeader("ETag");
			heads['contentLength'] = req.getResponseHeader("Content-Length");
			
			return heads;
					
		}//end if error free download
	}//end readystatechange function
	
	req.send(null);
	
}//end getHeadersArray

//creates a new mouse object for the current event and returns the object
function getMouseData(event){
	var e = new MouseEvent(event);
	return e;
}//end getMouseData

//MouseEvent object
function MouseEvent(evt){
	if(evt){
		this.e = evt;
	}else{
		this.e = window.event;
	}
	
	if(evt.pageX){
		this.x = evt.pageX;
	}else{
		this.x = evt.clientX;
	}
	
	if(evt.pageY){
		this.y = evt.pageY;
	}else{
		this.y = evt.clientY;
	}

	if(evt.target){
		this.target = evt.target;
	}else{
		this.target = evt.srcElement;
	}
}//end MouseEvent object

//finds the target of the mouseevent based on a class Name
function findTarget(target,type){
			
	if(target.className != null && target.className.indexOf(type)>=0){
		return target;
	}else{
		return findTarget(target.parentNode);
	}
}

//begins drag event
function dragDown(event){
	
	var e = getMouseData(event);
	dragTarget = findTarget(e.target,'draggable');
	
	addListener("mousemove",dragMove);
	addListener("mouseup",dragUp);
	offsetX = e.x - dragTarget.offsetLeft;
	offsetY = e.y - dragTarget.offsetTop;
	
}//end handleDown

//is dragging event
function dragMove(event){
	
	var e = getMouseData(event);
	
	var x = e.x - offsetX;
	var y = e.y - offsetY;
	
	if(dragTarget.className.indexOf('contained')>=0){
		
		if(x>=0 && (x+dragTarget.offsetWidth)<dragTarget.parentNode.offsetWidth){
			dragTarget.style.left = x + "px";
		}
		
		if(y>=0 && (y+dragTarget.offsetHeight)<dragTarget.parentNode.offsetHeight){
			dragTarget.style.top = y + "px";
		}
	}else{
		
		dragTarget.style.left = x + "px";
		
		dragTarget.style.top = y + "px";
	}
	
	
	$('testIn').value = dragTarget.offsetLeft;
}//end handleMove

//ends drag event
function dragUp(event){
	
	var e = getMouseData(event);
	removeListener("mousemove",dragMove);
	removeListener("mouseup",dragUp);
	
}//end handleUp

//adds a listener to an element
function addListener(type,callback,elem){
	if(elem == null){
		elem = document;
	}
	if(document.addEventListener){
		elem.addEventListener(type,callback,false);
	}else{
		elem.attachEvent("on"+type,callback,false);
	}
}//end addListener

//removes a listener from an element
function removeListener(type,callback,elem){
	if(elem == null){
		elem = document;
	}
	if(document.removeEventListener){
		elem.removeEventListener(type,callback,false);
	}else{
		elem.detachEvent("on"+type,callback,false);
	}
}//end removeListener

function getNewXMLDocument(rootTagName, namespaceURL) 
{   
	if (!rootTagName)
   	{
   		rootTagName = "";
	}   
   	if (!namespaceURL)
	{
		namespaceURL = "";
	}   
   	if (document.implementation && document.implementation.createDocument) 
	{   
     	// This is the W3C standard way to do it   
    	return document.implementation.createDocument(namespaceURL, rootTagName, null);   
   	}   
   	else 
	{ 
		// This is the IE way to do it   
     	// Create an empty document as an ActiveX object   
     	// If there is no root element, this is all we have to do   
     	var doc = new ActiveXObject("MSXML2.DOMDocument");   
     	// If there is a root tag, initialize the document   
     	if (rootTagName) 
		{   
       		// Look for a namespace prefix   
       		var prefix = "";   
       		var tagname = rootTagName;   
       		var p = rootTagName.indexOf(':');   
       		if (p != -1) 
			{   
		    	prefix = rootTagName.substring(0, p);   
		        tagname = rootTagName.substring(p+1);   
		    }   
       		// If we have a namespace, we must have a namespace prefix   
       		// If we don't have a namespace, we discard any prefix   
       		if (namespaceURL) 
			{   
         		if (!prefix)
				{
					prefix = "a0"; // What Firefox uses
				}   
       		}   
       		else 
			{
				prefix = "";
			}   
       		// Create the root element (with optional namespace) as a   
       		// string of text   
       		var text = "<" + (prefix?(prefix+":"):"") +  tagname +   
           				(namespaceURL   
            			?(" xmlns:" + prefix + '="' + namespaceURL +'"')   
            			:"") +   
           				"/>";   
       		// And parse that text into the empty document   
       		doc.loadXML(text);   
     	}   
     	return doc;   
   	}   
}

function loadXML(url) 
{   
	// Create a new document with the previously defined function   
    var xmldoc = getNewXMLDocument();   
    xmldoc.async = false;  // We want to load synchronously   
    xmldoc.load(url);      // Load and parse   
    return xmldoc;         // Return the document   
}  

