if (!Spry.DataUtils) Spry.DataUtils = {};

Spry.DataUtils.Search=function(searchform,dataset,data_region,nodata_region){
	//Run only if dataset and form are present on the page
	if(eval(dataset) && (eval("document."+searchform) || eval("document.getElementById('"+searchform+"')"))){
		this.searchform=(eval("document."+searchform))?(eval("document."+searchform)):(eval("document.getElementById('"+searchform+"')"));
		var frm=(eval("document."+searchform))?("document."+searchform):("document.getElementById('"+searchform+"')");
		this.dataset=eval(dataset);
		this.url=this.dataset.getURL();
		
		//Hide result region initially -nothing to show
		this.dataset.setURL("");
		//Set the action of the form to the search function
		this.searchform.action="javascript:spryDatasetSearch("+frm+",'"+this.url+"','"+dataset+"');";

		//Add observer 
		this.resultObserver=function(notificationType, dataSet, data){
			this.data_region=(data_region!="" && document.getElementById(data_region))?document.getElementById(data_region):"";
			this.nodata_region=(nodata_region!="" && document.getElementById(nodata_region))?document.getElementById(nodata_region):"";
		//if noresult region is defined show it if dataset is empty - otherwise hide it and show resutls region
			if (notificationType == "onDataChanged"){
				if(!dataSet.getRowByRowNumber(0)){
					if(this.data_region!=""){this.data_region.style.display="none";}
					if(this.nodata_region!=""){this.nodata_region.style.display="inline";}
				}else{
					if(this.data_region!=""){this.data_region.style.display="inline";}
					if(this.nodata_region!=""){this.nodata_region.style.display="none";}
				}
			}
		};
		this.dataset.addObserver(this.resultObserver);
	}
}

function setQueryString(frm){
    var queryString="";
    var numberElements =  frm.elements.length;
    for(var i = 0; i < numberElements; i++) {
		if(frm.elements[i].type!="checkbox" || (frm.elements[i].type=="checkbox" && frm.elements[i].checked)){
			if(i < numberElements-1) {
				queryString += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value)+"&";
			} else {
				queryString += frm.elements[i].name+"="+encodeURIComponent(frm.elements[i].value);
			}
		}
    }
	return queryString;
}

function spryDatasetSearch(f,URL,ds){
	var q = (URL.indexOf("?")==-1)?"?":"";
	var add_and = (q=="?")?(""):("&");
	var now = new Date();
	var expirenow = "&Exp__D="+now.getTime();
	var dataset = eval(ds);
	var step_string="";
	var frm=(!f.name || f.name=="")?(f.id):(f.name);
	//If set for paging - adjust data
	if(dataset.Num_Records!=null){
	//If first run or a change in post data - start from the beginning
		if(dataset.Start_Record==null || dataset.lastData!=setQueryString(f)){dataset.Start_Record=0}
		step_string = "Start_Record="+dataset.Start_Record+"&Num_Records="+dataset.Num_Records+"&";
		
		spryUpdatePageBar(ds,frm);
	}
	dataset.lastData=setQueryString(f);
	if(f.method.toLowerCase()=="get"){
		URL=URL+q+add_and+setQueryString(f)+expirenow+"&"+step_string;
		dataset.setURL(URL);
	}else if(f.method.toLowerCase()=="post"){
		URL=URL+q+add_and+"Data=Post"+expirenow;
		dataset.setURL(URL,{postData:step_string+dataset.lastData,method:f.method.toLowerCase(),headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}});
	}
	dataset.loadData();
}

