
// browser determine functions
var isNS = (window.navigator.appName.toLowerCase().indexOf("netscape")>=0);
var isIE = (window.navigator.appName.toLowerCase().indexOf("microsoft")>=0);

// Set up the mouse xy tracking
if(!isIE) document.captureEvents(Event.MOUSEMOVE);
document.onmousemove = get_mouse_xy;
var mouse_x;
var mouse_y;

// Set up the keyboard/hotkey functions
document.onkeypress = getKey;
var hotkey = new Array();

function getKey(keyStroke) {
	var eventChooser = (isNS) ? keyStroke.which : event.keyCode;
	var whichkey = String.fromCharCode(eventChooser).toLowerCase();
	for (var i in hotkey){
		if (whichkey == i){
			setTimeout(hotkey[i],0);
		}
	}
}

function get_mouse_xy(e) {
	if(isNS){
		mouse_x = e.pageX;
		mouse_y = e.pageY;
	}else{
		mouse_x = event.clientX + document.body.scrollLeft;
		mouse_y = event.clientY + document.body.scrollTop;
	}
	if(self.mouse_moved) mouse_moved();
}

function object_loading(o){
	if(o){
		show_loading_frame(get_location(o));
	}
}

function left(str,n){
	if(n <= 0){
		return '';
	}else if (n > String(str).length){
		return str;
	}else{
		return String(str).substring(0,n);
	}
}

function randomstring(l) {
	var chars = "abcdefghiklmnopqrstuvwxyz";
	var string_length = l;
	var randomstring = '';
	for (var i=0; i<string_length; i++) {
		var rnum = Math.floor(Math.random() * chars.length);
		randomstring += chars.substring(rnum,rnum+1);
	}
	return randomstring;
}

function select_range(obj,start,length){
	if(obj.createTextRange){
		var range = obj.createTextRange(); 
		range.moveStart("character", start); 
		range.moveEnd("character", length - obj.value.length); 
		range.select();
	}else if(obj.setSelectionRange){
		obj.setSelectionRange(start,length);
	}
}

// Agrian Documented Lock Functions
function documented_lock_click(){
	show_documented_information();
}
var shown_documented_information = false;
function show_documented_information(){
	if(!$('documented_information')){
		temp = document.createElement('div');
		temp.setAttribute('id','documented_information');
		temp.innerHTML = simpleajax('/global/agrian_documented_information.cfm');
		temp.className = 'dark_window';
		temp.style.width = '500px';
		temp.style.zIndex = '1500';
		document.body.appendChild(temp);
	}
	if(!shown_documented_information){
		dark_window($('documented_information'));
		shown_documented_information = true;
	}
}

function lock_button(the_button){
	the_button.disabled = true;
	if(the_button != null){
		if(!the_button.innerHTML.match(/lock_small/)){
			the_button.innerHTML = '<img src="/images/lock_small.png" style="margin-bottom:-1">&nbsp;&nbsp;' + the_button.innerHTML;
		}
		the_button.onmouseup = show_documented_information;		
	}
	pos = get_location(the_button);
	temp = document.createElement('div');
	temp.setAttribute('id','button_lock_div');
	temp.style.zIndex = '1000';
	temp.style.position = 'absolute';
	temp.style.backgroundColor = 'white';
	temp.style.opacity = '.01';
	temp.style.filter = 'alpha(opacity=01)';
	temp.style.left = pos[0];
	temp.style.top = pos[1];
	temp.style.width = pos[2];
	temp.style.height = pos[3];
	temp.style.overflow = 'hidden';
	temp.onclick = show_documented_information;
	document.body.appendChild(temp);
}


