
pf.qs = "/ws/nfl/players?query=g,r;pyds;ptd;ryds;rtd;recyds;rectd;tottd;fpts,desc;fpts,avpg;fpts,stdg&a=f;&gtf=2009&debug=true"; // querystring

firsttime = true;

pf.js = {

	getData: function(screen, extra_qs) {
		
		// show loading indicator		
		pf.ui.loading_indicator.loading.show();
		
		if (screen) {
			qs = pf.js.buildQs(screen, extra_qs);
			pf.qs = qs;
		} else {
			qs = pf.qs;
		}
		
		// make the request accessible everywhere so i can abort the ajax call when necessary
		pf.request = {};
		pf.request = Y.ajax('GET', qs, { 
	
			success: function (o) {
				pf.js.initialize_page(o.responseText);
			}, 
			
			failure: function (o) { // alert("failure")
			}
		});
	},
	
	initialize_page: function(data) {
	
		
		pf.utils.initializeResponse(data);
		pf.newscreen = pf.screen;
		
		pf.lib.cookie.create("gtf_forward", YAHOO.lang.JSON.stringify(pf.screen.gtf.string));
		pf.utils.sanitizeFilters(pf.screen);
		
		// update webservice link
		pf.ui.ws_link.init();
		
		// render datatable
		pf.ui.datatable.render();
		
		pf.ui.sparklines.init();
		
		// render html database
		// pf.ui.html_datatable.render();
		
		// pf.ui.datatable.magic_headers.init();
		// floating_header();
		
		// render timeframe dropdowns
		if (Y.get("timeframe-options")) {
			pf.ui.tf.render();
		}
		
		// render timeframe shortcuts
		if (Y.get("timeframe-shortcuts")) {
			pf.ui.tfshortcuts.init();
		}
		
		// render filters
		if (Y.get("criteriawrapper")) {
			pf.ui.filters.render();
			pf.ui.active.init();
		}
		
		// render list/seasons/games mode
		if (Y.get("mode-frame")) {
			pf.ui.mode.render();
		}
		
		// render export to csv link
		pf.ui.export_data.init();
		
		if ($(".new-sub").length > 0) {
			pf.ui.toggler.init();
		}
		
		if (firsttime) {
		
			firsttime = false;
			
			if (Y.get("submenuoptions")) {
				pf.ui.links.init();
				if (Y.getElementsByClassName("submenu-dropdown", null, "submenuoptions").length > 0) {
					pf.ui.page_dropdowns.init();
				}
			}
			
			// pf.ui.menu.init();
			pf.ui.columns.init();
			
			// college dropdown
			if ($("#submenu-col")) {
			 	pf.ui.college_dropdown.init();
			}
			
		}		

		// only needs to be done once
		Y.purgeElement("filtertoggle");
		Y.addListener("filtertoggle", "click", pf.ui.toggler.events);
		
		if ($("#embed-frame").length) {
			pf.ui.embed.init();
		}
		
		// update the link hash
		if (Y.get("submenuoptions") && !$('#embed-frame').is(':visible')) {
			// get the link hash for the selected related link
			if (typeof(pf.links) !== "undefined") {
				for (var i=0; i<pf.links.length; i++) {
				 	if (pf.links[i].linkid == pf.ui.links.getSelected()) {
				 		var linkhash = pf.links[i].url;
				 	}
				}
			}
						 
			if (typeof(linkhash) === "undefined") {
				linkhash = "";
			}
			
			hash = "";
			
			// if this is a page with child_screens, add the child screen and rel link to the hash 
			if (Y.getElementsByClassName("submenu-selector").length > 0) {
				hash = linkhash + "/" + qs.split(pf.qs_base + pf.qs_split)[1];
				// window.location.hash = pf.ui.page_links.getSelected() + "-" + linkhash + "/" + qs.split(pf.qs_base + pf.qs_split)[1];
			// no child_screens, just add the selected link to the hash tag
			} else {
				hash = linkhash + "/" + qs.split(pf.qs_base + pf.qs_split)[1];
			}
			
			window.location.hash = hash;
			
			fwdurl = "";			
			fwdurl = "?next=" + window.location.pathname + "&qs=" + encodeURIComponent(hash);
			loginurl = "";
			logouturl = "";
			loginurl = "accounts/login/" + fwdurl;
			logouturl = "accounts/logout/" + fwdurl;
			
			$("#log-in-link").attr("href", loginurl);
			$("#log-out-link").attr("href", logouturl);

		}
		
		// show loading indicator		
		pf.ui.loading_indicator.loading.hide();
		
	},
	
	buildQs: function(screen, querystring) {
		
		if (screen) {
			s = screen;
		} else {
			s = pf.newscreen;
		}
		
		
		// if a querystring is passed into the function, use that instead of building it from pf.screen  
		if (querystring) {
			qs = querystring;
		} else {

			var qs = pf.qs_base;
						
			for (i=0; i<s.criteria.length; i++) {
			
				var c = s.criteria[i];
	
				qs += c.name;
				
				// numeric criteria
				if (c.type==0) {
			
					// operators (>, <. between, equals)
					if (c.op) {
						if (c.op == "ge") {
							qs += "=ge=" + c.val;
						} else if (c.op == "le") {
							qs += "=le=" + c.val;
						} else if (c.op == "bw") {
							qs += "=ge=" + c.val + "~" + c.name + "=le=" + c.val2;
						} else if (c.op == "equals") {
							qs += "==" + c.val;
						}
					}
				// categorical criteria
				} else if (c.type==1) {
					
					if (c.item) {
						qs += "==" + c.item;
					} else if (c.items) {
						qs += "==";
						// normal case
						for (k=0; k<c.items.length; k++) {
							qs += c.items[k];
							if (k != (c.items.length-1)) {
								qs += "~";
							}
						}

					}
				}
			
				// local timeframe
				// might have to pad week values
				if (c.tf) {
					qs += ",";

					if (c.tf.type == "season") {
						qs += c.tf.season;
					} else if (c.tf.type == "seasons") {
						qs += c.tf.seasons[0] + "_" + c.tf.seasons[1];
					} else if (c.tf.type == "week") {
						qs += c.tf.week;
					} else if (c.tf.type == "weeks") {
						qs += c.tf.weeks[0] + "_" + c.tf.weeks[1];
					} else if (c.tf.type == "career") {
						qs += "career";
					} else if (c.tf.type == "tw") {
						qs += "tw";
					} else if (c.tf.type == "lweeks") { 
						qs += "lweeks==" + c.tf.week_count;
					} else if (c.tf.type == "lseasons") {
						qs += "lseasons==" + c.tf.season_count;
					}
					
				}
						
				if (c.aggop && c.aggop != "sum" && c.aggop != "avg") {
					qs += "," + c.aggop;
				}

				// sort order
				if (i==s.sortkey) {
		            if (s.sortdir) {	            
			            qs += "," + s.sortdir;
		        	} else {
		        		qs += ",desc";
		        	}
		        }
		
				if (c.hidden == true) {
					qs += ",h";
				}
				
				if (c.universe == true) {
					qs += ",u";
				}
				
				if (c.reduce == true) {
					qs += ",r";
				}
				
				if (c.sparkline == true) {
					qs += ",s";
				}
		
				if (i != s.criteria.length-1) {
					qs += ";";
				}
	
			}
		}
		
		if (s.sortkey == "n") {
			qs += "&msort=" + s.sortdir;
		} else if (s.sortkey == "w" || s.sortkey == "y") {
			qs += "&tsort=" + s.sortdir;	
		}
		
		// active players only
		if (s.active || pf.page == "fantasy") {
			qs += "&a=t"
		}
		
		if (s.playoffs) {
			qs += "&ps=" + s.playoffs;
		}
		
		if (s.mode && s.mode.type && s.mode.type != "t") {
			qs += "&m=" + s.mode.type;
		}

		if (s.sparkline.on == true) {
			qs += "&s=t";
		}

		// gtf not allowed with pids
		if (typeof(s.pids) === "undefined") {

			// global time frame &gtf=
			if (s.gtf) {
			
				qs += "&gtf=";
			
				if (s.gtf.type == "season") {
					qs += s.gtf.season;
				} else if (s.gtf.type == "seasons") {
					qs += s.gtf.seasons[0] + "_" + s.gtf.seasons[1];
				} else if (s.gtf.type == "week") {
					// edge case
					if (s.gtf.week.length == 6) {
						qs += s.gtf.week + "";
					} else {
						qs += s.gtf.season + s.gtf.week + "";		
					}
				} else if (s.gtf.type == "weeks") {
					// edge case
					if (s.gtf.weeks[0].length == 6) {
						qs += s.gtf.weeks[0] + "_" + s.gtf.weeks[1];
					} else {
						qs += s.gtf.seasons[0] + "" + s.gtf.weeks[0] + "_" + s.gtf.seasons[1] + "" + s.gtf.weeks[1];
					}
				} else if (s.gtf.type=="career") {
					qs += "career";
				}
				
			} else {
				qs += "career";
			}

		}
		
		if (s.offset) {
			qs += "&offset="+s.offset;
		}
		
		if (s.limit) {
			qs += "&limit="+s.limit;
		}
		
		if (typeof(pf.debug) !== "undefined" && pf.debug == true) {
    		qs += "&debug=true";
		}
		
		return qs;
		
	},
	// update criteria object with users changes once timer expires
	updateCr: function(updateObj) {

		n = updateObj.index;
		comp = updateObj["comp"];
		minRef = updateObj.value1;
		maxRef = updateObj.value2;
		delay = updateObj["delay"];
	
		if (!typeof(timeoutId) === "undefined")
			clearTimeout(timeoutId);
		
		if (delay) {
			timeoutId = setTimeout(go, delay);
		} else {
	
			qu = pf.screen.criteria[n];
			c = pf.newscreen.criteria[n];
			
			if (comp == "display") {
				delete c.val;
				delete c.op;
				delete c.val2;
				delete c.op2;
				// delete c.comp;
			}
			else if (qu.type == 0) {
				// switching to bw
				if (comp == "bw") {
					c.op = "bw";
					c.val = minRef;
					c.val2 = maxRef;
					delete c.op2;
					// c.op2 = "<=";
					// switching from ge or equals to bw
					/* if (qu.comp == "ge" || qu.comp == "equals") {
						c.val = minRef;
						// c.val2 = qu.max;
						c.val2 = maxRef;
					// switching from le to bw
					} else if (qu.comp == "le") {
						
						c.val = minRef;
						c.val2 = maxRef;
					// no switch, update bw
					} else if (qu.comp == "bw") {
						c.val = minRef;
						c.val2 = maxRef;
					// switching from display to bw
					} else {
						c.val = minRef;
						c.val2 = maxRef;
					} */
					// c.op = comp;
				// switching to ge, le, equals
				} else if (comp == "ge" || comp == "le" || comp == "equals") {
					delete c.val2;
					delete c.op2;
					c.op = comp;
					c.val = minRef;
					// cr[n]["comp"] = comp;
				}
			} else if (qu.type == 1) {
				c.val = minRef;
				delete c.op;
				delete c.val2;
				delete c.op2;
				delete c.comp;
			}
		
		pf.newscreen.criteria[n] = c;
		pf.js.getData(pf.newscreen);
		
		}
		
	},

        playerpage: function() {
                var query = "/ws/nfl/players/"+pf.pid+"?tf=year";
                pf.gtf = "year";
                pf.gyrmin = 0;
                pf.gyrmax = 0;
                var request = YAHOO.util.Connect.asyncRequest('GET', query, { success: function (o) { pf.js.handlePlayerData(o); }, failure: function (o) { alert("error");} });
                var query = "/ws/nfl/players/"+pf.pid;
                var request = YAHOO.util.Connect.asyncRequest('GET', query, { success: function (o) { pf.js.handlePlayerDetails(o); }, failure: function (o) { alert("error");} });
        },

        handlePlayerDetails: function(o) {
                var gpdata = YAHOO.lang.JSON.parse(o.responseText);
                var pstr = "<b>Position:</b> "+gpdata.pos+"<br>";
                if(gpdata.ht && gpdata.wt) {
                        pstr += "<b>Height:</b> "+pf.js.fHt(gpdata.ht)+" &nbsp;&nbsp;&nbsp;";
                        pstr += "<b>Weight:</b> "+gpdata.wt+"<br>";
                }
                if(gpdata.col) {
                        pstr += "<b>College:</b> "+gpdata.col+"<br>";
                }
                if(gpdata.dyr) {
                        pstr += "<b>Draft:</b> "+gpdata.dyr+" Round "+gpdata.drnd+" Pick "+gpdata.dpck+" ("+gpdata.dtm+")<br>";
                } else {
                        pstr += "<b>Draft:</b> undrafted";
                }
                var pdatadiv = document.getElementById('pdata');
                pdatadiv.innerHTML=pstr;
        },

        handlePlayerData: function(o) {

                var result = YAHOO.lang.JSON.parse(o.responseText);

                for(var i=0;i<result.length;i++) {
                        dgname = "datagrid"+i;
                        var schema = result[i].schema;
                        var myColumnDefs = [];
                        var schemaRef = [];
                        for(var j=0;j<schema.length;j++) {

                                var column = schema[j];
                                var label = pf.js.labelFetcher(column);
                                var jstr = ""+j;
                                
                                if(column == "year" || column == "week") {
                                        myColumnDefs[myColumnDefs.length] = {
                                            key: jstr, 
                                            label: label, 
                                            formatter: pf.ui.datatable.init.formatters.none,
                                            sortable:false,
                                            className:"colYear",
                                        };
                                } else {

                                        // get metadata for this datapoint
                                        datapoint = pf.utils.getDatapoint(column);
                                        
                                        var formatter = {};

                                        if (typeof(datapoint.formatter) !== "undefined") {
                                            formatter = pf.ui.datatable.init.formatters[datapoint.formatter];
                                        } else if (datapoint.type == 1) {
                                            formatter = pf.ui.datatable.init.formatters.qualitative_default;
                                        } else {
                                            formatter = pf.ui.datatable.init.formatters.numbers_default;
                                        }
                                
                                        myColumnDefs[myColumnDefs.length] = {
                                            key: jstr, 
                                            label: label, 
                                            formatter: formatter, 
                                            sortable:false,
                                            className:"checkit",
                                        };
                                }

                                schemaRef[schemaRef.length] = jstr;
                        }


                        if(pf.gyrmin == 0) {
                                var resarr = result[i].results;
                                if(resarr.length > 1) {
                                        var resarrmin = resarr[0];
                                        var resarrmax = resarr[resarr.length-2];
                                        pf.gyrmin = resarrmin['0'];
                                        pf.gyrmax = resarrmax['0'];
                                }
                        }

                        var dgref = Y.get(dgname);
                        var myDataSource = new YAHOO.util.LocalDataSource(result[i].results);
                        var myDataTable = new YAHOO.widget.DataTable(dgref, myColumnDefs, myDataSource);
                        var dgtitle = document.getElementById("dgtitle"+i);
                        dgtitle.innerHTML = result[i].name;
                }
                pf.js.printPlayerTF();
        },
        labelFetcher: function(term) {
                if(term == 'year') {
                        return "Year";
                } else if(term == 'week') {
                        return "Week";
                } else {
                        for (i=0; i<pf.datamaster.length; i++) {
                                if (pf.datamaster[i].term == term) {
                                        var sn = pf.datamaster[i].shortName;
                                        if(sn == undefined) {
                                                return pf.datamaster[i].termName;
                                        } else {
                                                return pf.datamaster[i].shortName;
                                        }
                                }
                        }
                }
        },

        fHt: function(inht) {
                var ft = inht/12;
                var ftint = parseInt(ft);
                var inch = parseInt((ft-ftint)*12);
                return ""+ftint+"'"+inch+'"';
        },
        printPlayerTF: function() {
                var cb = "pf.js.ppchange();";
                if(pf.gtf == "year") {
                        var linkstr = "Show: &nbsp;<b>Career</b> | <a href='#' onClick='"+cb+";return false;'>Season:</a> <select id='yrsel' onChange='"+cb+"'>";
                } else {
                        var linkstr = "Show: &nbsp;<a href='#' onClick='pf.js.ppcareer();return false;'>Career</a> | <b>Season:</b> <select id='yrsel' onChange='"+cb+"'>";
                }
                var max = pf.THIS_YEAR;
                var min = 1970;
                if(pf.gyrmin > min) {
                        min = pf.gyrmin;
                }
                if(pf.gyrmax < max) {
                        max = pf.gyrmax;
                }
                for(var yr=max;yr>=min;yr--) {
                        linkstr += "<option value="+yr;
                        if (yr == pf.gtf) {
                                linkstr += " selected";
                        }
                        linkstr += ">"+yr;
                }
                linkstr += "</select>";
                var tfdiv = Y.get("ppgtf");
                tfdiv.innerHTML = linkstr;
        },

        ppchange: function() {
                var yrhandle = document.getElementById('yrsel');
                pf.gtf = yrhandle.value;
                pf.js.ppchangehelper();
        },

        ppchangehelper: function() {
                pf.js.printPlayerTF();
                var query = "/ws/nfl/players/"+pf.pid+"?tf="+pf.gtf;
                var request = YAHOO.util.Connect.asyncRequest('GET', query, { success: function (o) { pf.js.handlePlayerData(o); }, failure: function (o) { alert("error");} });
        },

        ppcareer: function() {
                pf.gtf = "year";
                pf.js.ppchangehelper();
        }

}
	