Spry.DataUtils.ServerAction=function(frm,success_function,error_function,display_message,data_set,progress){
	//If form is on the page
	if(eval("document."+frm) || eval("document.getElementById.('"+frm+"')")){
		this.frm=(eval("document."+frm))?(eval("document."+frm)):(eval("document.getElementById.('"+frm+"')"));
		//var frm=(eval("document."+frm))?("document."+frm):("document.getElementById('"+frm+"')");
		//Store the current action
		this.formaction = this.frm.action;
		this.success_function = success_function;
		this.error_function = error_function;
		this.display_message = display_message;
		this.progress = progress;
		this.data_set = (data_set)?data_set:null;
		this.frm.action="javascript:spryRequest('"+frm+"','"+this.formaction+"','"+this.success_function+"','"+this.error_function+"',"+this.display_message+","+this.data_set+",'"+this.progress+"')";
	}
}
//For use with Insert, Update and Delete Server Behaviors
function spryRequest(frm,URL,success_function,error_function,display_message,data_set,progress){
	if(progress!="" &&  document.getElementById(progress)){
		document.getElementById(progress).style.display='';
		document.getElementById(progress).style.visibility='visible';
	}
	var spry_action_response = null;
	frm=(eval("document."+frm))?(eval("document."+frm)):(eval("document.getElementById('"+frm+"')"));
	var postsring=setQueryString(frm);
	URL=(URL=="")?location.pathname:URL;
	spry_action_response = Spry.Utils.loadURL("POST",URL,true,function(){spryRequestSuccess(success_function,this,display_message,data_set,progress)},{errorCallback:function(){spryRequestError(error_function,this,progress)},postData:postsring,headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}})
}
function spryRequestSuccess(success_function,response,display_message,data_set,progress){
	//If we want to display server message
	if(progress!="" &&  document.getElementById(progress)){
		document.getElementById(progress).style.display='none';
		document.getElementById(progress).style.visibility='hidden';
	}

	if(display_message){
		alert(response.xhRequest.responseText);
	}
	//If success function is defined and is present
	if(success_function != "" && success_function in window){
		eval(success_function+"(response)");
	}
	if(data_set!=null){
		data_set.loadData();
	}
}

function spryRequestError(error_function,response,progress){
	//If error function is defined and is present
	if(progress!="" &&  document.getElementById(progress)){
		document.getElementById(progress).style.display='none';
		document.getElementById(progress).style.visibility='hidden';
	}

	if(error_function != "" && error_function in window){
		eval(error_function+"(response)");
	}
}

