/****************************************************
* rayjaxNeo                       Created 2/19/2008 *
*                                                   *
* Supplement and eventual replacement of rayjax.js  *
*
* @author Ray Dollete <contact@raydollete.com>
*****************************************************/

function rjx(url, func, opts)   // Usage: rjx(url, function() { commands; }, x);
{								// the 'x' option indicates an XML response
	var http_request = false;

    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }

    if (!http_request) {
        if(document.getElementById('status_bar'))
			document.getElementById('status_bar').innerHTML = '<center>XMLHTTP error.</center>';
        return false;
    }
    http_request.onreadystatechange = function() {	
		if (http_request.readyState == 4) {
	      	if (http_request.status == 200) {                								
				
				func(http_request);
				
	        } else {
				if(document.getElementById('status_bar'))
					document.getElementById("status_bar").innerHTML = 'There was a problem with the request.';
	        }
	    }
	};
	
	

    if (opts == 'g') {
		target = url+'&random=' + (Math.random() * Date.parse(new Date()));
        http_request.open('GET', target, true);

    	if (opts == 'x')
    		http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
    	
        http_request.send(null);
        
    } 
	else {    	
		target = url;
        url_array = target.split('?');
        target = url_array[0];
        params = url_array[1];
		
        http_request.open('POST', target, true);
        
    	//Send the proper header infomation along with the request
    	http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    	http_request.setRequestHeader("Content-length", params.length);
    	http_request.setRequestHeader("Connection", "close");
		
    	http_request.send(params);        
		
	}
	

}


// go to a specific url
function goLink(url) {
	window.location.href = url;
}


// invoke an AJAX session and return the text to an element inner HTML
function rjxReturn(url, element) {
	if(document.getElementById(element)) {
		rjx(url, function(req) {
			rjxReplace(element, req.responseText);
		});
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}	
}

// return the value of an element
function rjxGet(element) {
	if(document.getElementById(element)) {
		var el_value = document.getElementById(element).value;
		return el_value;
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}
}

// set the value of an element
function rjxSet(element, e_value) {
	if(document.getElementById(element)) {
		document.getElementById(element).value = e_value;
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}	
}

// get the inner HTML of an element
function rjxGetInner(element) {
	if(document.getElementById(element)) {
		var inner = document.getElementById(element).innerHTML;
		return inner;
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}		
}

// replace the inner HTML of an element
function rjxReplace(element, e_value) {
	if(document.getElementById(element)) {
		document.getElementById(element).innerHTML = e_value;
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}			
}

// disable an element
function rjxDisable(element) {
	if(document.getElementById(element)) {
		document.getElementById(element).disabled = true;
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}	
}

function rjxEnable(element) {
	if(document.getElementById(element)) {
		document.getElementById(element).disabled = false;
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}	
}

/**
* Display shortcuts
* rjxDisplayBlock(), rjxDisplayInline, 
* rjxDisplayNone, rjxDisplayReset
*/
function rjxDisplayBlock(element) {
	if(document.getElementById(element)) {
		document.getElementById(element).style.display = 'block';
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}
}

function rjxDisplayInline(element) {
	if(document.getElementById(element)) {
		document.getElementById(element).style.display = 'inline';
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}
}

function rjxDisplayNone(element) {
	if(document.getElementById(element)) {
		document.getElementById(element).style.display = 'none';
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}
}

function rjxDisplayReset(element) {
	if(document.getElementById(element)) {
		document.getElementById(element).style.display = '';
	}
	else {
		rjxDebug('ERROR: Invalid element '+element);
	}
}

/**
* End Display shortcuts
*/

function rjxDebug(text) {
	if(document.getElementById('debug_area')) {
		document.getElementById('debug_area').innerHTML += '<p>'+text+'</p>';
	}
}

/**
* Legacy functions from rAyJAX
*/

function serializeForm(theform)     // Converts FORM-submission values into URL variables without a real SUBMIT
{
	var els = theform.elements;
	var len = els.length;
	var queryString = "";
	var arrayname = "";
	
	this.addField = 
		function(name,value) { 
			if (queryString.length>0) { 
				queryString += "&";
			}
			queryString += encodeURIComponent(name) + "=" + encodeURIComponent(value);
		};
		
	for (var i=0; i<len; i++) {
		var el = els[i];
		if (!el.disabled) {
			if(el.name.length > 0) {
				switch(el.type) {
					case 'text': case 'password': case 'hidden': case 'textarea': 
						this.addField(el.name,el.value);
						break;
					case 'select-one':
						if (el.selectedIndex>=0) {
							this.addField(el.name,el.options[el.selectedIndex].value);
						}
						break;
					case 'select-multiple':
						idx = 0;
						for (var j=0; j<el.options.length; j++) {
							if (el.options[j].selected) {
													
								str = el.name;
								str = str.replace('[]','');
								str = str +'['+idx+']';
								this.addField(str,el.options[j].value);
								idx++;
								
							}
						}
						break;
					case 'checkbox': case 'radio':
						if (el.checked) {
							this.addField(el.name,el.value);
						}
						break;
				}
			}
		}
	}
	return queryString;
}

/**
* pass a select element to return an array of its selected values
*/
function serializeSelect(el) {
	var idx = 0;
	var value_array = new Array();
	
	for(var i=0; i < el.options.length; i++) {
		if(el.options[i].selected) {
			value_array[idx] = el.options[i].value;
			idx++;
		}
	}
	
	return value_array;
}

function disableEnterKey(e)  // Disable Form-Submit on Enter Key Completely
{                            // Usage: <input type=text onKeyPress="return disableEnterKey(event)">
    var key;

    if(window.event)
    	key = window.event.keyCode;     //IE
    else
        key = e.which;     //firefox

    if(key == 13)
        return false;
    else
        return true;
}




// Cross-browser implementation of element.addEventListener()

function addListener(element, type, expression, bubbling)
{
	bubbling = bubbling || false;
   
	if(window.addEventListener) { // Standard
		element.addEventListener(type, expression, bubbling);
		return true;
	} else if(window.attachEvent) { // IE
		element.attachEvent('on' + type, expression);
		return true;
	} else return false;
}