pf.ui = {
	
	// expand/collapse image urls
	plus_url: "/assets/images/plus.jpg",
	minus_url: "/assets/images/minus.jpg",
	
	// !Timeframe dropdowns
	tf: {
		render: function() {

			function generateSrc(type) {

				var src = "";
				
				if (type == "from") {
					var typeIndex = 0;
				} else if (type == "to") {
					var typeIndex = 1;
				}
				
				src += '<select id="timeframe-'+type+'yr" class="timeframe-selector">';
				for (var i=pf.THIS_YEAR; i>=1936; i--) {
					if ((pf.screen.gtf.seasons && i == pf.screen.gtf.seasons[typeIndex]) || (pf.screen.gtf.season && i==pf.screen.gtf.season) || (pf.screen.gtf.type=="career" && ((typeIndex==0 && i==1936) || (typeIndex==1 && i==pf.THIS_YEAR))))
						src += '<option value="'+i+'" selected>'+i+'</option>';
					else
						src += '<option value="'+i+'">'+i+'</option>';
				}
				src += '</select>';
				
				src += '<select id="timeframe-'+type+'wk" class="timeframe-selector">';
				
				if (pf.screen.playoffs == "p") {
					src += '<option value="playoffs" selected>Playoffs</option>';
				} else if (pf.screen.playoffs == "b") {
					src += '<option value="both" selected>All Games</option>';
				} else {
					src += '<option value="all" selected>Season</option>';
				}
				
				if (pf.screen.playoffs == "b" || !pf.screen.playoffs) {
					for (var i=1; i<=17; i++) {
						if ((pf.screen.gtf.weeks && i == pf.screen.gtf.weeks[typeIndex]) || (pf.screen.gtf.week && i==pf.screen.gtf.week)) {
							src+= '<option selected value="'+Y.pad(i)+'">W'+i+'</option>';
						} else {
							src+= '<option value="'+Y.pad(i)+'">W'+i+'</option>';
						}
					}
				}
				
						
				if (pf.screen.playoffs == "p" || pf.screen.playoffs == "b") {
				
					if (pf.screen.gtf.weeks && pf.screen.gtf.weeks[typeIndex] == "18")
						src += '<option value="18" selected>Wildcard</option>';
					else
						src += '<option value="18">Wildcard</option>';
					
					if (pf.screen.gtf.weeks && pf.screen.gtf.weeks[typeIndex] == "19")
						src += '<option value="19" selected>Divisional</option>';
					else
						src += '<option value="19">Divisional</option>';
				
					if (pf.screen.gtf.weeks && pf.screen.gtf.weeks[typeIndex] == "20")
						src += '<option value="20" selected>Conference</option>';
					else
						src += '<option value="20">Conference</option>';
				
					if (pf.screen.gtf.weeks && pf.screen.gtf.weeks[typeIndex] == "21")
						src += '<option value="21" selected>Superbowl</option>';
					else
						src += '<option value="21">Superbowl</option>';
				
				}						
				
				src += '</select>';
				
				return src;
				
			}
			

			
			var src = "";
			
			src += '<span class="range-selector-frame"> Custom timeframe: </span>';
			src += generateSrc("from");
			src += '<span id="timeframe-to-frame">';
			src += '<span class="tf-separator">-</span>';
			src += generateSrc("to");			
			src += '</span>';
			
			if (pf.screen.gtf.type == "season" || pf.screen.gtf.type == "week") {
				src += ' <label><input type="checkbox" id="range-checkbox"><span class="range-option"> Range</span></label>';
				// src += '<a href="#" id="range-selector-single" class="range-selector selected">Single</a> | <a href="#" id="range-selector-range" class="range-selector">Range</a>';
			} else {
				src += ' <label><input type="checkbox" id="range-checkbox" checked="true"><span class="range-option"> Range</span></label>';
				// src += '<a href="#" id="range-selector-single" class="range-selector">Single</a> | <a href="#" id="range-selector-range" class="range-selector selected">Range</a>';
			}
			
			var div = Y.get("timeframe-options");
			div.innerHTML = src;
			
			if (pf.screen.gtf.type == "season" || pf.screen.gtf.type == "week") {
				pf.ui.tf.setDropdown("towk", pf.ui.tf.getDropdown("fromwk"));
				pf.ui.tf.setDropdown("toyr", pf.ui.tf.getDropdown("fromyr"));
				Y.get("timeframe-to-frame").style.display = "none";
			}
			
			// need to set event listeners on the timeframe dropdowns explicitly 
			// because the change event doesn't bubble up in internet explorer
			// also need to re-declare each time in ie otherwise listener is wiped out
			// each time the dropdowns are created

			Y.addListener("timeframe-fromyr", "change", pf.ui.tf.events);	
			Y.addListener("timeframe-fromwk", "change", pf.ui.tf.events);	
			Y.addListener("timeframe-toyr", "change", pf.ui.tf.events);	
			Y.addListener("timeframe-towk", "change", pf.ui.tf.events);
			Y.addListener("range-checkbox", "click", pf.ui.tf.events);

		},
		
		setDropdown: function(type, valueArg) {
 
			var id = "timeframe-"+type;
			var div = Y.get(id);
			div.value = valueArg;
		},
		getDropdown: function (type) {
			var div = Y.get("timeframe-" + type);
			if (div) {
				var index = div.selectedIndex;
				var returnvalue = div.options[index].value;
				return returnvalue;
			} else {
				return null;
			}
		},
		events: function (e) {

			dd = pf.ui.tf.getDropdown;

			var div = YAHOO.util.Event.getTarget(e);
		 
			if (Y.hasClass(div, "timeframe-selector") && e.type=="change") {

				YAHOO.util.Event.preventDefault(e);
			
				// get the time frames
				var tftypes = ["fromyr", "fromwk", "toyr", "towk"];
				var tfobj = {};
				
				for (var i=0; i<tftypes.length; i++) {
					tfobj[tftypes[i]] = pf.ui.tf.getDropdown(tftypes[i]);
				}
				
				var checkboxdiv = Y.get("range-checkbox");
				
				// pf.newscreen.gtf.type = "season";
				// pf.newscreen.gtf.season = pf.ui.tf.getDropdown("fromyr");
				
				// silly edge cases for strange time frame dropdown selections
				if (checkboxdiv.checked == true) {
					
					if (div.options[div.selectedIndex].value == "all") {
						pf.ui.tf.setDropdown("fromwk", "all");
						pf.ui.tf.setDropdown("towk", "all");

					} else if (div.options[div.selectedIndex].value == "both") {
						pf.ui.tf.setDropdown("fromwk", "both");
						pf.ui.tf.setDropdown("towk", "both");
					} else if (div.options[div.selectedIndex].value == "playoffs") {
						pf.ui.tf.setDropdown("fromwk", "playoffs");
						pf.ui.tf.setDropdown("towk", "playoffs");
					} else if (parseInt(tfobj.towk) >= 1 && (tfobj.fromwk == "playoffs" || tfobj.fromwk == "all" || tfobj.fromwk == "both")) {
					
					//	if (regtf.ps == false || regtf.ps == "b") {
					//		pf.ui.tf.setDropdown("fromwk", "01");
					//	}
					//	else if (regtf.ps == "p")
					//		pf.ui.tf.setDropdown("fromwk", 18);
						
						pf.ui.tf.setDropdown("fromwk", tfobj.towk);
					
					} else if (parseInt(tfobj.fromwk) >= 1 && (tfobj.towk == "playoffs" || tfobj.towk == "all" || tfobj.towk == "both")) {
						
					// 	if (regtf.ps == false)
					//		"TimeframeOption("towk", 17);
					//	if (regtf.ps == "b" || regtf.ps == "p")
					//		pf.ui.tf.setDropdown("towk", 21);
							
						pf.ui.tf.setDropdown("towk", tfobj.fromwk);
						
					}
					
					// clearItems("timeframe-shortcut-selector");
				
				} else {

					pf.ui.tf.setDropdown("towk", pf.ui.tf.getDropdown("fromwk"));
					pf.ui.tf.setDropdown("toyr", pf.ui.tf.getDropdown("fromyr")); 

				}
		
				/* if (pf.ui.tf.getDropdown("fromwk") > 0 && pf.ui.tf.getDropdown("fromwk") < 22) {
					pf.newscreen.gtf.type = "week";
					pf.newscreen.gtf.week = pf.ui.tf.getDropdown("fromyr") + pf.ui.tf.getDropdown("fromwk");
				} else {
					pf.newscreen.gtf.type = "season";
					pf.newscreen.gtf.season = pf.ui.tf.getDropdown("fromyr");
				} */
				
				// season(s)
				
				// seasons
				
				dd = pf.ui.tf.getDropdown;
				
				if (dd("fromwk") > 0 && dd("fromwk") < 22) {
					
					// week
					if (dd("fromwk") == dd("towk") || checkboxdiv.checked == false) {
						pf.newscreen.gtf = {};
						pf.newscreen.gtf.type = "week";
						pf.newscreen.gtf.week = dd("fromyr")+""+dd("fromwk");
					// weeks
					} else {
						pf.newscreen.gtf = {};
						pf.newscreen.gtf.type = "weeks";
						pf.newscreen.gtf.weeks = [dd("fromyr")+""+dd("fromwk"), dd("toyr")+""+dd("towk")]
					}
				}
				else if (dd("fromwk") == "all" && dd("towk") == "all") {
					
					// season
					if (dd("fromyr") == dd("toyr") || checkboxdiv.checked == false) {
						pf.newscreen.gtf = {};
						pf.newscreen.gtf.type = "season";
						pf.newscreen.gtf.season = dd("fromyr");
					// seasons
					} else {
						pf.newscreen.gtf = {};
						pf.newscreen.gtf.type = "seasons";
						pf.newscreen.gtf.seasons = [dd("fromyr"), dd("toyr")];
					}
				
				} 

			// clearItems("timeframe-shortcut-selector");
	
				pf.activity.add({
					event: "Updated a time frame dropdown",
					updatedDropdown: div.id,
					updatedValue: div.options[div.selectedIndex].value,
					timeframe: pf.ui.tf.getDropdown("fromyr") + pf.ui.tf.getDropdown("fromwk") + "_" + pf.ui.tf.getDropdown("toyr") + pf.ui.tf.getDropdown("towk") + ""
					// stats: regtf.ps					
					});
					
				// buildQs();
				pf.js.getData(pf.newscreen);
				
			} else if (div.id == "range-checkbox" && e.type=="click") {
				
				// YAHOO.util.Event.preventDefault(e);
				// clearItems("range-selector");
				// clearItems("timeframe-shortcut-selector");
				// YAHOO.util.Dom.addClass(div, "selected");
				// YAHOO.util.Event.preventDefault(e);

					
				// if single was selected
				if (div.checked != true) {
					
					// hide second set of timeframe dropdowns
					Y.get("timeframe-to-frame").style.display = "none";
					// reset second set of timeframe dropdowns to match first set
					pf.ui.tf.setDropdown("towk", pf.ui.tf.getDropdown("fromwk"));
					pf.ui.tf.setDropdown("toyr", pf.ui.tf.getDropdown("fromyr"));
	
					if (dd("fromwk") > 0 && dd("fromwk") < 22) {
						pf.newscreen.gtf = {};
						pf.newscreen.gtf.type = "week";
						pf.newscreen.gtf.season = dd("fromyr");
						pf.newscreen.gtf.week = dd("fromwk");						
					} else {
						pf.newscreen.gtf = {};
						pf.newscreen.gtf.type = "season";
						pf.newscreen.gtf.season = dd("fromyr");	
					}
	
					pf.activity.add({
						event:"Selected single / range selector",
						type: "Single"
						//stats: regtf.ps
					});
					pf.js.getData(pf.newscreen);
	
				// if range was selected
				} else {
					Y.get("timeframe-to-frame").style.display = "inline-block";
					pf.activity.add({
						event:"Selected single / range selector",
						type: "Range"
						//stats: regtf.ps
					});
				}
					
			}
		}
	},
	
	// !Player search
	player_search: {
	
		init: function() {
			
			var ods = new YAHOO.util.XHRDataSource("/ws/psearch");
			ods.responseType = YAHOO.util.XHRDataSource.TYPE_TEXT;
			ods.responseSchema = {
				recordDelim: "\n",
				fieldDelim: "\t"
			};
			
			ods.maxCacheEnries = 5;
			
			// instantiate player search auto-complete JS
			var search = new YAHOO.widget.AutoComplete("player-search-field","player-search-results", ods);
			
			// format results so they are links
			search.formatResult = function(oResultData, sQuery, sResultMatch) {
	    		str = '<a href="/nfl/players' + oResultData[1] + '">' + oResultData[0] + "</a>";
	    		return str;
			};
			
			// take the user to the player page if they select one using the keyboard
			search.itemSelectEvent.subscribe(pf.ui.player_search.submit); 
			
			// add watermark to search field
			// $("#player-search-field").Watermark("Search players");
			// $("#player-search-field").focus();
		
		},
		
		submit: function(type, args) {
			window.location = "/nfl/players" + args[2][1];
		}
	
	},
	
	// !Timeframe shortcuts
	tfshortcuts: {
		init: function() {
			
			// shortcuts = pf.ui.tfshortcuts.shortcuts();
			
			tfstring = pf.screen.gtf.string;

			if (tfstring.split("==")[1]) {
				tfstring = tfstring.split("==")[1];
			}

			pf.ui.tfshortcuts.set(tfstring);
			
			// set time frame in page title
			if (Y.get("title-tf")) {
				Y.get("title-tf").innerHTML = pf.ui.tfshortcuts.format_tf(pf.screen.gtf);
			}
			
			// Y.purgeElement("timeframe-shortcuts");
			// Y.addListener("timeframe-shortcuts", "click", pf.ui.tfshortcuts.events);
			$("#timeframe-shortcuts li a").unbind();
			$("#timeframe-shortcuts li a").bind("click", pf.ui.tfshortcuts.events);
			
		},
		events: function(e) {
			
			div = this;
			e.preventDefault();
			
			$("#timeframe-shortcuts li a").removeClass("selected");			
			$(this).addClass("selected");			
				
			// update query based on selected time frame shortcut
			var tf = div.id.split("shortcut-")[1]; 

			if (tf == "all-time") {
				pf.newscreen.gtf.type = "career";
			} else if (tf.length == 13) {
				pf.newscreen.gtf.type = "weeks";
				pf.newscreen.gtf.weeks = [tf.substring(0,6), tf.substring(7,13)];
			} else if (tf.length == 6) {
				pf.newscreen.gtf.type = "week";
				pf.newscreen.gtf.week = tf;
			} else if (tf.length == 9) {
				pf.newscreen.gtf.type = "seasons";
				pf.newscreen.gtf.seasons = [tf.substring(0,4), tf.substring(5,9)];
			} else if (tf.length == 4) {
				pf.newscreen.gtf.type = "season";
				pf.newscreen.gtf.season = tf;
			}
				
			delete pf.newscreen.offset;
				
			pf.js.getData(pf.newscreen);
					
			pf.activity.add({
				event:"Selected a time frame shortcut",
				selection: tf
				// type: shortcuts[shortcutindex].type,
				// stats: regtf.ps
			});
		
		},

		set: function(div) {
			
			// style the selected rellink
			div = "shortcut-" + div;
			var items = Y.getElementsByClassName("timeframe-shortcut-selector", null, "timeframe-shortcuts-frame");
			for (var i=0; i<items.length; i++) {
				Y.removeClass(items[i], "selected");
			}

			Y.addClass(div, "selected");
		
		},
		
		format_tf: function (tf) {
			
			// convert "09" to 9
			function depad(value) {
				var val = "";
				if (value.substring(0,1) == "0") {
					val = parseInt(value.substring(1,2));
				} else {
					val = value;
				}
				return val;
			}

			var str = "";
		
			if (tf.type == "season") {
				str += tf.season;
			} else if (tf.type == "seasons") {
				str += tf.seasons[0] + "-" + tf.seasons[1];
			} else if (tf.type == "week") {
				str += tf.season + " Week " + depad(tf.week);
			} else if (tf.type == "weeks") {
				str += tf.seasons[0] + " Week " + depad(tf.weeks[0]) + " - " + tf.seasons[1] + " Week " + depad(tf.weeks[1]);
			} else if (tf.type == "career") {
				str += "All Time";
			}
			
			return str;
		
		}	

	},

	// !Filters
	filters: {
		// build the filters (sliders)
		render: function() {
			
			// clear criteria list for some reason?
			var div = Y.get("criterialist"), child;			

            // filter html src
			var src = "";
			src += '<div id="render" class="criterialist">';
            
			// count of visible filters
			total_count = 0;
			
			// add a filter for each eligible criterion in the screen
			for (var i=0; i<pf.screen.criteria.length; i++) {
				cr = pf.screen.criteria[i];
				// don't add hidden criteria or qualitative criteria
				if (cr.hidden != true && cr.type == 0) {
					total_count++;
				}
			}
			
			cr_count = 0;

			// calculate number of rows to display columns nicely
			cr_rows = Math.ceil(total_count/2);
			
			// render frame for filters
			for (var n=0; n<pf.screen.criteria.length; n++) {
		
				if (n == 0 || cr_count == cr_rows || cr_count == cr_rows*2 || cr_count == cr_rows*3) {
					src += '<div class="filter-col">';
				}
		
				qu = pf.screen.criteria[n];

				crID 				= "cr" + n;
				elemCrButtonID 	 	= "crButt-"+n;
				sliderDivID			= "slider-cr"+n;
				optionListDivID 	= "option-list-cr"+n;
				compselectID 		= "compselect-container-"+n;
				compmenuID 			= "compmenu-"+n;
				
				comps 		= Y.get(compselectID);
				compm 		= Y.get(compmenuID);
				crbutt 		= Y.get(elemCrButtonID);
				sliderdiv	= Y.get(sliderDivID);
				optiondiv	= Y.get(optionListDivID);
				
				if (comps)
					comps.id = "";
				if (compm)
					compm.id = "";
				if (crbutt)
					crbutt.id = "";
				if (sliderdiv)
					sliderdiv.id = "";
				if (optiondiv)
					optiondiv.id = "";
				
				if (qu.type == 1 || qu.hidden == true || (qu.datapoint == "g" && (pf.screen.mode.type == "w" || pf.screen.gtf.type == "week"))) {
					src += '<div id="'+crID+'" class="crClass cr-default" style="display: none;">';
				} else {
					src += '<div id="'+crID+'" class="crClass cr-default">';
				}
			
				src += '<div class="filter-name">' + pf.ui.datatable.init.formatters.header_label(qu) + '</div>';  // src += labelFactory(n, true);
                src += "<input id='input-min-"+crID+"'>";
				if (qu.type==0) {
					src += '<div id="'+sliderDivID+'" class="cFilter">&nbsp;</div>';
				}
				
                src += "<input id='input-max-"+crID+"'>";
				src += "</div>";
			
				if (cr_count == cr_rows-1 || cr_count == cr_rows*2-1 || cr_count == cr_rows*3-1) {
					src += '</div>';
				}
				
				if (qu.hidden != true && qu.type == 0) {
					cr_count++;
				}
			
			}
			
			src += '</div>';
			div.innerHTML = src;
			
			for (var n=0; n<pf.screen.criteria.length; n++) {
				qu = pf.screen.criteria[n];
		        if (qu.type == 0) {
		        	pf.ui.filters.slider.render(n);
		        }
			}
			
		},
		
		// !Slider
		slider: { 
		
			sliders: [],
			
			render: function(n) {
                
                c = pf.screen.criteria[n];
                id = "#slider-cr"+n;
            	$(id).slider({
            	   range: true,
            	   min: c.min,
            	   max: c.max,
            	   values: [ c.min, c.max ],
            	   slide: function( event, ui ) {
                $("#input-min-cr"+n).val(ui.values[0]);
                $("#input-max-cr"+n).val(ui.values[1]);
            	   }
                });

                $("#input-min-cr"+n).val($(id).slider("values",0));
                $("#input-max-cr"+n).val($(id).slider("values",1));
                
                // pf.ui.filters.slider.build_histogram(n);
            },
            
            build_histogram: function(n) {
                
                qu = pf.screen.criteria[n];
                
    			// build histogram
    			if (qu.dist) {
    				var dist = qu.dist;
    				var tableHeight = 18;
    				var bins = dist.length;
    				var maxValDist = Y.max(dist);
    				var convRatio = tableHeight/maxValDist;
    				var distu = qu.distu;
    				src = "";
    				src += '<table cellpadding="0" cellspacing="0" style="position: relative; left: 3px; width: 103px">';
    				src += '<tr>';
    				
    				var srcArray = [];
				
    				sliderWidth = 100;
    				
    				for (var i=0; i<dist.length; i++) {
    					var binHeight = dist[i]*convRatio;
    					var binXHeight = distu[i]*convRatio;
    					var binWidth = (sliderWidth-(dist.length-1))/dist.length;
    					srcArray[i] = "";
    					srcArray[i] += '\
    						<td style="vertical-align: bottom; margin: 0; padding: 0">\
    						<div style="height:'+binHeight+'px;" class="histogram-frame">\
    							<table width="100%" height="100%" cellpadding="0" cellspacing="0">\
    								<tr>';
    									srcArray[i] += '<td valign="bottom"><div  style="background: #999; height:'+binXHeight+'px"></td>';
    									srcArray[i] += '\
    												</tr>\
    											</table>\
    										</div>\
    										</td>';
    				}
						
    				var joinedSrc = "";
    				joinedSrc = srcArray.join(" ");
    				src += joinedSrc;
    				src += '</tr></table>'; 
			}

            html = '<div style="z-index: 100; position: absolute; top: ' + (($("#cr"+n).offset().top)-114) + 'px; left: ' + (($("#slider-cr"+n).offset().left)-20) + 'px;  " id="histogram-cr' + n + '">';
            html += src;
            html += '</div>';

			$("#cr"+n).append(html);
			
			// add histogram to dom
			/* elemRefID = histogramID;
			elemRef = Y.get(elemRefID);
			elemRef.innerHTML = src; */
			
			
			}
        }
    },         
	
	// !Active/Inactive toggle
	active: {
	
		init: function() {
			
			div = Y.get("active-true");
			
			if (pf.screen.active == true) {
				div.checked = true;
			}
			
			Y.purgeElement("activeoptions");
			Y.addListener("activeoptions", "click", pf.ui.active.events);
						
		},
		
		events: function (e) {
			
			div = Y.getTarget(e);
			
			if (div.id == "active-true" && e.type == "click") {
			
				if (div.checked == true) {
					var valactive = "Active only";
					pf.newscreen.active = true;
				} else {
					var valactive = "All players in history";
					delete pf.newscreen.active;
				}

			pf.js.buildQs();			
			pf.js.getData(pf.newscreen);
			
			}
			
			pf.activity.add({
				event:"Selected active player toggle",
				type: valactive
				// stats: regtf.ps
			});
			


		}			
	
	},
	// !Mode
	mode: {
		render: function() {
			
			/* do this server-side now in django templates
			var src = "";
			src += '<div id="mode-options">';
			src += '<span class="timeframe-text">View:</span> ';
		
			if (pf.screen.gtf.type != "week") {
				if (pf.screen.mode == "t" || !pf.screen.mode) {
					src += '<a href="#" id="mode-total" class="mode-selector selected">Players</a> | ';
				} else {
					src += '<a href="#" id="mode-total" class="mode-selector">Players</a> | ';				
				}
			}
			if (pf.screen.mode == "w" || pf.screen.gtf.type == "week") {
				src += '<a href="#" id="mode-weeks" class="mode-selector selected">Games</a>';			
			} else {
				src += '<a href="#" id="mode-weeks" class="mode-selector">Games</a>';			
			}
			if (pf.screen.gtf.type == "seasons" || pf.screen.gtf.type == "career") {
				if (pf.screen.mode == "s") {
					src += ' | <a href="#" id="mode-seasons" class="mode-selector selected">Seasons</a>';			
				} else if (pf.screen.gtf.type != "season" && pf.screen.gtf.type != "weeks") {
					src += ' | <a href="#" id="mode-seasons" class="mode-selector">Seasons</a>';			
				}
			}
			src += '</div>';
			var div = Y.get("mode-frame");
			div.innerHTML = src; */
			
			// only show appropraite mode based on time frame
			// single season: 	players, games
			// season range: 	players, games, seasons
			// single week:		hide
			// week range:		players, games
			// career:			players, games, seasons
			
			if (pf.screen.gtf.type == "season" || pf.screen.gtf.type == "weeks") {
				$("#mode-options").show();
				$("#mode-total, #mode-weeks, #mode-seasons").hide();
				$("#mode-total, #mode-weeks").show();
			} else if (pf.screen.gtf.type == "seasons" || pf.screen.gtf.type == "career") {
				$("#mode-options").show();
				$("#mode-total, #mode-weeks, #mode-seasons").hide();
				$("#mode-total, #mode-weeks, #mode-seasons").show();
			} else if (pf.screen.gtf.type == "week") {
				$("#mode-options").hide();
			}

			$(".mode-selector").removeClass("selected");
			
			pf.screen.mode.type == "t" ? $("#mode-total").addClass("selected") : "";
			pf.screen.mode.type == "w" ? $("#mode-weeks").addClass("selected") : "";
			pf.screen.mode.type == "s" ? $("#mode-seasons").addClass("selected") : "";
			
			// update page title if this is week or season mode
			if (pf.screen.mode.type in {"w":"", "s":""}) {
				if (pf.screen.mode.type == "w") { 
					title = " (Games)";
				} else if (pf.screen.mode.type == "s") {
					title = " (Seasons)";
				}
				$("#title-mode").html(title);
			} else {
				$("#title-mode").html("");
			}

			Y.purgeElement("mode-frame");
			Y.addListener("mode-frame", "click", pf.ui.mode.events);		
		
		},
		events: function(e) {

			Y.preventDefault(e);
			var div = Y.getTarget(e);
			var items = Y.getElementsByClassName("mode-selector", null, "mode-options");
			
			// style the selected rellink
			for (var i=0; i<items.length; i++) {
				Y.removeClass(items[i], "selected");
			}
			
			Y.addClass(div, "selected");
			
			
			// update regtf
			if (div.id == "mode-total") {
				pf.newscreen.mode = false;
			} else if (div.id == "mode-seasons") {
				pf.newscreen.mode.type = "s";
			} else if (div.id == "mode-weeks") {
				pf.newscreen.mode.type = "w";
			}
			
			delete pf.newscreen.offset;
			
			pf.js.getData(pf.newscreen);
				
			pf.activity.add({
				event:"Selected mode",
				value: div.id
			});

		}
	},
	// !Links
	links: { 
	
		init: function(ignore_hash) {
			
			var src = "";
			var links = [];
			
			/* if (Y.getElementsByClassName("submenu-selector", null, "submenuoptions").length > 0) {
			
				// get list of related links for selected child page
				selected_child_screen = pf.ui.page_links.getSelected();
				
				for (var i=0; i<pf.child_screen_links.length; i++) {
					if (selected_child_screen == pf.child_screen_links[i].screen) {
						links = pf.child_screen_links[i].links;
					}
				}
				if (links.length == 0) {
					var links = pf.child_screen_links[0].links;
				}
				

				
				// get data for these links from master links list
				var links_list = [];
				var checked_list = {};
				for (var i=0; i<links.length; i++) {
				
					for (var x=0; x<pf.links.length; x++) {
						if (links[i] == pf.links[x].linkid) {
							// if this is a key stat related link,
							// do an additional check to make sure
							// the key stat is the right one for this page
							if (links[i] == "key-stats") {
								if (pf.links[x].type == selected_child_screen) {
									item = pf.links[x];
								}
							} else {
								item = pf.links[x];
							}
						}
					}
					
					links_list[links_list.length] = item;
				
				}
			} else {
				links_list = pf.links;
			} */
			
			links_list = pf.links;
			// build related links front end
			/* for (var i=0; i<links_list.length; i++) {
				src += '<a class="link" id="link-'+links_list[i].linkid+'" href="#"><span class="link-inner">' + links_list[i].name + '</span></a> ';
			}
			
			if (links_list.length == 1) {
				Y.get("links-frame").style.display = "none";
			}
			
			Y.get("links-frame").innerHTML = src; */
			
			// style the selected related link
			// if (pf.ui.links.getSelected()) {

			//} else 

			if (typeof(pf.screen.mode.name) != "undefined") { 
				
				if (pf.screen.mode.type == "w") {
					title += " - Games";
				} else if (pf.screen.mode.type == "s") {
					title += " - Seasons";
				}
			
			}

			// style the selected related link passed via the hashtag 
			if (typeof(pf.links) !== "undefined") {
				if (pf.hash_link || ignore_hash) {
		
					rellink = pf.hash_link;
					for (var i=0; i<pf.links.length; i++) {
						if (pf.links[i].url == rellink) {
							rellink = pf.links[i].linkid;
							title = pf.links[i].name;
						}
					}				
					
					div = "link-" + rellink;
					pf.ui.links.setSelected(div);
				
				// otherwise select the first related link 
				} else {		
					pf.ui.links.setSelected(0);
					if (!typeof(pf.links !== "undefined")) {
						title = pf.links[0].name;
					}
				}
			}			
			
			Y.purgeElement("links-frame");
			Y.addListener("links-frame", "click", pf.ui.links.events);
			
		},
		
		events: function(e) {
			
			Y.preventDefault(e);
			var div = Y.getTarget(e);
			
			if (Y.hasClass(div, "link-inner")) {
				div = div.parentNode;			
			}

			var links = Y.getElementsByClassName("link", null, "links-frame");
			
			// style the selected rellink
			for (var i=0; i<links.length; i++) {
				Y.removeClass(links[i], "selected");
			}
			
			Y.addClass(div, "selected");
			
			// build the querystring
			querystring = "";
			querystring += pf.qs_base;
			
			// get the values from the page dropdowns/lists
			for (var i=0; i<pf.fixed.length; i++) {
				
				// if this is a dropdown
				if (Y.getElementsByClassName("submenu-dropdown").length > 0) {
					div_id = "submenu-"+pf.fixed[i];
					value = Y.get(div_id).options[Y.get(div_id).options.selectedIndex].value;				
				// if this is a list
				} else {
				
					// go through the submenu options and get the selected submenu id
					items = Y.getElementsByClassName("submenu-selector", null, "submenuoptions");
					for (var x=0; x<items.length; x++) {
						if (Y.hasClass(items[x], "selected")) {
							value = items[x].id.split("submenu-")[1].split("-")[1];		
						}
					}
				}
				
				// assign dropdown/links values to screen/quyerystring
				//
				// special case for if this is a gtf dropdown
				if (pf.fixed[i] == "gtf") {
					delete pf.newscreen.gtf;
					pf.newscreen.gtf = {}
					pf.newscreen.gtf.type = "season";
					pf.newscreen.gtf.season = value;
				} else if (pf.fixed[i] == "pos" && pf.page == "position") {
					querystring += 
				// othewise do it normally
					querystring += pf.fixed[i];					
					if (value != "all") {
						if (pf.fixed[i] == "pos") {
							if (pf.page == "position") {
								querystring += "==" + pf.default_position_criterion;
							} else {
								querystring += "==" + value.toUpperCase();							
							}
							
						} else {
							querystring += "==" + value;
						}
						
					}
					querystring += ",h,u,r;";
				}
			}
			
			// get selected related link querystring
			var extra_qs = "";
			
			for (var i=0; i<pf.links.length; i++) {
				url = "link-"+pf.links[i].linkid;
				if (url == div.id) {
					extra_qs = pf.links[i]["querystring"];
					title = pf.links[i].name;
				}
			}
			
			if (extra_qs.length == 0) {
				querystring += pf.links[0]["querystring"];
			} else {
				querystring += extra_qs;
			}
			
			pf.qs = pf.js.buildQs(null, querystring);
			pf.js.getData();
			
			// insert name of link into page title
			// Y.get("title-link").innerHTML = title;
	
			pf.activity.add({
				event: "Clicked a rellink",
				rellink: pf.ui.links.getSelected()
			});		
		},
		
		getSelected: function(e) {
	
			var items = YAHOO.util.Dom.getElementsByClassName("link", null, "links-frame");
			
			for (var i=0; i<items.length; i++) {
				if (YAHOO.util.Dom.hasClass(items[i], "selected")) {
					var index = items[i].id.split("link-")[1];
				}
			}
			
			return index;
		
		},
		
		setSelected: function(div) {
			
			
			var items = YAHOO.util.Dom.getElementsByClassName("link", null, "links-frame");
			
			// if you call setSelected(0) instead of specifying a link
			// select the first link
			if (div == 0)
				div = items[0];

			// style the selected rellink
			for (var i=0; i<items.length; i++) {
				YAHOO.util.Dom.removeClass(items[i], "selected");
			}
			
			YAHOO.util.Dom.addClass(div, "selected");
		
		}
	},
	
	// !College dropdown
	college_dropdown: {
	
		init: function() {
			
			$("#title-col").html("NFL-" + $("#submenu-col option:selected").text() + ": " + $("#submenu-col option:selected").text() + "  Players in the NFL");

			$("#submenu-col").bind("change", function(){ 
				
				// pf.js.getData(pf.newscreen);
				
				// $("#title-col").html("NFL-" + $("#submenu-col option:selected").text() + ": " + $("#submenu-col option:selected").text() + "  Players in the NFL");
				
				var val = $("#submenu-col").val();
				window.location = "/nfl/college/" + val + "/";
				// I will also work on 
				// unescape(items[i].options[n].value.split("-").join(" ").split("+").join(" ")
			
			});
		
		}
	
	},
	
	// !Export link
	export_data: {
		
		init: function() {
			
			$(".export-link").unbind();
			$(".export-link").bind("click", function(e) {
			
				pf.activity.add({
					event:"Exported to CSV",
					rellink: pf.ui.links.getSelected()
				});
			
				e.preventDefault()
			
				var qsplit = pf.qs.split("players");
				var csvstr = qsplit[0]+"players.csv"+qsplit[1];
			    window.location = csvstr + "&format=csv";

			});
		}
	},
	// !Loading Indicator
	loading_indicator: {
	
		loading: {},
		
		init: function() {
			var loading = new YAHOO.widget.Overlay("loading", {visible:false}); 
			loading.cfg.setProperty("context", ["datatable-frame", "tl", "tl", ["beforeShow"]]);
			loading.render(document.body);
			pf.ui.loading_indicator.loading = loading;
		}
			
	}, 
	// !Page dropdowns
	page_dropdowns: {
	
		init: function(ignore_hash) {
			
			items = Y.getElementsByClassName("submenu-selector", null, "submenuoptions");

			for (var i=0; i<items.length; i++) {
				Y.purgeElement(items[i]);
			}
			
			Y.addListener(items, "click", pf.ui.page_dropdowns.events);
			
			delete items;
			
			items = Y.getElementsByClassName("submenu-dropdown");

			for (var i=0; i<items.length; i++) {
				Y.purgeElement(items[i]);
			}

			Y.addListener(items, "change", pf.ui.page_dropdowns.events);
			
			delete items;
			
			// update dropdowns to selected values
			// go through each dropdown on the page
			items = Y.getElementsByClassName("submenu-dropdown");
			if (items.length > 0) {
				for (var i=0; i<items.length; i++) {
					var name = items[i].id.split("submenu-")[1];
					if (pf.newscreen) {

						c =	pf.newscreen.criteria;
						ignore_list = {};

						for (var x=0; x<c.length; x++) {
							// find the criterion that corresponds to this dropdown
							if (c[x].name == name && Y.isUndefined(ignore_list.name)) {
								ignore_list.name = true;
								// find the dropdown option that corresponds to the criterion value
								for (var n=0; n<items[i].options.length; n++) {
									// clean college dropdown values, which contain + and - for the web service 
									if (name=="col") {
										compare_item = unescape(items[i].options[n].value.split("-").join(" ").split("+").join(" "))
									} else {
										compare_item = items[i].options[n].value;
									}
									
									var division_item = "";
									
									// if this is the team page and we are looking at 
									if (name=="team" && c[x].items) {
										if (c[x].items.length == 4 && c[x].items[0] == "DAL") {
											division_item = "NFCE";
										} else if (c[x].items.length == 4 && c[x].items[0] == "ARI") {
											division_item = "NFCW";
										} else if (c[x].items.length == 4 && c[x].items[0] == "CHI") {
											division_item = "NFCN";
										} else if (c[x].items.length == 4 && c[x].items[0] == "ATL") {
											division_item = "NFCS";
										} else if (c[x].items.length == 4 && c[x].items[0] == "HOU") {
											division_item = "AFCS";
										} else if (c[x].items.length == 4 && c[x].items[0] == "BAL") {
											division_item = "AFCN";
										} else if (c[x].items.length == 4 && c[x].items[0] == "DEN") {
											division_item = "AFCW";
										} else if (c[x].items.length == 4 && c[x].items[0] == "BUF") {
											division_item = "AFCE";
										} else if (c[x].items.length == 16 && c[x].items[0] == "BUF") {
											division_item = "AFC";
										} else if (c[x].items.length == 16 && c[x].items[0] == "DAL") {
											division_item = "NFC";
										}
									}

									// set it to the selected one
									if (c[x].type == 0) {
										if (compare_item == c[x].val) {
											items[i].options[n].selected = true;
										}						
									} else if (c[x].type == 1) {
										
										// special case if this is a division 
										if (compare_item == division_item) {
											items[i].options[n].selected = true;
										} else if (compare_item == c[x].item) {
											items[i].options[n].selected = true;
										}
									}
								}
							// special case for dropdowns that correspond to gtf
							} else if (name == "gtf") {
								for (var n=0; n<items[i].options.length; n++) {
									// set it to the selected one
									if (items[i].options[n].value == pf.screen.gtf.season) {
										items[i].options[n].selected = true;
									}
								}					
							}
						}
					}
				}
			} else {
				
				if (!Y.isUndefined(pf.hash_link) && !ignore_hash) {
					pf.ui.page_links.setSelected(pf.hash_link.split("-")[0]);
				} else {
					pf.ui.page_links.setSelected(pf.default_child);
				}
			
			}
			
			$("#title-gtf").html($("#submenu-gtf option:selected").text());
			$("#title-team").html($("#submenu-team option:selected").text());
									
						
		},
		
		events: function(e) {
			
			Y.preventDefault(e);
			div = Y.getTarget(e);
			
			// if this is a dropdown submenu
			if (Y.hasClass(div, "submenu-dropdown") && e.type == "change") {

				var subtype = div.id.split("submenu-")[1];
				var selection = div.options[div.selectedIndex].value;
			
			// if this is a list submenu
			} else if (Y.hasClass(div, "submenu-selector") && e.type == "click") {
			
				var subtype 	= div.id.split("submenu-")[1].split("-")[0];
				var selection 	= div.id.split("submenu-")[1].split("-")[1];	
				
				// style the selected rellink
				var items = Y.getElementsByClassName("submenu-selector", null, "submenuoptions");
				for (var i=0; i<items.length; i++) { Y.removeClass(items[i], "selected"); }
				Y.addClass(div, "selected");
			
			}
			
			cr = pf.newscreen.criteria;

			// items are added to this list as they are assigned
			// we only want them to be used once
			ignore_list = {}
			
			querystring = "";
			querystring += pf.qs_base;


			
			// update cr to match change in dropdown
			for (var i=0; i<cr.length; i++) {
				if (subtype == cr[i].name && Y.isUndefined(ignore_list.subtype)) {
					
					
					ignore_list.subtype = true;
				
					// special case - if updating team dropdown to 'all'
					// delete the comp instead of setting team to all
					if (selection == "all") {
						delete cr[i].item;
						delete cr[i].val;
						delete cr[i].op;
					} else {
						if (Y.getElementsByClassName("submenu-selector", null, "submenuoptions").length > 0) {
							querystring += cr[i].name + "==";
							if (cr[i].name == "pos") {
								querystring += selection.toUpperCase();
							} else {
								querystring += selection;
							}
							querystring += ";";
						} else {
							if (cr[i].type == 0) {
								cr[i].val = selection;
								cr[i].op = "equals";
							} else if (cr[i].type == 1) {					
								if (cr[i].name == "pos") {
									cr[i].item = selection.toUpperCase();
								} else {
									cr[i].item = selection;
								}
							}							
						}
					}
				} else if (subtype == "gtf") {
					delete pf.newscreen.gtf;
					pf.newscreen.gtf = {}
					pf.newscreen.gtf.type = "season"
					pf.newscreen.gtf.season = selection;
				}
			}
			
			// list
			if (Y.getElementsByClassName("submenu-selector", null, "submenuoptions").length > 0) {
				
				// get the selected rellink's querystring
				var extra_qs = "";
				for (var i=0; i<pf.child_screen_links.length; i++) {
					if (pf.child_screen_links[i].screen == selection) {
						for (var x=0; x<pf.links.length; x++) {
							if (pf.links[x].linkid == pf.child_screen_links[i].links[0]) {
								querystring += pf.links[x].querystring;
							}
						}
					}
				}
				
				pf.qs = pf.js.buildQs(null, querystring);
				pf.js.getData()
				pf.ui.links.init(true);
				
			// dropdown - really need to fix this
			} else {
			
				// if (div.id == "submenu-team" || div.id == "submenu-gtf") {
					
					$("#title-gtf").html($("#submenu-gtf option:selected").text());
					$("#title-team").html($("#submenu-team option:selected").text());
					
					// update page titles 
					/* var items = Y.getElementsByClassName("submenu-dropdown", null, "submenuoptions");
					
					for (var i=0; i<items.length; i++) {
						
						oitem = items[i];
						id = "title-"+oitem.id.split("submenu-")[1];
						div = Y.get(id);
						
						var str = "";
						
						if (oitem.id == "submenu-dtm") {
							str += " - ";
						}
						
						str += oitem.options[oitem.selectedIndex].text;
						div.innerHTML = str;
					}
					*/
					pf.js.getData(pf.newscreen); 
				
				// }
				
			}

			

		}
	},
	
	// !Page links (Incomplete)
	page_links: {
	
		getSelected: function() {
			
			var items = Y.getElementsByClassName("submenu-selector", null, "submenuoptions");
			
			for (var i=0; i<items.length; i++) {
				if (Y.hasClass(items[i], "selected")) {
					return items[i].id.split("-")[2];
				}
			}
			
		},
		
		setSelected: function(div) {
			
			var items = Y.getElementsByClassName("submenu-selector", null, "submenuoptions");
			
			for (var i=0; i<items.length; i++) {
				Y.removeClass(items[i].id, "selected");
			}
			
			id = "submenu-pos-"+div;
			
			Y.addClass(id, "selected");
		
		}
	
	},
	
	// !Add/remove columns
	columns: {
	
		init: function() {
			
			// get all the column checkboxes
			options = $("#columns-frame li input").not("#sparkline-option");
			
			// go through each option and check if it exists in the query string
			// if it does, marked it as checked
			for (var i=0; i<options.length; i++) {
				// Y.get("log").innerHTML += "id:" + $(options[i]).attr("id") + "<br />";
				// get the column option identifier
				var id = $(options[i]).attr("id").split("column-")[1];
				// clear the option if it is checked
				$(options[i]).attr("checked", false);
				// search the column options, provided via json dump, to retrieve the criterion information
				for (var x=0; x<pf.column_data.length; x++) {
					if (id == pf.column_data[x].id) {
						if (!(typeof(pf.column_data[x].criterion) === "undefined")) {
							if (pf.ui.columns.check_criterion(pf.column_data[x].criterion)) {
								$(options[i]).attr("checked", true);
							}
						} else {
							$(options[i]).attr("checked", true);						
						}
						div = "column-frame-"+id;				
					}
				}				
			}
			
			// events for column checkboxes
			$(options).unbind();
			$(options).bind("click", pf.ui.columns.events); 
			
			$("#sparkline-option").unbind();
			$("#sparkline-option").bind("click", (function() { 
				if ($(this).is(":checked")) {
					pf.newscreen.sparkline.on = true;
				} else {
					pf.newscreen.sparkline.on = false;				
				}
				pf.js.getData(pf.newscreen);

			}));
		
		},
		
		check_criterion: function(c) {
		
			checklist = ["name", "aggop", "reduce", "hidden", "sparkline"];
			
			// for each criterion in the screen
			for (var r=0; r<pf.screen.criteria.length; r++) {

				pass = false;
				checkcount = 0;
				passcount = 0;
				
				// go through the checklist of paramters
				for (var a=0; a<checklist.length; a++) {
					// does the paraamter exist in the criterion?
					if (c[checklist[a]]) {
						checkcount++;
						// is the parameter equal to what is set in the json dump for this column? 
						if (pf.screen.criteria[r][checklist[a]] == c[checklist[a]] || (checklist[a] == "aggop" && 
						typeof(c[checklist[a]]) === "undefined" && pf.screen.criteria[r]["aggop"] == "sum")) {
							// good so far - keep checking
							pass = true;
							passcount++;
						/* Y.get("log").innerHTML += pf.screen.criteria[r].name + ", check count: " + checkcount + ", pass count: " + passcount + "<br />";
						Y.get("log").innerHTML += "Checking " + checklist[a] + " " + c.name + " (" + c[checklist[a]] + ") vs " + pf.screen.criteria[r][checklist[a]]+"<br />:";
						Y.get("log").innerHTML += "Passed <br />"; */

						} else {
							// does not match - move on to next criterion
							pass = false;
						/* Y.get("log").innerHTML += pf.screen.criteria[r].name + ", check count: " + checkcount + ", pass count: " + passcount + "<br />";
						Y.get("log").innerHTML += "Checking " + checklist[a] + " " + c.name + " (" + c[checklist[a]] + ") vs " + pf.screen.criteria[r][checklist[a]]+"<br />:";
						Y.get("log").innerHTML += "Failed <br />"; */
							break;
						}
					}
				}
				
				// if there were no failures, keep going
				if (pass == true && passcount == checkcount) {
					// Y.get("log").innerHTML += "PASSED<br />";
					break;
				} else {
					continue;
				}
			}
					
			return pass;
		
		},
		
		events: function(e) {
		
			// the checked checkbox
			div = this;
			
			visible_column_options = [];

			// is the checkbox checked?
			$(div).attr("checked") == true ? check_type = "on" : check_type = "off";
			// what is the checkbox id?
			check_id = $(div).attr("id").split("column-")[1];								
			
			// report activity
			pf.activity.add({
				"event": "Selected column checkbox", 
				"type": check_type, 
				"id": check_id, 
				"rellink": 
				pf.ui.links.getSelected()
			});
			
			column_options = $("#columns-frame li input");
			
			// ???
			for (var i=0; i<column_options.length; i++) {
				if ($(div).css("display") != "none") {
					visible_column_options[visible_column_options.length] = column_options[i];
				}
			}
			
			// get the column option that was clicked and its order among the options
			for (var i=0; i<visible_column_options.length; i++) {
				if (div == visible_column_options[i]) {
					order = i;
				}
			}
			
			// if the column option that was clicked is to the left of the currently sorted row,
			// update the sortkey
			if (order < pf.screen.sortkey && $(div).attr("checked") == false) {
				pf.screen.sortkey--;
			} else if (order < pf.screen.sortkey && $(div).attr("checked") == true) {
				pf.screen.sortkey++;
			}
	
			if (typeof(timer) === "number") {
				clearTimeout(timer);
			}
			YAHOO.util.Connect.abort(pf.request);
				
			timer = setTimeout(pf.update_via_checkboxes, 500);

		}
	} 	
};