function show_loading_frame(pos){
	if(document.getElementById('loadframe')){
		document.getElementById('loadframe').style.left = pos[0];
		document.getElementById('loadframe').style.top = pos[1];
		document.getElementById('loadframe').style.width = pos[2];
		document.getElementById('loadframe').style.height = pos[3];
		document.getElementById('loadframe').style.display = '';
	}else{
		temp = document.createElement('div');
		temp.setAttribute('id','loadframe');
		temp.style.zIndex = '1000';
		temp.style.position = 'absolute';
		temp.style.backgroundColor = 'white';
		temp.style.opacity = '.75';
		temp.style.filter = 'alpha(opacity=75)';
		temp.style.left = pos[0];
		temp.style.top = pos[1];
		temp.style.width = pos[2]; //'100%'; //pos[2];
		temp.style.height = pos[3];
		temp.style.overflow = 'hidden';
		document.body.appendChild(temp);
		if(global_terms && global_terms.brand_name == "Agrian"){
			var loading_image = 'agrian-loading.gif';
		}else{
			var loading_image = 'loading.gif';
		}
		document.getElementById('loadframe').innerHTML = '<center><img id="loadimg" src="/images/' + loading_image + '"></center>';
	}
	if(document.getElementById('loadimg')){
		document.getElementById('loadimg').style.position = 'absolute';
		if((document.body.scrollTop < (pos[1]+pos[3]))&&(document.body.scrollTop > pos[1])){
			document.getElementById('loadimg').style.top = document.body.scrollTop - pos[1];
		}else{
			document.getElementById('loadimg').style.top = 0;
		}
	}
}

// A bit easier to remember
function stop_object_loading(){
	hide_loading_frame();
}

function hide_loading_frame(){
	if(document.getElementById('loadframe')){
		document.getElementById('loadframe').style.display = 'none';
	}	
}

function agrian_alert(txtHTML,resp_function){
	agrian_box(txtHTML,'ok',resp_function)
}
function agrian_question(txtHTML,resp_function){
	agrian_box(txtHTML,'question',resp_function)
}
function generic_return_function(wtf){}
function agrian_box(txtHTML,alert_type,return_function){
	return_function = !return_function ? generic_return_function : return_function;
	_ts = (new Date()).getTime();
	dvID = 'aalert_'+_ts
	dvTxt = document.createElement('div');
	dvTxt.setAttribute('id',dvID);
	dvTxt.className = 'dark_window';
	dvTxt.style.width = '500px';
	dvTxt.style.padding = '0px';
	document.body.appendChild(dvTxt);
	if(!document.getElementById('aalert_box'+_ts)){
		tempDiv = document.createElement('div');
		tempDiv.setAttribute('id','aalert_box'+_ts);
		tempDiv.className = 'box';
		if(txtHTML.length > 1200){
			tempDiv.style.height = '400px';
			tempDiv.style.overflow = 'auto';
		}
		dvTxt.appendChild(tempDiv);
	}
	tempDiv.innerHTML = txtHTML;

	if(!document.getElementById('aalert_box_bottom'+_ts)){
		tempDivBottom = document.createElement('div');
		tempDivBottom.setAttribute('id','aalert_box_bottom'+_ts);
		tempDiv.appendChild(tempDivBottom);
		tempDivBottom.style.textAlign = 'right'
		tempDivBottom.style.paddingTop = '20px'
		if(alert_type == 'ok'){
			tempDivBottom.innerHTML = "<input id='button_"+_ts+"' type='button' value='OK' style='width: 60px'>"
			$('button_'+_ts).onclick = function(){
				return_function();
				close_dark_window(dvTxt);
			}
		}else if(alert_type == 'question'){
			tempDivBottom.innerHTML = "<input id='yes_"+_ts+"' type='button' value='Yes' onclick='"+return_function+"(true);close_dark_window(this.parentNode.parentNode.parentNode)'> <input id='no_"+_ts+"' type='button' value='No' onclick='"+return_function+"(false);close_dark_window(this.parentNode.parentNode.parentNode)'>"
			$('yes_'+_ts).onclick = function(){
				return_function(true);
				close_dark_window(dvTxt);
			}
			$('no_'+_ts).onclick = function(){
				return_function(false);
				close_dark_window(dvTxt);
			}
		}else{
			tempDivBottom.innerHTML = "<input id='button_"+_ts+"' type='button' value='"+alert_type+"' style='width: 60px'>"
			$('button_'+_ts).onclick = function(){
				return_function();
				close_dark_window(dvTxt);
			}
		}
	}
	dark_window(dvTxt)
	return true;
}