function spryDatasetNavigate(where, form, dataset){
	//Stop script from running if dataset doesn't exist
	if(typeof(eval(dataset)) != "undefined"){
		ds=eval(dataset);
	}else{
		alert("Spy XML Dataset "+ dataset +" doesn't exist on the page.\n Please verify your code.");
		return;
	}
	if(!ds.Num_Records){
		alert("Definition of Number of Records per request for Spy XML Dataset "+ dataset +" doesn't exist on the page.\n Please verify your code.");
		return;
	}
	if(form!=""){
		if(!document.getElementById(form) && !eval("document."+form)){
			alert("Form "+ form +" doesn't exist on the page.\n Please verify your code.");
			return;
		}
	}
	//Set total if known for moving to the last record
    if(ds.doc!=null && ds.doc.lastChild.getAttribute("total")!=0){
        var total = ds.doc.lastChild.getAttribute("total");
    }
    //Do nothing if invalid action
	//Previous is invalid if Start_Record is 0
    if(ds.Start_Record<=0 && where=="prev"){
        return;
    }
	//Last or Next is invalid if Start_Record+Num_Records equal or more than total
    if(Number(ds.Start_Record+ds.Num_Records)>=total && (where=="last" || where=="next")){
        return;
    }
	if(!isNaN(Number(where)) && Number(where+(total%ds.Num_Records))>total){
		return;
	}  
    //if Start_Record undefined reset to 0
    if(ds.Start_Record==null){ds.Start_Record=0;}
	document.getElementById(dataset+"_page_records").style.visibility="hidden";

	//Define where to go
    switch(where){
        case "next":
            var step=ds.Num_Records;
            break   
        case "prev":
            var step=-ds.Num_Records;
            break
        case "first":
            var step=ds.Start_Record*-1;
            break
        case "last":
            var step=(total%ds.Num_Records>0)?(total-(total%ds.Num_Records)):(total-ds.Num_Records);
			ds.Start_Record=0;
            break
		default:
			var step=Number(where);
			ds.Start_Record=0;
			break
    }
	ds.Start_Record=ds.Start_Record+step;
	//If stepping through a data set - not Spry Search
	if(form==""){
		//Set increment string
		var step_string="Start_Record="+ds.Start_Record+"&Num_Records="+ds.Num_Records;
		var dsURL=ds.getURL();
		ds.setURL("");
		ds.setURL(dsURL,{postData:step_string,method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}});
		ds.loadData();
		spryUpdatePageBar(dataset, '');
  	}else{
		var frm=(eval("document."+form))?(eval("document."+form)):(eval("document.getElementById('"+form+"')"));
		frm.submit();
	}
}
function spryUpdatePageBar(dataset, form){
	if(typeof(eval(dataset)) != "undefined"){
		ds=eval(dataset);
	}else{
		alert("Spy XML Dataset "+ dataset +" doesn't exist on the page.\n Please verify your code.");
		return;
	}
	//remove old observer if exists
	if(typeof(ds.navObserver) != "undefined"){
		 ds.removeObserver(ds.navObserver);
	}
	//reset nav elements
	ds.navObserver=function(notificationType, dataSet, data){
		if (notificationType == "onPreLoad"){
			if(dataSet.getRowByRowNumber(0) && document.getElementById(dataset+"_page_records")!=null){
				document.getElementById(dataset+"_page_records").style.visibility="hidden";
			}
			if(document.getElementById(dataset+"_linknav")!=null){
				document.getElementById(dataset+"_linknav").innerHTML="";
			}
			if(document.getElementById(dataset+"_pos")!=null){
				document.getElementById(dataset+"_pos").innerHTML = "0";
			}
			if(document.getElementById(dataset+"_rows")!=null){
				document.getElementById(dataset+"_rows").innerHTML = "0";
			}
			if(document.getElementById(dataset+"_total")!=null){
				document.getElementById(dataset+"_total").innerHTML = "0";
			}	
		}
       if (notificationType == "onDataChanged"){
            if(dataSet.getRowByRowNumber(0) && document.getElementById(dataset+"_page_records")!=null){
                var total = ds.doc.lastChild.getAttribute("total");
				if(Number(total)>0){
					document.getElementById(dataset+"_page_records").style.visibility="visible";
					var pos = ds.Start_Record+1;
					var rows = ds.Start_Record+ds.getRowCount();
					if(document.getElementById(dataset+"_pos")!=null){
						document.getElementById(dataset+"_pos").innerHTML = pos;
					}
					if(document.getElementById(dataset+"_rows")!=null){
						document.getElementById(dataset+"_rows").innerHTML = rows;
					}
					if(document.getElementById(dataset+"_total")!=null){
						document.getElementById(dataset+"_total").innerHTML = total;
					}
					if(document.getElementById(dataset+"_linknav")!=null){
						var numcols = Math.floor(total/ds.Num_Records);
						var startrec = 0;
						document.getElementById(dataset+"_linknav").innerHTML="";
						var link_bar=""
						for(i=0;i<numcols;i++){
							link_bar+=
							" <a href=\"javascript:spryDatasetNavigate("+startrec+",'"+form+"','"+dataset+"')\">"+(Number(startrec+1))+"-"+(ds.Num_Records+(Number(startrec)))+"</a> | ";
							startrec=startrec+ds.Num_Records;
						}
						if(total%ds.Num_Records>0){
							link_bar+=
							" <a href=\"javascript:spryDatasetNavigate("+startrec+",'"+form+"','"+dataset+"')\">"+(Number(startrec+1))+"-"+(Number(startrec)+(total%ds.Num_Records))+"</a>";
							startrec=startrec+ds.Num_Records;
						}
						document.getElementById(dataset+"_linknav").innerHTML=link_bar;
					}
				}
            }
        }
    }
    ds.addObserver(ds.navObserver);
}
function spryDatasetNavigate_inDoc(where, form, ds) {
    spryDatasetNavigate(where, form, ds);
    document.MM_returnValue = false;
}
 