// !Button toggler
// this helps toggle between the add/remove columns, filters and embed buttons
// it handles updating the +/- images next to the labels,
// showing/hiding the proper panels and options,
// and all kinds of ill shit
pf.ui.toggler = {

	events: function(e) {

		e.preventDefault();
		
		// div = $(div).parent(".screen-flyout-btn-frame");
		id = $(this).attr("id");
		src = "";
		
		// get flyout type based on ID and initialize values
		// (add/remove, filters, embed)
		$(this).hasClass("columns-button") 		? src = ".screen-flyout-columns" : "";
		$(this).hasClass("filters-button") 		? src = ".screen-flyout-filters" : "";
		$(this).hasClass("embed-button") 		? src = ".screen-flyout-embed" : "";
		$(this).hasClass("timeframe-button")	? src = ".screen-flyout-timeframe" : "";
		
		// is this the currently active panel?
		if ($(src)[0].style.display != "none") {
			selected = true;
		} else {
			selected = false;
		}
		
		$('#embed-frame').is(':visible') ? pf.ui.embed.clear() : "";

		// hide all flyouts prior to showing selected flyout
		$(".screen-flyout").hide();
		$(".columns-button, .filters-button, .embed-button, .timeframe-button").removeClass("xc-minus");
		
		// show selected flyout if appropriate
		if (selected == false) {
			$(src).show();
			$(this).addClass("xc-minus");
		}
		
		// if the embed panel is visible we are closing it and clearing its traces
		// clear any remnants of embedding if required
		
		if ($(this).hasClass("filters-button") && $('#criteriawrapper').is(':visible')) {
			pf.ui.filters.render();
		}

	},
	
	init: function () {
		$(".timeframe-button, .columns-button, .filters-button").unbind();
		$(".timeframe-button, .columns-button, .filters-button").bind("click", pf.ui.toggler.events);
	}
	
}

