function printr(obj, use_alert){
	var desc = 'Type: '+ typeof(obj) +"\r\n--------------------\r\n\r\n";
	var num = 0;
	for(var i in obj){
		desc += i +' = '+ (typeof(obj[i]) == 'function' ? '[FUNCTION]' : obj[i]) +"\r\n";
		if(use_alert){
			desc += "\r\n\r\n";
			alerted = false;
			if(!(++num%10)){
				alerted = true;
				alert(desc);
				desc = '';
			}
		}else{
			debug(desc);
			desc = '';
		}
	}
	if(use_alert && !alerted){
		alert(desc);
	}
}

function debug(msg){
	var obj = $('debug');
	if(!obj){
		obj = document.createElement('textarea');
		obj.id = 'debug';
		if(!obj.style.width) obj.style.width = '600px';
		if(!obj.style.height) obj.style.height = '400px';
		document.body.appendChild(obj);
	}
	obj.value += "\r\n"+ msg;
	obj.scrollTop = obj.scrollHeight;
}

function getType(obj){
	var obj = $(obj);
	alert(typeof(obj));
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

var global_key_code = 0;
function KeyCheck(e){
	var evt = (window.event) ? event : e;
	global_key_code = evt.keyCode;
	global_shift_key = evt.shiftKey;
	global_ctrl_key = evt.ctrlKey;
	global_alt_key = evt.altKey;
}

document.onkeydown = KeyCheck;

var ie = window.event;
var ajax_searching = false;
var ajax_results = false;
var ajax_num_current = 0;
var ajax_num_results = 0;
var ajax_cur_obj = false;
var ajax_scroll_start = false;
var ajax_time_diff = 0;
var ajax_scroll_delay = 400;
var ajax_pending_requests = false;
var ajax_hover_obj = false;
var ajax_obj_clicked = false;
var ajax_selected_num = false;

function swapDisplayByClass(class_name, display){
	var objs = document.getElementsByClassName(class_name);

	var cnt = objs.length;
	for(var i=0; i < cnt; i++){
		var obj = objs[i];
		obj.swapDisplay();
	}

}
/*
Element.addMethods({
	
	insertAfter: function(obj, sibling) {
		obj.parentNode.insertBefore(sibling, obj.nextSibling);
	},

	swapDisplay: function(obj, animated){
		var strict_animated = obj.getAttribute('animated');
		if(animated === undefined){
			animated = (strict_animated == "true");
		}else{
			if(strict_animated){
				animated = (strict_animated == "true");
			}
		}

		switch(obj.style.display){
			case 'none':
				var displayed = false;
				break;
			default:
				var displayed = true;
		}

		if(animated){
			if(displayed){
				Effect.SlideUp(obj.getAttribute('id'), {scaleFromCenter: false, duration: .5, from: 0.0, to: 1.0});
			}else{
				Effect.SlideDown(obj.getAttribute('id'), {scaleFromCenter: false, duration: .5, from: 0.0, to: 1.0});
			}
		}else{

			switch(obj.nodeName){
				case 'LI':
					var display = (!ie) ? 'list-item' : 'block';
					break;
				case 'TABLE':
					var display = (!ie) ? 'TABLE' : 'block';
					break;
				case 'TBODY':
					var display = (!ie) ? 'table-row-group' : 'block';
					break;
				case 'THEAD':
					var display = (!ie) ? 'table-header-group' : 'block';
					break;
				case 'TFOOT':
					var display = (!ie) ? 'table-footer-group' : 'block';
					break;
				case 'COLGROUP':
					var display = (!ie) ? 'table-column-group' : 'block';
					break;
				case 'COL':
					var display = (!ie) ? 'table-column' : 'block';
					break;
				case 'CAPTION':
					var display = (!ie) ? 'table-caption' : 'block';
					break;
				case 'TR':
					var display = (!ie) ? 'table-row' : 'block';
					break;
				case 'TH':
				case 'TD':
					var display = (!ie) ? 'table-cell' : 'block';
					break;
				default:
					var display = 'block';
					break;
			}

			obj.style.display = (displayed) ? 'none' : display;
		}

		return false;
	},

	initAjaxResults: function(obj){

		if(global_key_code == 13 && ajax_results){
			return false;
		}

		if(ajax_results){
			if(!ajax_scroll_start){
				var tmp_date = new Date();
				ajax_scroll_start = tmp_date.getTime();
			}

			var check_date = new Date();
			ajax_time_diff = check_date.getTime() - ajax_scroll_start;
			if(ajax_time_diff >= ajax_scroll_delay){
				obj.scrollAjaxResults();			
			}
		}

	},

	getAjaxResults: function(obj){

		obj.prefix = obj.id.replace('_label', '');
		obj.min_chars = (obj.getAttribute('ajax_min_chars')) ? obj.getAttribute('ajax_min_chars') : 1;

		ajax_scroll_start = false;

		//if user pressed an arrow key then execute navigation functions
		if(obj.scrollAjaxResults()){
			return;
		}

		if(!ajax_searching && obj.value.length >= obj.min_chars){

			if(!Ajax){
				alert('This functionality requires the Ajax class found in the Prototype framework');
			}else{

				ajax_searching = true;

				if(ajax_obj_clicked){
					var keywords = '';
					ajax_obj_clicked = false;
				}else{
					var keywords = obj.value;
				}

				var url = obj.getAttribute('ajax_url');
				var args = obj.getAttribute('ajax_args');
				args += '&keywords='+ keywords;

				var myAjax = new Ajax.Request(url, {method: 'get', parameters: args, onComplete: function(r){
					obj.parseAjaxResults(r);
				}});
			}
		}else{
			ajax_pending_requests = true;
		}
		
		ajax_cur_obj = obj;
	},

	parseAjaxResults: function(obj, r){
		ajax_searching = false;

		var res = r.responseText;
		var dropdown_id = obj.prefix+'_results';
		var value_fld = $(obj.prefix);

		if($(dropdown_id)){
			$(dropdown_id).parentNode.removeChild($(dropdown_id));
		}
		var ResultDropdown = document.createElement('div');
		Element.extend(ResultDropdown);
		ResultDropdown.style.visibility = 'hidden';
		ResultDropdown.className = 'ajax_result_dropdown';
		ResultDropdown.setAttribute('id', dropdown_id);

		//append result dropdown after input field 
		obj.insertAfter(ResultDropdown);

		var CloseButton = document.createElement('div');
		Element.extend(CloseButton);
		CloseButton.className = 'close_off';
		CloseButton.obj = obj;
		CloseButton.setAttribute('title', 'Click here or press [esc] to close this window');
		CloseButton.onmouseover = function(){
			this.className = 'close_on';
		}
		CloseButton.onmouseout = function(){
			this.className = 'close_off';
		}
		CloseButton.onclick = function(){
			$(this.id).obj.closeAjaxResults();
		}
		ResultDropdown.appendChild(CloseButton);

		ajax_results = true;
		ajax_num_results = 0;
		max_item_width = 0;
		total_item_height = 0;
		if(res == 'noresults'){
			var ErrorDiv = document.createElement('div');
			Element.extend(ErrorDiv);
			ErrorDiv.innerHTML = 'No Results Found';
			ResultDropdown.appendChild(ErrorDiv);
		}else if(res == 'error'){
			var ErrorDiv = document.createElement('div');
			Element.extend(ErrorDiv);
			ErrorDiv.innerHTML = 'There was an error while trying to execute the requested action. If you continue to receive this error please contact an administrator.';
			ResultDropdown.appendChild(ErrorDiv);
		}else{
			var results = r.responseText.split('[|ITEM|]');
			ajax_num_results = results.length;
			var item_num = 0;
			for(var i=0; i < ajax_num_results; i++){
				var item = results[i];
				var data = item.split('[|DATA|]', 3);
				var div_label = data[0];
				var fld_label = data[1];
				var value = data[2];

				item_num++;

				if(value_fld.value == value){
					ajax_selected_num = item_num;
				}

				var ResultDiv = document.createElement('div');
				Element.extend(ResultDiv);
				ResultDiv.obj = obj;
				ResultDiv.label = fld_label;
				ResultDiv.value = value;
				ResultDiv.oid = obj.prefix;
				ResultDiv.innerHTML = div_label;
				ResultDiv.id = obj.prefix +'_result_'+ (i + 1);
				ResultDiv.className = 'off';
				ResultDiv.num = item_num;
				ResultDiv.onclick = function(){
					this.obj.chooseAjaxResult(this);
				}
				ResultDiv.onmouseover = function(){
					this.obj.navigateAjaxResults(this.num);
				}
				ResultDiv.onmouseout = function(){
				}

				ResultDropdown.appendChild(ResultDiv);

				total_item_height += ResultDiv.offsetHeight;
				if(ResultDiv.offsetWidth > max_item_width){
					max_item_width = ResultDiv.offsetWidth;
				}
			}

		}

		max_item_width += 10;

		ResultDropdown.hide();
		ResultDropdown.style.visibility = 'visible';

		//set scrolling to dropdown if applicable
		var cur_height = ResultDropdown.getHeight();
		var max_height = obj.getAttribute('ajax_dropdown_max_height');
		var dropdown_width = obj.getWidth();
		if(max_item_width > dropdown_width){
			var max_obj_width = obj.getAttribute('ajax_dropdown_max_width');
			if(max_obj_width && max_item_width > max_obj_width){
				dropdown_width = max_obj_width;
			}else{
				dropdown_width = max_item_width;
			}
		}
		var input_right_x = obj.getOffset('left') + obj.getWidth();
		var dropdown_right_x = obj.getOffset('left') + dropdown_width;
		if(dropdown_right_x > document.body.clientWidth && input_right_x <= document.body.clientWidth){
			var diff = dropdown_right_x - document.body.clientWidth;
			dropdown_width -= diff;
		}
		ResultDropdown.style.overflow = 'auto';
		ResultDropdown.style.overflowX = 'hidden';
		if(max_height && cur_height > max_height){
			ResultDropdown.style.height = max_height +'px';

			if(dropdown_width < max_item_width){
				dropdown_width += 13;
			}
		}

		//adjust width
		if(ResultDropdown.scrollHeight > 1){
			dropdown_width += 2;
		}

		var dropdown_top = obj.getOffset('top') + obj.clientHeight;
		var dropdown_left = obj.getOffset('left');
		var outline_width = parseInt(obj.getStyle('outline-width'));
		if(typeof(outline_width) == 'number'){
			//dropdown_left += outline_width;
		}
		ResultDropdown.style.width = dropdown_width +'px';
		ResultDropdown.style.left = dropdown_left +'px';
		ResultDropdown.style.top = dropdown_top +'px';
		ResultDropdown.style.margin = 0;

		//cache the settings for the dropdown for later use
		ResultDropdown.cache = {
			height: ResultDropdown.getHeight(),
			width: ResultDropdown.getWidth(),
			style: ResultDropdown.style
		};

		//show dropdown
		ResultDropdown.show();
		
		value_fld.value = '';
		if(ajax_selected_num){
			obj.navigateAjaxResults(ajax_selected_num);
		}

		if(ajax_pending_requests){
			ajax_pending_requests = false;
			obj.getAjaxResults();
		}

	},

	showAjaxDropdown: function(obj){
		
	},

	scrollAjaxResults: function(obj){

		switch(global_key_code){
			case 13:
				//enter
				if(ajax_num_current){
					var item = $(obj.prefix+'_result_'+ajax_num_current);
					obj.chooseAjaxResult(item);
					return true;
				}
				break;
			case 9:
				//tab
				return true;
			case 27:
				//escape
				obj.closeAjaxResults();
				return true;
			case 37:
				//left arrow
			case 38:
				//up arrow
				if(ajax_results){
					obj.navigateAjaxResults('up');
					return true;
				}else{
					break;
				}
			case 39:
				//right arrow
			case 40:
				//down arrow
				if(ajax_results){
					obj.navigateAjaxResults('down');
					return true;
				}else{
					break;
				}
		}

		return false;

	},

	navigateAjaxResults: function(obj, dir){

		switch(dir){
			case 'up':
				if(ajax_num_current <= 1){
					ajax_num_current = 0;
				}else{
					ajax_num_current--;
				}
				break;
			case 'down':
				if(ajax_num_current >= ajax_num_results){
					ajax_num_current = ajax_num_results;
				}else{
					ajax_num_current++;
				}
				break;
			default:
				//navigate to specific item
				ajax_num_current = dir;
				break
		}

		var item = false;
		for(var i=1; i <= ajax_num_results; i++){
			var tmp_item = $(obj.prefix +'_result_'+ i);
			if(tmp_item){
				if(i == ajax_num_current){
					item = tmp_item;
					tmp_item.className = 'over';
				}else{
					tmp_item.className = 'off';
				}
			}
		}


		//scroll dropdown to selected element
		if(item && ajax_num_current){
			var dropdown_id = obj.prefix+'_results';
			var dropdown = $(dropdown_id);

			var dropdown_top_x = dropdown.getOffset('top');
			var dropdown_bottom_x = dropdown_top_x + dropdown.clientHeight;
			if(dropdown){
				var item_margin_height = parseInt(item.getStyle('margin-top'));
				if(typeof(item_margin_height) != 'number'){
					item_margin_height = 0;
				}
				var item_top_x = item.getOffset('top') - dropdown.scrollTop;
				var item_bottom_x = item_top_x + (item_margin_height) + item.getHeight() + 1;
				var diff_top = dropdown_top_x - item_top_x;
				var diff_bottom = item_bottom_x - dropdown_bottom_x;

				if(diff_top > 0){
					dropdown.scrollTop -= diff_top;
				}else if(diff_bottom > 0){
					dropdown.scrollTop += diff_bottom;
				}
			}
		}

		obj.focus();
		obj.value = obj.value;

	},

	getOffset: function(obj, side) {

		var curleft = curtop = 0;
		if (obj.offsetParent){
			curleft = obj.offsetLeft
			curtop = obj.offsetTop
			while (obj = obj.offsetParent){
				curleft += obj.offsetLeft
				curtop += obj.offsetTop
			}
		}
		
		switch(side){
			case 'left':
				return curleft;
				break;
			case 'top':
				return curtop;
				break;
			default:
				return [curleft,curtop];
		}
	},

	openAjaxResults: function(obj){

		ajax_obj_clicked = true;

		if(ajax_cur_obj && obj.id != ajax_cur_obj.id){
			ajax_cur_obj.closeAjaxResults();
			obj.getAjaxResults();
		}else{
			if(ajax_results){
				obj.closeAjaxResults();
				return false;
			}else{
				obj.getAjaxResults();
				obj.select();
			}
		}

	},

	closeAjaxResults: function(obj, check){

		if(ajax_cur_obj){
			obj = ajax_cur_obj;
		}

		if(ajax_results && (!check && !ajax_hover_obj)){
			ajax_results = false;
			ajax_num_results = 0;
			ajax_num_current = 0;
			ajax_scroll_start = false;
			var dropdown_id = obj.prefix+'_results';
			var result_obj = $(dropdown_id);
			if(result_obj){
				Effect.SlideUp(result_obj.id, {scaleFromCenter: false, duration: .1, from: 0.0, to: 1.0});
			}
		}
		
	},

	chooseAjaxResult: function(obj, item){
		$(item.obj.prefix).value = item.value;
		$(item.obj.id).value = item.label;
		obj.closeAjaxResults();

	},

	swapAjaxClass: function(obj, new_class){
		obj.className = new_class;
		return obj;
	}

});
*/

function checkField(fld, id, label){

	var checkbox = $('avail_'+ fld +'_'+ id);

	if(checkbox){
		checkbox.checked = !checkbox.checked;

		var div = $('avail_'+ fld +'_'+ id +'_div');
		div.checked = checkbox.checked;
		if(div.checked){
			div.style.backgroundColor = '#f1d2d2';
		}else{
			div.style.backgroundColor = '#fff';
		}

		if(checkbox.checked){
			addField(fld, id, label);
		}else{
			removeField(fld, id);
		}
	}

}

function addField(fld, id, label){
	var exists = $('elem_'+ fld +'_'+ id);

	var checkbox = $('avail_'+ fld +'_'+id);
	if(checkbox){
		checkbox.checked = true;
	}

	if(!exists){

		var is_sortable = ($(fld +'_list').getAttribute('sortable') == 'true');

		var div = document.createElement('div');
		div.id = 'elem_'+ fld +'_'+ id;
		div.style.padding = '5px';
		div.style.width = '100%';
		div.onmouseover = function(){
			if(is_sortable){
				this.style.cursor = 'pointer';
			}
			this.style.backgroundColor = '#efefef';
		}
		div.onmouseout = function(){
			this.style.backgroundColor = '';
		}

		var ahref = document.createElement('a');
		ahref.setAttribute('href', 'javascript: void(0);');
		ahref.setAttribute('title', 'Remove this item');
		ahref.onclick = function(){
			checkField(fld, id);
		}

		var img = document.createElement('img');
		img.src = '/templates/images/x.gif';
		img.style.border = '0';
		img.style.marginRight = '5px';
		ahref.appendChild(img);

		var element = document.createElement('input');
		element.setAttribute('type', 'hidden');
		element.setAttribute('name', fld +'_arr[]');
		element.value = id;

		var txt_label = document.createTextNode(label);

		div.appendChild(ahref);
		div.appendChild(element);
		div.appendChild(txt_label);

		$(fld +'_list').appendChild(div);
		
		if(is_sortable){
			Sortable.create(fld +'_list', {tag: 'div', constraint: 'vertical', scroll: fld +'_list'});
		}

		//clear from memory
		div = ahref = img = element = txt_label = null;

	}

}

function removeField(fld, id){
	var element = $('elem_'+ fld +'_'+ id);
	if(element){
		element.remove();
	}

	var checkbox = $('avail_'+ fld +'_'+ id);
	if(checkbox){
		checkbox.checked = false;
	}
}


function openPopupCalendar(form, fmonth, fday, fyear, func, enable_day){
	var w = 200;
	var h = 200;
	var t = (screen.height/2)-h/2;
	var l = (screen.width/2)-w/2;
	var month = document.forms[form].elements[fmonth].value;
	var day = document.forms[form].elements[fday].value;
	var year = document.forms[form].elements[fyear].value;
	cur_popup = window.open('popup.php?action=Calendar&month='+ month +'&day='+ day +'&year='+ year +'&func='+ func +'&enable_day='+ enable_day +'&form_name='+ form +'&fmonth='+ fmonth +'&fday='+ fday +'&fyear='+ fyear, 'calendar', 'location=0, resizable=0, scrollbars=0, status=0, menubar=0, width=200, height=200, top='+ t +', left='+ l);
}

function chooseDate(m, d, y, formname, fmonth, fday, fyear){
	if (window.opener && !window.opener.closed){
		if(!formname) formname = 'update';
		if(!fmonth) fmonth = 'update';
		if(!fday) fday = 'update';
		if(!fyear) fyear = 'update';
		window.opener.document.forms[formname][fmonth].value = m;
		window.opener.document.forms[formname][fday].value = d;
		window.opener.document.forms[formname][fyear].value = y;
		window.close();
	}
}



var cur_tab_id = '';
function hideAllTabs(){
	for(var i=0, n=tabs.length; i < n; i++){
		var tab = tabs[i];
		$('tab_'+ tab +'_area').hide();
	}
}

function swapTab(id){
	if(cur_tab_id){
		var cur_tab_area = $('tab_'+ cur_tab_id +'_area');
		var cur_tab = $('tab_'+ cur_tab_id);
		cur_tab.className = 'tab_label_off';

		cur_tab_area.hide();
	}

	cur_tab_id = id;
	cur_tab_area = $('tab_'+ cur_tab_id +'_area');
	cur_tab = $('tab_'+ cur_tab_id);
	cur_tab.className = 'tab_label_on';

	cur_tab_area.show();

}