function dark_window(which){
	which.style.display = 'block';
	if(!document.getElementById('dwOverlay')){
		temp = document.createElement('div');
		temp.setAttribute('id','dwOverlay');
		temp.className = 'popHide';
		document.body.appendChild(temp);
	}
	if(!document.getElementById('dwContain')){
		temp = document.createElement('div');
		temp.setAttribute('id','dwContain');
		temp.className = 'popHide';
		document.body.appendChild(temp);
	}
	if(which.offsetParent && lc(which.offsetParent.tagName) == 'body'){
		document.getElementById('dwContain').appendChild(which);
	}
	if(document.getElementById("dwOverlay").className == 'popHide'){
		document.getElementById("dwContain").className = 'popShowContain';
		document.getElementById("dwOverlay").className = 'popShowOverlay';
		if(navigator.userAgent.toLowerCase().indexOf('msie')+1){ 
			this.dwPrepareIE("100%","hidden");
			document.getElementById("dwOverlay").style.top = get_scroll();
			document.getElementById("dwContain").style.top = get_scroll();
			document.getElementById("dwOverlay").style.left = get_hscroll();
			document.getElementById("dwContain").style.left = get_hscroll();
			center_object(which);
		} else {
			which.style.marginTop= '-'+parseInt(which.offsetHeight)/2+'px';
		}
    }
	// Hide object tags while the dark window is there... bleh
	if(navigator.userAgent.toLowerCase().indexOf('msie')+1){
		var els = document.getElementsByTagName('object');
		for(var i=0;i<els.length;i++){
			els[i].style.display = 'none';
		}
	}	
	return false;	
}

function dwPrepareIE(height,overflow){
	bod = document.getElementsByTagName('body')[0];
	bod.style.height = height;
	bod.style.width = height;
	bod.style.overflow = overflow;
	htm = document.getElementsByTagName('html')[0];
	htm.style.height = height;
	htm.style.width = height;
	htm.style.overflow = overflow; 
}

function close_dark_window(which){
	if(which) which.style.display = 'none';
	if(navigator.userAgent.toLowerCase().indexOf('msie')+1){ 
		this.dwPrepareIE("auto", "auto");
		var els = document.getElementsByTagName('object');
		for(var i=0;i<els.length;i++){
			els[i].style.display = '';
		}
	}
	document.getElementById("dwContain").className = 'popHide';
	document.getElementById("dwOverlay").className = 'popHide';
}

function center_object(what){
	var x,y; 
	if(document.documentElement && document.documentElement.clientHeight){ // Explorer 6 Strict Mode
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	}else if(document.body){ // other Explorers
		x = document.body.clientWidth; 
		y = document.body.clientHeight; 
	}
	what.style.left = ((x - parseInt(what.offsetWidth)) / 2) + 'px';
	what.style.top = ((y - parseInt(what.offsetHeight)) / 2) + 'px';
}

function get_scroll(){
	var yScroll;
	if(self.pageYOffset){
		yScroll = self.pageYOffset;
    }else if(document.documentElement && document.documentElement.scrollTop){  // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop; 
    }else if(document.body){ // other Explorers
		yScroll = document.body.scrollTop;
    }
	return yScroll;
}
function get_hscroll(){
	var xScroll;
	if(self.pageXOffset){
		xScroll = self.pageXOffset;
    }else if(document.documentElement && document.documentElement.scrollLeft){  // Explorer 6 Strict
		xScroll = document.documentElement.scrollLeft; 
    }else if(document.body){ // other Explorers
		xScroll = document.body.scrollLeft;
    }
	return xScroll;
}