// !Sparklines
pf.ui.sparklines = {

	cache: [],

	init: function(e) {
	
		// pf.ui.sparklines.cache = [];
	
		if (pf.screen.sparkline.on == true) {
			$("#sparkline-option").attr("checked", "checked");
		} 
		
		
	
		// google.load("visualization", "1", {packages:["imagesparkline"]});
		// google.setOnLoadCallback(pf.ui.sparklines.draw);
	},
	
	draw: function(id, c, r) {
		
		/* delete data;
		delete chart;
        var data = new google.visualization.DataTable();
        
        data.addColumn("number", "a");

        data.addRows(r["2s"].length);
        for (i=0; i<r["2s"].length; i++) {
        	data.setValue(i, 0, r["2s"][i]["val"]);
        }
        
        // chart_id = "sparkline-" + c.key + "-" + r["i"];
		      
        var chart = new google.visualization.ImageSparkLine(document.getElementById(id));
        chart.draw(data, {height: 15, showAxisLines: false}); */

		data = [];
	
        for (var j=0; j<r.length; j++) {
        	data[data.length] = r[j];
        }
        
        id = "#" + id;
        
        // alert(pf.screen.sparkline.min + " - " + pf.screen.sparkline.max);
        
        // set the min and max values for the sorted sparkline column (if available)        
        if (typeof(pf.screen.sparkline.min) !== "undefined" && typeof(pf.screen.sparkline.max) !== "undefined" && $(id).parent().parent().hasClass("col-sparkline-sorted")) {
        	$(id).sparkline(data, {width: '100px', minSpotColor: false, maxSpotColor: false, spotColor: false, chartRangeMin: pf.screen.sparkline.min, chartRangeMax: pf.screen.sparkline.max, chartRangeClip: true})
        } else {
	        $(id).sparkline(data, {width: '100px', spotColor: false });   
        }
        
	},
	
	render: function() {
		
		cache = pf.ui.sparklines.cache;
		
		// alert("rendering: " + pf.screen.sparkline + " - " + pf.screen.sparkline.min);
		
		for (var i=0; i<cache.length; i++) {
			pf.ui.sparklines.draw(cache[i].id, cache[i].criteria, cache[i].results);
		}
		
		pf.ui.sparklines.cache = [];
	
	}
};

