// !Utilities
pf.utils = {
	
	initializeResponse: function(r) {

		response = YAHOO.lang.JSON.parse(r);
		
		pf.screen.criteria 				= pf.utils.initializeCriteria(response.querytrail);
		pf.screen.results  				= response.matches;
		pf.screen.gtf					= pf.utils.initializeGlobalTimeframe(response.options.gtf);
		
		pf.screen.mode					= pf.utils.initializeMode(response.options.mode);
		pf.screen.active		 		= response.options.active;
		pf.screen.playoffs				= response.options.ps;
		pf.screen.sparkline				= pf.utils.initializeSparkline(response.options.sparkline, response.sparkline);
		pf.screen.resultcount			= response.pageinfo.fullsize;
		pf.screen.offset				= response.pageinfo.offset;
		pf.screen.pagesize				= response.pageinfo.pagesize;
		pf.screen.limit					= response.pageinfo.limit;
		
		pf.screen.sortkey				= pf.utils.initializeSort(response.options, "key");
		pf.screen.sortdir				= pf.utils.initializeSort(response.options, "dir");

		pf.screen.pids					= pf.utils.initializePIDs(response.querytrail);
		
		if (response.leaguedata) {
			pf.screen.league			= pf.utils.initializeFantasy(response.leaguedata);
		}
		
	},
	
	initializeSparkline: function(sparkline, params) {
	
		obj = {};
		
		// did the user request a sorted sparkline column?
		if (sparkline == true) {
		
			obj.on = true;
			
			if (typeof(params) !== "undefined") {
    			obj.min = params.min;
    			obj.max = params.max;
			}
			
			return obj;		
		} else {
			obj.on = false;
			return obj;		
		}	


	},
	
	initializeCriteria: function(criteria) {
		
		var data = [];
		
		for (x=0; x<criteria.length; x++) {
			
			c = criteria[x]; // raw criterion from webservice			
			var i = {}; // soon-to-be initiatlized criterion
			
			i.name 			= c.queryunit.s_term;
			
			i.hidden		= c.queryunit.hidden;
			i.shidden		= c.queryunit.shidden; // what does this do again?
			i.reduce		= c.queryunit.reduce;
			i.universe		= c.queryunit.universe;
			i.sparkline		= c.queryunit.sparkline;
			i.matches		= c.matchcount;
			i.results		= c.remaining;

			i.dist			= c.dist; // screen results histogram
			i.distu			= c.distx; // screen universe histogram
			
			i.sort			= c.queryunit.sort;
			
			// initialize local time frame
			if (c.queryunit.ltf) {
						
				i.tf = {};

				// this week
				if (c.queryunit.tw == true) {
					i.tf.type = "tw";
			
				// seasons
				} else if (typeof(c.queryunit.seasons) != "undefined") {
	
					// last n seasons
					if (c.queryunit.lastn) {
						i.tf.type = "lseasons";
						i.tf.season_count = c.queryunit.seasons.length;
					// season
					} else if (c.queryunit.seasons.length == 1) {
						i.tf.type = "season";
						i.tf.season = c.queryunit.seasons[0];
					// season range
					} else if (c.queryunit.seasons.length > 1) {
						i.tf.type = "seasons";
						i.tf.seasons = [c.queryunit.seasons[0], c.queryunit.seasons[c.queryunit.seasons.length-1]];
					}
					
				// weeks
				} else if (typeof(c.queryunit.weeks) != "undefined") {
				
					// last n weeks
					if (c.queryunit.lastn) {
						i.tf.type = "lweeks";
						i.tf.week_count = c.queryunit.weeks.length;
					// week
					} else if (c.queryunit.weeks.length == 1) {
						i.tf.type = "week";
						i.tf.week = c.queryunit.weeks[0];
					// week range
					} else if (c.queryunit.weeks) {
						i.tf.type = "weeks";
						i.tf.weeks = [c.queryunit.weeks[0], c.queryunit.weeks[c.queryunit.weeks.length-1]];
					}
					
				// career
				} else if (typeof(c.queryunit.career) != "undefined") { i.tf.type = "career"; }
				
			}

			// go through data point master list to assign additional meta data
			for (var y=0; y<pf.datamaster.length; y++) {
				if (i.name == pf.datamaster[y].term) {
					// short name
					i.shortname = pf.datamaster[y].shortName;
					// term name
					i.termname = pf.datamaster[y].termName;
					// numeric or categorical
					i.type = pf.datamaster[y].type;
					// default sort
					if (pf.datamaster[y].defaultsort == "asc") {
						i.defaultsort = YAHOO.widget.DataTable.CLASS_ASC;
					} else {
						i.defaultsort = YAHOO.widget.DataTable.CLASS_DESC;
					}
					// default formatter
					if (i.sparkline == true) {
						i.formatter = "sparkline_default";
					} else if (pf.datamaster[y].formatter) {
						i.formatter = pf.datamaster[y].formatter;
					} else {
						// defaults if no formatter is set
						if (i.type == 0) {
							i.formatter = "numbers_default";
						} else if (i.type == 1) {
							i.formatter = "qualitative_default";
						}
					}
					// weekly data point
					if (pf.datamaster[y].weekly == true) {
						i.weekly = true;
					}
					
				}
			}
			
			
			
			// numeric
			if (i.type == 0) {
				
				// aggregate values
				i.min 		= c.min;
				i.max		= c.max;
				i.median	= c.median;
				i.total		= c.total;
				
				i.aggop		= c.queryunit.aggop; 			// avg, sum, stdg
				i.val 		= c.queryunit.s_value;			// min/max values when filtering criteria
				i.val2		= c.queryunit.s_value2;

				// operator (>=, <=, between, etc.)
				if (c.queryunit.s_operator == ">=" && c.queryunit.s_operator2 == "<=") {
					i.op = "bw";
				} else if (c.queryunit.s_operator == ">=") {
					i.op = "ge";
				} else if (c.queryunit.s_operator == "<=") {
					i.op = "le";
				} else if (c.queryunit.s_operator == "=") {
					i.op = "equals"
				}
			
			// categorical
			} else if (i.type == 1) {
				// convert to an array if there is only one value
				if (Y.isArray(c.queryunit.s_value)) {
					i.items		= c.queryunit.s_value;
				} else {					
					i.item 		= c.queryunit.s_value;
				}
			}
		
			// special case for pids
			if (typeof(c.queryunit.pids) != "undefined") {
				i.name = "pids";
				i.items = c.queryunit.pids; 
				i.type = 1;
				i.reduce = false;
				i.tf = false;
				i.shidden = true;
			}	
		
			data[data.length] = i;
		
		}
		
		return data;
	
	},
	
	// takes response.options.gtf from the webservice and generates metadata about the gtf
	initializeGlobalTimeframe: function(str) {
	
		var gtf = {};
		
		
		if (typeof(str) != "undefined") {
		
			// career
			if (str == "career") {
				gtf.type = "career";
			// seasons
			} else if (str.split("seasons==")[1]) {
		 		// season
				if (str.split("seasons==")[1].length == "4") {
					gtf.type = "season";
					gtf.season =  str.split("seasons==")[1];
					gtf.string = str;
				// season range
				} else if (str.split("seasons==")[1].length == "9") {
					gtf.type = "seasons";
					gtf.seasons = [str.split("seasons==")[1].split("_")[0], str.split("seasons==")[1].split("_")[1]];
					gtf.string = str;
				}
			// weeks	
			} else if (str.split("weeks==")[1]) {
				// week
				if (str.split("weeks==")[1].length == "6") {
					gtf.type = "week";
					gtf.season = str.split("weeks==")[1].substring(0,4);
					gtf.week = str.split("weeks==")[1].substring(4,6);
				// week range
				} else if (str.split("weeks==")[1].length == "13") {
					gtf.type = "weeks";
					gtf.seasons = [str.split("weeks==")[1].split("_")[0].substring(0,4)+"", str.split("weeks==")[1].split("_")[1].substring(0,4)+""];
					gtf.weeks = [str.split("weeks==")[1].split("_")[0].substring(4,6)+"", str.split("weeks==")[1].split("_")[1].substring(4,6)+""];
				}
			}
		
		}
				
		gtf.string = str;
		return gtf;
	},
	
	initializeSort: function (criteria, type) {
		
		lastSortKey = "";
		lastSortDir = "";

		if (typeof(criteria.msort) != "undefined") {
			lastSortKey = "n";
			lastSortDir = criteria.msort;
		} else if (typeof(criteria.tsort) != "undefined") {
			pf.screen.mode.type == "s" ? lastSortKey = "y" : "";
			pf.screen.mode.type == "w" ? lastSortKey = "w" : "";
			lastSortDir = criteria.tsort;
		} else {
			// otherwise search through screen criteria to see what is sorted
			for (var i=0; i < pf.screen.criteria.length; i++) {
				c = pf.screen.criteria[i]
				if (c.sort) {
					lastSortKey = i + '';
					lastSortDir = c.sort;
				}
			}
		}
		
		if (type == "key") {
			return lastSortKey;
		} else if (type == "dir") {
			return lastSortDir;
		}

	},
	
	initializeMode: function(mode) {
		
		// define mode names
		if (mode == "t") {
			mode_name = "Players";
		} else if (mode == "s") { 
			mode_name = "Seasons";
		} else if (mode == "w") {
			mode_name = "Games";
		}
		
		// return mode and name
		return {"type":mode, "name":mode_name};
	
	},
	
	initializeFantasy: function (data) {
	
		var fantasy = {};
		
		fantasy.league_name = data.leaguename;
		fantasy.last_updated = data.lastupdate;
		
		return fantasy;
	
	},
	
	initializePIDs: function(criteria) {
	
		for (var i=0; i<criteria.length; i++) {
			if (typeof(criteria[i].queryunit.pids) != "undefined") {
				return true;
			}
		}
	
	},
	
	sanitizeFilters: function (screen) {

		var rerun = false;
		
		// check to see that filters are 'sane'
		// if not, reset them and re-run screen
		for (var i=0; i<pf.screen.criteria.length; i++) {
			
			var crobj = pf.screen.criteria[i];
			
			if (crobj.op == "ge" && crobj.val > crobj.max) {
				// cr[i].queryunit.s_value = crobj.minCount;
				delete pf.newscreen.criteria[i].op;
				delete pf.newscreen.criteria[i].val;
				delete pf.newscreen.criteria[i].val2;
				delete pf.newscreen.criteria[i].op2;
				rerun = true;
			} else if (crobj.op == "le" && crobj.val > crobj.max) {
				pf.newscreen.criteria[i].val = crobj.max;
				rerun = true;
			} else if (crobj.op == "bw") {
				if (crobj.val < crobj.min || crobj.val2 > crobj.max && pf.screen.resultcount > 0) {
					delete pf.newscreen.criteria[i].op;
					delete pf.newscreen.criteria[i].val;
					delete pf.newscreen.criteria[i].val2;
					delete pf.newscreen.criteria[i].op2;
					rerun = true;
				}		
			}
		}
			
		if (rerun == true) {
			pf.js.getData(pf.newscreen);
		}
	
	},
	
	// returns datapoint meta data for datapoint of given name
	getDatapoint: function(name) {
	   
	   for (var i=0; i<pf.datamaster.length; i++) {
	       d = pf.datamaster[i];
	       if (d.term == name) {
    	       return d;       
	       }	       
	   }
	   
	}

};