function get_location(obj) {
	var twidth = obj.offsetWidth;
	var theight = obj.offsetHeight;
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop,twidth,theight];
}

function selectselect(s,v,byv,clrdata){
	if(!s) return false;
	if(clrdata) s.selectedIndex = 0;
	if(!v) return false;
	for(x=0;x<s.length;x++){
		if(byv){temp = s.options[x].value;}
		else{temp = s.options[x].text;}
		if(lc(temp) == lc(v)){
			try { s.options[x].selected = true; }
			catch(em){ return false; }
			return true;
		}
	}
	return false;
}

function pad(tw,num,chr,right){
	if(!num) num = 2;
	if(!chr) chr = '0';
	tw = tw.toString();
	if(tw.length < num){
		while(tw.length < num){
			if(right){
				tw += chr;
			}else{
				tw = chr + tw;
			}
		}
	}
	return tw;
}

function send_form(form_name,url,resp,post,noload){
	if(typeof post == 'undefined' || post == null){
		post = false;
	}
	if(typeof noload == 'undefined' || noload == null){
		noload = false;
	}
	if(!ajax){
		alert('AJAX Libraries Not Loaded');
		return false;
	}
	if(document.forms[form_name]){
		var to_send = new Array();
		for(var i=0;i<document.forms[form_name].elements.length;i++){
			var el = document.forms[form_name].elements[i];
			if(el.tagName && el.id){
				if(lc(el.tagName) == 'input' && el.type != 'button'){
					if(el.type == 'radio' && el.checked){
						to_send.push(el.name+'='+el.value)
					}
					else if(el.type != 'radio' && (el.type != 'checkbox' || (el.type == 'checkbox' && el.checked == true))){
						to_send.push(el.id+'='+escape2(el.value));	
					}
					else if(el.type != 'radio'){
						to_send.push(el.id+'=');
					}
				}else if(lc(el.tagName) == 'textarea'){
					to_send.push(el.id+'='+escape2(el.value));
				}else if(lc(el.tagName) == 'select'){
					var temp_array = new Array;
					var temp_array2 = new Array;
					for(z=0;z<el.length;z++){
						if(el.options[z].selected){
							temp_array.push(el.options[z].value);
							temp_array2.push(el.options[z].text);
						}
					}
					if(temp_array.length == 0 && el.length > 0) {
						temp_array.push(el.options[0].value);
						temp_array2.push(el.options[0].text);					
					}
					to_send.push(el.id+'='+escape2(temp_array.join(',')));
					to_send.push(el.id+'_selecttext='+escape2(temp_array2.join(',')));
				}
			}
		}
		var send_string = to_send.join('&');

		// remove unicode chars if post (kills postajax)
		if(post){ send_string = send_string.replace(/\%u\d{2,5}/g,''); }
		
		// no url given... return the string
		if(!url){
			return send_string;
		// response function give, run ajax
		}else if(resp){
			if(post){
				postajax(url,'&'+send_string,resp);	
			}else{
				ajax(url+'?'+randomstring(25)+'&'+send_string,resp,noload);	
			}
			return true
		// no response give, run jax
		}else{
			return simpleajax(url+'?'+send_string);
		}
	}
}

function remove_zeros(temp_value){
	temp_value = temp_value + '';
	if(temp_value.match(/^0*(.*)/)){
		return RegExp.$1;
	}else{
		return temp_value;
	}
}

function lc(x){
	return x.toString().toLowerCase();
}