pf.ui.menu = {

	init: function() {

		$(document).ready(function() {
		      
		      function addMega(){
		        $(this).addClass("hover");
		        }
		
		      function removeMega(){
		        $(this).removeClass("hover");
		        }
		
		    var megaConfig = {
		         interval: 500,
		         sensitivity: 4,
		         over: addMega,
		         timeout: 500,
		         out: removeMega
		    };
		
		    $("li.mega").hoverIntent(megaConfig);

		});
		
	}

			    // $("ul.menu li ul li:has(ul)").find("a:first").append(" &raquo; ");

	/* ,
	    
	over: function(div) {
        $(div).addClass("hover");
        $('ul:first',$(div).parent()).css('visibility', 'visible');
    },
	 
    out: function(div) {
        $(div).removeClass("hover");
        $('ul:first',$(div).parent()).css('visibility', 'hidden');
    } */
	
}

// !Activities
pf.activity = {

	add: function (data) {
	
		var args = {};
	
		args = data;
		args["sessionid"] = pf.lib.cookie.read("sessionid");
		args["page_path"]= window.location.pathname;
		
		var postdata = YAHOO.lang.JSON.stringify(args);
		
		post_str = 'data='+postdata;
		
		// pass_data = {"data": postdata};
				
		var request = YAHOO.util.Connect.asyncRequest(
			'POST',
			'/activity/', 
			{ 
				success: function (o) {
					return;
				}, 
				failure: function (o) { 
					return;
				}
			},
			post_str);
	}

}

