/**
 * returnXhrRequestFromFormStr
 * @param element (dom element)
 * @return string 
 * @TODO: add support for radio buttons
 */
function returnXhrRequestFromFormStr(element)
{
    var len = element.elements.length;
	var str = '';
	
	if(typeof(element)=='string'){
		element = $(element);
	}
	
    for (var i = 0; i < len; i++) 
	{
		var e = element.elements[i];

       	if(e.id != '' && e.id != undefined)
		{
			if(e.type == 'text'){ // text elements
				str+= '&'+e.id+'='+encodeURI(escape(e.value));
			}
			else if(e.type=='checkbox' && e.checked==true){ // checkbox is checked 
				str+= '&'+e.id+'=1';
			}
			else if(e.type=='checkbox' && e.checked==false){  // checkbox is not checked 
				str+= '&'+e.id+'=0';
			}
			else if(e.type=='radio' && e.checked==true)
			{
				str+= '&'+e.name+'='+encodeURI(escape(e.value));
			}
			else if(e.type=='select-one') // select values should also include selectedIndexes text
			{ 
				var index = $(e.id).selectedIndex;
				if(index != -1){
					str+= '&'+e.id+'_text='+encodeURI(escape(e.options[index].text));
					str+= '&'+e.id+'='+encodeURI(escape(e.value));
				}
			}
			else if(e.type=='select-multiple') // multiple select
			{
				var valueArr = new Array();
				var textArr = new Array();
				for(var j=0;j<e.length;j++){
					if(e.options[j].selected==true){
						valueArr.push(encodeURI(escape(e.options[j].value)));
						textArr.push(encodeURI(escape(e.options[j].text)));
					}
				}
				str+='&'+e.id+'_jsonValue='+JSON.encode(valueArr);
				str+='&'+e.id+'_jsonText='+JSON.encode(textArr);
			}
			else{ // all other elements 
				str+= '&'+e.id+'='+encodeURI(escape(e.value));
			}
        }
    }
	
	return str;
}

/**
 * returnRadioBoxValueStr
 * @param element
 * @return value
 */
function returnRadioBoxValue(e)
{
	if(typeof(e)!='object'){
		e = $(e);
	}

	var len = e.length;
	
	for(var i=0;i<len;i++){
		if(e[i].checked == true){
			return e[i].value;
		}
	}
	return '';
}

/**
 * returnSelectBoxTextStr
 * @param element
 * @return string
 */
function returnSelectBoxTextStr(e){
	if(typeof(e)=='string'){
		e = $(e);
	}
	var index = $(e.id).selectedIndex;
	return e.options[index].text;
}

/**
 * returnSelectBoxTextStr
 * @param element
 * @return string
 */
function setSelectBox(e){
	if(typeof(e)=='string'){
		e = $(e);
	}
	var index = $(e.id).selectedIndex;
	return e.options[index].text;
}


/**
 * alertXhrResponseResult
 * @param xhrResponse(str),successMsg(str),errorTitle(str)
 * @return xhrResponse
 * @see xhrResponse should be json string with array in format of array('success'=>bool,'error'=>array(errors...))
 */
function alertXhrResponseResult(xhrResponse,successTitle,errorTitle,onSuccess)
{
	var object = JSON.decode(xhrResponse);
	if(xhrResponse=='' || xhrResponse==undefined){ // bad response 
		alert('XHR Response is either null or undefined');
	}
	else if(typeof(object)!='object'){ // bad response
		alert('Error: Malformed data returned from server (not an object)');
	}
	else if(object.success || object.error) // good response 
	{
		if(object.success=='1'){
			if(successTitle!='' && successTitle!=undefined){
				alert(successTitle);
				if(onSuccess!=undefined && onSuccess!=''){
					eval(onSuccess);
				}
			}
		}
		else
		{
			var str = errorTitle+" \r\n \r\n";
			for(var i=0;i<object.error.length;i++){
				str+= object.error[i]+"\r\n";
			}
			alert(str);
		}
	}
	else { // should not get here 
		alert('Unknown Error: Possible malformed data returned from server (missing object.success or object.error)');
	}
	return xhrResponse;
}

/**
 * setFormFieldsToNull
 * @param element (dom element)
 * @return void 
 * @TODO provide support for non-text elements
 */
function setFormFieldsToNull(element)
{
    var len = element.elements.length;
	var str = '';
	
	if(typeof(element)=='string'){
		element = $(element);
	}
	
    for (var i = 0; i < len; i++) 
	{
        var e = element.elements[i];

       	if(e.id != '' && e.id != undefined && e.type=='text') // all other elements
		{
			e.value = '';
        }
    }
}

/**
 * phoneNumberFormat: takes numbers being entered in by user and reformats them (note: should be called by onkeyup event)
 * @author cn
 * @param element(this)
 * @return none
 */
function phoneNumberFormat(element,e)
{
  if(e){
          e = e
     } else {
          e = window.event
     }

     if(e.which){
          var keycode = e.which
     }
     else if(e.key){
     	var keycode = e.key;
     }
     else {
          var keycode = e.keyCode
     }

	if(keycode=='8' || keycode=='46' || keycode=='backspace'){
		return;
	}
	
	var formatted='';
	var valid=0;
	var string = document.getElementById(element.id).value;
	var length = string.length;
	
	string=string.replace('(','');
	string=string.replace(')','');
	string=string.replace('-','');
	string=string.replace('-','');
	string=string.replace('.','');
	string=string.replace('.','');
	string=string.replace(' ','');
	string=string.replace(' ','');
	string=string.replace(' ','');
	
	if(length>=1)
	{
		if(length>2){
			formatted='('+string.charAt(0)+string.charAt(1)+string.charAt(2)+') ';
			formatted+=string.charAt(3)+string.charAt(4)+string.charAt(5);
			
			if(length>8){
				formatted+='-'+string.charAt(6)+string.charAt(7)+string.charAt(8)+string.charAt(9);
			}
		}
		
		if(formatted.length>0){
			document.getElementById(element.id).value=formatted;
		}
	}
}

/** CLASSES **/
var ExportRecordSetToCsv = new Class({
	Implements: [Options],
	options:{
		filter: '',
		column: '', 
		orderBy: '', 
		param: '',
		action: ''
	},
	initialize: function(options){
		this.setOptions(options);
	},
	exportToCsv: function(){
		window.open('download.php?action='+this.options.action+'&filter='+this.options.filter+'&column='+this.options.column+'&orderBy='+this.options.orderBy+'&param='+this.options.param) 
	}
})