function pause(millis){
	var date = new Date();
	var curDate = null;
	do{curDate = new Date();}while(curDate-date < millis);
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

function escape2(w){
	// ASCII Character A0 (160) is nbsp in HTML.
	return(escape(w).replace(/\+/g,'%2b').replace(/\%A0/g,'%26nbsp%3B'));
}

function remove_weird(w){
	var to_return = '';
	w = w.toString();
	for(x=0;x<w.length;x++){
		if(w.charCodeAt(x) <= 127){
			to_return += w.charAt(x);
		}
	}
	return to_return;
}

function get_iframe_document(aID){
	var rv = null;
	if(document.getElementById(aID).contentDocument){
		rv = document.getElementById(aID).contentDocument;
	}else{
		rv = document.frames[aID].document;
	}
	return rv; 
}

var state_specific_check;
function getstatefields(returndiv){
	w = simpleajax('/global/state_specific_fields.cfm');
	document.getElementById(returndiv).innerHTML = w.split('|||||')[0];
	eval('state_specific_check = function(){'+w.split('|||||')[1]+'}');
	if(self.calctelone){calctelone()};
}

function phone_format(given_phone){
	given_phone = given_phone.replace(/\D+/g,"")
	given_phone.match(/(\d{3})(\d{3})(\d{4})$/);
	if(given_phone.length >= 10){
		return RegExp.$1+'-'+RegExp.$2+'-'+RegExp.$3;
	}else{
		return given_phone;
	}
}

function $(obj) {
	return document.getElementById(obj);
}
function object_length(given_object){
	var temp = 0;
	for(x in given_object){ temp++; }
	return temp;
}
function clear_select(given_select){
	for(x=given_select.length;x >= 0;x--){
		given_select[x]=null;
	}
}
function select_all(toggle,checkbox_name){
	var boxin = document.getElementsByName(checkbox_name);
	for(var i = 0; i < boxin.length; i++)
		boxin[i].checked = toggle;
}

function _get_timestamp()
{
	timestamp = (new Date()).getTime();
	return timestamp
}
//Use this when you can't use cf_checkselect because of an ajax call
function checkselect(el,value){
	for(var i=0;i<el.length;i++){
		if(el[i].value == value){
			el[i].selected = true;
		}
	}
}

// Used to associate two select boxes to drop between
// example: select_pair(select1,select2)
var select_pair_data = new Array();
function select_pair_add(w){
	if(this.selectedIndex > -1){
		if (this.options[this.selectedIndex].value.trim() != ''){
			var bookmark = this.scrollTop;
			var selected = $(this.title);
			selected[selected.length] = new Option(this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);
			this.options[this.selectedIndex] = null;
			this.scrollTop = bookmark;
		}
	}
}
function select_pair_add_noclick(selectbox,index){
	if(selectbox){
		if (selectbox.options[index].value.trim() != ''){
			var bookmark = selectbox.scrollTop;
			var selected = $(selectbox.title);
			selected[selected.length] = new Option(selectbox.options[index].text,selectbox.options[index].value);
			selectbox.options[index] = null;
			selectbox.scrollTop = bookmark;
		}
	}
}
function select_pair_remove(w){
	if(this.selectedIndex > -1){
		var bookmark = this.scrollTop;
		var values = select_pair_data[this.title+'_values'];
		var texts = select_pair_data[this.title+'_texts'];
		var all_items = $(this.title);
		var bookmark2 = all_items.scrollTop;
		all_items.length = 0;
		this.options[this.selectedIndex] = null;
		for(x=0;x<values.length;x++){
			var selected = false;
			for(y=0;y<this.length;y++){
				if(this.options[y].value == values[x]){
					if(this.options[y].text == texts[x]){
						selected = true;
					}
				}
			}
			if(!selected){
				all_items.options[all_items.length] = new Option(texts[x],values[x]);
			}
		}
		this.scrollTop = bookmark;
		all_items.scrollTop = bookmark2;
	}
}
function select_pair(_select1,_select2){
	_select2.length = 0;
	_select1.onclick = select_pair_add;
	_select1.title = _select2.id;
	_select2.onclick = select_pair_remove;
	_select2.title = _select1.id;
	// Set select1's original data asside 
	var temp_array = new Array();
	var temp_array2 = new Array();
	for(x=0;x<_select1.length;x++){
		temp_array[x] = _select1.options[x].value;
		temp_array2[x] = _select1.options[x].text;
	}
	select_pair_data[_select1.id+'_values'] = temp_array;
	select_pair_data[_select1.id+'_texts'] = temp_array2;
}

function table_remove_rows(table){
	var rows = table.tBodies[0].rows.length;
	for(r=0;r<rows;r++){
		table.tBodies[0].removeChild(table.tBodies[0].rows[0]);
		//alert(table.tBodies[0].rows.length);
	}
}

function table_add_row(table,data){
	// Remove the no results entry if it's the first addition
	if(table.tBodies[0].rows.length == 1){
		if(table.tBodies[0].rows[0].firstChild.innerHTML.indexOf('No Results') > -1){
			table.tBodies[0].rows[0].removeChild(table.tBodies[0].rows[0].firstChild);
		}
	}
	// Set up the data for the row
	var row = document.createElement("tr");
	var row_class = (table.tBodies[0].rows.length + 1) % 2 == 0 ? 'tablerow2' : 'tablerow'; 
	for(var d = 0; d < data.length; d++){
		if(d > 1){
			var cell = document.createElement("td");
			cell.className = row_class;
			cell.innerHTML = '<img src="/images/s.gif">';
			cell.style.backgroundColor = '#000000';
			cell.style.width = '1px';
			row.appendChild(cell);
		}
		var cell = document.createElement("td");
		cell.className = row_class + ' normal';
		cell.style.padding = '0pt 2pt';
		cell.innerHTML = data[d];
		row.appendChild(cell);
	}
	// Add the row
	table.tBodies[0].appendChild(row);
}

var Validation = {
	// signed_only on input text [digits and -digits only]
	// usage: onkeypress="return Validation.signed_only(event,this);">
	signed_only: function (ev, oThis) {
	    var key = this.getKeyCode(ev);
	    if(this.isNonCharCode(ev) && key != 45){
	        return true;
	    }
	
		if (oThis == null || ev == null || oThis.value == null) 
			return false;
			
	    if(this.textHighlighted(oThis) || (key == 8 || key == 127)){
	        if(!this.isNumeric(ev) && !(oThis.value.length == 0 && key == 45)){
	            ev.returnValue = false;
			    return false;
	        }
	        return true;
	    }
			
		if(!this.isNumeric(ev) && !(oThis.value.length == 0 && key == 45)){
			ev.returnValue = false;
			return false;
		}
		return true;
	},
	// unsigned_only on input text [digits only]
	// usage: onkeypress="return Validation.unsigned_only(event,this);">
	unsigned_only: function (ev, oThis) {
	    var key = this.getKeyCode(ev);
	
		if (oThis == null || ev == null || oThis.value == null) 
			return false;
			
	    if(this.textHighlighted(oThis) || (key == 8 || key == 127)){
	        if(!this.isNumeric(ev)){
	            ev.returnValue = false;
			    return false;
	        }
	        return true;
	    }
			
		if(!this.isNumeric(ev)){
			ev.returnValue = false;
			return false;
		}
		return true;
	},
	isNonCharCode: function(e){
	    var c = e.keyCode;
	    if( (c >= 33 && c <= 40) || (c >= 16 && c <= 20) ||
	        c == 45 || c == 46 || c == 8 || c == 9 || c == 13 || c == 27 || c == 27 ){
	        return true;
	    }
	    return false;
	},
	textHighlighted: function (oThis){
	    if (document.selection){
	        if(document.selection.type == "Text"){
	            return true;
	        }
	    }else if(oThis.selectionStart != null && oThis.selectionEnd != null ){
	        if( oThis.selectionStart != oThis.selectionEnd ){
	            return true;
	        }
	    }
	
	    return false;
	},
	getKeyCode: function (ev){
	    if(ev.keyCode){
	        return ev.keyCode;
	    }else{
	        return ev.charCode;
	    }
	},
	isNumeric: function (e) {
		var c = this.getKeyCode(e);
		
		if ( c != 8 && ( c < 48 || c > 57 ) ){
			return false;
		}
		return true;
	}
};

// indexOf is a recent addition to the ECMA-262 standard; as such it may not be present in all browsers
if (!Array.prototype.indexOf){
 	Array.prototype.indexOf = function(elt /*, from*/){
    	var len = this.length >>> 0;

    	var from = Number(arguments[1]) || 0;
    	from = (from < 0)?Math.ceil(from):Math.floor(from);
    	if (from < 0)
      		from += len;

    	for (; from < len; from++){
      		if (from in this && this[from] === elt)
        		return from;
    	}
    	return -1;
  	};
}

function build_cftable(args){
	if(typeof args.query == 'undefined'){return ''}
	if(typeof args.id == 'undefined'){return ''}
	if(typeof args.cols == 'undefined'){args.cols = ''}
	if(typeof args.tits == 'undefined'){args.tits = ''}
	if(typeof args.snip == 'undefined'){args.snip = ''}
	if(typeof args.draggable != 'boolean'){args.draggable = false}
	if(typeof args.draggable_value_column == 'undefined'){args.draggable_value_column = ''}
	// keeping all referenced keys at the top
	if(typeof args.parent_id == 'undefined'){}
	
	var spacer = '<img src="/images/s.gif" width="1" height="1" />';
	var totalcols = args.cols.split(',').length * 2;
	if(args.draggable){
		totalcols++;
	}
	args.colsA = args.cols.split(',');
	args.titsA = args.tits.split(',');
	
	this.build_blackrow = function(cols){
		var blackrow = document.createElement('tr');
		var blackcell = document.createElement('td');
		blackcell.setAttribute('colSpan',cols);
		blackcell.style.height = '1px';
		blackcell.style.backgroundColor = '#000000';
		blackcell.innerHTML = spacer;
		blackrow.appendChild(blackcell);
		return blackrow;
	}
	this.build_spacer = function(cl){
		var spacercell = document.createElement('td');
		if(cl != ''){
			spacercell.setAttribute('class',cl);
			spacercell.setAttribute('className',cl);
		} else {
			spacercell.setAttribute('bgColor','#000000');
		}
		spacercell.setAttribute('width','1');
		spacercell.innerHTML = spacer;
		return spacercell;
	}
	this.build_draghandle = function(row,id){
		if(typeof id == 'undefined'){id = row}
		var dragcell = document.createElement('td');
		dragcell.setAttribute('class','cftabledraghandle');
		dragcell.setAttribute('className','cftabledraghandle');
		dragcell.innerHTML = spacer;
		var dragcellid = document.createElement('input');
		dragcellid.setAttribute('type','hidden');
		dragcellid.setAttribute('id','dragrowvalue'+row);
		dragcellid.setAttribute('value',id);
		dragcell.appendChild(dragcellid);
		return dragcell;
	}
	
	// <table>
	var cftable = document.createElement('table');
	cftable.setAttribute('border','0');
	cftable.setAttribute('width','100%');
	cftable.setAttribute('align','center');
	cftable.setAttribute('class','cf_table');
	cftable.setAttribute('className','cf_table');
	cftable.setAttribute('id',args.id);
		// <thead>
		var header = document.createElement('thead');
			// <tr>
			header.appendChild(this.build_blackrow(totalcols));
			// <tr>
			var titlerow = document.createElement('tr');
				// <td> for each column
				if(args.draggable){
					var dragtitle = document.createElement('td');
					dragtitle.setAttribute('class','selected');
					dragtitle.setAttribute('className','selected');
					dragtitle.innerHTML = spacer;
					titlerow.appendChild(dragtitle);
				}
				for(var i=0;i<args.titsA.length;i++){
					if(i==0){
						var titlesnip = document.createElement('td');
						titlesnip.setAttribute('class','selected');
						titlesnip.setAttribute('className','selected');
						titlesnip.innerHTML = spacer;
						titlerow.appendChild(titlesnip);
					} else {
						titlerow.appendChild(this.build_spacer('selected'));
					}
					var titlecolumn = document.createElement('td');
					titlecolumn.setAttribute('class','selected');
					titlecolumn.setAttribute('className','selected');
					//titlecolumn.style.paddingTop = '0pt';
					//titlecolumn.style.paddingBottom = '0pt';
					//titlecolumn.style.paddingLeft = '2pt';
					//titlecolumn.style.paddingRight = '2pt';
					titlecolumn.style.margin = '0px';
					titlecolumn.innerHTML = args.titsA[i];
					titlerow.appendChild(titlecolumn);
				}
			header.appendChild(titlerow);
			// <tr>
			header.appendChild(this.build_blackrow(totalcols));
		cftable.appendChild(header);
		// <tbody>
		var body = document.createElement('tbody');
		if(args.query.length > 0){
			for(var j=0;j<args.query.length;j++){
				// <tr>
				var row = document.createElement('tr');
				var rowdata = args.query[j];
				
				var rowclass = 'tablerow';
				if((j % 2) == 1){
					rowclass += '2';
				}
					// <td>
					if(args.draggable){
						var dragvalue = j+1;
						if(args.draggable_value_column != ''){
							dragvalue = rowdata[args.draggable_value_column];
						}
						row.appendChild(this.build_draghandle(j+1,dragvalue));
					}
					// <td>
					for(var i=0;i<args.colsA.length;i++){
						if(i==0){
							var snip = document.createElement('td');
							var sniptext = args.snip;
							snip.setAttribute('noWrap','nowrap');
							snip.setAttribute('width','30');
							snip.setAttribute('class',rowclass);
							snip.setAttribute('className',rowclass);
							snip.style.paddingRight = '5px';
							// save processing if possible
							if(sniptext.match(/\$/)){
								keysfound = true;
								while(keysfound){
									keysfound = false;
									for(k in rowdata){
										var check = sniptext;
										sniptext = sniptext.replace('$'+k+'$',rowdata[k]);
										if(check != sniptext){
											keysfound = true;
										}
									}
								}
							} else if(sniptext == ''){
								sniptext = '&nbsp;'
							}
							snip.innerHTML = sniptext;
							row.appendChild(snip);
						} else {
							row.appendChild(this.build_spacer(''));
						}
						var cell = document.createElement('td');
						cell.setAttribute('class',rowclass);
						cell.setAttribute('className',rowclass);
						cell.style.paddingTop = '0pt';
						cell.style.paddingBottom = '0pt';
						cell.style.paddingLeft = '2pt';
						cell.style.paddingRight = '2pt';
						cell.style.margin = '0px';
						cell.innerHTML = '<font class="normal">' + rowdata[args.colsA[i]] + '</font>';
						row.appendChild(cell);
					}
				body.appendChild(row);
			}
			body.appendChild(this.build_blackrow(totalcols));
		} else {
			var row = document.createElement('tr');
				var cell = document.createElement('td');
				cell.setAttribute('colSpan',totalcols);
				cell.setAttribute('class','normal');
				cell.setAttribute('className','normal');
				cell.innerHTML = 'No Results';
				row.appendChild(cell);
			body.appendChild(row);
		}
		cftable.appendChild(body);
	cftable.cellPadding = 0;
	cftable.cellSpacing = 0;
	if(typeof args.parent_id == 'undefined'){
		return cftable;
	} else {
		$(args.parent_id).innerHTML = '';
		$(args.parent_id).appendChild(cftable);
		if(args.draggable){
			objsToMakeDraggable.push($(args.id));
			initdraggables();
		}
	}
}

function ajax_split(string){
	return string.split('<!-- Agrian Ajax Delimiter -->');	
}