pf.update_via_checkboxes = function() {
	
	var newcriteria = [];
	
	if (!(typeof(pf.default_position_criterion) === "undefined")) {
		newcriteria[0] = pf.default_position_criterion;
	} 

	options = $("#columns-frame li input"); 

	for (var t=0; t<options.length; t++) {

		// alert($(options[t]).attr("id"));

		if ($(options[t]).is(":checked")) {

			// get the checkbox
			var id = $(options[t]).attr("id").split("column-")[1];
			// search the column options, provided via json dump, to retrieve the criterion information
			for (var p=0; p<pf.column_data.length; p++) {
				
				/*
				
				- go through checked columns
				- add column data to newcriteria
				- if the column already has a filter, make sure the filter is applied
				
				*/
				
				// if this column is defined in the json dump pf.column_data
				if (id == pf.column_data[p].id) {

					cpush = pf.column_data[p].criterion;
					

										
					// check if the column has a filter applied to it and preserve it
					for (var r=0; r<pf.screen.criteria.length; r++) {
						
						if (pf.screen.criteria[r].op) {
							
							// match the checked column and the existing criterion 
							// by comparing multiple parameters
							checklist = ["name", "aggop", "reduce", "hidden", "sparkline"]
							pass = false;
							
							for (var a=0; a<checklist.length; a++) {
								// does the parameter exist?
								if (pf.screen.criteria[r][checklist[a]]) {
									// is the parameter equal to what is set in the json dump for this column? 
									if (pf.screen.criteria[r][checklist[a]] == pf.column_data[p].criterion[checklist[a]]) {
										pass = true;
									} else {
										pass = false;
									}
								}
							}
							
							if (pass == true) {
								cpush.type = 0;
								cpush.op = pf.screen.criteria[r].op;
								cpush.val = pf.screen.criteria[r].val;
							}
							
						}
					}
					newcriteria.push(cpush);
				} else {
				
					// make sure we preserve any existing filters
					/* for (var r=0; r<pf.screen.criteria.length; r++) {
						// check = 0;
						if (pf.screen.criteria[r].name === pf.column_data[p].criterion.name) {
							if (pf.screen.criteria[r].aggop === pf.column_data[p].criterion.aggop) {
								newcriteria.push(pf.screen.criteria[r]);
							}
						}
					} */
				
				}
				
				/* if (checklist.length == check) {					
					cpass = true;
					cpush = pf.screen.criteria[r];
				} else */
				
				// */
				
				/* if (cpass == true) {
					alert("Adding" + newcriteria.length);
					newcriteria.push(cpush);
				} */

			}
			
		}
	}

	pf.newscreen.criteria = newcriteria;
	pf.js.getData(pf.newscreen);
	pf.activity.add({"event":"Updated screen via checkbox", "rellink": pf.ui.links.getSelected()});

}

pf.ui.ws_link = {

    init: function() {
    
        if ($("#webservice-link").length == 1) {
            if (pf.qs.indexOf("&debug=true") == -1) {
                pf.qs += "&debug=true";
            }
            $("#webservice-link").attr("href", pf.qs);
        }
    }

}
